gramene-search 2.9.0 → 2.11.0
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/index.css +65 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +737 -142
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1492,6 +1492,12 @@ const $24971af0a229e0e3$var$grameneViews = {
|
|
|
1492
1492
|
show: 'off',
|
|
1493
1493
|
shouldScroll: false
|
|
1494
1494
|
},
|
|
1495
|
+
{
|
|
1496
|
+
id: 'attrTable',
|
|
1497
|
+
name: 'Attribute table',
|
|
1498
|
+
show: 'off',
|
|
1499
|
+
shouldScroll: false
|
|
1500
|
+
},
|
|
1495
1501
|
{
|
|
1496
1502
|
id: 'ontologyEnrichment',
|
|
1497
1503
|
name: 'Ontology Enrichment',
|
|
@@ -1632,6 +1638,7 @@ const $24971af0a229e0e3$var$grameneViews = {
|
|
|
1632
1638
|
'list',
|
|
1633
1639
|
'export',
|
|
1634
1640
|
'exprViz',
|
|
1641
|
+
'attrTable',
|
|
1635
1642
|
'ontologyEnrichment'
|
|
1636
1643
|
]);
|
|
1637
1644
|
const autoDisable = numFound === 0 || !hasFilters;
|
|
@@ -2179,7 +2186,7 @@ var $0d54502f6cafe273$export$2e2bcd8739ae039 = $0d54502f6cafe273$var$grameneGeno
|
|
|
2179
2186
|
|
|
2180
2187
|
|
|
2181
2188
|
var $65709bd8598fce20$exports = {};
|
|
2182
|
-
$65709bd8598fce20$exports = JSON.parse('{"groups":{"core":{"label":"Core identifiers","order":0},"location":{"label":"Genomic location","order":1},"structure":{"label":"Gene structure","order":2},"homology":{"label":"Homology","order":3},"expression":{"label":"Gene expression","order":4},"differential":{"label":"Differential expression","order":5},"hierarchical":{"label":"Hierarchical annotations","order":6},"pathways":{"label":"Pathways","order":7},"GO":{"label":"Gene Ontology","order":7},"PO":{"label":"Plant Ontology","order":8},"lof":{"label":"Loss of function alleles","order":9},"MAKER":{"label":"MAKER transcript metrics","order":10},"xrefs":{"label":"External references","order":11},"other":{"label":"Other","order":99}},"patterns":[{"id":"homology","match":"^homology__(.+)$","group":"homology","multiValued":true,"labelTemplate":"Homology: $1"},{"id":"pathways","match":"^pathways__(.+)$","group":"pathways","multiValued":true,"labelTemplate":"Pathway: $1"},{"id":"maker","match":"^MAKER__(.+)__attr_([a-z])$","group":"MAKER","labelTemplate":"MAKER: $1"},{"id":"xrefs","match":"^(.+)__xrefs$","group":"xrefs","multiValued":true,"labelTemplate":"$1 (xrefs)"},{"id":"expr","match":"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)__expr$","group":"expression","expression":true,"labelTemplate":"$1 \xb7 g$2"},{"id":"diffexpr","match":"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)_g(\\\\d+)_(pval|l2fc)_attr_([a-z])$","group":"differential","diffExpression":true,"labelTemplate":"$1 \xb7 g$2 vs g$3 \xb7 $4"},{"id":"bins","match":"^(fixed|uniform)_([0-9a-zA-Z]+)__bin$","group":"bins","is_hidden":true,"labelTemplate":"$1 bin ($2)"},{"id":"neighbors","match":".*neighbors_[0-9]+$","group":"neighbors","is_hidden":true,"labelTemplate":"neighbors"},{"id":"vep_merged","match":"^VEP__merged__(NAT|EMS)__attr_ss$","group":"lof","multiValued":true,"labelTemplate":"Merged $1 accessions"},{"id":"vep_detail","match":"^VEP__(.+?)__(homo|het)__(.+?)__(\\\\d+)__attr_ss$","group":"lof","multiValued":true,"labelTemplate":"$1 ($2) $3/$4"},{"id":"generic_attr","match":"^(.+)__attr_([a-z])$","group":"other","labelTemplate":"$1"}],"fields":{"id":{"group":"core","label":"Gene ID","order":1},"name":{"group":"core","label":"Name","order":2},"
|
|
2189
|
+
$65709bd8598fce20$exports = JSON.parse('{"groups":{"core":{"label":"Core identifiers","order":0},"location":{"label":"Genomic location","order":1},"structure":{"label":"Gene structure","order":2},"homology":{"label":"Homology","order":3},"exprattrs":{"label":"Expression attributes","order":3.5},"expression":{"label":"Gene expression","order":4},"differential":{"label":"Differential expression","order":5},"hierarchical":{"label":"Hierarchical annotations","order":6},"pathways":{"label":"Pathways","order":7},"GO":{"label":"Gene Ontology","order":7},"PO":{"label":"Plant Ontology","order":8},"lof":{"label":"Loss of function alleles","order":9},"MAKER":{"label":"MAKER transcript metrics","order":10},"xrefs":{"label":"External references","order":11},"other":{"label":"Other","order":99}},"patterns":[{"id":"homology","match":"^homology__(.+)$","group":"homology","multiValued":true,"labelTemplate":"Homology: $1"},{"id":"pathways","match":"^pathways__(.+)$","group":"pathways","multiValued":true,"labelTemplate":"Pathway: $1"},{"id":"maker","match":"^MAKER__(.+)__attr_([a-z])$","group":"MAKER","labelTemplate":"MAKER: $1"},{"id":"xrefs","match":"^(.+)__xrefs$","group":"xrefs","multiValued":true,"labelTemplate":"$1 (xrefs)"},{"id":"expr","match":"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)__expr$","group":"expression","expression":true,"labelTemplate":"$1 \xb7 g$2"},{"id":"diffexpr","match":"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)_g(\\\\d+)_(pval|l2fc)_attr_([a-z])$","group":"differential","diffExpression":true,"labelTemplate":"$1 \xb7 g$2 vs g$3 \xb7 $4"},{"id":"bins","match":"^(fixed|uniform)_([0-9a-zA-Z]+)__bin$","group":"bins","is_hidden":true,"labelTemplate":"$1 bin ($2)"},{"id":"neighbors","match":".*neighbors_[0-9]+$","group":"neighbors","is_hidden":true,"labelTemplate":"neighbors"},{"id":"vep_merged","match":"^VEP__merged__(NAT|EMS)__attr_ss$","group":"lof","multiValued":true,"labelTemplate":"Merged $1 accessions"},{"id":"vep_detail","match":"^VEP__(.+?)__(homo|het)__(.+?)__(\\\\d+)__attr_ss$","group":"lof","multiValued":true,"labelTemplate":"$1 ($2) $3/$4"},{"id":"generic_attr","match":"^(.+)__attr_([a-z])$","group":"other","labelTemplate":"$1"}],"fields":{"id":{"group":"core","label":"Gene ID","order":1},"name":{"group":"core","label":"Name","order":2},"alt_id":{"group":"core","label":"Alternative identifiers","multiValued":true,"order":3,"description":"Identifiers for this gene from earlier annotation releases"},"synonyms":{"group":"core","label":"Synonyms","multiValued":true,"order":4},"description":{"group":"core","label":"Description","order":5},"summary":{"group":"core","label":"Summary","order":6},"biotype":{"group":"core","label":"Biotype","order":7},"system_name":{"group":"core","label":"System name","order":8},"taxon_id":{"group":"core","label":"Taxon ID","order":9},"db_type":{"group":"core","label":"DB type","order":10},"closest_rep_id":{"group":"homology","label":"Closest representative ID","order":1},"closest_rep_name":{"group":"homology","label":"Closest representative name","order":2},"closest_rep_identity":{"group":"homology","label":"Closest representative identity","order":3},"closest_rep_taxon_id":{"group":"homology","label":"Closest representative taxon","order":4},"closest_rep_description":{"group":"homology","label":"Closest representative description","order":5},"model_rep_id":{"group":"homology","label":"Model representative ID","order":6},"model_rep_name":{"group":"homology","label":"Model representative name","order":7},"model_rep_identity":{"group":"homology","label":"Model representative identity","order":8},"model_rep_taxon_id":{"group":"homology","label":"Model representative taxon","order":9},"model_rep_description":{"group":"homology","label":"Model representative description","order":10},"gene_tree":{"group":"homology","label":"Gene tree ID","order":11},"pan_tree":{"group":"homology","label":"Pan-gene tree ID","order":14},"grassius_homolog__attr_ss":{"group":"homology","label":"Grassius family","multiValued":true,"order":15,"description":"Transcription factor / coregulator family assignment from GRASSIUS"},"expr_class__attr_ss":{"group":"exprattrs","label":"Expression class","multiValued":true,"order":1,"description":"tissue_specific, tissue_enhanced, broadly_expressed, ubiquitous, not_expressed or insufficient_data"},"expr_organ_level__attr_ss":{"group":"exprattrs","label":"Expression level by organ","multiValued":true,"order":2,"description":"organ:level pairs, where level is not_expressed, low, medium, high or very_high"},"expr_specific_to__attr_ss":{"group":"exprattrs","label":"Specific to organ","multiValued":true,"order":3,"description":"Organs this gene is expressed in almost exclusively"},"expr_enhanced_in__attr_ss":{"group":"exprattrs","label":"Enhanced in organ","multiValued":true,"order":4,"description":"Organs with expression notably above this gene\'s average"},"expr_high_in__attr_ss":{"group":"exprattrs","label":"High in organ","multiValued":true,"order":5,"description":"Organs where this gene is highly expressed"},"expr_activated_by__attr_ss":{"group":"exprattrs","label":"Activated by condition","multiValued":true,"order":6,"description":"Stress or treatment conditions that induce this gene"},"expr_repressed_by__attr_ss":{"group":"exprattrs","label":"Repressed by condition","multiValued":true,"order":7,"description":"Stress or treatment conditions that repress this gene"},"expr_tau__attr_f":{"group":"exprattrs","label":"Tissue specificity (tau)","order":8,"description":"0 = broadly expressed, 1 = highly tissue specific"},"expr_max_tpm__attr_f":{"group":"exprattrs","label":"Maximum expression (TPM)","order":9,"description":"Highest expression level observed across organs"},"expr_n_organs_detected__attr_i":{"group":"exprattrs","label":"Organs with detected expression","order":10},"capabilities":{"group":"other","label":"Capabilities","multiValued":true},"map":{"group":"location","label":"Map","order":1},"region":{"group":"location","label":"Region","order":2},"start":{"group":"location","label":"Start","order":3},"end":{"group":"location","label":"End","order":4},"strand":{"group":"location","label":"Strand","order":5},"GO__ancestors":{"group":"hierarchical","label":"GO terms","multiValued":true,"order":1},"PO__ancestors":{"group":"hierarchical","label":"PO terms","multiValued":true,"order":2},"TO__ancestors":{"group":"hierarchical","label":"TO terms","multiValued":true,"order":3},"QTL_TO__ancestors":{"group":"hierarchical","label":"QTL traits (TO)","multiValued":true,"order":7},"domains__ancestors":{"group":"hierarchical","label":"Domains","multiValued":true,"order":4},"taxonomy__ancestors":{"group":"hierarchical","label":"Taxonomy","multiValued":true,"order":6},"supertree_attr_s":{"group":"homology","label":"Supertree","order":13},"gene_tree_root_taxon_id":{"group":"homology","label":"Gene tree root taxon","order":12},"protein__length":{"group":"structure","label":"Protein length"},"transcript__count":{"group":"structure","label":"Transcript count"},"transcript__exons":{"group":"structure","label":"Exon count"},"transcript__length":{"group":"structure","label":"Transcript length"},"expressed_in_gxa_attr_ss":{"group":"expression","label":"Expressed in GXA","multiValued":true},"MAKER__AED__attr_f":{"group":"MAKER","label":"AED","description":"Annotation Edit Distance"},"MAKER__QI1__attr_i":{"group":"MAKER","label":"QI1: Length of the 5\' UTR"},"MAKER__QI2__attr_f":{"group":"MAKER","label":"QI2: Fraction of splice sites confirmed by EST"},"MAKER__QI3__attr_f":{"group":"MAKER","label":"QI3: Fraction of exons overlapping an EST"},"MAKER__QI4__attr_f":{"group":"MAKER","label":"QI4: Fraction of exons overlapping EST or protein"},"MAKER__QI5__attr_f":{"group":"MAKER","label":"QI5: Fraction of splice sites confirmed by SNAP"},"MAKER__QI6__attr_f":{"group":"MAKER","label":"QI6: Fraction of exons overlapping a SNAP"},"MAKER__QI7__attr_i":{"group":"MAKER","label":"QI7: Number of exons in the mRNA"},"MAKER__QI8__attr_i":{"group":"MAKER","label":"QI8: Length of the 3\' UTR"},"MAKER__QI9__attr_i":{"group":"MAKER","label":"QI9: Length of the protein sequence"},"homology__all_orthologs":{"group":"homology","label":"All orthologs","multiValued":true,"order":15},"homology__ortholog_one2one":{"group":"homology","label":"1:1 orthologs","multiValued":true,"order":16},"homology__ortholog_one2many":{"group":"homology","label":"1:many orthologs","multiValued":true,"order":17},"homology__ortholog_many2many":{"group":"homology","label":"Many:many orthologs","multiValued":true,"order":18},"homology__syntenic_ortholog_one2one":{"group":"homology","label":"Syntenic 1:1 orthologs","multiValued":true,"order":19},"homology__within_species_paralog":{"group":"homology","label":"Within-species paralogs","multiValued":true,"order":20},"pathways__ancestors":{"group":"hierarchical","label":"Pathways","multiValued":true,"order":5},"canonical_transcript__attr_s":{"group":"structure","label":"Canonical transcript ID"}},"hidden":["_version_","_terms","score","gene_idx","gene_idx_multi","species_idx","compara_idx","compara_idx_multi","_id","annotations","bins","gene_structure","homology","location","xrefs","domain_roots","familyRoot__ancestors","taxonomy__ancestors","capabilities","saved_search"]}');
|
|
2183
2190
|
|
|
2184
2191
|
|
|
2185
2192
|
const $49d5cbca2ec74b2f$export$428c2f647a2a7545 = {
|
|
@@ -2273,6 +2280,8 @@ const $0f839422d0d8c772$var$MULTIVALUED_PATTERNS = [
|
|
|
2273
2280
|
/__expr$/,
|
|
2274
2281
|
/__ancestors$/,
|
|
2275
2282
|
/__xrefs$/,
|
|
2283
|
+
/__attr_ss$/,
|
|
2284
|
+
/^alt_id$/,
|
|
2276
2285
|
/^VEP__/,
|
|
2277
2286
|
/^homology__/
|
|
2278
2287
|
];
|
|
@@ -4661,6 +4670,366 @@ var $4f15cd8a7d970b18$export$2e2bcd8739ae039 = $4f15cd8a7d970b18$var$exprViz;
|
|
|
4661
4670
|
|
|
4662
4671
|
|
|
4663
4672
|
|
|
4673
|
+
// Shared vocabulary and helpers for the sorghum_v11 per-gene expression
|
|
4674
|
+
// attributes (`expr_*__attr_*`). Used by both the Homology tbrowse Expression
|
|
4675
|
+
// zone (results/details/exprAttrsZone.js) and the Attribute table view
|
|
4676
|
+
// (attrTable/AttrTableView.js) so organ ordering and the ordinal level colors
|
|
4677
|
+
// stay a single source of truth.
|
|
4678
|
+
// Canonical anatomical ordering (vegetative → reproductive → seed). Organs not
|
|
4679
|
+
// listed here are appended alphabetically so nothing is ever dropped.
|
|
4680
|
+
const $4b8473139e48e77e$export$a59633f9e62f0e07 = [
|
|
4681
|
+
'root',
|
|
4682
|
+
'shoot',
|
|
4683
|
+
'stem',
|
|
4684
|
+
'leaf',
|
|
4685
|
+
'meristem',
|
|
4686
|
+
'vasculature',
|
|
4687
|
+
'tuber',
|
|
4688
|
+
'cotyledon',
|
|
4689
|
+
'inflorescence',
|
|
4690
|
+
'flower',
|
|
4691
|
+
'anther_pollen',
|
|
4692
|
+
'fruit',
|
|
4693
|
+
'pericarp',
|
|
4694
|
+
'seed',
|
|
4695
|
+
'endosperm',
|
|
4696
|
+
'embryo'
|
|
4697
|
+
];
|
|
4698
|
+
const $4b8473139e48e77e$export$9a0b81895f7233d0 = {
|
|
4699
|
+
root: 'rt',
|
|
4700
|
+
shoot: 'sht',
|
|
4701
|
+
stem: 'stm',
|
|
4702
|
+
leaf: 'lf',
|
|
4703
|
+
meristem: 'mer',
|
|
4704
|
+
vasculature: 'vas',
|
|
4705
|
+
tuber: 'tbr',
|
|
4706
|
+
cotyledon: 'cot',
|
|
4707
|
+
inflorescence: 'inf',
|
|
4708
|
+
flower: 'flw',
|
|
4709
|
+
anther_pollen: 'ant',
|
|
4710
|
+
fruit: 'frt',
|
|
4711
|
+
pericarp: 'per',
|
|
4712
|
+
seed: 'sd',
|
|
4713
|
+
endosperm: 'end',
|
|
4714
|
+
embryo: 'emb'
|
|
4715
|
+
};
|
|
4716
|
+
const $4b8473139e48e77e$export$f8541c2790c3baeb = (o)=>$4b8473139e48e77e$export$9a0b81895f7233d0[o] || o.slice(0, 3);
|
|
4717
|
+
const $4b8473139e48e77e$export$50c1f966fd3af83e = (o)=>o.replace(/_/g, ' ');
|
|
4718
|
+
const $4b8473139e48e77e$export$4bb936dc8856d37a = [
|
|
4719
|
+
'not_expressed',
|
|
4720
|
+
'low',
|
|
4721
|
+
'medium',
|
|
4722
|
+
'high',
|
|
4723
|
+
'very_high'
|
|
4724
|
+
];
|
|
4725
|
+
const $4b8473139e48e77e$export$b352e11f7a2ac9c5 = {
|
|
4726
|
+
not_expressed: '#eef2f6',
|
|
4727
|
+
low: '#cfe0ee',
|
|
4728
|
+
medium: '#8fbbdc',
|
|
4729
|
+
high: '#3f86c2',
|
|
4730
|
+
very_high: '#0a3d72'
|
|
4731
|
+
};
|
|
4732
|
+
const $4b8473139e48e77e$export$433053e2c141d410 = {
|
|
4733
|
+
not_expressed: 'not expressed',
|
|
4734
|
+
low: 'low',
|
|
4735
|
+
medium: 'medium',
|
|
4736
|
+
high: 'high',
|
|
4737
|
+
very_high: 'very high'
|
|
4738
|
+
};
|
|
4739
|
+
const $4b8473139e48e77e$export$a61929d6d484c6d4 = $4b8473139e48e77e$export$4bb936dc8856d37a.reduce((m, l, i)=>{
|
|
4740
|
+
m[l] = i;
|
|
4741
|
+
return m;
|
|
4742
|
+
}, {});
|
|
4743
|
+
const $4b8473139e48e77e$export$c6dbe9be8c8b382e = {
|
|
4744
|
+
up: {
|
|
4745
|
+
bg: '#fdecea',
|
|
4746
|
+
fg: '#c0392b'
|
|
4747
|
+
},
|
|
4748
|
+
down: {
|
|
4749
|
+
bg: '#eaf2fb',
|
|
4750
|
+
fg: '#2e6fae'
|
|
4751
|
+
}
|
|
4752
|
+
};
|
|
4753
|
+
const $4b8473139e48e77e$export$39a35029fe99c21 = '#d35400'; // specific-to dot / enhanced-in outline
|
|
4754
|
+
function $4b8473139e48e77e$export$8ca7625ba2054603(tokens) {
|
|
4755
|
+
const out = {};
|
|
4756
|
+
(tokens || []).forEach((t)=>{
|
|
4757
|
+
const i = t.lastIndexOf(':');
|
|
4758
|
+
if (i < 0) return;
|
|
4759
|
+
out[t.slice(0, i)] = t.slice(i + 1);
|
|
4760
|
+
});
|
|
4761
|
+
return out;
|
|
4762
|
+
}
|
|
4763
|
+
function $4b8473139e48e77e$export$65382efdcdd96f8c(organs) {
|
|
4764
|
+
const set = organs instanceof Set ? organs : new Set(organs || []);
|
|
4765
|
+
const known = $4b8473139e48e77e$export$a59633f9e62f0e07.filter((o)=>set.has(o));
|
|
4766
|
+
const unknown = [
|
|
4767
|
+
...set
|
|
4768
|
+
].filter((o)=>!$4b8473139e48e77e$export$a59633f9e62f0e07.includes(o)).sort();
|
|
4769
|
+
return [
|
|
4770
|
+
...known,
|
|
4771
|
+
...unknown
|
|
4772
|
+
];
|
|
4773
|
+
}
|
|
4774
|
+
function $4b8473139e48e77e$export$69fb5d19b5db1cfa(doc) {
|
|
4775
|
+
const d = doc || {};
|
|
4776
|
+
const cls = d.expr_class__attr_ss || [];
|
|
4777
|
+
const maxTpm = Number.isFinite(+d.expr_max_tpm__attr_f) ? +d.expr_max_tpm__attr_f : null;
|
|
4778
|
+
const tau = Number.isFinite(+d.expr_tau__attr_f) ? +d.expr_tau__attr_f : null;
|
|
4779
|
+
return {
|
|
4780
|
+
organLevels: $4b8473139e48e77e$export$8ca7625ba2054603(d.expr_organ_level__attr_ss),
|
|
4781
|
+
specificTo: new Set(d.expr_specific_to__attr_ss || []),
|
|
4782
|
+
enhancedIn: new Set(d.expr_enhanced_in__attr_ss || []),
|
|
4783
|
+
highIn: new Set(d.expr_high_in__attr_ss || []),
|
|
4784
|
+
cls: cls,
|
|
4785
|
+
maxTpm: maxTpm,
|
|
4786
|
+
tau: tau,
|
|
4787
|
+
nOrgans: Number.isFinite(+d.expr_n_organs_detected__attr_i) ? +d.expr_n_organs_detected__attr_i : null,
|
|
4788
|
+
activatedBy: d.expr_activated_by__attr_ss || [],
|
|
4789
|
+
repressedBy: d.expr_repressed_by__attr_ss || []
|
|
4790
|
+
};
|
|
4791
|
+
}
|
|
4792
|
+
function $4b8473139e48e77e$export$fc40d061e6c16645(v, range) {
|
|
4793
|
+
if (!Number.isFinite(v)) return null;
|
|
4794
|
+
const lo = Math.log10((range && range.min || 0) + 1);
|
|
4795
|
+
const hi = Math.log10((range && range.max || 0) + 1);
|
|
4796
|
+
if (hi <= lo) return 0.5;
|
|
4797
|
+
return Math.max(0, Math.min(1, (Math.log10(v + 1) - lo) / (hi - lo)));
|
|
4798
|
+
}
|
|
4799
|
+
function $4b8473139e48e77e$export$4b443417c5259620(v, range) {
|
|
4800
|
+
const f = $4b8473139e48e77e$export$fc40d061e6c16645(v, range);
|
|
4801
|
+
if (f === null) return 'transparent';
|
|
4802
|
+
return `rgba(33, 102, 172, ${(0.1 + 0.65 * f).toFixed(3)})`;
|
|
4803
|
+
}
|
|
4804
|
+
function $4b8473139e48e77e$export$8eaa32ef86afdd9c(v) {
|
|
4805
|
+
if (!Number.isFinite(v)) return '';
|
|
4806
|
+
return v >= 10 ? String(Math.round(v)) : String(Math.round(v * 10) / 10);
|
|
4807
|
+
}
|
|
4808
|
+
function $4b8473139e48e77e$export$1f04174626f2ac64(cls) {
|
|
4809
|
+
return cls && cls.length ? cls.map((c)=>c.replace(/_/g, ' ')).join(', ') : null;
|
|
4810
|
+
}
|
|
4811
|
+
const $4b8473139e48e77e$export$705aff68da3ddba0 = [
|
|
4812
|
+
'expr_class__attr_ss',
|
|
4813
|
+
'expr_organ_level__attr_ss',
|
|
4814
|
+
'expr_specific_to__attr_ss',
|
|
4815
|
+
'expr_enhanced_in__attr_ss',
|
|
4816
|
+
'expr_high_in__attr_ss',
|
|
4817
|
+
'expr_activated_by__attr_ss',
|
|
4818
|
+
'expr_repressed_by__attr_ss',
|
|
4819
|
+
'expr_tau__attr_f',
|
|
4820
|
+
'expr_max_tpm__attr_f',
|
|
4821
|
+
'expr_n_organs_detected__attr_i'
|
|
4822
|
+
];
|
|
4823
|
+
|
|
4824
|
+
|
|
4825
|
+
// Backing store for the "Attribute table" view: the genes in the current search
|
|
4826
|
+
// result set, fetched in pages and rendered as a gene × attribute table (basic
|
|
4827
|
+
// identity columns + the expression-attribute heatmap + any extra attribute
|
|
4828
|
+
// columns the user picks from the field catalog).
|
|
4829
|
+
//
|
|
4830
|
+
// Paging mirrors exprViz's doFetchExprVizData: a recursive fetchPage(offset)
|
|
4831
|
+
// with a request-id guard so a superseded fetch can never write stale rows.
|
|
4832
|
+
const $12feb7ca48271e17$var$PAGE_SIZE = 1000;
|
|
4833
|
+
const $12feb7ca48271e17$var$MAX_GENES = 5000;
|
|
4834
|
+
// Identity/basic columns that are always fetched.
|
|
4835
|
+
const $12feb7ca48271e17$var$BASE_FIELDS = [
|
|
4836
|
+
'id',
|
|
4837
|
+
'name',
|
|
4838
|
+
'system_name',
|
|
4839
|
+
'taxon_id',
|
|
4840
|
+
'biotype',
|
|
4841
|
+
'region',
|
|
4842
|
+
'start',
|
|
4843
|
+
'end'
|
|
4844
|
+
];
|
|
4845
|
+
let $12feb7ca48271e17$var$fetchPendingId = 0;
|
|
4846
|
+
// Only send fq=taxon_id:(...) when the user has actually subset the genomes —
|
|
4847
|
+
// same rule the main search uses (see bundles/api.js), so the table matches the
|
|
4848
|
+
// visible result set without bloating the URL.
|
|
4849
|
+
function $12feb7ca48271e17$var$genomeSubset(g, m) {
|
|
4850
|
+
const maps = m || {};
|
|
4851
|
+
const visibleTaxa = Object.keys(maps).filter((tid)=>!maps[tid].hidden);
|
|
4852
|
+
const activeVisible = Object.keys(g && g.active || {}).filter((tid)=>maps[tid] && !maps[tid].hidden);
|
|
4853
|
+
const subset = activeVisible.length > 0 && activeVisible.length < visibleTaxa.length;
|
|
4854
|
+
const sorted = activeVisible.slice().sort();
|
|
4855
|
+
return {
|
|
4856
|
+
fq: subset ? `&fq=taxon_id:(${sorted.join(' OR ')})` : '',
|
|
4857
|
+
key: subset ? sorted.join(',') : ''
|
|
4858
|
+
};
|
|
4859
|
+
}
|
|
4860
|
+
function $12feb7ca48271e17$var$computeSignature(q, g, m, selectedFields) {
|
|
4861
|
+
return `${q}|${$12feb7ca48271e17$var$genomeSubset(g, m).key}|${(selectedFields || []).slice().sort().join(',')}`;
|
|
4862
|
+
}
|
|
4863
|
+
const $12feb7ca48271e17$var$attrTable = {
|
|
4864
|
+
name: 'attrTable',
|
|
4865
|
+
getReducer: ()=>{
|
|
4866
|
+
const initialState = {
|
|
4867
|
+
status: 'idle',
|
|
4868
|
+
docs: [],
|
|
4869
|
+
total: 0,
|
|
4870
|
+
truncated: false,
|
|
4871
|
+
signature: null,
|
|
4872
|
+
error: null,
|
|
4873
|
+
requestId: 0,
|
|
4874
|
+
selectedFields: [] // extra attribute columns chosen from the field catalog
|
|
4875
|
+
};
|
|
4876
|
+
return (state = initialState, { type: type, payload: payload })=>{
|
|
4877
|
+
switch(type){
|
|
4878
|
+
case 'ATTRTABLE_FETCH_STARTED':
|
|
4879
|
+
return {
|
|
4880
|
+
...state,
|
|
4881
|
+
status: 'loading',
|
|
4882
|
+
docs: [],
|
|
4883
|
+
total: 0,
|
|
4884
|
+
truncated: false,
|
|
4885
|
+
error: null,
|
|
4886
|
+
signature: payload.signature,
|
|
4887
|
+
requestId: payload.requestId
|
|
4888
|
+
};
|
|
4889
|
+
case 'ATTRTABLE_FETCH_BATCH':
|
|
4890
|
+
{
|
|
4891
|
+
if (payload.requestId !== state.requestId) return state; // superseded
|
|
4892
|
+
const docs = state.docs.concat(payload.docs);
|
|
4893
|
+
const target = Math.min(payload.total, $12feb7ca48271e17$var$MAX_GENES);
|
|
4894
|
+
return {
|
|
4895
|
+
...state,
|
|
4896
|
+
docs: docs,
|
|
4897
|
+
total: payload.total,
|
|
4898
|
+
truncated: payload.total > $12feb7ca48271e17$var$MAX_GENES,
|
|
4899
|
+
status: docs.length >= target ? 'ready' : 'loading'
|
|
4900
|
+
};
|
|
4901
|
+
}
|
|
4902
|
+
case 'ATTRTABLE_FETCH_FAILED':
|
|
4903
|
+
if (payload.requestId !== state.requestId) return state;
|
|
4904
|
+
return {
|
|
4905
|
+
...state,
|
|
4906
|
+
status: 'error',
|
|
4907
|
+
error: payload.error
|
|
4908
|
+
};
|
|
4909
|
+
case 'ATTRTABLE_FIELD_TOGGLED':
|
|
4910
|
+
{
|
|
4911
|
+
const set = new Set(state.selectedFields);
|
|
4912
|
+
if (set.has(payload)) set.delete(payload);
|
|
4913
|
+
else set.add(payload);
|
|
4914
|
+
return {
|
|
4915
|
+
...state,
|
|
4916
|
+
selectedFields: [
|
|
4917
|
+
...set
|
|
4918
|
+
]
|
|
4919
|
+
};
|
|
4920
|
+
}
|
|
4921
|
+
case 'ATTRTABLE_FIELDS_BULK_SET':
|
|
4922
|
+
{
|
|
4923
|
+
const set = new Set(state.selectedFields);
|
|
4924
|
+
(payload.names || []).forEach((n)=>{
|
|
4925
|
+
if (payload.selected) set.add(n);
|
|
4926
|
+
else set.delete(n);
|
|
4927
|
+
});
|
|
4928
|
+
return {
|
|
4929
|
+
...state,
|
|
4930
|
+
selectedFields: [
|
|
4931
|
+
...set
|
|
4932
|
+
]
|
|
4933
|
+
};
|
|
4934
|
+
}
|
|
4935
|
+
case 'GRAMENE_SEARCH_CLEARED':
|
|
4936
|
+
return {
|
|
4937
|
+
...initialState,
|
|
4938
|
+
selectedFields: state.selectedFields
|
|
4939
|
+
};
|
|
4940
|
+
default:
|
|
4941
|
+
return state;
|
|
4942
|
+
}
|
|
4943
|
+
};
|
|
4944
|
+
},
|
|
4945
|
+
doFetchAttrTable: ()=>({ dispatch: dispatch, store: store })=>{
|
|
4946
|
+
const { selectedFields: selectedFields } = store.selectAttrTable();
|
|
4947
|
+
const q = store.selectGrameneFiltersQueryString();
|
|
4948
|
+
const { fq: fq } = $12feb7ca48271e17$var$genomeSubset(store.selectGrameneGenomes(), store.selectGrameneMaps());
|
|
4949
|
+
const signature = $12feb7ca48271e17$var$computeSignature(q, store.selectGrameneGenomes(), store.selectGrameneMaps(), selectedFields);
|
|
4950
|
+
const requestId = ++$12feb7ca48271e17$var$fetchPendingId;
|
|
4951
|
+
dispatch({
|
|
4952
|
+
type: 'ATTRTABLE_FETCH_STARTED',
|
|
4953
|
+
payload: {
|
|
4954
|
+
requestId: requestId,
|
|
4955
|
+
signature: signature
|
|
4956
|
+
}
|
|
4957
|
+
});
|
|
4958
|
+
const api = store.selectGrameneAPI();
|
|
4959
|
+
// Explicit fl — never fl=*, which would drag in every per-sample __expr column.
|
|
4960
|
+
const fl = [
|
|
4961
|
+
...new Set([
|
|
4962
|
+
...$12feb7ca48271e17$var$BASE_FIELDS,
|
|
4963
|
+
...(0, $4b8473139e48e77e$export$705aff68da3ddba0),
|
|
4964
|
+
...selectedFields
|
|
4965
|
+
])
|
|
4966
|
+
].join(',');
|
|
4967
|
+
const fetchPage = (offset)=>{
|
|
4968
|
+
if (requestId !== $12feb7ca48271e17$var$fetchPendingId) return; // superseded
|
|
4969
|
+
const rows = Math.min($12feb7ca48271e17$var$PAGE_SIZE, $12feb7ca48271e17$var$MAX_GENES - offset);
|
|
4970
|
+
if (rows <= 0) return;
|
|
4971
|
+
const url = `${api}/search?q=${q}${fq}&fl=${fl}&rows=${rows}&start=${offset}`;
|
|
4972
|
+
fetch(url).then((r)=>r.json()).then((json)=>{
|
|
4973
|
+
if (requestId !== $12feb7ca48271e17$var$fetchPendingId) return;
|
|
4974
|
+
const docs = json.response && json.response.docs || [];
|
|
4975
|
+
const total = json.response && json.response.numFound || 0;
|
|
4976
|
+
dispatch({
|
|
4977
|
+
type: 'ATTRTABLE_FETCH_BATCH',
|
|
4978
|
+
payload: {
|
|
4979
|
+
requestId: requestId,
|
|
4980
|
+
docs: docs,
|
|
4981
|
+
total: total
|
|
4982
|
+
}
|
|
4983
|
+
});
|
|
4984
|
+
const next = offset + docs.length;
|
|
4985
|
+
if (docs.length > 0 && next < Math.min(total, $12feb7ca48271e17$var$MAX_GENES)) fetchPage(next);
|
|
4986
|
+
}).catch((err)=>{
|
|
4987
|
+
dispatch({
|
|
4988
|
+
type: 'ATTRTABLE_FETCH_FAILED',
|
|
4989
|
+
payload: {
|
|
4990
|
+
requestId: requestId,
|
|
4991
|
+
error: String(err)
|
|
4992
|
+
}
|
|
4993
|
+
});
|
|
4994
|
+
});
|
|
4995
|
+
};
|
|
4996
|
+
fetchPage(0);
|
|
4997
|
+
},
|
|
4998
|
+
doToggleAttrTableField: (name)=>({ dispatch: dispatch })=>dispatch({
|
|
4999
|
+
type: 'ATTRTABLE_FIELD_TOGGLED',
|
|
5000
|
+
payload: name
|
|
5001
|
+
}),
|
|
5002
|
+
doBulkSetAttrTableFields: (names, selected)=>({ dispatch: dispatch })=>dispatch({
|
|
5003
|
+
type: 'ATTRTABLE_FIELDS_BULK_SET',
|
|
5004
|
+
payload: {
|
|
5005
|
+
names: names,
|
|
5006
|
+
selected: selected
|
|
5007
|
+
}
|
|
5008
|
+
}),
|
|
5009
|
+
selectAttrTable: (state)=>state.attrTable,
|
|
5010
|
+
selectAttrTableSelectedFields: (state)=>state.attrTable.selectedFields,
|
|
5011
|
+
// Fetch only while the view is actually on, and only when the query context or
|
|
5012
|
+
// the chosen columns have changed. A toggle made mid-load is picked up when the
|
|
5013
|
+
// in-flight fetch settles (the signature will no longer match).
|
|
5014
|
+
reactAttrTableFetch: (0, $gXNCa$reduxbundler.createSelector)('selectAttrTable', 'selectGrameneFiltersStatus', 'selectGrameneViewsOn', 'selectGrameneFiltersQueryString', 'selectGrameneGenomes', 'selectGrameneMaps', (at, filtersStatus, viewsOn, q, g, m)=>{
|
|
5015
|
+
if (!at || filtersStatus === 'init') return;
|
|
5016
|
+
if (!viewsOn || !viewsOn.has('attrTable')) return;
|
|
5017
|
+
if (at.status === 'loading') return;
|
|
5018
|
+
const sig = $12feb7ca48271e17$var$computeSignature(q, g, m, at.selectedFields);
|
|
5019
|
+
if (at.signature === sig && (at.status === 'ready' || at.status === 'error')) return;
|
|
5020
|
+
return {
|
|
5021
|
+
actionCreator: 'doFetchAttrTable'
|
|
5022
|
+
};
|
|
5023
|
+
})
|
|
5024
|
+
};
|
|
5025
|
+
const $12feb7ca48271e17$export$d00a9fd01497b827 = {
|
|
5026
|
+
PAGE_SIZE: $12feb7ca48271e17$var$PAGE_SIZE,
|
|
5027
|
+
MAX_GENES: $12feb7ca48271e17$var$MAX_GENES
|
|
5028
|
+
};
|
|
5029
|
+
var $12feb7ca48271e17$export$2e2bcd8739ae039 = $12feb7ca48271e17$var$attrTable;
|
|
5030
|
+
|
|
5031
|
+
|
|
5032
|
+
|
|
4664
5033
|
// Ontology over-representation analysis (clusterProfiler::enrichGO-style).
|
|
4665
5034
|
//
|
|
4666
5035
|
// For each species tab we run:
|
|
@@ -6417,6 +6786,7 @@ var $5df6c55c1bef3469$export$2e2bcd8739ae039 = [
|
|
|
6417
6786
|
(0, $1508f5a42be6e7b5$export$2e2bcd8739ae039),
|
|
6418
6787
|
(0, $c921a0d2b34aadb6$export$2e2bcd8739ae039),
|
|
6419
6788
|
(0, $4f15cd8a7d970b18$export$2e2bcd8739ae039),
|
|
6789
|
+
(0, $12feb7ca48271e17$export$2e2bcd8739ae039),
|
|
6420
6790
|
(0, $d365d8c287ab0c94$export$2e2bcd8739ae039),
|
|
6421
6791
|
(0, $7f865ea0feda21af$export$2e2bcd8739ae039),
|
|
6422
6792
|
(0, $6048209b532f201d$export$2e2bcd8739ae039),
|
|
@@ -7430,82 +7800,7 @@ const $5c2c79352d3d7b81$export$b2e089eb3692b073 = (props)=>/*#__PURE__*/ (0, $gX
|
|
|
7430
7800
|
|
|
7431
7801
|
|
|
7432
7802
|
|
|
7433
|
-
|
|
7434
|
-
// listed here are appended alphabetically so nothing is ever dropped.
|
|
7435
|
-
const $cd8bc494277e92a4$var$ORGAN_ORDER = [
|
|
7436
|
-
'root',
|
|
7437
|
-
'shoot',
|
|
7438
|
-
'stem',
|
|
7439
|
-
'leaf',
|
|
7440
|
-
'meristem',
|
|
7441
|
-
'vasculature',
|
|
7442
|
-
'tuber',
|
|
7443
|
-
'cotyledon',
|
|
7444
|
-
'inflorescence',
|
|
7445
|
-
'flower',
|
|
7446
|
-
'anther_pollen',
|
|
7447
|
-
'fruit',
|
|
7448
|
-
'pericarp',
|
|
7449
|
-
'seed',
|
|
7450
|
-
'endosperm',
|
|
7451
|
-
'embryo'
|
|
7452
|
-
];
|
|
7453
|
-
// Short column-header codes; unknown organs fall back to their first 3 letters.
|
|
7454
|
-
const $cd8bc494277e92a4$var$ORGAN_ABBR = {
|
|
7455
|
-
root: 'rt',
|
|
7456
|
-
shoot: 'sht',
|
|
7457
|
-
stem: 'stm',
|
|
7458
|
-
leaf: 'lf',
|
|
7459
|
-
meristem: 'mer',
|
|
7460
|
-
vasculature: 'vas',
|
|
7461
|
-
tuber: 'tbr',
|
|
7462
|
-
cotyledon: 'cot',
|
|
7463
|
-
inflorescence: 'inf',
|
|
7464
|
-
flower: 'flw',
|
|
7465
|
-
anther_pollen: 'ant',
|
|
7466
|
-
fruit: 'frt',
|
|
7467
|
-
pericarp: 'per',
|
|
7468
|
-
seed: 'sd',
|
|
7469
|
-
endosperm: 'end',
|
|
7470
|
-
embryo: 'emb'
|
|
7471
|
-
};
|
|
7472
|
-
const $cd8bc494277e92a4$var$abbr = (o)=>$cd8bc494277e92a4$var$ORGAN_ABBR[o] || o.slice(0, 3);
|
|
7473
|
-
// Ordinal expression level → color. not_expressed gets a distinct pale tint (it
|
|
7474
|
-
// IS a measurement); an organ a species doesn't report stays transparent (= not
|
|
7475
|
-
// assayed). Ramp matches HeatmapPlot's pale→dark blue.
|
|
7476
|
-
const $cd8bc494277e92a4$var$LEVEL_ORDER = [
|
|
7477
|
-
'not_expressed',
|
|
7478
|
-
'low',
|
|
7479
|
-
'medium',
|
|
7480
|
-
'high',
|
|
7481
|
-
'very_high'
|
|
7482
|
-
];
|
|
7483
|
-
const $cd8bc494277e92a4$var$LEVEL_COLOR = {
|
|
7484
|
-
not_expressed: '#eef2f6',
|
|
7485
|
-
low: '#cfe0ee',
|
|
7486
|
-
medium: '#8fbbdc',
|
|
7487
|
-
high: '#3f86c2',
|
|
7488
|
-
very_high: '#0a3d72'
|
|
7489
|
-
};
|
|
7490
|
-
const $cd8bc494277e92a4$var$LEVEL_LABEL = {
|
|
7491
|
-
not_expressed: 'not expressed',
|
|
7492
|
-
low: 'low',
|
|
7493
|
-
medium: 'medium',
|
|
7494
|
-
high: 'high',
|
|
7495
|
-
very_high: 'very high'
|
|
7496
|
-
};
|
|
7497
|
-
// Stress chips: activated (induced) = warm, repressed = cool.
|
|
7498
|
-
const $cd8bc494277e92a4$var$STRESS = {
|
|
7499
|
-
up: {
|
|
7500
|
-
bg: '#fdecea',
|
|
7501
|
-
fg: '#c0392b'
|
|
7502
|
-
},
|
|
7503
|
-
down: {
|
|
7504
|
-
bg: '#eaf2fb',
|
|
7505
|
-
fg: '#2e6fae'
|
|
7506
|
-
}
|
|
7507
|
-
};
|
|
7508
|
-
const $cd8bc494277e92a4$var$MARKER = '#d35400'; // specific-to dot / enhanced-in outline
|
|
7803
|
+
|
|
7509
7804
|
const $cd8bc494277e92a4$var$ORGAN_CELL_W = 16;
|
|
7510
7805
|
const $cd8bc494277e92a4$var$MAXTPM_W = 46;
|
|
7511
7806
|
const $cd8bc494277e92a4$var$STRESS_MIN = 120;
|
|
@@ -7526,38 +7821,16 @@ function $cd8bc494277e92a4$export$965a6b1d7408d496(docs, tree) {
|
|
|
7526
7821
|
if (!d || !d.id) return;
|
|
7527
7822
|
const nodeId = nodeOf[d.id];
|
|
7528
7823
|
if (!nodeId) return;
|
|
7529
|
-
const
|
|
7530
|
-
(
|
|
7531
|
-
|
|
7532
|
-
if (
|
|
7533
|
-
|
|
7534
|
-
organLevels[organ] = t.slice(i + 1);
|
|
7535
|
-
organSet.add(organ);
|
|
7536
|
-
});
|
|
7537
|
-
const maxTpm = Number.isFinite(+d.expr_max_tpm__attr_f) ? +d.expr_max_tpm__attr_f : null;
|
|
7538
|
-
if (maxTpm !== null) {
|
|
7539
|
-
if (maxTpm < tpmMin) tpmMin = maxTpm;
|
|
7540
|
-
if (maxTpm > tpmMax) tpmMax = maxTpm;
|
|
7824
|
+
const attrs = (0, $4b8473139e48e77e$export$69fb5d19b5db1cfa)(d);
|
|
7825
|
+
Object.keys(attrs.organLevels).forEach((o)=>organSet.add(o));
|
|
7826
|
+
if (attrs.maxTpm !== null) {
|
|
7827
|
+
if (attrs.maxTpm < tpmMin) tpmMin = attrs.maxTpm;
|
|
7828
|
+
if (attrs.maxTpm > tpmMax) tpmMax = attrs.maxTpm;
|
|
7541
7829
|
}
|
|
7542
|
-
byNode[nodeId] =
|
|
7543
|
-
cls: d.expr_class__attr_ss || [],
|
|
7544
|
-
organLevels: organLevels,
|
|
7545
|
-
specificTo: new Set(d.expr_specific_to__attr_ss || []),
|
|
7546
|
-
enhancedIn: new Set(d.expr_enhanced_in__attr_ss || []),
|
|
7547
|
-
maxTpm: maxTpm,
|
|
7548
|
-
activatedBy: d.expr_activated_by__attr_ss || [],
|
|
7549
|
-
repressedBy: d.expr_repressed_by__attr_ss || []
|
|
7550
|
-
};
|
|
7830
|
+
byNode[nodeId] = attrs;
|
|
7551
7831
|
});
|
|
7552
|
-
const known = $cd8bc494277e92a4$var$ORGAN_ORDER.filter((o)=>organSet.has(o));
|
|
7553
|
-
const unknown = [
|
|
7554
|
-
...organSet
|
|
7555
|
-
].filter((o)=>!$cd8bc494277e92a4$var$ORGAN_ORDER.includes(o)).sort();
|
|
7556
7832
|
return {
|
|
7557
|
-
organs:
|
|
7558
|
-
...known,
|
|
7559
|
-
...unknown
|
|
7560
|
-
],
|
|
7833
|
+
organs: (0, $4b8473139e48e77e$export$65382efdcdd96f8c)(organSet),
|
|
7561
7834
|
byNode: byNode,
|
|
7562
7835
|
nodeGene: nodeGene,
|
|
7563
7836
|
maxTpm: {
|
|
@@ -7574,21 +7847,6 @@ function $cd8bc494277e92a4$var$rowHighlight(isSelected, isExactHover, isInHovere
|
|
|
7574
7847
|
if (isInHoveredSubtree) return 'var(--tbrowse-row-subtree-bg)';
|
|
7575
7848
|
return 'transparent';
|
|
7576
7849
|
}
|
|
7577
|
-
// Log-scaled fraction of v within [min,max], for the Max TPM heat background.
|
|
7578
|
-
function $cd8bc494277e92a4$var$tpmFraction(v, range) {
|
|
7579
|
-
if (!Number.isFinite(v)) return null;
|
|
7580
|
-
const lo = Math.log10((range.min || 0) + 1);
|
|
7581
|
-
const hi = Math.log10((range.max || 0) + 1);
|
|
7582
|
-
if (hi <= lo) return 0.5;
|
|
7583
|
-
return Math.max(0, Math.min(1, (Math.log10(v + 1) - lo) / (hi - lo)));
|
|
7584
|
-
}
|
|
7585
|
-
function $cd8bc494277e92a4$var$fmtTpm(v) {
|
|
7586
|
-
if (!Number.isFinite(v)) return '';
|
|
7587
|
-
return v >= 10 ? String(Math.round(v)) : String(Math.round(v * 10) / 10);
|
|
7588
|
-
}
|
|
7589
|
-
function $cd8bc494277e92a4$var$fmtClass(cls) {
|
|
7590
|
-
return cls && cls.length ? cls.map((c)=>c.replace(/_/g, ' ')).join(', ') : null;
|
|
7591
|
-
}
|
|
7592
7850
|
const $cd8bc494277e92a4$var$gridBorder = '1px solid var(--tbrowse-grid-line, rgba(0,0,0,0.06))';
|
|
7593
7851
|
const $cd8bc494277e92a4$var$stressWidth = (width, organCount)=>Math.max($cd8bc494277e92a4$var$STRESS_MIN, width - organCount * $cd8bc494277e92a4$var$ORGAN_CELL_W - $cd8bc494277e92a4$var$MAXTPM_W);
|
|
7594
7852
|
const $cd8bc494277e92a4$var$ExprHeader = ({ zoneState: zoneState, setZoneState: setZoneState, width: width, data: data, hoveredNodeId: hoveredNodeId })=>{
|
|
@@ -7596,7 +7854,7 @@ const $cd8bc494277e92a4$var$ExprHeader = ({ zoneState: zoneState, setZoneState:
|
|
|
7596
7854
|
const organs = ea.organs || [];
|
|
7597
7855
|
const gid = hoveredNodeId && ea.nodeGene && ea.nodeGene[hoveredNodeId];
|
|
7598
7856
|
const gene = hoveredNodeId && ea.byNode && ea.byNode[hoveredNodeId];
|
|
7599
|
-
const clsText = gene && $
|
|
7857
|
+
const clsText = gene && (0, $4b8473139e48e77e$export$1f04174626f2ac64)(gene.cls);
|
|
7600
7858
|
return /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)("div", {
|
|
7601
7859
|
style: {
|
|
7602
7860
|
height: '100%',
|
|
@@ -7632,12 +7890,12 @@ const $cd8bc494277e92a4$var$ExprHeader = ({ zoneState: zoneState, setZoneState:
|
|
|
7632
7890
|
opacity: 0.85
|
|
7633
7891
|
},
|
|
7634
7892
|
title: "expression level",
|
|
7635
|
-
children: $
|
|
7636
|
-
title: $
|
|
7893
|
+
children: (0, $4b8473139e48e77e$export$4bb936dc8856d37a).map((lv)=>/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("span", {
|
|
7894
|
+
title: (0, $4b8473139e48e77e$export$433053e2c141d410)[lv],
|
|
7637
7895
|
style: {
|
|
7638
7896
|
width: 10,
|
|
7639
7897
|
height: 10,
|
|
7640
|
-
background: $
|
|
7898
|
+
background: (0, $4b8473139e48e77e$export$b352e11f7a2ac9c5)[lv],
|
|
7641
7899
|
border: $cd8bc494277e92a4$var$gridBorder,
|
|
7642
7900
|
display: 'inline-block'
|
|
7643
7901
|
}
|
|
@@ -7680,7 +7938,7 @@ const $cd8bc494277e92a4$var$ExprHeader = ({ zoneState: zoneState, setZoneState:
|
|
|
7680
7938
|
},
|
|
7681
7939
|
children: [
|
|
7682
7940
|
organs.map((o)=>/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("div", {
|
|
7683
|
-
title:
|
|
7941
|
+
title: (0, $4b8473139e48e77e$export$50c1f966fd3af83e)(o),
|
|
7684
7942
|
style: {
|
|
7685
7943
|
width: $cd8bc494277e92a4$var$ORGAN_CELL_W,
|
|
7686
7944
|
fontSize: 8,
|
|
@@ -7690,7 +7948,7 @@ const $cd8bc494277e92a4$var$ExprHeader = ({ zoneState: zoneState, setZoneState:
|
|
|
7690
7948
|
borderRight: $cd8bc494277e92a4$var$gridBorder,
|
|
7691
7949
|
opacity: 0.8
|
|
7692
7950
|
},
|
|
7693
|
-
children: $
|
|
7951
|
+
children: (0, $4b8473139e48e77e$export$f8541c2790c3baeb)(o)
|
|
7694
7952
|
}, o)),
|
|
7695
7953
|
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("div", {
|
|
7696
7954
|
style: {
|
|
@@ -7722,17 +7980,17 @@ const $cd8bc494277e92a4$var$OrganCell = ({ organ: organ, gene: gene })=>{
|
|
|
7722
7980
|
const level = gene && gene.organLevels[organ];
|
|
7723
7981
|
const specific = !!(gene && gene.specificTo.has(organ));
|
|
7724
7982
|
const enhanced = !!(gene && gene.enhancedIn.has(organ));
|
|
7725
|
-
const title = level ? `${
|
|
7983
|
+
const title = level ? `${(0, $4b8473139e48e77e$export$50c1f966fd3af83e)(organ)}: ${(0, $4b8473139e48e77e$export$433053e2c141d410)[level] || level}${specific ? " \xb7 specific" : enhanced ? " \xb7 enhanced" : ''}` : `${(0, $4b8473139e48e77e$export$50c1f966fd3af83e)(organ)}: not assayed`;
|
|
7726
7984
|
const style = {
|
|
7727
7985
|
position: 'relative',
|
|
7728
7986
|
width: $cd8bc494277e92a4$var$ORGAN_CELL_W,
|
|
7729
7987
|
height: '100%',
|
|
7730
7988
|
boxSizing: 'border-box',
|
|
7731
|
-
background: level ? $
|
|
7989
|
+
background: level ? (0, $4b8473139e48e77e$export$b352e11f7a2ac9c5)[level] || 'transparent' : 'transparent',
|
|
7732
7990
|
borderRight: $cd8bc494277e92a4$var$gridBorder
|
|
7733
7991
|
};
|
|
7734
7992
|
// enhanced-in: thin outline; specific-to (stronger): corner dot.
|
|
7735
|
-
if (enhanced && !specific) style.boxShadow = `inset 0 0 0 1px ${$
|
|
7993
|
+
if (enhanced && !specific) style.boxShadow = `inset 0 0 0 1px ${0, $4b8473139e48e77e$export$39a35029fe99c21}`;
|
|
7736
7994
|
return /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("div", {
|
|
7737
7995
|
title: title,
|
|
7738
7996
|
style: style,
|
|
@@ -7744,7 +8002,7 @@ const $cd8bc494277e92a4$var$OrganCell = ({ organ: organ, gene: gene })=>{
|
|
|
7744
8002
|
width: 4,
|
|
7745
8003
|
height: 4,
|
|
7746
8004
|
borderRadius: '50%',
|
|
7747
|
-
background: $
|
|
8005
|
+
background: (0, $4b8473139e48e77e$export$39a35029fe99c21)
|
|
7748
8006
|
}
|
|
7749
8007
|
})
|
|
7750
8008
|
});
|
|
@@ -7763,8 +8021,8 @@ const $cd8bc494277e92a4$var$StressCell = ({ gene: gene, width: width })=>{
|
|
|
7763
8021
|
padding: '0 3px',
|
|
7764
8022
|
borderRadius: 2,
|
|
7765
8023
|
whiteSpace: 'nowrap',
|
|
7766
|
-
background: $
|
|
7767
|
-
color: $
|
|
8024
|
+
background: (0, $4b8473139e48e77e$export$c6dbe9be8c8b382e)[dir].bg,
|
|
8025
|
+
color: (0, $4b8473139e48e77e$export$c6dbe9be8c8b382e)[dir].fg
|
|
7768
8026
|
},
|
|
7769
8027
|
children: (dir === 'up' ? "\u2191" : "\u2193") + c
|
|
7770
8028
|
}, key);
|
|
@@ -7807,7 +8065,7 @@ const $cd8bc494277e92a4$var$ExprBody = ({ visibleRows: visibleRows, rowRange: ro
|
|
|
7807
8065
|
children: rows.map((r)=>{
|
|
7808
8066
|
const gene = byNode[r.nodeId];
|
|
7809
8067
|
const background = $cd8bc494277e92a4$var$rowHighlight(selectedNodeId === r.nodeId, hoveredNodeId === r.nodeId, !!(hoveredSubtreeIds && hoveredSubtreeIds.has(r.nodeId)));
|
|
7810
|
-
const tpmFrac = gene ? $
|
|
8068
|
+
const tpmFrac = gene ? (0, $4b8473139e48e77e$export$fc40d061e6c16645)(gene.maxTpm, tpmRange) : null;
|
|
7811
8069
|
return /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)("div", {
|
|
7812
8070
|
onMouseEnter: ()=>onHoverNode(r.nodeId),
|
|
7813
8071
|
onMouseLeave: ()=>onHoverNode(null),
|
|
@@ -7845,7 +8103,7 @@ const $cd8bc494277e92a4$var$ExprBody = ({ visibleRows: visibleRows, rowRange: ro
|
|
|
7845
8103
|
color: 'var(--tbrowse-text)',
|
|
7846
8104
|
background: tpmFrac === null ? 'transparent' : `rgba(33, 102, 172, ${(0.1 + 0.65 * tpmFrac).toFixed(3)})`
|
|
7847
8105
|
},
|
|
7848
|
-
children: gene ? $
|
|
8106
|
+
children: gene ? (0, $4b8473139e48e77e$export$8eaa32ef86afdd9c)(gene.maxTpm) : ''
|
|
7849
8107
|
}),
|
|
7850
8108
|
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)($cd8bc494277e92a4$var$StressCell, {
|
|
7851
8109
|
gene: gene,
|
|
@@ -13515,19 +13773,18 @@ const $08e62a9eec4f328f$var$GroupNode = ({ group: group, depth: depth, catalog:
|
|
|
13515
13773
|
]
|
|
13516
13774
|
});
|
|
13517
13775
|
};
|
|
13518
|
-
const $08e62a9eec4f328f$
|
|
13519
|
-
const { fieldCatalog: catalog, exporterSelectedFields: exporterSelectedFields, doToggleExporterField: doToggleExporterField, doBulkSetExporterFields: doBulkSetExporterFields, query: query = '' } = props;
|
|
13776
|
+
const $08e62a9eec4f328f$export$8af8343a8541cf1f = ({ catalog: catalog, selectedFields: selectedFields, onToggle: onToggle, onBulkSet: onBulkSet, query: query = '' })=>{
|
|
13520
13777
|
const [openMap, setOpenMap] = (0, $gXNCa$react.useState)({});
|
|
13521
|
-
const selectedSet = (0, $gXNCa$react.useMemo)(()=>new Set(
|
|
13522
|
-
|
|
13778
|
+
const selectedSet = (0, $gXNCa$react.useMemo)(()=>new Set(selectedFields), [
|
|
13779
|
+
selectedFields
|
|
13523
13780
|
]);
|
|
13524
13781
|
const handleToggle = (name)=>{
|
|
13525
13782
|
const f = catalog && catalog.fields && catalog.fields[name];
|
|
13526
13783
|
const linked = f && f.linkedFields;
|
|
13527
13784
|
if (linked) {
|
|
13528
13785
|
const allSelected = linked.every((n)=>selectedSet.has(n));
|
|
13529
|
-
|
|
13530
|
-
} else
|
|
13786
|
+
onBulkSet(linked, !allSelected);
|
|
13787
|
+
} else onToggle(name);
|
|
13531
13788
|
};
|
|
13532
13789
|
const q = query.trim().toLowerCase();
|
|
13533
13790
|
const filtered = (0, $gXNCa$react.useMemo)(()=>{
|
|
@@ -13557,7 +13814,7 @@ const $08e62a9eec4f328f$var$FieldTreeCmp = (props)=>{
|
|
|
13557
13814
|
catalog: catalog,
|
|
13558
13815
|
selectedSet: selectedSet,
|
|
13559
13816
|
onToggle: handleToggle,
|
|
13560
|
-
onBulkSet:
|
|
13817
|
+
onBulkSet: onBulkSet,
|
|
13561
13818
|
openMap: openMap,
|
|
13562
13819
|
setOpen: setOpen,
|
|
13563
13820
|
forceOpen: forceOpen
|
|
@@ -13574,6 +13831,14 @@ const $08e62a9eec4f328f$var$FieldTreeCmp = (props)=>{
|
|
|
13574
13831
|
})
|
|
13575
13832
|
});
|
|
13576
13833
|
};
|
|
13834
|
+
// Exporter-bound wrapper — preserves the existing default-export usage.
|
|
13835
|
+
const $08e62a9eec4f328f$var$FieldTreeCmp = (props)=>/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)($08e62a9eec4f328f$export$8af8343a8541cf1f, {
|
|
13836
|
+
catalog: props.fieldCatalog,
|
|
13837
|
+
selectedFields: props.exporterSelectedFields,
|
|
13838
|
+
onToggle: props.doToggleExporterField,
|
|
13839
|
+
onBulkSet: props.doBulkSetExporterFields,
|
|
13840
|
+
query: props.query
|
|
13841
|
+
});
|
|
13577
13842
|
var $08e62a9eec4f328f$export$2e2bcd8739ae039 = (0, $gXNCa$reduxbundlerreact.connect)('selectFieldCatalog', 'selectExporterSelectedFields', 'doToggleExporterField', 'doBulkSetExporterFields', $08e62a9eec4f328f$var$FieldTreeCmp);
|
|
13578
13843
|
|
|
13579
13844
|
|
|
@@ -16638,6 +16903,335 @@ var $1fd2507769d5bd00$export$2e2bcd8739ae039 = (0, $gXNCa$reduxbundlerreact.conn
|
|
|
16638
16903
|
|
|
16639
16904
|
|
|
16640
16905
|
|
|
16906
|
+
|
|
16907
|
+
|
|
16908
|
+
|
|
16909
|
+
|
|
16910
|
+
|
|
16911
|
+
|
|
16912
|
+
const { MAX_GENES: $8f8e530286a37ce9$var$MAX_GENES } = (0, $12feb7ca48271e17$export$d00a9fd01497b827);
|
|
16913
|
+
const $8f8e530286a37ce9$var$DEFAULT_COL_DEF = {
|
|
16914
|
+
resizable: true,
|
|
16915
|
+
sortable: true,
|
|
16916
|
+
filter: false,
|
|
16917
|
+
suppressHeaderMenuButton: true
|
|
16918
|
+
};
|
|
16919
|
+
// ↑activated / ↓repressed condition chips, matching the tbrowse Expression zone.
|
|
16920
|
+
const $8f8e530286a37ce9$var$StressCell = ({ value: value })=>{
|
|
16921
|
+
const { up: up = [], down: down = [] } = value || {};
|
|
16922
|
+
if (!up.length && !down.length) return null;
|
|
16923
|
+
const chip = (c, dir, key)=>/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("span", {
|
|
16924
|
+
style: {
|
|
16925
|
+
fontSize: 10,
|
|
16926
|
+
lineHeight: '16px',
|
|
16927
|
+
padding: '0 4px',
|
|
16928
|
+
borderRadius: 2,
|
|
16929
|
+
marginRight: 3,
|
|
16930
|
+
whiteSpace: 'nowrap',
|
|
16931
|
+
background: (0, $4b8473139e48e77e$export$c6dbe9be8c8b382e)[dir].bg,
|
|
16932
|
+
color: (0, $4b8473139e48e77e$export$c6dbe9be8c8b382e)[dir].fg
|
|
16933
|
+
},
|
|
16934
|
+
children: (dir === 'up' ? "\u2191" : "\u2193") + c
|
|
16935
|
+
}, key);
|
|
16936
|
+
return /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)("span", {
|
|
16937
|
+
children: [
|
|
16938
|
+
up.map((c, i)=>chip(c, 'up', `u${i}`)),
|
|
16939
|
+
down.map((c, i)=>chip(c, 'down', `d${i}`))
|
|
16940
|
+
]
|
|
16941
|
+
});
|
|
16942
|
+
};
|
|
16943
|
+
const $8f8e530286a37ce9$var$AttrTableViewCmp = (props)=>{
|
|
16944
|
+
const { attrTable: attrTable, fieldCatalog: fieldCatalog, fieldCatalogByName: fieldCatalogByName, doToggleAttrTableField: doToggleAttrTableField, doBulkSetAttrTableFields: doBulkSetAttrTableFields } = props;
|
|
16945
|
+
const [showColumns, setShowColumns] = (0, $gXNCa$react.useState)(false);
|
|
16946
|
+
const [fieldQuery, setFieldQuery] = (0, $gXNCa$react.useState)('');
|
|
16947
|
+
const { docs: docs, total: total, truncated: truncated, status: status, error: error, selectedFields: selectedFields } = attrTable;
|
|
16948
|
+
// Row objects + the organ union and TPM range needed to build the heatmap.
|
|
16949
|
+
const { rows: rows, organs: organs, tpmRange: tpmRange } = (0, $gXNCa$react.useMemo)(()=>{
|
|
16950
|
+
const organSet = new Set();
|
|
16951
|
+
let tpmMin = Infinity;
|
|
16952
|
+
let tpmMax = -Infinity;
|
|
16953
|
+
const out = (docs || []).map((d)=>{
|
|
16954
|
+
const a = (0, $4b8473139e48e77e$export$69fb5d19b5db1cfa)(d);
|
|
16955
|
+
Object.keys(a.organLevels).forEach((o)=>organSet.add(o));
|
|
16956
|
+
if (a.maxTpm !== null) {
|
|
16957
|
+
if (a.maxTpm < tpmMin) tpmMin = a.maxTpm;
|
|
16958
|
+
if (a.maxTpm > tpmMax) tpmMax = a.maxTpm;
|
|
16959
|
+
}
|
|
16960
|
+
const row = {
|
|
16961
|
+
id: d.id,
|
|
16962
|
+
name: d.name,
|
|
16963
|
+
system_name: d.system_name,
|
|
16964
|
+
biotype: d.biotype,
|
|
16965
|
+
location: d.region ? `${d.region}:${d.start}-${d.end}` : '',
|
|
16966
|
+
_cls: (0, $4b8473139e48e77e$export$1f04174626f2ac64)(a.cls) || '',
|
|
16967
|
+
_tau: a.tau,
|
|
16968
|
+
_maxTpm: a.maxTpm,
|
|
16969
|
+
_stress: {
|
|
16970
|
+
up: a.activatedBy,
|
|
16971
|
+
down: a.repressedBy
|
|
16972
|
+
},
|
|
16973
|
+
_organ: a.organLevels,
|
|
16974
|
+
_specific: a.specificTo,
|
|
16975
|
+
_enhanced: a.enhancedIn
|
|
16976
|
+
};
|
|
16977
|
+
(selectedFields || []).forEach((f)=>{
|
|
16978
|
+
row[f] = d[f];
|
|
16979
|
+
});
|
|
16980
|
+
return row;
|
|
16981
|
+
});
|
|
16982
|
+
return {
|
|
16983
|
+
rows: out,
|
|
16984
|
+
organs: (0, $4b8473139e48e77e$export$65382efdcdd96f8c)(organSet),
|
|
16985
|
+
tpmRange: {
|
|
16986
|
+
min: tpmMin === Infinity ? 0 : tpmMin,
|
|
16987
|
+
max: tpmMax === -Infinity ? 0 : tpmMax
|
|
16988
|
+
}
|
|
16989
|
+
};
|
|
16990
|
+
}, [
|
|
16991
|
+
docs,
|
|
16992
|
+
selectedFields
|
|
16993
|
+
]);
|
|
16994
|
+
const columnDefs = (0, $gXNCa$react.useMemo)(()=>{
|
|
16995
|
+
const cols = [
|
|
16996
|
+
{
|
|
16997
|
+
colId: 'id',
|
|
16998
|
+
field: 'id',
|
|
16999
|
+
headerName: 'Gene ID',
|
|
17000
|
+
pinned: 'left',
|
|
17001
|
+
width: 190
|
|
17002
|
+
},
|
|
17003
|
+
{
|
|
17004
|
+
colId: 'name',
|
|
17005
|
+
field: 'name',
|
|
17006
|
+
headerName: 'Name',
|
|
17007
|
+
pinned: 'left',
|
|
17008
|
+
width: 130
|
|
17009
|
+
},
|
|
17010
|
+
{
|
|
17011
|
+
colId: 'system_name',
|
|
17012
|
+
field: 'system_name',
|
|
17013
|
+
headerName: 'Species',
|
|
17014
|
+
width: 150
|
|
17015
|
+
},
|
|
17016
|
+
{
|
|
17017
|
+
colId: 'biotype',
|
|
17018
|
+
field: 'biotype',
|
|
17019
|
+
headerName: 'Biotype',
|
|
17020
|
+
width: 120
|
|
17021
|
+
},
|
|
17022
|
+
{
|
|
17023
|
+
colId: 'location',
|
|
17024
|
+
field: 'location',
|
|
17025
|
+
headerName: 'Location',
|
|
17026
|
+
width: 150
|
|
17027
|
+
},
|
|
17028
|
+
{
|
|
17029
|
+
colId: '_cls',
|
|
17030
|
+
field: '_cls',
|
|
17031
|
+
headerName: 'Expression class',
|
|
17032
|
+
width: 150
|
|
17033
|
+
},
|
|
17034
|
+
{
|
|
17035
|
+
colId: '_tau',
|
|
17036
|
+
field: '_tau',
|
|
17037
|
+
headerName: 'Tau',
|
|
17038
|
+
width: 80,
|
|
17039
|
+
type: 'numericColumn',
|
|
17040
|
+
valueFormatter: (p)=>Number.isFinite(p.value) ? p.value.toFixed(3) : ''
|
|
17041
|
+
},
|
|
17042
|
+
{
|
|
17043
|
+
colId: '_maxTpm',
|
|
17044
|
+
field: '_maxTpm',
|
|
17045
|
+
headerName: 'Max TPM',
|
|
17046
|
+
width: 100,
|
|
17047
|
+
type: 'numericColumn',
|
|
17048
|
+
valueFormatter: (p)=>(0, $4b8473139e48e77e$export$8eaa32ef86afdd9c)(p.value),
|
|
17049
|
+
cellStyle: (p)=>({
|
|
17050
|
+
background: (0, $4b8473139e48e77e$export$4b443417c5259620)(p.value, tpmRange)
|
|
17051
|
+
})
|
|
17052
|
+
},
|
|
17053
|
+
{
|
|
17054
|
+
colId: '_stress',
|
|
17055
|
+
field: '_stress',
|
|
17056
|
+
headerName: 'Stress',
|
|
17057
|
+
width: 220,
|
|
17058
|
+
sortable: false,
|
|
17059
|
+
// The renderer draws the chips; the formatter just keeps ag-grid from
|
|
17060
|
+
// warning about an object-valued cell with no formatter.
|
|
17061
|
+
valueFormatter: ()=>'',
|
|
17062
|
+
cellRenderer: $8f8e530286a37ce9$var$StressCell
|
|
17063
|
+
}
|
|
17064
|
+
];
|
|
17065
|
+
// Per-organ heatmap: one narrow, colour-only column per organ.
|
|
17066
|
+
organs.forEach((o)=>{
|
|
17067
|
+
cols.push({
|
|
17068
|
+
// No ':' in colId — ag-grid uses colId in internal CSS selectors, where a
|
|
17069
|
+
// colon is a metacharacter and silently breaks rendering of the column.
|
|
17070
|
+
colId: `organ_${o}`,
|
|
17071
|
+
headerName: (0, $4b8473139e48e77e$export$f8541c2790c3baeb)(o),
|
|
17072
|
+
headerTooltip: (0, $4b8473139e48e77e$export$50c1f966fd3af83e)(o),
|
|
17073
|
+
width: 46,
|
|
17074
|
+
valueGetter: (p)=>p.data && p.data._organ[o] || '',
|
|
17075
|
+
valueFormatter: ()=>'',
|
|
17076
|
+
tooltipValueGetter: (p)=>{
|
|
17077
|
+
const lvl = p.data && p.data._organ[o];
|
|
17078
|
+
if (!lvl) return `${(0, $4b8473139e48e77e$export$50c1f966fd3af83e)(o)}: not assayed`;
|
|
17079
|
+
const sp = p.data._specific.has(o) ? " \xb7 specific" : p.data._enhanced.has(o) ? " \xb7 enhanced" : '';
|
|
17080
|
+
return `${(0, $4b8473139e48e77e$export$50c1f966fd3af83e)(o)}: ${(0, $4b8473139e48e77e$export$433053e2c141d410)[lvl] || lvl}${sp}`;
|
|
17081
|
+
},
|
|
17082
|
+
comparator: (a, b)=>((0, $4b8473139e48e77e$export$a61929d6d484c6d4)[a] ?? -1) - ((0, $4b8473139e48e77e$export$a61929d6d484c6d4)[b] ?? -1),
|
|
17083
|
+
cellStyle: (p)=>{
|
|
17084
|
+
const lvl = p.value;
|
|
17085
|
+
const style = {
|
|
17086
|
+
background: lvl ? (0, $4b8473139e48e77e$export$b352e11f7a2ac9c5)[lvl] || 'transparent' : 'transparent'
|
|
17087
|
+
};
|
|
17088
|
+
if (p.data && p.data._specific.has(o)) style.boxShadow = `inset 0 0 0 2px ${0, $4b8473139e48e77e$export$39a35029fe99c21}`;
|
|
17089
|
+
else if (p.data && p.data._enhanced.has(o)) style.boxShadow = `inset 0 0 0 1px ${0, $4b8473139e48e77e$export$39a35029fe99c21}`;
|
|
17090
|
+
return style;
|
|
17091
|
+
}
|
|
17092
|
+
});
|
|
17093
|
+
});
|
|
17094
|
+
// Extra attribute columns chosen from the field catalog.
|
|
17095
|
+
(selectedFields || []).forEach((f)=>{
|
|
17096
|
+
const meta = fieldCatalogByName && fieldCatalogByName[f] || {};
|
|
17097
|
+
cols.push({
|
|
17098
|
+
colId: f,
|
|
17099
|
+
field: f,
|
|
17100
|
+
headerName: meta.label || f,
|
|
17101
|
+
headerTooltip: f,
|
|
17102
|
+
width: 170,
|
|
17103
|
+
valueFormatter: (p)=>Array.isArray(p.value) ? p.value.join(', ') : p.value ?? ''
|
|
17104
|
+
});
|
|
17105
|
+
});
|
|
17106
|
+
return cols;
|
|
17107
|
+
}, [
|
|
17108
|
+
organs,
|
|
17109
|
+
selectedFields,
|
|
17110
|
+
fieldCatalogByName,
|
|
17111
|
+
tpmRange
|
|
17112
|
+
]);
|
|
17113
|
+
const shown = rows.length;
|
|
17114
|
+
const loading = status === 'loading';
|
|
17115
|
+
return /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)("div", {
|
|
17116
|
+
className: "attrtable-view",
|
|
17117
|
+
children: [
|
|
17118
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)("div", {
|
|
17119
|
+
className: "attrtable-toolbar",
|
|
17120
|
+
children: [
|
|
17121
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)("div", {
|
|
17122
|
+
className: "attrtable-status",
|
|
17123
|
+
children: [
|
|
17124
|
+
loading && /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)((0, $gXNCa$reactbootstrap.Spinner), {
|
|
17125
|
+
animation: "border",
|
|
17126
|
+
size: "sm",
|
|
17127
|
+
className: "mr-2"
|
|
17128
|
+
}),
|
|
17129
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("strong", {
|
|
17130
|
+
children: shown.toLocaleString()
|
|
17131
|
+
}),
|
|
17132
|
+
" gene",
|
|
17133
|
+
shown === 1 ? '' : 's',
|
|
17134
|
+
total > 0 && /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)((0, $gXNCa$reactjsxruntime.Fragment), {
|
|
17135
|
+
children: [
|
|
17136
|
+
" of ",
|
|
17137
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("strong", {
|
|
17138
|
+
children: total.toLocaleString()
|
|
17139
|
+
})
|
|
17140
|
+
]
|
|
17141
|
+
}),
|
|
17142
|
+
loading && " \u2014 loading\u2026"
|
|
17143
|
+
]
|
|
17144
|
+
}),
|
|
17145
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("div", {
|
|
17146
|
+
className: "attrtable-legend",
|
|
17147
|
+
title: "expression level",
|
|
17148
|
+
children: (0, $4b8473139e48e77e$export$4bb936dc8856d37a).map((lv)=>/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("span", {
|
|
17149
|
+
title: (0, $4b8473139e48e77e$export$433053e2c141d410)[lv],
|
|
17150
|
+
style: {
|
|
17151
|
+
background: (0, $4b8473139e48e77e$export$b352e11f7a2ac9c5)[lv]
|
|
17152
|
+
}
|
|
17153
|
+
}, lv))
|
|
17154
|
+
}),
|
|
17155
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)((0, $gXNCa$reactbootstrap.Button), {
|
|
17156
|
+
size: "sm",
|
|
17157
|
+
variant: showColumns ? 'primary' : 'outline-secondary',
|
|
17158
|
+
onClick: ()=>setShowColumns((v)=>!v),
|
|
17159
|
+
children: [
|
|
17160
|
+
"Columns",
|
|
17161
|
+
selectedFields.length ? ` (${selectedFields.length})` : ''
|
|
17162
|
+
]
|
|
17163
|
+
})
|
|
17164
|
+
]
|
|
17165
|
+
}),
|
|
17166
|
+
truncated && /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)((0, $gXNCa$reactbootstrap.Alert), {
|
|
17167
|
+
variant: "info",
|
|
17168
|
+
className: "attrtable-notice",
|
|
17169
|
+
children: [
|
|
17170
|
+
"Showing the first ",
|
|
17171
|
+
$8f8e530286a37ce9$var$MAX_GENES.toLocaleString(),
|
|
17172
|
+
" of ",
|
|
17173
|
+
total.toLocaleString(),
|
|
17174
|
+
" genes. Narrow your search to see the rest."
|
|
17175
|
+
]
|
|
17176
|
+
}),
|
|
17177
|
+
error && /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)((0, $gXNCa$reactbootstrap.Alert), {
|
|
17178
|
+
variant: "danger",
|
|
17179
|
+
className: "attrtable-notice",
|
|
17180
|
+
children: [
|
|
17181
|
+
"Failed to load genes: ",
|
|
17182
|
+
error
|
|
17183
|
+
]
|
|
17184
|
+
}),
|
|
17185
|
+
showColumns && /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsxs)("div", {
|
|
17186
|
+
className: "attrtable-columns-panel",
|
|
17187
|
+
children: [
|
|
17188
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("input", {
|
|
17189
|
+
type: "search",
|
|
17190
|
+
className: "form-control form-control-sm attrtable-field-search",
|
|
17191
|
+
placeholder: "Search fields\u2026",
|
|
17192
|
+
value: fieldQuery,
|
|
17193
|
+
onChange: (e)=>setFieldQuery(e.target.value)
|
|
17194
|
+
}),
|
|
17195
|
+
/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)((0, $08e62a9eec4f328f$export$8af8343a8541cf1f), {
|
|
17196
|
+
catalog: fieldCatalog,
|
|
17197
|
+
selectedFields: selectedFields,
|
|
17198
|
+
onToggle: doToggleAttrTableField,
|
|
17199
|
+
onBulkSet: doBulkSetAttrTableFields,
|
|
17200
|
+
query: fieldQuery
|
|
17201
|
+
})
|
|
17202
|
+
]
|
|
17203
|
+
}),
|
|
17204
|
+
rows.length === 0 && !loading ? /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("div", {
|
|
17205
|
+
className: "attrtable-empty",
|
|
17206
|
+
children: /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("em", {
|
|
17207
|
+
children: "No genes to show."
|
|
17208
|
+
})
|
|
17209
|
+
}) : /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("div", {
|
|
17210
|
+
className: "ag-theme-quartz attrtable-aggrid",
|
|
17211
|
+
children: /*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)((0, $gXNCa$aggridreact.AgGridReact), {
|
|
17212
|
+
rowData: rows,
|
|
17213
|
+
columnDefs: columnDefs,
|
|
17214
|
+
defaultColDef: $8f8e530286a37ce9$var$DEFAULT_COL_DEF,
|
|
17215
|
+
animateRows: false,
|
|
17216
|
+
suppressFieldDotNotation: true,
|
|
17217
|
+
suppressDragLeaveHidesColumns: true,
|
|
17218
|
+
tooltipShowDelay: 300,
|
|
17219
|
+
rowHeight: 22,
|
|
17220
|
+
headerHeight: 26
|
|
17221
|
+
})
|
|
17222
|
+
})
|
|
17223
|
+
]
|
|
17224
|
+
});
|
|
17225
|
+
};
|
|
17226
|
+
var $8f8e530286a37ce9$export$2e2bcd8739ae039 = (0, $gXNCa$reduxbundlerreact.connect)('selectAttrTable', 'selectFieldCatalog', 'selectFieldCatalogByName', 'doToggleAttrTableField', 'doBulkSetAttrTableFields', $8f8e530286a37ce9$var$AttrTableViewCmp);
|
|
17227
|
+
|
|
17228
|
+
|
|
17229
|
+
|
|
17230
|
+
|
|
17231
|
+
|
|
17232
|
+
|
|
17233
|
+
|
|
17234
|
+
|
|
16641
17235
|
function $597fe213417ee6ca$var$speciesTaxonId(tid) {
|
|
16642
17236
|
const n = +tid;
|
|
16643
17237
|
return n > 1000000 ? Math.floor(n / 1000) : n;
|
|
@@ -19196,6 +19790,7 @@ const $693dd8c7a5607c3a$var$inventory = {
|
|
|
19196
19790
|
attribs: (0, $67bf5a43401bffdc$export$2e2bcd8739ae039),
|
|
19197
19791
|
expression: (0, $261baeb81c4d4d8a$export$2e2bcd8739ae039),
|
|
19198
19792
|
exprViz: (0, $1fd2507769d5bd00$export$2e2bcd8739ae039),
|
|
19793
|
+
attrTable: (0, $8f8e530286a37ce9$export$2e2bcd8739ae039),
|
|
19199
19794
|
ontologyEnrichment: (0, $597fe213417ee6ca$export$2e2bcd8739ae039),
|
|
19200
19795
|
userLists: (0, $0f50f369018a42ef$export$2e2bcd8739ae039),
|
|
19201
19796
|
export: (0, $37b3bb0145d266b0$export$2e2bcd8739ae039)
|