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.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},"description":{"group":"core","label":"Description","order":4},"summary":{"group":"core","label":"Summary","order":5},"synonyms":{"group":"core","label":"Synonyms","multiValued":true,"order":3},"biotype":{"group":"core","label":"Biotype","order":6},"taxon_id":{"group":"core","label":"Taxon ID","order":8},"system_name":{"group":"core","label":"System name","order":7},"db_type":{"group":"core","label":"DB type","order":9},"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},"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"]}');
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
- // Canonical anatomical ordering (vegetative → reproductive → seed). Organs not
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 organLevels = {};
7530
- (d.expr_organ_level__attr_ss || []).forEach((t)=>{
7531
- const i = t.lastIndexOf(':');
7532
- if (i < 0) return;
7533
- const organ = t.slice(0, i);
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 && $cd8bc494277e92a4$var$fmtClass(gene.cls);
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: $cd8bc494277e92a4$var$LEVEL_ORDER.map((lv)=>/*#__PURE__*/ (0, $gXNCa$reactjsxruntime.jsx)("span", {
7636
- title: $cd8bc494277e92a4$var$LEVEL_LABEL[lv],
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: $cd8bc494277e92a4$var$LEVEL_COLOR[lv],
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: o.replace(/_/g, ' '),
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: $cd8bc494277e92a4$var$abbr(o)
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 ? `${organ.replace(/_/g, ' ')}: ${$cd8bc494277e92a4$var$LEVEL_LABEL[level] || level}${specific ? " \xb7 specific" : enhanced ? " \xb7 enhanced" : ''}` : `${organ.replace(/_/g, ' ')}: not assayed`;
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 ? $cd8bc494277e92a4$var$LEVEL_COLOR[level] || 'transparent' : 'transparent',
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 ${$cd8bc494277e92a4$var$MARKER}`;
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: $cd8bc494277e92a4$var$MARKER
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: $cd8bc494277e92a4$var$STRESS[dir].bg,
7767
- color: $cd8bc494277e92a4$var$STRESS[dir].fg
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 ? $cd8bc494277e92a4$var$tpmFraction(gene.maxTpm, tpmRange) : null;
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 ? $cd8bc494277e92a4$var$fmtTpm(gene.maxTpm) : ''
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$var$FieldTreeCmp = (props)=>{
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(exporterSelectedFields), [
13522
- exporterSelectedFields
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
- doBulkSetExporterFields(linked, !allSelected);
13530
- } else doToggleExporterField(name);
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: doBulkSetExporterFields,
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)