gramene-search 2.1.2 → 2.1.3
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/.parcel-cache/13f2d5707e7af45c-RequestGraph +0 -0
- package/.parcel-cache/5ae0570a78c0dba3-AssetGraph +0 -0
- package/.parcel-cache/9ac092379278e465-BundleGraph +0 -0
- package/.parcel-cache/data.mdb +0 -0
- package/.parcel-cache/lock.mdb +0 -0
- package/.parcel-cache/snapshot-13f2d5707e7af45c.txt +2 -2
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/components/results/details/Homology.js +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/components/results/Study.js","src/index.js","src/bundles/index.js","src/bundles/api.js","src/bundles/filters.js","src/bundles/views.js","src/bundles/docs.js","src/bundles/genomes.js","src/bundles/swaggerFields.js","src/fieldCatalog.overlay.json","src/vepStudyInfo.js","src/bundles/exporter.js","src/components/exporter/downloadRunner.js","src/components/exporter/formatters.js","src/components/exporter/expressionResolver.js","src/components/exporter/ancestorsResolver.js","src/bundles/ontologies.js","src/bundles/exprViz.js","src/bundles/ontologyEnrichment.js","src/components/resultList.js","src/components/resultSummary.js","src/components/suggestions.js","src/components/geneSearchUI.js","src/components/results/GeneList.js","src/components/results/details/Expression.js","src/components/results/details/Homology.js","src/components/results/details/generic.js","src/components/utils.js","src/components/results/details/Location.js","src/components/results/details/location/browser.js","src/components/results/details/location/dallianceBrowser.js","src/components/results/details/Pathways.js","src/components/results/details/VEP.js","src/components/results/details/Xrefs.js","src/components/results/details/Publications.js","src/components/results/details/Sequences.js","src/components/results/TaxDist.js","src/components/results/selection.js","src/components/results/HelpDemo.js","src/components/results/GeneAttribs.js","src/components/results/StatsByGroup.js","src/components/TaxonomyModal.js","src/components/results/Expression.js","src/components/results/UserGeneLists.js","src/components/exporter/ExporterView.js","src/components/exporter/FieldTree.js","src/components/exporter/Preview.js","src/components/exporter/CutoffsModal.js","src/components/exporter/ExportFooter.js","src/components/exprViz/ExprVizView.js","src/components/exprViz/FieldsModal.js","src/components/exprViz/ExprTable.js","src/components/exprViz/ParallelCoordsPlot.js","src/components/exprViz/HeatmapPlot.js","src/components/results/OntologyEnrichment.js","src/components/Auth.js"],"sourcesContent":["import React, { useState, useMemo } from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport { AgGridReact } from \"ag-grid-react\";\nimport \"ag-grid-community/styles/ag-grid.css\";\nimport \"ag-grid-community/styles/ag-theme-quartz.css\";\n\nconst metaRenderer = params => {\n if (params.value.ontology) {\n return <a href={`http://purl.obolibrary.org/obo/${params.value.id.replace(\":\",\"_\")}`} target='_blank'>{params.value.label}</a>\n }\n return params.value.label\n}\nconst sampleRenderer = params => {\n const sampleMeta = params.value;\n return (\n <label>\n <input\n type=\"checkbox\"\n checked={params.desiredSamples.hasOwnProperty(sampleMeta._id)}\n onChange={() => params.doToggleExpressionSample(sampleMeta._id)}\n />\n {sampleMeta.experiment}-{sampleMeta.group}\n </label>\n );\n // return JSON.stringify(sampleMeta,null,2);\n}\nconst connectedSampleRenderer = connect(\n 'selectDesiredSamples', // current set of samples to fetch expression data for\n 'doToggleExpressionSample',\n sampleRenderer\n);\nconst Study = props => {\n let samples = props.expressionSamples[props.id];\n let sampleMetadata = [];\n let metadataFields = [{ field: \"sampleId\", cellRenderer: connectedSampleRenderer }];\n let isFactor={};\n samples.forEach((sample, idx) => {\n if (idx === 0) {\n let factors = {\n headerName: 'Experimental Variables',\n children: []\n }\n sample.factor.forEach(factor => {\n factors.children.push({field: factor.type, cellRenderer: metaRenderer})\n isFactor[factor.type] = true;\n });\n metadataFields.push(factors);\n let characteristics = {\n headerName: 'Sample Characteristics',\n children: []\n }\n sample.characteristic.forEach(ch => {\n if (!isFactor[ch.type]) {\n characteristics.children.push({field: ch.type, cellRenderer: metaRenderer})\n }\n });\n metadataFields.push(characteristics)\n }\n let s_info = {sampleId: sample}\n sample.factor.forEach(factor => {\n s_info[factor.type] = {label: factor.label};\n if (factor.ontology) {\n s_info[factor.type]['ontology'] = factor.ontology\n s_info[factor.type]['id'] = factor.id;\n }\n })\n sample.characteristic.forEach(ch => {\n s_info[ch.type] = {label: ch.label};\n if (ch.ontology) {\n s_info[ch.type]['ontology'] = ch.ontology\n s_info[ch.type]['id'] = ch.id;\n }\n })\n sampleMetadata.push(s_info)\n })\n const [rowData, setRowData] = useState(sampleMetadata);\n const [colDefs, setColDefs] = useState(metadataFields);\n const defaultColDef = useMemo(() => {\n return {\n filter: true\n }\n }, []);\n return (\n <div>\n <div className=\"ag-theme-quartz\" style={{height: `${44 * (samples.length + 2)}px`}}>\n <AgGridReact rowData={rowData} columnDefs={colDefs} defaultColDef={defaultColDef}/>\n </div>\n <a href={`https://www.ebi.ac.uk/gxa/experiments/${props.id}`}>EBI Atlas Experiment: {props.id}</a>\n </div>\n );\n};\nexport default connect(\n 'selectExpressionSamples',\n Study);\n","import bundles from './bundles';\nimport resultList from './components/resultList';\nimport resultSummary from './components/resultSummary';\nimport suggestions from './components/suggestions';\nimport {Status, Filters, Results, Views, Auth} from './components/geneSearchUI';\n\nexport { bundles, resultList, resultSummary, suggestions, Status, Filters, Results, Views, Auth };\n","import apiBundles from './api'\nimport filterBundle from './filters'\nimport viewsBundle from './views'\nimport docsBundle from './docs'\nimport genomesBundle from './genomes'\nimport fieldCatalogBundle from './swaggerFields'\nimport exporterBundle from './exporter'\nimport ontologiesBundle from './ontologies'\nimport exprVizBundle from './exprViz'\nimport ontologyEnrichmentBundle from './ontologyEnrichment'\n\nexport default [...apiBundles, docsBundle, filterBundle, viewsBundle, genomesBundle, fieldCatalogBundle, exporterBundle, ontologiesBundle, exprVizBundle, ontologyEnrichmentBundle];\n","import { createAsyncResourceBundle, createSelector } from 'redux-bundler'\nimport _ from 'lodash'\nimport binsClient from \"gramene-bins-client\";\nimport treesClient from \"gramene-trees-client\";\nimport {build} from \"gramene-taxonomy-with-genomes\";\n\nconst facets = [\n \"{!facet.limit='300' facet.mincount='1' key='taxon_id'}taxon_id\",\n // \"{!facet.limit='100' facet.mincount='1' key='genetree'}gene_tree\",\n // \"{!facet.limit='100' facet.mincount='1' key='pathways'}pathways__ancestors\",\n // \"{!facet.limit='100' facet.mincount='1' key='domains'}domain_roots\",\n \"{!facet.limit='-1' facet.mincount='1' key='fixed_1000__bin'}fixed_1000__bin\",\n \"{!facet.limit='100' facet.mincount='0' key='AED' type='range' start=0 end=1.0 gap=0.01}MAKER__AED__attr_f\"\n];\nconst genomesOfInterest = '(taxon_id:2769) OR (taxon_id:3055) OR (taxon_id:3218) OR (taxon_id:3702) OR (taxon_id:3847) OR (taxon_id:4555) OR (taxon_id:4558) OR (taxon_id:4577) OR (taxon_id:13333) OR (taxon_id:15368) OR (taxon_id:29760) OR (taxon_id:39947) OR (taxon_id:55577) OR (taxon_id:88036) OR (taxon_id:214687)';\nconst sites = ['main','oryza','maize','sorghum','grapevine'];\nconst grameneSuggestions = createAsyncResourceBundle( {\n name: 'grameneSuggestions',\n actionBaseType: 'GRAMENE_SUGGESTIONS',\n persist: false,\n getPromise: ({store}) => {\n const t = store.selectSuggestionsQuery().replaceAll(':',' ').trim();\n const g = store.selectGrameneGenomes();\n const q = `/suggest?q={!boost b=relevance}name:${t}^5 ids:${t}^5 ids:${t}*^3 synonym:${t}^3 synonym:${t}*^2 text:${t}*^1`;\n // const promises = sites.map(site => fetch(`https://data.gramene.org/${site}${q}`));\n // return Promise.all(promises)\n return fetch(store.selectGrameneAPI() + q)\n .then(res => {\n return res.json()\n })\n .then(suggestions => {\n if (Object.keys(g.active).length > 0) {\n suggestions.grouped.category.groups.forEach(group => {\n group.doclist.docs.forEach(sugg => {\n sugg.num_genes = 0;\n sugg.taxon_id.forEach((id,idx) => {\n if (g.active[id] && !g.active[id].hidden) {\n sugg.num_genes += sugg.taxon_freq[idx]\n }\n })\n })\n })\n }\n return suggestions\n })\n }\n});\n\ngrameneSuggestions.reactGrameneSuggestions = createSelector(\n 'selectGrameneSuggestionsShouldUpdate',\n 'selectSuggestionsQuery',\n (shouldUpdate, queryString) => {\n if (shouldUpdate && queryString) {\n return { actionCreator: 'doFetchGrameneSuggestions' }\n }\n }\n);\n\ngrameneSuggestions.selectGrameneSuggestionsStatus = createSelector(\n 'selectGrameneSuggestionsShouldUpdate',\n 'selectGrameneSuggestionsIsLoading',\n 'selectGrameneSuggestionsRaw',\n 'selectSuggestionsQuery',\n (shouldUpdate, isLoading, suggestionsRaw, queryString) => {\n if (!queryString) return '';\n if (shouldUpdate) return 'update needed';\n if (isLoading) return 'loading';\n if (suggestionsRaw.data) return suggestionsRaw.data.grouped.category.matches + ' terms';\n console.error(suggestionsRaw)\n return 'error';\n }\n);\n\ngrameneSuggestions.selectGrameneSuggestionsReady = createSelector(\n 'selectGrameneSuggestionsStatus',\n (status) => {\n const regex = RegExp('terms$');\n return regex.test(status);\n }\n);\n\ngrameneSuggestions.doFocusFirstGrameneSuggestion = arg => ({dispatch, getState}) => {\n console.log('inside doFocusFirstGrameneSuggestion');\n};\n\nfunction compressLongTaxonName(node) {\n const fullName = node.name;\n const removedExtraineousWords = fullName.replace(/( Group$| subsp\\.| ssp\\.| var\\.| strain)/, '');\n let finalVersion;\n if (removedExtraineousWords.length > 20) {\n let words = removedExtraineousWords.split(' ');\n if (words.length === 2) {\n // abrreviate first word.\n finalVersion = removedExtraineousWords.replace(/^([A-Z])[a-z]+/, '$1.')\n }\n if (words.length > 2) {\n finalVersion = removedExtraineousWords.replace(/^([A-Z])[a-z]+\\s([a-z])[a-z]+/, '$1$2.')\n }\n }\n else {\n finalVersion = removedExtraineousWords;\n }\n node.short_name = finalVersion;\n}\n\nconst grameneTaxonomy = createAsyncResourceBundle({\n name: 'grameneTaxonomy',\n actionBaseType: 'GRAMENE_TAXONOMY',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/taxonomy?subset=gramene&rows=-1`)\n .then(res => res.json())\n .then(taxNodes => {\n let taxonomy = _.keyBy(taxNodes, '_id');\n taxNodes.forEach(t => {\n t._id = +t._id; // ensure taxonomy id is a number\n compressLongTaxonName(t);\n if (t.hasOwnProperty(\"is_a\")) {\n t.is_a.forEach(p_id => {\n const p = taxonomy[p_id];\n if (!p.hasOwnProperty('children')) p.children = [];\n p.children.push(t._id)\n })\n }\n });\n return taxonomy\n })\n }\n});\ngrameneTaxonomy.reactGrameneTaxonomy = createSelector(\n 'selectGrameneTaxonomyShouldUpdate',\n (shouldUpdate) => {\n if (shouldUpdate) {\n return { actionCreator: 'doFetchGrameneTaxonomy' }\n }\n }\n);\nconst grameneMaps = createAsyncResourceBundle({\n name: 'grameneMaps',\n actionBaseType: 'GRAMENE_MAPS',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/maps?rows=-1`)\n .then(res => res.json())\n .then(maps => {\n maps.forEach(m => {\n m.regionLength = {};\n m.regions.names.forEach((rname,idx) => {\n m.regionLength[rname] = m.regions.lengths[idx]\n })\n })\n return _.keyBy(maps, 'taxon_id');\n })\n }\n});\ngrameneMaps.reactGrameneMaps = createSelector(\n 'selectGrameneMapsShouldUpdate',\n (shouldUpdate) => {\n if (shouldUpdate) {\n return { actionCreator: 'doFetchGrameneMaps' }\n }\n }\n);\n\nconst expressionStudies = createAsyncResourceBundle( {\n name: 'expressionStudies',\n actionBaseType: 'EXPRESSION_STUDIES',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/experiments?rows=-1`)\n .then(res => res.json())\n .then(res => _.groupBy(res, 'taxon_id'))\n }\n});\n// Only fetch when a view that consumes expression studies is enabled.\nconst EXPRESSION_VIEWS = ['exprViz', 'expression', 'export'];\nexpressionStudies.reactExpressionStudies = createSelector(\n 'selectExpressionStudiesShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !EXPRESSION_VIEWS.some(id => viewsOn.has(id))) return;\n return { actionCreator: 'doFetchExpressionStudies' }\n }\n);\n\nconst expressionSamples = createAsyncResourceBundle( {\n name: 'expressionSamples',\n actionBaseType: 'EXPRESSION_SAMPLES',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/assays?rows=-1`)\n .then(res => res.json())\n .then(samples => _.groupBy(samples, 'experiment'))\n .then(studies => {\n Object.keys(studies).forEach(study => {\n studies[study].forEach(sample => {\n sample.order = +sample.group.replace('g','')\n });\n studies[study].sort((a,b) => a.order - b.order);\n })\n return studies\n })\n }\n});\nexpressionSamples.reactExpressionSamples = createSelector(\n 'selectExpressionSamplesShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !EXPRESSION_VIEWS.some(id => viewsOn.has(id))) return;\n return { actionCreator: 'doFetchExpressionSamples' }\n }\n);\n\nconst curatedGenes = createAsyncResourceBundle( {\n name: 'curatedGenes',\n actionBaseType: 'CURATED_GENES',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`https://devdata.gramene.org/curation/curations?rows=0&minFlagged=0&since=12-12-2029`)\n .then(res => res.json())\n .then(curation => _.keyBy(curation.genes, 'gene_id'))\n }\n});\n// Curated annotations are consumed by GeneList rows and Homology details,\n// both inside the gene-list view.\ncuratedGenes.reactCuratedGenes = createSelector(\n 'selectCuratedGenesShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !viewsOn.has('list')) return;\n return { actionCreator: 'doFetchCuratedGenes' }\n }\n);\n\nconst grameneGermplasm = createAsyncResourceBundle( {\n name: 'grameneGermplasm',\n actionBaseType: 'GRAMENE_GERMPLASM',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/germplasm?rows=-1`)\n .then(res => res.json())\n .then(res => {\n res.forEach(g => {\n if (!g.subpop) {\n g.subpop = \"?\"\n }\n });\n return _.groupBy(res, 'ens_id')\n })\n }\n});\n// Germplasm metadata is consumed by the VEP detail panel inside the gene list.\ngrameneGermplasm.reactGrameneGermplasm = createSelector(\n 'selectGrameneGermplasmShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !viewsOn.has('list')) return;\n return { actionCreator: 'doFetchGrameneGermplasm' }\n }\n);\n//\n// const grameneExpressionAssays = createAsyncResourceBundle( {\n// name: 'grameneExpressionAssays',\n// actionBaseType: 'GRAMENE_EXPRESSION_ASSAYS',\n// persist: true,\n// getPromise: ({store}) => {\n// return fetch(`${store.selectGrameneAPI()}/assays?rows=-1`)\n// .then(res => res.json())\n// .then(res => {\n// let expr={};\n// res.forEach(assay => {\n// if (!expr.hasOwnProperty(assay.taxon_id)) {\n// expr[assay.taxon_id] = {};\n// }\n// if (!expr[assay.taxon_id].hasOwnProperty(assay.experiment)) {\n// expr[assay.taxon_id][assay.experiment] = [];\n// }\n// assay.order = +assay.group.replace('g','');\n// expr[assay.taxon_id][assay.experiment].push(assay);\n// });\n// // sort each experiment\n// for (const tid in expr) {\n// for (const exp in expr[tid]) {\n// expr[tid][exp].sort((a,b) => a.order - b.order);\n// }\n// }\n// return expr;\n// })\n// }\n// });\n// grameneExpressionAssays.reactGrameneExpressionAssays = createSelector(\n// 'selectGrameneExpressionAssaysShouldUpdate',\n// (shouldUpdate) => {\n// if (shouldUpdate) {\n// return { actionCreator: 'doFetchGrameneExpressionAssays' }\n// }\n// }\n// );\n\nconst MAKERAttribs = [\n 'MAKER__AED__attr_f',\n 'MAKER__QI1__attr_i',\n 'MAKER__QI2__attr_f',\n 'MAKER__QI3__attr_f',\n 'MAKER__QI4__attr_f',\n 'MAKER__QI5__attr_f',\n 'MAKER__QI6__attr_f',\n 'MAKER__QI7__attr_i',\n 'MAKER__QI8__attr_i',\n 'MAKER__QI9__attr_i'\n];\nconst geneAttribs = {\n \"MAKER transcript metrics\" : [\n { name: \"AED\", description: \"Annotation Edit Distance\", dtype: \"f\", fieldName: \"MAKER__AED__attr_f\" },\n { name: \"QI1\", description: \"Length of the 5' UTR\", dtype: \"i\", fieldName: \"MAKER__QI1__attr_i\" },\n { name: \"QI2\", description: \"Fraction of splice sites confirmed by an EST alignment\", dtype: \"f\", fieldName: \"MAKER__QI2__attr_f\" },\n { name: \"QI3\", description: \"Fraction of exons that overlap an EST alignment\", dtype: \"f\", fieldName: \"MAKER__QI3__attr_f\" },\n { name: \"QI4\", description: \"Fraction of exons that overlap EST or Protein alignments\", dtype: \"f\", fieldName: \"MAKER__QI4__attr_f\" },\n // { name: \"QI5\", description: \"Fraction of splice sites confirmed by a SNAP prediction\", dtype: \"f\", fieldName: \"MAKER__QI5__attr_f\" },\n // { name: \"QI6\", description: \"Fraction of exons that overlap a SNAP prediction\", dtype: \"f\", fieldName: \"MAKER__QI6__attr_f\" },\n { name: \"QI7\", description: \"Number of exons in the mRNA\", dtype: \"i\", fieldName: \"MAKER__QI7__attr_i\" },\n { name: \"QI8\", description: \"Length of the 3' UTR\", dtype: \"i\", fieldName: \"MAKER__QI8__attr_i\" },\n { name: \"QI9\", description: \"Length of the protein sequence produced by the mRNA\", dtype: \"i\", fieldName: \"MAKER__QI9__attr_i\" }\n ]\n}\nconst statsFields = geneAttribs['MAKER transcript metrics'].map(\n // (f) => `stats.field={!min=true max=true count=true mean=true stddev=true percentiles='20,40,60,80,90,95,99'}${f}`\n (f) => `stats.field={!min=true max=true count=true mean=true stddev=true percentiles='10,20,30,40,50,60,70,80,90,99.99'}${f.fieldName}`\n);\n\nconst grameneGeneAttribs = createAsyncResourceBundle( {\n name: 'grameneGeneAttribs',\n actionBaseType: 'GRAMENE_GENE_ATTRIBS',\n persist: false,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/geneAttributes`).then(res => geneAttribs)\n }\n});\ngrameneGeneAttribs.reactGrameneGeneAttribs = createSelector(\n 'selectGrameneGeneAttribsShouldUpdate',\n 'selectGrameneFiltersStatus',\n 'selectGrameneViewsOn',\n (shouldUpdate, status, viewsOn) => {\n if (!shouldUpdate) return;\n if (status !== 'finished' && status !== 'ready') return;\n if (!viewsOn || !viewsOn.has('attribs')) return;\n return { actionCreator: 'doFetchGrameneGeneAttribs' }\n }\n);\n\nconst grameneSearch = createAsyncResourceBundle({\n name: 'grameneSearch',\n actionBaseType: 'GRAMENE_SEARCH',\n persist: false,\n getPromise: ({store}) => {\n const offset = store.selectGrameneSearchOffset();\n const rows = store.selectGrameneSearchRows();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys((g && g.active) || {}).filter(tid => m[tid] && !m[tid].hidden);\n let fq='';\n if (taxa.length) {\n console.log('search add a fq for ',taxa);\n fq = `&fq=taxon_id:(${taxa.join(' OR ')})`;\n }\n // return fetch(`${store.selectGrameneAPI()}/search?q=${store.selectGrameneFiltersQueryString()}&facet.field=${facets}&rows=${rows}&start=${offset}${fq}&stats=true&${statsFields.join('&')}`)\n return fetch(`${store.selectGrameneAPI()}/search?q=${store.selectGrameneFiltersQueryString()}&facet.field=${facets}&rows=${rows}&start=${offset}${fq}`)\n .then(res => res.json())\n .then(res => {\n res.response.docs.forEach(d => {\n d.can_show = {};\n d.capabilities.forEach(c => {\n d.can_show[c]=true;\n })\n });\n return res;\n })\n }\n});\ngrameneSearch.reactGrameneSearch = createSelector(\n 'selectGrameneSearchShouldUpdate',\n 'selectGrameneFiltersStatus',\n 'selectGrameneGenomes',\n (shouldUpdate, status, genomes) => {\n if (shouldUpdate && status === 'search' && genomes) {\n return { actionCreator: 'doFetchGrameneSearch' }\n }\n }\n);\n\nfunction formatFacetCountsForViz(a) {\n let res = {\n count: a.length/2,\n displayName: \"fixed_1000__bin\",\n data: {},\n sorted: []\n };\n let counts = [];\n for(let i=0;i<a.length;i+=2) {\n const fc = {\n id: +a[i],\n count: +a[i+1]\n };\n res.data[a[i]] = fc;\n counts.push(fc);\n }\n res.sorted = counts.sort((a,b) => a.id - b.id);\n return res;\n}\n\n// bundle to prepare data for the TaxDist component\nconst grameneTaxDist = {\n name: 'grameneTaxDist',\n getReducer: () => {\n const initialState = {};\n return (state = initialState, {type, payload}) => {\n return state;\n }\n },\n selectGrameneTaxDist: createSelector(\n 'selectGrameneSearch',\n 'selectGrameneTaxonomy',\n 'selectGrameneMaps',\n (grameneSearch,grameneTaxonomy,grameneMaps) => {\n if (grameneSearch && grameneTaxonomy && grameneMaps) {\n _.forIn(grameneMaps, (map, tid) => {\n grameneTaxonomy[tid].name = map.display_name;\n });\n const binnedResults = formatFacetCountsForViz(grameneSearch.facet_counts.facet_fields.fixed_1000__bin);\n let speciesTree = treesClient.taxonomy.tree(Object.values(grameneTaxonomy));\n let binMapper = binsClient.bins(grameneMaps);\n let taxDist = build(binMapper, speciesTree);\n taxDist.setBinType('fixed',1000);\n taxDist.setResults(binnedResults);\n return taxDist;\n }\n return null;\n }\n )\n};\n\n// this query will give the sorghum orthologs of AT1G01260\n// want to provide these on non-sorghum genes if available\n// http://data.gramene.org/search?q=homology__all_orthologs:AT1G01260&fq=taxon_id:4558&fl=id\nconst grameneOrthologs = {\n name: 'grameneOrthologs',\n getReducer: () => {\n const initialState = {};\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_ORTHOLOGS_REQUESTED':\n if (!state.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState[payload] = [];\n return newState;\n }\n break;\n case 'GRAMENE_ORTHOLOGS_RECEIVED':\n return Object.assign({}, state, payload);\n }\n return state;\n }\n },\n doRequestOrthologs: geneId => ({dispatch, store}) => {\n const orthologs = store.selectGrameneOrthologs();\n if (!orthologs.hasOwnProperty(geneId)) {\n dispatch({type: 'GRAMENE_ORTHOLOGS_REQUESTED', payload: geneId});\n const API = store.selectGrameneAPI();\n const taxonId = store.selectTargetTaxonId();\n fetch(`${API}/search?q=homology__all_orthologs:${geneId}&fq=taxon_id:${taxonId}&fl=id`)\n .then(res => res.json())\n .then(res => {\n let newOrthologs = {};\n newOrthologs[geneId] = res.response.docs.map(d => d.id);\n dispatch({type: 'GRAMENE_ORTHOLOGS_RECEIVED', payload: newOrthologs})\n })\n }\n },\n selectGrameneOrthologs: state => state.grameneOrthologs\n};\n\nconst grameneParalogs = {\n name: 'grameneParalogs',\n getReducer: () => {\n const initialState = {};\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_PARALOGS_REQUESTED':\n if (!state.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState[payload] = [];\n return newState;\n }\n break;\n case 'GRAMENE_PARALOGS_RECEIVED':\n return Object.assign({}, state, payload);\n }\n return state;\n }\n },\n doRequestParalogs: (geneId,supertree,taxon_id) => ({dispatch, store}) => {\n const paralogs = store.selectGrameneParalogs();\n if (!paralogs.hasOwnProperty(geneId)) {\n dispatch({type: 'GRAMENE_PARALOGS_REQUESTED', payload: geneId});\n const API = store.selectGrameneAPI();\n const q= supertree ? `supertree_attr_s:${supertree}` : `homology__within_species_paralog:${geneId}`;\n fetch(`${API}/search?q=${q}&rows=1000&fq=taxon_id:${taxon_id}`)\n .then(res => res.json())\n .then(res => {\n let newParalogs = {};\n newParalogs[geneId] = res.response.numFound > 0 ? res.response.docs.map(d => d.id) : [geneId];\n dispatch({type: 'GRAMENE_PARALOGS_RECEIVED', payload: newParalogs})\n })\n }\n },\n selectGrameneParalogs: state => state.grameneParalogs\n};\n\n// function selectFacetIDs(store, field) {\n// const path = `grameneGenes.data.facet_counts.facet_fields.${field}`;\n// if (_.has(store,path)) {\n// const flat_facets = _.get(store,path);\n// let idList = [];\n// if (isNaN(+flat_facets[0])) {\n// for (let i = 0; i < flat_facets.length; i += 2) {\n// idList.push(flat_facets[i])\n// }\n// }\n// else {\n// for (let i = 0; i < flat_facets.length; i += 2) {\n// idList.push(+flat_facets[i])\n// }\n// if (idList.length === 1) idList.push(0);\n// }\n// return idList;\n// }\n// }\n//\n// grameneGenes.selectDomainFacets = store => selectFacetIDs(store, 'domains');\n// grameneGenes.selectPathwayFacets = store => selectFacetIDs(store, 'pathways');\n// grameneGenes.selectTaxonomyFacets = store => selectFacetIDs(store, 'taxon_id');\n//\n// const grameneDomains = createAsyncResourceBundle({\n// name: 'grameneDomains',\n// actionBaseType: 'GRAMENE_DOMAINS',\n// persist: false,\n// getPromise: ({store}) =>\n// fetch(`${store.selectGrameneAPI()}/domains?rows=-1&idList=${store.selectDomainFacets().join(',')}`)\n// .then(res => res.json())\n// .then(docs => {return {domains: docs, numFound: docs.length}})\n// });\n//\n// const gramenePathways = createAsyncResourceBundle({\n// name: 'gramenePathways',\n// actionBaseType: 'GRAMENE_PATHWAYS',\n// persist: false,\n// getPromise: ({store}) =>\n// fetch(`${store.selectGrameneAPI()}/pathways?rows=-1&idList=${store.selectPathwayFacets().join(',')}`)\n// .then(res => res.json())\n// .then(docs => {return {pathways: docs, numFound: docs.length}})\n// });\n//\n// const grameneTaxonomy = createAsyncResourceBundle({\n// name: 'grameneTaxonomy',\n// actionBaseType: 'GRAMENE_TAXONOMY',\n// persist: false,\n// getPromise: ({store}) =>\n// fetch(`${store.selectGrameneAPI()}/taxonomy?rows=-1&idList=${store.selectTaxonomyFacets().join(',')}`)\n// .then(res => res.json())\n// .then(docs => {return {taxonomy: docs, numFound: docs.length}})\n// });\n\n\nexport default [grameneSuggestions, grameneSearch, grameneGeneAttribs, grameneMaps, grameneTaxonomy, grameneTaxDist, grameneOrthologs, grameneParalogs, curatedGenes, grameneGermplasm, expressionSamples, expressionStudies];\n","import {createSelector} from \"redux-bundler\";\nimport _ from 'lodash';\nimport ReactGA from 'react-ga4'\nconst MAX_IDLIST_LENGTH = 20;\n\nfunction findNodeWithLeftIdx(node, idx) {\n if (node.leftIdx === idx) {\n return node;\n }\n let result=null;\n if (node.leftIdx < idx && node.hasOwnProperty('children')) {\n node.children.forEach(child => {\n if (child.rightIdx > idx) {\n child.parentIdx = node.leftIdx;\n const res = findNodeWithLeftIdx(child, idx);\n if (res) result = res;\n }\n })\n }\n return result;\n}\n\nfunction markSubtree(node, source, invert) {\n node.marked = (node.leftIdx >= source.leftIdx && node.rightIdx <= source.rightIdx);\n if (invert) node.marked = !node.marked;\n if (node.hasOwnProperty('children')) {\n node.children.forEach(child => {\n markSubtree(child, source, invert);\n })\n }\n}\n\nfunction reindexTree(node, idx) {\n node.leftIdx = idx;\n idx++;\n if (node.hasOwnProperty('children')) {\n node.children.forEach(child => {\n idx = reindexTree(child, idx);\n });\n }\n node.rightIdx = idx;\n idx++;\n return idx;\n}\n\nconst grameneFilters = {\n name: 'grameneFilters',\n getReducer: () => {\n const initialState = {\n status: 'init', // others include 'search', 'waiting' and 'ready'\n operation: 'AND',\n negate: false,\n marked: false,\n leftIdx: 0,\n rightIdx: 1,\n children: [],\n showMarked: false,\n showMenu: false,\n moveCopyMode: '',\n searchOffset: 0,\n rows: 20\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_FILTERS_CLEARED': {\n newState = Object.assign({}, initialState, {\n status: 'search',\n children: []\n });\n return newState;\n }\n case 'GRAMENE_FILTER_ADDED': {\n const idx = state.rightIdx;\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n rightIdx: idx + 2,\n searchOffset: 0\n });\n let child = _.pick(payload, ['fq_field', 'fq_value', 'name', 'category']);\n child.leftIdx = idx;\n child.rightIdx = idx + 1;\n child.negate = false;\n child.showMenu = false;\n newState.children.push(child);\n markSubtree(newState, child, false);\n return newState;\n }\n case 'GRAMENE_FILTER_TREE_ADDED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n rightIdx: payload.rightIdx + 1,\n searchOffset: 0\n });\n newState.children.push(payload);\n markSubtree(newState, payload, false);\n return newState;\n }\n case 'GRAMENE_FILTER_SET_ADDED': {\n // create a filter with the payload.operation and children payload.filters\n let filter = {\n leftIdx: state.rightIdx,\n rightIdx: state.rightIdx + (payload.filters.length) * 2 + 1,\n operation: payload.operation,\n negate: false,\n showMenu: false,\n children: payload.filters\n };\n if (payload.warning) {\n filter.warning = payload.warning\n }\n let nextIdx = filter.leftIdx+1;\n payload.filters.forEach(f => {\n f.leftIdx = nextIdx++;\n f.rightIdx = nextIdx++;\n f.negate = false;\n f.showMenu = false;\n });\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0,\n rightIdx: filter.rightIdx + 1\n });\n newState.children.push(filter);\n markSubtree(newState, filter, false);\n return newState;\n }\n case 'GRAMENE_FILTER_NEGATED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0\n });\n let node = findNodeWithLeftIdx(newState, payload.leftIdx);\n if (node) {\n node.negate = !node.negate;\n markSubtree(newState, node, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_DELETED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0\n });\n let node = findNodeWithLeftIdx(newState, payload.leftIdx);\n if (node) {\n let parent = findNodeWithLeftIdx(newState, node.parentIdx);\n parent.children = parent.children.filter(child => child.leftIdx !== node.leftIdx);\n reindexTree(newState, 0);\n markSubtree(newState, parent, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_OPERATION_CHANGED': {\n if (payload.hasOwnProperty('operation')) {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0\n });\n let node = findNodeWithLeftIdx(newState, payload.leftIdx);\n node.operation = node.operation === 'AND' ? 'OR' : 'AND';\n markSubtree(newState, node, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_MOVED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n moveCopyMode: '',\n searchOffset: 0\n });\n let source = findNodeWithLeftIdx(newState, payload.source.leftIdx);\n let target = findNodeWithLeftIdx(newState, payload.target.leftIdx);\n if (source && target) {\n source.showMenu = false;\n let parent = findNodeWithLeftIdx(newState, source.parentIdx);\n parent.children = parent.children.filter(child => child.leftIdx !== source.leftIdx);\n target.showMenu = false;\n if (!target.hasOwnProperty('children')) {\n let targetCopy = Object.assign({}, target);\n target.children = [targetCopy];\n target.operation = 'OR';\n target.negate = false;\n delete target.fq_field;\n delete target.fq_value;\n delete target.name;\n delete target.category;\n }\n target.children.push(source);\n reindexTree(newState, 0);\n markSubtree(newState, target, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_COPIED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n moveCopyMode: '',\n searchOffset: 0\n });\n let source = findNodeWithLeftIdx(newState, payload.source.leftIdx);\n let target = findNodeWithLeftIdx(newState, payload.target.leftIdx);\n if (source && target) {\n source.showMenu = false;\n if (!target.hasOwnProperty('children')) {\n let targetCopy = Object.assign({}, target);\n target.children = [targetCopy];\n target.operation = 'OR';\n target.negate = false;\n delete target.fq_field;\n delete target.fq_value;\n delete target.name;\n delete target.category;\n }\n let sourceCopy = Object.assign({}, source);\n target.children.push(sourceCopy);\n reindexTree(newState, 0);\n markSubtree(newState, target, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_TARGETS_MARKED':\n newState = Object.assign({}, state, {\n showMarked: true,\n moveCopyMode: payload.mode,\n moveCopySource: payload.source\n });\n markSubtree(newState, payload.source, true);\n return newState;\n case 'GRAMENE_FILTER_TARGETS_UNMARKED':\n newState = Object.assign({}, state, {\n showMarked: false\n });\n return newState;\n case 'GRAMENE_FILTERS_REPLACED':\n payload.status = 'search';\n payload.searchOffset = 0;\n return payload;\n case 'GRAMENE_FILTERS_STATUS_CHANGED':\n if (!(state.status === 'ready' && payload === 'waiting')) {\n return Object.assign({}, state, {status: payload})\n }\n break;\n case 'GRAMENE_FILTERS_SET_SHOW_MARKED':\n return Object.assign({}, state, {showMarked: payload});\n case 'GRAMENE_FILTER_MENU_TOGGLED':\n payload.showMenu = !payload.showMenu;\n return Object.assign({}, state);\n case 'GRAMENE_SEARCH_PAGE_REQUESTED':\n return Object.assign({}, state, {status: 'search', searchOffset: payload * state.rows});\n case 'GRAMENE_SEARCH_FETCH_STARTED':\n return Object.assign({}, state, {status: 'loading'});\n case 'GRAMENE_SEARCH_FETCH_FINISHED':\n return Object.assign({}, state, {status: 'finished'});\n case 'GRAMENE_GENOMES_UPDATED':\n if (state.status === 'ready') {\n return Object.assign({}, state, {status: 'search'});\n }\n case 'URL_UPDATED':\n if (state.status === 'ready') {\n return Object.assign({}, initialState, {children:[]})\n }\n break;\n case 'APP_IDLE':\n if (state.showMarked) {\n return Object.assign({}, state, {showMarked: false})\n }\n }\n return state;\n }\n },\n doNegateGrameneFilter: filter => ({dispatch, getState}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_NEGATED', payload: filter}\n ]\n })\n },\n doDeleteGrameneFilter: filter => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_TAXONOMY_CLEARED'},\n {type: 'GRAMENE_FILTER_DELETED', payload: filter}\n ]\n })\n },\n doChangeGrameneFilterOperation: filter => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_OPERATION_CHANGED', payload: filter}\n ]\n })\n },\n doMoveOrCopyGrameneFilter: (target) => ({dispatch, getState}) => {\n const state = getState();\n if (state.grameneFilters.moveCopyMode) {\n const source = state.grameneFilters.moveCopySource;\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: `GRAMENE_FILTER_${state.grameneFilters.moveCopyMode.toUpperCase()}D`, payload: {source, target}}\n ]\n })\n }\n },\n doCopyGrameneFilter: (source, target) => ({dispatch, getState}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_COPIED', payload: {source, target}}\n ]\n })\n },\n doMarkGrameneFilterTargets: (source, mode) => ({dispatch}) => {\n dispatch({type: 'GRAMENE_FILTER_TARGETS_MARKED', payload: {source:source, mode:mode}})\n },\n doUnmarkGrameneFilterTargets: () => ({dispatch}) => {\n dispatch({type: 'GRAMENE_FILTER_TARGETS_UNMARKED'})\n },\n doAcceptGrameneSuggestion: suggestion => ({dispatch, getState}) => {\n if (!suggestion.name) {\n suggestion.name = suggestion.display_name;\n }\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_ADDED', payload: suggestion}\n ]\n })\n },\n doAddGrameneRangeQuery: terms => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_SET_ADDED', payload: {operation: 'AND', filters: terms}}\n ]\n })\n },\n doToggleGrameneFilterMenu: node => ({dispatch}) => {\n dispatch({type: 'GRAMENE_FILTER_MENU_TOGGLED', payload: node})\n },\n doRequestResultsPage: page => ({dispatch}) => {\n dispatch(\n {type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_SEARCH_PAGE_REQUESTED', payload: page}\n ]\n })\n },\n doReplaceGrameneFilters: filters => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTERS_REPLACED', payload: filters}\n ]\n })\n },\n doClearGrameneFilters: () => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTERS_CLEARED'}\n ]\n })\n },\n selectGrameneFilters: state => state.grameneFilters,\n selectGrameneFiltersStatus: state => state.grameneFilters.status,\n selectGrameneFiltersQueryString: state => {\n const hasSpaces = new RegExp(/^[^\\[\\(].*\\s/);\n const isQuery = new RegExp(/\\([a-zA-Z0-9_]+:[a-zA-Z0-9_]+\\s/);\n const isRegionQuery = new RegExp(/^\\(map:/);\n const idWithColon = new RegExp(/^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+$/);\n function getQuery(node) {\n const negate = node.negate ? 'NOT ' : '';\n if (node.hasOwnProperty('children')) {\n // do some recursion\n return `${negate}(${node.children.map(c => getQuery(c)).sort().join(` ${node.operation} `)})`\n }\n else {\n // this node is a suggestion\n if (node.fq_field === 'location' && isRegionQuery.test(node.fq_value))\n return `${negate}${node.fq_value}`\n if (isQuery.test(node.fq_value))\n return `${negate}${node.fq_value.replace(/:/g,'\\\\:')}`;\n if (hasSpaces.test(node.fq_value))\n return `${negate}${node.fq_field}:\"${node.fq_value}\"`;\n else if (idWithColon.test(node.fq_value))\n return `${negate}${node.fq_field}:${node.fq_value.replace(/:/g,'\\\\:')}`;\n else\n return `${negate}${node.fq_field}:${node.fq_value}`\n }\n }\n if (state.grameneFilters.rightIdx === 1) {\n return '*:*';\n }\n return `*:* AND (${getQuery(state.grameneFilters)})`;\n },\n selectGrameneSearchOffset: state => state.grameneFilters.searchOffset,\n selectGrameneSearchRows: state => state.grameneFilters.rows\n};\n\nconst handleIdList = (queryObject) => {\n let actions = [{type: 'GRAMENE_SEARCH_CLEARED'}];\n let ids = _.uniq(queryObject.idList.split(','));\n let warning = null;\n if (ids.length > MAX_IDLIST_LENGTH) {\n ids = _.slice(ids, 0, MAX_IDLIST_LENGTH);\n warning = `The idList query parameter is limited to ${MAX_IDLIST_LENGTH} genes`\n }\n let filters = ids.map((id,idx) => {\n return {\n category: 'Gene',\n name: id,\n fq_field: 'id',\n fq_value: id\n }\n });\n if (filters.length === 1) {\n actions.push({type: 'GRAMENE_FILTER_ADDED', payload: filters[0]})\n }\n else {\n let action = {type: 'GRAMENE_FILTER_SET_ADDED', payload: {operation: 'OR', filters:filters}};\n if (warning) {\n action.payload.warning = warning\n }\n actions.push(action)\n }\n return { type: 'BATCH_ACTIONS', actions: actions };\n};\n\ngrameneFilters.reactGrameneFilters = createSelector(\n 'selectQueryObject',\n 'selectGrameneFilters',\n 'selectActiveGenomes',\n 'selectUrlObject',\n (queryObject, filters, genomes, myUrl) => {\n if (filters.status === 'init') {\n if (queryObject.filters) {\n const newFilters = JSON.parse(queryObject.filters);\n let actions = [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTERS_REPLACED', payload: newFilters}\n ];\n if (queryObject.genomes) {\n let active={};\n queryObject.genomes.split(',').forEach(t => {\n active[t]=true\n });\n actions.push({type: 'GRAMENE_GENOMES_UPDATED', payload: active});\n }\n return { type: 'BATCH_ACTIONS', actions: actions };\n }\n if (queryObject.hasOwnProperty('sugg')) {\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_ADDED', payload: JSON.parse(queryObject.sugg)}\n ]\n };\n }\n if (queryObject.hasOwnProperty('suggestion')) {\n const url = new URL(myUrl.href);\n url.search = '';\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'URL_UPDATED', payload: {url: url.href, replace:false}},\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'SUGGESTIONS_QUERY_CHANGED', payload: {query: queryObject.suggestion}}\n ]\n };\n }\n if (queryObject.hasOwnProperty('idList')) {\n return handleIdList(queryObject);\n }\n if (queryObject.hasOwnProperty('fq_field') && queryObject.hasOwnProperty('fq_value')\n && queryObject.hasOwnProperty('category') && queryObject.hasOwnProperty('name')) {\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_ADDED', payload: queryObject}\n ]\n };\n }\n const url = new URL(myUrl.href);\n if (url.pathname === '/genes') {\n return {type: 'GRAMENE_FILTERS_CLEARED'}\n }\n }\n if (filters.status === 'finished') {\n const url = new URL(myUrl.href);\n url.search = `filters=${JSON.stringify(Object.assign({}, filters, {status: 'init'}))}&genomes=${genomes.join(',')}`;\n ReactGA.event({\n category: \"Gene Search\",\n action: \"filter finished\",\n label: url.search\n });\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'URL_UPDATED', payload: {url: url.href, replace:false}},\n {type: 'GRAMENE_FILTERS_STATUS_CHANGED', payload: 'ready'}\n ]\n }\n }\n }\n);\n\nexport default grameneFilters;\n","import { createSelector } from 'redux-bundler';\n\nconst grameneViews = {\n name: 'grameneViews',\n getReducer: () => {\n const initialState = {\n options: [\n {\n id: 'help',\n name: 'Help / Demo',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'taxonomy',\n name: 'Taxonomic distribution',\n show: 'on',\n shouldScroll: false\n },\n {\n id: 'list',\n name: 'Gene list',\n show: 'on',\n shouldScroll: false\n },\n {\n id: 'exprViz',\n name: 'Expression visualization',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'ontologyEnrichment',\n name: 'Ontology Enrichment',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'userLists',\n name: 'User Gene Lists',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'export',\n name: 'Data exporter',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'expression',\n name: 'Gene expression',\n show: 'off',\n shouldScroll: false,\n desiredSamples: {}\n },\n {\n id: 'attribs',\n name: 'Gene attributes',\n show: 'off',\n shouldScroll: false\n }\n // {\n // id: 'domains',\n // name: 'Domains',\n // show: 'disabled'\n // },\n // {\n // id: 'go',\n // name: 'GO terms',\n // show: 'disabled'\n // }\n ],\n touched: {}\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_VIEW_TOGGLED':\n newState = Object.assign({},state);\n newState.touched = { ...(state.touched || {}), [payload]: true };\n newState.options.forEach(view => {\n view.shouldScroll = false;\n if (view.id === payload) {\n view.show = view.show === 'on' ? 'off' : 'on'\n view.shouldScroll = view.show === 'on';\n }\n });\n return newState;\n case 'GRAMENE_VIEW_CLICKED':\n newState = Object.assign({}, state);\n newState.touched = { ...(state.touched || {}), [payload]: true };\n newState.options.forEach(view => {\n view.shouldScroll = false;\n if (view.id === payload) {\n view.show = view.show === 'on' ? 'on' : 'on';\n view.shouldScroll = view.show === 'on';\n }\n });\n return newState;\n case 'GRAMENE_VIEW_SCROLLED':\n newState = Object.assign({}, state);\n newState.options.forEach(v => v.shouldScroll = false)\n return newState;\n default:\n return state;\n }\n }\n },\n doToggleGrameneView: idx => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_VIEW_TOGGLED', payload: idx})\n },\n dontToggleGrameneView: idx => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_VIEW_CLICKED', payload: idx})\n },\n doCancelShouldScroll: () => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_VIEW_SCROLLED', payload: null})\n },\n selectRawGrameneViews: state => state.grameneViews,\n selectGrameneViews: createSelector(\n 'selectRawGrameneViews',\n 'selectConfiguration',\n 'selectGrameneSearch',\n 'selectGrameneFilters',\n (raw, config, search, filters) => {\n const overrides = (config && config.views) || null;\n const touched = raw.touched || {};\n const numFound = (search && search.response && search.response.numFound) || 0;\n const hasFilters = !!(filters && filters.rightIdx > 1);\n const resultDependentIds = new Set(['taxonomy', 'list', 'export', 'exprViz', 'ontologyEnrichment']);\n const autoDisable = (numFound === 0) || !hasFilters;\n const hasFirebase = !!(config && config.firebaseConfig);\n\n let options = raw.options;\n if (!hasFirebase) {\n options = options.filter(v => v.id !== 'userLists');\n }\n if (overrides) {\n options = options.filter(v => overrides[v.id] !== 'hidden');\n }\n options = options.map(v => {\n if (resultDependentIds.has(v.id) && autoDisable) {\n return { ...v, show: 'off' };\n }\n if (!overrides) return v;\n const o = overrides[v.id];\n if (!o) return v;\n if (o === 'disabled') return { ...v, show: 'disabled' };\n if (touched[v.id]) return v;\n return { ...v, show: o };\n });\n const anyOtherOn = options.some(v => v.id !== 'help' && v.show === 'on');\n if (!anyOtherOn) {\n options = options.map(v => v.id === 'help' ? { ...v, show: 'on' } : v);\n }\n return { ...raw, options };\n }\n ),\n // Set of view ids whose `show` is currently 'on'. Used by data bundles to\n // gate their auto-fetch reactors so we don't pay the cost of loading data\n // for views the user has turned off.\n selectGrameneViewsOn: createSelector(\n 'selectGrameneViews',\n (views) => {\n const ids = new Set();\n const opts = (views && views.options) || [];\n for (const v of opts) if (v && v.show === 'on') ids.add(v.id);\n return ids;\n }\n )\n};\n\nexport default grameneViews;\n","import { getConfiguredCache } from 'money-clip';\n\n// Dedicated IndexedDB store for the full pathway corpus, persisted\n// indefinitely (default maxAge of `Infinity`). The pathway set is small\n// and stable enough to keep around across sessions, so we bulk-load it\n// once with `?rows=-1` and reuse it instead of issuing per-id requests.\nconst pathwayCache = getConfiguredCache({\n version: 1,\n name: 'gramene_pathways'\n});\n\nlet pathwaysBulkPromise = null;\n\nconst grameneDocs = {\n name: 'grameneDocs',\n getReducer: () => {\n const initialState = {\n genes: {},\n trees: {},\n domains: {},\n pathways: {},\n expression: {},\n sequences: {},\n rnaSequences: {},\n pepSequences: {},\n studies: {},\n desiredSamples: {},\n consequences: {}\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_CONSEQUENCES_REQUESTED':\n if (!state.consequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.consequences[payload] = {};\n return newState;\n }\n break;\n case 'GRAMENE_CONSEQUENCES_RECEIVED':\n newState = Object.assign({}, state);\n newState.consequences = Object.assign({}, state.consequences, payload);\n return newState;\n case 'GRAMENE_GENE_REQUESTED':\n if (!state.genes.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.genes[payload] = {};\n return newState;\n }\n break;\n case 'GRAMENE_GENE_RECEIVED':\n newState = Object.assign({}, state);\n newState.genes = Object.assign({}, state.genes, payload);\n return newState;\n case 'GRAMENE_TREE_REQUESTED':\n if (!state.trees.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.trees[payload] = {};\n return newState;\n }\n break;\n case 'GRAMENE_TREE_RECEIVED':\n newState = Object.assign({}, state);\n newState.trees = Object.assign({}, state.trees, payload);\n return newState;\n case 'GRAMENE_PATHWAYS_RECEIVED':\n newState = Object.assign({}, state);\n newState.pathways = Object.assign({}, state.pathways, payload);\n return newState;\n case 'ATLAS_STUDIES_RECEIVED':\n newState = Object.assign({}, state);\n newState.studies = Object.assign({}, state.studies, payload);\n return newState;\n case 'ATLAS_SAMPLES_REQUESTED':\n if (!state.studies.byID[payload].hasOwnProperty('samples')) {\n newState = Object.assign({},state);\n newState.studies.byID[payload].samples = [];\n return newState;\n }\n break;\n case 'ATLAS_SAMPLES_RECEIVED':\n newState = Object.assign({}, state);\n newState.studies.byID[payload.id].samples = payload.samples;\n return newState;\n case 'GENE_SEQUENCE_REQUESTED':\n if (!state.sequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.sequences[payload] = {};\n return newState;\n }\n break;\n case 'RNA_SEQUENCE_REQUESTED':\n if (!state.rnaSequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.rnaSequences[payload] = {};\n return newState;\n }\n break;\n case 'PEP_SEQUENCE_REQUESTED':\n if (!state.rnaSequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.pepSequences[payload] = {};\n return newState;\n }\n break;\n case 'GENE_SEQUENCE_RECEIVED':\n newState = Object.assign({}, state);\n newState.sequences = Object.assign({}, state.sequences);\n newState.sequences[payload.id] = payload.geneSeq;\n return newState;\n case 'RNA_SEQUENCE_RECEIVED':\n newState = Object.assign({}, state);\n newState.rnaSequences = Object.assign({}, state.rnaSequences);\n newState.rnaSequences[payload.id] = payload.RnaSeq;\n return newState;\n case 'PEP_SEQUENCE_RECEIVED':\n newState = Object.assign({}, state);\n newState.pepSequences = Object.assign({}, state.pepSequences);\n newState.pepSequences[payload.id] = payload.PepSeq;\n return newState;\n case 'PARALOG_EXPRESSION_REQUESTED':\n if (!state.expression.hasOwnProperty(payload)) {\n newState = Object.assign({},state);\n newState.expression[payload] = [];\n return newState;\n }\n break;\n case 'PARALOG_EXPRESSION_RECEIVED':\n newState = Object.assign({}, state);\n newState.expression = Object.assign({}, state.expression);\n newState.expression[payload.id] = payload.paralogs;\n return newState;\n case 'EXPRESSION_SAMPLE_TOGGLED':\n newState = Object.assign({}, state);\n newState.desiredSamples = Object.assign({}, state.desiredSamples);\n if (newState.desiredSamples.hasOwnProperty(payload)) {\n delete newState.desiredSamples[payload]\n }\n else {\n newState.desiredSamples[payload] = {status: 'need'}\n }\n return newState;\n }\n return state;\n }\n },\n doToggleExpressionSample: id => ({dispatch}) => {\n dispatch({type: 'EXPRESSION_SAMPLE_TOGGLED', payload: id});\n },\n doRequestVEP: id => ({dispatch, store}) => {\n const consequences = store.selectGrameneConsequences();\n if (!consequences.hasOwnProperty(id)) {\n dispatch({type: 'GRAMENE_CONSEQUENCES_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/search?q=id:${id}&fl=id,VEP__*`)\n .then(res => res.json())\n .then(res => {\n let genes = {};\n res.response.docs.forEach(g => {\n genes[g.id] = g;\n });\n dispatch({type: 'GRAMENE_CONSEQUENCES_RECEIVED', payload: genes})\n })\n }\n },\n doRequestGrameneGene: id => ({dispatch, store}) => {\n const genes = store.selectGrameneGenes();\n if (!genes.hasOwnProperty(id)) {\n dispatch({type: 'GRAMENE_GENE_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/genes?idList=${id}`)\n .then(res => res.json())\n .then(res => {\n let genes = {};\n res.forEach(g => {\n genes[g._id] = g;\n });\n dispatch({type: 'GRAMENE_GENE_RECEIVED', payload: genes})\n })\n }\n },\n doRequestGrameneTree: id => ({dispatch, store}) => {\n const trees = store.selectGrameneTrees();\n const maps = store.selectGrameneMaps();\n if (!trees.hasOwnProperty(id)) {\n dispatch({type: 'GRAMENE_TREE_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/genetrees?idList=${id}`)\n .then(res => res.json())\n .then(res => {\n let trees = {};\n res.forEach(t => {\n function update_taxon_name(node) {\n if (maps && maps.hasOwnProperty(node.taxon_id)) {\n node.taxon_name = maps[node.taxon_id].display_name\n }\n else if (node.taxon_id === 1100004558) {\n node.taxon_name = \"Sorghum bicolor\"\n }\n if (node.taxon_id === 45580023 && node.hasOwnProperty('children')) {\n node.taxon_name = \"Sorghum bicolor\"\n }\n if (node.taxon_id === 45770001 && node.hasOwnProperty('children')) {\n node.taxon_name = \"Zea mays\"\n }\n if (node.taxon_id === 297600009 && node.hasOwnProperty('children')) {\n node.taxon_name = \"Vitis vinifera\"\n }\n if (node.hasOwnProperty('children')) {\n node.children.forEach(c => update_taxon_name(c))\n }\n }\n update_taxon_name(t);\n trees[t._id] = t;\n });\n dispatch({type: 'GRAMENE_TREE_RECEIVED', payload: trees})\n })\n }\n },\n // Signature kept for backward compatibility; the `ids` argument is\n // ignored. On first call we bulk-load every pathway record from the\n // dedicated IndexedDB cache (or `${api}/pathways?rows=-1` on miss),\n // dispatch a single GRAMENE_PATHWAYS_RECEIVED, and short-circuit all\n // subsequent calls.\n doRequestGramenePathways: _ids => ({dispatch, store}) => {\n if (pathwaysBulkPromise) return pathwaysBulkPromise;\n\n pathwaysBulkPromise = pathwayCache.get('all')\n .then(cached => {\n if (cached) {\n dispatch({type: 'GRAMENE_PATHWAYS_RECEIVED', payload: cached});\n return;\n }\n return fetch(`${store.selectGrameneAPI()}/pathways?rows=-1`)\n .then(res => res.json())\n .then(res => {\n const pathways = {};\n (res || []).forEach(p => {\n if (p && p._id != null) pathways[p._id] = p;\n });\n dispatch({type: 'GRAMENE_PATHWAYS_RECEIVED', payload: pathways});\n pathwayCache.set('all', pathways).catch(e => console.warn('Failed to cache pathways', e));\n });\n })\n .catch(err => {\n console.error('Failed to load pathways', err);\n pathwaysBulkPromise = null; // allow retry on next call\n });\n return pathwaysBulkPromise;\n },\n doRequestExpressionStudies: id => ({dispatch, store}) => {\n fetch(`${store.selectGrameneAPI()}/experiments?rows=-1`)\n .then(res => res.json())\n .then(res => {\n let studies = {byID:{},byTaxon:{}};\n res.forEach(s => {\n studies.byID[s._id] = s;\n if (! studies.byTaxon.hasOwnProperty(s.taxon_id)) {\n studies.byTaxon[s.taxon_id] = []\n }\n studies.byTaxon[s.taxon_id].push(s._id)\n })\n dispatch({type: 'ATLAS_STUDIES_RECEIVED', payload: studies})\n })\n },\n doRequestStudyMetadata: id => ({dispatch, store}) => {\n const studies = store.selectAtlasStudies();\n if (!studies.byID[id].hasOwnProperty('samples')) {\n dispatch({type: 'ATLAS_SAMPLES_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/assays?experiment=${id}&rows=-1`)\n .then(res => res.json())\n .then(samples => {\n dispatch({type: 'ATLAS_SAMPLES_RECEIVED', payload: {id, samples}})\n })\n }\n },\n doRequestGeneSequence: gene => ({dispatch, store}) => {\n const maps = store.selectGrameneMaps();\n const seqs = store.selectGeneSequences();\n const id = gene._id;\n const MAX_FLANK = 2000;\n if (!seqs.hasOwnProperty(id)) {\n dispatch({type: 'GENE_SEQUENCE_REQUESTED', payload: id});\n const start = gene.location.start > MAX_FLANK ? gene.location.start - MAX_FLANK : 1;\n const dnaLength = maps[gene.taxon_id].regionLength[gene.location.region];\n const end = gene.location.end + MAX_FLANK > dnaLength ? dnaLength : gene.location.end + MAX_FLANK;\n fetch(`${store.selectEnsemblAPI()}/sequence/region/${gene.system_name}/${gene.location.region}:${start}..${end}:${gene.location.strand}?content-type=application/json`)\n .then(res => res.json())\n .then(geneSeq => {\n const x = geneSeq.id.split(':');\n geneSeq.genome = x[1];\n geneSeq.start = +x[3];\n geneSeq.end = +x[4];\n dispatch({type: 'GENE_SEQUENCE_RECEIVED', payload: {id, geneSeq}});\n })\n }\n },\n doRequestRnaSequence: (id,gene) => ({dispatch, store}) => {\n const seqs = store.selectRnaSequences();\n if (!seqs.hasOwnProperty(id)) {\n dispatch({type: 'RNA_SEQUENCE_REQUESTED', payload: id});\n fetch(`${store.selectEnsemblAPI()}/sequence/id/${id}?species=${gene.system_name}&type=cdna&content-type=application/json`)\n .then(res => res.json())\n .then(RnaSeq => {\n dispatch({type: 'RNA_SEQUENCE_RECEIVED', payload: {id, RnaSeq}});\n })\n }\n },\n doRequestPepSequence: (id,gene) => ({dispatch, store}) => {\n const seqs = store.selectPepSequences();\n if (!seqs.hasOwnProperty(id)) {\n dispatch({type: 'PEP_SEQUENCE_REQUESTED', payload: id});\n fetch(`${store.selectEnsemblAPI()}/sequence/id/${id}?species=${gene.system_name}&type=protein&content-type=application/json`)\n .then(res => res.json())\n .then(PepSeq => {\n dispatch({type: 'PEP_SEQUENCE_RECEIVED', payload: {id, PepSeq}});\n })\n }\n },\n doRequestParalogExpression: id => ({dispatch, store}) => {\n const expr = store.selectParalogExpression();\n if (!expr.hasOwnProperty(id)) {\n dispatch({type: 'PARALOG_EXPRESSION_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/search?q=homology__within_species_paralog:${id}&fl=id,atlas_id,name,*__expr&rows=100`)\n .then(res => res.json())\n .then(res => {\n const assay_re = /(.+)_g(\\d+)/;\n const paralogs = res.response.docs.map(d => {\n let p = {\n id: d.id,\n name: d.name,\n experiments: {},\n min:1000,\n max:0\n };\n if (d.atlas_id) {\n p.atlas_id = d.atlas_id;\n delete d.atlas_id;\n }\n delete d.id;\n delete d.name;\n Object.entries(d).forEach(assay => {\n const parsed = assay[0].match(assay_re);\n const expr = parsed[1].replace('_','-').replace('-tpms','');\n if (! p.experiments.hasOwnProperty(expr)) {\n p.experiments[expr] = [];\n }\n const g = parsed[2] - 1;\n const e = d[assay[0]];\n if (e < p.min) p.min = e;\n if (e > p.max) p.max = e;\n p.experiments[expr][g] = e;\n });\n return p;\n }).map(p => {\n for (const expr in p.experiments) {\n p.experiments[expr] = p.experiments[expr].filter(e => e >= 0);\n }\n return p;\n });\n dispatch({type: 'PARALOG_EXPRESSION_RECEIVED', payload: {id, paralogs}});\n })\n }\n },\n selectGrameneGenes: state => state.grameneDocs.genes,\n selectGrameneConsequences: state => state.grameneDocs.consequences,\n selectGrameneTrees: state => state.grameneDocs.trees,\n selectGramenePathways: state => state.grameneDocs.pathways,\n selectParalogExpression: state => state.grameneDocs.expression,\n selectGeneSequences: state => state.grameneDocs.sequences,\n selectRnaSequences: state => state.grameneDocs.rnaSequences,\n selectPepSequences: state => state.grameneDocs.pepSequences,\n selectAtlasStudies: state => state.grameneDocs.studies,\n selectDesiredSamples: state => state.grameneDocs.desiredSamples\n};\n\nexport default grameneDocs;\n","import {createSelector} from \"redux-bundler\";\nconst grameneGenomes = {\n name: 'grameneGenomes',\n getReducer: () => {\n const initialState = {\n show: false,\n active: {}\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_GENOMES_TOGGLED':\n newState = Object.assign({},state);\n newState.show = !newState.show;\n return newState;\n case 'GRAMENE_GENOMES_UPDATED':\n newState = Object.assign({}, state);\n newState.active = payload;\n return newState;\n case 'GRAMENE_MAPS_FETCH_FINISHED':\n newState = Object.assign({}, state);\n Object.keys(payload).forEach(key => {newState.active[key] = true;});\n return newState;\n default:\n return state;\n }\n }\n },\n doShowGrameneGenomes: () => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_GENOMES_TOGGLED'})\n },\n doInitializeGrameneGenomes: genomes => ({dispatch, getState}) => {\n dispatch({type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_GENOMES_UPDATED', payload: genomes}]})\n },\n doUpdateGrameneGenomes: genomes => ({dispatch, getState}) => {\n dispatch({type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_GENOMES_UPDATED', payload: genomes},\n {type: 'GRAMENE_GENOMES_TOGGLED'},\n {type: 'GRAMENE_SEARCH_CLEARED'}]})\n },\n doEnsureGrameneGenome: genome => ({dispatch, getState}) => {\n const state = getState();\n if (Object.keys(state.grameneGenomes.active).length > 0 && !state.grameneGenomes.active.hasOwnProperty(genome)) {\n let active = Object.assign({}, state.grameneGenomes.active);\n active[genome]=true;\n dispatch({type: 'GRAMENE_GENOMES_UPDATED', payload: active})\n }\n },\n selectGrameneGenomes: state => state.grameneGenomes,\n selectActiveGenomes: state => {\n return Object.keys(state.grameneGenomes.active)\n },\n selectActiveGenomeCount: createSelector(\n 'selectGrameneMaps',\n 'selectGrameneGenomes',\n (maps,genomes) => {\n if (maps && genomes) {\n return Object.keys(genomes.active).length || Object.keys(maps).length;\n }\n return 0;\n }\n )\n};\n\nexport default grameneGenomes;\n","import { createAsyncResourceBundle, createSelector } from 'redux-bundler';\nimport overlay from '../fieldCatalog.overlay.json';\nimport { study_info as VEP_STUDY_INFO } from '../vepStudyInfo';\n\n// Fields matched by these globs are multi-valued in Solr.\nconst MULTIVALUED_PATTERNS = [\n /__expr$/,\n /__ancestors$/,\n /__xrefs$/,\n /^VEP__/,\n /^homology__/\n];\n\nfunction parseCsvHeader(text) {\n if (!text) return [];\n const line = text.split(/\\r?\\n/, 1)[0] || '';\n return line\n .split(',')\n .map(s => s.trim().replace(/^\"|\"$/g, ''))\n .filter(Boolean);\n}\n\nfunction synthesizedValue(name) {\n return MULTIVALUED_PATTERNS.some(re => re.test(name)) ? [0] : 0;\n}\n\nfunction applyTemplate(tpl, match) {\n if (!tpl) return null;\n return tpl.replace(/\\$(\\d+)/g, (_, n) => match[+n] || '');\n}\n\nfunction vepDetailLabel(matchGroups) {\n const [, , system, sid] = matchGroups || [];\n const info = (VEP_STUDY_INFO[system] || {})[sid];\n if (info) return info.label;\n return `${system}/${sid}`;\n}\n\nfunction vepDetailTsvHeader(matchGroups) {\n const [conseq, zyg, system, sid] = matchGroups || [];\n const info = (VEP_STUDY_INFO[system] || {})[sid];\n const type = (info && info.type) || '?';\n const study = (info && info.label) || `${system}/${sid}`;\n return `${type}·${conseq}·${zyg}·${study}`;\n}\n\nfunction vepMergedLabel(matchGroups) {\n const [kind] = matchGroups || [];\n if (kind === 'NAT') return 'Merged natural population accessions';\n if (kind === 'EMS') return 'Merged EMS mutant accessions';\n return `Merged ${kind} accessions`;\n}\n\nfunction vepMergedTsvHeader(matchGroups) {\n const [kind] = matchGroups || [];\n return `merged·${kind}`;\n}\n\nfunction classifyKey(name, patterns) {\n for (const p of patterns) {\n const re = new RegExp(p.match);\n const m = name.match(re);\n if (m) {\n return {\n patternId: p.id,\n group: p.group,\n label: applyTemplate(p.labelTemplate, m) || name,\n multiValued: !!p.multiValued,\n expression: !!p.expression,\n isHidden: !!p.is_hidden,\n matchGroups: m.slice(1)\n };\n }\n }\n return null;\n}\n\nfunction inferType(value) {\n if (value === null || value === undefined) return 'unknown';\n if (Array.isArray(value)) {\n return 'array<' + (value.length ? inferType(value[0]) : 'unknown') + '>';\n }\n return typeof value;\n}\n\nfunction buildCatalog(sampleDocs) {\n const hidden = new Set(overlay.hidden || []);\n const overlayFields = overlay.fields || {};\n const patterns = overlay.patterns || [];\n const groupsMeta = overlay.groups || {};\n\n // Union keys from overlay.fields (hardcoded catalog entries) and sample docs.\n const keys = new Set(Object.keys(overlayFields));\n const sampleValues = {};\n for (const doc of (sampleDocs || [])) {\n for (const [k, v] of Object.entries(doc)) {\n keys.add(k);\n if (!(k in sampleValues)) sampleValues[k] = v;\n }\n }\n\n const fields = {};\n for (const name of keys) {\n if (hidden.has(name)) continue;\n\n const overlayEntry = overlayFields[name];\n const classified = overlayEntry ? null : classifyKey(name, patterns);\n if (classified && classified.isHidden) continue;\n const sampleVal = sampleValues[name];\n const sampleType = sampleVal !== undefined ? inferType(sampleVal) : null;\n\n const group = (overlayEntry && overlayEntry.group)\n || (classified && classified.group)\n || 'other';\n\n let label = (overlayEntry && overlayEntry.label)\n || (classified && classified.label)\n || name;\n let tsvHeader = null;\n if (classified && classified.patternId === 'vep_detail') {\n label = vepDetailLabel(classified.matchGroups);\n tsvHeader = vepDetailTsvHeader(classified.matchGroups);\n } else if (classified && classified.patternId === 'vep_merged') {\n label = vepMergedLabel(classified.matchGroups);\n tsvHeader = vepMergedTsvHeader(classified.matchGroups);\n }\n\n const multiValued = (overlayEntry && overlayEntry.multiValued)\n || (classified && classified.multiValued)\n || (sampleType && sampleType.startsWith('array<'))\n || false;\n\n fields[name] = {\n name,\n label,\n tsvHeader,\n group,\n order: overlayEntry && overlayEntry.order != null ? overlayEntry.order : null,\n description: (overlayEntry && overlayEntry.description) || '',\n type: sampleType || 'unknown',\n multiValued,\n patternId: classified ? classified.patternId : null,\n matchGroups: classified ? classified.matchGroups : null,\n expression: !!(classified && classified.expression),\n source: overlayEntry ? 'overlay' : 'sample'\n };\n }\n\n // Build groups (explicit overlay.order first, then natural sort by label)\n const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n const compareFields = (a, b) => {\n const ao = a.order, bo = b.order;\n if (ao != null && bo != null && ao !== bo) return ao - bo;\n if (ao != null && bo == null) return -1;\n if (ao == null && bo != null) return 1;\n return collator.compare(a.label, b.label);\n };\n const groupIds = new Set(Object.values(fields).map(f => f.group));\n const groups = Array.from(groupIds).map(id => ({\n id,\n label: (groupsMeta[id] && groupsMeta[id].label) || id,\n order: (groupsMeta[id] && groupsMeta[id].order) != null ? groupsMeta[id].order : 50,\n fields: Object.values(fields)\n .filter(f => f.group === id)\n .sort(compareFields)\n .map(f => f.name)\n })).sort((a, b) => a.order - b.order);\n\n return {\n fetchedAt: Date.now(),\n groups,\n fields\n };\n}\n\nconst grameneFieldCatalog = createAsyncResourceBundle({\n name: 'grameneFieldCatalog',\n actionBaseType: 'GRAMENE_FIELD_CATALOG',\n persist: true,\n staleAfter: 5 * 60 * 1000,\n getPromise: ({ store }) => {\n const api = store.selectGrameneAPI();\n const url = `${api}/search?q=*:*&rows=0&wt=csv&fl=*`;\n return fetch(url)\n .then(r => r.text())\n .then(text => parseCsvHeader(text))\n .catch(() => null);\n }\n});\n\n// Auto-fetch the field catalog only when a view that needs it (exprViz fields\n// modal, exporter field tree) is enabled. Other views never read it.\nconst FIELD_CATALOG_VIEWS = ['exprViz', 'export'];\ngrameneFieldCatalog.reactGrameneFieldCatalog = createSelector(\n 'selectGrameneFieldCatalogShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !FIELD_CATALOG_VIEWS.some(id => viewsOn.has(id))) return;\n return { actionCreator: 'doFetchGrameneFieldCatalog' };\n }\n);\n\nfunction assayFactorLabel(assay) {\n if (!assay) return '';\n const factors = Array.isArray(assay.factor) ? assay.factor : [];\n const labels = factors.map(f => f && f.label).filter(Boolean);\n if (labels.length) return labels.join('; ');\n const chars = Array.isArray(assay.characteristic) ? assay.characteristic : [];\n const organ = chars.find(c => c && c.type === 'organism part');\n return (organ && organ.label) || '';\n}\n\nfunction parseTaxonFacet(grameneSearch, grameneMaps) {\n const arr = grameneSearch\n && grameneSearch.facet_counts\n && grameneSearch.facet_counts.facet_fields\n && grameneSearch.facet_counts.facet_fields.taxon_id;\n if (!Array.isArray(arr) || !arr.length) return null;\n // Search taxon_ids are strain-specific (e.g. 3702001); experiments use\n // species-level NCBI taxon_ids (e.g. 3702). Map via grameneMaps.anchor_taxon_id.\n // If maps aren't loaded yet, skip filtering rather than drop everything.\n if (!grameneMaps || !Object.keys(grameneMaps).length) return null;\n const speciesTaxa = new Set();\n for (let i = 0; i < arr.length; i += 2) {\n const tid = arr[i];\n if (arr[i + 1] <= 0) continue;\n const map = grameneMaps[tid];\n const anchor = map && map.anchor_taxon_id;\n speciesTaxa.add(Number(anchor || tid));\n }\n return speciesTaxa.size ? speciesTaxa : null;\n}\n\nfunction buildExperimentTaxonIndex(expressionStudies) {\n const index = {};\n if (!expressionStudies) return index;\n for (const [taxon, arr] of Object.entries(expressionStudies)) {\n if (!Array.isArray(arr)) continue;\n for (const e of arr) if (e && e._id) index[e._id] = Number(taxon);\n }\n return index;\n}\n\nfunction buildExperimentTitleIndex(expressionStudies) {\n const index = {};\n if (!expressionStudies) return index;\n for (const arr of Object.values(expressionStudies)) {\n if (!Array.isArray(arr)) continue;\n for (const e of arr) {\n if (e && e._id) index[e._id] = e.description || e.title || '';\n }\n }\n return index;\n}\n\nfunction buildSpeciesNameIndex(grameneMaps) {\n const idx = {};\n if (!grameneMaps) return idx;\n for (const m of Object.values(grameneMaps)) {\n if (m && m.anchor_taxon_id && !idx[m.anchor_taxon_id]) {\n idx[m.anchor_taxon_id] = m.display_name || String(m.anchor_taxon_id);\n }\n }\n return idx;\n}\n\nfunction fieldExperimentId(name) {\n let m = name.match(/^(\\w+?)_g\\d+__expr$/);\n if (m) return m[1].replace(/_/g, '-');\n m = name.match(/^(\\w+?)_g\\d+_g\\d+_(pval|l2fc)_attr_[a-z]$/);\n if (m) return m[1].replace(/_/g, '-');\n return null;\n}\n\nconst STAT_RANK = { l2fc: 0, pval: 1 };\n\nfunction collapseDiffExprInSubgroups(subgroups, fieldsOut, collator) {\n for (const taxGroup of subgroups) {\n for (const expGroup of (taxGroup.subgroups || [])) {\n const contrastMap = new Map();\n const others = [];\n for (const name of (expGroup.fields || [])) {\n const f = fieldsOut[name];\n if (!f || f.patternId !== 'diffexpr') { others.push(name); continue; }\n const mg = f.matchGroups || [];\n const key = `${mg[1]}|${mg[2]}`;\n let arr = contrastMap.get(key);\n if (!arr) { arr = []; contrastMap.set(key, arr); }\n arr.push(name);\n }\n const newFields = [...others];\n for (const names of contrastMap.values()) {\n if (names.length === 1) { newFields.push(names[0]); continue; }\n names.sort((a, b) => {\n const ra = STAT_RANK[(fieldsOut[a].matchGroups || [])[3]] ?? 99;\n const rb = STAT_RANK[(fieldsOut[b].matchGroups || [])[3]] ?? 99;\n if (ra !== rb) return ra - rb;\n return collator.compare(a, b);\n });\n const rep = names[0];\n const repEntry = fieldsOut[rep];\n const label = (repEntry.label || rep).replace(/\\s+\\((?:pval|l2fc)\\)/, '');\n fieldsOut[rep] = { ...repEntry, label, linkedFields: names.slice() };\n newFields.push(rep);\n }\n expGroup.fields = newFields;\n }\n }\n}\n\nfunction buildExpressionSubgroups(fieldNames, fieldsOut, experimentTaxa, experimentTitles, speciesNames, collator) {\n const byTaxon = new Map();\n const orphans = [];\n const studiesLoaded = Object.keys(experimentTaxa).length > 0;\n for (const name of fieldNames) {\n const expId = fieldExperimentId(name);\n if (!expId) { orphans.push(name); continue; }\n const taxon = experimentTaxa[expId];\n if (!taxon) {\n if (studiesLoaded) continue;\n orphans.push(name);\n continue;\n }\n let taxonEntry = byTaxon.get(taxon);\n if (!taxonEntry) {\n taxonEntry = new Map();\n byTaxon.set(taxon, taxonEntry);\n }\n let expEntry = taxonEntry.get(expId);\n if (!expEntry) {\n expEntry = [];\n taxonEntry.set(expId, expEntry);\n }\n expEntry.push(name);\n }\n\n const taxonGroups = [];\n for (const [taxon, expMap] of byTaxon) {\n const experiments = [];\n for (const [expId, names] of expMap) {\n names.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n const title = experimentTitles && experimentTitles[expId];\n experiments.push({\n id: 'exp-' + expId,\n label: title ? `${expId} — ${title}` : expId,\n fields: names\n });\n }\n experiments.sort((a, b) => collator.compare(a.label, b.label));\n taxonGroups.push({\n id: 'tax-' + taxon,\n label: speciesNames[taxon] || `taxon ${taxon}`,\n taxon,\n subgroups: experiments\n });\n }\n taxonGroups.sort((a, b) => collator.compare(a.label, b.label));\n\n return { subgroups: taxonGroups, orphans };\n}\n\nfunction buildVepSubgroups(fieldNames, fieldsOut, collator) {\n const buckets = {\n NAT: { merged: [], byConseq: new Map() },\n EMS: { merged: [], byConseq: new Map() }\n };\n const orphans = [];\n\n for (const name of fieldNames) {\n const f = fieldsOut[name];\n if (!f) { orphans.push(name); continue; }\n if (f.patternId === 'vep_merged') {\n const kind = (f.matchGroups && f.matchGroups[0]) || '';\n if (buckets[kind]) buckets[kind].merged.push(name);\n else orphans.push(name);\n } else if (f.patternId === 'vep_detail') {\n const mg = f.matchGroups || [];\n const [conseq, zyg, system, sid] = mg;\n const info = (VEP_STUDY_INFO[system] || {})[sid];\n const kind = info && info.type;\n if (!buckets[kind]) { orphans.push(name); continue; }\n let zmap = buckets[kind].byConseq.get(conseq);\n if (!zmap) {\n zmap = new Map();\n buckets[kind].byConseq.set(conseq, zmap);\n }\n let arr = zmap.get(zyg);\n if (!arr) {\n arr = [];\n zmap.set(zyg, arr);\n }\n arr.push(name);\n } else {\n orphans.push(name);\n }\n }\n\n const kindLabels = { NAT: 'Natural populations', EMS: 'Mutant populations' };\n const subgroups = [];\n for (const kind of ['NAT', 'EMS']) {\n const bucket = buckets[kind];\n if (!bucket.merged.length && bucket.byConseq.size === 0) continue;\n\n const conseqGroups = [];\n for (const [conseq, zmap] of bucket.byConseq) {\n const zygGroups = [];\n for (const [zyg, names] of zmap) {\n names.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n zygGroups.push({\n id: `lof-${kind}-${conseq}-${zyg}`,\n label: zyg === 'het' ? 'heterozygous' : 'homozygous',\n fields: names\n });\n }\n zygGroups.sort((a, b) => collator.compare(a.label, b.label));\n conseqGroups.push({\n id: `lof-${kind}-${conseq}`,\n label: conseq.replace(/_/g, ' '),\n subgroups: zygGroups\n });\n }\n conseqGroups.sort((a, b) => collator.compare(a.label, b.label));\n\n bucket.merged.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n\n subgroups.push({\n id: `lof-${kind}`,\n label: kindLabels[kind],\n fields: bucket.merged,\n subgroups: conseqGroups\n });\n }\n\n return { subgroups, orphans };\n}\n\nfunction enrichLabels(catalog, expressionStudies, expressionSamples, grameneSearch, grameneMaps) {\n if (!catalog || !catalog.fields) return catalog;\n if (!expressionSamples) return catalog;\n\n const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n const taxaInResults = parseTaxonFacet(grameneSearch, grameneMaps);\n const experimentTaxa = buildExperimentTaxonIndex(expressionStudies);\n const experimentTitles = buildExperimentTitleIndex(expressionStudies);\n const dropped = new Set();\n const fieldsOut = {};\n\n for (const [name, f] of Object.entries(catalog.fields)) {\n if (f.patternId !== 'expr' && f.patternId !== 'diffexpr') {\n fieldsOut[name] = f;\n continue;\n }\n const mg = f.matchGroups || [];\n const experimentSolr = mg[0];\n if (!experimentSolr) { fieldsOut[name] = f; continue; }\n const experimentId = experimentSolr.replace(/_/g, '-');\n\n if (taxaInResults) {\n const expTaxon = experimentTaxa[experimentId];\n if (expTaxon && !taxaInResults.has(expTaxon)) {\n dropped.add(name);\n continue;\n }\n }\n\n const assays = expressionSamples[experimentId] || [];\n let newLabel = f.label;\n if (f.patternId === 'expr') {\n const g = 'g' + mg[1];\n const assay = assays.find(a => a && a.group === g);\n const desc = assayFactorLabel(assay);\n newLabel = desc ? `${experimentId} ${g}: ${desc}` : `${experimentId} ${g}`;\n } else {\n const gA = 'g' + mg[1];\n const gB = 'g' + mg[2];\n const metric = mg[3];\n const aA = assays.find(a => a && a.group === gA);\n const aB = assays.find(a => a && a.group === gB);\n const dA = assayFactorLabel(aA);\n const dB = assayFactorLabel(aB);\n const pair = dA && dB ? `: ${dA} vs ${dB}` : '';\n newLabel = `${experimentId} ${gA} vs ${gB} (${metric})${pair}`;\n }\n\n fieldsOut[name] = newLabel !== f.label ? { ...f, label: newLabel } : f;\n }\n\n // Synthesize any expr fields missing from catalog.fields using the complete\n // assays collection. The doc-sample only surfaces expr keys that happened to\n // appear in the sampled genes; assays is authoritative per-experiment.\n const synthesized = [];\n for (const [experimentId, assays] of Object.entries(expressionSamples)) {\n if (taxaInResults) {\n const expTaxon = experimentTaxa[experimentId];\n if (expTaxon && !taxaInResults.has(expTaxon)) continue;\n }\n const solrPrefix = experimentId.replace(/-/g, '_');\n for (const assay of assays) {\n if (!assay || !assay.group) continue;\n const name = `${solrPrefix}_${assay.group}__expr`;\n if (fieldsOut[name]) continue;\n const desc = assayFactorLabel(assay);\n fieldsOut[name] = {\n name,\n label: desc ? `${experimentId} ${assay.group}: ${desc}` : `${experimentId} ${assay.group}`,\n group: 'expression',\n description: '',\n type: 'array<float>',\n multiValued: true,\n patternId: 'expr',\n matchGroups: [solrPrefix, assay.group.replace(/^g/, '')],\n expression: true,\n source: 'assays'\n };\n synthesized.push(name);\n }\n }\n\n const speciesNames = buildSpeciesNameIndex(grameneMaps);\n\n const groups = catalog.groups.map(g => {\n let list = dropped.size ? g.fields.filter(n => !dropped.has(n)) : g.fields;\n if (g.id === 'expression' && synthesized.length) {\n const existing = new Set(list);\n list = [...list, ...synthesized.filter(n => !existing.has(n))];\n }\n if (g.id === 'lof') {\n const { subgroups, orphans } = buildVepSubgroups(list, fieldsOut, collator);\n orphans.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n return { ...g, fields: orphans, subgroups };\n }\n if (g.id !== 'expression' && g.id !== 'differential') {\n return list === g.fields ? g : { ...g, fields: list };\n }\n const { subgroups, orphans } = buildExpressionSubgroups(\n list, fieldsOut, experimentTaxa, experimentTitles, speciesNames, collator\n );\n if (g.id === 'differential') {\n collapseDiffExprInSubgroups(subgroups, fieldsOut, collator);\n }\n orphans.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n return { ...g, fields: orphans, subgroups };\n });\n\n return { ...catalog, fields: fieldsOut, groups };\n}\n\nfunction filterCatalogByPresentFields(catalog, present) {\n if (!catalog || !catalog.fields || !present) return catalog;\n const filteredFields = {};\n for (const [name, f] of Object.entries(catalog.fields)) {\n if (present.has(name)) filteredFields[name] = f;\n }\n const hasContent = (g) =>\n (g.fields && g.fields.length > 0) ||\n (g.subgroups && g.subgroups.some(hasContent));\n const filterGroup = (g) => {\n const fields = (g.fields || []).filter(n => present.has(n));\n const subgroups = (g.subgroups || [])\n .map(filterGroup)\n .filter(hasContent);\n return { ...g, fields, subgroups };\n };\n const groups = (catalog.groups || []).map(filterGroup).filter(hasContent);\n return { ...catalog, fields: filteredFields, groups };\n}\n\ngrameneFieldCatalog.selectFieldCatalog = createSelector(\n 'selectGrameneFieldCatalog',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'selectGrameneSearch',\n 'selectGrameneMaps',\n (fieldNames, studies, samples, search, maps) => {\n if (!fieldNames || !fieldNames.length) return null;\n const present = new Set(fieldNames);\n // Build a synthetic doc from the discovered field names; values carry the\n // right JS type so inferType picks the correct multiValued/type (arrays\n // for multi-valued fields, scalars otherwise). Derive the pval companion\n // from every l2fc field.\n const doc = {};\n for (const name of present) {\n doc[name] = synthesizedValue(name);\n if (/_l2fc_attr_f$/.test(name)) {\n doc[name.replace('_l2fc_', '_pval_')] = 0;\n }\n }\n const catalog = buildCatalog([doc]);\n const enriched = enrichLabels(catalog, studies, samples, search, maps);\n return filterCatalogByPresentFields(enriched, present);\n }\n);\n\ngrameneFieldCatalog.selectFieldCatalogGroups = createSelector(\n 'selectFieldCatalog',\n (catalog) => (catalog && catalog.groups) || []\n);\n\ngrameneFieldCatalog.selectFieldCatalogByName = createSelector(\n 'selectFieldCatalog',\n (catalog) => (catalog && catalog.fields) || {}\n);\n\nexport default grameneFieldCatalog;\n","{\n \"groups\": {\n \"core\": { \"label\": \"Core identifiers\", \"order\": 0 },\n \"location\": { \"label\": \"Genomic location\", \"order\": 1 },\n \"structure\": { \"label\": \"Gene structure\", \"order\": 2 },\n \"homology\": { \"label\": \"Homology\", \"order\": 3 },\n \"expression\": { \"label\": \"Gene expression\", \"order\": 4 },\n \"differential\": { \"label\": \"Differential expression\",\"order\": 5 },\n \"hierarchical\": { \"label\": \"Hierarchical annotations\",\"order\": 6 },\n \"pathways\": { \"label\": \"Pathways\", \"order\": 7 },\n \"GO\": { \"label\": \"Gene Ontology\", \"order\": 7 },\n \"PO\": { \"label\": \"Plant Ontology\", \"order\": 8 },\n \"lof\": { \"label\": \"Loss of function alleles\",\"order\": 9 },\n \"MAKER\": { \"label\": \"MAKER transcript metrics\",\"order\": 10 },\n \"xrefs\": { \"label\": \"External references\", \"order\": 11 },\n \"other\": { \"label\": \"Other\", \"order\": 99 }\n },\n\n \"patterns\": [\n {\n \"id\": \"homology\",\n \"match\": \"^homology__(.+)$\",\n \"group\": \"homology\",\n \"multiValued\": true,\n \"labelTemplate\": \"Homology: $1\"\n },\n {\n \"id\": \"pathways\",\n \"match\": \"^pathways__(.+)$\",\n \"group\": \"pathways\",\n \"multiValued\": true,\n \"labelTemplate\": \"Pathway: $1\"\n },\n {\n \"id\": \"maker\",\n \"match\": \"^MAKER__(.+)__attr_([a-z])$\",\n \"group\": \"MAKER\",\n \"labelTemplate\": \"MAKER: $1\"\n },\n {\n \"id\": \"xrefs\",\n \"match\": \"^(.+)__xrefs$\",\n \"group\": \"xrefs\",\n \"multiValued\": true,\n \"labelTemplate\": \"$1 (xrefs)\"\n },\n {\n \"id\": \"expr\",\n \"match\": \"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)__expr$\",\n \"group\": \"expression\",\n \"expression\": true,\n \"labelTemplate\": \"$1 · g$2\"\n },\n {\n \"id\": \"diffexpr\",\n \"match\": \"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)_g(\\\\d+)_(pval|l2fc)_attr_([a-z])$\",\n \"group\": \"differential\",\n \"diffExpression\": true,\n \"labelTemplate\": \"$1 · g$2 vs g$3 · $4\"\n },\n {\n \"id\": \"bins\",\n \"match\": \"^(fixed|uniform)_([0-9a-zA-Z]+)__bin$\",\n \"group\": \"bins\",\n \"is_hidden\": true,\n \"labelTemplate\": \"$1 bin ($2)\"\n },\n {\n \"id\": \"neighbors\",\n \"match\": \".*neighbors_[0-9]+$\",\n \"group\": \"neighbors\",\n \"is_hidden\": true,\n \"labelTemplate\": \"neighbors\"\n },\n {\n \"id\": \"vep_merged\",\n \"match\": \"^VEP__merged__(NAT|EMS)__attr_ss$\",\n \"group\": \"lof\",\n \"multiValued\": true,\n \"labelTemplate\": \"Merged $1 accessions\"\n },\n {\n \"id\": \"vep_detail\",\n \"match\": \"^VEP__(.+?)__(homo|het)__(.+?)__(\\\\d+)__attr_ss$\",\n \"group\": \"lof\",\n \"multiValued\": true,\n \"labelTemplate\": \"$1 ($2) $3/$4\"\n },\n {\n \"id\": \"generic_attr\",\n \"match\": \"^(.+)__attr_([a-z])$\",\n \"group\": \"other\",\n \"labelTemplate\": \"$1\"\n }\n ],\n\n \"fields\": {\n \"id\": { \"group\": \"core\", \"label\": \"Gene ID\", \"order\": 1 },\n \"name\": { \"group\": \"core\", \"label\": \"Name\", \"order\": 2 },\n \"description\": { \"group\": \"core\", \"label\": \"Description\", \"order\": 4 },\n \"summary\": { \"group\": \"core\", \"label\": \"Summary\", \"order\": 5 },\n \"synonyms\": { \"group\": \"core\", \"label\": \"Synonyms\", \"multiValued\": true, \"order\": 3 },\n \"biotype\": { \"group\": \"core\", \"label\": \"Biotype\", \"order\": 6 },\n \"taxon_id\": { \"group\": \"core\", \"label\": \"Taxon ID\", \"order\": 8 },\n \"system_name\": { \"group\": \"core\", \"label\": \"System name\", \"order\": 7 },\n \"db_type\": { \"group\": \"core\", \"label\": \"DB type\", \"order\": 9 },\n\n \"closest_rep_id\": { \"group\": \"homology\", \"label\": \"Closest representative ID\", \"order\": 1 },\n \"closest_rep_name\": { \"group\": \"homology\", \"label\": \"Closest representative name\", \"order\": 2 },\n \"closest_rep_identity\": { \"group\": \"homology\", \"label\": \"Closest representative identity\", \"order\": 3 },\n \"closest_rep_taxon_id\": { \"group\": \"homology\", \"label\": \"Closest representative taxon\", \"order\": 4 },\n \"closest_rep_description\": { \"group\": \"homology\", \"label\": \"Closest representative description\", \"order\": 5 },\n \"model_rep_id\": { \"group\": \"homology\", \"label\": \"Model representative ID\", \"order\": 6 },\n \"model_rep_name\": { \"group\": \"homology\", \"label\": \"Model representative name\", \"order\": 7 },\n \"model_rep_identity\": { \"group\": \"homology\", \"label\": \"Model representative identity\", \"order\": 8 },\n \"model_rep_taxon_id\": { \"group\": \"homology\", \"label\": \"Model representative taxon\", \"order\": 9 },\n \"model_rep_description\": { \"group\": \"homology\", \"label\": \"Model representative description\", \"order\": 10 },\n\n \"gene_tree\": { \"group\": \"homology\", \"label\": \"Gene tree ID\", \"order\": 11 },\n \"pan_tree\": { \"group\": \"homology\", \"label\": \"Pan-gene tree ID\", \"order\": 14 },\n\n \"capabilities\": { \"group\": \"other\", \"label\": \"Capabilities\", \"multiValued\": true },\n\n \"map\": { \"group\": \"location\", \"label\": \"Map\", \"order\": 1 },\n \"region\": { \"group\": \"location\", \"label\": \"Region\", \"order\": 2 },\n \"start\": { \"group\": \"location\", \"label\": \"Start\", \"order\": 3 },\n \"end\": { \"group\": \"location\", \"label\": \"End\", \"order\": 4 },\n \"strand\": { \"group\": \"location\", \"label\": \"Strand\", \"order\": 5 },\n\n \"GO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"GO terms\", \"multiValued\": true, \"order\": 1 },\n \"PO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"PO terms\", \"multiValued\": true, \"order\": 2 },\n \"TO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"TO terms\", \"multiValued\": true, \"order\": 3 },\n \"QTL_TO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"QTL traits (TO)\", \"multiValued\": true, \"order\": 7 },\n \"domains__ancestors\": { \"group\": \"hierarchical\", \"label\": \"Domains\", \"multiValued\": true, \"order\": 4 },\n \"taxonomy__ancestors\": { \"group\": \"hierarchical\", \"label\": \"Taxonomy\", \"multiValued\": true, \"order\": 6 },\n \"supertree_attr_s\": { \"group\": \"homology\", \"label\": \"Supertree\", \"order\": 13 },\n \"gene_tree_root_taxon_id\": { \"group\": \"homology\", \"label\": \"Gene tree root taxon\", \"order\": 12 },\n \"protein__length\": { \"group\": \"structure\", \"label\": \"Protein length\" },\n \"transcript__count\": { \"group\": \"structure\", \"label\": \"Transcript count\" },\n \"transcript__exons\": { \"group\": \"structure\", \"label\": \"Exon count\" },\n \"transcript__length\": { \"group\": \"structure\", \"label\": \"Transcript length\" },\n \"expressed_in_gxa_attr_ss\": { \"group\": \"expression\", \"label\": \"Expressed in GXA\", \"multiValued\": true },\n\n \"MAKER__AED__attr_f\": { \"group\": \"MAKER\", \"label\": \"AED\", \"description\": \"Annotation Edit Distance\" },\n \"MAKER__QI1__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI1: Length of the 5' UTR\" },\n \"MAKER__QI2__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI2: Fraction of splice sites confirmed by EST\" },\n \"MAKER__QI3__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI3: Fraction of exons overlapping an EST\" },\n \"MAKER__QI4__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI4: Fraction of exons overlapping EST or protein\" },\n \"MAKER__QI5__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI5: Fraction of splice sites confirmed by SNAP\" },\n \"MAKER__QI6__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI6: Fraction of exons overlapping a SNAP\" },\n \"MAKER__QI7__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI7: Number of exons in the mRNA\" },\n \"MAKER__QI8__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI8: Length of the 3' UTR\" },\n \"MAKER__QI9__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI9: Length of the protein sequence\" },\n\n \"homology__all_orthologs\": { \"group\": \"homology\", \"label\": \"All orthologs\", \"multiValued\": true, \"order\": 15 },\n \"homology__ortholog_one2one\": { \"group\": \"homology\", \"label\": \"1:1 orthologs\", \"multiValued\": true, \"order\": 16 },\n \"homology__ortholog_one2many\": { \"group\": \"homology\", \"label\": \"1:many orthologs\", \"multiValued\": true, \"order\": 17 },\n \"homology__ortholog_many2many\": { \"group\": \"homology\", \"label\": \"Many:many orthologs\", \"multiValued\": true, \"order\": 18 },\n \"homology__syntenic_ortholog_one2one\":{ \"group\": \"homology\", \"label\": \"Syntenic 1:1 orthologs\", \"multiValued\": true, \"order\": 19 },\n \"homology__within_species_paralog\": { \"group\": \"homology\", \"label\": \"Within-species paralogs\", \"multiValued\": true, \"order\": 20 },\n\n \"pathways__ancestors\": { \"group\": \"hierarchical\", \"label\": \"Pathways\", \"multiValued\": true, \"order\": 5 },\n\n \"canonical_transcript__attr_s\": { \"group\": \"structure\", \"label\": \"Canonical transcript ID\" }\n },\n\n \"hidden\": [\n \"_version_\", \"_terms\", \"score\",\n \"gene_idx\", \"gene_idx_multi\", \"species_idx\",\n \"compara_idx\", \"compara_idx_multi\",\n \"_id\", \"annotations\", \"bins\", \"gene_structure\",\n \"homology\", \"location\", \"xrefs\",\n \"domain_roots\", \"familyRoot__ancestors\", \"taxonomy__ancestors\", \"capabilities\",\n \"saved_search\"\n ]}\n","export const study_info = {\n 'sorghum_bicolor': {\n '1': { label: 'Purdue EMS', type: 'EMS' },\n '2': { label: 'USDA Lubbock EMS', type: 'EMS' },\n '3': { label: 'Lozano', type: 'NAT' },\n '4': { label: 'USDA Lubbock EMS', type: 'EMS' },\n '5': { label: 'Boatwright SAP', type: 'NAT' },\n '7': { label: 'Kumar BAP', type: 'NAT' },\n '8': { label: 'Lasky landraces', type: 'NAT' },\n '9': { label: 'Sorghum Genomics Toolbox', type: 'NAT' }\n },\n 'zea_maysb73': {\n '15': { label: 'MaizeGDB 2024', type: 'NAT' }\n },\n 'oryza_sativa': {\n '7': { label: 'Rice 3K', type: 'NAT' },\n '20': { label: '19K-RGP', type: 'NAT' },\n '29': { label: 'Rice USDA mini core', type: 'NAT' },\n '38': { label: 'RAPDB 2024', type: 'NAT' }\n },\n 'oryza_aus': { '20': { label: '19K-RGP', type: 'NAT' } },\n 'oryza_sativa117425': { '20': { label: '19K-RGP', type: 'NAT' } },\n 'oryza_sativair64rs2': { '20': { label: '19K-RGP', type: 'NAT' } },\n 'oryza_sativamh63': { '20': { label: '19K-RGP', type: 'NAT' } }\n};\n","import { createSelector } from 'redux-bundler';\nimport { runExporterDownload } from '../components/exporter/downloadRunner';\n\nconst DEFAULT_FIELDS = ['id', 'name', 'system_name', 'biotype'];\nconst PREVIEW_ROWS = 20;\nconst PREVIEW_DEBOUNCE_MS = 250;\n\nfunction computePreviewSignature(store) {\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n return `${q}|${taxa.sort().join(',')}`;\n}\n\nlet debounceTimer = null;\nlet pendingRequestId = 0;\nlet pendingDownloadId = 0;\nlet currentDownloadController = null;\n\nconst markStale = (preview) => ({ ...preview, status: 'stale' });\n\nconst exporter = {\n name: 'exporter',\n\n getReducer: () => {\n const initialState = {\n selectedFields: DEFAULT_FIELDS,\n format: 'tsv',\n cutoffs: { exprMinTPM: 0.5, diffMaxPval: 0.05 },\n preview: { status: 'stale', data: null, error: null, requestId: 0, signature: null },\n download: { status: 'idle', progress: 0, total: 0, error: null, requestId: 0 }\n };\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'EXPORTER_FIELD_TOGGLED': {\n const idx = state.selectedFields.indexOf(payload);\n const selectedFields = idx === -1\n ? [...state.selectedFields, payload]\n : state.selectedFields.filter(f => f !== payload);\n return { ...state, selectedFields };\n }\n case 'EXPORTER_FIELDS_REORDERED':\n return { ...state, selectedFields: payload };\n case 'EXPORTER_FIELDS_BULK_SET': {\n const { names, selected } = payload;\n if (!Array.isArray(names) || names.length === 0) return state;\n if (selected) {\n const existing = new Set(state.selectedFields);\n const additions = names.filter(n => !existing.has(n));\n if (additions.length === 0) return state;\n return { ...state, selectedFields: [...state.selectedFields, ...additions] };\n }\n const remove = new Set(names);\n const next = state.selectedFields.filter(n => !remove.has(n));\n if (next.length === state.selectedFields.length) return state;\n return { ...state, selectedFields: next };\n }\n case 'EXPORTER_FORMAT_SET':\n return { ...state, format: payload };\n case 'EXPORTER_CUTOFFS_SET':\n return { ...state, cutoffs: { ...state.cutoffs, ...(payload || {}) } };\n case 'EXPORTER_FIELDS_CLEARED':\n return { ...state, selectedFields: [] };\n case 'EXPORTER_PREVIEW_INVALIDATED':\n return { ...state, preview: markStale(state.preview) };\n\n case 'EXPORTER_PREVIEW_STARTED':\n return {\n ...state,\n preview: { ...state.preview, status: 'loading', requestId: payload.requestId, error: null, signature: payload.signature }\n };\n case 'EXPORTER_PREVIEW_SUCCEEDED':\n if (payload.requestId !== state.preview.requestId) return state;\n return {\n ...state,\n preview: { status: 'ready', data: payload.data, error: null, requestId: payload.requestId, signature: state.preview.signature }\n };\n case 'EXPORTER_PREVIEW_FAILED':\n if (payload.requestId !== state.preview.requestId) return state;\n return {\n ...state,\n preview: { ...state.preview, status: 'error', error: payload.error }\n };\n\n case 'EXPORTER_DOWNLOAD_REQUESTED':\n return {\n ...state,\n download: { status: 'preparing', progress: 0, total: 0, error: null, requestId: payload.requestId }\n };\n case 'EXPORTER_DOWNLOAD_STARTED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'downloading', total: payload.total }\n };\n case 'EXPORTER_DOWNLOAD_PROGRESS':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, progress: payload.progress }\n };\n case 'EXPORTER_DOWNLOAD_COMPLETED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'done', progress: payload.written || state.download.progress }\n };\n case 'EXPORTER_DOWNLOAD_CANCELLED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'cancelled' }\n };\n case 'EXPORTER_DOWNLOAD_FAILED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'error', error: payload.error }\n };\n case 'EXPORTER_DOWNLOAD_RESET':\n return {\n ...state,\n download: { status: 'idle', progress: 0, total: 0, error: null, requestId: state.download.requestId }\n };\n default:\n return state;\n }\n };\n },\n\n doToggleExporterField: fieldName => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELD_TOGGLED', payload: fieldName }),\n\n doReorderExporterFields: fieldList => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELDS_REORDERED', payload: fieldList }),\n\n doBulkSetExporterFields: (names, selected) => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELDS_BULK_SET', payload: { names, selected } }),\n\n doSetExporterFormat: fmt => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FORMAT_SET', payload: fmt }),\n\n doSetExporterCutoffs: cutoffs => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_CUTOFFS_SET', payload: cutoffs }),\n\n doClearExporterFields: () => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELDS_CLEARED' }),\n\n doFetchExporterPreview: () => ({ dispatch, store }) => {\n clearTimeout(debounceTimer);\n const requestId = ++pendingRequestId;\n const signature = computePreviewSignature(store);\n dispatch({ type: 'EXPORTER_PREVIEW_STARTED', payload: { requestId, signature } });\n debounceTimer = setTimeout(() => {\n if (requestId !== pendingRequestId) return;\n\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n const fq = taxa.length ? `&fq=taxon_id:(${taxa.join(' OR ')})` : '';\n const url = `${api}/search?q=${q}&fl=*&rows=${PREVIEW_ROWS}${fq}`;\n\n fetch(url)\n .then(r => r.json())\n .then(json => {\n const docs = (json && json.response && json.response.docs) || [];\n dispatch({ type: 'EXPORTER_PREVIEW_SUCCEEDED', payload: { requestId, data: docs } });\n })\n .catch(err => {\n dispatch({ type: 'EXPORTER_PREVIEW_FAILED', payload: { requestId, error: String(err) } });\n });\n }, PREVIEW_DEBOUNCE_MS);\n },\n\n reactExporterPreview: createSelector(\n 'selectExporter',\n 'selectGrameneFiltersStatus',\n 'selectGrameneFiltersQueryString',\n 'selectGrameneGenomes',\n 'selectGrameneMaps',\n 'selectGrameneViewsOn',\n (exp, filtersStatus, q, g, m, viewsOn) => {\n if (!exp || !exp.preview) return;\n if (filtersStatus === 'init') return;\n if (exp.preview.status === 'loading') return;\n // Don't run the preview query unless the user has the exporter view open.\n if (!viewsOn || !viewsOn.has('export')) return;\n const maps = m || {};\n const taxa = Object.keys((g && g.active) || {}).filter(tid => maps[tid] && !maps[tid].hidden);\n const sig = `${q}|${taxa.sort().join(',')}`;\n if (exp.preview.signature === sig && exp.preview.status !== 'stale') return;\n return { actionCreator: 'doFetchExporterPreview' };\n }\n ),\n\n doStartExporterDownload: () => ({ dispatch, store }) => {\n if (currentDownloadController) {\n currentDownloadController.abort();\n }\n const requestId = ++pendingDownloadId;\n const controller = new AbortController();\n currentDownloadController = controller;\n dispatch({ type: 'EXPORTER_DOWNLOAD_REQUESTED', payload: { requestId } });\n\n const isSuperseded = () => requestId !== pendingDownloadId;\n\n runExporterDownload({\n dispatch,\n store,\n requestId,\n signal: controller.signal,\n isSuperseded\n }).catch(err => {\n if (err && err.name === 'AbortError') {\n dispatch({ type: 'EXPORTER_DOWNLOAD_CANCELLED', payload: { requestId } });\n } else {\n dispatch({ type: 'EXPORTER_DOWNLOAD_FAILED', payload: { requestId, error: String(err) } });\n }\n });\n },\n\n doCancelExporterDownload: () => ({ dispatch }) => {\n if (currentDownloadController) {\n currentDownloadController.abort();\n currentDownloadController = null;\n }\n pendingDownloadId++;\n },\n\n doResetExporterDownload: () => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_DOWNLOAD_RESET' }),\n\n selectExporter: state => state.exporter,\n selectExporterSelectedFields: state => state.exporter.selectedFields,\n selectExporterFormat: state => state.exporter.format,\n selectExporterCutoffs: state => state.exporter.cutoffs,\n selectExporterPreview: state => state.exporter.preview,\n selectExporterDownload: state => state.exporter.download\n};\n\nexport default exporter;\n","import { buildTableData, toJSONRows } from './formatters';\nimport { ANCESTOR_FIELD_MAP, collectAncestorIds } from './ancestorsResolver';\n\nconst PAGE_SIZE = 1000;\n\nfunction buildSearchURL(api, q, fl, rows, start, fq) {\n const params = [\n `q=${q}`,\n `rows=${rows}`,\n `start=${start}`,\n 'facet=false'\n ];\n if (fl) params.push(`fl=${encodeURIComponent(fl)}`);\n return `${api}/search?${params.join('&')}${fq}`;\n}\n\nfunction triggerBrowserSave(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 2000);\n}\n\nexport async function runExporterDownload({ dispatch, store, requestId, signal, isSuperseded }) {\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n const fq = taxa.length ? `&fq=taxon_id:(${taxa.join(' OR ')})` : '';\n const fields = store.selectExporterSelectedFields();\n const fl = fields.join(',');\n const format = store.selectExporterFormat();\n const catalog = store.selectFieldCatalog();\n const expressionStudies = store.selectExpressionStudies();\n const expressionSamples = store.selectExpressionSamples();\n const ancestorFields = fields.filter(n => ANCESTOR_FIELD_MAP[n]);\n\n const cutoffs = store.selectExporterCutoffs && store.selectExporterCutoffs();\n const buildResolverCtx = () => ({\n expressionStudies,\n expressionSamples,\n taxonomy: store.selectGrameneTaxonomy(),\n pathways: store.selectGramenePathways(),\n ontologies: store.selectOntologies(),\n cutoffs\n });\n\n const ensureAncestorRecords = async (docs) => {\n if (ancestorFields.length === 0 || docs.length === 0) return;\n const idsByOnt = collectAncestorIds(docs, ancestorFields);\n const waits = [];\n for (const [ontKey, ids] of Object.entries(idsByOnt)) {\n if (!ids.length) continue;\n if (ontKey === 'taxonomy') continue;\n if (ontKey === 'pathways') {\n const pathwaysCache = store.selectGramenePathways() || {};\n const missing = ids.filter(id => !pathwaysCache.hasOwnProperty(id));\n if (missing.length) store.doRequestGramenePathways(missing);\n continue;\n }\n const p = store.doEnsureOntologyRecords(ontKey, ids);\n if (p && typeof p.then === 'function') waits.push(p);\n }\n if (waits.length) await Promise.all(waits);\n };\n\n const fetchJSON = (url) => fetch(url, { signal }).then(r => {\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n return r.json();\n });\n\n const countUrl = buildSearchURL(api, q, 'id', 0, 0, fq);\n const countResp = await fetchJSON(countUrl);\n const total = (countResp && countResp.response && countResp.response.numFound) || 0;\n\n dispatch({ type: 'EXPORTER_DOWNLOAD_STARTED', payload: { requestId, total } });\n\n if (total === 0) {\n dispatch({ type: 'EXPORTER_DOWNLOAD_COMPLETED', payload: { requestId, written: 0 } });\n return;\n }\n\n const tsvPieces = [];\n const jsonRows = [];\n let progress = 0;\n\n if (format === 'tsv') {\n const { header } = buildTableData([], fields, catalog, buildResolverCtx());\n tsvPieces.push(header.join('\\t') + '\\n');\n }\n\n let start = 0;\n while (start < total) {\n if (isSuperseded()) {\n dispatch({ type: 'EXPORTER_DOWNLOAD_CANCELLED', payload: { requestId } });\n return;\n }\n const url = buildSearchURL(api, q, fl, PAGE_SIZE, start, fq);\n const resp = await fetchJSON(url);\n const docs = (resp && resp.response && resp.response.docs) || [];\n if (docs.length === 0) break;\n\n await ensureAncestorRecords(docs);\n const resolverCtx = buildResolverCtx();\n\n if (format === 'tsv') {\n const { rows } = buildTableData(docs, fields, catalog, resolverCtx);\n for (const row of rows) tsvPieces.push(row.join('\\t') + '\\n');\n } else {\n const rows = toJSONRows(docs, fields, resolverCtx);\n for (const r of rows) jsonRows.push(r);\n }\n\n start += docs.length;\n progress = start;\n dispatch({ type: 'EXPORTER_DOWNLOAD_PROGRESS', payload: { requestId, progress } });\n }\n\n if (isSuperseded()) {\n dispatch({ type: 'EXPORTER_DOWNLOAD_CANCELLED', payload: { requestId } });\n return;\n }\n\n const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, '-');\n let blob;\n let filename;\n if (format === 'tsv') {\n blob = new Blob(tsvPieces, { type: 'text/tab-separated-values' });\n filename = `gramene-export-${stamp}.tsv`;\n } else {\n blob = new Blob([JSON.stringify(jsonRows, null, 2)], { type: 'application/json' });\n filename = `gramene-export-${stamp}.json`;\n }\n\n triggerBrowserSave(blob, filename);\n dispatch({ type: 'EXPORTER_DOWNLOAD_COMPLETED', payload: { requestId, written: progress } });\n}\n","import {\n partitionFields,\n resolveExpressionForDoc,\n resolveDiffExpressionForDoc,\n EXPRESSION_EXTRA_COLUMNS,\n DIFFEXPRESSION_EXTRA_COLUMNS\n} from './expressionResolver';\nimport {\n ANCESTOR_FIELD_MAP,\n isAncestorField,\n formatAncestorsCellTSV,\n formatAncestorsJSON,\n resolveAncestorsForDoc,\n ANCESTOR_EXTRA_COLUMNS\n} from './ancestorsResolver';\n\nfunction scrubTSV(s) {\n return String(s).replace(/[\\t\\r\\n]/g, ' ');\n}\n\nfunction formatCellTSV(value) {\n if (value === null || value === undefined) return '';\n if (Array.isArray(value)) return value.map(formatCellTSV).join('|');\n if (typeof value === 'object') return JSON.stringify(value);\n return scrubTSV(value);\n}\n\nfunction formatDocFieldTSV(doc, name, resolverCtx) {\n if (isAncestorField(name)) {\n const ontKey = ANCESTOR_FIELD_MAP[name];\n const ids = Array.isArray(doc[name]) ? doc[name] : [];\n return scrubTSV(formatAncestorsCellTSV(ontKey, ids, doc.taxon_id, resolverCtx));\n }\n return formatCellTSV(doc[name]);\n}\n\nexport function buildTSVHeader(fieldNames, catalog) {\n return fieldNames.map(n => {\n const f = catalog && catalog.fields && catalog.fields[n];\n if (!f) return n;\n return f.tsvHeader || f.label;\n });\n}\n\nexport function buildTSVRow(doc, fieldNames, resolverCtx) {\n return fieldNames.map(n => formatDocFieldTSV(doc, n, resolverCtx));\n}\n\nconst EMPTY_EXPR_ROW = EXPRESSION_EXTRA_COLUMNS.map(() => '');\nconst EMPTY_DIFF_ROW = DIFFEXPRESSION_EXTRA_COLUMNS.map(() => '');\nconst EMPTY_ANC_ROW = ANCESTOR_EXTRA_COLUMNS.map(() => '');\n\nfunction exprRowToCells(er) {\n return [\n scrubTSV(er.experiment),\n scrubTSV(er.experiment_name),\n scrubTSV(er.assay),\n scrubTSV(er.sample),\n scrubTSV(er.value)\n ];\n}\n\nfunction diffRowToCells(dr) {\n return [\n scrubTSV(dr.diff_experiment),\n scrubTSV(dr.diff_experiment_name),\n scrubTSV(dr.group1_factors),\n scrubTSV(dr.group2_factors),\n scrubTSV(dr.l2fc),\n scrubTSV(dr.pval)\n ];\n}\n\nfunction ancRowToCells(ar) {\n return [\n scrubTSV(ar.hierarchy),\n scrubTSV(ar.term_id),\n scrubTSV(ar.term_name),\n scrubTSV(ar.term_type)\n ];\n}\n\nfunction splitPlainAndAncestor(nonExpressionFields) {\n const ancestorFields = [];\n const plainFields = [];\n for (const n of nonExpressionFields) {\n if (isAncestorField(n)) ancestorFields.push(n);\n else plainFields.push(n);\n }\n return { ancestorFields, plainFields };\n}\n\nfunction buildExpandedRows(docs, plainFields, ancestorFields, expressionFields, diffExpressionFields, resolverCtx) {\n const expressionStudies = resolverCtx && resolverCtx.expressionStudies;\n const expressionSamples = resolverCtx && resolverCtx.expressionSamples;\n const cutoffs = resolverCtx && resolverCtx.cutoffs;\n const hasExpr = expressionFields.length > 0;\n const hasDiff = diffExpressionFields.length > 0;\n const hasAnc = ancestorFields.length > 0;\n const rows = [];\n for (const doc of (docs || [])) {\n const baseCells = buildTSVRow(doc, plainFields, resolverCtx);\n const ancRows = hasAnc\n ? resolveAncestorsForDoc(doc, ancestorFields, resolverCtx)\n : [];\n const exprRows = hasExpr\n ? resolveExpressionForDoc(doc, expressionFields, expressionStudies, expressionSamples, cutoffs)\n : [];\n const diffRows = hasDiff\n ? resolveDiffExpressionForDoc(doc, diffExpressionFields, expressionStudies, expressionSamples, cutoffs)\n : [];\n const ancCells = ancRows.length ? ancRows.map(ancRowToCells) : (hasAnc ? [EMPTY_ANC_ROW] : [null]);\n const exprCells = exprRows.length ? exprRows.map(exprRowToCells) : (hasExpr ? [EMPTY_EXPR_ROW] : [null]);\n const diffCells = diffRows.length ? diffRows.map(diffRowToCells) : (hasDiff ? [EMPTY_DIFF_ROW] : [null]);\n for (const a of ancCells) {\n for (const e of exprCells) {\n for (const d of diffCells) {\n const out = [...baseCells];\n if (a) out.push(...a);\n if (e) out.push(...e);\n if (d) out.push(...d);\n rows.push(out);\n }\n }\n }\n }\n return rows;\n}\n\nexport function toTSV(docs, fieldNames, catalog, resolverCtx) {\n const { expressionFields, diffExpressionFields, nonExpressionFields } = partitionFields(fieldNames, catalog);\n const { ancestorFields, plainFields } = splitPlainAndAncestor(nonExpressionFields);\n\n if (expressionFields.length === 0 && diffExpressionFields.length === 0 && ancestorFields.length === 0) {\n const header = buildTSVHeader(fieldNames, catalog).join('\\t');\n const rows = (docs || []).map(d => buildTSVRow(d, fieldNames, resolverCtx).join('\\t'));\n return [header, ...rows].join('\\n');\n }\n\n const header = [\n ...buildTSVHeader(plainFields, catalog),\n ...(ancestorFields.length ? ANCESTOR_EXTRA_COLUMNS : []),\n ...(expressionFields.length ? EXPRESSION_EXTRA_COLUMNS : []),\n ...(diffExpressionFields.length ? DIFFEXPRESSION_EXTRA_COLUMNS : [])\n ].join('\\t');\n\n const rows = buildExpandedRows(docs, plainFields, ancestorFields, expressionFields, diffExpressionFields, resolverCtx);\n return [header, ...rows.map(r => r.join('\\t'))].join('\\n');\n}\n\nexport function buildTableData(docs, fieldNames, catalog, resolverCtx) {\n const { expressionFields, diffExpressionFields, nonExpressionFields } = partitionFields(fieldNames, catalog);\n const { ancestorFields, plainFields } = splitPlainAndAncestor(nonExpressionFields);\n\n if (expressionFields.length === 0 && diffExpressionFields.length === 0 && ancestorFields.length === 0) {\n return {\n header: buildTSVHeader(fieldNames, catalog),\n headerKeys: fieldNames.slice(),\n rows: (docs || []).map(d => buildTSVRow(d, fieldNames, resolverCtx))\n };\n }\n\n const header = [\n ...buildTSVHeader(plainFields, catalog),\n ...(ancestorFields.length ? ANCESTOR_EXTRA_COLUMNS : []),\n ...(expressionFields.length ? EXPRESSION_EXTRA_COLUMNS : []),\n ...(diffExpressionFields.length ? DIFFEXPRESSION_EXTRA_COLUMNS : [])\n ];\n const headerKeys = [\n ...plainFields,\n ...(ancestorFields.length ? ANCESTOR_EXTRA_COLUMNS : []),\n ...(expressionFields.length ? EXPRESSION_EXTRA_COLUMNS : []),\n ...(diffExpressionFields.length ? DIFFEXPRESSION_EXTRA_COLUMNS : [])\n ];\n const rows = buildExpandedRows(docs, plainFields, ancestorFields, expressionFields, diffExpressionFields, resolverCtx);\n return { header, headerKeys, rows };\n}\n\nexport function toJSONRows(docs, fieldNames, resolverCtx) {\n return (docs || []).map(d => {\n const row = {};\n for (const n of fieldNames) {\n if (isAncestorField(n)) {\n const ontKey = ANCESTOR_FIELD_MAP[n];\n const ids = Array.isArray(d[n]) ? d[n] : [];\n row[n] = formatAncestorsJSON(ontKey, ids, d.taxon_id, resolverCtx);\n } else {\n row[n] = d[n] !== undefined ? d[n] : null;\n }\n }\n return row;\n });\n}\n\nexport function toJSON(docs, fieldNames, resolverCtx) {\n return JSON.stringify(toJSONRows(docs, fieldNames, resolverCtx), null, 2);\n}\n","const EXPR_FIELD_RE = /^(E[-_][A-Za-z0-9_-]+?)_g(\\d+)__expr$/;\nconst DIFFEXPR_FIELD_RE = /^(E[-_][A-Za-z0-9_-]+?)_g(\\d+)_g(\\d+)_(pval|l2fc)_attr_([a-z])$/;\n\nexport const EXPRESSION_EXTRA_COLUMNS = [\n 'experiment',\n 'experiment_name',\n 'assay',\n 'sample',\n 'value'\n];\n\nexport const DIFFEXPRESSION_EXTRA_COLUMNS = [\n 'diff_experiment',\n 'diff_experiment_name',\n 'group1_factors',\n 'group2_factors',\n 'l2fc',\n 'pval'\n];\n\nexport function parseExprFieldName(name) {\n const m = name.match(EXPR_FIELD_RE);\n if (!m) return null;\n return {\n experimentId: m[1].replace(/_/g, '-'),\n group: 'g' + m[2],\n solrField: name\n };\n}\n\nexport function parseDiffExprFieldName(name) {\n const m = name.match(DIFFEXPR_FIELD_RE);\n if (!m) return null;\n return {\n experimentId: m[1].replace(/_/g, '-'),\n group1: 'g' + m[2],\n group2: 'g' + m[3],\n stat: m[4],\n solrField: name\n };\n}\n\nexport function isExpressionField(name, catalog) {\n const entry = catalog && catalog.fields && catalog.fields[name];\n if (entry && entry.expression) return true;\n return parseExprFieldName(name) !== null;\n}\n\nexport function isDiffExpressionField(name, catalog) {\n const entry = catalog && catalog.fields && catalog.fields[name];\n if (entry && entry.diffExpression) return true;\n return parseDiffExprFieldName(name) !== null;\n}\n\nexport function partitionFields(fieldNames, catalog) {\n const expressionFields = [];\n const diffExpressionFields = [];\n const nonExpressionFields = [];\n for (const n of fieldNames) {\n if (isDiffExpressionField(n, catalog)) diffExpressionFields.push(n);\n else if (isExpressionField(n, catalog)) expressionFields.push(n);\n else nonExpressionFields.push(n);\n }\n return { expressionFields, diffExpressionFields, nonExpressionFields };\n}\n\nfunction joinLabels(arr) {\n if (!Array.isArray(arr)) return '';\n return arr.map(f => f && f.label).filter(Boolean).join('; ');\n}\n\nexport function buildExperimentIndex(expressionStudies) {\n const index = {};\n if (!expressionStudies) return index;\n for (const arr of Object.values(expressionStudies)) {\n if (!Array.isArray(arr)) continue;\n for (const e of arr) if (e && e._id) index[e._id] = e;\n }\n return index;\n}\n\nfunction findAssay(expressionSamples, experimentId, group) {\n if (!expressionSamples) return null;\n const arr = expressionSamples[experimentId];\n if (!arr) return null;\n return arr.find(a => a.group === group) || null;\n}\n\nexport function resolveExpressionForDoc(doc, expressionFields, expressionStudies, expressionSamples, cutoffs) {\n const rows = [];\n const experimentIndex = buildExperimentIndex(expressionStudies);\n const minTPM = cutoffs && cutoffs.exprMinTPM;\n const minTPMActive = minTPM !== null && minTPM !== undefined && minTPM !== '' && Number.isFinite(+minTPM);\n for (const fieldName of expressionFields) {\n const parsed = parseExprFieldName(fieldName);\n if (!parsed) continue;\n const val = doc[fieldName];\n if (val === undefined || val === null) continue;\n if (minTPMActive && (!Number.isFinite(+val) || +val < +minTPM)) continue;\n const exp = experimentIndex[parsed.experimentId];\n const assay = findAssay(expressionSamples, parsed.experimentId, parsed.group);\n rows.push({\n field: fieldName,\n experiment: parsed.experimentId,\n experiment_name: exp ? (exp.description || exp.title || exp.name || '') : '',\n assay: parsed.group,\n sample: assay ? joinLabels(assay.factor) || joinLabels(assay.characteristic) : '',\n value: val\n });\n }\n return rows;\n}\n\nexport function resolveDiffExpressionForDoc(doc, diffExpressionFields, expressionStudies, expressionSamples, cutoffs) {\n const experimentIndex = buildExperimentIndex(expressionStudies);\n const byContrast = new Map();\n for (const fieldName of diffExpressionFields) {\n const parsed = parseDiffExprFieldName(fieldName);\n if (!parsed) continue;\n const val = doc[fieldName];\n if (val === undefined || val === null) continue;\n const key = `${parsed.experimentId}|${parsed.group1}|${parsed.group2}`;\n let entry = byContrast.get(key);\n if (!entry) {\n entry = {\n experimentId: parsed.experimentId,\n group1: parsed.group1,\n group2: parsed.group2,\n pval: '',\n l2fc: ''\n };\n byContrast.set(key, entry);\n }\n if (parsed.stat === 'pval') entry.pval = val;\n else entry.l2fc = val;\n }\n const maxPval = cutoffs && cutoffs.diffMaxPval;\n const maxPvalActive = maxPval !== null && maxPval !== undefined && maxPval !== '' && Number.isFinite(+maxPval);\n const rows = [];\n for (const entry of byContrast.values()) {\n if (maxPvalActive) {\n const pv = +entry.pval;\n if (!Number.isFinite(pv) || pv > +maxPval) continue;\n }\n const exp = experimentIndex[entry.experimentId];\n const assay1 = findAssay(expressionSamples, entry.experimentId, entry.group1);\n const assay2 = findAssay(expressionSamples, entry.experimentId, entry.group2);\n rows.push({\n diff_experiment: entry.experimentId,\n diff_experiment_name: exp ? (exp.description || exp.title || exp.name || '') : '',\n group1_factors: assay1 ? joinLabels(assay1.factor) || joinLabels(assay1.characteristic) : entry.group1,\n group2_factors: assay2 ? joinLabels(assay2.factor) || joinLabels(assay2.characteristic) : entry.group2,\n l2fc: entry.l2fc,\n pval: entry.pval\n });\n }\n return rows;\n}\n","// Maps gene-doc field name -> ontology key used for resolution.\nexport const ANCESTOR_FIELD_MAP = {\n GO__ancestors: 'GO',\n PO__ancestors: 'PO',\n TO__ancestors: 'TO',\n QTL_TO__ancestors: 'TO',\n domains__ancestors: 'domains',\n pathways__ancestors: 'pathways',\n taxonomy__ancestors: 'taxonomy'\n};\n\n// Display label used in the \"hierarchy\" column.\nexport const ANCESTOR_HIERARCHY_LABEL = {\n GO__ancestors: 'Gene Ontology',\n PO__ancestors: 'Plant Ontology',\n TO__ancestors: 'Trait Ontology',\n QTL_TO__ancestors: 'Trait Ontology',\n domains__ancestors: 'InterPro',\n pathways__ancestors: 'Plant Reactome',\n taxonomy__ancestors: 'Taxonomy'\n};\n\nexport const ANCESTOR_EXTRA_COLUMNS = [\n 'hierarchy',\n 'term_id',\n 'term_name',\n 'term_type'\n];\n\nexport function isAncestorField(name) {\n return Object.prototype.hasOwnProperty.call(ANCESTOR_FIELD_MAP, name);\n}\n\nexport function partitionAncestorFields(fieldNames) {\n const ancestor = [];\n const plain = [];\n for (const n of fieldNames) {\n if (isAncestorField(n)) ancestor.push(n);\n else plain.push(n);\n }\n return { ancestor, plain };\n}\n\n// Gather the ids referenced across docs for each ontology/field.\nexport function collectAncestorIds(docs, fieldNames) {\n const byOnt = {};\n for (const name of fieldNames) {\n const ont = ANCESTOR_FIELD_MAP[name];\n if (!ont) continue;\n if (!byOnt[ont]) byOnt[ont] = new Set();\n for (const d of (docs || [])) {\n const v = d && d[name];\n if (!Array.isArray(v)) continue;\n for (const id of v) if (id != null) byOnt[ont].add(+id);\n }\n }\n const out = {};\n for (const k of Object.keys(byOnt)) out[k] = Array.from(byOnt[k]);\n return out;\n}\n\nfunction getOntologyRecord(ontKey, id, ctx) {\n if (!ctx) return null;\n const idNum = +id;\n if (ontKey === 'taxonomy') {\n const t = ctx.taxonomy;\n return (t && t[idNum]) || null;\n }\n if (ontKey === 'pathways') {\n const p = ctx.pathways;\n return (p && p[idNum]) || null;\n }\n const bucket = ctx.ontologies && ctx.ontologies[ontKey];\n return (bucket && bucket[idNum]) || null;\n}\n\n// Returns list of ancestor ids *excluding* self.\nfunction ancestorsOfRecord(ontKey, record, docTaxonId, ctx) {\n if (!record) return null;\n if (ontKey === 'taxonomy') {\n const visited = new Set();\n const stack = Array.isArray(record.is_a) ? record.is_a.slice() : [];\n const taxonomy = (ctx && ctx.taxonomy) || {};\n while (stack.length) {\n const pid = +stack.pop();\n if (visited.has(pid)) continue;\n visited.add(pid);\n const parent = taxonomy[pid];\n if (parent && Array.isArray(parent.is_a)) {\n for (const g of parent.is_a) if (!visited.has(+g)) stack.push(g);\n }\n }\n return Array.from(visited);\n }\n if (ontKey === 'pathways') {\n const taxonKey = docTaxonId != null ? `ancestors_${docTaxonId}` : null;\n let arr = taxonKey && record[taxonKey];\n if (!Array.isArray(arr)) {\n const collected = new Set();\n for (const k of Object.keys(record)) {\n if (k.startsWith('ancestors_') && Array.isArray(record[k])) {\n for (const a of record[k]) collected.add(+a);\n }\n }\n arr = Array.from(collected);\n }\n return arr.filter(x => +x !== +record._id);\n }\n // GO / PO / TO / domains — `ancestors` already includes self\n if (Array.isArray(record.ancestors)) {\n return record.ancestors.filter(x => +x !== +record._id);\n }\n return [];\n}\n\nexport function mostSpecific(ontKey, ids, docTaxonId, ctx) {\n if (!Array.isArray(ids) || ids.length === 0) return [];\n const ancestorSet = new Set();\n let anyResolved = false;\n for (const id of ids) {\n const rec = getOntologyRecord(ontKey, id, ctx);\n if (!rec || rec.missing) continue;\n anyResolved = true;\n const anc = ancestorsOfRecord(ontKey, rec, docTaxonId, ctx);\n if (!anc) continue;\n for (const a of anc) ancestorSet.add(+a);\n }\n if (!anyResolved) return ids.slice();\n return ids.filter(id => !ancestorSet.has(+id));\n}\n\nfunction displayIdAndName(ontKey, id, ctx) {\n const rec = getOntologyRecord(ontKey, id, ctx);\n if (!rec || rec.missing) return { id: String(id), name: '' };\n const displayId = rec.id != null ? String(rec.id) : String(rec._id != null ? rec._id : id);\n let name = rec.name || '';\n if (ontKey === 'taxonomy' && !name) name = rec.display_name || '';\n return { id: displayId, name: String(name) };\n}\n\nexport function formatAncestorsCellTSV(ontKey, ids, docTaxonId, ctx) {\n const specific = mostSpecific(ontKey, ids, docTaxonId, ctx);\n return specific.map(id => {\n const { id: disp, name } = displayIdAndName(ontKey, id, ctx);\n return name ? `${disp} ${name}` : disp;\n }).join(';');\n}\n\nexport function formatAncestorsJSON(ontKey, ids, docTaxonId, ctx) {\n const specific = mostSpecific(ontKey, ids, docTaxonId, ctx);\n return specific.map(id => displayIdAndName(ontKey, id, ctx));\n}\n\nfunction termTypeForRecord(ontKey, rec) {\n if (!rec) return '';\n if (ontKey === 'GO') return rec.namespace || rec.type || '';\n if (ontKey === 'taxonomy') return rec.rank || '';\n return rec.type || rec.namespace || '';\n}\n\n// Expand a doc's selected ancestor fields into rows of\n// { hierarchy, term_id, term_name, term_type }, one per most-specific term.\nexport function resolveAncestorsForDoc(doc, ancestorFields, ctx) {\n const rows = [];\n for (const fieldName of ancestorFields) {\n const ontKey = ANCESTOR_FIELD_MAP[fieldName];\n if (!ontKey) continue;\n const ids = Array.isArray(doc[fieldName]) ? doc[fieldName] : [];\n if (!ids.length) continue;\n const specific = mostSpecific(ontKey, ids, doc.taxon_id, ctx);\n const hierarchy = ANCESTOR_HIERARCHY_LABEL[fieldName] || fieldName;\n for (const id of specific) {\n const rec = getOntologyRecord(ontKey, id, ctx);\n const { id: disp, name } = displayIdAndName(ontKey, id, ctx);\n rows.push({\n hierarchy,\n term_id: disp,\n term_name: name,\n term_type: termTypeForRecord(ontKey, rec)\n });\n }\n }\n return rows;\n}\n","import { getConfiguredCache } from 'money-clip';\n\nconst ONT_KEYS = ['GO', 'PO', 'TO', 'domains'];\n\n// Dedicated IndexedDB store for ontology records. The full term set per\n// ontology is stable enough to keep around indefinitely (default maxAge of\n// `Infinity`), and we don't want it to share the short TTL of the app-wide\n// cache configured in demo.js.\nconst cache = getConfiguredCache({\n version: 1,\n name: 'gramene_ontologies'\n});\n\nconst inflight = {};\n\nconst ontologies = {\n name: 'ontologies',\n\n getReducer: () => {\n const initialState = { GO: {}, PO: {}, TO: {}, domains: {}, loaded: {} };\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'ONTOLOGY_BULK_LOADED':\n return {\n ...state,\n [payload.key]: payload.records,\n loaded: { ...state.loaded, [payload.key]: true }\n };\n default:\n return state;\n }\n };\n },\n\n // Signature kept for backward compatibility — the `ids` argument is\n // ignored. On first call per ontology key we load the full term set\n // (cache hit if available, otherwise `${api}/${key}?rows=-1`) and\n // dispatch a single bulk load. Subsequent calls are no-ops.\n doEnsureOntologyRecords: (key, _ids) => ({ dispatch, store }) => {\n if (!ONT_KEYS.includes(key)) return Promise.resolve();\n const state = store.selectOntologies();\n if (state.loaded && state.loaded[key]) return Promise.resolve();\n if (inflight[key]) return inflight[key];\n\n inflight[key] = cache.get(key)\n .then(cached => {\n if (cached) {\n dispatch({ type: 'ONTOLOGY_BULK_LOADED', payload: { key, records: cached } });\n return;\n }\n const api = store.selectGrameneAPI();\n return fetch(`${api}/${key}?rows=-1`)\n .then(r => r.json())\n .then(docs => {\n const records = {};\n for (const d of (docs || [])) {\n if (d && d._id != null) records[d._id] = d;\n }\n dispatch({ type: 'ONTOLOGY_BULK_LOADED', payload: { key, records } });\n cache.set(key, records).catch(e => console.warn('Failed to cache ontology', key, e));\n });\n })\n .catch(err => {\n console.error(`Failed to load ontology ${key}`, err);\n })\n .finally(() => {\n delete inflight[key];\n });\n\n return inflight[key];\n },\n\n selectOntologies: state => state.ontologies\n};\n\nexport default ontologies;\n","import { createSelector } from 'redux-bundler';\n\n// State shape:\n// {\n// pivot: { status, signature, data: { [taxon_id]: <gene count> }, error, requestId },\n// activeTaxon: <taxon_id|null>,\n// byTaxon: {\n// [taxon_id]: {\n// selectedFields: [<solr field name>...],\n// fieldsModalOpen: <bool>,\n// fetch: { status, offset, total, signature, requestId, error },\n// rows: [<doc>...]\n// }\n// }\n// }\n// Per-taxon study lists are derived in the view layer from expressionStudies.\n\nconst PAGE_SIZE = 200;\n\nlet pivotPendingId = 0;\nconst fetchPending = {}; // per-taxon request id\nconst attrsPending = {}; // per-taxon request id for available attrs\nconst existencePending = {}; // per-taxon request id for field-existence check\n\nfunction pivotSignature(store) {\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n return `${q}|${taxa.sort().join(',')}`;\n}\n\nfunction fetchSignature(store, taxon) {\n const q = store.selectGrameneFiltersQueryString();\n const ev = store.selectExprViz();\n const sel = (ev.byTaxon[taxon] && ev.byTaxon[taxon].selectedFields) || [];\n return `${q}|${taxon}|${sel.slice().sort().join(',')}`;\n}\n\nconst ALWAYS_FL = ['id', 'name', 'system_name', 'taxon_id'];\n\nconst exprViz = {\n name: 'exprViz',\n\n getReducer: () => {\n const initialState = {\n pivot: { status: 'idle', signature: null, data: {}, error: null, requestId: 0 },\n activeTaxon: null,\n byTaxon: {}\n };\n\n function ensureTaxon(state, taxon) {\n if (state.byTaxon[taxon]) return state.byTaxon[taxon];\n return {\n selectedFields: [],\n fieldsModalOpen: false,\n fetch: { status: 'idle', offset: 0, total: 0, signature: null, requestId: 0, error: null },\n rows: [],\n availableAttrs: null,\n attrsSignature: null,\n attrsRequestId: 0,\n fieldExistence: null,\n existenceStatus: 'idle',\n existenceSignature: null,\n existenceRequestId: 0\n };\n }\n\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'EXPRVIZ_PIVOT_STARTED':\n return { ...state, pivot: { status: 'loading', signature: payload.signature, data: state.pivot.data, error: null, requestId: payload.requestId } };\n case 'EXPRVIZ_PIVOT_SUCCEEDED':\n if (payload.requestId !== state.pivot.requestId) return state;\n return { ...state, pivot: { status: 'ready', signature: state.pivot.signature, data: payload.data, error: null, requestId: payload.requestId } };\n case 'EXPRVIZ_PIVOT_FAILED':\n if (payload.requestId !== state.pivot.requestId) return state;\n return { ...state, pivot: { ...state.pivot, status: 'error', error: payload.error } };\n\n case 'EXPRVIZ_ACTIVE_TAXON_SET':\n return { ...state, activeTaxon: payload };\n\n case 'EXPRVIZ_FIELDS_MODAL_TOGGLED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: { ...state.byTaxon, [payload.taxon]: { ...t, fieldsModalOpen: payload.open } }\n };\n }\n case 'EXPRVIZ_FIELDS_SET': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n selectedFields: payload.fields,\n rows: [],\n fetch: { status: 'idle', offset: 0, total: 0, signature: null, requestId: 0, error: null }\n }\n }\n };\n }\n case 'EXPRVIZ_FIELDS_REORDERED': {\n const t = state.byTaxon[payload.taxon];\n if (!t) return state;\n // Same set of fields — preserve rows; only the column/axis order changes.\n const setA = new Set(t.selectedFields);\n const setB = new Set(payload.fields);\n if (setA.size !== setB.size || ![...setA].every(f => setB.has(f))) {\n return state;\n }\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, selectedFields: payload.fields }\n }\n };\n }\n\n case 'EXPRVIZ_FETCH_STARTED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n fetch: { ...t.fetch, status: 'loading', signature: payload.signature, requestId: payload.requestId, error: null }\n }\n }\n };\n }\n case 'EXPRVIZ_FETCH_BATCH': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fetch.requestId) return state;\n const rows = t.rows.concat(payload.docs);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n rows,\n fetch: { ...t.fetch, offset: rows.length, total: payload.total, status: rows.length >= payload.total ? 'done' : 'loading' }\n }\n }\n };\n }\n case 'EXPRVIZ_FETCH_FAILED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fetch.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, fetch: { ...t.fetch, status: 'error', error: payload.error } }\n }\n };\n }\n\n case 'EXPRVIZ_ATTRS_STARTED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, attrsRequestId: payload.requestId, attrsSignature: payload.signature }\n }\n };\n }\n case 'EXPRVIZ_ATTRS_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.attrsRequestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, availableAttrs: payload.attrs }\n }\n };\n }\n\n case 'EXPRVIZ_EXISTENCE_STARTED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n existenceStatus: 'loading',\n existenceRequestId: payload.requestId,\n existenceSignature: payload.signature\n }\n }\n };\n }\n case 'EXPRVIZ_EXISTENCE_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.existenceRequestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, existenceStatus: 'ready', fieldExistence: payload.counts }\n }\n };\n }\n\n case 'GRAMENE_SEARCH_CLEARED': {\n // Search context changed — invalidate pivot and any loaded rows.\n // Selected fields are kept so the user can re-run the load.\n const newByTaxon = {};\n for (const tid of Object.keys(state.byTaxon)) {\n newByTaxon[tid] = {\n ...state.byTaxon[tid],\n rows: [],\n fetch: { status: 'idle', offset: 0, total: 0, signature: null, requestId: 0, error: null },\n availableAttrs: null,\n attrsSignature: null,\n fieldExistence: null,\n existenceStatus: 'idle',\n existenceSignature: null\n };\n }\n return {\n ...state,\n pivot: { status: 'idle', signature: null, data: {}, error: null, requestId: 0 },\n byTaxon: newByTaxon\n };\n }\n\n default:\n return state;\n }\n };\n },\n\n doFetchExprVizPivot: () => ({ dispatch, store }) => {\n const requestId = ++pivotPendingId;\n const signature = pivotSignature(store);\n dispatch({ type: 'EXPRVIZ_PIVOT_STARTED', payload: { requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n const fq = taxa.length ? `&fq=taxon_id:(${taxa.join(' OR ')})` : '';\n const facetField = \"{!facet.limit='300' facet.mincount='1' key='taxon_id'}taxon_id\";\n const url = `${api}/search?q=${q}${fq}&fq=expressed_in_gxa_attr_ss:*&rows=0&facet=true&facet.field=${facetField}`;\n\n fetch(url)\n .then(r => r.json())\n .then(json => {\n const arr = (json && json.facet_counts && json.facet_counts.facet_fields && json.facet_counts.facet_fields.taxon_id) || [];\n const data = {};\n for (let i = 0; i < arr.length; i += 2) {\n data[arr[i]] = arr[i + 1];\n }\n if (Object.keys(data).length === 0) {\n console.warn('[exprViz] no taxon_ids found with expression', { url, json });\n }\n dispatch({ type: 'EXPRVIZ_PIVOT_SUCCEEDED', payload: { requestId, data } });\n })\n .catch(err => {\n dispatch({ type: 'EXPRVIZ_PIVOT_FAILED', payload: { requestId, error: String(err) } });\n });\n },\n\n doSetExprVizActiveTaxon: tid => ({ dispatch }) =>\n dispatch({ type: 'EXPRVIZ_ACTIVE_TAXON_SET', payload: tid }),\n\n doToggleExprVizFieldsModal: (taxon, open) => ({ dispatch, store }) => {\n dispatch({ type: 'EXPRVIZ_FIELDS_MODAL_TOGGLED', payload: { taxon, open: !!open } });\n if (open) store.doFetchExprVizAvailableAttrs(taxon);\n },\n\n doFetchExprVizAvailableAttrs: taxon => ({ dispatch, store }) => {\n const q = store.selectGrameneFiltersQueryString();\n const signature = `${q}|${taxon}`;\n const ev = store.selectExprViz();\n const t = ev.byTaxon[taxon];\n if (t && t.availableAttrs && t.attrsSignature === signature) return;\n const requestId = (attrsPending[taxon] = (attrsPending[taxon] || 0) + 1);\n dispatch({ type: 'EXPRVIZ_ATTRS_STARTED', payload: { taxon, requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const facetField = \"{!facet.limit='2000' facet.mincount='1' key='attrs'}expressed_in_gxa_attr_ss\";\n const url = `${api}/search?q=${q}&fq=taxon_id:${taxon}&fq=expressed_in_gxa_attr_ss:*&rows=0&facet=true&facet.field=${facetField}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== attrsPending[taxon]) return;\n const arr = (json && json.facet_counts && json.facet_counts.facet_fields && json.facet_counts.facet_fields.attrs) || [];\n const attrs = [];\n for (let i = 0; i < arr.length; i += 2) attrs.push(arr[i]);\n dispatch({ type: 'EXPRVIZ_ATTRS_SUCCEEDED', payload: { taxon, requestId, attrs } });\n })\n .catch(() => { /* swallow — non-fatal; modal still works without filtering */ });\n },\n\n doSetExprVizFields: (taxon, fields) => ({ dispatch }) =>\n dispatch({ type: 'EXPRVIZ_FIELDS_SET', payload: { taxon, fields } }),\n\n doReorderExprVizFields: (taxon, fields) => ({ dispatch }) =>\n dispatch({ type: 'EXPRVIZ_FIELDS_REORDERED', payload: { taxon, fields } }),\n\n doFetchExprVizData: taxon => ({ dispatch, store }) => {\n const ev = store.selectExprViz();\n const t = ev.byTaxon[taxon];\n if (!t || t.selectedFields.length === 0) return;\n const requestId = (fetchPending[taxon] = (fetchPending[taxon] || 0) + 1);\n const signature = fetchSignature(store, taxon);\n dispatch({ type: 'EXPRVIZ_FETCH_STARTED', payload: { taxon, requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const fl = [...new Set([...ALWAYS_FL, ...t.selectedFields])].join(',');\n\n const fetchPage = (offset) => {\n if (requestId !== fetchPending[taxon]) return; // superseded\n const url = `${api}/search?q=${q}&fq=taxon_id:${taxon}&fl=${fl}&rows=${PAGE_SIZE}&start=${offset}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== fetchPending[taxon]) return;\n const docs = (json.response && json.response.docs) || [];\n const total = (json.response && json.response.numFound) || 0;\n dispatch({ type: 'EXPRVIZ_FETCH_BATCH', payload: { taxon, requestId, docs, total } });\n const next = offset + docs.length;\n if (docs.length > 0 && next < total) {\n fetchPage(next);\n }\n })\n .catch(err => {\n dispatch({ type: 'EXPRVIZ_FETCH_FAILED', payload: { taxon, requestId, error: String(err) } });\n });\n };\n fetchPage(0);\n },\n\n // Per-candidate-field non-null counts under the current q + taxon. Used by\n // FieldsModal to hide fields that have no data in the current result set\n // before the user picks. Uses stats.field (the swagger whitelist drops\n // facet.query) batched across multiple GETs to stay under URL limits.\n doFetchExprVizFieldExistence: (taxon, fields) => ({ dispatch, store }) => {\n if (!fields || fields.length === 0) return;\n const q = store.selectGrameneFiltersQueryString();\n const fieldsKey = fields.slice().sort().join(',');\n const signature = `${q}|${taxon}|${fieldsKey}`;\n const ev = store.selectExprViz();\n const t = ev.byTaxon[taxon];\n if (t && t.fieldExistence && t.existenceSignature === signature) return;\n\n const requestId = (existencePending[taxon] = (existencePending[taxon] || 0) + 1);\n dispatch({ type: 'EXPRVIZ_EXISTENCE_STARTED', payload: { taxon, requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const BATCH_SIZE = 40;\n const batches = [];\n for (let i = 0; i < fields.length; i += BATCH_SIZE) {\n batches.push(fields.slice(i, i + BATCH_SIZE));\n }\n\n Promise.all(batches.map(batch => {\n const params = new URLSearchParams();\n params.append('q', q);\n params.append('fq', `taxon_id:${taxon}`);\n params.append('rows', '0');\n params.append('stats', 'true');\n batch.forEach(f => params.append('stats.field', f));\n return fetch(`${api}/search?${params.toString()}`)\n .then(r => r.json())\n .then(json => {\n const sf = (json && json.stats && json.stats.stats_fields) || {};\n const out = {};\n for (const f of Object.keys(sf)) {\n const s = sf[f];\n out[f] = s && typeof s.count === 'number' ? s.count : 0;\n }\n return out;\n });\n }))\n .then(results => {\n if (requestId !== existencePending[taxon]) return;\n const counts = Object.assign({}, ...results);\n dispatch({ type: 'EXPRVIZ_EXISTENCE_SUCCEEDED', payload: { taxon, requestId, counts } });\n })\n .catch(() => { /* swallow — non-fatal; modal falls back to showing all */ });\n },\n\n reactExprVizPivot: createSelector(\n 'selectExprViz',\n 'selectGrameneFiltersStatus',\n 'selectGrameneViews',\n 'selectGrameneFiltersQueryString',\n 'selectGrameneGenomes',\n 'selectGrameneMaps',\n (ev, filtersStatus, views, q, g, m) => {\n if (!ev || filtersStatus === 'init') return;\n const onView = views && views.options && views.options.find(v => v.id === 'exprViz');\n if (!onView || onView.show !== 'on') return;\n const maps = m || {};\n const taxa = Object.keys((g && g.active) || {}).filter(tid => maps[tid] && !maps[tid].hidden);\n const sig = `${q}|${taxa.sort().join(',')}`;\n if (ev.pivot.status === 'loading') return;\n if (ev.pivot.signature === sig && ev.pivot.status === 'ready') return;\n return { actionCreator: 'doFetchExprVizPivot' };\n }\n ),\n\n selectExprViz: state => state.exprViz,\n selectExprVizPivot: state => state.exprViz.pivot,\n selectExprVizActiveTaxon: state => state.exprViz.activeTaxon,\n selectExprVizByTaxon: state => state.exprViz.byTaxon\n};\n\nexport default exprViz;\n","import { createSelector } from 'redux-bundler';\n\n// Ontology over-representation analysis (clusterProfiler::enrichGO-style).\n//\n// For each species tab we run:\n// foreground: q=<filters>&fq=taxon_id:<tid>&rows=0 + facet on six __ancestors fields\n// background: q=taxon_id:<tid>&rows=0 + same facets (cached forever per tid)\n//\n// For every ontology section we compute a single hypergeometric universe:\n// N = # genes annotated to any term in this ontology section (= largest bg facet count)\n// K = # input genes annotated to any term in this section (= largest fg facet count)\n// and per term:\n// M = bg facet count, count = fg facet count\n// p = P(X >= count), X ~ Hypergeometric(N, M, K)\n// p-values are BH-adjusted across the tested terms in the section.\n// GO is split into its three sub-ontologies (BP/MF/CC) by namespace so each\n// gets its own (N, K) and BH correction, matching enrichGO. Terms with\n// fewer than `minGSSize` or more than `maxGSSize` annotated genes are\n// dropped before testing (enrichGO defaults: 10 / 500).\n\nconst ONTOLOGIES = [\n { key: 'GO', field: 'GO__ancestors', label: 'Gene Ontology', bucket: 'GO' },\n { key: 'PO', field: 'PO__ancestors', label: 'Plant Ontology', bucket: 'PO' },\n { key: 'TO', field: 'TO__ancestors', label: 'Trait Ontology', bucket: 'TO' },\n { key: 'QTL_TO', field: 'QTL_TO__ancestors', label: 'QTL Traits (TO)', bucket: 'TO' },\n { key: 'domains', field: 'domains__ancestors', label: 'InterPro Domains', bucket: 'domains' },\n { key: 'pathways', field: 'pathways__ancestors', label: 'Pathways', bucket: null }\n];\n\nconst FACET_PARAMS = ONTOLOGIES.map(o =>\n `facet.field=${encodeURIComponent(`{!facet.limit=10000 facet.mincount=1 key=${o.key}}${o.field}`)}`\n).join('&');\n\nconst fgPending = {};\nconst bgPending = {};\n\nfunction fgSig(q, taxon) { return `${q}|${taxon}`; }\nfunction bgSig(taxon) { return `bg|${taxon}`; }\n\nfunction parseFacets(json) {\n const out = {};\n const ff = (json && json.facet_counts && json.facet_counts.facet_fields) || {};\n for (const o of ONTOLOGIES) {\n const arr = ff[o.key] || [];\n const map = {};\n for (let i = 0; i < arr.length; i += 2) {\n map[+arr[i]] = +arr[i + 1];\n }\n out[o.key] = map;\n }\n return out;\n}\n\nconst ontologyEnrichment = {\n name: 'ontologyEnrichment',\n\n // Background facet counts depend only on the species — they're invariant\n // across filter changes and across sessions, so we persist whenever a bg\n // fetch completes. Foreground state piggybacks on the same write but is\n // self-invalidated by the signature check in the reactor.\n persistActions: ['ONTOLOGY_ENRICHMENT_BG_SUCCEEDED'],\n\n getReducer: () => {\n const initialState = {\n activeTaxon: null,\n byTaxon: {},\n ui: {\n pAdjCutoff: 0.05,\n minGSSize: 10,\n maxGSSize: 500,\n mostSpecific: false,\n ontology: 'all',\n search: ''\n }\n };\n\n function ensureTaxon(state, tid) {\n if (state.byTaxon[tid]) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [tid]: {\n fg: { status: 'idle', signature: null, requestId: 0, terms: null, numFound: 0, error: null },\n bg: { status: 'idle', signature: null, requestId: 0, terms: null, numFound: 0, error: null }\n }\n }\n };\n }\n\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'ONTOLOGY_ENRICHMENT_ACTIVE_TAXON_SET':\n return { ...ensureTaxon(state, payload), activeTaxon: payload };\n\n case 'ONTOLOGY_ENRICHMENT_UI_SET':\n return { ...state, ui: { ...state.ui, ...(payload || {}) } };\n\n case 'ONTOLOGY_ENRICHMENT_FG_STARTED': {\n const next = ensureTaxon(state, payload.taxon);\n const t = next.byTaxon[payload.taxon];\n return {\n ...next,\n byTaxon: {\n ...next.byTaxon,\n [payload.taxon]: {\n ...t,\n fg: { status: 'loading', signature: payload.signature, requestId: payload.requestId, terms: t.fg.terms, numFound: t.fg.numFound, error: null }\n }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_FG_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, fg: { ...t.fg, status: 'ready', terms: payload.terms, numFound: payload.numFound } }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_FG_FAILED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, fg: { ...t.fg, status: 'error', error: payload.error } }\n }\n };\n }\n\n case 'ONTOLOGY_ENRICHMENT_BG_STARTED': {\n const next = ensureTaxon(state, payload.taxon);\n const t = next.byTaxon[payload.taxon];\n return {\n ...next,\n byTaxon: {\n ...next.byTaxon,\n [payload.taxon]: {\n ...t,\n bg: { status: 'loading', signature: payload.signature, requestId: payload.requestId, terms: t.bg.terms, numFound: t.bg.numFound, error: null }\n }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_BG_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.bg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, bg: { ...t.bg, status: 'ready', terms: payload.terms, numFound: payload.numFound } }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_BG_FAILED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.bg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, bg: { ...t.bg, status: 'error', error: payload.error } }\n }\n };\n }\n\n case 'GRAMENE_SEARCH_CLEARED': {\n // Filters changed — invalidate foreground but keep background\n // (it depends only on taxon).\n const newByTaxon = {};\n for (const tid of Object.keys(state.byTaxon)) {\n const t = state.byTaxon[tid];\n newByTaxon[tid] = {\n ...t,\n fg: { status: 'idle', signature: null, requestId: 0, terms: null, numFound: 0, error: null }\n };\n }\n return { ...state, byTaxon: newByTaxon };\n }\n\n default:\n return state;\n }\n };\n },\n\n doSetOntologyEnrichmentActiveTaxon: tid => ({ dispatch }) =>\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_ACTIVE_TAXON_SET', payload: tid }),\n\n doSetOntologyEnrichmentUI: patch => ({ dispatch }) =>\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_UI_SET', payload: patch }),\n\n doFetchOntologyEnrichmentForeground: taxon => ({ dispatch, store }) => {\n const q = store.selectGrameneFiltersQueryString();\n const signature = fgSig(q, taxon);\n const state = store.selectOntologyEnrichment();\n const t = state.byTaxon[taxon];\n if (t && t.fg.signature === signature && (t.fg.status === 'loading' || t.fg.status === 'ready')) return;\n const requestId = (fgPending[taxon] = (fgPending[taxon] || 0) + 1);\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_FG_STARTED', payload: { taxon, signature, requestId } });\n\n const api = store.selectGrameneAPI();\n const url = `${api}/search?q=${q}&fq=taxon_id:${taxon}&rows=0&facet=true&${FACET_PARAMS}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== fgPending[taxon]) return;\n const terms = parseFacets(json);\n const numFound = (json && json.response && json.response.numFound) || 0;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_FG_SUCCEEDED', payload: { taxon, requestId, terms, numFound } });\n store.doEnsureOntologyEnrichmentTermRecords(taxon);\n })\n .catch(err => {\n if (requestId !== fgPending[taxon]) return;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_FG_FAILED', payload: { taxon, requestId, error: String(err) } });\n });\n },\n\n doFetchOntologyEnrichmentBackground: taxon => ({ dispatch, store }) => {\n const signature = bgSig(taxon);\n const state = store.selectOntologyEnrichment();\n const t = state.byTaxon[taxon];\n if (t && t.bg.signature === signature && (t.bg.status === 'loading' || t.bg.status === 'ready')) return;\n const requestId = (bgPending[taxon] = (bgPending[taxon] || 0) + 1);\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_BG_STARTED', payload: { taxon, signature, requestId } });\n\n const api = store.selectGrameneAPI();\n const url = `${api}/search?q=taxon_id:${taxon}&rows=0&facet=true&${FACET_PARAMS}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== bgPending[taxon]) return;\n const terms = parseFacets(json);\n const numFound = (json && json.response && json.response.numFound) || 0;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_BG_SUCCEEDED', payload: { taxon, requestId, terms, numFound } });\n store.doEnsureOntologyEnrichmentTermRecords(taxon);\n })\n .catch(err => {\n if (requestId !== bgPending[taxon]) return;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_BG_FAILED', payload: { taxon, requestId, error: String(err) } });\n });\n },\n\n doEnsureOntologyEnrichmentTermRecords: taxon => ({ store }) => {\n const state = store.selectOntologyEnrichment();\n if (!state.byTaxon[taxon]) return;\n // The ontologies and pathways bundles bulk-load + persist on first\n // request; we just need to nudge each one once.\n const buckets = new Set();\n for (const o of ONTOLOGIES) {\n if (o.bucket) buckets.add(o.bucket);\n }\n for (const k of buckets) {\n store.doEnsureOntologyRecords(k);\n }\n if (store.doRequestGramenePathways) {\n store.doRequestGramenePathways();\n }\n },\n\n reactOntologyEnrichmentFetch: createSelector(\n 'selectOntologyEnrichment',\n 'selectGrameneFiltersStatus',\n 'selectGrameneFiltersQueryString',\n 'selectGrameneViewsOn',\n (gs, fStatus, q, viewsOn) => {\n if (!viewsOn || !viewsOn.has('ontologyEnrichment')) return;\n if (fStatus === 'init') return;\n const tid = gs.activeTaxon;\n if (!tid) return;\n const t = gs.byTaxon[tid];\n if (!t) return;\n const sig = fgSig(q, tid);\n // A 'loading' status from a rehydrated state with no live request is\n // treated as idle — otherwise we'd deadlock waiting on a fetch that\n // ended when the previous tab closed.\n const fgInFlight = t.fg.status === 'loading' && (fgPending[tid] || 0) === t.fg.requestId && t.fg.requestId > 0;\n if (t.fg.signature !== sig && !fgInFlight) {\n return { actionCreator: 'doFetchOntologyEnrichmentForeground', args: [tid] };\n }\n const bgInFlight = t.bg.status === 'loading' && (bgPending[tid] || 0) === t.bg.requestId && t.bg.requestId > 0;\n if (t.bg.status !== 'ready' && !bgInFlight) {\n return { actionCreator: 'doFetchOntologyEnrichmentBackground', args: [tid] };\n }\n }\n ),\n\n selectOntologyEnrichment: state => state.ontologyEnrichment,\n selectOntologyEnrichmentUI: state => state.ontologyEnrichment.ui,\n selectOntologyEnrichmentOntologyDefs: () => ONTOLOGIES,\n\n selectOntologyEnrichmentResults: createSelector(\n 'selectOntologyEnrichment',\n 'selectOntologies',\n 'selectGramenePathways',\n (gs, ontoBuckets, pathwayDocs) => {\n const tid = gs.activeTaxon;\n if (!tid) return null;\n const t = gs.byTaxon[tid];\n if (!t || !t.fg.terms || !t.bg.terms) return null;\n const ui = gs.ui;\n const out = {};\n for (const o of ONTOLOGIES) {\n const fg = t.fg.terms[o.key] || {};\n const bg = t.bg.terms[o.key] || {};\n const recs = o.key === 'pathways' ? (pathwayDocs || {}) : ((ontoBuckets && ontoBuckets[o.bucket]) || {});\n\n // GO is tested per sub-ontology (BP / MF / CC) so each gets its\n // own universe size and BH correction, matching enrichGO. We can\n // only split once ontology records have arrived and namespaces are\n // known; until then, fall through to a single-section test.\n if (o.key === 'GO' && Object.keys(recs).length > 0) {\n const byNs = { biological_process: { fg: {}, bg: {} },\n molecular_function: { fg: {}, bg: {} },\n cellular_component: { fg: {}, bg: {} } };\n for (const idStr of Object.keys(bg)) {\n const id = +idStr;\n const ns = recs[id] && recs[id].namespace;\n if (!byNs[ns]) continue;\n byNs[ns].bg[id] = bg[id];\n if (fg[id] != null) byNs[ns].fg[id] = fg[id];\n }\n for (const idStr of Object.keys(fg)) {\n const id = +idStr;\n const ns = recs[id] && recs[id].namespace;\n if (!byNs[ns]) continue;\n if (byNs[ns].fg[id] == null) byNs[ns].fg[id] = fg[id];\n }\n for (const ns of Object.keys(byNs)) {\n const sectionKey = `GO:${ns}`;\n const sectionLabel = `GO: ${titleCase(ns)}`;\n out[sectionKey] = enrichSection(\n byNs[ns].fg, byNs[ns].bg, recs, ui,\n o.key, o.field, o.label, sectionKey, sectionLabel\n );\n }\n } else {\n out[o.key] = enrichSection(\n fg, bg, recs, ui,\n o.key, o.field, o.label, o.key, o.label\n );\n }\n }\n return out;\n }\n )\n};\n\nfunction titleCase(s) {\n return String(s).split('_').map(w => w ? w[0].toUpperCase() + w.slice(1) : '').join(' ');\n}\n\n// One ORA section: hypergeometric over a single (N, K) universe, BH-adjusted\n// across tested terms. Universe sizes come from the largest facet count in\n// the section — for an ontology with a synthetic root that's the root's\n// gene count (exact), and for forests it's the most populated top-level\n// term (a conservative approximation).\nfunction enrichSection(fg, bg, recs, ui, ontKey, ontField, ontLabel, sectionKey, sectionLabel) {\n let N = 0, K = 0;\n for (const idStr of Object.keys(bg)) {\n const v = bg[idStr]; if (v > N) N = v;\n }\n for (const idStr of Object.keys(fg)) {\n const v = fg[idStr]; if (v > K) K = v;\n }\n const empty = {\n ontology: sectionKey, label: sectionLabel, field: ontField,\n tested: 0, passing: 0, rows: [],\n universeSize: N, deSize: K\n };\n if (N <= 0 || K <= 0) return empty;\n\n const minGS = Math.max(1, +ui.minGSSize || 1);\n const maxGS = Math.max(minGS, +ui.maxGSSize || N);\n\n const rows = [];\n for (const idStr of Object.keys(fg)) {\n const id = +idStr;\n const count = fg[id];\n const M = bg[id] || 0;\n if (M < count) continue;\n if (M < minGS || M > maxGS) continue;\n const termRec = recs && recs[id];\n if (termRec && (termRec.is_obsolete || termRec.obsolete)) continue;\n if (count > K || M > N) continue;\n\n const p = fisherUpperTail(count, K, M, N);\n const richFactor = M > 0 ? count / M : 0;\n const foldEnrichment = (M > 0 && K > 0) ? (count / K) / (M / N) : 0;\n const mu = M * K / N;\n const sigma2 = N > 1 ? mu * (N - K) * (N - M) / N / (N - 1) : 0;\n const zScore = sigma2 > 0 ? (count - mu) / Math.sqrt(sigma2) : 0;\n\n rows.push({\n ontology: ontKey,\n ontology_label: ontLabel,\n term_id: id,\n field: ontField,\n Count: count,\n DESize: K,\n SetSize: M,\n UniverseSize: N,\n GeneRatio: `${count}/${K}`,\n BgRatio: `${M}/${N}`,\n RichFactor: richFactor,\n FoldEnrichment: foldEnrichment,\n zScore,\n pvalue: p,\n pAdjust: 1\n });\n }\n\n // BH adjustment across all tested terms in this section.\n rows.sort((a, b) => a.pvalue - b.pvalue);\n const m = rows.length;\n let prev = 1;\n for (let i = m - 1; i >= 0; i--) {\n const adj = Math.min(prev, rows[i].pvalue * m / (i + 1));\n rows[i].pAdjust = adj;\n prev = adj;\n }\n\n const passing = rows.filter(r => r.pAdjust <= ui.pAdjCutoff && r.pvalue <= ui.pAdjCutoff);\n let display = passing;\n if (ui.mostSpecific) {\n display = collapseToMostSpecific(ontKey, passing, recs);\n }\n for (const r of display) {\n const rec = recs && recs[r.term_id];\n if (rec) {\n r.term_name = rec.name || rec.display_name || '';\n r.term_namespace = rec.namespace || rec.type || '';\n r.term_display_id = rec.id != null ? String(rec.id) : String(r.term_id);\n } else {\n r.term_name = '';\n r.term_namespace = '';\n r.term_display_id = String(r.term_id);\n }\n r.Description = r.term_name || r.term_display_id;\n }\n display.sort((a, b) => a.pAdjust - b.pAdjust || b.FoldEnrichment - a.FoldEnrichment);\n\n return {\n ontology: sectionKey,\n label: sectionLabel,\n field: ontField,\n tested: rows.length,\n passing: passing.length,\n rows: display,\n universeSize: N,\n deSize: K\n };\n}\n\n// ---------- math helpers ----------\n\nconst LF_CACHE = [0, 0];\nfunction logFactorial(n) {\n if (n < LF_CACHE.length) return LF_CACHE[n];\n let lf = LF_CACHE[LF_CACHE.length - 1];\n for (let i = LF_CACHE.length; i <= n; i++) {\n lf += Math.log(i);\n LF_CACHE.push(lf);\n }\n return LF_CACHE[n];\n}\nfunction logChoose(n, k) {\n if (k < 0 || k > n) return -Infinity;\n return logFactorial(n) - logFactorial(k) - logFactorial(n - k);\n}\nfunction logHypergeom(x, n, K, N) {\n return logChoose(K, x) + logChoose(N - K, n - x) - logChoose(N, n);\n}\nfunction logSumExp(a, b) {\n if (a === -Infinity) return b;\n if (b === -Infinity) return a;\n const m = Math.max(a, b);\n return m + Math.log(Math.exp(a - m) + Math.exp(b - m));\n}\nfunction fisherUpperTail(k, n, K, N) {\n const upper = Math.min(n, K);\n let logP = -Infinity;\n for (let x = k; x <= upper; x++) {\n logP = logSumExp(logP, logHypergeom(x, n, K, N));\n }\n const p = Math.exp(logP);\n if (!isFinite(p)) return 1;\n return Math.min(1, Math.max(0, p));\n}\n\n// ---------- ontology graph helpers ----------\n\nfunction ancestorsOf(ontKey, id, recs) {\n const out = new Set();\n const rec = recs && recs[id];\n if (!rec) return out;\n if (ontKey === 'pathways') {\n for (const k of Object.keys(rec)) {\n if (k.startsWith('ancestors_') && Array.isArray(rec[k])) {\n for (const a of rec[k]) if (+a !== +id) out.add(+a);\n }\n }\n return out;\n }\n if (Array.isArray(rec.ancestors)) {\n for (const a of rec.ancestors) if (+a !== +id) out.add(+a);\n return out;\n }\n if (Array.isArray(rec.is_a)) {\n const stack = rec.is_a.slice();\n while (stack.length) {\n const cur = +stack.pop();\n if (out.has(cur)) continue;\n out.add(cur);\n const r = recs[cur];\n if (r && Array.isArray(r.is_a)) for (const p of r.is_a) stack.push(p);\n }\n }\n return out;\n}\n\n// Drop any term that is an ancestor of another term in the same passing set.\n// Applied AFTER BH so a parent term can survive when none of its children\n// pass the p_adj cutoff.\nfunction collapseToMostSpecific(ontKey, rows, recs) {\n if (!rows || rows.length <= 1) return rows;\n const inSet = new Set(rows.map(r => +r.term_id));\n const covered = new Set();\n for (const r of rows) {\n const ancs = ancestorsOf(ontKey, +r.term_id, recs);\n for (const a of ancs) if (inSet.has(a)) covered.add(a);\n }\n return rows.filter(r => !covered.has(+r.term_id));\n}\n\nexport default ontologyEnrichment;\n","import {connect} from 'redux-bundler-react'\nimport React from 'react'\n\nconst Gene = ({gene}) => {\n return <div className=\"row\">{gene.id}</div>\n};\n\nconst Genes = (results, rows, doChangeQuantity) => {\n if (results && results.numFound > 0) {\n const moreButton = (results.numFound > rows)\n ? <button onClick={e => doChangeQuantity('Genes',20)}>more</button>\n : '';\n const fewerButton = (rows > 20)\n ? <button onClick={e => doChangeQuantity('Genes',-20)}>fewer</button>\n : '';\n const docsToShow = results.response.docs.slice(0,rows);\n return (\n <div id=\"Genes\" className=\"container mb40 anchor\">\n <div className=\"fancy-title mb40\">\n <h4>Genes</h4>\n </div>\n {docsToShow.map((doc,idx) => <Gene key={idx} gene={doc}/>)}\n {fewerButton}{moreButton}\n </div>\n );\n }\n};\n\nconst Pathway = ({pathway}) => {\n return <div className=\"row\">{pathway.name}</div>\n};\nconst Pathways = results => {\n if (results && results.numFound > 0) {\n return (\n <div id=\"Pathways\" className=\"container mb40 anchor\">\n <div className=\"fancy-title\">\n <h4>Pathways</h4>\n </div>\n {results.pathways.map((doc,idx) => (<Pathway key={idx} pathway={doc}/>))}\n </div>\n );\n }\n};\n\nconst Domain = ({domain}) => {\n return <div className=\"row\">{domain.id}</div>\n};\nconst Domains = results => {\n if (results && results.numFound > 0) {\n return (\n <div id=\"Domains\" className=\"container mb40 anchor\">\n <div className=\"fancy-title mb40\">\n <h4>Domains</h4>\n </div>\n {results.domains.map((doc,idx) => (<Domain key={idx} domain={doc}/>))}\n </div>\n );\n }\n};\n\nconst Taxon = ({taxon}) => {\n return <div className=\"row\">{taxon.id}</div>\n};\nconst Species = results => {\n if (results && results.numFound > 0) {\n return (\n <div id=\"Species\" className=\"container mb40 anchor\">\n <div className=\"fancy-title mb40\">\n <h4>Species</h4>\n </div>\n {results.taxonomy.map((doc,idx) => (<Taxon key={idx} taxon={doc}/>))}\n </div>\n );\n }\n};\n\nconst ResultList = ({grameneGenes, grameneDomains, gramenePathways, grameneTaxonomy, searchUI, searchUpdated, doChangeQuantity}) => {\n if (searchUI.Gramene) {\n return (\n <div id=\"gramene\" className=\"row\">\n <div className=\"fancy-title pt50\">\n <h3>Gramene search results</h3>\n </div>\n {searchUI.Genes && Genes(grameneGenes, searchUI.rows.Genes, doChangeQuantity)}\n {searchUI.Domains && Domains(grameneDomains)}\n {searchUI.Pathways && Pathways(gramenePathways)}\n {searchUI.Species && Species(grameneTaxonomy)}\n </div>\n )\n }\n else {\n return null;\n }\n};\n\nexport default connect(\n 'selectGrameneGenes',\n 'selectGrameneDomains',\n 'selectGramenePathways',\n 'selectGrameneTaxonomy',\n 'selectSearchUI',\n 'selectSearchUpdated',\n 'doChangeQuantity',\n ResultList\n);\n","import {connect} from 'redux-bundler-react'\nimport React from 'react'\n\nconst getStatus = (cat, results, isChecked, toggle) => {\n const tally = results ? results.numFound : <img src=\"/static/images/dna_spinner.svg\"/>;\n return (\n <li className='category-leaf'>\n <input type=\"checkbox\" checked={isChecked} onChange={e => toggle(cat)}/>\n <a data-scroll href={`#${cat}`} className=\"nav-link active\">{cat}<span style={{float:\"right\"}}>{tally}</span></a>\n </li>\n )\n};\n\nconst ResultSummary = ({grameneGenes, gramenePathways, grameneDomains, grameneTaxonomy, searchUI, searchUpdated, doToggleCategory}) => {\n const status = grameneGenes ?\n grameneGenes.numFound:\n<img src=\"/static/images/dna_spinner.svg\"/>;\n if (searchUI.Gramene) return (\n <li className=\"active category-expanded\">\n <a onClick={e => doToggleCategory('Gramene')}>\n Gramene Search<span style={{float:\"right\"}}>{status}</span>\n </a>\n <ul className=\"list-unstyled\">\n {getStatus('Genes', grameneGenes, searchUI.Genes, doToggleCategory)}\n {getStatus('Domains', grameneDomains, searchUI.Domains, doToggleCategory)}\n {getStatus('Pathways', gramenePathways, searchUI.Pathways, doToggleCategory)}\n {getStatus('Species', grameneTaxonomy, searchUI.Species, doToggleCategory)}\n</ul>\n </li>\n);\nelse return (\n <li className=\"active category-collapsed\">\n <a onClick={e => doToggleCategory('Gramene')}>\n Gramene Search<span\n style={{float:\"right\"}}>{status}</span>\n </a>\n </li>\n);\n};\n\nexport default connect(\n 'selectGrameneGenes',\n 'selectGramenePathways',\n 'selectGrameneDomains',\n 'selectGrameneTaxonomy',\n 'selectSearchUI',\n 'selectSearchUpdated',\n 'doToggleCategory',\n ResultSummary\n);\n","import {connect} from 'redux-bundler-react'\nimport React from 'react'\nimport ReactGA from 'react-ga4'\nimport { Button, Badge, Alert } from 'react-bootstrap'\nimport './styles.css'\n\nfunction showMatches(text, x) {\n let re = new RegExp(`(${x})`, 'ig');\n let match = text.split(re);\n return <span>\n {match.map((str, idx) => {\n if (idx % 2 === 1) {\n return <span key={idx} style={{fontWeight:'bolder'}}>{str}</span>\n }\n return <span key={idx}>{str}</span>\n })}\n </span>\n}\n\nfunction logAction(sugg) {\n ReactGA.event({\n category: 'Search',\n action: 'SetFilter',\n label: sugg.name\n })\n}\nfunction getLowestCommonAncestorName(tids, taxonomy) {\n let lca;\n tids.forEach(tid => {\n if (!lca) {\n lca = [...taxonomy[tid].ancestors];\n } else {\n let ancestors = new Set(taxonomy[tid].ancestors);\n while (!ancestors.has(lca[0])) {\n lca.shift();\n }\n }\n });\n return taxonomy[lca[0]].short_name;\n}\n\nconst TryPan = (props) => {\n const query = props.query;\n const pan = props.pan;\n return <div className=\"suggestion-panlink\">\n <a target=\"_blank\" href={pan.url + \"?suggestion=\" + query}>\n <img src={pan.svg} title={`Search at ${pan.name}`}/>\n </a>\n </div>;\n};\n\nconst TryAnotherSite = props => {\n const query = props.query;\n const config = props.config;\n let sites = Object.keys(config.panSite);\n return <div>\n <Alert variant={'info'}>Don't see what you're looking for? Search for <b>{query}</b> on one of our sister sites</Alert>\n {sites.map((p, idx) => <TryPan key={idx} query={query} pan={config.panSite[p]}/>)}\n </div>\n}\n\nconst Suggestions = props => {\n let suggestions = props.grameneSuggestions;\n if (suggestions && suggestions.grouped) {\n if (suggestions.grouped.category.matches === 0) {\n let sugg1 = {\n fq_field: 'text',\n fq_value: props.suggestionsQuery,\n name: `Genes containing \"${props.suggestionsQuery}\"`,\n category: 'Gene',\n };\n let sugg2 = {\n fq_field: 'text',\n fq_value: `${props.suggestionsQuery}*`,\n name: `Genes matching \"${props.suggestionsQuery}*\"`,\n category: 'Gene',\n };\n return (\n <div style={{margin: '10px', maxWidth: '820px'}}>\n <Alert variant={'info'}><em>No suggestions found.</em> You may still attempt a full text search, though it is unlikely to find any genes for you.</Alert>\n <Button id={'word'}\n size={'sm'}\n variant={'outline-secondary'}\n onClick={() => {logAction(sugg1); props.doAcceptSuggestion(sugg1); props.doAcceptGrameneSuggestion(sugg1)}}>\n {`All genes that contain the word \"${props.suggestionsQuery}\"`}\n </Button>\n <Button id={'word'}\n size={'sm'}\n variant={'outline-secondary'}\n onClick={() => {logAction(sugg2); props.doAcceptSuggestion(sugg2); props.doAcceptGrameneSuggestion(sugg2)}}>\n {`All genes that contain a word that starts with \"${props.suggestionsQuery}\"`}\n </Button>\n <TryAnotherSite query={props.suggestionsQuery} config={props.configuration}/>\n </div>\n );\n }\n else {\n return (\n <div style={{margin: '10px'}}>\n {suggestions.grouped.category.groups.map((g,idx) => {\n return <div key={idx} id='gramene-suggestion'>\n <h4 className=\"mt10\">{g.groupValue}</h4>\n {g.doclist.docs.map((sugg,jdx) =>\n <Button id={`${idx}-${jdx}`}\n key={jdx}\n disabled={sugg.num_genes === 0}\n size='sm'\n variant=\"outline-secondary\"\n onClick={() => {logAction(sugg); props.doAcceptSuggestion(sugg); props.doAcceptGrameneSuggestion(sugg)}}>\n {showMatches(sugg.display_name,props.suggestionsQuery)}{' '}\n <Badge bg=\"secondary\">{sugg.num_genes}</Badge>\n <i> {getLowestCommonAncestorName(sugg.taxon_id, props.grameneTaxonomy)}</i>\n </Button>\n )}\n </div>\n })}\n <TryAnotherSite query={props.suggestionsQuery} config={props.configuration}/>\n </div>\n );\n }\n }\n else {\n return <div></div>\n }\n}\n\nexport default connect(\n 'selectGrameneSuggestions',\n 'selectSuggestionsQuery',\n 'selectGrameneTaxonomy',\n 'selectConfiguration',\n 'doAcceptSuggestion',\n 'doAcceptGrameneSuggestion',\n Suggestions\n);\n","import React, { useState, useRef, useEffect } from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { Navbar, Nav, NavDropdown, Container, OverlayTrigger, Popover} from 'react-bootstrap'\nimport Switch from 'react-switch'\nimport { IoAlertCircle } from 'react-icons/io5'\nimport { BsGearFill,BsTrash,BsChevronDown,BsChevronRight } from 'react-icons/bs'\nimport GeneList from './results/GeneList'\nimport TaxDist from './results/TaxDist'\nimport HelpDemo from './results/HelpDemo'\nimport GeneAttribs from './results/GeneAttribs'\nimport TaxonomyModal from './TaxonomyModal'\nimport Expression from './results/Expression'\nimport UserGeneLists from './results/UserGeneLists'\nimport ExporterView from './exporter/ExporterView'\nimport ExprVizView from './exprViz/ExprVizView'\nimport OntologyEnrichment from './results/OntologyEnrichment'\nimport Auth from './Auth'\nimport ReactGA from 'react-ga4'\nimport './styles.css';\n\nconst CollapsibleSection = ({ title, defaultOpen = true, extra, children }) => {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <div className=\"sidebar-section\">\n <div className=\"sidebar-section-header\" onClick={() => setOpen(!open)}>\n <b>{title}</b>\n <span className=\"sidebar-section-actions\">\n {extra}\n <span className=\"sidebar-section-toggle\">\n {open ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n </span>\n </div>\n {open && <div className=\"sidebar-section-body\">{children}</div>}\n </div>\n );\n};\n\nconst inventory = {\n help: HelpDemo,\n list: GeneList,\n taxonomy: TaxDist,\n attribs: GeneAttribs,\n expression: Expression,\n exprViz: ExprVizView,\n ontologyEnrichment: OntologyEnrichment,\n userLists: UserGeneLists,\n export: ExporterView\n};\n\nconst StatusCmp = props => {\n let content = props.grameneFiltersStatus;\n // if (props.grameneFiltersStatus === 'init') {\n // props.doClearGrameneFilters();\n // }\n if (props.grameneFiltersStatus === 'ready') {\n let tally = <span>Ready</span>;\n if (props.grameneSearch) {\n let genes = props.grameneSearch.response.numFound;\n let genomes = props.grameneSearch.facet_counts.facet_fields.taxon_id.length / 2;\n tally = <span><b>{genes}</b> genes in <b>{genomes}</b> genomes</span>;\n }\n const popover = (\n <Popover>\n <Popover.Header as=\"h3\">Genomes Filter</Popover.Header>\n <Popover.Body>Searching {props.activeGenomeCount} genomes</Popover.Body>\n </Popover>\n );\n\n content = <span>\n {tally}\n <OverlayTrigger placement=\"auto\" overlay={popover}>\n <span style={{float:'right', cursor:'pointer'}} onClick={props.doShowGrameneGenomes}><BsGearFill/></span>\n </OverlayTrigger>\n <TaxonomyModal/>\n </span>;\n }\n return <div style={{padding:'5px', color:'cornsilk', fontSize:'small'}}>{content}</div>\n};\n\nconst Status = connect(\n 'selectGrameneSearch',\n 'selectGrameneFiltersStatus',\n 'selectActiveGenomeCount',\n 'doShowGrameneGenomes',\n 'doClearGrameneFilters',\n StatusCmp\n);\n\nconst handleClick = (e, moveCopyMode, showMarked, node, actions) => {\n if (!e) e = window.event;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n\n if (showMarked && moveCopyMode) {\n if (node.marked) {\n actions.selectTarget(node);\n }\n else {\n actions.unmarkTargets()\n }\n }\n console.log(node, showMarked);\n};\nfunction logAction(action) {\n ReactGA.event({\n category: 'Search',\n action: action\n })\n}\nconst Filter = ({node,moveCopyMode,showMarked,actions}) => {\n let classes = 'gramene-filter gramene-filter';\n if (node.operation) {\n classes = `${classes}-${node.operation}`\n }\n if (node.negate) {\n classes = `${classes} gramene-filter-NOT`\n }\n if (showMarked && node.marked) {\n classes = `${classes} gramene-filter-marked`\n }\n let content = '';\n let menu = '';\n let children = [];\n\n if (node.showMenu) {\n let key=1;\n let menuItems = [];\n if (node.hasOwnProperty('operation')) {\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Change to ${node.operation}`); actions.changeOperation(node)}}>convert to <i>{node.operation === 'AND' ? 'OR' : 'AND'}</i></li>);\n }\n if (node.leftIdx > 0) {\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Delete filter`); actions.deleteNode(node)}}>delete</li>);\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Move filter`); actions.markTargets(node,'move')}}>move{node.isSource && ' select destination'}</li>);\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Copy filter`); actions.markTargets(node,'copy')}}>copy{node.isSource && ' select destination'}</li>)\n }\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Negate filter`); actions.negate(node)}}>negate</li>);\n menu = <div className='gramene-filter-menu'><ul>{menuItems}</ul></div>;\n }\n let warning;\n if (node.warning) {\n const popover = (\n <Popover>\n <Popover.Header as=\"h3\">Warning</Popover.Header>\n <Popover.Body>{node.warning}</Popover.Body>\n </Popover>\n );\n warning = (\n <OverlayTrigger placement=\"auto\" overlay={popover}><span style={{float:'right', color:'red', cursor:'pointer'}}><IoAlertCircle/></span></OverlayTrigger>\n )\n }\n if (node.operation) {\n children = node.children.map((child,idx) => <Filter key={idx} moveCopyMode={moveCopyMode} node={child} showMarked={showMarked} actions={actions}/>);\n content = (\n <div>\n <span className='gramene-filter-operation'\n onClick={()=>actions.toggleMenu(node)}>{node.operation}</span>\n {warning}\n </div>\n );\n }\n else {\n content = <span className='gramene-filter-text'\n onClick={()=>actions.toggleMenu(node)}>{node.category} | {node.name}</span>;\n }\n return (\n <div key={node.leftIdx} className={classes} onClick={(e)=>handleClick(e,moveCopyMode, showMarked,node,actions)}>\n {content}{menu}{children}\n </div>\n )\n};\n\nconst FiltersCmp = props => {\n const actions = {\n negate: props.doNegateGrameneFilter,\n deleteNode: props.doDeleteGrameneFilter,\n changeOperation: props.doChangeGrameneFilterOperation,\n selectTarget: props.doMoveOrCopyGrameneFilter,\n markTargets: props.doMarkGrameneFilterTargets,\n unmarkTargets: props.doUnmarkGrameneFilterTargets,\n toggleMenu: props.doToggleGrameneFilterMenu\n };\n const containerClass = props.configuration.id === 'sorghum' ? 'sorghumbase-filter-container': 'gramene-filter-container';\n if (props.grameneFilters.rightIdx > 1) {\n return <div className={containerClass}>\n <CollapsibleSection title=\"Filters\"\n extra={<span style={{cursor:'pointer', marginRight:'0.5rem'}} onClick={(e)=>{e.stopPropagation(); props.doClearGrameneFilters()}}><BsTrash/></span>}>\n <Filter node={props.grameneFilters}\n moveCopyMode={props.grameneFilters.moveCopyMode}\n showMarked={props.grameneFilters.showMarked}\n actions={actions}/>\n </CollapsibleSection>\n </div>\n }\n else {\n return <div className={containerClass}>\n <CollapsibleSection title=\"Filters\">\n <div className='gramene-filter gramene-filter-AND'>No filters defined</div>\n </CollapsibleSection>\n </div>\n }\n};\n\nconst Filters = connect(\n 'selectGrameneFilters',\n 'selectConfiguration',\n 'doNegateGrameneFilter',\n 'doDeleteGrameneFilter',\n 'doChangeGrameneFilterOperation',\n 'doMoveOrCopyGrameneFilter',\n 'doMarkGrameneFilterTargets',\n 'doUnmarkGrameneFilterTargets',\n 'doToggleGrameneFilterMenu',\n 'doClearGrameneFilters',\n FiltersCmp\n);\n\nconst ResultsCmp = props => {\n let activeViews = props.grameneViews.options;\n return props.grameneFilters.rightIdx > 0 ? (\n <div>\n {activeViews.map((v,idx) => {\n let p = Object.assign({}, props);\n const divRef = useRef(null);\n useEffect(() => {\n if (v.shouldScroll) {\n const navBarHeight=0;\n const scrollPosition = divRef.current.offsetTop - navBarHeight;\n window.scrollTo({\n top: scrollPosition,\n behavior: 'smooth'\n })\n props.doCancelShouldScroll();\n }\n }, [v.shouldScroll]);\n return (\n <div key={idx} ref={divRef}>\n {v.show === 'on' && <div style={{borderTopWidth:'medium'}} className='gramene-view-header'>{v.name}</div>}\n {v.show === 'on' && React.createElement(inventory[v.id], p)}\n </div>\n )\n })}\n </div>\n ) : null;\n};\n\nconst Results = connect(\n 'selectGrameneFilters',\n 'selectGrameneViews',\n 'doCancelShouldScroll',\n ResultsCmp\n);\n\nconst ViewsCmp = props => (\n <div className={'gramene-view-container'}>\n <CollapsibleSection title=\"Views\">\n {props.grameneViews.options.filter(view => view.show !== 'disabled').map((view,idx) => (\n <div style={{textWrap:'nowrap'}} key={idx}>\n <Switch onChange={()=>props.doToggleGrameneView(view.id)} checked={view.show === 'on'}\n height={18}\n width={30}\n handleDiameter={16}\n checkedIcon={false}\n uncheckedIcon={false}\n />\n <span className={`gramene-view-span-${view.show}`} onClick={(e) => {\n props.dontToggleGrameneView(view.id)\n }}>{view.name}</span>\n </div>\n ))}\n </CollapsibleSection>\n </div>\n);\n\nconst Views = connect(\n 'selectGrameneViews',\n 'doToggleGrameneView',\n 'dontToggleGrameneView',\n ViewsCmp\n);\n\nexport {Status, Filters, Results, Views, Auth};\n","import React from 'react'\nimport ReactGA from 'react-ga4'\nimport { connect } from 'redux-bundler-react'\nimport './genes.css'\nimport Expression from './details/Expression'\nimport Homology from './details/Homology'\nimport Location from './details/Location'\nimport Pathways from \"./details/Pathways\"\nimport VEP from \"./details/VEP\"\nimport Xrefs from \"./details/Xrefs\"\nimport Publications from \"./details/Publications\"\nimport Sequences from \"./details/Sequences\"\nimport {suggestionToFilters} from \"../utils\";\nimport {FullscreenContainer} from './details/generic'\nimport {GrFormPrevious, GrFormNextLink, GrFormNext, GrHpe} from 'react-icons/gr'\nimport {BsArrowsFullscreen} from 'react-icons/bs'\nimport { Badge, OverlayTrigger, Tooltip } from 'react-bootstrap'\n\nlet external = <small title=\"This link opens a page from an external site\"> <i className=\"fa fa-external-link\"/></small>;\n\nlet inventory = {\n sequences: Sequences,\n location: Location,\n expression: Expression,\n homology: Homology,\n pathways: Pathways,\n VEP: VEP,\n xrefs: Xrefs,\n pubs: Publications\n};\n\nfunction renderTairSummary(searchResult) {\n const summary = searchResult.summary;\n if(summary && summary !== \"NULL\" && searchResult.system_name === \"arabidopsis_thaliana\") {\n return (\n <div className=\"gene-summary-tair\">\n {trimSummary(summary)}\n </div>\n )\n }\n}\n\nfunction trimSummary(summary) {\n if(summary.length > 160) {\n const start = summary.substr(0, 150);\n const rest = summary.substr(150);\n return <p>{start}<span className=\"ellipsis\">…</span><span className=\"rest\">{rest}</span></p>\n }\n else {\n return <p>{summary}</p>\n }\n}\nconst PanLink = (props) => {\n const gene = props.gene;\n const pan = props.pan;\n return <div className=\"gene-panlink\">\n <a target=\"_blank\" href={pan.url + \"?idList=\" + gene.id}>\n <img src={pan.svg} title={`View this gene at ${pan.name}`}/>\n </a>\n </div>;\n};\n\nconst CurationComponent1 = ({ curation }) => {\n return (\n <div className=\"gene-curation\">\n <span>Curated gene structure</span>\n {curation.okay > 0 && <span className=\"status\">✔️ {curation.okay}</span>}\n {curation.flagged > -10 && <span className=\"status\">⚠️ {curation.flagged}</span>}\n </div>\n );\n};\nconst CurationComponent = ({ curation, gene }) => {\n const total = curation.okay + curation.flagged;\n const okayRatio = (curation.okay / total);\n const flaggedRatio = (curation.flagged / total);\n const tooltip = (\n <Tooltip id=\"tooltip\">\n <strong>Gene structure</strong><br/>\n Okay: {curation.okay} \n Flagged: {curation.flagged}\n </Tooltip>\n );\n return (\n <OverlayTrigger placement=\"left\" overlay={tooltip}>\n <a className=\"gene-curation\" target=\"_blank\" href={`https://devdata.gramene.org/curation/curations?idList=${gene.id}`}>\n <span className=\"okay\" style={{opacity: okayRatio}}>☑</span>\n <span className=\"flagged\" style={{opacity: flaggedRatio}}>⚠</span>\n </a>\n </OverlayTrigger>\n )\n};\n\nconst ClosestOrthologCmp = (props) => {\n let id, taxon_id, name, desc, species, className, identity;\n const gene = props.gene;\n\n if (gene.closest_rep_id) {\n name = gene.closest_rep_name || gene.closest_rep_id;\n desc = gene.closest_rep_description;\n species = gene.closest_rep_species_name;\n id = gene.closest_rep_id;\n taxon_id = gene.closest_rep_taxon_id;\n className = \"closest-ortholog\";\n identity = gene.closest_rep_identity || 0;\n }\n else if (gene.model_rep_id) {\n name = gene.model_rep_name || gene.model_rep_id;\n desc = gene.model_rep_description;\n species = gene.model_rep_species_name;\n id = gene.model_rep_id;\n taxon_id = gene.model_rep_taxon_id;\n className = \"model-ortholog\";\n identity = gene.model_rep_identity || 0;\n }\n var isZm = new RegExp(/^Zm00001e/);\n if (isZm.test(desc)) {\n desc='';\n }\n\n return (\n <div className={className} onClick={() => {\n props.doEnsureGrameneGenome(taxon_id);\n props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene',\n fq_field: 'id',\n fq_value: id,\n name: name\n }))\n }}>\n <div className=\"gene-species\">{species}</div>\n {identity > 0 && <div className=\"rep-identity\">{Math.round(identity*100)}</div>}\n <h3 className=\"gene-id\">{name}</h3>\n <p>{desc}</p>\n </div>\n );\n};\n\nconst ClosestOrtholog = connect(\n 'doReplaceGrameneFilters','doEnsureGrameneGenome',\n ClosestOrthologCmp\n);\n\nfunction renderClosestOrtholog(gene) {\n\n if (shouldShowClosestOrtholog(gene)) {\n\n // we used to not add the closest ortholog to the DOM if the homology detail was visible.\n // however, that could cause the height of the result to change. Instead we set visibility:hidden\n // so that the renderer takes into account the height of the ortholog even if not shown.\n return (\n <ClosestOrtholog gene={gene}/>\n );\n }\n}\n\n// show closest ortholog prominently if we have data to show:-\n// a. either there's a closest ortholog (determined by traversing the gene tree until an id or description looks\n// curated) b. or there's a model ortholog (traverse tree to find an ortholog in arabidopsis)\nfunction shouldShowClosestOrtholog(searchResult) {\n return (\n searchResult.closest_rep_id || (\n searchResult.model_rep_id &&\n searchResult.model_rep_id !== searchResult.id\n )\n );\n}\n\nconst allDetails = [\n {\n id: 'VEP',\n label: 'Germplasm',\n popup: 'Germplasm with protein truncating variants (PTVs)',\n available: false\n },\n {\n id: 'sequences',\n label: 'Sequences',\n popup: 'Gene/cDNA/protein fasta',\n available: true\n },\n {\n id: 'location',\n label: 'Location',\n popup: 'Genome Browser',\n available: false\n },\n {\n id: 'expression',\n label: 'Expression',\n popup: 'Gene Expression Atlas',\n available: false\n },\n {\n id: 'homology',\n label: 'Homology',\n popup: 'Gene Family Tree',\n available: false\n },\n {\n id: 'pathways',\n label: 'Pathways',\n popup: 'Plant Reactome Pathways',\n available: false\n },\n {\n id: 'pubs',\n label: 'Papers',\n popup: 'Curated Publications',\n available: false\n },\n {\n id: 'xrefs',\n label: 'Xrefs',\n popup: 'Database Cross-references',\n available: false\n }\n];\n\n\nclass Gene extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n details: allDetails.map(o => ({...o})).filter(d => props.config.details[d.id]),\n expandedDetail: props.expandedDetail,\n fullscreen: false,\n };\n let hasData = {};\n props.searchResult.capabilities.forEach(c => {\n hasData[c] = true;\n if (c === 'PanOryza') {\n hasData.xrefs = true;\n }\n });\n this.state.details.forEach(d => d.available |= hasData.hasOwnProperty(d.id));\n }\n getDetailStatus(d) {\n if (this.state.expandedDetail === d.id) return 'expanded';\n if (d.available) return 'closed'\n return d.id === \"pubs\" ? 'empty' : 'disabled';\n }\n setExpanded(d) {\n if (d.available || d.id === \"pubs\") {\n if (this.state.expandedDetail === d.id) {\n this.setState({expandedDetail: null, fullscreen: false})\n }\n else {\n const geneId = this.props.searchResult.id;\n if (!(this.props.geneDocs && this.props.geneDocs.hasOwnProperty(geneId))) {\n this.props.requestGene(geneId)\n }\n ReactGA.event({\n category: 'Search',\n action: 'Details',\n label: d.label\n });\n this.setState({expandedDetail: d.id, fullscreen: false})\n }\n }\n }\n ensureGene(id) {\n if (!(this.props.geneDocs && this.props.geneDocs.hasOwnProperty(id))) {\n this.props.requestGene(id);\n return false;\n }\n return this.props.geneDocs[id].hasOwnProperty('taxon_id')\n }\n renderMetadata() {\n let gene = this.props.searchResult;\n if (gene.model_rep_taxon_id) {\n gene.model_rep_species_name = this.props.taxLut[gene.model_rep_taxon_id].short_name;\n }\n if (gene.closest_rep_taxon_id) {\n gene.closest_rep_species_name = this.props.taxLut[gene.closest_rep_taxon_id].short_name;\n }\n return renderTairSummary(gene) || renderClosestOrtholog(gene);\n }\n render() {\n const panSite = this.props.config.panSite;\n const searchResult = this.props.searchResult;\n const taxName = this.props.taxName;\n const curation = this.props.curation;\n // let orthologs='';\n // if (this.props.orthologs && this.props.orthologs.hasOwnProperty(searchResult.id)) {\n // orthologs = this.props.orthologs[searchResult.id].join(', ');\n // }\n const numWordsInDescription = searchResult.description.split(' ').length;\n return (\n <div className=\"result-gene\">\n <div className=\"result-gene-summary\">\n <div className=\"result-gene-title-body\">\n {panSite.hasOwnProperty(searchResult.system_name) && <PanLink pan={panSite[searchResult.system_name]} gene={searchResult}/>}\n {curation && <CurationComponent curation={curation} gene={searchResult}/> }\n <div className=\"gene-title\">\n <div className=\"gene-species\">{taxName}</div>\n <h3 className=\"gene-name\">{searchResult.name}\n {searchResult.id !== searchResult.name && <small className=\"gene-id\"> {searchResult.id}</small>}\n </h3>\n </div>\n {searchResult.synonyms && <small className=\"gene-synonyms\">{searchResult.synonyms.join(', ')}</small>}\n {searchResult.description !== \"unknown\" && (numWordsInDescription > 1 || searchResult.can_show.pubs) && <p className=\"gene-description\">{searchResult.description}</p>}\n </div>\n {this.renderMetadata()}\n </div>\n <div className=\"gene-detail-tabs\">\n {this.state.details.map((d,idx) => {\n const isExpanded = this.state.expandedDetail === d.id;\n return (\n <OverlayTrigger\n key={idx}\n placement={'bottom'}\n overlay={\n <Tooltip id={`tooltip`}>{d.popup}</Tooltip>\n }\n >\n <div key={idx}\n className={`col-md-1 text-center gene-detail-tab-${this.getDetailStatus(d)}`}\n style={{position: 'relative'}}\n onClick={()=>this.setExpanded(d)}\n >\n {d.label}\n {isExpanded && (\n <BsArrowsFullscreen\n style={{\n position: 'absolute',\n right: 8,\n top: '50%',\n transform: 'translateY(-50%)',\n cursor: 'pointer',\n }}\n title=\"View full screen\"\n onClick={(e) => {\n e.stopPropagation();\n this.setState({fullscreen: true});\n }}\n />\n )}\n </div>\n </OverlayTrigger>\n );\n })}\n </div>\n {this.state.expandedDetail && this.ensureGene(searchResult.id) && (\n <FullscreenContainer\n className=\"visible-detail\"\n fullscreen={this.state.fullscreen}\n onExitFullscreen={() => this.setState({fullscreen: false})}\n title={(this.state.details.find(d => d.id === this.state.expandedDetail) || {}).label}\n >\n {React.createElement(inventory[this.state.expandedDetail], this.props)}\n </FullscreenContainer>\n )}\n </div>\n )\n }\n}\n\nconst GeneList = props => {\n if (props.grameneSearch && props.grameneSearch.response && props.grameneTaxonomy) {\n let prev,page,next;\n const numFound = props.grameneSearch.response.numFound;\n if (numFound > props.grameneSearchRows) {\n const pageNum = props.grameneSearchOffset/props.grameneSearchRows;\n page = <span style={{padding:'10px'}}>page <b>{pageNum + 1}</b> of <b>{Math.ceil(numFound/props.grameneSearchRows)}</b></span>;\n prev = <GrHpe/>;\n if (pageNum > 0) {\n prev = <Badge onClick={()=>props.doRequestResultsPage(pageNum - 1)}><GrFormPrevious/></Badge>\n }\n next = <GrHpe/>;\n if (numFound > props.grameneSearchOffset + props.grameneSearchRows) {\n next = <Badge onClick={()=>props.doRequestResultsPage(pageNum + 1)}><GrFormNext/></Badge>\n }\n }\n return <div>\n <div>{prev}{page}{next}</div>\n {props.grameneSearch.response.docs.map((g,idx) => (\n <Gene key={idx}\n searchResult={g}\n config={props.configuration}\n taxName={props.grameneTaxonomy[g.taxon_id].name}\n geneDocs={props.grameneGenes}\n requestGene={props.doRequestGrameneGene}\n requestOrthologs={props.doRequestOrthologs}\n orthologs={props.grameneOrthologs}\n taxLut={props.grameneTaxonomy}\n curation={props.curatedGenes ? props.curatedGenes[g.id] : null}\n expandedDetail={props.grameneSearch.response.numFound === 1 && g.can_show.homology ? 'homology' : null}\n />\n ))}\n {prev}{page}{next}\n </div>\n }\n return null;\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneSearch',\n 'selectGrameneTaxonomy',\n 'selectGrameneGenes',\n 'selectGrameneOrthologs',\n 'selectGrameneSearchOffset',\n 'selectGrameneSearchRows',\n 'selectCuratedGenes',\n 'doRequestGrameneGene',\n 'doRequestOrthologs',\n 'doRequestResultsPage',\n GeneList);\n","import React, { useRef, useEffect, useState } from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport {Tabs, Tab, Form, Row, Col} from 'react-bootstrap';\nimport BAR, {haveBAR} from \"gramene-efp-browser\";\n\nfunction DynamicIframe(props) {\n // Create a ref for the iframe element\n const iframeRef = useRef(null);\n const [iframeHeight, setIframeHeight] = useState(500); // Default height\n\n useEffect(() => {\n const handleMessage = (event) => {\n if (event.data.type === 'heightChange') {\n setIframeHeight(event.data.height + 44);\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n return () => window.removeEventListener(\"message\", handleMessage);\n }, []);\n\n return (\n <iframe\n ref={iframeRef}\n src={props.url}\n title=\"Dynamic Iframe\"\n style={{ width: '100%', height: `${iframeHeight}px`, border: 'none' }}\n />\n );\n}\n\nconst Detail = props => {\n const gene = props.geneDocs[props.searchResult.id];\n const [atlasExperiment, setAtlasExperiment] = useState(null);\n const [atlasExperimentList, setAtlasExperimentList] = useState([]);\n const [atlasFacets, setAtlasFacets] = useState(null);\n const [isLocal, setIsLocal] = useState(false);\n const [activeTab, setActiveTab] = useState('gene');\n\n const handleLocalAPIChange = (event) => {\n setIsLocal(event.target.checked);\n };\n useEffect(() => {\n if (!props.expressionStudies) return;\n const tid = Math.floor(gene.taxon_id / 1000);\n if (props.expressionStudies[tid]) {\n let facets={Differential: {}, Baseline: {}};\n let eList = props.expressionStudies[tid].sort((a,b) => {\n const a_name = `${a.type}:${a.description || a._id}`;\n const b_name = `${b.type}:${b.description || b._id}`;\n return a_name < b_name ? -1 : 1;\n });\n if (props.searchResult.hasOwnProperty('expressed_in_gxa_attr_ss')) {\n const in_gxa = new Set(props.searchResult.expressed_in_gxa_attr_ss);\n eList = eList.filter(e => in_gxa.has(e._id))\n }\n eList.forEach(e => {e.factors.forEach(factor => facets[e.type][factor] = 1);});\n setAtlasExperimentList(eList);\n setAtlasFacets(facets);\n let refExp = eList.filter(e => e.isRef);\n if (refExp.length === 1) {\n setAtlasExperiment(refExp[0]._id);\n } else {\n // no reference experiment - choose first\n setAtlasExperiment(eList[0]._id);\n }\n }\n }, [props.expressionStudies]);\n\n let paralogs_url;\n let gene_url = `https://dev.gramene.org/static/atlasWidget.html?genes=${gene.atlas_id || gene._id}&localAPI=${isLocal}`;\n let paralogs = [];\n if (props.grameneParalogs && props.grameneParalogs[gene._id]) {\n paralogs = props.grameneParalogs[gene._id];\n } else if (gene.homology) {\n props.doRequestParalogs(gene._id, gene.homology.supertree, gene.taxon_id);\n }\n // if (gene.homology && gene.homology.homologous_genes && gene.homology.homologous_genes.within_species_paralog) {\n // paralogs = gene.homology.homologous_genes.within_species_paralog;\n // }\n if (paralogs.length > 0 && atlasExperiment) {\n paralogs_url= `https://dev.gramene.org/static/atlasWidget.html?genes=${paralogs.join(' ')}&experiment=${atlasExperiment}&localAPI=${isLocal}`;\n }\n return <Tabs activeKey={activeTab} onSelect={(k) => setActiveTab(k)}>\n {paralogs_url &&\n <Tab tabClassName=\"gxa\" eventKey=\"paralogs\" title={`Paralogs`} key=\"gxaparalogs\">\n <Form.Select aria-label='experiment selector'\n placeholder='Select experiment'\n onChange={(e) => setAtlasExperiment(e.target.value)}>\n { atlasExperimentList.map((e,idx) =>\n <option key={idx} value={e._id}>{e.type}: {e.description || e._id}</option>\n )}\n </Form.Select>\n {activeTab === \"paralogs\" && <DynamicIframe url={paralogs_url}/> }\n </Tab>\n }\n <Tab tabClassName=\"gxa\" eventKey=\"gene\" title=\"All Studies\" key=\"gxa\">\n {/*<Form.Check*/}\n {/* type=\"switch\"*/}\n {/* id=\"localAPI\"*/}\n {/* label=\"Local API\"*/}\n {/* checked={isLocal}*/}\n {/* onChange={handleLocalAPIChange}*/}\n {/*/>*/}\n {activeTab === \"gene\" && <DynamicIframe url={gene_url}/> }\n </Tab>\n {haveBAR(gene) &&\n <Tab tabClassName=\"eFP\" eventKey=\"eFP\" title=\"eFP Browser\" key=\"bar\"><BAR gene={gene}/></Tab>\n }\n </Tabs>\n};\n\nexport default connect(\n 'selectGrameneParalogs',\n 'selectExpressionStudies',\n 'doRequestParalogs',\n //'doRequestParalogExpression',\n Detail\n);\n\n","import React from 'react'\nimport _ from 'lodash';\nimport {connect} from \"redux-bundler-react\";\nimport TreeVis from \"gramene-genetree-vis\";\nimport treesClient from \"gramene-trees-client\";\nimport {\n TBrowse,\n computePivotState,\n fromGrameneGenetree,\n fromGrameneNeighborhood,\n labelsZone,\n msaZone,\n neighborhoodZone,\n treeZone,\n} from \"tbrowse\";\nimport {Detail, Title, Description, Content, Explore, Links} from \"./generic\";\nimport {suggestionToFilters} from \"../../utils\";\nimport {Spinner, Alert} from \"react-bootstrap\";\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/msa.less';\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/tree.less';\n\nconst TBROWSE_ZONES = [treeZone, labelsZone, msaZone, neighborhoodZone];\n\nclass Homology extends React.Component {\n constructor(props) {\n super(props);\n this.state = {viewer: 'treevis', neighborhood: null, neighborhoodTreeId: null};\n if (!props.geneDocs.hasOwnProperty(props.searchResult.id)) {\n props.requestGene(props.searchResult.id)\n }\n this.taxonomy = treesClient.taxonomy.tree(Object.values(props.grameneTaxonomy))\n }\n fetchNeighborhood(treeId) {\n if (this._neighborhoodFetchedFor === treeId) return;\n this._neighborhoodFetchedFor = treeId;\n const api = this.props.grameneAPI;\n const url = new URL(`${api}/search`);\n url.searchParams.set('fl', 'id,name,gene_tree,gene_idx,region,start,end,strand,biotype,system_name,description');\n url.searchParams.set('fq', `{!graph from=compara_neighbors_10 to=compara_idx_multi maxDepth=1}gene_tree:${treeId}`);\n url.searchParams.set('rows', '100000');\n url.searchParams.set('start', '0');\n fetch(url.toString(), {headers: {Accept: 'application/json'}})\n .then(res => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .then(json => {\n if (this._neighborhoodFetchedFor !== treeId) return;\n this.setState({neighborhood: fromGrameneNeighborhood(json), neighborhoodTreeId: treeId});\n })\n .catch(err => {\n console.warn('tbrowse neighborhood fetch failed:', err);\n this._neighborhoodFetchedFor = null;\n });\n }\n renderTreeVis() {\n return (\n <div className=\"gene-genetree\">\n <TreeVis genetree={this.tree}\n initialGeneOfInterest={this.gene}\n genomesOfInterest={this.props.grameneGenomes.active}\n taxonomy={this.taxonomy}\n allowGeneSelection={true}\n pivotTree={true}\n enableCuration={false}\n enablePhyloview={true}\n numberOfNeighbors={10}\n ensemblUrl={this.props.configuration.ensemblURL}/>\n </div>\n )\n }\n renderTBrowse() {\n const treeId = this.gene.homology.gene_tree.id;\n if (this._tbrowseTreeId !== treeId) {\n const raw = this.props.grameneTrees[treeId];\n const adapted = fromGrameneGenetree([raw]);\n this._tbrowseTreeId = treeId;\n this._tbrowseData = adapted;\n const pivot = computePivotState(adapted.tree, this.gene._id);\n const zoneIds = TBROWSE_ZONES.map(z => z.id);\n this._tbrowseInitialViewState = {\n selectedNodeId: null,\n collapsedNodeIds: pivot ? pivot.collapsedNodeIds : [],\n prunedNodeIds: [],\n swappedNodeIds: pivot ? pivot.swappedNodeIds : [],\n compressedNodeIds: [],\n nodeOfInterestId: pivot ? pivot.targetId : null,\n zones: zoneIds.map(id => ({id, width: 25, visible: true})),\n zoneStates: {},\n search: null,\n };\n }\n this.fetchNeighborhood(treeId);\n const neighborhood = this.state.neighborhoodTreeId === treeId ? this.state.neighborhood : undefined;\n return (\n <div className=\"gene-genetree\" style={{height: 600, width: '100%'}}>\n <TBrowse\n tree={this._tbrowseData.tree}\n taxonomy={this._tbrowseData.taxonomy}\n msa={this._tbrowseData.msa}\n geneMetadata={this._tbrowseData.geneMetadata}\n proteinDomains={this._tbrowseData.proteinDomains}\n exonJunctions={this._tbrowseData.exonJunctions}\n neighborhood={neighborhood}\n zones={TBROWSE_ZONES}\n nodeOfInterest={this.gene._id}\n initialViewState={this._tbrowseInitialViewState}\n />\n </div>\n )\n }\n renderViewerToggle() {\n const {viewer} = this.state;\n const btn = (id, label) => (\n <button\n key={id}\n type=\"button\"\n onClick={() => this.setState({viewer: id})}\n style={{\n padding: '4px 10px',\n marginRight: 4,\n fontSize: 12,\n border: '1px solid #ccc',\n background: viewer === id ? '#2878dc' : '#fff',\n color: viewer === id ? '#fff' : '#222',\n cursor: 'pointer',\n borderRadius: 3,\n }}>\n {label}\n </button>\n );\n return (\n <div style={{margin: '8px 0'}}>\n {btn('treevis', 'TreeVis')}\n {btn('tbrowse', 'TBrowse (beta)')}\n </div>\n );\n }\n filterAllHomologs() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'gene_tree',\n fq_value: this.tree._id,\n name: `Homologs of ${this.gene.name}`\n }))\n }\n filterOrthologs() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'homology__all_orthologs',\n fq_value: this.gene._id,\n name: `Orthologs of ${this.gene.name}`\n }))\n }\n filterParalogs() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'homology__within_species_paralog',\n fq_value: this.gene._id,\n name: `Paralogs of ${this.gene.name}`\n }))\n }\n searchSupertree() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'supertree_attr_s',\n fq_value: this.gene.homology.supertree,\n name: this.gene.homology.supertree\n }))\n }\n orthologList() {\n return this.orthoParaList('ortholog');\n }\n\n paralogList() {\n return this.orthoParaList('within_species_paralog');\n }\n\n orthoParaList(type) {\n var homology, thisGeneId;\n homology = _.get(this.gene, 'homology.homologous_genes');\n thisGeneId = this.gene._id;\n\n if (homology) {\n var homologs = _(homology)\n .pickBy(function filterCategories(thing, name) {\n return name.indexOf(type) === 0;\n })\n .values()\n .flatten()\n .uniq()\n .value();\n\n if (!_.isEmpty(homologs)) {\n if (!homologs.includes(thisGeneId)) {\n console.log(\"add to homologs list\",thisGeneId);\n homologs.push(thisGeneId);\n }\n return homologs; // only return something if we have something. We're testing for truthiness later.\n }\n }\n }\n explorations() {\n let x = [{\n name: 'Homologs',\n category: 'Gene Tree',\n count: this.tree.geneCount,\n handleClick: this.filterAllHomologs.bind(this)\n }];\n if (this.orthologs) {\n x.push({\n name: 'Orthologs',\n category: 'Gene Tree',\n count: this.orthologs.length,\n handleClick: this.filterOrthologs.bind(this)\n });\n }\n if (this.paralogs) {\n x.push({\n name: 'Paralogs',\n category: 'Gene Tree',\n count: this.paralogs.length,\n handleClick: this.filterParalogs.bind(this)\n });\n }\n if (this.gene.homology.supertree) {\n x.push({\n name: `Supertree`,\n category: `Gene Tree`,\n count: this.gene.homology.supertree,\n handleClick: this.searchSupertree.bind(this)\n })\n }\n return x;\n }\n links() {\n let links = [\n {\n name: 'Ensembl Gene Tree view',\n url: `${this.props.configuration.ensemblURL}/${this.gene.system_name}/Gene/Compara_Tree?g=${this.gene._id}`\n }\n ];\n if (this.props.curation && this.props.curation.taxa.hasOwnProperty(this.gene.taxon_id)) {\n links.push({\n name: 'Curate',\n url: this.props.curation.url + this.gene._id\n })\n }\n return links;\n }\n render() {\n const id = this.props.searchResult.id;\n if (!this.props.geneDocs.hasOwnProperty(id)) {\n return <Spinner/>\n }\n this.gene = this.props.geneDocs[id];\n const treeId = this.gene.homology.gene_tree.id;\n if (! this.props.grameneTrees.hasOwnProperty(treeId)) {\n this.props.doRequestGrameneTree(treeId);\n }\n else {\n const tree = this.props.grameneTrees[treeId];\n if (tree.hasOwnProperty('taxon_id')) {\n this.tree = treesClient.genetree.tree([this.props.grameneTrees[treeId]]);\n this.orthologs = this.orthologList();\n this.paralogs = this.paralogList();\n }\n }\n let flagged=0;\n // if (this.props.curation && this.props.curation.taxa.hasOwnProperty(this.gene.taxon_id)) {\n // flagged = this.props.curatedGenes && this.props.curatedGenes[id] ? this.props.curatedGenes[id].flagged : 0;\n // }\n return (\n <Detail>\n <Title key=\"title\">Compara Gene Tree</Title>\n <Description key=\"description\">\n This phylogram shows the relationships between this gene and others similar to it, as determined by Ensembl Compara.\n {flagged > 1 && <Alert variant={'warning'}>This gene was flagged for potential gene structural annotation issues by {flagged} curators</Alert>}\n </Description>\n {this.tree && <Content key=\"content\">\n {this.renderViewerToggle()}\n {this.state.viewer === 'tbrowse' ? this.renderTBrowse() : this.renderTreeVis()}\n </Content>}\n {this.tree && <Explore key=\"explore\" explorations={this.explorations()}/>}\n <Links key=\"links\" links={this.links()}/>\n </Detail>\n )\n }\n}\n\nexport default connect(\n 'selectGrameneTaxonomy',\n 'selectGrameneTrees',\n 'selectGrameneGenomes',\n 'selectGrameneAPI',\n 'selectConfiguration',\n 'selectCuration',\n 'selectCuratedGenes',\n 'doRequestGrameneTree',\n 'doAcceptGrameneSuggestion',\n 'doReplaceGrameneFilters',\n Homology\n);\n\n","import React, { useState, useEffect, useLayoutEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport keyBy from 'lodash/keyBy';\nimport _ from \"lodash\";\nimport ReactGA from \"react-ga4\";\nimport { BiLinkExternal } from \"react-icons/bi\";\nimport { Button, Badge, Modal } from \"react-bootstrap\";\n\n// Controlled fullscreen wrapper. Parent owns `fullscreen` state and the\n// `onExitFullscreen` callback.\n//\n// To keep embedded widgets (Reactome diagram, BioDalliance, TBrowse)\n// alive across the toggle, the children render through createPortal\n// into a single STABLE detached div. We then physically move that div\n// between an inline anchor and the modal body via appendChild — React\n// never sees the portal target change, so it never unmounts the\n// children. The widgets' DOM, canvases, and event handlers move with\n// the div.\nexport const FullscreenContainer = ({ fullscreen, onExitFullscreen, title, className, children }) => {\n const [stableNode] = useState(() =>\n typeof document !== 'undefined' ? document.createElement('div') : null\n );\n const inlineRef = useRef(null);\n const modalRef = useRef(null);\n\n useLayoutEffect(() => {\n if (!stableNode) return;\n if (className) stableNode.className = className;\n const parent = fullscreen ? modalRef.current : inlineRef.current;\n if (parent && stableNode.parentNode !== parent) {\n parent.appendChild(stableNode);\n }\n });\n\n useEffect(() => {\n // Container width changes when toggling fullscreen. Embedded widgets\n // that listen for window resize (Pathways, etc.) re-measure on this\n // event.\n window.dispatchEvent(new Event('resize'));\n }, [fullscreen]);\n\n return (\n <>\n <div ref={inlineRef} />\n {fullscreen && (\n <Modal show fullscreen onHide={onExitFullscreen}>\n <Modal.Header closeButton>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div ref={modalRef} />\n </Modal.Body>\n </Modal>\n )}\n {stableNode && createPortal(children, stableNode)}\n </>\n );\n};\n\nexport const Detail = props => {\n const subComponents = keyBy(props.children, 'key');\n return (\n <div className=\"detail\">\n <div className=\"intro\">\n {subComponents.title}\n {subComponents.description}\n </div>\n <div className=\"content-wrapper\">\n {subComponents.content}\n </div>\n <div className=\"actions\">\n <div className=\"action-wrapper\" xs={12} sm={5}>\n {subComponents.explore}\n </div>\n <div className=\"action-wrapper\" xs={12} sm={7}>\n {subComponents.links}\n </div>\n </div>\n </div>\n );\n};\n\nexport const Title = props => <h4>{props.children}</h4>;\nexport const Description = props => <p className=\"description\">{props.children}</p>;\nexport const Content = props => <div className=\"content\">{props.children}</div>;\n\nconst QueryTerm = props => {\n let category, name, badge;\n name = props.name;\n if (props.category) {\n category = props.category + ' | ';\n }\n if (_.isNumber(props.count)) {\n badge = <Badge style={{marginLeft: \"0.5rem\"}} bg='secondary'>{props.count}</Badge>\n }\n return (\n <Button variant='outline-dark' onClick={props.handleClick}>\n {category}{name}{badge}\n </Button>\n )\n};\n\nfunction renderExplorations(explorations) {\n return explorations.map(\n (exploration, idx) =>\n <QueryTerm key={idx} {...exploration} />\n );\n}\nexport const Explore = props => (\n <div className=\"explore\">\n <h5>Search Filters</h5>\n <div>\n {renderExplorations(props.explorations)}\n </div>\n </div>\n);\n\nfunction renderLinks(links) {\n let external = <small title=\"This link opens a page from an external site\"> <BiLinkExternal/></small>;\n return links.map((link, idx) =>\n <li key={idx}>\n <a href={link.url} target=\"_blank\" className=\"external-link\" onClick={()=>{\n ReactGA.event({\n category: \"outbound link\", action: \"follow\", label: link.name\n })\n }}>{link.name}{external}</a>\n {/*<ReactGA.OutboundLink*/}\n {/* eventLabel={link.name}*/}\n {/* to={link.url}*/}\n {/* target=\"_blank\"*/}\n {/* className=\"external-link\"*/}\n {/*>*/}\n {/* {link.name}{external}*/}\n {/*</ReactGA.OutboundLink>*/}\n </li>\n )\n}\n\nexport const Links = props => (\n <div className=\"links\">\n <h5>Links to other resources</h5>\n <ul>\n {renderLinks(props.links)}\n </ul>\n </div>\n);\n","import { initializeApp, getApps, getApp } from \"firebase/app\";\n\nexport const getFirebaseApp = (config) => {\n if (!config) return null;\n const name = config.projectId || '[DEFAULT]';\n if (getApps().some(a => a.name === name)) return getApp(name);\n return initializeApp(config, name);\n};\n\nexport const suggestionToFilters = (suggestion) => {\n return {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 3,\n children: [\n {\n fq_field: suggestion.fq_field,\n fq_value: suggestion.fq_value,\n name: suggestion.name,\n category: suggestion.category,\n leftIdx: 1,\n rightIdx: 2,\n negate: false,\n marked: false\n }\n ]\n }\n}\n","import React from 'react'\nimport getProp from 'lodash/get';\nimport isEqual from 'lodash/isEqual';\nimport {Button} from \"react-bootstrap\";\nimport Browser from \"./location/browser\";\nimport {connect} from \"redux-bundler-react\";\nimport {Detail, Title, Description, Content, Explore, Links} from \"./generic\";\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/msa.less';\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/tree.less';\n\nclass Location extends React.Component {\n constructor(props) {\n super(props);\n this.gene = this.props.geneDocs[this.props.searchResult.id];\n this.initRegion();\n this.state = {\n visibleRange: this.initVisibleRange()\n };\n }\n\n initVisibleRange() {\n var location, span, padding, result;\n location = this.gene.location;\n if(!location) {\n throw new Error(`Could not find the location of the gene in props.`);\n }\n\n span = location.end - location.start + 1;\n padding = Math.floor(.1 * span);\n\n result = {\n chr: location.region,\n start: location.start - padding,\n end: location.end + padding\n };\n\n result.displayName = `${result.chr}:${result.start}-${result.end}`;\n\n return result;\n }\n\n initRegion() {\n var region, isChromosome, regionType, regionName;\n region = this.gene.location.region;\n if (region) {\n isChromosome = /^\\d+$/.test(region);\n if (isChromosome) {\n regionType = 'chromosome';\n regionName = 'Chromosome ' + region;\n }\n else {\n regionType = 'scaffold';\n regionName = region;\n }\n this.region = {\n isChromsome: isChromosome,\n name: regionName,\n type: regionType\n };\n }\n }\n\n\n handleViewChange(chr, start, end) {\n var visibleRange = {\n chr: chr,\n start: start,\n end: end,\n displayName: `${chr}:${start}-${end}`\n };\n\n if(!isEqual(visibleRange, this.state.visibleRange)) {\n this.setState({\n visibleRange: visibleRange\n });\n }\n }\n\n updateQuery(restrictToVisibleRange) {\n var location, geneName, visibleRange, filter, filterDisplayName, fq;\n location = this.gene.location;\n geneName = this.gene.name;\n // category: 'Gene Tree',\n // fq_field: 'gene_tree',\n // fq_value: this.tree._id,\n // name: `Homologs of ${this.gene.name}`\n\n let terms = [\n {\n category: \"Map\",\n name: location.map,\n fq_field: 'map',\n fq_value: location.map\n },\n {\n category: \"Region\",\n name: location.region,\n fq_field: 'region',\n fq_value: location.region\n }\n ];\n fq = `map:${location.map} AND region:${location.region}`;\n\n if (restrictToVisibleRange) {\n visibleRange = this.state.visibleRange;\n\n terms.push({\n category: \"Interval\",\n name: `${visibleRange.start}-${visibleRange.end}`,\n fq_field: 'start',\n fq_value: `[${visibleRange.start} TO ${visibleRange.end}]`\n });\n fq += ` AND (start:[${visibleRange.start} TO ${visibleRange.end}]`\n + ` OR end:[${visibleRange.start} TO ${visibleRange.end}])`;\n\n filterDisplayName = visibleRange.displayName;\n } else {\n filterDisplayName = \"Shares \" + this.region.type + \" with \" + geneName;\n }\n\n console.log(\"User asked to filter by location\");\n filter = {\n category: 'Location',\n id: fq,\n fq: fq,\n display_name: filterDisplayName\n };\n\n // QueryActions.removeAllFilters();\n // QueryActions.setFilter(filter);\n this.props.doAddGrameneRangeQuery(terms);\n if (this.props.closeModal) this.props.closeModal();\n }\n\n explorations() {\n var visible, result;\n visible = this.state.visibleRange;\n result = [\n {\n name: `All on ${this.region.name}`,\n handleClick: ()=>this.updateQuery(false)\n }\n ];\n if (visible) {\n result.push({\n name: `All within ${getProp(visible, 'displayName')}`,\n handleClick: ()=>this.updateQuery(true)\n });\n }\n return result;\n }\n\n links() {\n function jgiify(id) {\n return id.replace('SORBI_3','Sobic.').replace(/\\.v[0-9]\\.[0-9]$/,'');\n }\n var gene = this.gene;\n let links = [\n {name: 'Ensembl Browser', url: `${this.props.config.ensemblURL}/${gene.system_name}/Gene/Summary?g=${gene._id}`}\n ];\n if (gene.annotations.taxonomy.ancestors.includes(4557))\n links.push({name: 'Phytozome', url: `https://phytozome-next.jgi.doe.gov/report/gene/Sbicolor_v5_1/${jgiify(gene._id)}`})\n if (gene.taxon_id === 3702)\n links.push(\n {name: 'tair', url: `https://www.arabidopsis.org/servlets/TairObject?name=${gene._id}&type=locus`},\n {name: 'ThaleMine', url: `https://bar.utoronto.ca/thalemine/keywordSearchResults.do?searchTerm=${gene._id}&searchSubmit=search`}\n );\n if (gene.taxon_id === 39947)\n links.push({name: 'RAP-DB', url: `https://rapdb.dna.affrc.go.jp/locus/?name=${gene._id}`});\n const isMaize = new RegExp(/^Zm[0-9]+/);\n if (isMaize.test(gene._id))\n links.push({name: 'MaizeGDB', url: `http://www.maizegdb.org/gene_center/gene/${gene._id}`});\n return links;\n }\n\n render() {\n return (\n <Detail>\n {/*<Title key=\"title\">Genome location: {this.renderGenePosition()}</Title>*/}\n <Description key=\"description\">Currently viewing: {this.renderLocation()} {this.renderResetButton()}</Description>\n <Content key=\"content\">\n {this.renderBrowser()}\n </Content>\n <Explore key=\"explore\" explorations={this.explorations()}/>\n <Links key=\"links\" links={this.links()}/>\n </Detail>\n );\n }\n\n\n renderBrowser() {\n return (\n <Browser gene={this.gene} {...this.props} {...this.state} onViewChange={ this.handleViewChange.bind(this) }/>\n );\n }\n\n renderGenePosition() {\n var location = this.gene.location;\n return (\n <span className=\"location\">\n <span className=\"region\">{this.region.name}</span>:<span className=\"start\">{location.start}</span>-<span\n className=\"end\">{location.end}</span>\n </span>\n );\n }\n\n renderLocation() {\n var location = this.state.visibleRange;\n return (\n <span className=\"location\">\n <span className=\"region\">{location.chr}</span>:<span className=\"start\">{location.start}</span>-<span\n className=\"end\">{location.end}</span>\n </span>\n );\n }\n\n resetVisibleRange() {\n const {chr, start, end} = this.initVisibleRange();\n this.handleViewChange(chr, start, end);\n }\n\n renderResetButton() {\n // let active=isEqual(this.props.visibleRange, this.state.visibleRange);\n return (\n <Button\n size=\"sm\"\n variant=\"outline-dark\"\n onClick={() => this.resetVisibleRange()}>\n Reset\n </Button>\n )\n }\n}\n\nexport default connect('doAddGrameneRangeQuery',Location);\n\n","import React from \"react\";\nimport DallianceBrowser from \"./dallianceBrowser.js\";\n\nexport default class Browser extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n <div className=\"location-browser\" style={{ position: 'relative', overflow: 'hidden' }}>\n <DallianceBrowser {...this.props} expanded={!!this.props.closeModal} />\n </div>\n )\n }\n\n}\n\n// Browser.propTypes = {\n// gene: React.PropTypes.object.isRequired,\n// expanded: React.PropTypes.bool,\n// visibleRange: React.PropTypes.object.isRequired,\n// onViewChange: React.PropTypes.func.isRequired\n// };","import React from \"react\";\nimport isEqual from \"lodash/isEqual\";\n\n// var ensemblREST = require('../../../../../package.json').gramene.ensemblREST;\n//const ensemblREST = 'http://data.gramene.org/ensembl63';\n// const ensemblREST = 'https://data.sorghumbase.org/ensembl2';\n// const ensemblREST = 'https://data.gramene.org/vitis-ensembl1';\n// const ensemblREST = 'https://data.gramene.org/pansite-ensembl';\n\n// calculate this once.\nconst PREFIX = '/static/gramene-dalliance/';\n\nexport default class DallianceBrowser extends React.Component {\n\n constructor(props) {\n super(props);\n this.initialVisibleRange = props.visibleRange;\n }\n\n shouldComponentUpdate(newProps) {\n // should we reset the view to initial state?\n if(isEqual(newProps.visibleRange, this.initialVisibleRange)) {\n this.browser.setLocation(newProps.visibleRange.chr, newProps.visibleRange.start, newProps.visibleRange.end);\n }\n\n return false;\n }\n\n biodallianceElementId() {\n return this.props.gene._id + 'Browser';\n }\n\n browser() {\n var g, view, start, end, browser;\n g = this.props.gene;\n view = this.props.visibleRange;\n start = view.start;\n end = view.end;\n\n this.browser = browser = new Browser(\n {\n pageName: this.biodallianceElementId(),\n chr: g.location.region,\n viewStart: start,\n viewEnd: end,\n cookieKey: g._id + 'BrowserCookie',\n prefix: PREFIX,\n\n coordSystem: {\n speciesName: g.system_name,\n taxon: g.taxon_id,\n auth: 'Gramene',\n version: '3',\n ucscName: 'IRGSP-1.0'\n },\n\n sources: [\n {\n name: 'DNA',\n ensemblURI: this.props.config.ensemblRest,\n species: g.system_name,\n tier_type: 'sequence'\n },\n {\n name: 'Genes',\n uri: this.props.config.ensemblRest,\n tier_type: 'ensembl',\n species: g.system_name,\n type: ['gene', 'transcript', 'exon', 'cds']\n }\n ],\n\n // hubs: ['/Track_Hubs/DRP000315/hub.txt'],\n disablePoweredBy: true,\n setDocumentTitle: false,\n noDefaultLabels: true,//!this.props.expanded,\n noPersist: true,\n noPersistView: true,\n maxWorkers: 2,\n noTitle: true,\n noLocationField: false,\n noLeapButtons: true,//!this.props.expanded,\n noZoomSlider: false, //!this.props.expanded,\n noTrackAdder: true,//!this.props.expanded,\n noTrackEditor: true,//!this.props.expanded,\n noExport: true,//!this.props.expanded,\n noOptions: true,//!this.props.expanded,\n noHelp: true,\n maxViewWidth: 1000000\n }\n );\n\n browser.addViewListener(this.props.onViewChange);\n }\n\n cancel() {\n if (typeof this.timeoutID == \"number\") {\n window.clearTimeout(this.timeoutID);\n delete this.timeoutID;\n }\n }\n\n componentDidMount() {\n // this.browser();\n this.cancel();\n var self = this;\n this.timeoutID = window.setTimeout(function () {self.browser();}, 0);\n }\n\n componentWillUnmount() {\n this.cancel();\n }\n\n render() {\n return (\n <div id={this.biodallianceElementId()}/>\n );\n }\n}\n\n// DallianceBrowser.propTypes = {\n// gene: React.PropTypes.object.isRequired,\n// visibleRange: React.PropTypes.object.isRequired,\n// expanded: React.PropTypes.bool,\n// onViewChange: React.PropTypes.func.isRequired\n// };\n","import React from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport FlatToNested from 'flat-to-nested';\nimport {Explore, Links} from \"./generic\";\nimport treesClient from \"gramene-trees-client\";\nimport TreeMenu from \"react-simple-tree-menu\";\nimport '../../../../node_modules/react-simple-tree-menu/dist/main.css';\n\nimport {Spinner} from \"react-bootstrap\";\nimport _ from 'lodash'\nimport \"./tree-view.css\"\n\nconst reactomeURL = \"https://plantreactome.gramene.org\";\n\n// The Reactome Diagram library is GWT-compiled and uses a single shared\n// GWT iframe + window globals — multiple Reactome.Diagram instances on\n// the same page step on each other. We work around this by rendering\n// each pathway diagram inside its own <iframe>, so each gets its own\n// document + window + Reactome global. The iframe communicates with\n// the parent through postMessage.\nfunction buildIframeSrcDoc() {\n const proxy = JSON.stringify(reactomeURL);\n return `<!DOCTYPE html>\n<html><head>\n <style>html,body{margin:0;padding:0;height:100%;width:100%;overflow:hidden;}</style>\n <script async src=\"${reactomeURL}/DiagramJs/diagram/diagram.nocache.js\"><\\/script>\n</head><body>\n <div id=\"holder\" style=\"width:100%;height:100%;\"></div>\n <script>\n (function(){\n var diagram = null;\n var loadedPathway = null;\n var pendingPathwayId = null;\n var pendingReactionId = null;\n var pendingFlag = null;\n var resizeTimer = null;\n\n function dimensions() {\n return [\n Math.max(100, document.body.clientWidth),\n Math.max(100, document.body.clientHeight)\n ];\n }\n\n function whenReady(cb) {\n if (window.Reactome && window.Reactome.Diagram) cb();\n else setTimeout(function(){ whenReady(cb); }, 100);\n }\n\n function applyLoad() {\n if (!pendingPathwayId) return;\n whenReady(function(){\n if (diagram) {\n try { diagram.detach(); } catch(e) {}\n }\n var dims = dimensions();\n diagram = window.Reactome.Diagram.create({\n proxyPrefix: ${proxy},\n placeHolder: 'holder',\n width: dims[0],\n height: dims[1]\n });\n var pw = pendingPathwayId;\n diagram.loadDiagram(pw);\n diagram.onDiagramLoaded(function(){\n loadedPathway = pw;\n if (pendingFlag) diagram.flagItems(pendingFlag);\n if (pendingReactionId) diagram.selectItem(pendingReactionId);\n });\n });\n }\n\n window.addEventListener('message', function(e){\n var data = e.data;\n if (!data || typeof data !== 'object') return;\n if (data.type === 'load') {\n pendingPathwayId = data.pathwayId || null;\n pendingReactionId = data.reactionId || null;\n if (data.flag) pendingFlag = data.flag;\n applyLoad();\n } else if (data.type === 'select') {\n pendingReactionId = data.id || null;\n if (diagram && loadedPathway) {\n if (data.id) diagram.selectItem(data.id);\n else diagram.resetSelection();\n }\n }\n });\n\n window.addEventListener('resize', function(){\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(function(){\n if (loadedPathway) applyLoad();\n }, 300);\n });\n })();\n <\\/script>\n</body></html>`;\n}\n\nclass Pathways extends React.Component {\n constructor(props) {\n super(props);\n this.taxonomy = treesClient.taxonomy.tree(Object.values(props.grameneTaxonomy))\n this.gene = props.geneDocs[props.searchResult.id];\n this.iframeRef = React.createRef();\n // srcDoc is constant — the per-instance pathway/reaction state is\n // pushed in via postMessage so changing pathway doesn't reload the\n // GWT script.\n this._iframeSrcDoc = buildIframeSrcDoc();\n this._iframeReady = false;\n this.state = {\n treeVisible: true,\n height: 500,\n currentPathwayId: null,\n currentReactionId: null,\n };\n }\n\n postLoad() {\n const win = this.iframeRef.current && this.iframeRef.current.contentWindow;\n if (!win || !this.state.currentPathwayId) return;\n win.postMessage({\n type: 'load',\n pathwayId: this.state.currentPathwayId,\n reactionId: this.state.currentReactionId,\n flag: this.gene._id,\n }, '*');\n }\n\n postSelect() {\n const win = this.iframeRef.current && this.iframeRef.current.contentWindow;\n if (!win) return;\n win.postMessage({ type: 'select', id: this.state.currentReactionId || null }, '*');\n }\n\n handleIframeLoad = () => {\n this._iframeReady = true;\n if (this.state.currentPathwayId) this.postLoad();\n }\n\n startResize(e) {\n e.preventDefault();\n const startY = e.clientY;\n const startHeight = this.state.height;\n\n const onMouseMove = (moveEvent) => {\n const newHeight = Math.max(200, startHeight + (moveEvent.clientY - startY));\n this.setState({ height: newHeight });\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n\n toggleTree() {\n this.setState({ treeVisible: !this.state.treeVisible });\n }\n\n stableId(dbId) {\n let prefix = this.taxonomy.indices.id[this.gene.taxon_id].model.reactomePrefix || 'OSA';\n return `R-${prefix}-${dbId}`;\n }\n\n loadDiagram(pathwayId, reactionId) {\n this.setState({\n currentPathwayId: pathwayId,\n currentReactionId: reactionId || null,\n });\n }\n\n componentDidMount() {\n // If pathway docs are already cached, build the hierarchy now so the\n // initial render selects a default node (componentDidUpdate would\n // otherwise never run if no redux change follows the mount).\n if (!this.state.hierarchy && this.pathwayIds) {\n const haveDocs = this.pathwayIds.filter(id => this.props.gramenePathways.hasOwnProperty(id));\n if (haveDocs.length === this.pathwayIds.length) {\n const docs = this.pathwayIds.map(id => this.props.gramenePathways[id]);\n this.getHierarchy(this.makeTaxonSpecific(docs, this.gene.taxon_id));\n }\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (this.state.hierarchy && !this.state.selectedNode) {\n let node = this.state.hierarchy[0];\n let path = [0];\n while (node.nodes) {\n path.push(0);\n node = node.nodes[0];\n }\n this.loadNodes(path);\n }\n if (!this.state.hierarchy && this.pathwayIds) {\n const haveDocs = this.pathwayIds.filter(id => this.props.gramenePathways.hasOwnProperty(id));\n if (haveDocs.length === this.pathwayIds.length) {\n const docs = this.pathwayIds.map(id => this.props.gramenePathways[id]);\n this.getHierarchy(this.makeTaxonSpecific(docs, this.gene.taxon_id));\n }\n }\n if (this._iframeReady) {\n if (prevState.currentPathwayId !== this.state.currentPathwayId && this.state.currentPathwayId) {\n this.postLoad();\n } else if (prevState.currentReactionId !== this.state.currentReactionId &&\n prevState.currentPathwayId === this.state.currentPathwayId) {\n this.postSelect();\n }\n }\n }\n\n componentWillMount() {\n const pathways = this.gene.annotations.pathways;\n if (!pathways) {\n throw new Error(\"No pathway annotation present for \" + this.gene._id);\n }\n this.pathwayIds = _.clone(pathways.ancestors);\n pathways.entries.forEach(reaction => {\n const [, , id] = reaction.id.split('-');\n this.pathwayIds.push(+id);\n });\n this.props.doRequestGramenePathways(this.pathwayIds);\n }\n\n makeTaxonSpecific(docs, taxon_id) {\n let lineageField = 'lineage_' + taxon_id;\n if (!docs[0].hasOwnProperty(lineageField)) {\n let tid = Math.floor(taxon_id / 1000);\n lineageField = 'lineage_' + tid;\n }\n return docs.map(doc => {\n let tsDoc = _.pick(doc, ['_id', 'name', 'type']);\n tsDoc.lineage = doc[lineageField];\n return tsDoc;\n });\n }\n\n getHierarchy(docs) {\n const pathways = _.keyBy(docs, '_id');\n const nodes = [];\n this.pathwayIds.forEach(pwyId => {\n if (pathways[pwyId]) {\n const pwy = pathways[pwyId];\n pwy.lineage.forEach(line => {\n const parentOffset = line.length - 2;\n nodes.push({\n id: pwyId,\n key: pwyId,\n label: pwy.name,\n type: pwy.type,\n checkbox: false,\n selected: false,\n parent: parentOffset >= 0 ? line[parentOffset] : undefined,\n });\n });\n }\n });\n const nested = new FlatToNested({ children: 'nodes' }).convert(nodes);\n this.setState({ hierarchy: [nested], selectedNode: undefined });\n }\n\n possiblyLoadNodes(node) {\n if (!node.selected) {\n let selectedNode = this.state.selectedNode;\n if (selectedNode) selectedNode.selected = false;\n node.selected = true;\n selectedNode = node;\n if (node.type === \"Pathway\") {\n this.loadDiagram(this.stableId(node.id));\n } else {\n const reaction = this.stableId(node.id);\n const pathway = this.stableId(node.parent.split(\"/\").pop());\n this.loadDiagram(pathway, reaction);\n }\n this.setState({ selectedNode });\n }\n }\n\n loadNodes(nodes) {\n let hierarchy = this.state.hierarchy;\n let selectedNode = this.state.selectedNode;\n let offset = nodes.shift();\n let nodeRef = hierarchy[offset];\n let lineage = [nodeRef];\n while (nodeRef.nodes) {\n nodeRef = nodeRef.nodes[0];\n lineage.unshift(nodeRef);\n }\n if (lineage[0].id !== 2894885) {\n let pathway = this.stableId(lineage[0].id);\n let reaction = undefined;\n if (lineage[0].type === \"Reaction\") {\n reaction = pathway;\n pathway = this.stableId(lineage[1].id);\n }\n if (lineage[0].selected) {\n selectedNode = undefined;\n lineage[0].selected = false;\n this.loadDiagram(pathway);\n } else {\n if (selectedNode) selectedNode.selected = false;\n selectedNode = lineage[0];\n lineage[0].selected = true;\n if (reaction) this.loadDiagram(pathway, reaction);\n else this.loadDiagram(pathway);\n }\n this.setState({ hierarchy, selectedNode });\n }\n }\n\n renderHierarchy() {\n if (this.state.hierarchy) {\n const path = [];\n const allPaths = [];\n let nodes = this.state.hierarchy;\n while (nodes) {\n path.push(nodes[0].key);\n allPaths.push(path.join('/'));\n nodes = nodes[0].nodes ? nodes[0].nodes : undefined;\n }\n return <TreeMenu\n data={this.state.hierarchy}\n hasSearch={false}\n onClickItem={(item) => this.possiblyLoadNodes(item)}\n initialActiveKey={path.join('/')}\n initialOpenNodes={allPaths}\n />;\n }\n return <Spinner/>;\n }\n\n updateQuery() {\n this.props.doAcceptGrameneSuggestion({\n category: 'Plant Reactome',\n fq_field: 'pathways__ancestors',\n fq_value: this.state.selectedNode.id,\n name: this.state.selectedNode.label,\n });\n }\n\n render() {\n let reactomeLink, searchFilter;\n if (this.state.selectedNode) {\n const xrefLUT = _.keyBy(this.gene.xrefs, 'db');\n const links = [\n { name: 'Plant Reactome ' + this.state.selectedNode.type, url: `${reactomeURL}/content/detail/${this.stableId(this.state.selectedNode.id)}` }\n ];\n if (xrefLUT.hasOwnProperty('notGramene_Plant_Reactome')) {\n links.push({ name: 'Plant Reactome Gene', url: `${reactomeURL}/content/detail/${xrefLUT.notGramene_Plant_Reactome.ids[0]}` });\n }\n reactomeLink = <Links key=\"links\" links={links}/>;\n const filters = [\n {\n name: `All genes in this ${this.state.selectedNode.type}`,\n handleClick: () => this.updateQuery(),\n },\n ];\n searchFilter = <Explore key=\"explore\" explorations={filters}/>;\n }\n return (\n <div className=\"pathways-container\">\n <div className=\"pathways-layout\" style={{ height: this.state.height }}>\n <button\n className=\"pathways-tree-toggle\"\n onClick={() => this.toggleTree()}\n title={this.state.treeVisible ? 'Hide pathway hierarchy' : 'Show pathway hierarchy'}\n >\n {this.state.treeVisible ? '◀' : '▶'}\n </button>\n {this.state.treeVisible && (\n <div className=\"pathways-tree-panel\">\n {this.renderHierarchy()}\n </div>\n )}\n <div className=\"pathways-diagram-panel\">\n <iframe\n ref={this.iframeRef}\n onLoad={this.handleIframeLoad}\n srcDoc={this._iframeSrcDoc}\n title=\"Pathway diagram\"\n style={{ width: '100%', height: '100%', border: 0, display: 'block' }}\n />\n </div>\n </div>\n <div\n className=\"pathways-resize-handle\"\n onMouseDown={(e) => this.startResize(e)}\n title=\"Drag to resize\"\n />\n {searchFilter}\n {reactomeLink}\n </div>\n );\n }\n}\n\nexport default connect(\n 'selectGrameneTaxonomy',\n 'selectGramenePathways',\n 'doRequestGramenePathways',\n 'doAcceptGrameneSuggestion',\n Pathways\n);\n","import React, {useState, useEffect, useRef, useCallback} from 'react';\nimport {connect} from \"redux-bundler-react\";\nimport {Button} from 'react-bootstrap';\nimport { AgGridReact } from \"ag-grid-react\";\nimport _ from 'lodash';\nimport \"ag-grid-community/styles/ag-grid.css\";\nimport \"ag-grid-community/styles/ag-theme-quartz.css\";\nimport '@fortawesome/fontawesome-free/css/all.min.css';\nimport \"./VEP.css\";\nimport { study_info } from '../../../vepStudyInfo';\n\nconst ggURL = {\n xIRRI: 'https://gringlobal.irri.org/gringlobal/accessiondetail?id=',\n IRRI: 'https://www.irri.org/genesys-rice#/a/',\n ARS: 'https://npgsweb.ars-grin.gov/gringlobal/accessiondetail.aspx?id=',\n ICRISAT: 'https://genebank.icrisat.org/IND/PassportSummary?ID=',\n sorbmutdb: 'https://www.depts.ttu.edu/igcast/sorbmutdb.php',\n maizeGDB: 'https://wgs.maizegdb.org/',\n NCBI: 'https://www.ncbi.nlm.nih.gov/biosample/?term='\n};\n\nconst rice_studies = {'1': {label: 'Rice 3K', type: 'NAT'}};\nconst AccessionLink = ({germplasm, gene_id}) => {\n const genebank = germplasm.stock_center;\n const url = ggURL[genebank];\n if (germplasm.germplasm_dbid) { // link to stock center\n const germ_id = germplasm.germplasm_dbid;\n if (germ_id && url && germ_id !== \"0\") {\n return <a target=\"_blank\" href={`${url}${germ_id}`}>\n {germplasm.pub_id} ({genebank})</a>;\n }\n }\n if (genebank === \"sorbmutdb\") {\n return (\n <form id={germplasm.pub_id} action={url} method=\"post\" target=\"_blank\">\n <input type=\"hidden\" name=\"search\" value={gene_id.replace('SORBI_3','Sobic.')} />\n <input type=\"hidden\" name=\"submit\" value=\"Search\" />\n <button type=\"submit\" className=\"button-like-link\">SorbMutDB</button>\n </form>\n );\n }\n if (germplasm.pop_id === '15' && germplasm.stock_center === 'NOT FOUND') {\n return <a target=\"_blank\" href={ggURL['maizeGDB']}>{germplasm.pub_id} (SNPVersity)</a>\n }\n return <span>{germplasm.pub_id}</span>\n}\nfunction compareGermplasm(a, b) {\n const aSub = a?.germplasm?.subpop ?? '';\n const bSub = b?.germplasm?.subpop ?? '';\n const subCmp = aSub.localeCompare(bSub, 'en', { sensitivity: 'accent' });\n if (subCmp !== 0) return subCmp;\n\n const aPub = a?.germplasm?.pub_id ?? '';\n const bPub = b?.germplasm?.pub_id ?? '';\n return aPub.localeCompare(bPub, 'en', { sensitivity: 'accent' });\n}\nfunction group_germplasm(gene, germplasmLUT, vep_obj) {\n let accessionTable = [];\n Object.entries(vep_obj).forEach(([key,accessions]) => {\n const parts = key.split(\"__\");\n if (parts[0] === \"VEP\") {\n if (parts[1] !== \"merged\") {\n accessions.filter(ens_id => germplasmLUT.hasOwnProperty(ens_id)).forEach(ens_id => {\n const germplasm = germplasmLUT[ens_id][0];\n const pop = study_info[parts[3]][parts[4]];\n const conseq = parts[1].replaceAll(\"_\",\" \");\n const status = parts[2] === \"het\" ? \"heterozygous\" : \"homozygous\";\n const accInfo = {\n key: [pop.label,conseq,status].join('%%%'),\n germplasm: germplasm,\n pop: pop\n };\n accessionTable.push(accInfo);\n });\n }\n }\n });\n // group accessionTable by key field\n const groups = _.groupBy(accessionTable, 'key');\n let grouped = [];\n let id=0;\n Object.keys(groups).sort().forEach((group) => {\n const [pop,conseq,status] = group.split('%%%');\n id++;\n const tally = groups[group].length;\n grouped.push({\n id: id,\n group: group,\n summary: true,\n pop: pop,\n conseq: conseq,\n status: status,\n tally: tally\n });\n groups[group].sort(compareGermplasm).forEach(acc => {\n id++;\n grouped.push({\n id: id,\n group: group,\n summary: false,\n pop:pop,\n conseq: conseq,\n status: status,\n accession: acc,\n tally: tally\n })\n })\n })\n return grouped;\n}\nconst THRESHOLD = 5;\nconst GridWithGroups = ({groups,gene_id,doGrin}) => {\n const [rowData, setRowData] = useState(groups);\n\n const initialExpanded = {};\n rowData.forEach((row) => {\n if (row.summary) {\n initialExpanded[row.group] = (row.tally < THRESHOLD);\n }\n });\n const [expandedGroups, setExpandedGroups] = useState(initialExpanded);\n\n\n // Toggle group visibility\n const toggleGroup = (group) => {\n setExpandedGroups((prevExpandedGroups) => ({\n ...prevExpandedGroups,\n [group]: !prevExpandedGroups[group], // Toggle the group's state\n }));\n };\n\n // Filter the data to show/hide rows based on the expanded group state\n const getVisibleRowData = () => {\n const visibleRows = [];\n rowData.forEach((row) => {\n if (row.summary) {\n if (row.tally > 1) {\n visibleRows.push(row);\n }\n } else if (expandedGroups[row.group]) {\n visibleRows.push(row); // Show non-summary rows if the group is expanded\n }\n });\n return visibleRows;\n };\n\n // Define columns with a custom renderer for the summary rows\n const columnDefs = [\n { field: 'pop', headerName: 'Study/Population', flex: 1, minWidth: 120,\n cellRenderer: (params) => {\n if (params.data.summary || params.data.tally === 1) {\n return params.value;\n }\n return null;\n }\n },\n { field: 'conseq', headerName: 'VEP consequence', flex: 1, minWidth: 130,\n cellRenderer: (params) => {\n if (params.data.summary || params.data.tally === 1) {\n return params.value;\n }\n return null;\n }\n },\n { field: 'status', headerName: 'Allele status', flex: 1, minWidth: 100,\n cellRenderer: (params) => {\n if (params.data.summary || params.data.tally === 1) {\n return params.value;\n }\n return null;\n }\n },\n { field: 'accession', headerName: doGrin ? 'Order Germplasm' : 'Accession', flex: 1, minWidth: 140,\n headerComponent: (props) => {\n return (\n <div style={{display: 'flex', alignItems: 'center'}}>\n {doGrin && <i className=\"fas fa-shopping-cart\"> </i>}\n <span>{props.displayName}</span>\n </div>\n );\n }, // Use the custom header with the shopping cart icon\n cellRenderer: (params) => {\n if (params.value) {\n return <AccessionLink germplasm={params.value.germplasm} gene_id={gene_id} />;\n }\n if (params.data.summary) {\n return (\n <span\n onClick={() => toggleGroup(params.data.group)}\n >\n {params.data.tally} Accessions {expandedGroups[params.data.group] ? '▼' : '▶'}\n </span>\n );\n }\n return null;\n }\n },\n { field: 'synonym', headerName: 'Synonym', filter:false, sortable:false, flex: 1, minWidth: 110, cellRenderer: (params) => {\n if (params.data.accession) {\n return params.data.accession.germplasm.ens_id\n }\n return null;\n }},\n { field: 'subpop', headerName: 'Subpopulation', filter:false, sortable: false, flex: 1, minWidth: 110, cellRenderer: (params) => {\n if (params.data.accession && params.data.accession.germplasm.subpop && params.data.accession.germplasm.subpop !== \"?\") {\n return params.data.accession.germplasm.subpop\n }\n return null;\n }},\n { field: 'search', headerName: 'All LOF Genes', sortable:false, filter:false, flex: 1, minWidth: 100,\n cellRenderer: (params) => {\n if (params.data.accession) {\n const currentURL = new URL(window.location.href);\n const accession = params.data.accession;\n currentURL.search = '';\n currentURL.searchParams.set('category', 'Germplasm');\n currentURL.searchParams.set('fq_field', `VEP__merged__${accession.pop.type}__attr_ss`);\n currentURL.searchParams.set('fq_value', accession.germplasm.ens_id);\n currentURL.searchParams.set('name', accession.germplasm.ens_id);\n\n return <Button size='sm' href={currentURL.toString()}>Search</Button>\n\n }\n return null;\n }\n }\n ];\n\n const defaultColDef = {\n sortable: true,\n filter: \"agTextColumnFilter\",\n cellStyle: (params) => {\n if (params.data.summary) {\n return {cursor: 'pointer'};\n }\n return null;\n }\n };\n\n const nVisible = getVisibleRowData().length;\n const tableHeight = 50 + Math.min(nVisible, 10) * 42;\n return (\n <div style={{ overflowX: \"auto\", width: \"100%\", maxWidth: \"1200px\" }}>\n <div\n className=\"ag-theme-quartz\"\n style={{ height: tableHeight, minWidth: \"810px\", width: \"100%\" }}\n >\n <AgGridReact\n rowData={getVisibleRowData()}\n columnDefs={columnDefs}\n getRowNodeId={(data) => data.id}\n animateRows={true}\n defaultColDef={defaultColDef}\n />\n </div>\n </div>\n );\n};\n\nconst Detail = props => {\n const gene = props.geneDocs[props.searchResult.id];\n if (props.grameneConsequences && props.grameneConsequences[gene._id] && props.grameneGermplasm) {\n const groups = group_germplasm(gene, props.grameneGermplasm, props.grameneConsequences[gene._id]);\n\n return <div>\n <h5>Predicted loss-of-function alleles were detected in these germplasm.</h5>\n <div >Explore other variants within this gene in the <a target=\"_blank\"\n href={`${props.configuration.ensemblURL}/${gene.system_name}/Gene/Variation_Gene/Image?db=core;g=${props.searchResult.id}`}>\n Variant image</a> page in the Ensembl genome browser.</div>\n <GridWithGroups groups={...groups} gene_id={gene._id} doGrin={!props.configuration.hasOwnProperty('noGRIN')}/>\n </div>\n } else {\n props.doRequestVEP(gene._id);\n return <pre>loading</pre>;\n }\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneConsequences',\n 'selectGrameneGermplasm',\n 'doRequestVEP',\n Detail\n);\n\n","import React from 'react'\nimport ReactGA from 'react-ga4'\n// import {connect} from \"redux-bundler-react\";\nimport _ from 'lodash'\nimport dbxrefs from 'gramene-dbxrefs';\nimport {Detail, Title, Description, Content} from \"./generic\";\n\nconst HOW_MANY_TO_SHOW_BY_DEFAULT = 10;\n\nclass Xref extends React.Component {\n constructor(props) {\n super(props);\n this.state = {showAll: false};\n }\n\n toggleShowAll() {\n this.setState({showAll: !this.state.showAll});\n }\n\n possiblyTruncateList(vals) {\n var ellipsis, ellipsisChar, ellipsisTitle;\n\n if (vals.length > HOW_MANY_TO_SHOW_BY_DEFAULT) {\n if (this.state.showAll) {\n ellipsisChar = '^ show first ' + HOW_MANY_TO_SHOW_BY_DEFAULT;\n ellipsisTitle = 'Show less';\n }\n else {\n ellipsisChar = '… show all (' + (vals.length - HOW_MANY_TO_SHOW_BY_DEFAULT) + ' more)';\n ellipsisTitle = 'Show more';\n vals = vals.slice(0, HOW_MANY_TO_SHOW_BY_DEFAULT);\n }\n\n ellipsis = (\n <li key=\"showMore\" className=\"showAll\">\n <a title={ellipsisTitle} onClick={this.toggleShowAll.bind(this)}>{ellipsisChar}</a>\n </li>\n );\n\n vals.push(ellipsis);\n }\n\n return vals;\n }\n\n render() {\n var db = this.props.xref.label;\n var urlfcn = this.props.xref.url;\n\n var members = this.props.members.sort();\n\n var vals = members.map(function (item, idx) {\n var url = urlfcn(item),\n liClass = idx < HOW_MANY_TO_SHOW_BY_DEFAULT ? \"default\" : \"extra\";\n let external = <small title=\"This link opens a page from an external site\"> <i className=\"fa fa-external-link\"/></small>;\n return (\n <li key={idx} className={liClass}>\n <a href={url} target=\"_blank\" onClick={()=>{\n ReactGA.event({\n category: \"outbound link\", action: \"follow\", label: item\n })\n }}>{item}{external}</a>\n {/*<ReactGA.OutboundLink*/}\n {/* eventLabel={db}*/}\n {/* to={url}*/}\n {/* target=\"_blank\"*/}\n {/*>*/}\n {/* {item}{external}*/}\n {/*</ReactGA.OutboundLink>*/}\n </li>\n )\n })\n\n vals = this.possiblyTruncateList(vals);\n\n return (\n <tr>\n <td className=\"xref-name-col\">{db}</td>\n <td className=\"xref-value-col\">\n <ol className=\"xref-id-list\">{vals}</ol>\n </td>\n </tr>\n );\n }\n}\n\nfunction formatXrefsForGene(gene) {\n if(!gene || !_.isArray(gene.xrefs)) {\n throw new Error(\"No xrefs for \" + _.get(gene._id));\n }\n return gene.xrefs\n .filter(xr => dbxrefs.isKnown(xr.db) && xr.db !== \"PUBMED\")\n .sort()\n .map((xr,idx) => {\n var xref = dbxrefs.fetch(xr.db);\n return (\n <Xref key={idx} xref={xref} members={xr.ids} source={xr.source} text={xr.text} />\n )\n })\n}\n\nconst Xrefs = ({searchResult, geneDocs}) => (\n <Detail>\n <Title key=\"title\">Cross-references</Title>\n <Description key=\"description\">References to this gene in other databases:</Description>\n <Content key=\"content\">\n <table className=\"xrefs table\">\n <thead>\n <tr>\n <th className=\"xref-name-col\">Database</th>\n <th className=\"xref-value-col\">IDs and links</th>\n </tr>\n </thead>\n <tbody>\n {formatXrefsForGene(geneDocs[searchResult.id])}\n </tbody>\n </table>\n </Content>\n </Detail>\n);\n\nexport default Xrefs;\n\n","import React from 'react'\nimport ReactGA from 'react-ga4'\n// import {connect} from \"redux-bundler-react\";\nimport _ from 'lodash'\nimport dbxrefs from 'gramene-dbxrefs';\nimport {Detail, Title, Description, Content} from \"./generic\";\n\nconst HOW_MANY_TO_SHOW_BY_DEFAULT = 10;\n\nclass Xref extends React.Component {\n constructor(props) {\n super(props);\n this.state = {showAll: false};\n }\n\n toggleShowAll() {\n this.setState({showAll: !this.state.showAll});\n }\n\n possiblyTruncateList(vals) {\n var ellipsis, ellipsisChar, ellipsisTitle;\n\n if (vals.length > HOW_MANY_TO_SHOW_BY_DEFAULT) {\n if (this.state.showAll) {\n ellipsisChar = '^ show first ' + HOW_MANY_TO_SHOW_BY_DEFAULT;\n ellipsisTitle = 'Show less';\n }\n else {\n ellipsisChar = '… show all (' + (vals.length - HOW_MANY_TO_SHOW_BY_DEFAULT) + ' more)';\n ellipsisTitle = 'Show more';\n vals = vals.slice(0, HOW_MANY_TO_SHOW_BY_DEFAULT);\n }\n\n ellipsis = (\n <li key=\"showMore\" className=\"showAll\">\n <a title={ellipsisTitle} onClick={this.toggleShowAll.bind(this)}>{ellipsisChar}</a>\n </li>\n );\n\n vals.push(ellipsis);\n }\n\n return vals;\n }\n\n render() {\n var db = this.props.xref.label;\n var urlfcn = this.props.xref.url;\n\n var members = this.props.members.sort();\n\n var vals = members.map(function (item, idx) {\n var url = urlfcn(item),\n liClass = idx < HOW_MANY_TO_SHOW_BY_DEFAULT ? \"default\" : \"extra\";\n let external = <small title=\"This link opens a page from an external site\"> <i className=\"fa fa-external-link\"/></small>;\n return (\n <li key={idx} className={liClass}>\n <a href={url} target=\"_blank\" onClick={()=>{\n ReactGA.event({\n category: \"outbound link\", action: \"follow\", label: item\n })\n }}>{item}{external}</a>\n {/*<ReactGA.OutboundLink*/}\n {/* eventLabel={db}*/}\n {/* to={url}*/}\n {/* target=\"_blank\"*/}\n {/*>*/}\n {/* {item}{external}*/}\n {/*</ReactGA.OutboundLink>*/}\n </li>\n )\n })\n\n vals = this.possiblyTruncateList(vals);\n\n return (\n <tr>\n {/*<td className=\"xref-name-col\">{db}</td>*/}\n <td className=\"xref-value-col\">\n <ol className=\"xref-id-list\">{vals}</ol>\n </td>\n <td className=\"xref-name-col\">{this.props.source}</td>\n <td className=\"xref-value-col\">{this.props.text}</td>\n </tr>\n );\n }\n}\n\nfunction formatPubsForGene(gene) {\n if(!gene || !_.isArray(gene.xrefs)) {\n throw new Error(\"No xrefs for \" + _.get(gene._id));\n }\n let pubs = gene.xrefs.filter(xr => xr.db === \"PUBMED\");\n if (pubs.length === 0) {\n return <tr><td colSpan={3}>No publications found.</td></tr>\n }\n return pubs.sort((a,b) => {\n if (a.source) {\n if (b.source) {\n if (a.source < b.source) {\n return -1;\n }\n if (a.source > b.source) {\n return 1;\n }\n }\n else {\n return -1;\n }\n }\n else if (b.source) {\n return 1;\n }\n if (a.db < b.db) {\n return -1;\n }\n if (a.db > b.db) {\n return 1;\n }\n return 0;\n })\n .map((xr,idx) => {\n var xref = dbxrefs.fetch(xr.db);\n return (\n <Xref key={idx} xref={xref} members={xr.ids} source={xr.source} text={xr.text} />\n )\n })\n}\nconst formURL = 'https://docs.google.com/forms/d/e/1FAIpQLSey-xPyTysdd9c2phXT6kcbjEDeCppG4dLG7LjZCeLpx_KGog/viewform?usp=pp_url&entry.1266455249=';\nconst Publications = ({searchResult, geneDocs}) => (\n <Detail>\n <Title key=\"title\">Curated publications</Title>\n <Description key=\"description\">Functions described in the literature:</Description>\n <Content key=\"content\">\n <table className=\"xrefs xrefs-pubs table\">\n <thead>\n <tr>\n <th className=\"xref-10-col\">PubMed link</th>\n <th className=\"xref-10-col\">Curation source</th>\n <th className=\"xref-80-col\">Title/Description</th>\n </tr>\n </thead>\n <tbody>\n {formatPubsForGene(geneDocs[searchResult.id])}\n </tbody>\n <tfoot>\n <tr>\n <th colSpan={3}>Submit a gene function <a target=\"_blank\" href={formURL + searchResult.id}>here</a></th>\n </tr>\n </tfoot>\n </table>\n </Content>\n </Detail>\n);\n\nexport default Publications;\n\n","import React, { useState, useEffect } from 'react';\nimport {connect} from \"redux-bundler-react\";\nimport {Tabs, Tab, Form, Container, Row, Col, ToggleButton, ButtonGroup } from 'react-bootstrap';\nimport { AiOutlineCopy } from 'react-icons/ai';\nimport './sequences.css';\nimport keyBy from \"lodash/keyBy\";\n\nconst CodeBlock = props => {\n const plainFasta = `>${props.id}\\n${props.seq}`\n\n const [showNotification, setShowNotification] = useState(false);\n\n const copyCode = () => {\n // Use the Clipboard API to write text to the clipboard\n navigator.clipboard.writeText(plainFasta)\n .then(() => {\n setShowNotification(true);\n })\n .catch((err) => {\n console.error('Unable to copy to clipboard', err);\n });\n };\n\n useEffect(() => {\n if (showNotification) {\n const notificationTimeout = setTimeout(() => {\n setShowNotification(false);\n }, 2000); // Hide the notification after 2 seconds\n\n return () => clearTimeout(notificationTimeout);\n }\n }, [showNotification]);\n\n return (\n <div className=\"fasta-container\">\n <code className=\"fasta\"><span className=\"header\">>{props.id}</span><br/>{\n props.blocks.map((block,idx) =>\n <span key={idx} className={block.kind}>{block.seq}</span>\n )\n }</code>\n <p className=\"fasta-key\">\n <b>Key:</b> 5'UTR \n <span className=\"square-utr5\"> </span>\n CDS \n <span className=\"square-cds\"> </span>\n 3'UTR \n <span className=\"square-utr3\"> </span>\n </p>\n <button className=\"copy-button\" onClick={copyCode}><AiOutlineCopy /></button>\n {showNotification && <div className=\"notification\">Sequence copied</div>}\n </div>\n );\n};\n\nconst decoratePeptide = (seq, transcript) => {\n let junctions = [];\n if (transcript.exon_junctions) {\n transcript.exon_junctions.forEach((ej, idx) => {\n if (ej > transcript.cds.start && ej <= transcript.cds.end) {\n junctions.push(Math.floor((ej - transcript.cds.start) / 3));\n }\n });\n }\n if (junctions.length === 0) {\n return [{kind:'cds', seq:seq}];\n }\n let offset = 0;\n let blocks = [];\n junctions.forEach((j, idx) => {\n let kind = idx % 2 === 0 ? \"cds\" : \"cds-other\";\n blocks.push({kind: kind, seq: seq.substring(offset, j)});\n offset = j;\n });\n blocks.push({kind: junctions.length % 2 === 0 ? \"cds\" : \"cds-other\", seq: seq.substring(junctions.pop())});\n return blocks;\n}\nconst decorateSeq = (geneSeq, gene, up, down, tid, mode) => {\n // return a list of blocks with kind and seq properties\n let blocks = [];\n const transcript = gene.gene_structure.transcripts.find(tr => tr.id === tid);\n const offset = gene.location.strand === 1\n ? gene.location.start - geneSeq.start\n : geneSeq.end - gene.location.end\n if (up > 0) {\n const TSS = gene.gene_structure.exons.find(exon => exon.id === transcript.exons[0]).start;\n blocks.push({\n kind:'upstream',\n seq: geneSeq.seq.substring(offset - up + TSS - 1, offset + TSS - 1).toLowerCase()\n })\n }\n // add exons and introns based on tid\n let pos_in_transcript = 0;\n let pos_in_gene = 0;\n let blockType = 'utr5';\n let extra = '';\n transcript.exons.forEach((eid, e_idx) => {\n const exon = gene.gene_structure.exons.find(exon => exon.id === eid);\n if (e_idx > 0 && mode === \"dna\") {\n blocks.push({\n kind: 'intron',\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + exon.start - 1).toLowerCase()\n });\n pos_in_gene = exon.start-1;\n }\n if (mode === \"rna\") {\n extra = e_idx % 2 === 1 ? '-other' : '';\n }\n let exon_length = exon.end - exon.start + 1;\n if (transcript.cds && pos_in_transcript < transcript.cds.start && pos_in_transcript + exon_length >= transcript.cds.start) {\n // CDS starts in this exon\n const utr5_len = transcript.cds.start - pos_in_transcript - 1;\n if (utr5_len > 0) {\n blocks.push({\n kind: blockType + extra,\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + utr5_len)\n });\n exon_length -= utr5_len;\n pos_in_gene += utr5_len;\n pos_in_transcript = transcript.cds.start - 1;\n }\n blockType = 'cds';\n }\n if (blockType === 'cds' && pos_in_transcript + exon_length >= transcript.cds.end) {\n // CDS ends in this exon\n const cds_len = transcript.cds.end - pos_in_transcript;\n if (cds_len > 0) {\n blocks.push({\n kind: blockType + extra,\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + cds_len)\n });\n exon_length -= cds_len;\n pos_in_gene += cds_len;\n pos_in_transcript = transcript.cds.end;\n }\n blockType = 'utr3';\n }\n if (exon_length > 0) {\n blocks.push({\n kind: blockType + extra,\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + exon_length)\n })\n }\n pos_in_gene = exon.end;\n pos_in_transcript += exon_length;\n })\n // check if there's more to the gene locus after end of transcript?\n // downstream is currently relative to end of transcript but upstream is relative to first TSS\n if (down > 0) {\n blocks.push({\n kind:'downstream',\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + down).toLowerCase()\n })\n }\n return blocks;\n};\nconst buildId = (gene, geneSeq, up, down) => {\n let gs = gene.location.strand === 1 ? gene.location.start - up : gene.location.start - down;\n let ge = gene.location.strand === 1 ? gene.location.end + down : gene.location.end + up;\n let extras = [];\n if (gene.location.strand === -1) {\n extras.push('reverse')\n }\n if (up > 0) {\n extras.push(`upstream=${up}`)\n }\n if (down > 0) {\n extras.push(`downstream=${down}`)\n }\n return `${geneSeq.genome}|${gene._id}|${gene.location.region}:${gs}..${ge} ${extras.join('|')}`\n};\nconst Detail = props => {\n const gene = props.geneDocs[props.searchResult.id];\n const [tab, setTab] = useState('dna');\n const [upstream, setUpstream] = useState(0);\n const [downstream, setDownstream] = useState(0);\n const [tid, setTid] = useState(gene.gene_structure.canonical_transcript);\n let geneSeq;\n let rnaSeq;\n let pepSeq;\n if (props.geneSequences && props.geneSequences[gene._id]) {\n geneSeq = props.geneSequences[gene._id];\n }\n else {\n props.doRequestGeneSequence(gene)\n return <pre>loading</pre>;\n }\n if (props.rnaSequences && props.rnaSequences[tid]) {\n rnaSeq = props.rnaSequences[tid]\n }\n else {\n props.doRequestRnaSequence(tid, gene)\n return <pre>loading</pre>;\n }\n const maxUp = gene.location.strand === 1 ? gene.location.start - geneSeq.start : geneSeq.end - gene.location.end;\n const maxDown = gene.location.strand === -1 ? gene.location.start - geneSeq.start : geneSeq.end - gene.location.end;\n const transcript = gene.gene_structure.transcripts.find(tr => tr.id === tid);\n let tl_id;\n if (transcript.translation) {\n tl_id = transcript.translation.id;\n if (props.pepSequences && props.pepSequences[tl_id]) {\n pepSeq = props.pepSequences[tl_id];\n }\n else {\n props.doRequestPepSequence(tl_id, gene);\n return <pre>loading</pre>;\n }\n }\n return <Tabs activeKey={tab}\n onSelect={(k) => setTab(k)}\n >\n <Tab tabClassName=\"dna\" eventKey=\"dna\" title=\"Genomic sequence\">\n <Container style={{ maxWidth: '100ch', marginLeft: 0}}>\n <Row>\n <Col><b><i>Show flanking sequence</i></b></Col>\n </Row>\n <div className=\"flanking-guide\">\n <span className=\"flanking-label-left\">Upstream</span>\n <div className=\"horizontal-line\"/>\n <span className=\"flanking-center-label\">Transcript (unspliced)</span>\n <div className=\"horizontal-line\"/>\n <span className=\"flanking-label-right\">Downstream</span>\n\n <span className=\"flanking-value-left\">{upstream}</span>\n <Form.Range\n className=\"reverse-slide\"\n style={{width: '60px'}}\n value={upstream}\n onChange={(e) => setUpstream(e.target.value)}\n min={0}\n max={maxUp}\n step={10}\n />\n <span/>\n <Form.Range\n style={{width: '60px'}}\n value={downstream}\n onChange={(e) => setDownstream(e.target.value)}\n min={0}\n max={maxDown}\n step={10}\n />\n <span className=\"flanking-value-right\">{downstream}</span>\n </div>\n {gene.gene_structure.transcripts.length > 1 &&\n <Row>\n <Col><b><i>Highlight transcript</i></b><br/>\n <ButtonGroup>{gene.gene_structure.transcripts.sort((a,b) => a.id.localeCompare(b.id)).map((tr, idx) => {\n let v = tr.id === gene.gene_structure.canonical_transcript ? 'primary' : 'secondary';\n if (tr.id !== tid) {\n v = `outline-${v}`\n }\n return <ToggleButton\n variant={v}\n key={idx}\n id={`radio-${idx}`}\n type=\"radio\"\n name={tr.id}\n value={tr.id}\n checked={tr.id === tid}\n onChange={e => setTid(e.currentTarget.value)}\n >{tr.id}</ToggleButton>\n })}</ButtonGroup>\n </Col>\n </Row>\n }\n </Container>\n {geneSeq && <CodeBlock id={buildId(gene,geneSeq,+upstream,+downstream)} seq={geneSeq.seq.substring(maxUp - +upstream, maxUp + gene.location.end - gene.location.start + 1 + +downstream)} blocks={decorateSeq(geneSeq,gene,+upstream,+downstream,tid,\"dna\")}/>}\n </Tab>\n <Tab tabClassName=\"rna\" eventKey=\"rna\" title=\"Transcript sequence\">\n <Container style={{ width: '100ch', marginLeft: 0}}>\n {gene.gene_structure.transcripts.length > 1 &&\n <Row>\n <Col><b><i>Select transcript</i></b><br/>\n <ButtonGroup>{gene.gene_structure.transcripts.sort((a,b) => a.id.localeCompare(b.id)).map((tr, idx) => {\n let v = tr.id === gene.gene_structure.canonical_transcript ? 'primary' : 'secondary';\n if (tr.id !== tid) {\n v = `outline-${v}`\n }\n return <ToggleButton\n variant={v}\n key={idx}\n id={`radio-${idx}`}\n type=\"radio\"\n name={tr.id}\n value={tr.id}\n checked={tr.id === tid}\n onChange={e => setTid(e.currentTarget.value)}\n >{tr.id}</ToggleButton>\n })}</ButtonGroup>\n </Col>\n </Row>\n }\n </Container>\n {geneSeq && <CodeBlock id={tid} seq={rnaSeq.seq} blocks={decorateSeq(geneSeq,gene,0,0,tid,\"rna\")}/>}\n </Tab>\n {gene.biotype === \"protein_coding\" &&\n <Tab tabClassName=\"pep\" eventKey=\"pep\" title=\"Peptide sequence\">\n <Container style={{ width: '100ch', marginLeft: 0}}>\n {gene.gene_structure.transcripts.length > 1 &&\n <Row>\n <Col><b><i>Select transcript</i></b><br/>\n <ButtonGroup>{gene.gene_structure.transcripts.sort((a,b) => a.id.localeCompare(b.id)).map((tr, idx) => {\n let v = tr.id === gene.gene_structure.canonical_transcript ? 'primary' : 'secondary';\n if (tr.id !== tid) {\n v = `outline-${v}`\n }\n return <ToggleButton\n variant={v}\n key={idx}\n id={`radio-${idx}`}\n type=\"radio\"\n name={tr.id}\n value={tr.id}\n checked={tr.id === tid}\n onChange={e => setTid(e.currentTarget.value)}\n >{tr.id}</ToggleButton>\n })}</ButtonGroup>\n </Col>\n </Row>\n }\n </Container>\n {geneSeq && <CodeBlock id={tl_id} seq={pepSeq.seq} blocks={decoratePeptide(pepSeq.seq,transcript)}/>}\n </Tab>}\n </Tabs>\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGeneSequences',\n 'selectRnaSequences',\n 'selectPepSequences',\n 'doRequestGeneSequence',\n 'doRequestRnaSequence',\n 'doRequestPepSequence',\n Detail\n);\n\n","import React from 'react'\nimport { connect } from 'redux-bundler-react'\nimport Vis from \"gramene-search-vis\"\nimport Selection from './selection.js'\nimport '../../../node_modules/gramene-search-vis/styles/main.less';\n\nclass TaxDist extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n collapseEmpties: true,\n comparaOnly: true,\n showCompara: props.configuration.hasOwnProperty('partialCompara')\n };\n }\n handleSelection(selections) {\n this.setState({selections})\n }\n handleHighlight(highlight) {\n this.setState({highlight})\n }\n handleFilter() {\n this.setState({selections:null})\n }\n toggleEmpties() {\n this.setState({collapseEmpties: !this.state.collapseEmpties})\n }\n toggleCompara() {\n this.setState({comparaOnly: !this.state.comparaOnly})\n }\n render() {\n let selectedTaxa = {};\n if (this.props.grameneSearch) {\n if (this.state.collapseEmpties) {\n this.props.grameneSearch.facet_counts.facet_fields.taxon_id.filter((tid, idx) => idx % 2 === 0).forEach(tid => {\n selectedTaxa[tid] = true;\n })\n } else {\n if (Object.keys(this.props.grameneGenomes.active).length === 0 && this.props.grameneMaps) {\n Object.keys(this.props.grameneMaps).forEach(tid => selectedTaxa[tid] = true);\n } else {\n Object.keys(this.props.grameneGenomes.active).forEach(tid => selectedTaxa[tid]= true);\n }\n }\n if (this.state.showCompara && this.state.comparaOnly && this.props.grameneMaps) {\n Object.keys(selectedTaxa).forEach(tid => {\n if (!this.props.grameneMaps[tid].in_compara) {\n delete selectedTaxa[tid];\n }\n })\n }\n }\n return (\n <div className=\"results-vis big-vis\">\n {this.props.grameneTaxDist && <span>\n <button type=\"button\"\n className=\"btn btn-outline-primary btn-sm\"\n onClick={this.toggleEmpties.bind(this)}>\n {this.state.collapseEmpties ? 'Expand' : 'Collapse'} empty branches\n </button>\n {this.state.showCompara && <button type=\"button\"\n className=\"btn btn-outline-success btn-sm\"\n onClick={this.toggleCompara.bind(this)}>\n Show {this.state.comparaOnly ? 'all genomes' : 'only genomes in gene trees'}\n </button>\n }\n </span>}\n {this.props.grameneTaxDist && <Vis taxonomy={this.props.grameneTaxDist}\n selectedTaxa={selectedTaxa}\n onSelection={this.handleSelection.bind(this)}\n onHighlight={this.handleHighlight.bind(this)}\n />}\n {this.renderSelection()}\n </div>\n );\n }\n renderSelection() {\n if (this.state.selections && this.props.grameneTaxDist) {\n return <Selection taxonomy={this.props.grameneTaxDist}\n selectedTaxa={{}}\n selections={this.state.selections}\n onFilter={this.handleFilter.bind(this)}/>\n }\n }\n}\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneTaxDist',\n 'selectGrameneGenomes',\n 'selectGrameneSearch',\n 'selectGrameneMaps',\n TaxDist\n);\n","import React from 'react';\nimport numeral from 'numeral';\nimport _ from \"lodash\";\n\nimport {Table, Button, Badge} from 'react-bootstrap';\nimport {connect} from \"redux-bundler-react\";\n\nfunction selectionStats(selections, taxonomy) {\n const selectionData = getSelectionData(selections, taxonomy);\n const totalGeneResults = taxonomy.model.results.count;\n const fq = fqFromSelections(selections);\n\n return {\n selectedGenes: selectionData.resultsCount,\n totalGeneResults,\n fq,\n numSelectedBins: selectionData.binsCount,\n proportionGenesSelected: selectionData.resultsCount / totalGeneResults\n }\n}\n\nfunction getSelectionData(selection, taxonomy) {\n return _.reduce(selection, (countAcc, sel) => {\n const bins = taxonomy.getBins(sel.binFrom.idx, sel.binTo.idx);\n countAcc.binsCount += bins.length;\n countAcc.resultsCount += _.reduce(bins, (acc, bin) => acc + bin.results.count, 0);\n return countAcc;\n }, {resultsCount: 0, binsCount: 0});\n}\n\nconst selectionToSolrRange = (sel)=>`[${sel.binFrom.idx} TO ${sel.binTo.idx}]`;\n\nfunction fqFromSelections(selections) {\n const rangeStrings = selections.map(selectionToSolrRange);\n return `fixed_1000__bin:(${rangeStrings.join(' ')})`;\n}\n\nconst Selections = ({selections, taxonomy, doAcceptGrameneSuggestion, onFilter}) => {\n const stats = selectionStats(selections, taxonomy);\n\n const setFilter = () => {\n doAcceptGrameneSuggestion({\n category: 'Selections',\n fq_field: 'fixed_1000__bin',\n fq_value: `(${selections.map(selectionToSolrRange).join(' ')})`,\n name: `${selections.length} region${selections.length === 1 ? '':'s'}`\n });\n onFilter();\n };\n\n const formatProportion = (prop) => '(' + (_.isFinite(prop) ? numeral(prop).format('0.0%') : undefined) + ')';\n\n return (\n <div>\n <Table>\n <tbody>\n <tr>\n <th>Number of selected genes</th>\n <td>{stats.selectedGenes} {formatProportion(stats.proportionGenesSelected)}</td>\n <td><Button size='sm' onClick={setFilter}>selections |<Badge>{stats.selectedGenes}</Badge></Button>\n </td>\n </tr>\n </tbody>\n </Table>\n </div>\n )\n};\n\nexport default connect(\n 'doAcceptGrameneSuggestion',\n Selections\n);\n","import React from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport {Alert, Container, Row, Card, CardGroup} from 'react-bootstrap'\nimport './genes.css'\n\nconst examples = [\n {\n subsite: {\n maize:1,\n sorghum:1,\n main:1,\n },\n text: \"What are the orthologs of Arabidopsis thaliana's PAD4 gene in Andropogoneae?\",\n filters: {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 5,\n children: [\n {\n fq_field: 'homology__all_orthologs',\n fq_value: 'AT3G52430',\n name: 'Orthologs of PAD4',\n category: 'Gene Tree',\n leftIdx:1,\n rightIdx:2,\n negate: false,\n marked: false\n },\n {\n fq_field: 'taxonomy__ancestors',\n fq_value: 147429,\n name: 'Andropogoneae',\n category: 'Taxonomy',\n leftIdx:3,\n rightIdx:4,\n negate: false,\n marked: false\n }\n ]\n }\n },\n {\n subsite: {\n maize:1,\n sorghum:1,\n grapevine:1,\n rice:1,\n main:1,\n },\n text: \"Which genes are curated in the scientific literature?\",\n filters: {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 3,\n children: [\n {\n fq_field: 'capabilities',\n fq_value: 'pubs',\n name: 'publication',\n category: 'Curated',\n leftIdx: 1,\n rightIdx: 2,\n negate: false,\n marked: false\n }\n ]\n }\n },\n {\n subsite: {\n grapevine:1\n },\n text: \"What are the orthologs of Arabidopsis thaliana's PAD4 gene in rosids?\",\n filters: {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 5,\n children: [\n {\n fq_field: 'homology__all_orthologs',\n fq_value: 'AT3G52430',\n name: 'Orthologs of PAD4',\n category: 'Gene Tree',\n leftIdx:1,\n rightIdx:2,\n negate: false,\n marked: false\n },\n {\n fq_field: 'taxonomy__ancestors',\n fq_value: 71275,\n name: 'rosids',\n category: 'Taxonomy',\n leftIdx:3,\n rightIdx:4,\n negate: false,\n marked: false\n }\n ]\n }\n }\n];\nconst HelpDemo = ({configuration,doReplaceGrameneFilters}) => (\n <Container fluid style={{padding: '40px'}}>\n <Row>\n <h3>Search Features</h3>\n </Row>\n <Row>\n <CardGroup style={{width:'80%'}}>\n <Card style={{'backgroundColor':'#f3f6f5', 'borderColor':'#DDE5E3'}}>\n <Card.Body>\n <Card.Title>Suggestions</Card.Title>\n <Card.Text>Matching terms are provided as you type:</Card.Text>\n <div className='gene-search-pic-sugg'/>\n </Card.Body>\n </Card>\n <Card style={{'backgroundColor':'#f3f6f5', 'borderColor':'#DDE5E3'}}>\n <Card.Body>\n <Card.Title>Visualization</Card.Title>\n <Card.Text>See the distribution of results across all genomes:</Card.Text>\n <div className='gene-search-pic-results'/>\n </Card.Body>\n </Card>\n <Card style={{'backgroundColor':'#f3f6f5', 'borderColor':'#DDE5E3'}}>\n <Card.Body>\n <Card.Title>Gene tree view</Card.Title>\n <Card.Text>Explore evolutionary history of a gene family:</Card.Text>\n <div className='gene-search-pic-genetree'/>\n </Card.Body>\n </Card>\n </CardGroup>\n </Row>\n <Row>\n <h4>For Example</h4>\n </Row>\n <Row>\n <small>\n You can ask sophisticated questions about the genes:<br/>\n <ul>\n {examples.filter(e => !!e.subsite[configuration.id]).map((e,idx) => (\n <li key={idx}><a onClick={() => doReplaceGrameneFilters(e.filters)}>{e.text}</a></li>\n ))}\n </ul>\n </small>\n </Row>\n </Container>\n);\n\nexport default connect(\n 'selectConfiguration',\n 'doReplaceGrameneFilters',\n HelpDemo\n);\n\n","import { connect } from 'redux-bundler-react'\n\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport StatsByGroup from \"./StatsByGroup\";\n\n\nclass GeneAttribs extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n };\n }\n render() {\n if (this.props.grameneGeneAttribs && this.props.grameneSearch) {\n const groups = this.props.grameneGeneAttribs;\n const stats = this.props.grameneSearch.stats;\n return <StatsByGroup groups={groups} stats={stats} />;\n }\n return null;\n }\n}\n\nexport default connect(\n 'selectGrameneSearch',\n 'selectGrameneGeneAttribs',\n GeneAttribs\n);\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\n\n/**\n * StatsByGroup\n *\n * Props:\n * - groups: {\n * [groupName: string]: Array<{\n * name: string,\n * description: string,\n * dtype: \"i\" | \"f\",\n * fieldName: string\n * }>\n * }\n * - stats: {\n * stats_fields: {\n * [fieldName: string]: {\n * min?: number,\n * max?: number,\n * count?: number,\n * mean?: number,\n * stddev?: number,\n * percentiles?: (string | number)[] // [\"10.0\", v10, \"20.0\", v20, ...] (order preserved)\n * }\n * }\n * }\n *\n * Columns: attr, desc, mean, stddev, min, max, count, dist\n */\nexport default function StatsByGroup({ groups, stats }) {\n const fields = stats?.stats_fields || {};\n\n return (\n <div style={{ fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\", lineHeight: 1.35 }}>\n {Object.entries(groups).map(([groupName, attrs]) => (\n <GroupTable\n key={groupName}\n groupName={groupName}\n attributes={attrs}\n fields={fields}\n />\n ))}\n </div>\n );\n}\n\nfunction GroupTable({ groupName, attributes, fields }) {\n const hasAny = attributes?.some((a) => fields[a.fieldName]);\n\n const columns = useMemo(\n () => [\n { key: \"attr\", label: \"Attribute\", min: 120 },\n { key: \"desc\", label: \"Description\", min: 380, flex: true },\n { key: \"mean\", label: \"Mean\", min: 100 },\n { key: \"stddev\", label: \"Std Dev\", min: 110 },\n { key: \"min\", label: \"Min\", min: 90 },\n { key: \"max\", label: \"Max\", min: 90 },\n { key: \"count\", label: \"Count\", min: 90 },\n { key: \"dist\", label: \"Distribution\",min: 220 },\n ],\n []\n );\n\n const initial = useMemo(\n () => columns.map((c) => (c.flex ? Math.max(380, c.min) : c.min)),\n [columns]\n );\n\n const { colWidths, startResize, resizing } = useResizableColumns({\n initialWidths: initial,\n minWidths: columns.map((c) => c.min || 60),\n });\n\n const nfInt = useMemo(() => new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 0 }), []);\n const nfFloat = useMemo(\n () => new Intl.NumberFormat(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 3 }),\n []\n );\n\n return (\n <section style={{ marginBottom: 24 }}>\n <header style={{ display: \"flex\", alignItems: \"baseline\", gap: 12, marginBottom: 8 }}>\n <h2 style={{ margin: 0, fontSize: 18 }}>{groupName}</h2>\n {!hasAny && <span style={{ fontSize: 12, color: \"#666\" }}>No stats available for this group.</span>}\n </header>\n\n <div\n style={{\n overflowX: \"auto\",\n border: \"1px solid #eee\",\n borderRadius: 8,\n boxShadow: \"0 1px 2px rgba(0,0,0,0.04)\",\n }}\n >\n <table style={tableStyle}>\n <colgroup>\n {colWidths.map((w, i) => (\n <col key={i} style={{ width: w }} />\n ))}\n </colgroup>\n\n <thead>\n <tr>\n {columns.map((col, i) => (\n <ResizableTh\n key={col.key}\n label={col.label}\n index={i}\n onResizeStart={startResize}\n />\n ))}\n </tr>\n </thead>\n\n <tbody>\n {attributes.map((a) => {\n const s = fields[a.fieldName] || {};\n return (\n <tr key={a.fieldName}>\n <Td mono title={a.fieldName}>{a.name}</Td>\n <Td title={a.description}>{a.description}</Td>\n <Td align=\"right\">{fmtValue(s.mean, a.dtype, true, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtValue(s.stddev, a.dtype, true, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtValue(s.min, a.dtype, false, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtValue(s.max, a.dtype, false, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtCount(s.count, nfInt)}</Td>\n <Td>\n <PercentileHeatmapNormalized\n percentilesArr={s.percentiles}\n min={s.min}\n max={s.max}\n />\n </Td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n <div style={{ marginTop: 6, fontSize: 12, color: \"#666\" }}>\n <em>Tip:</em> Drag the divider at the right edge of any header to resize.\n {resizing && <span style={{ marginLeft: 8, color: \"#999\" }}>(resizing…)</span>}\n </div>\n </section>\n );\n}\n\n/* ===================== Percentiles / Heatmap ===================== */\n\n/**\n * Convert alternating array into ordered pairs: [[\"10.0\", v10], [\"20.0\", v20], ...]\n * - Preserves the exact order provided by Solr\n */\nfunction percentilesArrayToPairs(arr) {\n if (!Array.isArray(arr)) return [];\n const out = [];\n for (let i = 0; i < arr.length - 1; i += 2) {\n out.push([String(arr[i]), arr[i + 1]]);\n }\n return out;\n}\n\nfunction normalizeBetween(value, min, max) {\n if (!isFinite(min) || !isFinite(max) || max <= min || !isFinite(value)) return null;\n return (value - min) / (max - min);\n}\n\n// White -> Blue (0 -> 1)\nfunction rgbWhiteToBlue(vNorm) {\n const t = clamp01(vNorm);\n const rg = Math.round(255 * (1 - t));\n return `rgb(${rg}, ${rg}, 255)`;\n}\nfunction clamp01(x) {\n if (typeof x !== \"number\" || !isFinite(x)) return 0;\n return Math.max(0, Math.min(1, x));\n}\nfunction fmtFloat(v) {\n if (v == null || !isFinite(v)) return \"n/a\";\n return v.toFixed(3);\n}\n\n/**\n * PercentileHeatmapNormalized\n * - Infers bins from percentilesArr (order preserved)\n * - Colors normalized by row min/max\n */\nfunction PercentileHeatmapNormalized({ percentilesArr, min, max }) {\n const pairs = useMemo(() => percentilesArrayToPairs(percentilesArr), [percentilesArr]);\n const n = pairs.length || 1; // avoid zero columns\n const validScale = isFinite(min) && isFinite(max) && max > min;\n\n return (\n <div style={{ ...heatRowDynamic, gridTemplateColumns: `repeat(${n}, 1fr)` }}>\n {pairs.map(([pStr, raw], idx) => {\n const rawNum = typeof raw === \"number\" && isFinite(raw) ? raw : null;\n const norm = rawNum == null ? null : (validScale ? normalizeBetween(rawNum, min, max) : null);\n const bg = norm == null ? \"#f2f2f2\" : rgbWhiteToBlue(norm);\n const label = `${pStr} → raw ${fmtFloat(rawNum)} (norm ${fmtFloat(norm)})`;\n return <HeatCell key={`${pStr}-${idx}`} background={bg} label={label} />;\n })}\n </div>\n );\n}\n\nfunction HeatCell({ background, label }) {\n const [hover, setHover] = useState(false);\n return (\n <div\n style={{ ...heatCell, background }}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n title={label}\n >\n {hover && <span style={popover}>{label}</span>}\n </div>\n );\n}\n\n/* ===================== Resizable columns ===================== */\n\nfunction useResizableColumns({ initialWidths, minWidths }) {\n const [colWidths, setColWidths] = useState(initialWidths);\n const [resizing, setResizing] = useState(false);\n const activeRef = useRef(null); // { index, startX, startW }\n\n useEffect(() => {\n if (initialWidths?.length) setColWidths(initialWidths);\n }, [initialWidths?.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const onMouseMove = (e) => {\n if (!activeRef.current) return;\n const { index, startX, startW } = activeRef.current;\n const dx = e.clientX - startX;\n const next = [...colWidths];\n const minW = minWidths?.[index] ?? 60;\n next[index] = Math.max(minW, startW + dx);\n setColWidths(next);\n };\n\n const endResize = () => {\n activeRef.current = null;\n setResizing(false);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", endResize);\n };\n\n const startResize = (index, ev) => {\n const startX = ev.clientX;\n const startW = colWidths[index];\n activeRef.current = { index, startX, startW };\n setResizing(true);\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", endResize);\n };\n\n useEffect(() => {\n return () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", endResize);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return { colWidths, setColWidths, startResize, resizing };\n}\n\nfunction ResizableTh({ label, index, onResizeStart }) {\n return (\n <th style={thStyle}>\n <div style={{ position: \"relative\", width: \"100%\" }}>\n <span>{label}</span>\n <span\n onMouseDown={(e) => onResizeStart(index, e)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n title=\"Drag to resize column\"\n style={resizerStyle}\n />\n </div>\n </th>\n );\n}\n\n/* ===================== Formatting helpers ===================== */\n\nfunction fmtCount(v, nfInt) {\n if (v === null || v === undefined) return \"—\";\n return nfInt.format(v);\n}\n\nfunction fmtValue(v, dtype = \"f\", isStat = false, nfInt, nfFloat) {\n if (v === null || v === undefined || Number.isNaN(v)) return \"—\";\n const isIntType = dtype === \"i\";\n return isIntType && !isStat ? nfInt.format(v) : nfFloat.format(v);\n}\n\n/* ===================== Cells & Styles ===================== */\n\nfunction Td({ children, align = \"left\", mono = false, title }) {\n return (\n <td\n title={title}\n style={{\n ...cellBase,\n textAlign: align,\n borderBottom: \"1px solid #eee\",\n padding: \"8px 10px\",\n fontFamily: mono ? \"ui-monospace, SFMono-Regular, Menlo, monospace\" : undefined,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n verticalAlign: \"top\",\n }}\n >\n {children}\n </td>\n );\n}\n\nconst tableStyle = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n tableLayout: \"fixed\",\n minWidth: 980,\n};\n\nconst cellBase = {\n fontSize: 13,\n lineHeight: 1.35,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst thStyle = {\n ...cellBase,\n textAlign: \"left\",\n borderBottom: \"1px solid #ddd\",\n background: \"#fafafa\",\n fontWeight: 600,\n padding: \"10px 10px\",\n position: \"relative\",\n};\n\nconst resizerStyle = {\n position: \"absolute\",\n right: -5,\n top: 0,\n height: \"100%\",\n width: 10,\n cursor: \"col-resize\",\n boxShadow: \"inset -1px 0 0 rgba(0,0,0,0.08)\",\n};\n\nconst heatRowDynamic = {\n display: \"grid\",\n gap: 2,\n alignItems: \"center\",\n width: \"100%\",\n minWidth: 200,\n};\n\nconst heatCell = {\n height: 16,\n borderRadius: 3,\n position: \"relative\",\n boxShadow: \"inset 0 0 0 1px rgba(0,0,0,0.06)\",\n};\n\nconst popover = {\n position: \"absolute\",\n left: \"50%\",\n top: -26,\n transform: \"translateX(-50%)\",\n padding: \"2px 6px\",\n fontSize: 11,\n background: \"rgba(0,0,0,0.8)\",\n color: \"#fff\",\n borderRadius: 4,\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n};\n","import React from \"react\";\nimport { connect } from 'redux-bundler-react'\nimport { Modal, Button } from \"react-bootstrap\";\nimport { BsChevronDown, BsChevronRight } from \"react-icons/bs\";\n\n// name → subtle background colour. Checked against node.name at render time.\nconst CLADE_COLORS = {\n \"Chlorophyta\": \"#e8f5e9\",\n \"Bryophyta\": \"#f1f8e9\",\n \"Liliopsida\": \"#fff8e1\", // monocots\n \"eudicotyledons\": \"#fce4ec\",\n \"Poaceae\": \"#fff3e0\",\n \"Fabaceae\": \"#ede7f6\",\n \"Brassicaceae\": \"#e1f5fe\",\n \"Solanaceae\": \"#ffebee\",\n};\n\nfunction findRoots(tax) {\n return Object.values(tax).filter(n =>\n !n.is_a || n.is_a.length === 0 || !n.is_a.some(p => tax[p])\n );\n}\n\n// Post-order: attach .leafIds (taxon_ids of maps in subtree) and .isLeaf\nfunction annotate(node, tax, maps) {\n const leafIds = [];\n if (maps[node._id]) { node.isLeaf = true; leafIds.push(node._id); }\n (node.children || []).forEach(cid => {\n const child = tax[cid];\n if (!child) return;\n annotate(child, tax, maps);\n child.leafIds.forEach(id => leafIds.push(id));\n });\n node.leafIds = leafIds;\n}\n\n// Walk down the spine through single-child internals until a branch point,\n// leaf, or node that is itself a genome.\nfunction compressChain(node, tax, maps) {\n const chain = [node];\n let cur = node;\n while (true) {\n const kids = (cur.children || [])\n .map(cid => tax[cid])\n .filter(c => c && c.leafIds && c.leafIds.length > 0);\n if (kids.length !== 1) break;\n if (maps[cur._id]) break;\n cur = kids[0];\n chain.push(cur);\n }\n return { chain, terminal: cur };\n}\n\n// Render a breadcrumb chain. If the chain has more than 3 nodes, collapse the\n// middle into a hoverable ellipsis that reveals the hidden names on hover.\nconst CHAIN_DISPLAY_MAX = 3;\nfunction renderChain(chain) {\n const nameOf = n => n.short_name || n.name;\n if (chain.length <= CHAIN_DISPLAY_MAX) {\n return chain.map((n, i) => (\n <React.Fragment key={n._id}>\n {i > 0 && <span className=\"tax-sep\"> › </span>}\n {nameOf(n)}\n </React.Fragment>\n ));\n }\n const first = chain[0];\n const last = chain[chain.length - 1];\n const middle = chain.slice(1, -1);\n const fullTitle = chain.map(nameOf).join(' › ');\n return (\n <>\n {nameOf(first)}\n <span className=\"tax-sep\"> › </span>\n <span className=\"tax-ellipsis\" title={fullTitle}>\n <span className=\"tax-ellipsis-short\">…</span>\n <span className=\"tax-ellipsis-full\">\n {middle.map(n => (\n <React.Fragment key={n._id}>\n {nameOf(n)}\n <span className=\"tax-sep\"> › </span>\n </React.Fragment>\n ))}\n </span>\n </span>\n <span className=\"tax-sep\"> › </span>\n {nameOf(last)}\n </>\n );\n}\n\n// Drop a parent when its single child has the same name (e.g. species node\n// above a subspecies-less record that repeats the species name). The terminal\n// (last element) is always preserved; only redundant ancestors are removed.\nfunction dedupAdjacent(chain) {\n const out = [];\n for (const n of chain) {\n if (out.length && out[out.length - 1].name === n.name) {\n out[out.length - 1] = n; // keep the child, drop the parent\n } else {\n out.push(n);\n }\n }\n return out;\n}\n\n// Use the node's direct `rank` field when it carries a real value.\nfunction getRank(node) {\n const r = node && node.rank;\n return r && r !== 'no rank' ? r : null;\n}\n\n// Search nodes whose name or a synonym contains the query. Prefix matches rank higher.\nfunction searchTaxonomy(query, tax) {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n const out = [];\n Object.values(tax).forEach(n => {\n const name = n.name || '';\n const nameLc = name.toLowerCase();\n if (nameLc.includes(q)) {\n out.push({ node: n, matched: name, via: 'name', prefix: nameLc.startsWith(q) });\n return;\n }\n const syns = n.synonym || [];\n for (const s of syns) {\n const sLc = s.toLowerCase();\n if (sLc.includes(q)) {\n out.push({ node: n, matched: s, via: 'synonym', prefix: sLc.startsWith(q) });\n return;\n }\n }\n });\n out.sort((a, b) =>\n (a.prefix === b.prefix ? 0 : a.prefix ? -1 : 1)\n || a.node.name.localeCompare(b.node.name)\n );\n return out.slice(0, 20);\n}\n\n// Compute the { selected, expanded } pair for a fresh modal opening:\n// selection is seeded from active genomes (or everything non-hidden),\n// and every ancestor of a selected genome is pre-expanded so the user sees\n// all of their current selections without manually drilling in.\nfunction computeOpenState(props) {\n const { grameneMaps, grameneTaxonomy, grameneGenomes } = props;\n const activeKeys = Object.keys(grameneGenomes.active || {});\n const seedAll = activeKeys.length === 0;\n const selected = new Set();\n Object.values(grameneMaps || {}).forEach(m => {\n if (m.hidden) return;\n if (seedAll || grameneGenomes.active[m.taxon_id]) selected.add(m.taxon_id);\n });\n const expanded = new Set();\n if (grameneTaxonomy) {\n selected.forEach(tid => {\n let cur = grameneTaxonomy[tid];\n const seen = new Set();\n while (cur && !seen.has(cur._id)) {\n seen.add(cur._id);\n expanded.add(cur._id);\n const pid = cur.is_a && cur.is_a[0];\n cur = pid ? grameneTaxonomy[pid] : null;\n }\n });\n }\n return { selected, expanded };\n}\n\nclass TaxonomyModal extends React.Component {\n constructor(props) {\n super(props);\n const { grameneMaps, grameneTaxonomy } = props;\n\n let roots = [];\n if (grameneTaxonomy) {\n roots = findRoots(grameneTaxonomy);\n roots.forEach(r => annotate(r, grameneTaxonomy, grameneMaps));\n }\n\n const { selected, expanded } = computeOpenState(props);\n this.state = {\n selected,\n expanded,\n roots,\n query: '',\n highlightId: null,\n activeIdx: 0,\n };\n this.rowRefs = {};\n this._matches = [];\n this._activeHitEl = null;\n }\n\n handleQueryChange(e) {\n this.setState({ query: e.target.value, activeIdx: 0 });\n }\n\n handleSearchKeyDown(e) {\n const n = this._matches.length;\n if (e.key === 'ArrowDown') {\n if (n === 0) return;\n e.preventDefault();\n this.setState({ activeIdx: Math.min(this.state.activeIdx + 1, n - 1) });\n } else if (e.key === 'ArrowUp') {\n if (n === 0) return;\n e.preventDefault();\n this.setState({ activeIdx: Math.max(this.state.activeIdx - 1, 0) });\n } else if (e.key === 'Enter') {\n if (n === 0) return;\n e.preventDefault();\n const hit = this._matches[this.state.activeIdx] || this._matches[0];\n if (hit) this.pickMatch(hit.node);\n } else if (e.key === 'Escape') {\n if (this.state.query) {\n e.preventDefault();\n this.setState({ query: '', activeIdx: 0 });\n }\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // On each hidden→shown transition, reseed selection from current active\n // genomes and expand every ancestor so selected taxa are visible.\n const wasShown = prevProps.grameneGenomes && prevProps.grameneGenomes.show;\n const isShown = this.props.grameneGenomes && this.props.grameneGenomes.show;\n if (!wasShown && isShown) {\n const { selected, expanded } = computeOpenState(this.props);\n this.setState({ selected, expanded, query: '', activeIdx: 0, highlightId: null });\n }\n // Keep the highlighted hit scrolled into view inside the dropdown.\n if (prevState.activeIdx !== this.state.activeIdx && this._activeHitEl) {\n this._activeHitEl.scrollIntoView({ block: 'nearest' });\n }\n }\n\n pickMatch(node) {\n // Expand every ancestor so the node is visible, then scroll + flash.\n const { grameneTaxonomy } = this.props;\n const expanded = new Set(this.state.expanded);\n let cur = node;\n const seen = new Set();\n while (cur && !seen.has(cur._id)) {\n seen.add(cur._id);\n expanded.add(cur._id);\n const pid = cur.is_a && cur.is_a[0];\n cur = pid ? grameneTaxonomy[pid] : null;\n }\n this.setState({ expanded, query: '', highlightId: node._id }, () => {\n const el = this.rowRefs[node._id];\n if (el && el.scrollIntoView) el.scrollIntoView({ block: 'center', behavior: 'smooth' });\n clearTimeout(this._hlTimer);\n this._hlTimer = setTimeout(() => this.setState({ highlightId: null }), 1800);\n });\n }\n\n toggleExpand(id) {\n const expanded = new Set(this.state.expanded);\n expanded.has(id) ? expanded.delete(id) : expanded.add(id);\n this.setState({ expanded });\n }\n\n toggleLeaf(taxonId) {\n const selected = new Set(this.state.selected);\n selected.has(taxonId) ? selected.delete(taxonId) : selected.add(taxonId);\n this.setState({ selected });\n }\n\n toggleSubtree(terminal) {\n const selected = new Set(this.state.selected);\n const allOn = terminal.leafIds.every(id => selected.has(id));\n terminal.leafIds.forEach(id => allOn ? selected.delete(id) : selected.add(id));\n this.setState({ selected });\n }\n\n selectAll() {\n const s = new Set();\n Object.values(this.props.grameneMaps).forEach(m => {\n if (!m.hidden) s.add(m.taxon_id);\n });\n this.setState({ selected: s });\n }\n\n selectNone() {\n this.setState({ selected: new Set() });\n }\n\n handleClose() {\n const active = {};\n this.state.selected.forEach(id => { active[id] = true; });\n if (Object.keys(active).length === 0) {\n Object.values(this.props.grameneMaps).forEach(m => {\n if (!m.hidden) active[m.taxon_id] = true;\n });\n }\n this.props.doUpdateGrameneGenomes(active);\n }\n\n renderNode(node, depth, inheritedColor) {\n const { grameneTaxonomy, grameneMaps } = this.props;\n const { selected, expanded } = this.state;\n\n const { chain: rawChain, terminal } = compressChain(node, grameneTaxonomy, grameneMaps);\n const chain = dedupAdjacent(rawChain);\n const leafIds = terminal.leafIds;\n if (leafIds.length === 0) return null;\n\n const selCount = leafIds.reduce((n, id) => n + (selected.has(id) ? 1 : 0), 0);\n const total = leafIds.length;\n const allOn = selCount === total;\n const someOn = selCount > 0 && !allOn;\n\n const visibleKids = (terminal.children || [])\n .map(cid => grameneTaxonomy[cid])\n .filter(c => c && c.leafIds.length > 0);\n const hasKids = visibleKids.length > 0;\n const terminalIsGenome = !!grameneMaps[terminal._id];\n\n const isOpen = expanded.has(terminal._id);\n\n // Deepest clade colour in the chain wins; falls back to inherited.\n const color = chain.reduce(\n (acc, n) => CLADE_COLORS[n.name] || acc,\n inheritedColor\n );\n\n const isHighlighted = rawChain.some(n => n._id === this.state.highlightId);\n\n return (\n <div\n key={terminal._id}\n className={\"tax-node\" + (isHighlighted ? \" tax-node-highlight\" : \"\")}\n style={{ background: color }}\n ref={el => {\n // Register every traversed node (including dedupped-away parents) so\n // search results targeting any ancestor still scroll to this row.\n rawChain.forEach(n => { this.rowRefs[n._id] = el; });\n }}\n >\n <div className=\"tax-row\" style={{ paddingLeft: depth * 7 }}>\n {hasKids ? (\n <span\n className=\"tax-chevron\"\n onClick={() => this.toggleExpand(terminal._id)}\n >\n {isOpen ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n ) : (\n <span className=\"tax-chevron-spacer\"/>\n )}\n\n <input\n type=\"checkbox\"\n checked={allOn}\n ref={el => { if (el) el.indeterminate = someOn; }}\n onChange={() => {\n if (hasKids) this.toggleSubtree(terminal);\n else if (terminalIsGenome) this.toggleLeaf(terminal._id);\n }}\n />\n {' '}\n <span className={hasKids ? \"tax-label tax-label-internal\" : \"tax-label\"}>\n {renderChain(chain)}\n </span>\n\n {(hasKids || terminalIsGenome) && (\n <span className=\"tax-count\"> ({selCount} / {total})</span>\n )}\n\n {hasKids && terminalIsGenome && (\n <label className=\"tax-self-leaf\">\n <input\n type=\"checkbox\"\n checked={selected.has(terminal._id)}\n onChange={() => this.toggleLeaf(terminal._id)}\n />\n <em>this genome</em>\n </label>\n )}\n </div>\n\n {hasKids && isOpen && (\n <div className=\"tax-children\">\n {visibleKids.map(c => this.renderNode(c, depth + 1, color))}\n </div>\n )}\n </div>\n );\n }\n\n render() {\n const { roots } = this.state;\n const { grameneTaxonomy, grameneMaps } = this.props;\n\n // Hide the root spine: start rendering at the first real branch point.\n const topLevel = [];\n roots.forEach(r => {\n const { terminal } = compressChain(r, grameneTaxonomy || {}, grameneMaps || {});\n (terminal.children || []).forEach(cid => {\n const child = grameneTaxonomy && grameneTaxonomy[cid];\n if (child && child.leafIds && child.leafIds.length > 0) {\n topLevel.push(child);\n }\n });\n });\n\n return (\n <Modal\n show={this.props.grameneGenomes.show}\n onHide={this.handleClose.bind(this)}\n size='lg'\n >\n <Modal.Header closeButton>\n <Modal.Title>Select Genomes of Interest</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Button variant=\"outline-secondary\" onClick={this.selectAll.bind(this)}>All</Button>{' '}\n <Button variant=\"outline-secondary\" onClick={this.selectNone.bind(this)}>None</Button>\n\n {(() => {\n this._matches = this.state.query\n ? searchTaxonomy(this.state.query, grameneTaxonomy || {})\n : [];\n const matches = this._matches;\n const activeIdx = Math.min(this.state.activeIdx, Math.max(0, matches.length - 1));\n return (\n <div className=\"tax-search\">\n <input\n type=\"text\"\n className=\"tax-search-input\"\n placeholder=\"Find taxon by name or synonym…\"\n value={this.state.query}\n onChange={this.handleQueryChange.bind(this)}\n onKeyDown={this.handleSearchKeyDown.bind(this)}\n />\n {this.state.query && (\n <div className=\"tax-search-results\">\n {matches.length === 0 ? (\n <div className=\"tax-search-empty\">No matches</div>\n ) : matches.map(({ node, matched, via }, i) => {\n const rank = getRank(node);\n const count = (node.leafIds && node.leafIds.length) || 0;\n const isLeaf = !!(grameneMaps && grameneMaps[node._id]);\n const isActive = i === activeIdx;\n return (\n <div\n key={node._id}\n ref={el => { if (isActive) this._activeHitEl = el; }}\n className={\"tax-search-hit\" + (isActive ? \" tax-search-hit-active\" : \"\")}\n onMouseDown={e => e.preventDefault()}\n onMouseEnter={() => this.setState({ activeIdx: i })}\n onClick={() => this.pickMatch(node)}\n >\n <span className=\"tax-search-name\">{node.name}</span>\n {via === 'synonym' && (\n <span className=\"tax-search-syn\"> {matched} <em>syn.</em></span>\n )}\n {rank && <span className=\"tax-search-rank\"> {rank}</span>}\n {!isLeaf && (\n <span className=\"tax-search-count\"> · {count} genome{count === 1 ? '' : 's'}</span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })()}\n\n <div className=\"tax-tree\">\n {topLevel.map(n => this.renderNode(n, 0, null))}\n </div>\n <Button onClick={this.handleClose.bind(this)}>Submit</Button>\n </Modal.Body>\n </Modal>\n );\n }\n}\n\nexport default connect(\n 'selectGrameneGenomes',\n 'selectGrameneMaps',\n 'selectGrameneTaxonomy',\n 'doUpdateGrameneGenomes',\n TaxonomyModal\n)\n","import React, { useState, Suspense } from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport { Accordion, Button } from 'react-bootstrap';\nimport \"./expression.css\";\nimport Study from './Study';\nconst LazyStudy = React.lazy(() => import('./Study'));\n\nconst StudyList = props => {\n return <Accordion alwaysOpen defaultActiveKey={props.studies.length === 1 ? \"study_0\" : undefined}>\n {props.studies.map((study, idx) => {\n return (\n <Accordion.Item key={idx} eventKey={'study_'+idx}>\n <Accordion.Header>{study.description}</Accordion.Header>\n <Accordion.Body>\n {/*<Suspense fallback={<div>Loading...</div>}>*/}\n {/* <LazyStudy id={study._id}/>*/}\n {/*</Suspense>*/}\n <Study id={study._id}/>\n </Accordion.Body>\n </Accordion.Item>\n )\n })}\n </Accordion>\n};\n\nconst Expression = props => {\n let searchTaxa = {};\n if (props.grameneSearch) {\n const taxon_id_facet = props.grameneSearch.facet_counts.facet_fields.taxon_id;\n taxon_id_facet.filter((tid, idx) => idx % 2 === 0).forEach(tid => {\n if (tid > 1000000) {\n const tid2 = Math.floor(tid / 1000);\n if (props.expressionStudies[tid2]) {\n searchTaxa[tid2] = tid;\n }\n }\n else {\n searchTaxa[tid] = tid;\n }\n });\n }\n const availableTaxa = Object.keys(props.expressionStudies)\n .filter(tid => searchTaxa[tid])\n .sort((a,b) => props.grameneMaps[searchTaxa[a]].left_index - props.grameneMaps[searchTaxa[b]].left_index);\n return availableTaxa && props.grameneTaxonomy &&\n <div>\n <div>This is where you can launch a component for the selected samples. props.desiredSamples lists them.\n This component can request the data from the API\n organize samples by factor metadata? One big table with all the studies?\n <Button\n onClick={console.log(Object.keys(props.desiredSamples))}\n >Show Samples ({Object.keys(props.desiredSamples).length} selected)</Button>\n </div>\n <Accordion alwaysOpen defaultActiveKey={availableTaxa.length === 1 ? \"tax_0\" : undefined}>\n {availableTaxa.map((tid, idx) => {\n const baselineStudies = props.expressionStudies[tid].filter(study => study.type === 'Baseline');\n const n = baselineStudies.length;\n return <Accordion.Item key={idx} eventKey={'tax_'+idx}>\n <Accordion.Header>{props.grameneTaxonomy[tid].name} - {n} {n === 1 ? 'study' : 'studies'}</Accordion.Header>\n <Accordion.Body><StudyList studies={baselineStudies}/></Accordion.Body>\n </Accordion.Item>\n })}\n </Accordion>\n </div>\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneSearch',\n 'selectGrameneTaxonomy',\n 'selectGrameneMaps',\n 'selectExpressionStudies',\n 'selectDesiredSamples', // current set of samples to fetch expression data for\n Expression\n);\n","import {connect} from \"redux-bundler-react\";\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {Table, Form, Button, Alert, Spinner, Container, Row, Col, Modal} from 'react-bootstrap';\nimport { getFirebaseApp } from \"../utils\";\nimport {getAuth, onAuthStateChanged} from \"firebase/auth\";\n\nconst MAX_GENE_IDS = 1000; // Define the maximum number of gene IDs allowed\n\nconst formatCreatedAt = (value) => {\n if (!value) return '';\n const d = new Date(value);\n if (isNaN(d.getTime())) return '';\n return d.toLocaleDateString();\n};\n\nconst applySortFilter = (lists, search, sort) => {\n const s = search.trim().toLowerCase();\n let result = s\n ? lists.filter(l => (l.label || '').toLowerCase().includes(s))\n : lists.slice();\n const { key, dir } = sort;\n const mult = dir === 'asc' ? 1 : -1;\n result.sort((a, b) => {\n let av = a[key], bv = b[key];\n if (key === 'createdAt') {\n av = av ? new Date(av).getTime() : 0;\n bv = bv ? new Date(bv).getTime() : 0;\n } else if (key === 'n_genes') {\n av = av || 0;\n bv = bv || 0;\n } else {\n av = (av || '').toString().toLowerCase();\n bv = (bv || '').toString().toLowerCase();\n }\n if (av < bv) return -1 * mult;\n if (av > bv) return 1 * mult;\n return 0;\n });\n return result;\n};\n\nconst SortHeader = ({ label, sortKey, sort, onToggle }) => {\n const active = sort.key === sortKey;\n const indicator = active ? (sort.dir === 'asc' ? ' ▲' : ' ▼') : '';\n return (\n <th\n style={{ cursor: 'pointer', userSelect: 'none', position: 'sticky', top: 0, background: '#fff', zIndex: 1 }}\n onClick={() => onToggle(sortKey)}\n >\n {label}{indicator}\n </th>\n );\n};\n\nconst stickyHeaderStyle = { position: 'sticky', top: 0, background: '#fff', zIndex: 1 };\n\nconst GeneListDisplayComponent = props => {\n const [publicGeneLists, setPublicGeneLists] = useState([]);\n const [privateGeneLists, setPrivateGeneLists] = useState([]);\n const [error, setError] = useState(null);\n const [notice, setNotice] = useState(null);\n const [user, setUser] = useState({});\n const [editingId, setEditingId] = useState(null);\n const [editLabel, setEditLabel] = useState('');\n const [editIsPublic, setEditIsPublic] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState(null);\n const [search, setSearch] = useState('');\n const [sort, setSort] = useState({ key: 'createdAt', dir: 'desc' });\n const auth = props.auth;\n if (auth) onAuthStateChanged(auth, (user) => setUser(user));\n\n const toggleSort = (key) => setSort(s =>\n s.key === key ? { key, dir: s.dir === 'asc' ? 'desc' : 'asc' } : { key, dir: 'asc' }\n );\n\n const currentUid = user && user.uid;\n const mergedLists = useMemo(() => {\n const byId = new Map();\n [...publicGeneLists, ...privateGeneLists].forEach(l => byId.set(l._id, l));\n return Array.from(byId.values());\n }, [publicGeneLists, privateGeneLists]);\n\n const displayedLists = useMemo(\n () => applySortFilter(mergedLists, search, sort),\n [mergedLists, search, sort]\n );\n\n const fetchPrivateGeneLists = async () => {\n if (!auth) {\n setPrivateGeneLists([]);\n setError(null);\n setNotice(null);\n return;\n }\n if (!user || typeof user.getIdToken !== 'function') {\n setPrivateGeneLists([]);\n setError(null);\n setNotice('Log in to create and manage your personal gene lists.');\n return;\n }\n try {\n const token = await user.getIdToken();\n const response = await fetch(`${props.api}/gene_lists?site=${props.site}&isPublic=false`, {\n method: 'GET',\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`\n }\n });\n const result = await response.json();\n\n if (response.ok) {\n setError(null);\n setNotice(null);\n setPrivateGeneLists(result);\n } else {\n setError('Error fetching gene lists.');\n }\n } catch (err) {\n setError('Failed to fetch private gene lists. Please try again later.');\n }\n };\n // Fetch saved gene lists from a backend or local storage\n const fetchPublicGeneLists = async () => {\n try {\n // Replace this with actual fetch from your backend or storage\n const response = await fetch(`${props.api}/gene_lists?site=${props.site}&isPublic=true`);\n const result = await response.json();\n\n if (response.ok) {\n setPublicGeneLists(result); // array of saved gene lists\n } else {\n setError('Error fetching gene lists.');\n }\n } catch (err) {\n setError('Failed to fetch gene lists. Please try again later.');\n }\n };\n\n // Example functions for viewing and deleting lists\n const viewGeneList = (list) => {\n props.addFilter({\n category: 'Gene List',\n fq_field: 'saved_search',\n fq_value: list.hash,\n name: list.label\n })\n };\n\n const startEdit = (list) => {\n setEditingId(list._id);\n setEditLabel(list.label || '');\n setEditIsPublic(!!list.isPublic);\n };\n\n const cancelEdit = () => {\n setEditingId(null);\n setEditLabel('');\n setEditIsPublic(false);\n };\n\n const saveEdit = async (listId) => {\n try {\n const token = await user.getIdToken();\n const response = await fetch(`${props.api}/gene_lists?listId=${encodeURIComponent(listId)}`, {\n method: 'PATCH',\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`\n },\n body: JSON.stringify({ label: editLabel, isPublic: editIsPublic })\n });\n if (response.ok) {\n cancelEdit();\n setError(null);\n await fetchPrivateGeneLists();\n await fetchPublicGeneLists();\n } else if (response.status === 401) {\n setError('You must be signed in to edit a gene list.');\n } else if (response.status === 404) {\n setError('Gene list not found or you do not own it.');\n } else if (response.status === 400) {\n setError('Nothing to update — please enter a label.');\n } else {\n setError('Failed to update gene list.');\n }\n } catch (err) {\n setError('Failed to update gene list.');\n }\n };\n\n const requestDelete = (list) => setDeleteTarget(list);\n const cancelDelete = () => setDeleteTarget(null);\n\n const confirmDelete = async () => {\n if (!deleteTarget) return;\n const listId = deleteTarget._id;\n setDeleteTarget(null);\n try {\n const token = await user.getIdToken();\n const response = await fetch(`${props.api}/gene_lists?listId=${encodeURIComponent(listId)}`, {\n method: 'DELETE',\n headers: { \"Authorization\": `Bearer ${token}` }\n });\n if (response.ok) {\n await fetchPrivateGeneLists();\n await fetchPublicGeneLists();\n } else if (response.status === 401) {\n alert('You must be signed in to delete a gene list.');\n } else if (response.status === 404) {\n alert('Gene list not found or you do not own it.');\n } else {\n alert('Failed to delete gene list.');\n }\n } catch (err) {\n alert('Failed to delete gene list.');\n }\n };\n\n // Fetch data when the component is mounted or after a save\n useEffect(() => {\n fetchPublicGeneLists();\n }, [props.refreshKey]);\n useEffect(() => {\n fetchPrivateGeneLists();\n }, [user, props.refreshKey]);\n\n return (\n <div className=\"gene-list-display-component\">\n {error && (\n <Alert variant=\"danger\">\n {error}\n </Alert>\n )}\n\n {notice && (\n <Alert variant=\"info\">\n {notice}\n </Alert>\n )}\n\n {mergedLists.length > 0 ? (\n <div className=\"mt-4\">\n <div className=\"d-flex justify-content-end mb-2\">\n <Form.Control\n type=\"search\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n style={{ maxWidth: 220 }}\n size=\"sm\"\n />\n </div>\n <div style={{ maxHeight: 500, overflowY: 'auto', border: '1px solid #dee2e6', borderRadius: 4 }}>\n <Table striped hover className=\"mb-0\">\n <thead>\n <tr>\n <SortHeader label=\"List Name\" sortKey=\"label\" sort={sort} onToggle={toggleSort} />\n <SortHeader label=\"Owner\" sortKey=\"owner\" sort={sort} onToggle={toggleSort} />\n <SortHeader label=\"Genes\" sortKey=\"n_genes\" sort={sort} onToggle={toggleSort} />\n <SortHeader label=\"Created\" sortKey=\"createdAt\" sort={sort} onToggle={toggleSort} />\n <th style={stickyHeaderStyle}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {displayedLists.map((list, index) => {\n const isMine = currentUid && list.uid === currentUid;\n const ownerLabel = isMine ? 'You' : (list.owner || 'Unknown');\n return editingId === list._id ? (\n <tr key={index}>\n <td>\n <Form.Control\n type=\"text\"\n value={editLabel}\n onChange={(e) => setEditLabel(e.target.value)}\n placeholder=\"List name\"\n />\n <Form.Check\n type=\"switch\"\n id={`edit-public-${list._id}`}\n label=\"Public\"\n checked={editIsPublic}\n onChange={() => setEditIsPublic(!editIsPublic)}\n className=\"mt-2\"\n />\n </td>\n <td>{ownerLabel}</td>\n <td>{list.n_genes || 0}</td>\n <td>{formatCreatedAt(list.createdAt)}</td>\n <td>\n <Button variant=\"primary\" size=\"sm\" onClick={() => saveEdit(list._id)}>\n Save\n </Button>\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={cancelEdit} className=\"ml-2\">\n Cancel\n </Button>\n </td>\n </tr>\n ) : (\n <tr key={index}>\n <td>{list.label}{list.isPublic ? ' (public)' : ''}</td>\n <td>{ownerLabel}</td>\n <td>{list.n_genes || 0}</td>\n <td>{formatCreatedAt(list.createdAt)}</td>\n <td>\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={() => viewGeneList(list)}>\n View\n </Button>\n {isMine && (\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={() => startEdit(list)} className=\"ml-2\">\n Edit\n </Button>\n )}\n {isMine && (\n <Button variant=\"outline-danger\" size=\"sm\" onClick={() => requestDelete(list)} className=\"ml-2\">\n Delete\n </Button>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </Table>\n </div>\n </div>\n ) : (\n <Alert variant=\"warning\" className=\"mt-4\">\n No saved gene lists found.\n </Alert>\n )}\n\n <Modal show={!!deleteTarget} onHide={cancelDelete} centered>\n <Modal.Header closeButton>\n <Modal.Title>Delete gene list?</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n Are you sure you want to delete\n {deleteTarget ? <> <strong>{deleteTarget.label}</strong></> : ' this gene list'}?\n This action cannot be undone.\n </Modal.Body>\n <Modal.Footer>\n <Button variant=\"secondary\" onClick={cancelDelete} autoFocus>\n Cancel\n </Button>\n <Button variant=\"danger\" onClick={confirmDelete}>\n Delete\n </Button>\n </Modal.Footer>\n </Modal>\n </div>\n );\n};\n\nconst GeneListComponent = props => {\n const [geneList, setGeneList] = useState('');\n const [listHash, setListHash] = useState(null);\n const [validationError, setValidationError] = useState([]);\n const [listName, setListName] = useState('');\n const [listIsPublic, setListIsPublic] = useState(false);\n const [validatedList, setValidatedList] = useState([]);\n const [errorMessage, setErrorMessage] = useState('');\n const [loading, setLoading] = useState(false); // New loading state\n const [user, setUser] = useState({});\n const auth = props.auth;\n if (auth) onAuthStateChanged(auth, (user) => setUser(user));\n\n // Function to handle gene list input\n const handleGeneListChange = (event) => {\n setGeneList(event.target.value);\n };\n\n // Function to handle drag and drop of gene list\n const handleDrop = (event) => {\n event.preventDefault();\n const geneData = event.dataTransfer.getData('text');\n setGeneList(geneData);\n };\n\n // Function to handle drag over (needed for drop)\n const handleDragOver = (event) => {\n event.preventDefault();\n };\n\n // Function to submit gene list for validation\n const handleSubmit = async () => {\n const geneArray = geneList.split('\\n').filter(Boolean); // Convert the gene list into an array and filter out empty values\n\n if (geneArray.length > MAX_GENE_IDS) {\n setErrorMessage(`You have exceeded the maximum limit of ${MAX_GENE_IDS} gene IDs.`);\n return;\n }\n\n setErrorMessage(''); // Reset error message if validation passes\n setLoading(true); // Set loading state to true to show progress\n\n try {\n const response = await fetch(`${props.api}/gene_lists/validate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(geneArray),\n });\n\n const result = await response.json();\n\n if (result.hash) {\n setListHash(result.hash);\n setValidatedList(result.ids);\n setValidationError(result.missing);\n } else {\n // Handle errors from validation\n alert('Error during validation.');\n }\n } catch (error) {\n alert('There was an error with the validation service.',error);\n } finally {\n setLoading(false); // Set loading to false when the request is complete\n }\n };\n\n // Function to save the validated gene list\n const handleSaveList = async () => {\n const queryParams = {\n label: listName,\n hash: listHash,\n site: props.site,\n n_genes: validatedList.length,\n isPublic: listIsPublic\n };\n const queryString = new URLSearchParams(queryParams).toString();\n\n const token = await user.getIdToken();\n try {\n const response = await fetch(`${props.api}/gene_lists?${queryString}`, {\n method: 'POST',\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`\n }\n });\n if (!response.ok) {\n throw new Error('Failed to save list');\n }\n const result = await response.json();\n console.log(result);\n setGeneList('');\n setListHash(null);\n setValidatedList([]);\n setValidationError([]);\n setListName('');\n setListIsPublic(false);\n if (props.onListSaved) props.onListSaved();\n\n } catch (error) {\n console.error(\"There was an problem with fetch\", error)\n }\n };\n\n return (\n <div className=\"gene-list-component\">\n <Form>\n {/* Input for Gene List */}\n <Form.Group controlId=\"geneList\">\n <Form.Label>Paste or drop your gene list here:</Form.Label>\n <Form.Control\n as=\"textarea\"\n rows={10}\n value={geneList}\n onChange={handleGeneListChange}\n placeholder={`Paste or drop your gene list here (Maximum: ${MAX_GENE_IDS} IDs)`}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n />\n </Form.Group>\n\n {/* Display error if gene list exceeds limit */}\n {errorMessage && (\n <Alert variant=\"danger\">\n {errorMessage}\n </Alert>\n )}\n\n {/* Button to submit for validation */}\n <Button variant=\"primary\" onClick={handleSubmit}>\n Validate Gene List\n </Button>\n </Form>\n\n {/* Display validation in progress */}\n {loading && (\n <div className=\"validation-summary mt-4\">\n <h3>Validation in Progress...</h3>\n <Spinner animation=\"border\" role=\"status\">\n <span className=\"sr-only\">Validating...</span>\n </Spinner>\n </div>\n )}\n\n\n {/* Display validation summary */}\n {!loading && listHash && (\n <div className=\"validation-summary mt-3 p-3 border rounded bg-light\">\n <div>\n <span className=\"text-success\">\n <strong>{validatedList.length}</strong> valid\n </span>\n {validationError.length > 0 && (\n <div className=\"text-danger mt-1\">\n <strong>{validationError.length}</strong> not found\n </div>\n )}\n </div>\n {validationError.length > 0 && (\n <details className=\"mt-2\">\n <summary style={{cursor: 'pointer'}}>Show unrecognized IDs</summary>\n <pre className=\"small mt-2 mb-0\" style={{maxHeight: 150, overflow: 'auto'}}>\n {validationError.join('\\n')}\n </pre>\n </details>\n )}\n </div>\n )}\n\n {/* Input for saving validated gene list */}\n {!loading && validatedList.length > 0 && (\n <div className=\"save-list mt-4\">\n <Form.Group controlId=\"listName\">\n <Form.Label>Save Validated Gene List</Form.Label>\n <Form.Control\n type=\"text\"\n value={listName}\n onChange={(e) => setListName(e.target.value)}\n placeholder=\"Enter list name\"\n />\n <Form.Check\n type='switch'\n id='listIsPublic'\n label='Public'\n onChange={(e) => setListIsPublic(!listIsPublic)}\n />\n </Form.Group>\n {user ?\n <Button variant=\"primary\" onClick={handleSaveList}>\n Save Gene List\n </Button>\n : <Button variant=\"secondary\" disabled>Login Required</Button> }\n </div>\n )}\n </div>\n );\n};\n\nconst UserGeneListsComponent = props => {\n const [refreshKey, setRefreshKey] = useState(0);\n const handleListSaved = () => setRefreshKey(k => k + 1);\n const firebaseConfig = props.configuration && props.configuration.firebaseConfig;\n const auth = useMemo(() => {\n const app = getFirebaseApp(firebaseConfig);\n return app ? getAuth(app) : null;\n }, [firebaseConfig]);\n if (!auth) {\n return (\n <Alert variant=\"info\">\n User gene lists are not available on this site.\n </Alert>\n );\n }\n return (\n <Container fluid>\n <Row>\n <Col><GeneListComponent api={props.configuration.grameneData} site={props.configuration.id} auth={auth} onListSaved={handleListSaved}/></Col>\n <Col><GeneListDisplayComponent api={props.configuration.grameneData} site={props.configuration.id} auth={auth} addFilter={props.doAcceptGrameneSuggestion} refreshKey={refreshKey}/></Col>\n </Row>\n </Container>\n )\n}\n\nexport default connect(\n 'selectConfiguration',\n 'doAcceptGrameneSuggestion',\n UserGeneListsComponent\n);\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport FieldTree from './FieldTree';\nimport Preview from './Preview';\nimport ExportFooter from './ExportFooter';\nimport './styles.css';\n\nconst MIN_LEFT_PCT = 15;\nconst MAX_LEFT_PCT = 85;\n\nconst ExporterViewCmp = props => {\n const {\n fieldCatalog: catalog,\n grameneFieldCatalogIsLoading: isLoading,\n grameneFieldCatalogRaw: raw,\n grameneFieldCatalogShouldUpdate: shouldUpdate,\n doFetchGrameneFieldCatalog\n } = props;\n const [fieldQuery, setFieldQuery] = useState('');\n const [leftPct, setLeftPct] = useState(50);\n const [dragging, setDragging] = useState(false);\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (shouldUpdate) doFetchGrameneFieldCatalog();\n }, [shouldUpdate, doFetchGrameneFieldCatalog]);\n\n const onPointerMove = useCallback((e) => {\n const el = containerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const pct = ((e.clientX - rect.left) / rect.width) * 100;\n if (!Number.isFinite(pct)) return;\n setLeftPct(Math.max(MIN_LEFT_PCT, Math.min(MAX_LEFT_PCT, pct)));\n }, []);\n\n useEffect(() => {\n if (!dragging) return;\n const onUp = () => setDragging(false);\n window.addEventListener('pointermove', onPointerMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n const prev = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n return () => {\n window.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n document.body.style.userSelect = prev;\n };\n }, [dragging, onPointerMove]);\n\n if (!catalog || !catalog.groups) {\n const msg = isLoading ? 'Loading…' : (raw && raw.error) ? `error: ${String(raw.error)}` : 'init';\n return (\n <div className=\"exporter-view\">\n <em style={{padding: '1rem'}}>Loading field catalog… ({msg})</em>\n </div>\n );\n }\n\n const gridStyle = {\n gridTemplateColumns: `${leftPct}% 8px ${100 - leftPct}%`\n };\n\n return (\n <div className=\"exporter-view\" ref={containerRef} style={gridStyle}>\n <div className=\"exporter-pane\">\n <div className=\"exporter-pane-header exporter-pane-header-row\">\n <b>Available fields</b>\n <small style={{color: '#888', marginLeft: '0.5rem'}}>\n {Object.keys(catalog.fields).length} total\n </small>\n <input\n type=\"search\"\n className=\"form-control exporter-field-search exporter-field-search-inline\"\n placeholder=\"Search fields…\"\n value={fieldQuery}\n onChange={e => setFieldQuery(e.target.value)}\n />\n </div>\n <div className=\"exporter-pane-body\">\n <FieldTree query={fieldQuery}/>\n </div>\n </div>\n\n <div\n className={'exporter-divider' + (dragging ? ' dragging' : '')}\n onPointerDown={e => { e.preventDefault(); setDragging(true); }}\n onDoubleClick={() => setLeftPct(50)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n title=\"Drag to resize · double-click to reset\"\n />\n\n <div className=\"exporter-pane exporter-right-pane\">\n <div className=\"exporter-right-split\">\n <div className=\"exporter-preview-section\">\n <Preview/>\n </div>\n <ExportFooter/>\n </div>\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectGrameneFieldCatalogIsLoading',\n 'selectGrameneFieldCatalogRaw',\n 'selectGrameneFieldCatalogShouldUpdate',\n 'doFetchGrameneFieldCatalog',\n ExporterViewCmp\n);\n","import React, { useState, useMemo } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { BsChevronDown, BsChevronRight } from 'react-icons/bs';\n\nconst MAX_VISIBLE_PER_GROUP = 200;\n\nfunction collectFieldNames(group) {\n const names = [...(group.fields || [])];\n for (const s of group.subgroups || []) names.push(...collectFieldNames(s));\n return names;\n}\n\nfunction collectMatchingFieldNames(group) {\n const names = [...(group.matchingFields || [])];\n for (const s of group.subgroups || []) names.push(...collectMatchingFieldNames(s));\n return names;\n}\n\nfunction filterGroup(group, q, catalog) {\n const matchingFields = (group.fields || []).filter(name => {\n if (!q) return true;\n const f = catalog.fields[name];\n return name.toLowerCase().includes(q) || (f && f.label.toLowerCase().includes(q));\n });\n const groupLabelMatches = q && group.label && group.label.toLowerCase().includes(q);\n const subgroups = (group.subgroups || [])\n .map(s => filterGroup(s, groupLabelMatches ? '' : q, catalog))\n .filter(s => s);\n if (!q) return { ...group, matchingFields, subgroups };\n if (groupLabelMatches) {\n return {\n ...group,\n matchingFields: group.fields || [],\n subgroups: (group.subgroups || []).map(s => filterGroup(s, '', catalog))\n };\n }\n if (matchingFields.length === 0 && subgroups.length === 0) return null;\n return { ...group, matchingFields, subgroups };\n}\n\nconst FieldRow = ({ name, catalog, selectedSet, onToggle }) => {\n const f = catalog.fields[name];\n if (!f) return null;\n const linked = f.linkedFields;\n const checked = linked\n ? linked.every(n => selectedSet.has(n))\n : selectedSet.has(name);\n return (\n <li>\n <label title={name + (f.description ? '\\n' + f.description : '')}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => onToggle(name)}\n />\n <span className=\"exporter-field-label\">{f.label}</span>\n {f.multiValued && <span className=\"exporter-field-badge\">[]</span>}\n </label>\n </li>\n );\n};\n\nconst GroupNode = ({ group, depth, catalog, selectedSet, onToggle, onBulkSet, openMap, setOpen, forceOpen }) => {\n const matchingNames = collectMatchingFieldNames(group);\n const total = matchingNames.length;\n const isAllLinkedSelected = (name) => {\n const f = catalog.fields[name];\n const linked = f && f.linkedFields;\n if (linked) return linked.every(n => selectedSet.has(n));\n return selectedSet.has(name);\n };\n const selectedCount = matchingNames.reduce((n, name) => n + (isAllLinkedSelected(name) ? 1 : 0), 0);\n const allSelected = total > 0 && selectedCount === total;\n const noneSelected = selectedCount === 0;\n const isOpen = forceOpen || openMap[group.id] || false;\n const visible = (group.matchingFields || []).slice(0, MAX_VISIBLE_PER_GROUP);\n const truncated = (group.matchingFields || []).length - visible.length;\n\n const expandLinked = (names) => {\n const out = [];\n for (const n of names) {\n const f = catalog.fields[n];\n if (f && f.linkedFields) out.push(...f.linkedFields);\n else out.push(n);\n }\n return out;\n };\n\n const handleBulk = (e, selected) => {\n e.stopPropagation();\n if (matchingNames.length === 0) return;\n onBulkSet(expandLinked(matchingNames), selected);\n };\n\n return (\n <div className=\"exporter-group\" style={{ marginLeft: depth > 0 ? '0.75rem' : 0 }}>\n <div className=\"exporter-group-header\" onClick={() => setOpen(group.id, !isOpen)}>\n <span className=\"exporter-group-chevron\">\n {isOpen ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n <b>{group.label}</b>\n <span className=\"exporter-group-actions\">\n <button\n type=\"button\"\n className=\"exporter-group-action\"\n disabled={allSelected || total === 0}\n onClick={e => handleBulk(e, true)}\n title=\"Select all fields in this group\"\n >All</button>\n <button\n type=\"button\"\n className=\"exporter-group-action\"\n disabled={noneSelected}\n onClick={e => handleBulk(e, false)}\n title=\"Deselect all fields in this group\"\n >None</button>\n </span>\n <span className=\"exporter-group-count\">{selectedCount}/{total}</span>\n </div>\n {isOpen && (\n <>\n {(group.subgroups || []).map(sub => (\n <GroupNode\n key={sub.id}\n group={sub}\n depth={depth + 1}\n catalog={catalog}\n selectedSet={selectedSet}\n onToggle={onToggle}\n onBulkSet={onBulkSet}\n openMap={openMap}\n setOpen={setOpen}\n forceOpen={forceOpen}\n />\n ))}\n {visible.length > 0 && (\n <ul className=\"exporter-group-fields\">\n {visible.map(name => (\n <FieldRow\n key={name}\n name={name}\n catalog={catalog}\n selectedSet={selectedSet}\n onToggle={onToggle}\n />\n ))}\n {truncated > 0 && (\n <li className=\"exporter-group-truncated\">\n <em>… {truncated} more. Refine search to see.</em>\n </li>\n )}\n </ul>\n )}\n </>\n )}\n </div>\n );\n};\n\nconst FieldTreeCmp = props => {\n const { fieldCatalog: catalog, exporterSelectedFields, doToggleExporterField, doBulkSetExporterFields, query = '' } = props;\n const [openMap, setOpenMap] = useState({});\n\n const selectedSet = useMemo(() => new Set(exporterSelectedFields), [exporterSelectedFields]);\n\n const handleToggle = (name) => {\n const f = catalog && catalog.fields && catalog.fields[name];\n const linked = f && f.linkedFields;\n if (linked) {\n const allSelected = linked.every(n => selectedSet.has(n));\n doBulkSetExporterFields(linked, !allSelected);\n } else {\n doToggleExporterField(name);\n }\n };\n\n const q = query.trim().toLowerCase();\n\n const filtered = useMemo(() => {\n if (!catalog || !catalog.groups) return [];\n return catalog.groups\n .map(g => filterGroup(g, q, catalog))\n .filter(g => g && ((g.matchingFields && g.matchingFields.length) || (g.subgroups && g.subgroups.length)));\n }, [catalog, q]);\n\n if (!catalog || !catalog.groups) {\n return <div className=\"exporter-panel-empty\">Loading field catalog…</div>;\n }\n\n const setOpen = (id, val) => setOpenMap(s => ({ ...s, [id]: val }));\n const forceOpen = !!q;\n\n return (\n <div className=\"exporter-field-tree\">\n <div className=\"exporter-field-tree-body\">\n {filtered.map(group => (\n <GroupNode\n key={group.id}\n group={group}\n depth={0}\n catalog={catalog}\n selectedSet={selectedSet}\n onToggle={handleToggle}\n onBulkSet={doBulkSetExporterFields}\n openMap={openMap}\n setOpen={setOpen}\n forceOpen={forceOpen}\n />\n ))}\n {filtered.length === 0 && (\n <div className=\"exporter-panel-empty\">No fields match \"{query}\".</div>\n )}\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectExporterSelectedFields',\n 'doToggleExporterField',\n 'doBulkSetExporterFields',\n FieldTreeCmp\n);\n","import React, { useEffect, useMemo, useState, useRef } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { BsArrowLeftShort, BsArrowRightShort, BsSliders } from 'react-icons/bs';\nimport { buildTableData, toJSON } from './formatters';\nimport { ANCESTOR_FIELD_MAP, collectAncestorIds } from './ancestorsResolver';\nimport CutoffsModal from './CutoffsModal';\n\nconst PreviewCmp = props => {\n const {\n fieldCatalog: catalog,\n exporterSelectedFields: fields,\n exporterFormat: format,\n exporterPreview: preview,\n expressionStudies,\n expressionSamples,\n grameneTaxonomy,\n gramenePathways,\n ontologies,\n exporterCutoffs,\n doSetExporterFormat,\n doReorderExporterFields,\n doClearExporterFields,\n doSetExporterCutoffs,\n doEnsureOntologyRecords,\n doRequestGramenePathways\n } = props;\n\n const [showCutoffs, setShowCutoffs] = useState(false);\n const docs = preview.data || [];\n\n const ancestorFieldsSelected = useMemo(\n () => fields.filter(n => ANCESTOR_FIELD_MAP[n]),\n [fields]\n );\n\n useEffect(() => {\n if (ancestorFieldsSelected.length === 0 || docs.length === 0) return;\n const idsByOnt = collectAncestorIds(docs, ancestorFieldsSelected);\n for (const [ontKey, ids] of Object.entries(idsByOnt)) {\n if (!ids.length) continue;\n if (ontKey === 'taxonomy') continue; // already cached globally\n if (ontKey === 'pathways') {\n if (doRequestGramenePathways) doRequestGramenePathways(ids);\n continue;\n }\n if (doEnsureOntologyRecords) doEnsureOntologyRecords(ontKey, ids);\n }\n }, [docs, ancestorFieldsSelected, doEnsureOntologyRecords, doRequestGramenePathways]);\n\n if (fields.length === 0) {\n return (\n <div className=\"exporter-preview-empty\">\n <em>Select at least one field to preview.</em>\n </div>\n );\n }\n\n const renderStatus = () => {\n if (preview.status === 'loading') return <small className=\"exporter-preview-status\">Loading…</small>;\n if (preview.status === 'error') return <small className=\"exporter-preview-status error\">Error: {preview.error}</small>;\n if (preview.status === 'stale') return <small className=\"exporter-preview-status\">Refreshing…</small>;\n if (preview.status === 'idle') return <small className=\"exporter-preview-status\">Idle</small>;\n return null;\n };\n\n const resolverCtx = {\n expressionStudies,\n expressionSamples,\n taxonomy: grameneTaxonomy,\n pathways: gramenePathways,\n ontologies,\n cutoffs: exporterCutoffs\n };\n\n const moveField = (name, delta) => {\n const idx = fields.indexOf(name);\n if (idx === -1) return;\n const target = idx + delta;\n if (target < 0 || target >= fields.length) return;\n const next = [...fields];\n [next[idx], next[target]] = [next[target], next[idx]];\n doReorderExporterFields(next);\n };\n\n return (\n <div className=\"exporter-preview\">\n <div className=\"exporter-preview-toolbar\">\n <span className=\"exporter-preview-title\"><b>Preview</b> (first 20 genes)</span>\n <span className=\"exporter-preview-fields-count\">\n {fields.length} field{fields.length === 1 ? '' : 's'}\n {fields.length > 0 && (\n <button\n className=\"btn btn-sm btn-link exporter-clear-btn\"\n onClick={doClearExporterFields}\n >clear</button>\n )}\n </span>\n <span className=\"exporter-preview-format\">\n <label>\n <input\n type=\"radio\"\n name=\"exporter-format\"\n value=\"tsv\"\n checked={format === 'tsv'}\n onChange={() => doSetExporterFormat('tsv')}\n /> TSV\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"exporter-format\"\n value=\"json\"\n checked={format === 'json'}\n onChange={() => doSetExporterFormat('json')}\n /> JSON\n </label>\n </span>\n <button\n type=\"button\"\n className=\"btn btn-sm btn-light exporter-cutoffs-btn\"\n onClick={() => setShowCutoffs(true)}\n title=\"Expression cutoffs\"\n >\n <BsSliders/> Cutoffs\n </button>\n {renderStatus()}\n </div>\n {showCutoffs && (\n <CutoffsModal\n cutoffs={exporterCutoffs}\n onApply={doSetExporterCutoffs}\n onClose={() => setShowCutoffs(false)}\n />\n )}\n <div className=\"exporter-preview-body\">\n {format === 'tsv' ? (\n <TSVTable\n docs={docs}\n fields={fields}\n catalog={catalog}\n resolverCtx={resolverCtx}\n onMoveField={moveField}\n />\n ) : (\n <pre className=\"exporter-preview-json\">{toJSON(docs, fields, resolverCtx)}</pre>\n )}\n </div>\n </div>\n );\n};\n\nconst MIN_COL_WIDTH = 40;\n\nconst TSVTable = ({ docs, fields, catalog, resolverCtx, onMoveField }) => {\n const { header, headerKeys, rows } = buildTableData(docs, fields, catalog, resolverCtx);\n const reorderableCount = fields.length;\n const [colWidths, setColWidths] = useState({});\n const thRefs = useRef({});\n\n const startResize = (key) => (e) => {\n e.preventDefault();\n e.stopPropagation();\n const th = thRefs.current[key];\n const startWidth = (th && th.getBoundingClientRect().width) || 100;\n const startX = e.clientX;\n const onMove = (ev) => {\n const delta = ev.clientX - startX;\n const next = Math.max(MIN_COL_WIDTH, startWidth + delta);\n setColWidths(prev => ({ ...prev, [key]: next }));\n };\n const onUp = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n document.body.style.userSelect = '';\n };\n document.body.style.userSelect = 'none';\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n };\n\n return (\n <div className=\"exporter-preview-tsv-scroll\">\n <table className=\"exporter-preview-tsv\">\n <thead>\n <tr>\n {header.map((h, i) => {\n const key = headerKeys[i];\n const fieldIdx = fields.indexOf(key);\n const reorderable = fieldIdx !== -1;\n const w = colWidths[key];\n const thStyle = w ? { width: `${w}px`, maxWidth: `${w}px`, minWidth: `${w}px` } : undefined;\n return (\n <th key={key} title={key} style={thStyle} ref={el => { thRefs.current[key] = el; }}>\n <div className=\"exporter-preview-th-inner\">\n <button\n type=\"button\"\n className=\"exporter-preview-reorder-btn\"\n disabled={!reorderable || fieldIdx === 0}\n onClick={() => onMoveField(key, -1)}\n title=\"Move left\"\n ><BsArrowLeftShort/></button>\n <span className=\"exporter-preview-th-label\">{h}</span>\n <button\n type=\"button\"\n className=\"exporter-preview-reorder-btn\"\n disabled={!reorderable || fieldIdx === reorderableCount - 1}\n onClick={() => onMoveField(key, 1)}\n title=\"Move right\"\n ><BsArrowRightShort/></button>\n </div>\n <span\n className=\"exporter-preview-col-resizer\"\n onPointerDown={startResize(key)}\n onDoubleClick={() => setColWidths(prev => { const n = { ...prev }; delete n[key]; return n; })}\n title=\"Drag to resize · double-click to reset\"\n />\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, r) => (\n <tr key={r}>\n {row.map((c, i) => {\n const key = headerKeys[i];\n const w = colWidths[key];\n const tdStyle = w ? { width: `${w}px`, maxWidth: `${w}px`, minWidth: `${w}px` } : undefined;\n return (\n <td key={key} title={c} style={tdStyle}>{c}</td>\n );\n })}\n </tr>\n ))}\n {rows.length === 0 && (\n <tr>\n <td colSpan={header.length} className=\"exporter-preview-empty-row\">\n <em>No rows.</em>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectExporterSelectedFields',\n 'selectExporterFormat',\n 'selectExporterPreview',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'selectGrameneTaxonomy',\n 'selectGramenePathways',\n 'selectOntologies',\n 'selectExporterCutoffs',\n 'doSetExporterFormat',\n 'doReorderExporterFields',\n 'doClearExporterFields',\n 'doSetExporterCutoffs',\n 'doEnsureOntologyRecords',\n 'doRequestGramenePathways',\n PreviewCmp\n);\n","import React, { useState, useEffect } from 'react';\n\nconst parseNumberOrNull = (v) => {\n if (v === '' || v === null || v === undefined) return null;\n const n = +v;\n return Number.isFinite(n) ? n : null;\n};\n\nconst CutoffsModal = ({ cutoffs, onApply, onClose }) => {\n const [exprMinTPM, setExprMinTPM] = useState(\n cutoffs && cutoffs.exprMinTPM != null ? String(cutoffs.exprMinTPM) : ''\n );\n const [diffMaxPval, setDiffMaxPval] = useState(\n cutoffs && cutoffs.diffMaxPval != null ? String(cutoffs.diffMaxPval) : ''\n );\n\n useEffect(() => {\n const onKey = (e) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n const apply = () => {\n onApply({\n exprMinTPM: parseNumberOrNull(exprMinTPM),\n diffMaxPval: parseNumberOrNull(diffMaxPval)\n });\n onClose();\n };\n\n return (\n <div className=\"exporter-modal-backdrop\" onClick={onClose}>\n <div className=\"exporter-modal\" onClick={e => e.stopPropagation()} role=\"dialog\" aria-modal=\"true\">\n <div className=\"exporter-modal-header\">\n <b>Expression cutoffs</b>\n <button type=\"button\" className=\"exporter-modal-close\" onClick={onClose} aria-label=\"Close\">×</button>\n </div>\n <div className=\"exporter-modal-body\">\n <div className=\"exporter-modal-field\">\n <label>\n Minimum TPM (gene expression)\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n value={exprMinTPM}\n onChange={e => setExprMinTPM(e.target.value)}\n placeholder=\"no minimum\"\n />\n </label>\n <small>Exclude expression rows with TPM below this value. Blank disables the cutoff.</small>\n </div>\n <div className=\"exporter-modal-field\">\n <label>\n Maximum p-value (differential expression)\n <input\n type=\"number\"\n step=\"0.001\"\n min=\"0\"\n max=\"1\"\n value={diffMaxPval}\n onChange={e => setDiffMaxPval(e.target.value)}\n placeholder=\"no maximum\"\n />\n </label>\n <small>Exclude diff-expression contrasts with p-value above this. Blank disables the cutoff.</small>\n </div>\n </div>\n <div className=\"exporter-modal-footer\">\n <button type=\"button\" className=\"btn btn-sm btn-link\" onClick={onClose}>Cancel</button>\n <button type=\"button\" className=\"btn btn-sm btn-primary\" onClick={apply}>Apply</button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CutoffsModal;\n","import React from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Modal, Button, ProgressBar } from 'react-bootstrap';\n\nconst ExportFooterCmp = props => {\n const {\n exporterSelectedFields,\n exporterFormat,\n exporterDownload: dl,\n doStartExporterDownload,\n doCancelExporterDownload,\n doResetExporterDownload\n } = props;\n\n const inFlight = dl.status === 'preparing' || dl.status === 'downloading';\n const pct = dl.total > 0\n ? Math.min(100, Math.round((dl.progress / dl.total) * 100))\n : 0;\n\n const canStart = !inFlight && exporterSelectedFields.length > 0;\n\n return (\n <>\n <div className=\"exporter-footer\">\n <div className=\"exporter-footer-summary\">\n <small>\n {exporterSelectedFields.length} field{exporterSelectedFields.length === 1 ? '' : 's'} selected\n · format: <b>{exporterFormat.toUpperCase()}</b>\n </small>\n </div>\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={!canStart}\n onClick={doStartExporterDownload}\n >\n Download {exporterFormat.toUpperCase()}\n </Button>\n </div>\n\n <Modal show={dl.status !== 'idle'} onHide={doResetExporterDownload} centered backdrop=\"static\">\n <Modal.Header closeButton={!inFlight}>\n <Modal.Title>\n {dl.status === 'preparing' && 'Preparing export…'}\n {dl.status === 'downloading' && 'Exporting…'}\n {dl.status === 'done' && 'Export complete'}\n {dl.status === 'cancelled' && 'Export cancelled'}\n {dl.status === 'error' && 'Export failed'}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {inFlight && (\n <>\n <ProgressBar\n now={pct}\n label={dl.total > 0 ? `${dl.progress.toLocaleString()} / ${dl.total.toLocaleString()}` : 'Counting…'}\n striped\n animated\n />\n <div style={{ marginTop: '0.5rem', fontSize: '0.85rem', color: '#666' }}>\n Fetching genes in pages of 1000. This may take a while for large result sets.\n </div>\n </>\n )}\n {dl.status === 'done' && (\n <div>\n Wrote <b>{dl.progress.toLocaleString()}</b> genes to disk.\n </div>\n )}\n {dl.status === 'cancelled' && (\n <div>\n Stopped at <b>{dl.progress.toLocaleString()}</b> / {dl.total.toLocaleString()} genes. No file was saved.\n </div>\n )}\n {dl.status === 'error' && (\n <div className=\"text-danger\">{dl.error}</div>\n )}\n </Modal.Body>\n <Modal.Footer>\n {inFlight ? (\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={doCancelExporterDownload}>\n Cancel\n </Button>\n ) : (\n <Button variant=\"secondary\" size=\"sm\" onClick={doResetExporterDownload}>\n Close\n </Button>\n )}\n </Modal.Footer>\n </Modal>\n </>\n );\n};\n\nexport default connect(\n 'selectExporterSelectedFields',\n 'selectExporterFormat',\n 'selectExporterDownload',\n 'doStartExporterDownload',\n 'doCancelExporterDownload',\n 'doResetExporterDownload',\n ExportFooterCmp\n);\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Tabs, Tab, Button, ToggleButton, ToggleButtonGroup } from 'react-bootstrap';\nimport FieldsModal from './FieldsModal';\nimport ExprTable, { buildFieldInfo } from './ExprTable';\nimport ParallelCoordsPlot from './ParallelCoordsPlot';\nimport HeatmapPlot from './HeatmapPlot';\nimport './styles.css';\n\nfunction speciesTaxonId(tid) {\n const n = +tid;\n return n > 1000000 ? Math.floor(n / 1000) : n;\n}\n\nfunction genomeName(grameneMaps, tid) {\n if (!grameneMaps) return tid;\n const direct = grameneMaps[tid];\n if (direct && direct.display_name) return direct.display_name;\n const sp = grameneMaps[speciesTaxonId(tid)];\n if (sp && sp.display_name) return sp.display_name;\n return tid;\n}\n\nconst ExprVizViewCmp = props => {\n const {\n exprVizPivot: pivot,\n exprViz,\n exprVizActiveTaxon: activeTaxon,\n grameneMaps,\n expressionStudies,\n expressionSamples,\n doSetExprVizActiveTaxon,\n doToggleExprVizFieldsModal,\n doFetchExprVizData\n } = props;\n\n const studiesFor = tid => {\n if (!expressionStudies) return [];\n return expressionStudies[tid] || expressionStudies[speciesTaxonId(tid)] || [];\n };\n\n const taxa = useMemo(() => {\n const ids = Object.keys(pivot.data || {});\n if (!grameneMaps) return ids;\n return ids.sort((a, b) => {\n const ma = grameneMaps[a] || grameneMaps[speciesTaxonId(a)];\n const mb = grameneMaps[b] || grameneMaps[speciesTaxonId(b)];\n return ((ma && ma.left_index) || 0) - ((mb && mb.left_index) || 0);\n });\n }, [pivot.data, grameneMaps]);\n\n useEffect(() => {\n if (taxa.length === 0) return;\n if (!activeTaxon || !taxa.includes(String(activeTaxon))) {\n doSetExprVizActiveTaxon(taxa[0]);\n }\n }, [taxa, activeTaxon, doSetExprVizActiveTaxon]);\n\n if (pivot.status === 'loading') {\n return <div className=\"exprviz-view\"><em>Loading studies…</em></div>;\n }\n if (pivot.status === 'error') {\n return <div className=\"exprviz-view\"><em>Error: {pivot.error}</em></div>;\n }\n if (taxa.length === 0) {\n return <div className=\"exprviz-view\"><em>No expression studies for current results.</em></div>;\n }\n\n return (\n <div className=\"exprviz-view\">\n <Tabs\n activeKey={activeTaxon || taxa[0]}\n onSelect={k => doSetExprVizActiveTaxon(k)}\n className=\"exprviz-tabs\"\n >\n {taxa.map(tid => {\n const studies = studiesFor(tid);\n const taxName = genomeName(grameneMaps, tid);\n const geneCount = pivot.data[tid] || 0;\n return (\n <Tab\n key={tid}\n eventKey={tid}\n title={`${taxName} (${studies.length} studies · ${geneCount} genes)`}\n >\n <TaxonPanel\n taxon={tid}\n studies={studies}\n expressionSamples={expressionSamples}\n tabState={exprViz.byTaxon[tid]}\n onOpenFields={() => doToggleExprVizFieldsModal(tid, true)}\n onLoad={() => doFetchExprVizData(tid)}\n onReorder={(next) => props.doReorderExprVizFields(tid, next)}\n onAddRangeQuery={props.doAddGrameneRangeQuery}\n />\n </Tab>\n );\n })}\n </Tabs>\n <FieldsModal/>\n </div>\n );\n};\n\n// Compact axis labels for the parallel-coords plot. The raw Solr field name\n// (e.g. \"E_CURD_148_g5__expr\") is uninformative; we prefer the assay's\n// factor labels, falling back to \"organism part\" then to the group id.\n// `full` is exposed via an SVG <title> so the user can hover to see study,\n// group, and every factor/characteristic.\nconst AXIS_LABEL_MAX = 22;\n\nfunction truncateLabel(s, n) {\n if (!s) return '';\n return s.length > n ? s.slice(0, n - 1) + '…' : s;\n}\n\nfunction compactAssayLabel(assay, group) {\n if (!assay) return group || '';\n const factorVals = (assay.factor || []).map(f => f && f.label).filter(Boolean);\n if (factorVals.length) return factorVals.join('; ');\n const chars = assay.characteristic || [];\n const organ = chars.find(c => c && c.type === 'organism part');\n if (organ && organ.label) return organ.label;\n const firstChar = chars.find(c => c && c.label);\n if (firstChar) return firstChar.label;\n return group || '';\n}\n\nfunction assayPairs(list) {\n return (list || [])\n .filter(x => x && x.label)\n .map(x => ({ name: x.type || '', value: x.label }));\n}\n\nfunction buildAxisLabels(fields, studies, expressionSamples) {\n const labels = {};\n if (!fields) return labels;\n const studyById = {};\n (studies || []).forEach(s => { if (s && s._id) studyById[s._id] = s; });\n const findAssay = (studyId, group) => {\n const arr = expressionSamples && expressionSamples[studyId];\n return arr ? arr.find(a => a.group === group) : null;\n };\n for (const f of fields) {\n const m = f.match(/^(.+?)_g(\\d+)__expr$/);\n if (!m) {\n labels[f] = {\n short: truncateLabel(f.replace(/__expr$/, ''), AXIS_LABEL_MAX),\n structured: { studyTitle: f, group: '', factors: [], characteristics: [] }\n };\n continue;\n }\n const expId = m[1].replace(/_/g, '-');\n const group = 'g' + m[2];\n const assay = findAssay(expId, group);\n const study = studyById[expId];\n const studyName = (study && study.description) || expId;\n labels[f] = {\n short: truncateLabel(compactAssayLabel(assay, group), AXIS_LABEL_MAX),\n structured: {\n studyTitle: studyName,\n group,\n factors: assayPairs(assay && assay.factor),\n characteristics: assayPairs(assay && assay.characteristic)\n }\n };\n }\n return labels;\n}\n\nfunction rowMatchesSelections(row, selections) {\n for (const f of Object.keys(selections)) {\n const v = row[f];\n if (v == null || Array.isArray(v)) return false;\n const n = +v;\n if (!Number.isFinite(n)) return false;\n const [lo, hi] = selections[f];\n if (n < lo || n > hi) return false;\n }\n return true;\n}\n\nfunction fmt(n) {\n if (!Number.isFinite(n)) return String(n);\n const a = Math.abs(n);\n if (a !== 0 && (a < 0.001 || a >= 1e6)) return n.toExponential(3);\n return Number(n.toFixed(4)).toString();\n}\n\nfunction tsvCell(v) {\n if (v == null) return '';\n if (Array.isArray(v)) return v.join(',');\n const s = typeof v === 'object' ? JSON.stringify(v) : String(v);\n return s.replace(/[\\t\\r\\n]+/g, ' ');\n}\n\n// Mirror the on-screen table header in the TSV: one row per metadata level\n// the table is showing (Study, then one row per distinct factor type, then\n// one row per distinct characteristic type), followed by the leaf header\n// (Gene ID / Name / per-sample group). The first two columns are repurposed\n// to carry the row category and the row's specific name, matching the\n// pinned-column labels in ExprTable.\nfunction downloadTsv(filename, rows, fields, studies, expressionSamples) {\n const cols = ['id', 'name', ...fields];\n const fieldInfo = buildFieldInfo(fields, studies, expressionSamples);\n\n const factorTypes = new Set();\n const charTypes = new Set();\n for (const f of fields) {\n const info = fieldInfo[f];\n if (!info) continue;\n Object.keys(info.factors || {}).forEach(t => factorTypes.add(t));\n Object.keys(info.characteristics || {}).forEach(t => charTypes.add(t));\n }\n const factorTypeList = Array.from(factorTypes).sort();\n const charTypeList = Array.from(charTypes).sort();\n\n const metaRow = (cat, label, getValue) => {\n const cells = [cat, label];\n for (const f of fields) cells.push(tsvCell(getValue(fieldInfo[f] || {})));\n return cells.join('\\t');\n };\n\n const lines = [];\n lines.push(metaRow('Study', 'Title', info => info.studyDescription || ''));\n for (const t of factorTypeList) {\n lines.push(metaRow('Factor', t, info => (info.factors && info.factors[t]) || ''));\n }\n for (const t of charTypeList) {\n lines.push(metaRow('Characteristic', t, info => (info.characteristics && info.characteristics[t]) || ''));\n }\n // Leaf header — column ids for the data rows.\n lines.push(['Gene ID', 'Name', ...fields.map(f => {\n const info = fieldInfo[f];\n return (info && info.group) || f.replace(/__expr$/, '');\n })].join('\\t'));\n\n for (const r of rows) lines.push(cols.map(c => tsvCell(r[c])).join('\\t'));\n\n const blob = new Blob([lines.join('\\n') + '\\n'], { type: 'text/tab-separated-values' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\nconst TaxonPanel = ({ taxon, studies, expressionSamples, tabState, onOpenFields, onLoad, onReorder, onAddRangeQuery }) => {\n const selected = (tabState && tabState.selectedFields) || [];\n const rows = (tabState && tabState.rows) || [];\n const fetchInfo = (tabState && tabState.fetch) || { status: 'idle', total: 0 };\n const [scale, setScale] = useState('linear');\n const [vizMode, setVizMode] = useState('heatmap'); // 'parallel' | 'heatmap'\n const [selections, setSelections] = useState({});\n const [clearVersion, setClearVersion] = useState(0);\n const [hoveredId, setHoveredId] = useState(null);\n const [plotHeight, setPlotHeight] = useState(320);\n // Mirror of the table's currently displayed (post-sort, post-filter) rows.\n // When the user clicks a column header to sort, ag-grid resorts and emits\n // modelUpdated; we capture that order here so the heatmap below renders\n // in the same order. Null until the table has emitted at least once.\n const [tableOrder, setTableOrder] = useState(null);\n const resizeStateRef = useRef(null);\n\n // Drag the horizontal separator between the plot and the table to retune\n // their relative sizes. Bounded so neither pane disappears entirely.\n const startResize = (e) => {\n e.preventDefault();\n resizeStateRef.current = { startY: e.clientY, startHeight: plotHeight };\n const onMove = (ev) => {\n const s = resizeStateRef.current;\n if (!s) return;\n const next = Math.max(120, Math.min(1200, s.startHeight + (ev.clientY - s.startY)));\n setPlotHeight(next);\n };\n const onUp = () => {\n resizeStateRef.current = null;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n document.body.style.cursor = 'row-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n };\n\n const hasBrush = Object.keys(selections).length > 0;\n const filteredRows = useMemo(() => {\n if (!hasBrush) return rows;\n return rows.filter(r => rowMatchesSelections(r, selections));\n }, [rows, selections, hasBrush]);\n\n // Drop fields with no numeric data in the loaded rows so empty axes/columns\n // don't clutter the visualization. Selected-but-empty fields stay in the\n // underlying selection so a future load can repopulate them.\n const visibleFields = useMemo(() => {\n if (rows.length === 0 || selected.length === 0) return selected;\n return selected.filter(f => rows.some(r => {\n const v = r[f];\n return v != null && !Array.isArray(v) && Number.isFinite(+v);\n }));\n }, [rows, selected]);\n\n const handleReorder = onReorder\n ? (newVisibleOrder) => {\n const visibleSet = new Set(newVisibleOrder);\n const hidden = selected.filter(f => !visibleSet.has(f));\n onReorder([...newVisibleOrder, ...hidden]);\n }\n : undefined;\n\n const axisLabels = useMemo(\n () => buildAxisLabels(visibleFields, studies, expressionSamples),\n [visibleFields, studies, expressionSamples]\n );\n\n const fieldInfo = useMemo(\n () => buildFieldInfo(visibleFields, studies, expressionSamples),\n [visibleFields, studies, expressionSamples]\n );\n\n useEffect(() => {\n if (rows.length === 0 && hasBrush) {\n setSelections({});\n setClearVersion(v => v + 1);\n }\n }, [rows.length, hasBrush]);\n\n return (\n <div className=\"exprviz-tab-panel\">\n <div className=\"exprviz-toolbar\">\n <Button size=\"sm\" onClick={onOpenFields}>\n Select fields ({selected.length} selected, {studies.length} studies)\n </Button>\n <Button\n size=\"sm\"\n variant=\"primary\"\n disabled={selected.length === 0 || fetchInfo.status === 'loading'}\n onClick={onLoad}\n >\n {fetchInfo.status === 'loading' ? 'Loading…' : 'Load data'}\n </Button>\n <ToggleButtonGroup\n type=\"radio\"\n name={`exprviz-viz-${taxon}`}\n size=\"sm\"\n value={vizMode}\n onChange={setVizMode}\n >\n <ToggleButton id={`exprviz-viz-${taxon}-hm`} value=\"heatmap\" variant=\"outline-secondary\" title=\"Heatmap: cell color encodes expression level; hover for sample metadata\">Heatmap</ToggleButton>\n <ToggleButton id={`exprviz-viz-${taxon}-pc`} value=\"parallel\" variant=\"outline-secondary\" title=\"Parallel coordinates: one polyline per gene with brushable axes\">Parallel</ToggleButton>\n </ToggleButtonGroup>\n {vizMode === 'parallel' && (\n <>\n <ToggleButtonGroup\n type=\"radio\"\n name={`exprviz-scale-${taxon}`}\n size=\"sm\"\n value={scale}\n onChange={setScale}\n >\n <ToggleButton id={`exprviz-scale-${taxon}-lin`} value=\"linear\" variant=\"outline-secondary\">Linear</ToggleButton>\n <ToggleButton id={`exprviz-scale-${taxon}-log`} value=\"log\" variant=\"outline-secondary\">Log</ToggleButton>\n </ToggleButtonGroup>\n <Button\n size=\"sm\"\n variant=\"outline-secondary\"\n disabled={!hasBrush}\n onClick={() => { setClearVersion(v => v + 1); setSelections({}); }}\n >\n Clear brushes\n </Button>\n <Button\n size=\"sm\"\n variant=\"success\"\n disabled={!hasBrush || !onAddRangeQuery}\n onClick={() => {\n const terms = Object.keys(selections).map(field => {\n const [lo, hi] = selections[field];\n return {\n category: 'Expression',\n name: `${field}: ${fmt(lo)}–${fmt(hi)}`,\n fq_field: field,\n fq_value: `[${lo} TO ${hi}]`\n };\n });\n onAddRangeQuery(terms);\n }}\n title=\"Add brush ranges as an AND-conjunction filter on the search\"\n >\n Apply as filter\n </Button>\n </>\n )}\n <Button\n size=\"sm\"\n variant=\"outline-secondary\"\n disabled={filteredRows.length === 0 || visibleFields.length === 0}\n onClick={() => downloadTsv(`expression_${taxon}.tsv`, filteredRows, visibleFields, studies, expressionSamples)}\n title=\"Download the visible rows and columns as tab-delimited text\"\n >\n Download TSV\n </Button>\n <span className=\"exprviz-status\">\n {hasBrush ? `${filteredRows.length} of ${rows.length}` : rows.length}\n {fetchInfo.total ? ` / ${fetchInfo.total}` : ''} genes\n {hasBrush ? ' (brushed)' : ' loaded'}\n </span>\n </div>\n <div className=\"exprviz-body\">\n <div className=\"exprviz-plot\" style={{ height: plotHeight }}>\n {vizMode === 'heatmap' ? (\n <HeatmapPlot\n rows={tableOrder || filteredRows}\n fields={visibleFields}\n scale={scale}\n axisLabels={axisLabels}\n fieldInfo={fieldInfo}\n hoveredId={hoveredId}\n onHoverRow={setHoveredId}\n />\n ) : (\n <ParallelCoordsPlot\n rows={rows}\n fields={visibleFields}\n scale={scale}\n onBrushChange={setSelections}\n onReorder={handleReorder}\n clearVersion={clearVersion}\n hoveredId={hoveredId}\n axisLabels={axisLabels}\n />\n )}\n </div>\n <div\n className=\"exprviz-resizer\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-label=\"Resize plot\"\n onMouseDown={startResize}\n title=\"Drag to resize\"\n />\n <div className=\"exprviz-table\">\n <ExprTable\n rows={filteredRows}\n fields={visibleFields}\n onReorder={handleReorder}\n studies={studies}\n expressionSamples={expressionSamples}\n onHoverRow={setHoveredId}\n onDisplayedOrderChange={setTableOrder}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectExprViz',\n 'selectExprVizPivot',\n 'selectExprVizActiveTaxon',\n 'selectGrameneMaps',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'doSetExprVizActiveTaxon',\n 'doToggleExprVizFieldsModal',\n 'doFetchExprVizData',\n 'doReorderExprVizFields',\n 'doAddGrameneRangeQuery',\n ExprVizViewCmp\n);\n","import React, { useState, useMemo, useEffect } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Modal, Button, ToggleButton, ToggleButtonGroup } from 'react-bootstrap';\n\nfunction speciesTaxonId(tid) {\n const n = +tid;\n return n > 1000000 ? Math.floor(n / 1000) : n;\n}\n\nconst EXPERIMENT_KEYS = [\n { key: 'exp:study', label: 'Study' },\n { key: 'exp:type', label: 'Study type' },\n { key: 'exp:organism', label: 'Organism' }\n];\n\n// One record per expression field (one sample group within one study).\n// `props` is a flat map of property-key → value used for filtering and display.\nfunction buildFieldRecords(taxon, studyIds, expressionStudies, expressionSamples, fieldCatalog, grameneMaps) {\n const records = [];\n const factorTypes = new Set();\n const charTypes = new Set();\n if (!expressionSamples || !expressionStudies) return { records, factorTypes: [], charTypes: [] };\n\n const studyById = {};\n const list = expressionStudies[taxon] || expressionStudies[speciesTaxonId(taxon)] || [];\n list.forEach(s => { studyById[s._id] = s; });\n\n for (const studyId of studyIds) {\n const study = studyById[studyId];\n if (!study) continue;\n const samples = expressionSamples[studyId];\n if (!samples) continue;\n\n const byGroup = {};\n for (const s of samples) if (!byGroup[s.group]) byGroup[s.group] = s;\n\n for (const group of Object.keys(byGroup)) {\n const sample = byGroup[group];\n const fieldName = `${studyId.replace(/-/g, '_')}_${group}__expr`;\n if (fieldCatalog && fieldCatalog.fields && !fieldCatalog.fields[fieldName]) continue;\n\n const props = {};\n props['exp:study'] = study.description || studyId;\n props['exp:type'] = study.type || '(unknown)';\n const taxon_id = study.taxon_id;\n const taxName = grameneMaps && (grameneMaps[taxon_id] || grameneMaps[speciesTaxonId(taxon_id)]);\n props['exp:organism'] = (taxName && taxName.display_name) || String(taxon_id);\n\n const usedFactorTypes = new Set();\n (sample.factor || []).forEach(f => {\n props[`fac:${f.type}`] = f.label;\n factorTypes.add(f.type);\n usedFactorTypes.add(f.type);\n });\n (sample.characteristic || []).forEach(c => {\n if (usedFactorTypes.has(c.type)) return; // factor takes precedence\n props[`char:${c.type}`] = c.label;\n charTypes.add(c.type);\n });\n\n records.push({ fieldName, studyId, group, props });\n }\n }\n return {\n records,\n factorTypes: Array.from(factorTypes).sort(),\n charTypes: Array.from(charTypes).sort()\n };\n}\n\nfunction fieldMatches(field, selections, excludeKey) {\n for (const key of Object.keys(selections)) {\n if (key === excludeKey) continue;\n const values = selections[key];\n if (!values || values.size === 0) continue;\n const v = field.props[key];\n if (v == null || !values.has(v)) return false;\n }\n return true;\n}\n\nfunction valueCounts(records, key, selections) {\n const counts = new Map();\n for (const f of records) {\n if (!fieldMatches(f, selections, key)) continue;\n const v = f.props[key];\n if (v == null) continue;\n counts.set(v, (counts.get(v) || 0) + 1);\n }\n return counts;\n}\n\nfunction labelForKey(key, tree) {\n for (const grp of tree) {\n for (const t of grp.types) if (t.key === key) return t.label;\n }\n return key;\n}\n\nconst FieldsModalCmp = props => {\n const {\n fieldCatalog,\n exprViz,\n expressionStudies,\n expressionSamples,\n grameneMaps,\n doToggleExprVizFieldsModal,\n doSetExprVizFields,\n doFetchExprVizFieldExistence\n } = props;\n\n const taxon = Object.keys(exprViz.byTaxon).find(t => exprViz.byTaxon[t].fieldsModalOpen);\n const open = !!taxon;\n const availableAttrs = taxon && exprViz.byTaxon[taxon] && exprViz.byTaxon[taxon].availableAttrs;\n\n const studyIds = useMemo(() => {\n if (!taxon || !expressionStudies) return [];\n const list = expressionStudies[taxon] || expressionStudies[speciesTaxonId(taxon)] || [];\n let ids = list.map(s => s._id);\n if (availableAttrs) {\n const allow = new Set(availableAttrs);\n ids = ids.filter(id => allow.has(id));\n }\n return ids;\n }, [taxon, expressionStudies, availableAttrs]);\n\n const allRecords = useMemo(\n () => buildFieldRecords(taxon, studyIds, expressionStudies, expressionSamples, fieldCatalog, grameneMaps),\n [taxon, studyIds, expressionStudies, expressionSamples, fieldCatalog, grameneMaps]\n );\n\n const candidateFields = useMemo(\n () => allRecords.records.map(r => r.fieldName),\n [allRecords]\n );\n\n // Trigger the field-existence facet check whenever the modal is open and\n // the candidate field list is known. The bundle caches per (q, taxon, fields).\n useEffect(() => {\n if (open && taxon && candidateFields.length > 0) {\n doFetchExprVizFieldExistence(taxon, candidateFields);\n }\n }, [open, taxon, candidateFields, doFetchExprVizFieldExistence]);\n\n const fieldExistence = taxon && exprViz.byTaxon[taxon] && exprViz.byTaxon[taxon].fieldExistence;\n const existenceStatus = taxon && exprViz.byTaxon[taxon] && exprViz.byTaxon[taxon].existenceStatus;\n\n // Once existence counts are loaded, drop fields with no data in the current\n // result set. Until then, render with the full candidate set so the modal\n // doesn't flash empty during the precheck.\n const { records, factorTypes, charTypes } = useMemo(() => {\n if (!fieldExistence) return allRecords;\n const live = new Set(Object.keys(fieldExistence).filter(f => fieldExistence[f] > 0));\n const filtered = allRecords.records.filter(r => live.has(r.fieldName));\n const factorTypes = new Set();\n const charTypes = new Set();\n for (const r of filtered) {\n for (const k of Object.keys(r.props)) {\n if (k.startsWith('fac:')) factorTypes.add(k.slice(4));\n else if (k.startsWith('char:')) charTypes.add(k.slice(5));\n }\n }\n return {\n records: filtered,\n factorTypes: Array.from(factorTypes).sort(),\n charTypes: Array.from(charTypes).sort()\n };\n }, [allRecords, fieldExistence]);\n\n const propTree = useMemo(() => [\n { group: 'experiment', label: 'Experiment', types: EXPERIMENT_KEYS },\n { group: 'factors', label: 'Factors', types: factorTypes.map(t => ({ key: `fac:${t}`, label: t })) },\n { group: 'characteristics', label: 'Characteristics', types: charTypes.map(t => ({ key: `char:${t}`, label: t })) }\n ], [factorTypes, charTypes]);\n\n const [selections, setSelections] = useState({});\n const [expandedKey, setExpandedKey] = useState(null);\n const [collapsedGroups, setCollapsedGroups] = useState({});\n const [valueSort, setValueSort] = useState('count');\n const [orderedSelectedKeys, setOrderedSelectedKeys] = useState([]);\n const [searchQuery, setSearchQuery] = useState('');\n const searchLc = searchQuery.trim().toLowerCase();\n const isSearching = searchLc.length > 0;\n\n // Distinct values per property type, ignoring the type's own selection but\n // applying every other selected type. Counts shown next to a property type\n // reflect \"how many distinct values exist among the fields currently\n // matching the rest of the filter.\"\n const valueSetByKey = useMemo(() => {\n const allKeys = new Set();\n for (const r of records) for (const k of Object.keys(r.props)) allKeys.add(k);\n const m = {};\n for (const key of allKeys) {\n const set = new Set();\n for (const r of records) {\n if (!fieldMatches(r, selections, key)) continue;\n const v = r.props[key];\n if (v != null) set.add(v);\n }\n m[key] = set;\n }\n return m;\n }, [records, selections]);\n\n // Distinct values per property type across the unfiltered candidate set.\n // A type with a single value across every record can't discriminate (e.g.\n // \"Organism\" when every field belongs to the same species), so we hide it\n // from the property tree.\n const totalValueCountByKey = useMemo(() => {\n const m = {};\n for (const r of records) {\n for (const [k, v] of Object.entries(r.props)) {\n if (v == null) continue;\n if (!m[k]) m[k] = new Set();\n m[k].add(v);\n }\n }\n return m;\n }, [records]);\n\n // Reset state when modal (re)opens for a taxon.\n useEffect(() => {\n if (open && taxon) {\n setSelections({});\n setExpandedKey(null);\n setCollapsedGroups({});\n setOrderedSelectedKeys([]);\n setSearchQuery('');\n }\n }, [open, taxon]);\n\n // Keep orderedSelectedKeys in sync with selections (preserves the order in\n // which the user first selected each property type).\n useEffect(() => {\n setOrderedSelectedKeys(prev => {\n const active = Object.keys(selections);\n const activeSet = new Set(active);\n const kept = prev.filter(k => activeSet.has(k));\n const newOnes = active.filter(k => !prev.includes(k));\n return [...kept, ...newOnes];\n });\n }, [selections]);\n\n const matchingFields = useMemo(\n () => records.filter(r => fieldMatches(r, selections, null)),\n [records, selections]\n );\n\n if (!open) return null;\n\n const toggleValue = (key, value) => {\n setSelections(prev => {\n const next = { ...prev };\n const set = new Set(next[key] || []);\n if (set.has(value)) set.delete(value); else set.add(value);\n if (set.size === 0) delete next[key]; else next[key] = set;\n return next;\n });\n };\n\n const clearTypeSelection = (key) => {\n setSelections(prev => {\n if (!prev[key]) return prev;\n const next = { ...prev };\n delete next[key];\n return next;\n });\n };\n\n const toggleGroup = (g) => setCollapsedGroups(prev => ({ ...prev, [g]: !prev[g] }));\n\n const renderValues = (key, typeLabelMatches) => {\n const counts = valueCounts(records, key, selections);\n let entries = Array.from(counts.entries());\n if (isSearching && !typeLabelMatches) {\n entries = entries.filter(([v]) => String(v).toLowerCase().includes(searchLc));\n }\n if (valueSort === 'name') entries.sort((a, b) => String(a[0]).localeCompare(String(b[0])));\n else entries.sort((a, b) => b[1] - a[1] || String(a[0]).localeCompare(String(b[0])));\n const sel = selections[key] || new Set();\n\n return (\n <div className=\"exprviz-tree-values\">\n <div className=\"exprviz-values-toolbar\">\n <ToggleButtonGroup\n type=\"radio\"\n name={`exprviz-vsort-${key}`}\n size=\"sm\"\n value={valueSort}\n onChange={setValueSort}\n >\n <ToggleButton id={`exprviz-vsort-name-${key}`} value=\"name\" variant=\"outline-secondary\">Name</ToggleButton>\n <ToggleButton id={`exprviz-vsort-count-${key}`} value=\"count\" variant=\"outline-secondary\">Count</ToggleButton>\n </ToggleButtonGroup>\n {sel.size > 0 && (\n <Button size=\"sm\" variant=\"link\" onClick={() => clearTypeSelection(key)}>clear</Button>\n )}\n </div>\n {entries.map(([v, c]) => (\n <label key={v} className=\"exprviz-tree-value\">\n <input type=\"checkbox\" checked={sel.has(v)} onChange={() => toggleValue(key, v)} />\n <span className=\"exprviz-tree-value-label\" title={v}>{v}</span>\n <span className=\"exprviz-tree-value-count\">{c}</span>\n </label>\n ))}\n {entries.length === 0 && <em className=\"exprviz-tree-empty\">No values</em>}\n </div>\n );\n };\n\n return (\n <Modal show={open} onHide={() => doToggleExprVizFieldsModal(taxon, false)} size=\"xl\" scrollable>\n <Modal.Header closeButton>\n <Modal.Title>\n Filter expression fields ({matchingFields.length} of {records.length} match)\n {existenceStatus === 'loading' && (\n <span className=\"exprviz-modal-loading\"> · checking field availability…</span>\n )}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"exprviz-fields-layout\">\n <div className=\"exprviz-tree\">\n <input\n type=\"text\"\n className=\"exprviz-tree-search\"\n placeholder=\"Search property types and values…\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n />\n {propTree.map(grp => {\n const typeRows = grp.types.map(t => {\n // Hide property types that can't discriminate among the\n // candidates: zero values, or a single value shared by every\n // record. The selection-aware count (valueSetByKey) is what\n // we display; the unfiltered count gates visibility so a type\n // doesn't pop in/out as the user clicks values.\n const totalDistinct = (totalValueCountByKey[t.key] && totalValueCountByKey[t.key].size) || 0;\n if (totalDistinct < 2) return null;\n const numValues = (valueSetByKey[t.key] && valueSetByKey[t.key].size) || 0;\n if (numValues === 0) return null;\n const typeLabelMatches = isSearching && t.label.toLowerCase().includes(searchLc);\n let matchingValueCount = numValues;\n if (isSearching && !typeLabelMatches) {\n const vset = valueSetByKey[t.key] || new Set();\n matchingValueCount = 0;\n for (const v of vset) if (String(v).toLowerCase().includes(searchLc)) matchingValueCount++;\n if (matchingValueCount === 0) return null;\n }\n const sel = selections[t.key];\n const selCount = sel ? sel.size : 0;\n const isExpanded = isSearching ? !typeLabelMatches : (expandedKey === t.key);\n return (\n <div key={t.key} className={`exprviz-tree-type${selCount > 0 ? ' is-active' : ''}`}>\n <div\n className=\"exprviz-tree-type-header\"\n onClick={() => setExpandedKey(isExpanded ? null : t.key)}\n >\n <span className=\"exprviz-tree-caret\">{isExpanded ? '▾' : '▸'}</span>\n <span className=\"exprviz-tree-type-label\">{t.label}</span>\n <span className=\"exprviz-tree-type-count\">\n {selCount > 0 ? `${selCount}/${numValues}` : numValues}\n </span>\n </div>\n {isExpanded && renderValues(t.key, typeLabelMatches)}\n </div>\n );\n }).filter(Boolean);\n if (isSearching && typeRows.length === 0) return null;\n const groupCollapsed = !isSearching && collapsedGroups[grp.group];\n return (\n <div key={grp.group} className=\"exprviz-tree-group\">\n <div className=\"exprviz-tree-group-header\" onClick={() => toggleGroup(grp.group)}>\n <span className=\"exprviz-tree-caret\">{groupCollapsed ? '▶' : '▼'}</span>\n <strong>{grp.label}</strong>\n </div>\n {!groupCollapsed && grp.types.length === 0 && (\n <div className=\"exprviz-tree-empty\"><em>(none)</em></div>\n )}\n {!groupCollapsed && typeRows}\n </div>\n );\n })}\n </div>\n <div className=\"exprviz-fields-preview\">\n {orderedSelectedKeys.length === 0 ? (\n <div className=\"exprviz-fields-placeholder\">\n <em>Select a property type to preview the property values for each matching field.</em>\n </div>\n ) : (\n <table className=\"exprviz-fields-table\">\n <thead>\n <tr>\n {orderedSelectedKeys.map(k => <th key={k}>{labelForKey(k, propTree)}</th>)}\n </tr>\n </thead>\n <tbody>\n {matchingFields.map(f => (\n <tr key={f.fieldName} title={f.fieldName}>\n {orderedSelectedKeys.map(k => <td key={k}>{f.props[k] || ''}</td>)}\n </tr>\n ))}\n {matchingFields.length === 0 && (\n <tr><td colSpan={orderedSelectedKeys.length}><em>No matching fields</em></td></tr>\n )}\n </tbody>\n </table>\n )}\n </div>\n </div>\n </Modal.Body>\n <Modal.Footer>\n <Button variant=\"secondary\" onClick={() => doToggleExprVizFieldsModal(taxon, false)}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n disabled={matchingFields.length === 0}\n onClick={() => {\n doSetExprVizFields(taxon, matchingFields.map(f => f.fieldName));\n doToggleExprVizFieldsModal(taxon, false);\n }}\n >\n Apply ({matchingFields.length} fields)\n </Button>\n </Modal.Footer>\n </Modal>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectExprViz',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'selectGrameneMaps',\n 'doToggleExprVizFieldsModal',\n 'doSetExprVizFields',\n 'doFetchExprVizFieldExistence',\n FieldsModalCmp\n);\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { AgGridReact } from 'ag-grid-react';\nimport 'ag-grid-community/styles/ag-grid.css';\nimport 'ag-grid-community/styles/ag-theme-quartz.css';\n\nconst baseColDefs = [\n { field: 'id', headerName: 'Gene ID', pinned: 'left', width: 160, suppressMovable: true },\n { field: 'name', headerName: 'Name', pinned: 'left', width: 140, suppressMovable: true }\n];\n\n// Hoisted so the reference is stable across renders. ag-grid otherwise sees a\n// \"new\" defaultColDef on every parent re-render (e.g. when hovering a row\n// triggers setHoveredId in the parent) and re-applies column state, which\n// snaps any user-resized columns back to their original widths.\nconst DEFAULT_COL_DEF = {\n resizable: true,\n sortable: true,\n filter: false,\n suppressMenu: true,\n // Click cycle: input order → descending → ascending → input order. The\n // ag-grid default is asc → desc → null; for expression data the\n // top-of-column user usually wants is \"highest first,\" so we hit that on\n // the first click.\n sortingOrder: ['desc', 'asc', null]\n};\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\nexport function buildFieldInfo(fields, studies, expressionSamples) {\n const info = {};\n if (!fields || !studies || !expressionSamples) return info;\n const wanted = new Set(fields);\n for (const study of studies) {\n const studyId = study._id;\n const samples = expressionSamples[studyId];\n if (!samples) continue;\n const byGroup = {};\n for (const s of samples) if (!byGroup[s.group]) byGroup[s.group] = s;\n for (const group of Object.keys(byGroup)) {\n const fieldName = `${studyId.replace(/-/g, '_')}_${group}__expr`;\n if (!wanted.has(fieldName)) continue;\n const sample = byGroup[group];\n const factors = {};\n (sample.factor || []).forEach(f => { factors[f.type] = f.label; });\n const characteristics = {};\n (sample.characteristic || []).forEach(c => {\n if (factors[c.type] != null) return;\n characteristics[c.type] = c.label;\n });\n info[fieldName] = {\n studyId,\n studyDescription: study.description || studyId,\n group,\n replicates: samples.filter(s => s.group === group).length,\n factors,\n characteristics\n };\n }\n }\n return info;\n}\n\n// Plain right-aligned label cell for the metadata header rows above the\n// Gene ID / Name columns. Rendered as a React component (instead of\n// relying on ag-grid's default group label) so the alignment is controlled\n// by our own DOM and isn't fighting the quartz theme's CSS.\nconst LabelHeaderGroup = (props) => {\n const { displayName } = props;\n return <div className=\"exprviz-label-header\">{displayName}</div>;\n};\n\n// Same idea, but for the cells that toggle a section between expanded and\n// collapsed. The caret + label sit at the right edge.\nconst ToggleHeaderGroup = (props) => {\n const { displayName, onToggle, expanded, suffix } = props;\n return (\n <div\n className=\"exprviz-toggle-header\"\n onClick={onToggle}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onToggle && onToggle(); } }}\n title={expanded ? 'Click to collapse' : 'Click to expand'}\n >\n <span className=\"exprviz-toggle-caret\">{expanded ? '▼' : '▶'}</span>\n {' '}{displayName}{suffix ? ` ${suffix}` : ''}\n </div>\n );\n};\n\nfunction exprValueFormatter(p) {\n const v = p.value;\n if (v == null) return '';\n if (Array.isArray(v)) return v.join(', ');\n if (typeof v === 'object') return JSON.stringify(v);\n return String(v);\n}\n\n// Discover every distinct factor and characteristic type across the loaded\n// fields. Each becomes one header row (with adjacent equal-value cells\n// merged). Order is alphabetical for stability across reloads.\nfunction collectMetadataTypes(fields, fieldInfo) {\n const factorTypes = new Set();\n const charTypes = new Set();\n for (const f of fields || []) {\n const info = fieldInfo[f];\n if (!info) continue;\n Object.keys(info.factors || {}).forEach(t => factorTypes.add(t));\n Object.keys(info.characteristics || {}).forEach(t => charTypes.add(t));\n }\n return {\n factorTypes: Array.from(factorTypes).sort(),\n charTypes: Array.from(charTypes).sort()\n };\n}\n\n// Wrap a leaf column in N nested column groups so it participates at every\n// header row, with a custom label per level. Lets the Gene ID / Name columns\n// carry the row labels (\"Study\"/\"Factor\"/\"Characteristic\" and the type name).\nfunction wrapLeafWithLabels(leaf, labels) {\n let wrapped = leaf;\n for (let i = labels.length - 1; i >= 0; i--) {\n const label = labels[i];\n const cls = label.headerClass\n ? `${label.headerClass} exprviz-hg-labels`\n : 'exprviz-hg-labels';\n wrapped = {\n headerName: label.headerName,\n headerClass: cls,\n // Always render through one of our components so the alignment and\n // spacing are controlled by our own DOM, not ag-grid's defaults.\n headerGroupComponent: label.headerGroupComponent || LabelHeaderGroup,\n headerGroupComponentParams: label.headerGroupComponentParams,\n children: [wrapped]\n };\n }\n return wrapped;\n}\n\n// Build the column tree:\n// row 1 — Study | Title | <study description>…\n// row 2..(2+F-1) — Factor | <factor type> | <value or blank>…\n// row 2+F..end-1 — Characteristic | <char type> | <value or blank>…\n// leaf row — Gene ID | Name | g3, g4, …\n// Adjacent expression cells sharing the same value at a given level merge\n// (because they're children of one group definition). Blank values for a\n// type that's defined only in other studies render as empty cells, and\n// adjacent blanks under the same parent merge automatically.\nfunction buildColumnDefs(fields, fieldInfo, expanded, toggles) {\n if (!fields || fields.length === 0) return baseColDefs;\n const { factorTypes, charTypes } = collectMetadataTypes(fields, fieldInfo);\n\n const levels = [{ kind: 'study', getValue: (info) => (info && info.studyDescription) || '' }];\n if (expanded.factors) {\n for (const t of factorTypes) {\n levels.push({\n kind: 'factor', type: t,\n getValue: (info) => (info && info.factors && info.factors[t]) || '',\n headerClass: 'exprviz-hg-factors'\n });\n }\n } else if (factorTypes.length > 0) {\n // One placeholder level standing in for the collapsed factor rows.\n levels.push({\n kind: 'factors-collapsed',\n getValue: () => '',\n headerClass: 'exprviz-hg-factors exprviz-hg-collapsed'\n });\n }\n if (expanded.chars) {\n for (const t of charTypes) {\n levels.push({\n kind: 'char', type: t,\n getValue: (info) => (info && info.characteristics && info.characteristics[t]) || '',\n headerClass: 'exprviz-hg-chars'\n });\n }\n } else if (charTypes.length > 0) {\n levels.push({\n kind: 'chars-collapsed',\n getValue: () => '',\n headerClass: 'exprviz-hg-chars exprviz-hg-collapsed'\n });\n }\n\n // Walk fields, opening a new group at level i (and resetting all levels\n // below) the first time the value at level i differs from the previous\n // field's. Same value → same parent group → ag-grid merges the cells.\n const exprTopGroups = [];\n const currentGroups = new Array(levels.length).fill(null);\n const currentKeys = new Array(levels.length).fill(undefined);\n\n for (const f of fields) {\n const info = fieldInfo[f] || {};\n let firstChange = levels.length;\n for (let i = 0; i < levels.length; i++) {\n const key = levels[i].getValue(info);\n if (currentGroups[i] === null || currentKeys[i] !== key) {\n firstChange = i;\n break;\n }\n }\n for (let i = firstChange; i < levels.length; i++) {\n const key = levels[i].getValue(info);\n const group = {\n headerName: key,\n headerClass: levels[i].headerClass,\n children: []\n };\n currentGroups[i] = group;\n currentKeys[i] = key;\n if (i === 0) exprTopGroups.push(group);\n else currentGroups[i - 1].children.push(group);\n }\n\n const leaf = {\n field: f,\n headerName: info.group || f.replace(/__expr$/, ''),\n width: 160,\n suppressMovable: false,\n valueFormatter: exprValueFormatter\n };\n currentGroups[levels.length - 1].children.push(leaf);\n }\n\n // Labels for the two pinned columns. The leftmost column carries the row\n // category (\"Study\" / \"Factor\" / \"Characteristic\"); the next column shows\n // the specific row name (the literal \"Title\" for the study row, then each\n // factor/characteristic type name). The first row of each\n // factor/characteristic section gets a clickable caret that toggles the\n // section between expanded (one row per type) and collapsed (one\n // placeholder row).\n const studyLabels = [{ headerName: 'Study' }];\n const titleLabels = [{ headerName: 'Title' }];\n\n if (expanded.factors) {\n factorTypes.forEach((t, i) => {\n studyLabels.push({\n headerName: 'Factor',\n headerClass: 'exprviz-hg-factors',\n ...(i === 0 ? {\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: { onToggle: toggles.toggleFactors, expanded: true }\n } : {})\n });\n titleLabels.push({ headerName: t, headerClass: 'exprviz-hg-factors' });\n });\n } else if (factorTypes.length > 0) {\n studyLabels.push({\n headerName: 'Factors',\n headerClass: 'exprviz-hg-factors exprviz-hg-collapsed',\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: {\n onToggle: toggles.toggleFactors,\n expanded: false,\n suffix: `(${factorTypes.length})`\n }\n });\n titleLabels.push({ headerName: '', headerClass: 'exprviz-hg-factors exprviz-hg-collapsed' });\n }\n\n if (expanded.chars) {\n charTypes.forEach((t, i) => {\n studyLabels.push({\n headerName: 'Characteristic',\n headerClass: 'exprviz-hg-chars',\n ...(i === 0 ? {\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: { onToggle: toggles.toggleChars, expanded: true }\n } : {})\n });\n titleLabels.push({ headerName: t, headerClass: 'exprviz-hg-chars' });\n });\n } else if (charTypes.length > 0) {\n studyLabels.push({\n headerName: 'Characteristics',\n headerClass: 'exprviz-hg-chars exprviz-hg-collapsed',\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: {\n onToggle: toggles.toggleChars,\n expanded: false,\n suffix: `(${charTypes.length})`\n }\n });\n titleLabels.push({ headerName: '', headerClass: 'exprviz-hg-chars exprviz-hg-collapsed' });\n }\n\n const idCol = wrapLeafWithLabels(baseColDefs[0], studyLabels);\n const nameCol = wrapLeafWithLabels(baseColDefs[1], titleLabels);\n\n return [idCol, nameCol, ...exprTopGroups];\n}\n\nconst ExprTable = ({ rows, fields, onReorder, studies, expressionSamples, onHoverRow, onDisplayedOrderChange }) => {\n const fieldInfo = useMemo(\n () => buildFieldInfo(fields, studies, expressionSamples),\n [fields, studies, expressionSamples]\n );\n\n // Default: factor rows expanded, characteristic rows collapsed (per spec).\n const [expanded, setExpanded] = useState({ factors: true, chars: false });\n const toggleFactors = useCallback(\n () => setExpanded(e => ({ ...e, factors: !e.factors })),\n []\n );\n const toggleChars = useCallback(\n () => setExpanded(e => ({ ...e, chars: !e.chars })),\n []\n );\n\n const columnDefs = useMemo(\n () => buildColumnDefs(fields, fieldInfo, expanded, { toggleFactors, toggleChars }),\n [fields, fieldInfo, expanded, toggleFactors, toggleChars]\n );\n\n // ag-grid emits modelUpdated after the rowData/sort/filter pipeline runs,\n // so this single hook covers user-driven sort changes AND the auto-resort\n // that ag-grid performs whenever the rowData prop is replaced (e.g. when\n // the parallel-coords brush narrows filteredRows). Walking\n // forEachNodeAfterFilterAndSort gives us the rows in their current\n // displayed order; we pass that up so the heatmap can mirror the table.\n const handleModelUpdated = useCallback((e) => {\n if (!onDisplayedOrderChange || !e.api) return;\n const out = [];\n e.api.forEachNodeAfterFilterAndSort(node => {\n if (node.data) out.push(node.data);\n });\n onDisplayedOrderChange(out);\n }, [onDisplayedOrderChange]);\n\n const onColumnMoved = (e) => {\n if (!onReorder || !e.finished) return;\n const allCols = e.api.getAllGridColumns ? e.api.getAllGridColumns() : (e.columnApi && e.columnApi.getAllGridColumns && e.columnApi.getAllGridColumns());\n if (!allCols) return;\n const next = allCols\n .map(c => c.getColId())\n .filter(id => fields.includes(id));\n if (!arraysEqual(next, fields)) {\n onReorder(next);\n }\n };\n\n if (!rows || rows.length === 0) {\n return <div className=\"exprviz-table-empty\"><em>No data loaded.</em></div>;\n }\n\n return (\n <div className=\"ag-theme-quartz exprviz-aggrid\">\n <AgGridReact\n rowData={rows}\n columnDefs={columnDefs}\n defaultColDef={DEFAULT_COL_DEF}\n animateRows={false}\n suppressFieldDotNotation={true}\n suppressDragLeaveHidesColumns={true}\n suppressColumnVirtualisation={true}\n groupHeaderHeight={24}\n onColumnMoved={onColumnMoved}\n onModelUpdated={handleModelUpdated}\n onCellMouseOver={e => onHoverRow && onHoverRow(e.data && e.data.id)}\n onCellMouseOut={() => onHoverRow && onHoverRow(null)}\n />\n </div>\n );\n};\n\nexport default ExprTable;\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as d3 from 'd3';\n\n// Parallel-coordinates plot with per-axis brushing and drag-to-reorder axes.\n// - Axis labels are draggable horizontally; on drop, onReorder(newOrder) fires.\n// - Brushes on axes intersect (AND): a row is \"in\" only when every active brush contains it.\n// - Numeric fields use a linear or symlog scale; non-numeric values are skipped.\n\nconst MARGIN = { top: 100, right: 24, bottom: 24, left: 32 };\nconst LABEL_ROTATION = -40;\nconst BRUSH_WIDTH = 16;\n\nfunction isNumeric(v) {\n if (v == null) return false;\n if (Array.isArray(v)) return false;\n const n = +v;\n return Number.isFinite(n);\n}\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\n// Powers-of-10 tick values spanning [lo, hi]; includes 0 if the range crosses zero.\n// Clamped to |v| >= 0.1 to keep low-magnitude tick labels from overlapping near 0.\nconst MIN_LOG_TICK = 0.1;\nfunction logTickValues([lo, hi]) {\n const ticks = new Set();\n if (lo <= 0 && hi >= 0) ticks.add(0);\n if (hi >= MIN_LOG_TICK) {\n const start = Math.max(-1, Math.floor(Math.log10(lo > 0 ? lo : MIN_LOG_TICK)));\n const end = Math.ceil(Math.log10(hi));\n for (let p = start; p <= end; p++) {\n const v = Math.pow(10, p);\n if (v >= MIN_LOG_TICK && v <= hi) ticks.add(v);\n }\n }\n if (lo <= -MIN_LOG_TICK) {\n const start = Math.max(-1, Math.floor(Math.log10(hi < 0 ? -hi : MIN_LOG_TICK)));\n const end = Math.ceil(Math.log10(-lo));\n for (let p = start; p <= end; p++) {\n const v = -Math.pow(10, p);\n if (-v >= MIN_LOG_TICK && v >= lo) ticks.add(v);\n }\n }\n return Array.from(ticks).sort((a, b) => a - b);\n}\n\nfunction logTickFormat(v) {\n if (v === 0) return '0';\n const a = Math.abs(v);\n if (a >= 0.01 && a < 10000) return d3.format('~g')(v);\n return d3.format('.0e')(v);\n}\n\nconst ParallelCoordsPlot = ({\n rows,\n fields,\n scale = 'linear',\n onBrushChange,\n onReorder,\n clearVersion = 0,\n hoveredId = null,\n axisLabels = null\n}) => {\n const svgRef = useRef(null);\n const containerRef = useRef(null);\n // selections in data domain: { [field]: [lo, hi] }\n const selectionsRef = useRef({});\n const lastClearRef = useRef(0);\n // Track container size so the d3 render reruns when the user drags the\n // pane resizer (or when the window is resized). The values themselves\n // aren't read inside the effect — the effect always reads clientWidth/\n // clientHeight — but listing them in the deps array is what triggers it.\n const [size, setSize] = useState({ w: 0, h: 0 });\n // Custom HTML tooltip for axis labels — gives us bold labels and structured\n // sections, which the native SVG <title> can't do.\n const [tooltip, setTooltip] = useState(null);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setSize((prev) => {\n if (Math.abs(prev.w - width) < 1 && Math.abs(prev.h - height) < 1) return prev;\n return { w: width, h: height };\n });\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useEffect(() => {\n if (clearVersion !== lastClearRef.current) {\n selectionsRef.current = {};\n lastClearRef.current = clearVersion;\n if (onBrushChange) onBrushChange({});\n }\n Object.keys(selectionsRef.current).forEach(f => {\n if (!fields || !fields.includes(f)) delete selectionsRef.current[f];\n });\n\n const svg = d3.select(svgRef.current);\n svg.selectAll('*').remove();\n if (!fields || fields.length === 0 || !rows || rows.length === 0) return;\n\n const el = containerRef.current;\n const width = (el && el.clientWidth) || 600;\n const height = (el && el.clientHeight) || 300;\n const innerW = width - MARGIN.left - MARGIN.right;\n const innerH = height - MARGIN.top - MARGIN.bottom;\n\n svg.attr('viewBox', `0 0 ${width} ${height}`);\n\n const g = svg.append('g').attr('transform', `translate(${MARGIN.left},${MARGIN.top})`);\n\n // Mutable order during drag — starts as a copy of fields.\n let order = fields.slice();\n const x = d3.scalePoint().range([0, innerW]).padding(0.5).domain(order);\n\n const yByField = {};\n let globalExt = null;\n if (scale === 'log') {\n const all = [];\n fields.forEach(f => {\n rows.forEach(r => {\n const v = r[f];\n if (isNumeric(v)) all.push(+v);\n });\n });\n globalExt = all.length ? d3.extent(all) : [0, 1];\n }\n fields.forEach(f => {\n if (scale === 'log') {\n yByField[f] = d3.scaleSymlog().domain(globalExt).range([innerH, 0]).nice();\n } else {\n const vals = rows.map(r => r[f]).filter(isNumeric).map(Number);\n const ext = vals.length ? d3.extent(vals) : [0, 1];\n yByField[f] = d3.scaleLinear().domain(ext).range([innerH, 0]).nice();\n }\n });\n\n function pathForRow(row, posOf) {\n const pts = order.map(f => {\n const v = row[f];\n if (!isNumeric(v)) return null;\n return [posOf(f), yByField[f](Number(v))];\n });\n return line(pts);\n }\n\n const line = d3.line()\n .defined(d => d != null && Number.isFinite(d[1]))\n .x(d => d[0])\n .y(d => d[1]);\n\n const linesG = g.append('g').attr('class', 'exprviz-pc-lines');\n const paths = linesG\n .selectAll('path')\n .data(rows)\n .enter()\n .append('path')\n .attr('fill', 'none')\n .attr('stroke', 'steelblue')\n .attr('stroke-width', 1)\n .attr('data-id', d => d && d.id != null ? String(d.id) : null)\n .attr('d', row => pathForRow(row, f => x(f)));\n\n function isBrushedIn(row) {\n for (const f of order) {\n const sel = selectionsRef.current[f];\n if (!sel) continue;\n const v = row[f];\n if (!isNumeric(v)) return false;\n const n = Number(v);\n const [lo, hi] = sel;\n if (n < lo || n > hi) return false;\n }\n return true;\n }\n\n function applyBrushStyles() {\n const anyActive = Object.keys(selectionsRef.current).length > 0;\n paths\n .classed('exprviz-pc-line-in', d => !anyActive || isBrushedIn(d))\n .classed('exprviz-pc-line-out', d => anyActive && !isBrushedIn(d));\n }\n applyBrushStyles();\n\n // axis groups, keyed by field name so D3 can match them across reorders\n const axisG = g.selectAll('.exprviz-pc-axis')\n .data(order, d => d)\n .enter()\n .append('g')\n .attr('class', 'exprviz-pc-axis')\n .attr('transform', d => `translate(${x(d)},0)`);\n\n axisG.each(function(f) {\n const ax = d3.select(this);\n const axisGen = d3.axisLeft(yByField[f]);\n if (scale === 'log') {\n axisGen.tickValues(logTickValues(yByField[f].domain())).tickFormat(logTickFormat);\n } else {\n axisGen.ticks(5);\n }\n ax.call(axisGen);\n\n // Compact axis label. Hovering the label or its drag-handle rect shows\n // a custom HTML tooltip (rendered outside the SVG by React) that can\n // include bold labels and section headings.\n const labelInfo = (axisLabels && axisLabels[f])\n || { short: f.replace(/__expr$/, ''), structured: { studyTitle: f, group: '', factors: [], characteristics: [] } };\n const showTip = (event) => setTooltip({\n x: event.clientX,\n y: event.clientY,\n info: labelInfo.structured\n });\n const moveTip = (event) => setTooltip(t =>\n t ? { ...t, x: event.clientX, y: event.clientY } : null\n );\n const hideTip = () => setTooltip(null);\n\n ax.append('text')\n .attr('class', 'exprviz-pc-axis-label')\n .attr('x', 4).attr('y', -4)\n .attr('text-anchor', 'start')\n .attr('transform', `rotate(${LABEL_ROTATION}, 0, -4)`)\n .attr('fill', '#333')\n .style('font-size', '10px')\n .style('cursor', 'grab')\n .text(labelInfo.short)\n .on('mouseenter', showTip)\n .on('mousemove', moveTip)\n .on('mouseleave', hideTip);\n\n // hit area for grabbing — sits along the rotated label\n ax.append('rect')\n .attr('class', 'exprviz-pc-axis-handle')\n .attr('x', 0).attr('y', -11)\n .attr('width', 140).attr('height', 14)\n .attr('transform', `rotate(${LABEL_ROTATION}, 0, -4)`)\n .attr('fill', 'transparent')\n .style('cursor', 'grab')\n .on('mouseenter', showTip)\n .on('mousemove', moveTip)\n .on('mouseleave', hideTip);\n\n const brush = d3.brushY()\n .extent([[-BRUSH_WIDTH / 2, 0], [BRUSH_WIDTH / 2, innerH]])\n .on('brush end', (event) => {\n const s = event.selection;\n if (!s) {\n delete selectionsRef.current[f];\n } else {\n const y = yByField[f];\n const a = y.invert(s[0]);\n const b = y.invert(s[1]);\n selectionsRef.current[f] = [Math.min(a, b), Math.max(a, b)];\n }\n applyBrushStyles();\n // event.sourceEvent is null when brush.move is called programmatically\n // (e.g. when this effect re-runs and we restore prior selections).\n // Skipping that case avoids a re-render loop with the parent.\n if (event.type === 'end' && event.sourceEvent && onBrushChange) {\n onBrushChange({ ...selectionsRef.current });\n }\n });\n\n const brushG = ax.append('g').attr('class', 'exprviz-pc-brush').call(brush);\n\n const prior = selectionsRef.current[f];\n if (prior) {\n const y = yByField[f];\n const py0 = y(prior[1]);\n const py1 = y(prior[0]);\n if (Number.isFinite(py0) && Number.isFinite(py1)) {\n brushG.call(brush.move, [py0, py1]);\n }\n }\n });\n\n // Drag-to-reorder: while dragging, only the dragged axis moves and the\n // line segments connecting to it are recomputed. Other axes stay put.\n // The new order is computed once at drag end and emitted via onReorder.\n const drag = d3.drag()\n .container(function() { return g.node(); })\n .subject(function(event, d) { return { x: x(d), y: 0 }; })\n .on('start', function(event, d) {\n const axNode = this.parentNode;\n d3.select(axNode).raise().classed('exprviz-pc-axis-dragging', true);\n d3.select(axNode).select('.exprviz-pc-axis-label').style('cursor', 'grabbing');\n linesG.classed('exprviz-pc-lines-dragging', true);\n })\n .on('drag', function(event, d) {\n const axNode = this.parentNode;\n const newX = Math.max(0, Math.min(innerW, event.x));\n d3.select(axNode).attr('transform', `translate(${newX},0)`);\n paths.attr('d', row => pathForRow(row, f => f === d ? newX : x(f)));\n })\n .on('end', function(event, d) {\n const axNode = this.parentNode;\n const newX = Math.max(0, Math.min(innerW, event.x));\n d3.select(axNode).classed('exprviz-pc-axis-dragging', false);\n d3.select(axNode).select('.exprviz-pc-axis-label').style('cursor', 'grab');\n linesG.classed('exprviz-pc-lines-dragging', false);\n\n const newOrder = order.slice().sort((a, b) => {\n const xa = a === d ? newX : x(a);\n const xb = b === d ? newX : x(b);\n return xa - xb;\n });\n\n if (onReorder && !arraysEqual(newOrder, fields)) {\n // Snap the dragged axis to its target slot for the brief moment\n // before the parent re-renders with the new order.\n x.domain(newOrder);\n d3.select(axNode).attr('transform', `translate(${x(d)},0)`);\n paths.attr('d', row => pathForRow(row, f => x(f)));\n onReorder(newOrder);\n } else {\n // No order change — restore the dragged axis to its original slot.\n d3.select(axNode).attr('transform', `translate(${x(d)},0)`);\n paths.attr('d', row => pathForRow(row, f => x(f)));\n }\n });\n\n axisG.selectAll('.exprviz-pc-axis-label, .exprviz-pc-axis-handle').call(drag);\n }, [rows, fields, scale, onBrushChange, onReorder, clearVersion, axisLabels, size.w, size.h]);\n\n // Highlight the polyline matching the hovered row id without rebuilding the\n // SVG. Raises the highlighted path so it draws above its neighbors.\n useEffect(() => {\n const svg = d3.select(svgRef.current);\n if (svg.empty()) return;\n const paths = svg.selectAll('.exprviz-pc-lines path');\n paths.classed('exprviz-pc-line-hover', false);\n if (hoveredId == null) return;\n const target = paths.filter(function() {\n return this.getAttribute('data-id') === String(hoveredId);\n });\n target.classed('exprviz-pc-line-hover', true).raise();\n }, [hoveredId, rows, fields, scale]);\n\n if (!fields || fields.length === 0) {\n return <div className=\"exprviz-plot-empty\"><em>Select fields to plot.</em></div>;\n }\n\n return (\n <div ref={containerRef} className=\"exprviz-pc-container\">\n <svg ref={svgRef} width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\"/>\n {tooltip && <AxisTooltip x={tooltip.x} y={tooltip.y} info={tooltip.info}/>}\n </div>\n );\n};\n\n// Position-fixed so it can escape the plot pane's clipping. Offset slightly\n// from the cursor and clamped to the viewport so it never spills off-screen.\nconst AxisTooltip = ({ x, y, info }) => {\n const ref = useRef(null);\n const [pos, setPos] = useState({ left: x + 12, top: y + 12 });\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let left = x + 12;\n let top = y + 12;\n if (left + w > vw - 4) left = Math.max(4, x - 12 - w);\n if (top + h > vh - 4) top = Math.max(4, y - 12 - h);\n setPos({ left, top });\n }, [x, y, info]);\n const { studyTitle, group, factors, characteristics } = info;\n return (\n <div ref={ref} className=\"exprviz-pc-tooltip\" style={pos}>\n <div><span className=\"exprviz-pc-tip-key\">Study:</span> {studyTitle}{group ? ` (${group})` : ''}</div>\n {factors.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Factors</div>\n {factors.map((p, i) => (\n <div key={`f-${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n {characteristics.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Characteristics</div>\n {characteristics.map((p, i) => (\n <div key={`c-${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n </div>\n );\n};\n\nexport default ParallelCoordsPlot;\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport * as d3 from 'd3';\n\n// Heatmap of (gene × sample) expression values. A compact, color-mapped\n// stand-in for the data table; columns line up with the table's column order\n// so switching modes preserves the user's mental model.\n//\n// Scale: discrete threshold-based color bins (5 levels, configurable below)\n// going from pale blue (low) to dark blue (high). The bin cutoffs are\n// global — they don't adapt to the data — so colors are comparable across\n// different gene sets and tabs. Edit BIN_CUTOFFS / BIN_COLORS to retune.\n\n// 4 cutoffs → 5 bins → 5 colors. A value v gets BIN_COLORS[i] where i is\n// the largest index such that v >= BIN_CUTOFFS[i-1] (with i=0 below all).\n// Defaults assume TPM-like expression magnitudes; adjust for FPKM / counts.\nconst BIN_CUTOFFS = [1, 10, 100, 1000];\nconst BIN_COLORS = [\n '#e8f1f8', // pale blue — below first cutoff\n '#b8d3e6',\n '#6da6cf',\n '#2e6fae',\n '#0a3d72' // dark blue — above last cutoff\n];\n\nconst MIN_CELL_H = 20;\nconst MIN_CELL_W = 20;\nconst CELL_GAP = 1;\nconst HEADER_LABEL_ROTATION = -40;\nconst LABEL_FONT_SIZE = 11;\n// Reasonable bounds for label-fit margins so a single huge label can't\n// monopolize the visualization space.\nconst LEFT_MARGIN_MIN = 36;\nconst LEFT_MARGIN_MAX = 220;\nconst HEADER_HEIGHT_MIN = 60;\nconst HEADER_HEIGHT_MAX = 200;\nconst RIGHT_MARGIN = 16;\nconst BODY_BOTTOM = 12;\n\nfunction isNumeric(v) {\n if (v == null || Array.isArray(v)) return false;\n return Number.isFinite(+v);\n}\n\nfunction fmt(n) {\n if (!Number.isFinite(n)) return String(n);\n const a = Math.abs(n);\n if (a !== 0 && (a < 0.001 || a >= 1e6)) return n.toExponential(3);\n return Number(n.toFixed(4)).toString();\n}\n\nfunction studyIdOfField(field) {\n const m = field && field.match(/^(.+?)_g\\d+__expr$/);\n return m ? m[1] : field;\n}\n\n// One shared canvas context for label measurement — avoids re-creating it\n// per render and keeps the math accurate (font metrics depend on the\n// browser's actual font rendering).\nlet _measureCtx = null;\nfunction measureText(s, fontSize = LABEL_FONT_SIZE) {\n if (!s) return 0;\n if (!_measureCtx) {\n if (typeof document === 'undefined') return s.length * 6.5;\n _measureCtx = document.createElement('canvas').getContext('2d');\n }\n _measureCtx.font = `${fontSize}px sans-serif`;\n return _measureCtx.measureText(String(s)).width;\n}\n\nconst HeatmapPlot = ({\n rows,\n fields,\n axisLabels = null,\n fieldInfo = null,\n onHoverRow = null\n}) => {\n const containerRef = useRef(null);\n const innerRef = useRef(null);\n const headerSvgRef = useRef(null);\n const bodySvgRef = useRef(null);\n const bodyScrollRef = useRef(null);\n const [size, setSize] = useState({ w: 0, h: 0 });\n const [tooltip, setTooltip] = useState(null);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setSize(prev => {\n if (Math.abs(prev.w - width) < 1 && Math.abs(prev.h - height) < 1) return prev;\n return { w: width, h: height };\n });\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const colorOfValue = useMemo(() => {\n const scale = d3.scaleThreshold().domain(BIN_CUTOFFS).range(BIN_COLORS);\n return v => (isNumeric(v) ? scale(+v) : '#f2f2f2');\n }, []);\n\n // Pre-compute label-fit dimensions so the d3 effect can lay things out\n // and the React legend can use the same numbers.\n const layout = useMemo(() => {\n const containerW = (size.w || 600);\n const containerH = (size.h || 300);\n\n // Left margin: enough to fit the longest gene name / id, capped.\n let maxRowLabel = 0;\n for (const r of (rows || [])) {\n const w = measureText(r.name || r.id || '');\n if (w > maxRowLabel) maxRowLabel = w;\n }\n const leftMargin = Math.max(\n LEFT_MARGIN_MIN,\n Math.min(LEFT_MARGIN_MAX, Math.ceil(maxRowLabel) + 12)\n );\n\n // Header height: the rotated column label takes up labelWidth*sin(40°)\n // vertical pixels. Cap to keep things sane on pathologically long names.\n let maxColLabel = 0;\n for (const f of (fields || [])) {\n const lab = (axisLabels && axisLabels[f] && axisLabels[f].short) || f;\n const w = measureText(lab);\n if (w > maxColLabel) maxColLabel = w;\n }\n const sinR = Math.sin(Math.abs(HEADER_LABEL_ROTATION) * Math.PI / 180);\n const headerH = Math.max(\n HEADER_HEIGHT_MIN,\n Math.min(HEADER_HEIGHT_MAX, Math.ceil(maxColLabel * sinR) + 18)\n );\n\n const availPlotW = Math.max(0, containerW - leftMargin - RIGHT_MARGIN);\n const availPlotH = Math.max(0, containerH - headerH - BODY_BOTTOM);\n\n const nFields = (fields && fields.length) || 0;\n const nRows = (rows && rows.length) || 0;\n const fitCellW = nFields > 0 ? availPlotW / nFields : MIN_CELL_W;\n const fitCellH = nRows > 0 ? availPlotH / nRows : MIN_CELL_H;\n const cellW = Math.max(MIN_CELL_W, fitCellW);\n const cellH = Math.max(MIN_CELL_H, fitCellH);\n\n const innerW = cellW * nFields;\n const innerH = cellH * nRows;\n // Total width of the inner block (header + body share this width so the\n // outer container's horizontal scroll moves them together).\n const totalW = leftMargin + innerW + RIGHT_MARGIN;\n\n return { leftMargin, headerH, cellW, cellH, innerW, innerH, totalW, containerW, containerH };\n }, [rows, fields, axisLabels, size.w, size.h]);\n\n useEffect(() => {\n const headerSvg = d3.select(headerSvgRef.current);\n const bodySvg = d3.select(bodySvgRef.current);\n headerSvg.selectAll('*').remove();\n bodySvg.selectAll('*').remove();\n if (!fields || fields.length === 0 || !rows || rows.length === 0) return;\n\n const { leftMargin, headerH, cellW, cellH, innerW, innerH, totalW } = layout;\n\n // ---- header SVG: rotated column labels, study separator ticks ----\n headerSvg.attr('width', totalW).attr('height', headerH);\n const hg = headerSvg.append('g')\n .attr('transform', `translate(${leftMargin},${headerH})`);\n const labelGroup = hg.append('g').attr('class', 'exprviz-hm-collabels');\n let prevStudy = null;\n fields.forEach((f, i) => {\n const cx = i * cellW + cellW / 2;\n const label = (axisLabels && axisLabels[f] && axisLabels[f].short) || f;\n const t = labelGroup.append('text')\n .attr('class', 'exprviz-hm-collabel')\n .attr('transform', `translate(${cx},-6) rotate(${HEADER_LABEL_ROTATION})`)\n .attr('text-anchor', 'start')\n .attr('font-size', LABEL_FONT_SIZE)\n .text(label);\n const struct = axisLabels && axisLabels[f] && axisLabels[f].structured;\n if (struct) {\n const titleParts = [struct.studyTitle];\n if (struct.group) titleParts.push(`Group: ${struct.group}`);\n struct.factors && struct.factors.forEach(p => titleParts.push(`${p.name}: ${p.value}`));\n struct.characteristics && struct.characteristics.forEach(p => titleParts.push(`${p.name}: ${p.value}`));\n t.append('title').text(titleParts.join('\\n'));\n }\n // Tick marks at study boundaries inside the header so groupings stay\n // visible even after a horizontal scroll.\n const sid = studyIdOfField(f);\n if (i > 0 && sid !== prevStudy) {\n hg.append('line')\n .attr('x1', i * cellW).attr('x2', i * cellW)\n .attr('y1', -4).attr('y2', 0)\n .attr('stroke', '#666').attr('stroke-width', 1);\n }\n prevStudy = sid;\n });\n\n // ---- body SVG ----\n const bodyH = innerH + BODY_BOTTOM;\n bodySvg.attr('width', totalW).attr('height', bodyH);\n const g = bodySvg.append('g').attr('transform', `translate(${leftMargin},0)`);\n\n // Vertical separators between studies — full height.\n prevStudy = null;\n fields.forEach((f, i) => {\n const sid = studyIdOfField(f);\n if (i > 0 && sid !== prevStudy) {\n g.append('line')\n .attr('class', 'exprviz-hm-study-sep')\n .attr('x1', i * cellW).attr('x2', i * cellW)\n .attr('y1', 0).attr('y2', innerH)\n .attr('stroke', '#fff').attr('stroke-width', 2);\n }\n prevStudy = sid;\n });\n\n // ---- cells ----\n const cellsGroup = g.append('g').attr('class', 'exprviz-hm-cells');\n // Hover outline lives in its own <g> so cell event handlers can update\n // it imperatively without re-running this effect.\n const overlayGroup = g.append('g').attr('class', 'exprviz-hm-overlay');\n const showHover = (row, field, mx, my, value) => {\n const ax = axisLabels && axisLabels[field] && axisLabels[field].structured;\n const info = fieldInfo && fieldInfo[field];\n setTooltip({\n x: mx + 12,\n y: my + 12,\n gene: { id: row.id, name: row.name },\n value,\n study: (ax && ax.studyTitle) || (info && info.studyDescription) || '',\n group: (ax && ax.group) || (info && info.group) || '',\n replicates: info && info.replicates,\n factors: (ax && ax.factors) || (info && info.factors ? Object.entries(info.factors).map(([name, value]) => ({ name, value })) : []),\n characteristics: (ax && ax.characteristics) || (info && info.characteristics ? Object.entries(info.characteristics).map(([name, value]) => ({ name, value })) : [])\n });\n if (onHoverRow) onHoverRow(row.id);\n };\n const clearHover = () => {\n overlayGroup.selectAll('*').remove();\n setTooltip(null);\n if (onHoverRow) onHoverRow(null);\n };\n\n const cellInnerW = Math.max(0.5, cellW - CELL_GAP);\n const cellInnerH = Math.max(0.5, cellH - CELL_GAP);\n rows.forEach((row, ri) => {\n const rg = cellsGroup.append('g')\n .attr('class', 'exprviz-hm-row')\n .attr('data-id', row.id)\n .attr('transform', `translate(0, ${ri * cellH})`);\n fields.forEach((f, ci) => {\n const v = row[f];\n const numeric = isNumeric(v);\n const fill = colorOfValue(v);\n const rect = rg.append('rect')\n .attr('x', ci * cellW).attr('y', 0)\n .attr('width', cellInnerW).attr('height', cellInnerH)\n .attr('fill', fill).attr('stroke', 'none');\n rect.on('pointerenter pointermove', (event) => {\n overlayGroup.selectAll('*').remove();\n overlayGroup.append('rect')\n .attr('x', ci * cellW).attr('y', ri * cellH)\n .attr('width', cellInnerW).attr('height', cellInnerH)\n .attr('fill', 'none')\n .attr('stroke', '#d62728').attr('stroke-width', 1.5)\n .attr('pointer-events', 'none');\n showHover(row, f, event.clientX, event.clientY, numeric ? +v : null);\n });\n rect.on('pointerleave', clearHover);\n });\n });\n\n // ---- row labels (always rendered: cellH >= MIN_CELL_H = 20) ----\n const labels = g.append('g').attr('class', 'exprviz-hm-rowlabels');\n rows.forEach((row, ri) => {\n labels.append('text')\n .attr('x', -6)\n .attr('y', ri * cellH + cellH / 2)\n .attr('text-anchor', 'end')\n .attr('dominant-baseline', 'middle')\n .attr('font-size', Math.min(LABEL_FONT_SIZE, cellH - 2))\n .text(row.name || row.id);\n });\n }, [rows, fields, axisLabels, fieldInfo, layout, colorOfValue, onHoverRow]);\n\n // Inner block width matches the SVG width so when content is wider than\n // the container, the outer container scrolls horizontally and both\n // header + body translate together (col labels stay aligned with cells).\n const innerStyle = { width: layout.totalW || '100%' };\n\n return (\n <div className=\"exprviz-hm-container\" ref={containerRef}>\n <div className=\"exprviz-hm-inner\" ref={innerRef} style={innerStyle}>\n <div className=\"exprviz-hm-header\">\n <svg ref={headerSvgRef}/>\n </div>\n <div className=\"exprviz-hm-body\" ref={bodyScrollRef}>\n <svg ref={bodySvgRef}/>\n </div>\n </div>\n <Legend/>\n {tooltip && (\n <div\n className=\"exprviz-pc-tooltip\"\n style={{ left: tooltip.x, top: tooltip.y }}\n >\n <div>\n <span className=\"exprviz-pc-tip-key\">{tooltip.gene.id}</span>\n {tooltip.gene.name ? <> · {tooltip.gene.name}</> : null}\n </div>\n <div>\n <span className=\"exprviz-pc-tip-key\">Value:</span> {tooltip.value == null ? '—' : fmt(tooltip.value)}\n </div>\n {tooltip.study && (\n <>\n <div className=\"exprviz-pc-tip-section\">Study</div>\n <div className=\"exprviz-pc-tip-row\">{tooltip.study}</div>\n {tooltip.group && (\n <div className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">Group:</span> {tooltip.group}\n {tooltip.replicates ? ` (${tooltip.replicates} rep${tooltip.replicates === 1 ? '' : 's'})` : ''}\n </div>\n )}\n </>\n )}\n {tooltip.factors && tooltip.factors.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Factors</div>\n {tooltip.factors.map((p, i) => (\n <div key={`f${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n {tooltip.characteristics && tooltip.characteristics.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Characteristics</div>\n {tooltip.characteristics.map((p, i) => (\n <div key={`c${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n\n// 5-bin discrete legend, positioned in the top-right of the heatmap pane.\n// Lives outside the scroll container so it's always visible regardless of\n// where the user has scrolled.\nconst Legend = () => (\n <div className=\"exprviz-hm-legend\" title=\"Expression bins. Edit BIN_CUTOFFS / BIN_COLORS in HeatmapPlot.js to retune.\">\n {BIN_COLORS.map((color, i) => {\n const lo = i === 0 ? null : BIN_CUTOFFS[i - 1];\n const hi = i === BIN_CUTOFFS.length ? null : BIN_CUTOFFS[i];\n let label;\n if (lo == null) label = `< ${hi}`;\n else if (hi == null) label = `≥ ${lo}`;\n else label = `${lo}–${hi}`;\n return (\n <div className=\"exprviz-hm-legend-bin\" key={i}>\n <span className=\"exprviz-hm-legend-swatch\" style={{ background: color }}/>\n <span className=\"exprviz-hm-legend-label\">{label}</span>\n </div>\n );\n })}\n </div>\n);\n\nexport default HeatmapPlot;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Accordion, Form, Badge, OverlayTrigger, Tooltip } from 'react-bootstrap';\nimport { BsChevronDown, BsChevronRight, BsInfoCircle } from 'react-icons/bs';\nimport './ontologyEnrichment.css';\n\nfunction speciesTaxonId(tid) {\n const n = +tid;\n return n > 1000000 ? Math.floor(n / 1000) : n;\n}\n\nfunction genomeName(grameneMaps, tid) {\n if (!grameneMaps) return String(tid);\n const direct = grameneMaps[tid];\n if (direct && direct.display_name) return direct.display_name;\n const sp = grameneMaps[speciesTaxonId(tid)];\n if (sp && sp.display_name) return sp.display_name;\n return String(tid);\n}\n\nfunction fmtP(p) {\n if (p == null) return '';\n if (p === 0) return '0';\n if (p < 1e-4) return p.toExponential(2);\n return p.toPrecision(3);\n}\n\nfunction fmtFold(f) {\n if (!isFinite(f)) return '';\n if (f >= 100) return f.toFixed(0);\n return f.toFixed(2);\n}\n\n// ---------- species tree helpers ----------\n\nfunction findRoots(tax) {\n return Object.values(tax).filter(n =>\n !n.is_a || n.is_a.length === 0 || !n.is_a.some(p => tax[p])\n );\n}\n\n// Place each facet tid onto a taxonomy node id (fall back to species level\n// when the exact subspecies tid isn't in grameneTaxonomy).\nfunction placeTaxa(taxonomy, taxa) {\n const placement = {};\n const byPlace = {};\n for (const { tid, count } of taxa) {\n const place = taxonomy[tid] ? +tid : speciesTaxonId(tid);\n placement[tid] = place;\n if (!byPlace[place]) byPlace[place] = [];\n byPlace[place].push({ tid, count });\n }\n return { placement, byPlace };\n}\n\n// Set of taxonomy node ids on the path from any placed leaf back to its root.\nfunction relevantNodeIds(taxonomy, byPlace) {\n const out = new Set();\n for (const placeId of Object.keys(byPlace)) {\n let cur = taxonomy[placeId];\n const seen = new Set();\n while (cur && !seen.has(+cur._id)) {\n seen.add(+cur._id);\n out.add(+cur._id);\n const pid = cur.is_a && cur.is_a[0];\n cur = pid ? taxonomy[pid] : null;\n }\n }\n return out;\n}\n\nfunction relevantChildren(node, taxonomy, relevant) {\n return (node.children || [])\n .map(cid => taxonomy[cid])\n .filter(c => c && relevant.has(+c._id));\n}\n\n// Walk down through single-relevant-child internal nodes to a branch / leaf.\nfunction compressChain(node, taxonomy, relevant, byPlace) {\n const chain = [node];\n let cur = node;\n while (true) {\n if (byPlace[cur._id]) break; // node itself is a placed leaf\n const kids = relevantChildren(cur, taxonomy, relevant);\n if (kids.length !== 1) break;\n cur = kids[0];\n chain.push(cur);\n }\n return { chain, terminal: cur };\n}\n\nconst CHAIN_DISPLAY_MAX = 3;\nfunction renderChain(chain) {\n const nameOf = n => n.short_name || n.name || String(n._id);\n if (chain.length <= CHAIN_DISPLAY_MAX) {\n return chain.map((n, i) => (\n <React.Fragment key={n._id}>\n {i > 0 && <span className=\"tax-sep\"> › </span>}\n {nameOf(n)}\n </React.Fragment>\n ));\n }\n const first = chain[0];\n const last = chain[chain.length - 1];\n const middle = chain.slice(1, -1);\n const fullTitle = chain.map(nameOf).join(' › ');\n return (\n <>\n {nameOf(first)}\n <span className=\"tax-sep\"> › </span>\n <span className=\"tax-ellipsis\" title={fullTitle}>\n <span className=\"tax-ellipsis-short\">…</span>\n <span className=\"tax-ellipsis-full\">\n {middle.map(n => (\n <React.Fragment key={n._id}>\n {nameOf(n)}\n <span className=\"tax-sep\"> › </span>\n </React.Fragment>\n ))}\n </span>\n </span>\n <span className=\"tax-sep\"> › </span>\n {nameOf(last)}\n </>\n );\n}\n\nfunction dedupAdjacent(chain) {\n const out = [];\n for (const n of chain) {\n if (out.length && out[out.length - 1].name === n.name) {\n out[out.length - 1] = n;\n } else {\n out.push(n);\n }\n }\n return out;\n}\n\nconst SpeciesTreeNode = ({\n node, depth, taxonomy, relevant, byPlace, grameneMaps,\n expanded, onToggleExpand, activeTaxon, onSelect\n}) => {\n const { chain: rawChain, terminal } = compressChain(node, taxonomy, relevant, byPlace);\n const chain = dedupAdjacent(rawChain);\n const placed = byPlace[terminal._id] || [];\n const kids = relevantChildren(terminal, taxonomy, relevant);\n const hasKids = kids.length > 0;\n const isOpen = expanded.has(+terminal._id);\n\n return (\n <div className=\"tax-node oe-tree-node\">\n <div className=\"tax-row\" style={{ paddingLeft: depth * 7 }}>\n {hasKids ? (\n <span className=\"tax-chevron\" onClick={() => onToggleExpand(+terminal._id)}>\n {isOpen ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n ) : (\n <span className=\"tax-chevron-spacer\"/>\n )}\n <span className={hasKids ? 'tax-label tax-label-internal' : 'tax-label'}>\n {renderChain(chain)}\n </span>\n </div>\n\n {placed.map(({ tid, count }) => {\n const isActive = String(activeTaxon) === String(tid);\n return (\n <div\n key={tid}\n className={'oe-tree-leaf' + (isActive ? ' oe-tree-leaf-active' : '')}\n style={{ paddingLeft: (depth + 1) * 7 + 18 }}\n onClick={() => onSelect(tid)}\n >\n <input\n type=\"radio\"\n readOnly\n checked={isActive}\n onChange={() => onSelect(tid)}\n />\n <span className=\"oe-tree-leaf-name\">{genomeName(grameneMaps, tid)}</span>\n <span className=\"oe-tree-leaf-count\">{count.toLocaleString()}</span>\n </div>\n );\n })}\n\n {hasKids && isOpen && (\n <div className=\"tax-children\">\n {kids.map(c => (\n <SpeciesTreeNode\n key={c._id}\n node={c}\n depth={depth + 1}\n taxonomy={taxonomy}\n relevant={relevant}\n byPlace={byPlace}\n grameneMaps={grameneMaps}\n expanded={expanded}\n onToggleExpand={onToggleExpand}\n activeTaxon={activeTaxon}\n onSelect={onSelect}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nconst SpeciesTree = ({ taxonomy, grameneMaps, taxa, activeTaxon, onSelect }) => {\n const { placement, byPlace } = useMemo(() => placeTaxa(taxonomy, taxa), [taxonomy, taxa]);\n const relevant = useMemo(() => relevantNodeIds(taxonomy, byPlace), [taxonomy, byPlace]);\n const roots = useMemo(\n () => findRoots(taxonomy).filter(r => relevant.has(+r._id)),\n [taxonomy, relevant]\n );\n\n // Default: every relevant internal node expanded so the user sees the\n // full pruned tree on first paint.\n const [expanded, setExpanded] = useState(() => new Set(relevant));\n useEffect(() => {\n setExpanded(new Set(relevant));\n }, [relevant]);\n\n const handleToggle = (id) => {\n setExpanded(prev => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n };\n\n // Skip the root spine: if a root has only one relevant child and isn't\n // itself a placed leaf, render from its child instead.\n const topLevel = [];\n for (const r of roots) {\n const { terminal } = compressChain(r, taxonomy, relevant, byPlace);\n if (byPlace[terminal._id]) {\n topLevel.push(r);\n } else {\n const kids = relevantChildren(terminal, taxonomy, relevant);\n kids.forEach(k => topLevel.push(k));\n }\n }\n\n return (\n <div className=\"oe-tree\">\n {topLevel.map(n => (\n <SpeciesTreeNode\n key={n._id}\n node={n}\n depth={0}\n taxonomy={taxonomy}\n relevant={relevant}\n byPlace={byPlace}\n grameneMaps={grameneMaps}\n expanded={expanded}\n onToggleExpand={handleToggle}\n activeTaxon={activeTaxon}\n onSelect={onSelect}\n />\n ))}\n </div>\n );\n};\n\n// ---------- enrichment panel ----------\n\nconst HelpIcon = ({ text }) => (\n <OverlayTrigger placement=\"top\" overlay={<Tooltip>{text}</Tooltip>}>\n <span className=\"oe-help\" tabIndex={0}><BsInfoCircle/></span>\n </OverlayTrigger>\n);\n\nconst LabeledHelp = ({ label, help }) => (\n <Form.Label>\n {label} <HelpIcon text={help}/>\n </Form.Label>\n);\n\nconst ControlsBar = ({ ui, onChange }) => (\n <div className=\"oe-controls\">\n <Form.Group className=\"oe-control\">\n <LabeledHelp\n label=\"p.adjust ≤\"\n help=\"Adjusted p-value cutoff (Benjamini–Hochberg). Terms with p.adjust above this are not reported as significant.\"\n />\n <Form.Control\n type=\"number\" step=\"0.01\" min=\"0\" max=\"1\"\n value={ui.pAdjCutoff}\n onChange={e => onChange({ pAdjCutoff: +e.target.value })}\n />\n </Form.Group>\n <Form.Group className=\"oe-control\">\n <LabeledHelp\n label=\"minGSSize\"\n help=\"Minimum gene set size: a term must have at least this many annotated genes in the universe to be tested. Filters out terms too small to give reliable enrichment statistics. clusterProfiler default: 10.\"\n />\n <Form.Control\n type=\"number\" step=\"1\" min=\"1\"\n value={ui.minGSSize}\n onChange={e => onChange({ minGSSize: Math.max(1, +e.target.value) })}\n />\n </Form.Group>\n <Form.Group className=\"oe-control\">\n <LabeledHelp\n label=\"maxGSSize\"\n help=\"Maximum gene set size: terms with more than this many annotated genes are excluded. Drops the very general top-level terms (e.g. GO root) which carry little biological signal. clusterProfiler default: 500.\"\n />\n <Form.Control\n type=\"number\" step=\"1\" min=\"1\"\n value={ui.maxGSSize}\n onChange={e => onChange({ maxGSSize: Math.max(1, +e.target.value) })}\n />\n </Form.Group>\n <div className=\"oe-control oe-switch\">\n <Form.Check\n type=\"switch\"\n id=\"oe-most-specific\"\n label=\"Drop ancestor terms\"\n checked={!!ui.mostSpecific}\n onChange={e => onChange({ mostSpecific: e.target.checked })}\n />\n <HelpIcon text=\"If a passing term has a more specific descendant that also passes, hide the ancestor — keeps only the most-specific significant term in each branch. Applied after BH correction. Analogous to clusterProfiler's simplify() (off by default in enrichGO).\"/>\n </div>\n <Form.Group className=\"oe-control oe-control-grow\">\n <LabeledHelp\n label=\"Filter terms\"\n help=\"Live text filter on the result table — matches term ID or name.\"\n />\n <Form.Control\n type=\"text\"\n placeholder=\"term id or name…\"\n value={ui.search || ''}\n onChange={e => onChange({ search: e.target.value })}\n />\n </Form.Group>\n </div>\n);\n\nconst TermRow = ({ row, showType, onAddFilter }) => {\n const handleClick = () => onAddFilter && onAddFilter(row);\n return (\n <tr onClick={handleClick} title=\"Click to add as a filter\">\n <td className=\"oe-term-id\">{row.term_display_id}</td>\n <td className=\"oe-term-name\">{row.term_name || <em>(loading…)</em>}</td>\n {showType && <td className=\"oe-term-type\">{row.term_namespace || ''}</td>}\n <td className=\"oe-num\">{row.GeneRatio}</td>\n <td className=\"oe-num\">{row.BgRatio}</td>\n <td className=\"oe-num\">{fmtFold(row.FoldEnrichment)}</td>\n <td className=\"oe-num\">{fmtP(row.pvalue)}</td>\n <td className=\"oe-num\">{fmtP(row.pAdjust)}</td>\n </tr>\n );\n};\n\n// InterPro entry types and pathway types are useful per-row context\n// (e.g. Domain vs Family vs Repeat for InterPro), and aren't reflected in\n// the section title the way GO namespaces are. Show a Type column for\n// those two ontologies only.\nconst ONTS_WITH_TYPE_COLUMN = new Set(['domains', 'pathways']);\n\nconst SORT_ACCESSORS = {\n term: r => r.term_display_id || '',\n name: r => (r.term_name || '').toLowerCase(),\n type: r => (r.term_namespace || '').toLowerCase(),\n count: r => r.Count,\n setSize: r => r.SetSize,\n fold: r => r.FoldEnrichment,\n p: r => r.pvalue,\n pAdj: r => r.pAdjust\n};\n\n// Defaults chosen so a single click does what the user usually wants:\n// numeric \"more interesting\" columns descend; p-values and text columns ascend.\nconst SORT_DEFAULT_DIR = {\n term: 'asc', name: 'asc', type: 'asc',\n count: 'desc', setSize: 'desc', fold: 'desc',\n p: 'asc', pAdj: 'asc'\n};\n\nconst SortableTh = ({ label, sortKey, activeKey, activeDir, onSort, numeric, help }) => {\n const active = activeKey === sortKey;\n const arrow = active ? (activeDir === 'asc' ? ' ▲' : ' ▼') : '';\n const cls = 'oe-sort-th'\n + (active ? ' oe-sort-th-active' : '')\n + (numeric ? ' oe-num' : '');\n const inner = (\n <span className=\"oe-th-inner\">\n {label}{arrow}\n </span>\n );\n return (\n <th className={cls} onClick={() => onSort(sortKey)}>\n {help\n ? <OverlayTrigger placement=\"top\" overlay={<Tooltip>{help}</Tooltip>}>{inner}</OverlayTrigger>\n : inner}\n </th>\n );\n};\n\nconst OntologySection = ({ block, search, onAddFilter }) => {\n const filtered = useMemo(() => {\n if (!search) return block.rows;\n const needle = search.toLowerCase();\n return block.rows.filter(r =>\n (r.term_display_id && r.term_display_id.toLowerCase().includes(needle)) ||\n (r.term_name && r.term_name.toLowerCase().includes(needle))\n );\n }, [block.rows, search]);\n\n const showType = ONTS_WITH_TYPE_COLUMN.has(block.ontology);\n const [sortKey, setSortKey] = useState('pAdj');\n const [sortDir, setSortDir] = useState('asc');\n\n const handleSort = (key) => {\n if (key === sortKey) {\n setSortDir(d => (d === 'asc' ? 'desc' : 'asc'));\n } else {\n setSortKey(key);\n setSortDir(SORT_DEFAULT_DIR[key] || 'asc');\n }\n };\n\n const sorted = useMemo(() => {\n const accessor = SORT_ACCESSORS[sortKey];\n if (!accessor) return filtered;\n const sign = sortDir === 'desc' ? -1 : 1;\n const arr = filtered.slice();\n arr.sort((a, b) => {\n const va = accessor(a);\n const vb = accessor(b);\n if (typeof va === 'number' && typeof vb === 'number') {\n if (va === vb) return 0;\n return (va - vb) * sign;\n }\n return String(va).localeCompare(String(vb)) * sign;\n });\n return arr;\n }, [filtered, sortKey, sortDir]);\n\n return (\n <Accordion.Item eventKey={block.ontology}>\n <Accordion.Header>\n <span className=\"oe-ont-title\">{block.label}</span>\n <Badge bg=\"secondary\" className=\"oe-ont-badge\">\n {block.passing} significant / {block.tested} tested\n </Badge>\n {block.universeSize > 0 && (\n <Badge bg=\"light\" text=\"dark\" className=\"oe-ont-badge\">\n input {block.deSize} / universe {block.universeSize.toLocaleString()}\n </Badge>\n )}\n </Accordion.Header>\n <Accordion.Body>\n {sorted.length === 0\n ? <em>No terms pass the current cutoffs.</em>\n : (\n <table className=\"oe-table\">\n <thead>\n <tr>\n <SortableTh label=\"Term\" sortKey=\"term\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort}\n help=\"Ontology term identifier (e.g. GO:0008150). Click a row to add the term as a filter.\"/>\n <SortableTh label=\"Description\" sortKey=\"name\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort}\n help=\"Human-readable name of the term.\"/>\n {showType && <SortableTh label=\"Type\" sortKey=\"type\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort}\n help=\"Sub-classification within the ontology (e.g. Domain / Family / Repeat for InterPro).\"/>}\n <SortableTh label=\"GeneRatio\" sortKey=\"count\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"Count / DESize: how many of the input genes are annotated to this term, over the total input genes that have any annotation in this ontology.\"/>\n <SortableTh label=\"BgRatio\" sortKey=\"setSize\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"SetSize / UniverseSize: how many genes in the species are annotated to this term, over the total genes annotated anywhere in this ontology (the universe).\"/>\n <SortableTh label=\"FoldEnrichment\" sortKey=\"fold\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"(Count/DESize) / (SetSize/UniverseSize). Ratio of observed to expected overlap. Values > 1 mean the term is over-represented in the input.\"/>\n <SortableTh label=\"pvalue\" sortKey=\"p\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"Raw upper-tail hypergeometric p-value: P(overlap ≥ observed) under the null that the input is a random sample from the universe.\"/>\n <SortableTh label=\"p.adjust\" sortKey=\"pAdj\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"Benjamini–Hochberg adjusted p-value, computed across all terms tested in this ontology section. Use this (not the raw p-value) for significance.\"/>\n </tr>\n </thead>\n <tbody>\n {sorted.map(r => (\n <TermRow\n key={`${r.ontology}:${r.term_id}`}\n row={r}\n showType={showType}\n onAddFilter={onAddFilter}\n />\n ))}\n </tbody>\n </table>\n )\n }\n </Accordion.Body>\n </Accordion.Item>\n );\n};\n\nconst TaxonPanel = ({ taxon, ontologyEnrichment, results, ui, onUiChange, onAddFilter }) => {\n if (!taxon) return <div className=\"oe-panel\"><em>Select a species on the left.</em></div>;\n const t = ontologyEnrichment.byTaxon[taxon];\n if (!t) return <div className=\"oe-panel\"><em>Initializing…</em></div>;\n if (t.fg.status === 'loading' || t.bg.status === 'loading' || t.fg.status === 'idle' || t.bg.status === 'idle') {\n return <div className=\"oe-panel oe-loading\"><em>Loading enrichment…</em></div>;\n }\n if (t.fg.status === 'error') return <div className=\"oe-panel\"><em>Foreground error: {t.fg.error}</em></div>;\n if (t.bg.status === 'error') return <div className=\"oe-panel\"><em>Background error: {t.bg.error}</em></div>;\n if (!results) return <div className=\"oe-panel\"><em>No data.</em></div>;\n\n const allBlocks = ui.ontology === 'all'\n ? Object.values(results)\n : (results[ui.ontology] ? [results[ui.ontology]] : []);\n // Hide ontologies that aren't used in this species at all.\n const blocks = allBlocks.filter(b => b.tested > 0);\n\n return (\n <div className=\"oe-panel\">\n <div className=\"oe-summary\">\n Foreground: <b>{t.fg.numFound.toLocaleString()}</b> genes ·\n Background: <b>{t.bg.numFound.toLocaleString()}</b> genes\n </div>\n <ControlsBar ui={ui} onChange={onUiChange} />\n <Accordion alwaysOpen defaultActiveKey={blocks.length === 1 ? blocks[0].ontology : undefined}>\n {blocks.map(b => (\n <OntologySection\n key={b.ontology}\n block={b}\n search={ui.search}\n onAddFilter={onAddFilter}\n />\n ))}\n </Accordion>\n </div>\n );\n};\n\nconst OntologyEnrichmentViewCmp = props => {\n const {\n grameneSearch,\n grameneMaps,\n grameneTaxonomy,\n ontologyEnrichment,\n ontologyEnrichmentUI: ui,\n ontologyEnrichmentResults: results,\n doSetOntologyEnrichmentActiveTaxon,\n doSetOntologyEnrichmentUI,\n doFetchOntologyEnrichmentForeground,\n doFetchOntologyEnrichmentBackground,\n doAcceptGrameneSuggestion\n } = props;\n\n const taxa = useMemo(() => {\n if (!grameneSearch || !grameneSearch.facet_counts) return [];\n const arr = grameneSearch.facet_counts.facet_fields.taxon_id || [];\n const ids = [];\n const counts = {};\n for (let i = 0; i < arr.length; i += 2) {\n ids.push(arr[i]);\n counts[arr[i]] = +arr[i + 1];\n }\n if (grameneMaps) {\n ids.sort((a, b) => {\n const ma = grameneMaps[a] || grameneMaps[speciesTaxonId(a)];\n const mb = grameneMaps[b] || grameneMaps[speciesTaxonId(b)];\n return ((ma && ma.left_index) || 0) - ((mb && mb.left_index) || 0);\n });\n }\n return ids.map(tid => ({ tid, count: counts[tid] }));\n }, [grameneSearch, grameneMaps]);\n\n const activeTaxon = ontologyEnrichment.activeTaxon;\n\n const [treeWidth, setTreeWidth] = useState(280);\n const beginResize = (e) => {\n e.preventDefault();\n const startX = e.clientX;\n const startWidth = treeWidth;\n const onMove = (ev) => {\n const next = Math.max(150, Math.min(800, startWidth + (ev.clientX - startX)));\n setTreeWidth(next);\n };\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'col-resize';\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n };\n\n useEffect(() => {\n if (taxa.length === 0) return;\n if (!activeTaxon || !taxa.find(t => String(t.tid) === String(activeTaxon))) {\n doSetOntologyEnrichmentActiveTaxon(taxa[0].tid);\n }\n }, [taxa, activeTaxon, doSetOntologyEnrichmentActiveTaxon]);\n\n useEffect(() => {\n if (!activeTaxon) return;\n const t = ontologyEnrichment.byTaxon[activeTaxon];\n if (!t) return;\n if (t.fg.status === 'idle') doFetchOntologyEnrichmentForeground(activeTaxon);\n if (t.bg.status === 'idle') doFetchOntologyEnrichmentBackground(activeTaxon);\n }, [activeTaxon, ontologyEnrichment, doFetchOntologyEnrichmentForeground, doFetchOntologyEnrichmentBackground]);\n\n if (taxa.length === 0) {\n return <div className=\"oe-view\"><em>No species in the current results.</em></div>;\n }\n if (!grameneTaxonomy) {\n return <div className=\"oe-view\"><em>Loading taxonomy…</em></div>;\n }\n\n const handleAddFilter = (row) => {\n if (!doAcceptGrameneSuggestion) return;\n const label = row.term_name\n ? `${row.term_display_id} ${row.term_name}`\n : row.term_display_id;\n doAcceptGrameneSuggestion({\n fq_field: row.field,\n fq_value: String(row.term_id),\n name: label,\n category: row.ontology_label\n });\n };\n\n return (\n <div className=\"oe-view oe-layout\">\n <div className=\"oe-layout-tree\" style={{ flex: `0 0 ${treeWidth}px` }}>\n <SpeciesTree\n taxonomy={grameneTaxonomy}\n grameneMaps={grameneMaps}\n taxa={taxa}\n activeTaxon={activeTaxon}\n onSelect={tid => doSetOntologyEnrichmentActiveTaxon(String(tid))}\n />\n </div>\n <div\n className=\"oe-splitter\"\n onMouseDown={beginResize}\n title=\"Drag to resize\"\n />\n <div className=\"oe-layout-panel\">\n <TaxonPanel\n taxon={activeTaxon ? String(activeTaxon) : null}\n ontologyEnrichment={ontologyEnrichment}\n results={results}\n ui={ui}\n onUiChange={doSetOntologyEnrichmentUI}\n onAddFilter={handleAddFilter}\n />\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectGrameneSearch',\n 'selectGrameneMaps',\n 'selectGrameneTaxonomy',\n 'selectOntologyEnrichment',\n 'selectOntologyEnrichmentUI',\n 'selectOntologyEnrichmentResults',\n 'doSetOntologyEnrichmentActiveTaxon',\n 'doSetOntologyEnrichmentUI',\n 'doFetchOntologyEnrichmentForeground',\n 'doFetchOntologyEnrichmentBackground',\n 'doAcceptGrameneSuggestion',\n OntologyEnrichmentViewCmp\n);\n","import React, { useMemo, useState } from 'react'\nimport { Button, Modal } from 'react-bootstrap'\nimport { connect } from \"redux-bundler-react\";\nimport { getFirebaseApp } from \"./utils\";\nimport { getAuth, onAuthStateChanged, signOut, GoogleAuthProvider, signInWithPopup } from \"firebase/auth\";\nimport { BsChevronDown, BsChevronRight } from 'react-icons/bs';\n\nconst provider = new GoogleAuthProvider();\n\nconst Auth = props => {\n const firebaseConfig = props.configuration && props.configuration.firebaseConfig;\n const auth = useMemo(() => {\n const app = getFirebaseApp(firebaseConfig);\n return app ? getAuth(app) : null;\n }, [firebaseConfig]);\n const [user, setUser] = useState({});\n const [open, setOpen] = useState(true);\n if (!auth) return null;\n onAuthStateChanged(auth, (user) => setUser(user));\n\n function handleLogin() {\n signInWithPopup(auth, provider)\n .then((result) => {\n setUser(result.user)\n }).catch((err) => {\n console.log(err)\n });\n }\n function handleLogout() {\n signOut(auth)\n .then(() => {\n setUser(null);\n }).catch((err) => {\n console.log(err)\n });\n }\n return (\n <div className={props.configuration.id === 'sorghum' ? 'sorghumbase-auth-container': 'gramene-auth-container'}>\n <div className=\"sidebar-section\">\n <div className=\"sidebar-section-header\" onClick={() => setOpen(!open)}>\n <b>Account</b>\n <span className=\"sidebar-section-actions\">\n <span className=\"sidebar-section-toggle\">\n {open ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n </span>\n </div>\n {open && <div className=\"sidebar-section-body\">\n <div>\n {user\n ? <Button size=\"sm\" variant=\"success\" onClick={handleLogout}>{user.displayName}</Button>\n : <Button size=\"sm\" variant=\"success\" onClick={handleLogin}>Login</Button>\n }\n </div>\n </div>}\n </div>\n </div>\n )\n}\n\nexport default connect(\n 'selectConfiguration',\n Auth\n)\n"],"names":[],"version":3,"file":"index.js.map"}
|
|
1
|
+
{"mappings":"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","sources":["src/components/results/Study.js","src/index.js","src/bundles/index.js","src/bundles/api.js","src/bundles/filters.js","src/bundles/views.js","src/bundles/docs.js","src/bundles/genomes.js","src/bundles/swaggerFields.js","src/fieldCatalog.overlay.json","src/vepStudyInfo.js","src/bundles/exporter.js","src/components/exporter/downloadRunner.js","src/components/exporter/formatters.js","src/components/exporter/expressionResolver.js","src/components/exporter/ancestorsResolver.js","src/bundles/ontologies.js","src/bundles/exprViz.js","src/bundles/ontologyEnrichment.js","src/components/resultList.js","src/components/resultSummary.js","src/components/suggestions.js","src/components/geneSearchUI.js","src/components/results/GeneList.js","src/components/results/details/Expression.js","src/components/results/details/Homology.js","src/components/results/details/generic.js","src/components/utils.js","src/components/results/details/Location.js","src/components/results/details/location/browser.js","src/components/results/details/location/dallianceBrowser.js","src/components/results/details/Pathways.js","src/components/results/details/VEP.js","src/components/results/details/Xrefs.js","src/components/results/details/Publications.js","src/components/results/details/Sequences.js","src/components/results/TaxDist.js","src/components/results/selection.js","src/components/results/HelpDemo.js","src/components/results/GeneAttribs.js","src/components/results/StatsByGroup.js","src/components/TaxonomyModal.js","src/components/results/Expression.js","src/components/results/UserGeneLists.js","src/components/exporter/ExporterView.js","src/components/exporter/FieldTree.js","src/components/exporter/Preview.js","src/components/exporter/CutoffsModal.js","src/components/exporter/ExportFooter.js","src/components/exprViz/ExprVizView.js","src/components/exprViz/FieldsModal.js","src/components/exprViz/ExprTable.js","src/components/exprViz/ParallelCoordsPlot.js","src/components/exprViz/HeatmapPlot.js","src/components/results/OntologyEnrichment.js","src/components/Auth.js"],"sourcesContent":["import React, { useState, useMemo } from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport { AgGridReact } from \"ag-grid-react\";\nimport \"ag-grid-community/styles/ag-grid.css\";\nimport \"ag-grid-community/styles/ag-theme-quartz.css\";\n\nconst metaRenderer = params => {\n if (params.value.ontology) {\n return <a href={`http://purl.obolibrary.org/obo/${params.value.id.replace(\":\",\"_\")}`} target='_blank'>{params.value.label}</a>\n }\n return params.value.label\n}\nconst sampleRenderer = params => {\n const sampleMeta = params.value;\n return (\n <label>\n <input\n type=\"checkbox\"\n checked={params.desiredSamples.hasOwnProperty(sampleMeta._id)}\n onChange={() => params.doToggleExpressionSample(sampleMeta._id)}\n />\n {sampleMeta.experiment}-{sampleMeta.group}\n </label>\n );\n // return JSON.stringify(sampleMeta,null,2);\n}\nconst connectedSampleRenderer = connect(\n 'selectDesiredSamples', // current set of samples to fetch expression data for\n 'doToggleExpressionSample',\n sampleRenderer\n);\nconst Study = props => {\n let samples = props.expressionSamples[props.id];\n let sampleMetadata = [];\n let metadataFields = [{ field: \"sampleId\", cellRenderer: connectedSampleRenderer }];\n let isFactor={};\n samples.forEach((sample, idx) => {\n if (idx === 0) {\n let factors = {\n headerName: 'Experimental Variables',\n children: []\n }\n sample.factor.forEach(factor => {\n factors.children.push({field: factor.type, cellRenderer: metaRenderer})\n isFactor[factor.type] = true;\n });\n metadataFields.push(factors);\n let characteristics = {\n headerName: 'Sample Characteristics',\n children: []\n }\n sample.characteristic.forEach(ch => {\n if (!isFactor[ch.type]) {\n characteristics.children.push({field: ch.type, cellRenderer: metaRenderer})\n }\n });\n metadataFields.push(characteristics)\n }\n let s_info = {sampleId: sample}\n sample.factor.forEach(factor => {\n s_info[factor.type] = {label: factor.label};\n if (factor.ontology) {\n s_info[factor.type]['ontology'] = factor.ontology\n s_info[factor.type]['id'] = factor.id;\n }\n })\n sample.characteristic.forEach(ch => {\n s_info[ch.type] = {label: ch.label};\n if (ch.ontology) {\n s_info[ch.type]['ontology'] = ch.ontology\n s_info[ch.type]['id'] = ch.id;\n }\n })\n sampleMetadata.push(s_info)\n })\n const [rowData, setRowData] = useState(sampleMetadata);\n const [colDefs, setColDefs] = useState(metadataFields);\n const defaultColDef = useMemo(() => {\n return {\n filter: true\n }\n }, []);\n return (\n <div>\n <div className=\"ag-theme-quartz\" style={{height: `${44 * (samples.length + 2)}px`}}>\n <AgGridReact rowData={rowData} columnDefs={colDefs} defaultColDef={defaultColDef}/>\n </div>\n <a href={`https://www.ebi.ac.uk/gxa/experiments/${props.id}`}>EBI Atlas Experiment: {props.id}</a>\n </div>\n );\n};\nexport default connect(\n 'selectExpressionSamples',\n Study);\n","import bundles from './bundles';\nimport resultList from './components/resultList';\nimport resultSummary from './components/resultSummary';\nimport suggestions from './components/suggestions';\nimport {Status, Filters, Results, Views, Auth} from './components/geneSearchUI';\n\nexport { bundles, resultList, resultSummary, suggestions, Status, Filters, Results, Views, Auth };\n","import apiBundles from './api'\nimport filterBundle from './filters'\nimport viewsBundle from './views'\nimport docsBundle from './docs'\nimport genomesBundle from './genomes'\nimport fieldCatalogBundle from './swaggerFields'\nimport exporterBundle from './exporter'\nimport ontologiesBundle from './ontologies'\nimport exprVizBundle from './exprViz'\nimport ontologyEnrichmentBundle from './ontologyEnrichment'\n\nexport default [...apiBundles, docsBundle, filterBundle, viewsBundle, genomesBundle, fieldCatalogBundle, exporterBundle, ontologiesBundle, exprVizBundle, ontologyEnrichmentBundle];\n","import { createAsyncResourceBundle, createSelector } from 'redux-bundler'\nimport _ from 'lodash'\nimport binsClient from \"gramene-bins-client\";\nimport treesClient from \"gramene-trees-client\";\nimport {build} from \"gramene-taxonomy-with-genomes\";\n\nconst facets = [\n \"{!facet.limit='300' facet.mincount='1' key='taxon_id'}taxon_id\",\n // \"{!facet.limit='100' facet.mincount='1' key='genetree'}gene_tree\",\n // \"{!facet.limit='100' facet.mincount='1' key='pathways'}pathways__ancestors\",\n // \"{!facet.limit='100' facet.mincount='1' key='domains'}domain_roots\",\n \"{!facet.limit='-1' facet.mincount='1' key='fixed_1000__bin'}fixed_1000__bin\",\n \"{!facet.limit='100' facet.mincount='0' key='AED' type='range' start=0 end=1.0 gap=0.01}MAKER__AED__attr_f\"\n];\nconst genomesOfInterest = '(taxon_id:2769) OR (taxon_id:3055) OR (taxon_id:3218) OR (taxon_id:3702) OR (taxon_id:3847) OR (taxon_id:4555) OR (taxon_id:4558) OR (taxon_id:4577) OR (taxon_id:13333) OR (taxon_id:15368) OR (taxon_id:29760) OR (taxon_id:39947) OR (taxon_id:55577) OR (taxon_id:88036) OR (taxon_id:214687)';\nconst sites = ['main','oryza','maize','sorghum','grapevine'];\nconst grameneSuggestions = createAsyncResourceBundle( {\n name: 'grameneSuggestions',\n actionBaseType: 'GRAMENE_SUGGESTIONS',\n persist: false,\n getPromise: ({store}) => {\n const t = store.selectSuggestionsQuery().replaceAll(':',' ').trim();\n const g = store.selectGrameneGenomes();\n const q = `/suggest?q={!boost b=relevance}name:${t}^5 ids:${t}^5 ids:${t}*^3 synonym:${t}^3 synonym:${t}*^2 text:${t}*^1`;\n // const promises = sites.map(site => fetch(`https://data.gramene.org/${site}${q}`));\n // return Promise.all(promises)\n return fetch(store.selectGrameneAPI() + q)\n .then(res => {\n return res.json()\n })\n .then(suggestions => {\n if (Object.keys(g.active).length > 0) {\n suggestions.grouped.category.groups.forEach(group => {\n group.doclist.docs.forEach(sugg => {\n sugg.num_genes = 0;\n sugg.taxon_id.forEach((id,idx) => {\n if (g.active[id] && !g.active[id].hidden) {\n sugg.num_genes += sugg.taxon_freq[idx]\n }\n })\n })\n })\n }\n return suggestions\n })\n }\n});\n\ngrameneSuggestions.reactGrameneSuggestions = createSelector(\n 'selectGrameneSuggestionsShouldUpdate',\n 'selectSuggestionsQuery',\n (shouldUpdate, queryString) => {\n if (shouldUpdate && queryString) {\n return { actionCreator: 'doFetchGrameneSuggestions' }\n }\n }\n);\n\ngrameneSuggestions.selectGrameneSuggestionsStatus = createSelector(\n 'selectGrameneSuggestionsShouldUpdate',\n 'selectGrameneSuggestionsIsLoading',\n 'selectGrameneSuggestionsRaw',\n 'selectSuggestionsQuery',\n (shouldUpdate, isLoading, suggestionsRaw, queryString) => {\n if (!queryString) return '';\n if (shouldUpdate) return 'update needed';\n if (isLoading) return 'loading';\n if (suggestionsRaw.data) return suggestionsRaw.data.grouped.category.matches + ' terms';\n console.error(suggestionsRaw)\n return 'error';\n }\n);\n\ngrameneSuggestions.selectGrameneSuggestionsReady = createSelector(\n 'selectGrameneSuggestionsStatus',\n (status) => {\n const regex = RegExp('terms$');\n return regex.test(status);\n }\n);\n\ngrameneSuggestions.doFocusFirstGrameneSuggestion = arg => ({dispatch, getState}) => {\n console.log('inside doFocusFirstGrameneSuggestion');\n};\n\nfunction compressLongTaxonName(node) {\n const fullName = node.name;\n const removedExtraineousWords = fullName.replace(/( Group$| subsp\\.| ssp\\.| var\\.| strain)/, '');\n let finalVersion;\n if (removedExtraineousWords.length > 20) {\n let words = removedExtraineousWords.split(' ');\n if (words.length === 2) {\n // abrreviate first word.\n finalVersion = removedExtraineousWords.replace(/^([A-Z])[a-z]+/, '$1.')\n }\n if (words.length > 2) {\n finalVersion = removedExtraineousWords.replace(/^([A-Z])[a-z]+\\s([a-z])[a-z]+/, '$1$2.')\n }\n }\n else {\n finalVersion = removedExtraineousWords;\n }\n node.short_name = finalVersion;\n}\n\nconst grameneTaxonomy = createAsyncResourceBundle({\n name: 'grameneTaxonomy',\n actionBaseType: 'GRAMENE_TAXONOMY',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/taxonomy?subset=gramene&rows=-1`)\n .then(res => res.json())\n .then(taxNodes => {\n let taxonomy = _.keyBy(taxNodes, '_id');\n taxNodes.forEach(t => {\n t._id = +t._id; // ensure taxonomy id is a number\n compressLongTaxonName(t);\n if (t.hasOwnProperty(\"is_a\")) {\n t.is_a.forEach(p_id => {\n const p = taxonomy[p_id];\n if (!p.hasOwnProperty('children')) p.children = [];\n p.children.push(t._id)\n })\n }\n });\n return taxonomy\n })\n }\n});\ngrameneTaxonomy.reactGrameneTaxonomy = createSelector(\n 'selectGrameneTaxonomyShouldUpdate',\n (shouldUpdate) => {\n if (shouldUpdate) {\n return { actionCreator: 'doFetchGrameneTaxonomy' }\n }\n }\n);\nconst grameneMaps = createAsyncResourceBundle({\n name: 'grameneMaps',\n actionBaseType: 'GRAMENE_MAPS',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/maps?rows=-1`)\n .then(res => res.json())\n .then(maps => {\n maps.forEach(m => {\n m.regionLength = {};\n m.regions.names.forEach((rname,idx) => {\n m.regionLength[rname] = m.regions.lengths[idx]\n })\n })\n return _.keyBy(maps, 'taxon_id');\n })\n }\n});\ngrameneMaps.reactGrameneMaps = createSelector(\n 'selectGrameneMapsShouldUpdate',\n (shouldUpdate) => {\n if (shouldUpdate) {\n return { actionCreator: 'doFetchGrameneMaps' }\n }\n }\n);\n\nconst expressionStudies = createAsyncResourceBundle( {\n name: 'expressionStudies',\n actionBaseType: 'EXPRESSION_STUDIES',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/experiments?rows=-1`)\n .then(res => res.json())\n .then(res => _.groupBy(res, 'taxon_id'))\n }\n});\n// Only fetch when a view that consumes expression studies is enabled.\nconst EXPRESSION_VIEWS = ['exprViz', 'expression', 'export'];\nexpressionStudies.reactExpressionStudies = createSelector(\n 'selectExpressionStudiesShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !EXPRESSION_VIEWS.some(id => viewsOn.has(id))) return;\n return { actionCreator: 'doFetchExpressionStudies' }\n }\n);\n\nconst expressionSamples = createAsyncResourceBundle( {\n name: 'expressionSamples',\n actionBaseType: 'EXPRESSION_SAMPLES',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/assays?rows=-1`)\n .then(res => res.json())\n .then(samples => _.groupBy(samples, 'experiment'))\n .then(studies => {\n Object.keys(studies).forEach(study => {\n studies[study].forEach(sample => {\n sample.order = +sample.group.replace('g','')\n });\n studies[study].sort((a,b) => a.order - b.order);\n })\n return studies\n })\n }\n});\nexpressionSamples.reactExpressionSamples = createSelector(\n 'selectExpressionSamplesShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !EXPRESSION_VIEWS.some(id => viewsOn.has(id))) return;\n return { actionCreator: 'doFetchExpressionSamples' }\n }\n);\n\nconst curatedGenes = createAsyncResourceBundle( {\n name: 'curatedGenes',\n actionBaseType: 'CURATED_GENES',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`https://devdata.gramene.org/curation/curations?rows=0&minFlagged=0&since=12-12-2029`)\n .then(res => res.json())\n .then(curation => _.keyBy(curation.genes, 'gene_id'))\n }\n});\n// Curated annotations are consumed by GeneList rows and Homology details,\n// both inside the gene-list view.\ncuratedGenes.reactCuratedGenes = createSelector(\n 'selectCuratedGenesShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !viewsOn.has('list')) return;\n return { actionCreator: 'doFetchCuratedGenes' }\n }\n);\n\nconst grameneGermplasm = createAsyncResourceBundle( {\n name: 'grameneGermplasm',\n actionBaseType: 'GRAMENE_GERMPLASM',\n persist: true,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/germplasm?rows=-1`)\n .then(res => res.json())\n .then(res => {\n res.forEach(g => {\n if (!g.subpop) {\n g.subpop = \"?\"\n }\n });\n return _.groupBy(res, 'ens_id')\n })\n }\n});\n// Germplasm metadata is consumed by the VEP detail panel inside the gene list.\ngrameneGermplasm.reactGrameneGermplasm = createSelector(\n 'selectGrameneGermplasmShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !viewsOn.has('list')) return;\n return { actionCreator: 'doFetchGrameneGermplasm' }\n }\n);\n//\n// const grameneExpressionAssays = createAsyncResourceBundle( {\n// name: 'grameneExpressionAssays',\n// actionBaseType: 'GRAMENE_EXPRESSION_ASSAYS',\n// persist: true,\n// getPromise: ({store}) => {\n// return fetch(`${store.selectGrameneAPI()}/assays?rows=-1`)\n// .then(res => res.json())\n// .then(res => {\n// let expr={};\n// res.forEach(assay => {\n// if (!expr.hasOwnProperty(assay.taxon_id)) {\n// expr[assay.taxon_id] = {};\n// }\n// if (!expr[assay.taxon_id].hasOwnProperty(assay.experiment)) {\n// expr[assay.taxon_id][assay.experiment] = [];\n// }\n// assay.order = +assay.group.replace('g','');\n// expr[assay.taxon_id][assay.experiment].push(assay);\n// });\n// // sort each experiment\n// for (const tid in expr) {\n// for (const exp in expr[tid]) {\n// expr[tid][exp].sort((a,b) => a.order - b.order);\n// }\n// }\n// return expr;\n// })\n// }\n// });\n// grameneExpressionAssays.reactGrameneExpressionAssays = createSelector(\n// 'selectGrameneExpressionAssaysShouldUpdate',\n// (shouldUpdate) => {\n// if (shouldUpdate) {\n// return { actionCreator: 'doFetchGrameneExpressionAssays' }\n// }\n// }\n// );\n\nconst MAKERAttribs = [\n 'MAKER__AED__attr_f',\n 'MAKER__QI1__attr_i',\n 'MAKER__QI2__attr_f',\n 'MAKER__QI3__attr_f',\n 'MAKER__QI4__attr_f',\n 'MAKER__QI5__attr_f',\n 'MAKER__QI6__attr_f',\n 'MAKER__QI7__attr_i',\n 'MAKER__QI8__attr_i',\n 'MAKER__QI9__attr_i'\n];\nconst geneAttribs = {\n \"MAKER transcript metrics\" : [\n { name: \"AED\", description: \"Annotation Edit Distance\", dtype: \"f\", fieldName: \"MAKER__AED__attr_f\" },\n { name: \"QI1\", description: \"Length of the 5' UTR\", dtype: \"i\", fieldName: \"MAKER__QI1__attr_i\" },\n { name: \"QI2\", description: \"Fraction of splice sites confirmed by an EST alignment\", dtype: \"f\", fieldName: \"MAKER__QI2__attr_f\" },\n { name: \"QI3\", description: \"Fraction of exons that overlap an EST alignment\", dtype: \"f\", fieldName: \"MAKER__QI3__attr_f\" },\n { name: \"QI4\", description: \"Fraction of exons that overlap EST or Protein alignments\", dtype: \"f\", fieldName: \"MAKER__QI4__attr_f\" },\n // { name: \"QI5\", description: \"Fraction of splice sites confirmed by a SNAP prediction\", dtype: \"f\", fieldName: \"MAKER__QI5__attr_f\" },\n // { name: \"QI6\", description: \"Fraction of exons that overlap a SNAP prediction\", dtype: \"f\", fieldName: \"MAKER__QI6__attr_f\" },\n { name: \"QI7\", description: \"Number of exons in the mRNA\", dtype: \"i\", fieldName: \"MAKER__QI7__attr_i\" },\n { name: \"QI8\", description: \"Length of the 3' UTR\", dtype: \"i\", fieldName: \"MAKER__QI8__attr_i\" },\n { name: \"QI9\", description: \"Length of the protein sequence produced by the mRNA\", dtype: \"i\", fieldName: \"MAKER__QI9__attr_i\" }\n ]\n}\nconst statsFields = geneAttribs['MAKER transcript metrics'].map(\n // (f) => `stats.field={!min=true max=true count=true mean=true stddev=true percentiles='20,40,60,80,90,95,99'}${f}`\n (f) => `stats.field={!min=true max=true count=true mean=true stddev=true percentiles='10,20,30,40,50,60,70,80,90,99.99'}${f.fieldName}`\n);\n\nconst grameneGeneAttribs = createAsyncResourceBundle( {\n name: 'grameneGeneAttribs',\n actionBaseType: 'GRAMENE_GENE_ATTRIBS',\n persist: false,\n getPromise: ({store}) => {\n return fetch(`${store.selectGrameneAPI()}/geneAttributes`).then(res => geneAttribs)\n }\n});\ngrameneGeneAttribs.reactGrameneGeneAttribs = createSelector(\n 'selectGrameneGeneAttribsShouldUpdate',\n 'selectGrameneFiltersStatus',\n 'selectGrameneViewsOn',\n (shouldUpdate, status, viewsOn) => {\n if (!shouldUpdate) return;\n if (status !== 'finished' && status !== 'ready') return;\n if (!viewsOn || !viewsOn.has('attribs')) return;\n return { actionCreator: 'doFetchGrameneGeneAttribs' }\n }\n);\n\nconst grameneSearch = createAsyncResourceBundle({\n name: 'grameneSearch',\n actionBaseType: 'GRAMENE_SEARCH',\n persist: false,\n getPromise: ({store}) => {\n const offset = store.selectGrameneSearchOffset();\n const rows = store.selectGrameneSearchRows();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys((g && g.active) || {}).filter(tid => m[tid] && !m[tid].hidden);\n let fq='';\n if (taxa.length) {\n console.log('search add a fq for ',taxa);\n fq = `&fq=taxon_id:(${taxa.join(' OR ')})`;\n }\n // return fetch(`${store.selectGrameneAPI()}/search?q=${store.selectGrameneFiltersQueryString()}&facet.field=${facets}&rows=${rows}&start=${offset}${fq}&stats=true&${statsFields.join('&')}`)\n return fetch(`${store.selectGrameneAPI()}/search?q=${store.selectGrameneFiltersQueryString()}&facet.field=${facets}&rows=${rows}&start=${offset}${fq}`)\n .then(res => res.json())\n .then(res => {\n res.response.docs.forEach(d => {\n d.can_show = {};\n d.capabilities.forEach(c => {\n d.can_show[c]=true;\n })\n });\n return res;\n })\n }\n});\ngrameneSearch.reactGrameneSearch = createSelector(\n 'selectGrameneSearchShouldUpdate',\n 'selectGrameneFiltersStatus',\n 'selectGrameneGenomes',\n (shouldUpdate, status, genomes) => {\n if (shouldUpdate && status === 'search' && genomes) {\n return { actionCreator: 'doFetchGrameneSearch' }\n }\n }\n);\n\nfunction formatFacetCountsForViz(a) {\n let res = {\n count: a.length/2,\n displayName: \"fixed_1000__bin\",\n data: {},\n sorted: []\n };\n let counts = [];\n for(let i=0;i<a.length;i+=2) {\n const fc = {\n id: +a[i],\n count: +a[i+1]\n };\n res.data[a[i]] = fc;\n counts.push(fc);\n }\n res.sorted = counts.sort((a,b) => a.id - b.id);\n return res;\n}\n\n// bundle to prepare data for the TaxDist component\nconst grameneTaxDist = {\n name: 'grameneTaxDist',\n getReducer: () => {\n const initialState = {};\n return (state = initialState, {type, payload}) => {\n return state;\n }\n },\n selectGrameneTaxDist: createSelector(\n 'selectGrameneSearch',\n 'selectGrameneTaxonomy',\n 'selectGrameneMaps',\n (grameneSearch,grameneTaxonomy,grameneMaps) => {\n if (grameneSearch && grameneTaxonomy && grameneMaps) {\n _.forIn(grameneMaps, (map, tid) => {\n grameneTaxonomy[tid].name = map.display_name;\n });\n const binnedResults = formatFacetCountsForViz(grameneSearch.facet_counts.facet_fields.fixed_1000__bin);\n let speciesTree = treesClient.taxonomy.tree(Object.values(grameneTaxonomy));\n let binMapper = binsClient.bins(grameneMaps);\n let taxDist = build(binMapper, speciesTree);\n taxDist.setBinType('fixed',1000);\n taxDist.setResults(binnedResults);\n return taxDist;\n }\n return null;\n }\n )\n};\n\n// this query will give the sorghum orthologs of AT1G01260\n// want to provide these on non-sorghum genes if available\n// http://data.gramene.org/search?q=homology__all_orthologs:AT1G01260&fq=taxon_id:4558&fl=id\nconst grameneOrthologs = {\n name: 'grameneOrthologs',\n getReducer: () => {\n const initialState = {};\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_ORTHOLOGS_REQUESTED':\n if (!state.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState[payload] = [];\n return newState;\n }\n break;\n case 'GRAMENE_ORTHOLOGS_RECEIVED':\n return Object.assign({}, state, payload);\n }\n return state;\n }\n },\n doRequestOrthologs: geneId => ({dispatch, store}) => {\n const orthologs = store.selectGrameneOrthologs();\n if (!orthologs.hasOwnProperty(geneId)) {\n dispatch({type: 'GRAMENE_ORTHOLOGS_REQUESTED', payload: geneId});\n const API = store.selectGrameneAPI();\n const taxonId = store.selectTargetTaxonId();\n fetch(`${API}/search?q=homology__all_orthologs:${geneId}&fq=taxon_id:${taxonId}&fl=id`)\n .then(res => res.json())\n .then(res => {\n let newOrthologs = {};\n newOrthologs[geneId] = res.response.docs.map(d => d.id);\n dispatch({type: 'GRAMENE_ORTHOLOGS_RECEIVED', payload: newOrthologs})\n })\n }\n },\n selectGrameneOrthologs: state => state.grameneOrthologs\n};\n\nconst grameneParalogs = {\n name: 'grameneParalogs',\n getReducer: () => {\n const initialState = {};\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_PARALOGS_REQUESTED':\n if (!state.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState[payload] = [];\n return newState;\n }\n break;\n case 'GRAMENE_PARALOGS_RECEIVED':\n return Object.assign({}, state, payload);\n }\n return state;\n }\n },\n doRequestParalogs: (geneId,supertree,taxon_id) => ({dispatch, store}) => {\n const paralogs = store.selectGrameneParalogs();\n if (!paralogs.hasOwnProperty(geneId)) {\n dispatch({type: 'GRAMENE_PARALOGS_REQUESTED', payload: geneId});\n const API = store.selectGrameneAPI();\n const q= supertree ? `supertree_attr_s:${supertree}` : `homology__within_species_paralog:${geneId}`;\n fetch(`${API}/search?q=${q}&rows=1000&fq=taxon_id:${taxon_id}`)\n .then(res => res.json())\n .then(res => {\n let newParalogs = {};\n newParalogs[geneId] = res.response.numFound > 0 ? res.response.docs.map(d => d.id) : [geneId];\n dispatch({type: 'GRAMENE_PARALOGS_RECEIVED', payload: newParalogs})\n })\n }\n },\n selectGrameneParalogs: state => state.grameneParalogs\n};\n\n// function selectFacetIDs(store, field) {\n// const path = `grameneGenes.data.facet_counts.facet_fields.${field}`;\n// if (_.has(store,path)) {\n// const flat_facets = _.get(store,path);\n// let idList = [];\n// if (isNaN(+flat_facets[0])) {\n// for (let i = 0; i < flat_facets.length; i += 2) {\n// idList.push(flat_facets[i])\n// }\n// }\n// else {\n// for (let i = 0; i < flat_facets.length; i += 2) {\n// idList.push(+flat_facets[i])\n// }\n// if (idList.length === 1) idList.push(0);\n// }\n// return idList;\n// }\n// }\n//\n// grameneGenes.selectDomainFacets = store => selectFacetIDs(store, 'domains');\n// grameneGenes.selectPathwayFacets = store => selectFacetIDs(store, 'pathways');\n// grameneGenes.selectTaxonomyFacets = store => selectFacetIDs(store, 'taxon_id');\n//\n// const grameneDomains = createAsyncResourceBundle({\n// name: 'grameneDomains',\n// actionBaseType: 'GRAMENE_DOMAINS',\n// persist: false,\n// getPromise: ({store}) =>\n// fetch(`${store.selectGrameneAPI()}/domains?rows=-1&idList=${store.selectDomainFacets().join(',')}`)\n// .then(res => res.json())\n// .then(docs => {return {domains: docs, numFound: docs.length}})\n// });\n//\n// const gramenePathways = createAsyncResourceBundle({\n// name: 'gramenePathways',\n// actionBaseType: 'GRAMENE_PATHWAYS',\n// persist: false,\n// getPromise: ({store}) =>\n// fetch(`${store.selectGrameneAPI()}/pathways?rows=-1&idList=${store.selectPathwayFacets().join(',')}`)\n// .then(res => res.json())\n// .then(docs => {return {pathways: docs, numFound: docs.length}})\n// });\n//\n// const grameneTaxonomy = createAsyncResourceBundle({\n// name: 'grameneTaxonomy',\n// actionBaseType: 'GRAMENE_TAXONOMY',\n// persist: false,\n// getPromise: ({store}) =>\n// fetch(`${store.selectGrameneAPI()}/taxonomy?rows=-1&idList=${store.selectTaxonomyFacets().join(',')}`)\n// .then(res => res.json())\n// .then(docs => {return {taxonomy: docs, numFound: docs.length}})\n// });\n\n\nexport default [grameneSuggestions, grameneSearch, grameneGeneAttribs, grameneMaps, grameneTaxonomy, grameneTaxDist, grameneOrthologs, grameneParalogs, curatedGenes, grameneGermplasm, expressionSamples, expressionStudies];\n","import {createSelector} from \"redux-bundler\";\nimport _ from 'lodash';\nimport ReactGA from 'react-ga4'\nconst MAX_IDLIST_LENGTH = 20;\n\nfunction findNodeWithLeftIdx(node, idx) {\n if (node.leftIdx === idx) {\n return node;\n }\n let result=null;\n if (node.leftIdx < idx && node.hasOwnProperty('children')) {\n node.children.forEach(child => {\n if (child.rightIdx > idx) {\n child.parentIdx = node.leftIdx;\n const res = findNodeWithLeftIdx(child, idx);\n if (res) result = res;\n }\n })\n }\n return result;\n}\n\nfunction markSubtree(node, source, invert) {\n node.marked = (node.leftIdx >= source.leftIdx && node.rightIdx <= source.rightIdx);\n if (invert) node.marked = !node.marked;\n if (node.hasOwnProperty('children')) {\n node.children.forEach(child => {\n markSubtree(child, source, invert);\n })\n }\n}\n\nfunction reindexTree(node, idx) {\n node.leftIdx = idx;\n idx++;\n if (node.hasOwnProperty('children')) {\n node.children.forEach(child => {\n idx = reindexTree(child, idx);\n });\n }\n node.rightIdx = idx;\n idx++;\n return idx;\n}\n\nconst grameneFilters = {\n name: 'grameneFilters',\n getReducer: () => {\n const initialState = {\n status: 'init', // others include 'search', 'waiting' and 'ready'\n operation: 'AND',\n negate: false,\n marked: false,\n leftIdx: 0,\n rightIdx: 1,\n children: [],\n showMarked: false,\n showMenu: false,\n moveCopyMode: '',\n searchOffset: 0,\n rows: 20\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_FILTERS_CLEARED': {\n newState = Object.assign({}, initialState, {\n status: 'search',\n children: []\n });\n return newState;\n }\n case 'GRAMENE_FILTER_ADDED': {\n const idx = state.rightIdx;\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n rightIdx: idx + 2,\n searchOffset: 0\n });\n let child = _.pick(payload, ['fq_field', 'fq_value', 'name', 'category']);\n child.leftIdx = idx;\n child.rightIdx = idx + 1;\n child.negate = false;\n child.showMenu = false;\n newState.children.push(child);\n markSubtree(newState, child, false);\n return newState;\n }\n case 'GRAMENE_FILTER_TREE_ADDED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n rightIdx: payload.rightIdx + 1,\n searchOffset: 0\n });\n newState.children.push(payload);\n markSubtree(newState, payload, false);\n return newState;\n }\n case 'GRAMENE_FILTER_SET_ADDED': {\n // create a filter with the payload.operation and children payload.filters\n let filter = {\n leftIdx: state.rightIdx,\n rightIdx: state.rightIdx + (payload.filters.length) * 2 + 1,\n operation: payload.operation,\n negate: false,\n showMenu: false,\n children: payload.filters\n };\n if (payload.warning) {\n filter.warning = payload.warning\n }\n let nextIdx = filter.leftIdx+1;\n payload.filters.forEach(f => {\n f.leftIdx = nextIdx++;\n f.rightIdx = nextIdx++;\n f.negate = false;\n f.showMenu = false;\n });\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0,\n rightIdx: filter.rightIdx + 1\n });\n newState.children.push(filter);\n markSubtree(newState, filter, false);\n return newState;\n }\n case 'GRAMENE_FILTER_NEGATED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0\n });\n let node = findNodeWithLeftIdx(newState, payload.leftIdx);\n if (node) {\n node.negate = !node.negate;\n markSubtree(newState, node, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_DELETED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0\n });\n let node = findNodeWithLeftIdx(newState, payload.leftIdx);\n if (node) {\n let parent = findNodeWithLeftIdx(newState, node.parentIdx);\n parent.children = parent.children.filter(child => child.leftIdx !== node.leftIdx);\n reindexTree(newState, 0);\n markSubtree(newState, parent, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_OPERATION_CHANGED': {\n if (payload.hasOwnProperty('operation')) {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n searchOffset: 0\n });\n let node = findNodeWithLeftIdx(newState, payload.leftIdx);\n node.operation = node.operation === 'AND' ? 'OR' : 'AND';\n markSubtree(newState, node, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_MOVED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n moveCopyMode: '',\n searchOffset: 0\n });\n let source = findNodeWithLeftIdx(newState, payload.source.leftIdx);\n let target = findNodeWithLeftIdx(newState, payload.target.leftIdx);\n if (source && target) {\n source.showMenu = false;\n let parent = findNodeWithLeftIdx(newState, source.parentIdx);\n parent.children = parent.children.filter(child => child.leftIdx !== source.leftIdx);\n target.showMenu = false;\n if (!target.hasOwnProperty('children')) {\n let targetCopy = Object.assign({}, target);\n target.children = [targetCopy];\n target.operation = 'OR';\n target.negate = false;\n delete target.fq_field;\n delete target.fq_value;\n delete target.name;\n delete target.category;\n }\n target.children.push(source);\n reindexTree(newState, 0);\n markSubtree(newState, target, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_COPIED': {\n newState = Object.assign({}, state, {\n status: 'search',\n showMarked: true,\n moveCopyMode: '',\n searchOffset: 0\n });\n let source = findNodeWithLeftIdx(newState, payload.source.leftIdx);\n let target = findNodeWithLeftIdx(newState, payload.target.leftIdx);\n if (source && target) {\n source.showMenu = false;\n if (!target.hasOwnProperty('children')) {\n let targetCopy = Object.assign({}, target);\n target.children = [targetCopy];\n target.operation = 'OR';\n target.negate = false;\n delete target.fq_field;\n delete target.fq_value;\n delete target.name;\n delete target.category;\n }\n let sourceCopy = Object.assign({}, source);\n target.children.push(sourceCopy);\n reindexTree(newState, 0);\n markSubtree(newState, target, false);\n return newState;\n }\n break;\n }\n case 'GRAMENE_FILTER_TARGETS_MARKED':\n newState = Object.assign({}, state, {\n showMarked: true,\n moveCopyMode: payload.mode,\n moveCopySource: payload.source\n });\n markSubtree(newState, payload.source, true);\n return newState;\n case 'GRAMENE_FILTER_TARGETS_UNMARKED':\n newState = Object.assign({}, state, {\n showMarked: false\n });\n return newState;\n case 'GRAMENE_FILTERS_REPLACED':\n payload.status = 'search';\n payload.searchOffset = 0;\n return payload;\n case 'GRAMENE_FILTERS_STATUS_CHANGED':\n if (!(state.status === 'ready' && payload === 'waiting')) {\n return Object.assign({}, state, {status: payload})\n }\n break;\n case 'GRAMENE_FILTERS_SET_SHOW_MARKED':\n return Object.assign({}, state, {showMarked: payload});\n case 'GRAMENE_FILTER_MENU_TOGGLED':\n payload.showMenu = !payload.showMenu;\n return Object.assign({}, state);\n case 'GRAMENE_SEARCH_PAGE_REQUESTED':\n return Object.assign({}, state, {status: 'search', searchOffset: payload * state.rows});\n case 'GRAMENE_SEARCH_FETCH_STARTED':\n return Object.assign({}, state, {status: 'loading'});\n case 'GRAMENE_SEARCH_FETCH_FINISHED':\n return Object.assign({}, state, {status: 'finished'});\n case 'GRAMENE_GENOMES_UPDATED':\n if (state.status === 'ready') {\n return Object.assign({}, state, {status: 'search'});\n }\n case 'URL_UPDATED':\n if (state.status === 'ready') {\n return Object.assign({}, initialState, {children:[]})\n }\n break;\n case 'APP_IDLE':\n if (state.showMarked) {\n return Object.assign({}, state, {showMarked: false})\n }\n }\n return state;\n }\n },\n doNegateGrameneFilter: filter => ({dispatch, getState}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_NEGATED', payload: filter}\n ]\n })\n },\n doDeleteGrameneFilter: filter => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_TAXONOMY_CLEARED'},\n {type: 'GRAMENE_FILTER_DELETED', payload: filter}\n ]\n })\n },\n doChangeGrameneFilterOperation: filter => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_OPERATION_CHANGED', payload: filter}\n ]\n })\n },\n doMoveOrCopyGrameneFilter: (target) => ({dispatch, getState}) => {\n const state = getState();\n if (state.grameneFilters.moveCopyMode) {\n const source = state.grameneFilters.moveCopySource;\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: `GRAMENE_FILTER_${state.grameneFilters.moveCopyMode.toUpperCase()}D`, payload: {source, target}}\n ]\n })\n }\n },\n doCopyGrameneFilter: (source, target) => ({dispatch, getState}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_COPIED', payload: {source, target}}\n ]\n })\n },\n doMarkGrameneFilterTargets: (source, mode) => ({dispatch}) => {\n dispatch({type: 'GRAMENE_FILTER_TARGETS_MARKED', payload: {source:source, mode:mode}})\n },\n doUnmarkGrameneFilterTargets: () => ({dispatch}) => {\n dispatch({type: 'GRAMENE_FILTER_TARGETS_UNMARKED'})\n },\n doAcceptGrameneSuggestion: suggestion => ({dispatch, getState}) => {\n if (!suggestion.name) {\n suggestion.name = suggestion.display_name;\n }\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_ADDED', payload: suggestion}\n ]\n })\n },\n doAddGrameneRangeQuery: terms => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_SET_ADDED', payload: {operation: 'AND', filters: terms}}\n ]\n })\n },\n doToggleGrameneFilterMenu: node => ({dispatch}) => {\n dispatch({type: 'GRAMENE_FILTER_MENU_TOGGLED', payload: node})\n },\n doRequestResultsPage: page => ({dispatch}) => {\n dispatch(\n {type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_SEARCH_PAGE_REQUESTED', payload: page}\n ]\n })\n },\n doReplaceGrameneFilters: filters => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTERS_REPLACED', payload: filters}\n ]\n })\n },\n doClearGrameneFilters: () => ({dispatch}) => {\n dispatch({\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTERS_CLEARED'}\n ]\n })\n },\n selectGrameneFilters: state => state.grameneFilters,\n selectGrameneFiltersStatus: state => state.grameneFilters.status,\n selectGrameneFiltersQueryString: state => {\n const hasSpaces = new RegExp(/^[^\\[\\(].*\\s/);\n const isQuery = new RegExp(/\\([a-zA-Z0-9_]+:[a-zA-Z0-9_]+\\s/);\n const isRegionQuery = new RegExp(/^\\(map:/);\n const idWithColon = new RegExp(/^[a-zA-Z0-9_]+:[a-zA-Z0-9_]+$/);\n function getQuery(node) {\n const negate = node.negate ? 'NOT ' : '';\n if (node.hasOwnProperty('children')) {\n // do some recursion\n return `${negate}(${node.children.map(c => getQuery(c)).sort().join(` ${node.operation} `)})`\n }\n else {\n // this node is a suggestion\n if (node.fq_field === 'location' && isRegionQuery.test(node.fq_value))\n return `${negate}${node.fq_value}`\n if (isQuery.test(node.fq_value))\n return `${negate}${node.fq_value.replace(/:/g,'\\\\:')}`;\n if (hasSpaces.test(node.fq_value))\n return `${negate}${node.fq_field}:\"${node.fq_value}\"`;\n else if (idWithColon.test(node.fq_value))\n return `${negate}${node.fq_field}:${node.fq_value.replace(/:/g,'\\\\:')}`;\n else\n return `${negate}${node.fq_field}:${node.fq_value}`\n }\n }\n if (state.grameneFilters.rightIdx === 1) {\n return '*:*';\n }\n return `*:* AND (${getQuery(state.grameneFilters)})`;\n },\n selectGrameneSearchOffset: state => state.grameneFilters.searchOffset,\n selectGrameneSearchRows: state => state.grameneFilters.rows\n};\n\nconst handleIdList = (queryObject) => {\n let actions = [{type: 'GRAMENE_SEARCH_CLEARED'}];\n let ids = _.uniq(queryObject.idList.split(','));\n let warning = null;\n if (ids.length > MAX_IDLIST_LENGTH) {\n ids = _.slice(ids, 0, MAX_IDLIST_LENGTH);\n warning = `The idList query parameter is limited to ${MAX_IDLIST_LENGTH} genes`\n }\n let filters = ids.map((id,idx) => {\n return {\n category: 'Gene',\n name: id,\n fq_field: 'id',\n fq_value: id\n }\n });\n if (filters.length === 1) {\n actions.push({type: 'GRAMENE_FILTER_ADDED', payload: filters[0]})\n }\n else {\n let action = {type: 'GRAMENE_FILTER_SET_ADDED', payload: {operation: 'OR', filters:filters}};\n if (warning) {\n action.payload.warning = warning\n }\n actions.push(action)\n }\n return { type: 'BATCH_ACTIONS', actions: actions };\n};\n\ngrameneFilters.reactGrameneFilters = createSelector(\n 'selectQueryObject',\n 'selectGrameneFilters',\n 'selectActiveGenomes',\n 'selectUrlObject',\n (queryObject, filters, genomes, myUrl) => {\n if (filters.status === 'init') {\n if (queryObject.filters) {\n const newFilters = JSON.parse(queryObject.filters);\n let actions = [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTERS_REPLACED', payload: newFilters}\n ];\n if (queryObject.genomes) {\n let active={};\n queryObject.genomes.split(',').forEach(t => {\n active[t]=true\n });\n actions.push({type: 'GRAMENE_GENOMES_UPDATED', payload: active});\n }\n return { type: 'BATCH_ACTIONS', actions: actions };\n }\n if (queryObject.hasOwnProperty('sugg')) {\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_ADDED', payload: JSON.parse(queryObject.sugg)}\n ]\n };\n }\n if (queryObject.hasOwnProperty('suggestion')) {\n const url = new URL(myUrl.href);\n url.search = '';\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'URL_UPDATED', payload: {url: url.href, replace:false}},\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'SUGGESTIONS_QUERY_CHANGED', payload: {query: queryObject.suggestion}}\n ]\n };\n }\n if (queryObject.hasOwnProperty('idList')) {\n return handleIdList(queryObject);\n }\n if (queryObject.hasOwnProperty('fq_field') && queryObject.hasOwnProperty('fq_value')\n && queryObject.hasOwnProperty('category') && queryObject.hasOwnProperty('name')) {\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_FILTER_ADDED', payload: queryObject}\n ]\n };\n }\n const url = new URL(myUrl.href);\n if (url.pathname === '/genes') {\n return {type: 'GRAMENE_FILTERS_CLEARED'}\n }\n }\n if (filters.status === 'finished') {\n const url = new URL(myUrl.href);\n url.search = `filters=${JSON.stringify(Object.assign({}, filters, {status: 'init'}))}&genomes=${genomes.join(',')}`;\n ReactGA.event({\n category: \"Gene Search\",\n action: \"filter finished\",\n label: url.search\n });\n return {\n type: 'BATCH_ACTIONS', actions: [\n {type: 'URL_UPDATED', payload: {url: url.href, replace:false}},\n {type: 'GRAMENE_FILTERS_STATUS_CHANGED', payload: 'ready'}\n ]\n }\n }\n }\n);\n\nexport default grameneFilters;\n","import { createSelector } from 'redux-bundler';\n\nconst grameneViews = {\n name: 'grameneViews',\n getReducer: () => {\n const initialState = {\n options: [\n {\n id: 'help',\n name: 'Help / Demo',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'taxonomy',\n name: 'Taxonomic distribution',\n show: 'on',\n shouldScroll: false\n },\n {\n id: 'list',\n name: 'Gene list',\n show: 'on',\n shouldScroll: false\n },\n {\n id: 'exprViz',\n name: 'Expression visualization',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'ontologyEnrichment',\n name: 'Ontology Enrichment',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'userLists',\n name: 'User Gene Lists',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'export',\n name: 'Data exporter',\n show: 'off',\n shouldScroll: false\n },\n {\n id: 'expression',\n name: 'Gene expression',\n show: 'off',\n shouldScroll: false,\n desiredSamples: {}\n },\n {\n id: 'attribs',\n name: 'Gene attributes',\n show: 'off',\n shouldScroll: false\n }\n // {\n // id: 'domains',\n // name: 'Domains',\n // show: 'disabled'\n // },\n // {\n // id: 'go',\n // name: 'GO terms',\n // show: 'disabled'\n // }\n ],\n touched: {}\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_VIEW_TOGGLED':\n newState = Object.assign({},state);\n newState.touched = { ...(state.touched || {}), [payload]: true };\n newState.options.forEach(view => {\n view.shouldScroll = false;\n if (view.id === payload) {\n view.show = view.show === 'on' ? 'off' : 'on'\n view.shouldScroll = view.show === 'on';\n }\n });\n return newState;\n case 'GRAMENE_VIEW_CLICKED':\n newState = Object.assign({}, state);\n newState.touched = { ...(state.touched || {}), [payload]: true };\n newState.options.forEach(view => {\n view.shouldScroll = false;\n if (view.id === payload) {\n view.show = view.show === 'on' ? 'on' : 'on';\n view.shouldScroll = view.show === 'on';\n }\n });\n return newState;\n case 'GRAMENE_VIEW_SCROLLED':\n newState = Object.assign({}, state);\n newState.options.forEach(v => v.shouldScroll = false)\n return newState;\n default:\n return state;\n }\n }\n },\n doToggleGrameneView: idx => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_VIEW_TOGGLED', payload: idx})\n },\n dontToggleGrameneView: idx => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_VIEW_CLICKED', payload: idx})\n },\n doCancelShouldScroll: () => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_VIEW_SCROLLED', payload: null})\n },\n selectRawGrameneViews: state => state.grameneViews,\n selectGrameneViews: createSelector(\n 'selectRawGrameneViews',\n 'selectConfiguration',\n 'selectGrameneSearch',\n 'selectGrameneFilters',\n (raw, config, search, filters) => {\n const overrides = (config && config.views) || null;\n const touched = raw.touched || {};\n const numFound = (search && search.response && search.response.numFound) || 0;\n const hasFilters = !!(filters && filters.rightIdx > 1);\n const resultDependentIds = new Set(['taxonomy', 'list', 'export', 'exprViz', 'ontologyEnrichment']);\n const autoDisable = (numFound === 0) || !hasFilters;\n const hasFirebase = !!(config && config.firebaseConfig);\n\n let options = raw.options;\n if (!hasFirebase) {\n options = options.filter(v => v.id !== 'userLists');\n }\n if (overrides) {\n options = options.filter(v => overrides[v.id] !== 'hidden');\n }\n options = options.map(v => {\n if (resultDependentIds.has(v.id) && autoDisable) {\n return { ...v, show: 'off' };\n }\n if (!overrides) return v;\n const o = overrides[v.id];\n if (!o) return v;\n if (o === 'disabled') return { ...v, show: 'disabled' };\n if (touched[v.id]) return v;\n return { ...v, show: o };\n });\n const anyOtherOn = options.some(v => v.id !== 'help' && v.show === 'on');\n if (!anyOtherOn) {\n options = options.map(v => v.id === 'help' ? { ...v, show: 'on' } : v);\n }\n return { ...raw, options };\n }\n ),\n // Set of view ids whose `show` is currently 'on'. Used by data bundles to\n // gate their auto-fetch reactors so we don't pay the cost of loading data\n // for views the user has turned off.\n selectGrameneViewsOn: createSelector(\n 'selectGrameneViews',\n (views) => {\n const ids = new Set();\n const opts = (views && views.options) || [];\n for (const v of opts) if (v && v.show === 'on') ids.add(v.id);\n return ids;\n }\n )\n};\n\nexport default grameneViews;\n","import { getConfiguredCache } from 'money-clip';\n\n// Dedicated IndexedDB store for the full pathway corpus, persisted\n// indefinitely (default maxAge of `Infinity`). The pathway set is small\n// and stable enough to keep around across sessions, so we bulk-load it\n// once with `?rows=-1` and reuse it instead of issuing per-id requests.\nconst pathwayCache = getConfiguredCache({\n version: 1,\n name: 'gramene_pathways'\n});\n\nlet pathwaysBulkPromise = null;\n\nconst grameneDocs = {\n name: 'grameneDocs',\n getReducer: () => {\n const initialState = {\n genes: {},\n trees: {},\n domains: {},\n pathways: {},\n expression: {},\n sequences: {},\n rnaSequences: {},\n pepSequences: {},\n studies: {},\n desiredSamples: {},\n consequences: {}\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_CONSEQUENCES_REQUESTED':\n if (!state.consequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.consequences[payload] = {};\n return newState;\n }\n break;\n case 'GRAMENE_CONSEQUENCES_RECEIVED':\n newState = Object.assign({}, state);\n newState.consequences = Object.assign({}, state.consequences, payload);\n return newState;\n case 'GRAMENE_GENE_REQUESTED':\n if (!state.genes.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.genes[payload] = {};\n return newState;\n }\n break;\n case 'GRAMENE_GENE_RECEIVED':\n newState = Object.assign({}, state);\n newState.genes = Object.assign({}, state.genes, payload);\n return newState;\n case 'GRAMENE_TREE_REQUESTED':\n if (!state.trees.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.trees[payload] = {};\n return newState;\n }\n break;\n case 'GRAMENE_TREE_RECEIVED':\n newState = Object.assign({}, state);\n newState.trees = Object.assign({}, state.trees, payload);\n return newState;\n case 'GRAMENE_PATHWAYS_RECEIVED':\n newState = Object.assign({}, state);\n newState.pathways = Object.assign({}, state.pathways, payload);\n return newState;\n case 'ATLAS_STUDIES_RECEIVED':\n newState = Object.assign({}, state);\n newState.studies = Object.assign({}, state.studies, payload);\n return newState;\n case 'ATLAS_SAMPLES_REQUESTED':\n if (!state.studies.byID[payload].hasOwnProperty('samples')) {\n newState = Object.assign({},state);\n newState.studies.byID[payload].samples = [];\n return newState;\n }\n break;\n case 'ATLAS_SAMPLES_RECEIVED':\n newState = Object.assign({}, state);\n newState.studies.byID[payload.id].samples = payload.samples;\n return newState;\n case 'GENE_SEQUENCE_REQUESTED':\n if (!state.sequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.sequences[payload] = {};\n return newState;\n }\n break;\n case 'RNA_SEQUENCE_REQUESTED':\n if (!state.rnaSequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.rnaSequences[payload] = {};\n return newState;\n }\n break;\n case 'PEP_SEQUENCE_REQUESTED':\n if (!state.rnaSequences.hasOwnProperty(payload)) {\n newState = Object.assign({}, state);\n newState.pepSequences[payload] = {};\n return newState;\n }\n break;\n case 'GENE_SEQUENCE_RECEIVED':\n newState = Object.assign({}, state);\n newState.sequences = Object.assign({}, state.sequences);\n newState.sequences[payload.id] = payload.geneSeq;\n return newState;\n case 'RNA_SEQUENCE_RECEIVED':\n newState = Object.assign({}, state);\n newState.rnaSequences = Object.assign({}, state.rnaSequences);\n newState.rnaSequences[payload.id] = payload.RnaSeq;\n return newState;\n case 'PEP_SEQUENCE_RECEIVED':\n newState = Object.assign({}, state);\n newState.pepSequences = Object.assign({}, state.pepSequences);\n newState.pepSequences[payload.id] = payload.PepSeq;\n return newState;\n case 'PARALOG_EXPRESSION_REQUESTED':\n if (!state.expression.hasOwnProperty(payload)) {\n newState = Object.assign({},state);\n newState.expression[payload] = [];\n return newState;\n }\n break;\n case 'PARALOG_EXPRESSION_RECEIVED':\n newState = Object.assign({}, state);\n newState.expression = Object.assign({}, state.expression);\n newState.expression[payload.id] = payload.paralogs;\n return newState;\n case 'EXPRESSION_SAMPLE_TOGGLED':\n newState = Object.assign({}, state);\n newState.desiredSamples = Object.assign({}, state.desiredSamples);\n if (newState.desiredSamples.hasOwnProperty(payload)) {\n delete newState.desiredSamples[payload]\n }\n else {\n newState.desiredSamples[payload] = {status: 'need'}\n }\n return newState;\n }\n return state;\n }\n },\n doToggleExpressionSample: id => ({dispatch}) => {\n dispatch({type: 'EXPRESSION_SAMPLE_TOGGLED', payload: id});\n },\n doRequestVEP: id => ({dispatch, store}) => {\n const consequences = store.selectGrameneConsequences();\n if (!consequences.hasOwnProperty(id)) {\n dispatch({type: 'GRAMENE_CONSEQUENCES_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/search?q=id:${id}&fl=id,VEP__*`)\n .then(res => res.json())\n .then(res => {\n let genes = {};\n res.response.docs.forEach(g => {\n genes[g.id] = g;\n });\n dispatch({type: 'GRAMENE_CONSEQUENCES_RECEIVED', payload: genes})\n })\n }\n },\n doRequestGrameneGene: id => ({dispatch, store}) => {\n const genes = store.selectGrameneGenes();\n if (!genes.hasOwnProperty(id)) {\n dispatch({type: 'GRAMENE_GENE_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/genes?idList=${id}`)\n .then(res => res.json())\n .then(res => {\n let genes = {};\n res.forEach(g => {\n genes[g._id] = g;\n });\n dispatch({type: 'GRAMENE_GENE_RECEIVED', payload: genes})\n })\n }\n },\n doRequestGrameneTree: id => ({dispatch, store}) => {\n const trees = store.selectGrameneTrees();\n const maps = store.selectGrameneMaps();\n if (!trees.hasOwnProperty(id)) {\n dispatch({type: 'GRAMENE_TREE_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/genetrees?idList=${id}`)\n .then(res => res.json())\n .then(res => {\n let trees = {};\n res.forEach(t => {\n function update_taxon_name(node) {\n if (maps && maps.hasOwnProperty(node.taxon_id)) {\n node.taxon_name = maps[node.taxon_id].display_name\n }\n else if (node.taxon_id === 1100004558) {\n node.taxon_name = \"Sorghum bicolor\"\n }\n if (node.taxon_id === 45580023 && node.hasOwnProperty('children')) {\n node.taxon_name = \"Sorghum bicolor\"\n }\n if (node.taxon_id === 45770001 && node.hasOwnProperty('children')) {\n node.taxon_name = \"Zea mays\"\n }\n if (node.taxon_id === 297600009 && node.hasOwnProperty('children')) {\n node.taxon_name = \"Vitis vinifera\"\n }\n if (node.hasOwnProperty('children')) {\n node.children.forEach(c => update_taxon_name(c))\n }\n }\n update_taxon_name(t);\n trees[t._id] = t;\n });\n dispatch({type: 'GRAMENE_TREE_RECEIVED', payload: trees})\n })\n }\n },\n // Signature kept for backward compatibility; the `ids` argument is\n // ignored. On first call we bulk-load every pathway record from the\n // dedicated IndexedDB cache (or `${api}/pathways?rows=-1` on miss),\n // dispatch a single GRAMENE_PATHWAYS_RECEIVED, and short-circuit all\n // subsequent calls.\n doRequestGramenePathways: _ids => ({dispatch, store}) => {\n if (pathwaysBulkPromise) return pathwaysBulkPromise;\n\n pathwaysBulkPromise = pathwayCache.get('all')\n .then(cached => {\n if (cached) {\n dispatch({type: 'GRAMENE_PATHWAYS_RECEIVED', payload: cached});\n return;\n }\n return fetch(`${store.selectGrameneAPI()}/pathways?rows=-1`)\n .then(res => res.json())\n .then(res => {\n const pathways = {};\n (res || []).forEach(p => {\n if (p && p._id != null) pathways[p._id] = p;\n });\n dispatch({type: 'GRAMENE_PATHWAYS_RECEIVED', payload: pathways});\n pathwayCache.set('all', pathways).catch(e => console.warn('Failed to cache pathways', e));\n });\n })\n .catch(err => {\n console.error('Failed to load pathways', err);\n pathwaysBulkPromise = null; // allow retry on next call\n });\n return pathwaysBulkPromise;\n },\n doRequestExpressionStudies: id => ({dispatch, store}) => {\n fetch(`${store.selectGrameneAPI()}/experiments?rows=-1`)\n .then(res => res.json())\n .then(res => {\n let studies = {byID:{},byTaxon:{}};\n res.forEach(s => {\n studies.byID[s._id] = s;\n if (! studies.byTaxon.hasOwnProperty(s.taxon_id)) {\n studies.byTaxon[s.taxon_id] = []\n }\n studies.byTaxon[s.taxon_id].push(s._id)\n })\n dispatch({type: 'ATLAS_STUDIES_RECEIVED', payload: studies})\n })\n },\n doRequestStudyMetadata: id => ({dispatch, store}) => {\n const studies = store.selectAtlasStudies();\n if (!studies.byID[id].hasOwnProperty('samples')) {\n dispatch({type: 'ATLAS_SAMPLES_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/assays?experiment=${id}&rows=-1`)\n .then(res => res.json())\n .then(samples => {\n dispatch({type: 'ATLAS_SAMPLES_RECEIVED', payload: {id, samples}})\n })\n }\n },\n doRequestGeneSequence: gene => ({dispatch, store}) => {\n const maps = store.selectGrameneMaps();\n const seqs = store.selectGeneSequences();\n const id = gene._id;\n const MAX_FLANK = 2000;\n if (!seqs.hasOwnProperty(id)) {\n dispatch({type: 'GENE_SEQUENCE_REQUESTED', payload: id});\n const start = gene.location.start > MAX_FLANK ? gene.location.start - MAX_FLANK : 1;\n const dnaLength = maps[gene.taxon_id].regionLength[gene.location.region];\n const end = gene.location.end + MAX_FLANK > dnaLength ? dnaLength : gene.location.end + MAX_FLANK;\n fetch(`${store.selectEnsemblAPI()}/sequence/region/${gene.system_name}/${gene.location.region}:${start}..${end}:${gene.location.strand}?content-type=application/json`)\n .then(res => res.json())\n .then(geneSeq => {\n const x = geneSeq.id.split(':');\n geneSeq.genome = x[1];\n geneSeq.start = +x[3];\n geneSeq.end = +x[4];\n dispatch({type: 'GENE_SEQUENCE_RECEIVED', payload: {id, geneSeq}});\n })\n }\n },\n doRequestRnaSequence: (id,gene) => ({dispatch, store}) => {\n const seqs = store.selectRnaSequences();\n if (!seqs.hasOwnProperty(id)) {\n dispatch({type: 'RNA_SEQUENCE_REQUESTED', payload: id});\n fetch(`${store.selectEnsemblAPI()}/sequence/id/${id}?species=${gene.system_name}&type=cdna&content-type=application/json`)\n .then(res => res.json())\n .then(RnaSeq => {\n dispatch({type: 'RNA_SEQUENCE_RECEIVED', payload: {id, RnaSeq}});\n })\n }\n },\n doRequestPepSequence: (id,gene) => ({dispatch, store}) => {\n const seqs = store.selectPepSequences();\n if (!seqs.hasOwnProperty(id)) {\n dispatch({type: 'PEP_SEQUENCE_REQUESTED', payload: id});\n fetch(`${store.selectEnsemblAPI()}/sequence/id/${id}?species=${gene.system_name}&type=protein&content-type=application/json`)\n .then(res => res.json())\n .then(PepSeq => {\n dispatch({type: 'PEP_SEQUENCE_RECEIVED', payload: {id, PepSeq}});\n })\n }\n },\n doRequestParalogExpression: id => ({dispatch, store}) => {\n const expr = store.selectParalogExpression();\n if (!expr.hasOwnProperty(id)) {\n dispatch({type: 'PARALOG_EXPRESSION_REQUESTED', payload: id});\n fetch(`${store.selectGrameneAPI()}/search?q=homology__within_species_paralog:${id}&fl=id,atlas_id,name,*__expr&rows=100`)\n .then(res => res.json())\n .then(res => {\n const assay_re = /(.+)_g(\\d+)/;\n const paralogs = res.response.docs.map(d => {\n let p = {\n id: d.id,\n name: d.name,\n experiments: {},\n min:1000,\n max:0\n };\n if (d.atlas_id) {\n p.atlas_id = d.atlas_id;\n delete d.atlas_id;\n }\n delete d.id;\n delete d.name;\n Object.entries(d).forEach(assay => {\n const parsed = assay[0].match(assay_re);\n const expr = parsed[1].replace('_','-').replace('-tpms','');\n if (! p.experiments.hasOwnProperty(expr)) {\n p.experiments[expr] = [];\n }\n const g = parsed[2] - 1;\n const e = d[assay[0]];\n if (e < p.min) p.min = e;\n if (e > p.max) p.max = e;\n p.experiments[expr][g] = e;\n });\n return p;\n }).map(p => {\n for (const expr in p.experiments) {\n p.experiments[expr] = p.experiments[expr].filter(e => e >= 0);\n }\n return p;\n });\n dispatch({type: 'PARALOG_EXPRESSION_RECEIVED', payload: {id, paralogs}});\n })\n }\n },\n selectGrameneGenes: state => state.grameneDocs.genes,\n selectGrameneConsequences: state => state.grameneDocs.consequences,\n selectGrameneTrees: state => state.grameneDocs.trees,\n selectGramenePathways: state => state.grameneDocs.pathways,\n selectParalogExpression: state => state.grameneDocs.expression,\n selectGeneSequences: state => state.grameneDocs.sequences,\n selectRnaSequences: state => state.grameneDocs.rnaSequences,\n selectPepSequences: state => state.grameneDocs.pepSequences,\n selectAtlasStudies: state => state.grameneDocs.studies,\n selectDesiredSamples: state => state.grameneDocs.desiredSamples\n};\n\nexport default grameneDocs;\n","import {createSelector} from \"redux-bundler\";\nconst grameneGenomes = {\n name: 'grameneGenomes',\n getReducer: () => {\n const initialState = {\n show: false,\n active: {}\n };\n return (state = initialState, {type, payload}) => {\n let newState;\n switch (type) {\n case 'GRAMENE_GENOMES_TOGGLED':\n newState = Object.assign({},state);\n newState.show = !newState.show;\n return newState;\n case 'GRAMENE_GENOMES_UPDATED':\n newState = Object.assign({}, state);\n newState.active = payload;\n return newState;\n case 'GRAMENE_MAPS_FETCH_FINISHED':\n newState = Object.assign({}, state);\n Object.keys(payload).forEach(key => {newState.active[key] = true;});\n return newState;\n default:\n return state;\n }\n }\n },\n doShowGrameneGenomes: () => ({dispatch, getState}) => {\n dispatch({type: 'GRAMENE_GENOMES_TOGGLED'})\n },\n doInitializeGrameneGenomes: genomes => ({dispatch, getState}) => {\n dispatch({type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_SEARCH_CLEARED'},\n {type: 'GRAMENE_GENOMES_UPDATED', payload: genomes}]})\n },\n doUpdateGrameneGenomes: genomes => ({dispatch, getState}) => {\n dispatch({type: 'BATCH_ACTIONS', actions: [\n {type: 'GRAMENE_GENOMES_UPDATED', payload: genomes},\n {type: 'GRAMENE_GENOMES_TOGGLED'},\n {type: 'GRAMENE_SEARCH_CLEARED'}]})\n },\n doEnsureGrameneGenome: genome => ({dispatch, getState}) => {\n const state = getState();\n if (Object.keys(state.grameneGenomes.active).length > 0 && !state.grameneGenomes.active.hasOwnProperty(genome)) {\n let active = Object.assign({}, state.grameneGenomes.active);\n active[genome]=true;\n dispatch({type: 'GRAMENE_GENOMES_UPDATED', payload: active})\n }\n },\n selectGrameneGenomes: state => state.grameneGenomes,\n selectActiveGenomes: state => {\n return Object.keys(state.grameneGenomes.active)\n },\n selectActiveGenomeCount: createSelector(\n 'selectGrameneMaps',\n 'selectGrameneGenomes',\n (maps,genomes) => {\n if (maps && genomes) {\n return Object.keys(genomes.active).length || Object.keys(maps).length;\n }\n return 0;\n }\n )\n};\n\nexport default grameneGenomes;\n","import { createAsyncResourceBundle, createSelector } from 'redux-bundler';\nimport overlay from '../fieldCatalog.overlay.json';\nimport { study_info as VEP_STUDY_INFO } from '../vepStudyInfo';\n\n// Fields matched by these globs are multi-valued in Solr.\nconst MULTIVALUED_PATTERNS = [\n /__expr$/,\n /__ancestors$/,\n /__xrefs$/,\n /^VEP__/,\n /^homology__/\n];\n\nfunction parseCsvHeader(text) {\n if (!text) return [];\n const line = text.split(/\\r?\\n/, 1)[0] || '';\n return line\n .split(',')\n .map(s => s.trim().replace(/^\"|\"$/g, ''))\n .filter(Boolean);\n}\n\nfunction synthesizedValue(name) {\n return MULTIVALUED_PATTERNS.some(re => re.test(name)) ? [0] : 0;\n}\n\nfunction applyTemplate(tpl, match) {\n if (!tpl) return null;\n return tpl.replace(/\\$(\\d+)/g, (_, n) => match[+n] || '');\n}\n\nfunction vepDetailLabel(matchGroups) {\n const [, , system, sid] = matchGroups || [];\n const info = (VEP_STUDY_INFO[system] || {})[sid];\n if (info) return info.label;\n return `${system}/${sid}`;\n}\n\nfunction vepDetailTsvHeader(matchGroups) {\n const [conseq, zyg, system, sid] = matchGroups || [];\n const info = (VEP_STUDY_INFO[system] || {})[sid];\n const type = (info && info.type) || '?';\n const study = (info && info.label) || `${system}/${sid}`;\n return `${type}·${conseq}·${zyg}·${study}`;\n}\n\nfunction vepMergedLabel(matchGroups) {\n const [kind] = matchGroups || [];\n if (kind === 'NAT') return 'Merged natural population accessions';\n if (kind === 'EMS') return 'Merged EMS mutant accessions';\n return `Merged ${kind} accessions`;\n}\n\nfunction vepMergedTsvHeader(matchGroups) {\n const [kind] = matchGroups || [];\n return `merged·${kind}`;\n}\n\nfunction classifyKey(name, patterns) {\n for (const p of patterns) {\n const re = new RegExp(p.match);\n const m = name.match(re);\n if (m) {\n return {\n patternId: p.id,\n group: p.group,\n label: applyTemplate(p.labelTemplate, m) || name,\n multiValued: !!p.multiValued,\n expression: !!p.expression,\n isHidden: !!p.is_hidden,\n matchGroups: m.slice(1)\n };\n }\n }\n return null;\n}\n\nfunction inferType(value) {\n if (value === null || value === undefined) return 'unknown';\n if (Array.isArray(value)) {\n return 'array<' + (value.length ? inferType(value[0]) : 'unknown') + '>';\n }\n return typeof value;\n}\n\nfunction buildCatalog(sampleDocs) {\n const hidden = new Set(overlay.hidden || []);\n const overlayFields = overlay.fields || {};\n const patterns = overlay.patterns || [];\n const groupsMeta = overlay.groups || {};\n\n // Union keys from overlay.fields (hardcoded catalog entries) and sample docs.\n const keys = new Set(Object.keys(overlayFields));\n const sampleValues = {};\n for (const doc of (sampleDocs || [])) {\n for (const [k, v] of Object.entries(doc)) {\n keys.add(k);\n if (!(k in sampleValues)) sampleValues[k] = v;\n }\n }\n\n const fields = {};\n for (const name of keys) {\n if (hidden.has(name)) continue;\n\n const overlayEntry = overlayFields[name];\n const classified = overlayEntry ? null : classifyKey(name, patterns);\n if (classified && classified.isHidden) continue;\n const sampleVal = sampleValues[name];\n const sampleType = sampleVal !== undefined ? inferType(sampleVal) : null;\n\n const group = (overlayEntry && overlayEntry.group)\n || (classified && classified.group)\n || 'other';\n\n let label = (overlayEntry && overlayEntry.label)\n || (classified && classified.label)\n || name;\n let tsvHeader = null;\n if (classified && classified.patternId === 'vep_detail') {\n label = vepDetailLabel(classified.matchGroups);\n tsvHeader = vepDetailTsvHeader(classified.matchGroups);\n } else if (classified && classified.patternId === 'vep_merged') {\n label = vepMergedLabel(classified.matchGroups);\n tsvHeader = vepMergedTsvHeader(classified.matchGroups);\n }\n\n const multiValued = (overlayEntry && overlayEntry.multiValued)\n || (classified && classified.multiValued)\n || (sampleType && sampleType.startsWith('array<'))\n || false;\n\n fields[name] = {\n name,\n label,\n tsvHeader,\n group,\n order: overlayEntry && overlayEntry.order != null ? overlayEntry.order : null,\n description: (overlayEntry && overlayEntry.description) || '',\n type: sampleType || 'unknown',\n multiValued,\n patternId: classified ? classified.patternId : null,\n matchGroups: classified ? classified.matchGroups : null,\n expression: !!(classified && classified.expression),\n source: overlayEntry ? 'overlay' : 'sample'\n };\n }\n\n // Build groups (explicit overlay.order first, then natural sort by label)\n const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n const compareFields = (a, b) => {\n const ao = a.order, bo = b.order;\n if (ao != null && bo != null && ao !== bo) return ao - bo;\n if (ao != null && bo == null) return -1;\n if (ao == null && bo != null) return 1;\n return collator.compare(a.label, b.label);\n };\n const groupIds = new Set(Object.values(fields).map(f => f.group));\n const groups = Array.from(groupIds).map(id => ({\n id,\n label: (groupsMeta[id] && groupsMeta[id].label) || id,\n order: (groupsMeta[id] && groupsMeta[id].order) != null ? groupsMeta[id].order : 50,\n fields: Object.values(fields)\n .filter(f => f.group === id)\n .sort(compareFields)\n .map(f => f.name)\n })).sort((a, b) => a.order - b.order);\n\n return {\n fetchedAt: Date.now(),\n groups,\n fields\n };\n}\n\nconst grameneFieldCatalog = createAsyncResourceBundle({\n name: 'grameneFieldCatalog',\n actionBaseType: 'GRAMENE_FIELD_CATALOG',\n persist: true,\n staleAfter: 5 * 60 * 1000,\n getPromise: ({ store }) => {\n const api = store.selectGrameneAPI();\n const url = `${api}/search?q=*:*&rows=0&wt=csv&fl=*`;\n return fetch(url)\n .then(r => r.text())\n .then(text => parseCsvHeader(text))\n .catch(() => null);\n }\n});\n\n// Auto-fetch the field catalog only when a view that needs it (exprViz fields\n// modal, exporter field tree) is enabled. Other views never read it.\nconst FIELD_CATALOG_VIEWS = ['exprViz', 'export'];\ngrameneFieldCatalog.reactGrameneFieldCatalog = createSelector(\n 'selectGrameneFieldCatalogShouldUpdate',\n 'selectGrameneViewsOn',\n (shouldUpdate, viewsOn) => {\n if (!shouldUpdate) return;\n if (!viewsOn || !FIELD_CATALOG_VIEWS.some(id => viewsOn.has(id))) return;\n return { actionCreator: 'doFetchGrameneFieldCatalog' };\n }\n);\n\nfunction assayFactorLabel(assay) {\n if (!assay) return '';\n const factors = Array.isArray(assay.factor) ? assay.factor : [];\n const labels = factors.map(f => f && f.label).filter(Boolean);\n if (labels.length) return labels.join('; ');\n const chars = Array.isArray(assay.characteristic) ? assay.characteristic : [];\n const organ = chars.find(c => c && c.type === 'organism part');\n return (organ && organ.label) || '';\n}\n\nfunction parseTaxonFacet(grameneSearch, grameneMaps) {\n const arr = grameneSearch\n && grameneSearch.facet_counts\n && grameneSearch.facet_counts.facet_fields\n && grameneSearch.facet_counts.facet_fields.taxon_id;\n if (!Array.isArray(arr) || !arr.length) return null;\n // Search taxon_ids are strain-specific (e.g. 3702001); experiments use\n // species-level NCBI taxon_ids (e.g. 3702). Map via grameneMaps.anchor_taxon_id.\n // If maps aren't loaded yet, skip filtering rather than drop everything.\n if (!grameneMaps || !Object.keys(grameneMaps).length) return null;\n const speciesTaxa = new Set();\n for (let i = 0; i < arr.length; i += 2) {\n const tid = arr[i];\n if (arr[i + 1] <= 0) continue;\n const map = grameneMaps[tid];\n const anchor = map && map.anchor_taxon_id;\n speciesTaxa.add(Number(anchor || tid));\n }\n return speciesTaxa.size ? speciesTaxa : null;\n}\n\nfunction buildExperimentTaxonIndex(expressionStudies) {\n const index = {};\n if (!expressionStudies) return index;\n for (const [taxon, arr] of Object.entries(expressionStudies)) {\n if (!Array.isArray(arr)) continue;\n for (const e of arr) if (e && e._id) index[e._id] = Number(taxon);\n }\n return index;\n}\n\nfunction buildExperimentTitleIndex(expressionStudies) {\n const index = {};\n if (!expressionStudies) return index;\n for (const arr of Object.values(expressionStudies)) {\n if (!Array.isArray(arr)) continue;\n for (const e of arr) {\n if (e && e._id) index[e._id] = e.description || e.title || '';\n }\n }\n return index;\n}\n\nfunction buildSpeciesNameIndex(grameneMaps) {\n const idx = {};\n if (!grameneMaps) return idx;\n for (const m of Object.values(grameneMaps)) {\n if (m && m.anchor_taxon_id && !idx[m.anchor_taxon_id]) {\n idx[m.anchor_taxon_id] = m.display_name || String(m.anchor_taxon_id);\n }\n }\n return idx;\n}\n\nfunction fieldExperimentId(name) {\n let m = name.match(/^(\\w+?)_g\\d+__expr$/);\n if (m) return m[1].replace(/_/g, '-');\n m = name.match(/^(\\w+?)_g\\d+_g\\d+_(pval|l2fc)_attr_[a-z]$/);\n if (m) return m[1].replace(/_/g, '-');\n return null;\n}\n\nconst STAT_RANK = { l2fc: 0, pval: 1 };\n\nfunction collapseDiffExprInSubgroups(subgroups, fieldsOut, collator) {\n for (const taxGroup of subgroups) {\n for (const expGroup of (taxGroup.subgroups || [])) {\n const contrastMap = new Map();\n const others = [];\n for (const name of (expGroup.fields || [])) {\n const f = fieldsOut[name];\n if (!f || f.patternId !== 'diffexpr') { others.push(name); continue; }\n const mg = f.matchGroups || [];\n const key = `${mg[1]}|${mg[2]}`;\n let arr = contrastMap.get(key);\n if (!arr) { arr = []; contrastMap.set(key, arr); }\n arr.push(name);\n }\n const newFields = [...others];\n for (const names of contrastMap.values()) {\n if (names.length === 1) { newFields.push(names[0]); continue; }\n names.sort((a, b) => {\n const ra = STAT_RANK[(fieldsOut[a].matchGroups || [])[3]] ?? 99;\n const rb = STAT_RANK[(fieldsOut[b].matchGroups || [])[3]] ?? 99;\n if (ra !== rb) return ra - rb;\n return collator.compare(a, b);\n });\n const rep = names[0];\n const repEntry = fieldsOut[rep];\n const label = (repEntry.label || rep).replace(/\\s+\\((?:pval|l2fc)\\)/, '');\n fieldsOut[rep] = { ...repEntry, label, linkedFields: names.slice() };\n newFields.push(rep);\n }\n expGroup.fields = newFields;\n }\n }\n}\n\nfunction buildExpressionSubgroups(fieldNames, fieldsOut, experimentTaxa, experimentTitles, speciesNames, collator) {\n const byTaxon = new Map();\n const orphans = [];\n const studiesLoaded = Object.keys(experimentTaxa).length > 0;\n for (const name of fieldNames) {\n const expId = fieldExperimentId(name);\n if (!expId) { orphans.push(name); continue; }\n const taxon = experimentTaxa[expId];\n if (!taxon) {\n if (studiesLoaded) continue;\n orphans.push(name);\n continue;\n }\n let taxonEntry = byTaxon.get(taxon);\n if (!taxonEntry) {\n taxonEntry = new Map();\n byTaxon.set(taxon, taxonEntry);\n }\n let expEntry = taxonEntry.get(expId);\n if (!expEntry) {\n expEntry = [];\n taxonEntry.set(expId, expEntry);\n }\n expEntry.push(name);\n }\n\n const taxonGroups = [];\n for (const [taxon, expMap] of byTaxon) {\n const experiments = [];\n for (const [expId, names] of expMap) {\n names.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n const title = experimentTitles && experimentTitles[expId];\n experiments.push({\n id: 'exp-' + expId,\n label: title ? `${expId} — ${title}` : expId,\n fields: names\n });\n }\n experiments.sort((a, b) => collator.compare(a.label, b.label));\n taxonGroups.push({\n id: 'tax-' + taxon,\n label: speciesNames[taxon] || `taxon ${taxon}`,\n taxon,\n subgroups: experiments\n });\n }\n taxonGroups.sort((a, b) => collator.compare(a.label, b.label));\n\n return { subgroups: taxonGroups, orphans };\n}\n\nfunction buildVepSubgroups(fieldNames, fieldsOut, collator) {\n const buckets = {\n NAT: { merged: [], byConseq: new Map() },\n EMS: { merged: [], byConseq: new Map() }\n };\n const orphans = [];\n\n for (const name of fieldNames) {\n const f = fieldsOut[name];\n if (!f) { orphans.push(name); continue; }\n if (f.patternId === 'vep_merged') {\n const kind = (f.matchGroups && f.matchGroups[0]) || '';\n if (buckets[kind]) buckets[kind].merged.push(name);\n else orphans.push(name);\n } else if (f.patternId === 'vep_detail') {\n const mg = f.matchGroups || [];\n const [conseq, zyg, system, sid] = mg;\n const info = (VEP_STUDY_INFO[system] || {})[sid];\n const kind = info && info.type;\n if (!buckets[kind]) { orphans.push(name); continue; }\n let zmap = buckets[kind].byConseq.get(conseq);\n if (!zmap) {\n zmap = new Map();\n buckets[kind].byConseq.set(conseq, zmap);\n }\n let arr = zmap.get(zyg);\n if (!arr) {\n arr = [];\n zmap.set(zyg, arr);\n }\n arr.push(name);\n } else {\n orphans.push(name);\n }\n }\n\n const kindLabels = { NAT: 'Natural populations', EMS: 'Mutant populations' };\n const subgroups = [];\n for (const kind of ['NAT', 'EMS']) {\n const bucket = buckets[kind];\n if (!bucket.merged.length && bucket.byConseq.size === 0) continue;\n\n const conseqGroups = [];\n for (const [conseq, zmap] of bucket.byConseq) {\n const zygGroups = [];\n for (const [zyg, names] of zmap) {\n names.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n zygGroups.push({\n id: `lof-${kind}-${conseq}-${zyg}`,\n label: zyg === 'het' ? 'heterozygous' : 'homozygous',\n fields: names\n });\n }\n zygGroups.sort((a, b) => collator.compare(a.label, b.label));\n conseqGroups.push({\n id: `lof-${kind}-${conseq}`,\n label: conseq.replace(/_/g, ' '),\n subgroups: zygGroups\n });\n }\n conseqGroups.sort((a, b) => collator.compare(a.label, b.label));\n\n bucket.merged.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n\n subgroups.push({\n id: `lof-${kind}`,\n label: kindLabels[kind],\n fields: bucket.merged,\n subgroups: conseqGroups\n });\n }\n\n return { subgroups, orphans };\n}\n\nfunction enrichLabels(catalog, expressionStudies, expressionSamples, grameneSearch, grameneMaps) {\n if (!catalog || !catalog.fields) return catalog;\n if (!expressionSamples) return catalog;\n\n const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\n const taxaInResults = parseTaxonFacet(grameneSearch, grameneMaps);\n const experimentTaxa = buildExperimentTaxonIndex(expressionStudies);\n const experimentTitles = buildExperimentTitleIndex(expressionStudies);\n const dropped = new Set();\n const fieldsOut = {};\n\n for (const [name, f] of Object.entries(catalog.fields)) {\n if (f.patternId !== 'expr' && f.patternId !== 'diffexpr') {\n fieldsOut[name] = f;\n continue;\n }\n const mg = f.matchGroups || [];\n const experimentSolr = mg[0];\n if (!experimentSolr) { fieldsOut[name] = f; continue; }\n const experimentId = experimentSolr.replace(/_/g, '-');\n\n if (taxaInResults) {\n const expTaxon = experimentTaxa[experimentId];\n if (expTaxon && !taxaInResults.has(expTaxon)) {\n dropped.add(name);\n continue;\n }\n }\n\n const assays = expressionSamples[experimentId] || [];\n let newLabel = f.label;\n if (f.patternId === 'expr') {\n const g = 'g' + mg[1];\n const assay = assays.find(a => a && a.group === g);\n const desc = assayFactorLabel(assay);\n newLabel = desc ? `${experimentId} ${g}: ${desc}` : `${experimentId} ${g}`;\n } else {\n const gA = 'g' + mg[1];\n const gB = 'g' + mg[2];\n const metric = mg[3];\n const aA = assays.find(a => a && a.group === gA);\n const aB = assays.find(a => a && a.group === gB);\n const dA = assayFactorLabel(aA);\n const dB = assayFactorLabel(aB);\n const pair = dA && dB ? `: ${dA} vs ${dB}` : '';\n newLabel = `${experimentId} ${gA} vs ${gB} (${metric})${pair}`;\n }\n\n fieldsOut[name] = newLabel !== f.label ? { ...f, label: newLabel } : f;\n }\n\n // Synthesize any expr fields missing from catalog.fields using the complete\n // assays collection. The doc-sample only surfaces expr keys that happened to\n // appear in the sampled genes; assays is authoritative per-experiment.\n const synthesized = [];\n for (const [experimentId, assays] of Object.entries(expressionSamples)) {\n if (taxaInResults) {\n const expTaxon = experimentTaxa[experimentId];\n if (expTaxon && !taxaInResults.has(expTaxon)) continue;\n }\n const solrPrefix = experimentId.replace(/-/g, '_');\n for (const assay of assays) {\n if (!assay || !assay.group) continue;\n const name = `${solrPrefix}_${assay.group}__expr`;\n if (fieldsOut[name]) continue;\n const desc = assayFactorLabel(assay);\n fieldsOut[name] = {\n name,\n label: desc ? `${experimentId} ${assay.group}: ${desc}` : `${experimentId} ${assay.group}`,\n group: 'expression',\n description: '',\n type: 'array<float>',\n multiValued: true,\n patternId: 'expr',\n matchGroups: [solrPrefix, assay.group.replace(/^g/, '')],\n expression: true,\n source: 'assays'\n };\n synthesized.push(name);\n }\n }\n\n const speciesNames = buildSpeciesNameIndex(grameneMaps);\n\n const groups = catalog.groups.map(g => {\n let list = dropped.size ? g.fields.filter(n => !dropped.has(n)) : g.fields;\n if (g.id === 'expression' && synthesized.length) {\n const existing = new Set(list);\n list = [...list, ...synthesized.filter(n => !existing.has(n))];\n }\n if (g.id === 'lof') {\n const { subgroups, orphans } = buildVepSubgroups(list, fieldsOut, collator);\n orphans.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n return { ...g, fields: orphans, subgroups };\n }\n if (g.id !== 'expression' && g.id !== 'differential') {\n return list === g.fields ? g : { ...g, fields: list };\n }\n const { subgroups, orphans } = buildExpressionSubgroups(\n list, fieldsOut, experimentTaxa, experimentTitles, speciesNames, collator\n );\n if (g.id === 'differential') {\n collapseDiffExprInSubgroups(subgroups, fieldsOut, collator);\n }\n orphans.sort((a, b) => collator.compare(fieldsOut[a].label, fieldsOut[b].label));\n return { ...g, fields: orphans, subgroups };\n });\n\n return { ...catalog, fields: fieldsOut, groups };\n}\n\nfunction filterCatalogByPresentFields(catalog, present) {\n if (!catalog || !catalog.fields || !present) return catalog;\n const filteredFields = {};\n for (const [name, f] of Object.entries(catalog.fields)) {\n if (present.has(name)) filteredFields[name] = f;\n }\n const hasContent = (g) =>\n (g.fields && g.fields.length > 0) ||\n (g.subgroups && g.subgroups.some(hasContent));\n const filterGroup = (g) => {\n const fields = (g.fields || []).filter(n => present.has(n));\n const subgroups = (g.subgroups || [])\n .map(filterGroup)\n .filter(hasContent);\n return { ...g, fields, subgroups };\n };\n const groups = (catalog.groups || []).map(filterGroup).filter(hasContent);\n return { ...catalog, fields: filteredFields, groups };\n}\n\ngrameneFieldCatalog.selectFieldCatalog = createSelector(\n 'selectGrameneFieldCatalog',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'selectGrameneSearch',\n 'selectGrameneMaps',\n (fieldNames, studies, samples, search, maps) => {\n if (!fieldNames || !fieldNames.length) return null;\n const present = new Set(fieldNames);\n // Build a synthetic doc from the discovered field names; values carry the\n // right JS type so inferType picks the correct multiValued/type (arrays\n // for multi-valued fields, scalars otherwise). Derive the pval companion\n // from every l2fc field.\n const doc = {};\n for (const name of present) {\n doc[name] = synthesizedValue(name);\n if (/_l2fc_attr_f$/.test(name)) {\n doc[name.replace('_l2fc_', '_pval_')] = 0;\n }\n }\n const catalog = buildCatalog([doc]);\n const enriched = enrichLabels(catalog, studies, samples, search, maps);\n return filterCatalogByPresentFields(enriched, present);\n }\n);\n\ngrameneFieldCatalog.selectFieldCatalogGroups = createSelector(\n 'selectFieldCatalog',\n (catalog) => (catalog && catalog.groups) || []\n);\n\ngrameneFieldCatalog.selectFieldCatalogByName = createSelector(\n 'selectFieldCatalog',\n (catalog) => (catalog && catalog.fields) || {}\n);\n\nexport default grameneFieldCatalog;\n","{\n \"groups\": {\n \"core\": { \"label\": \"Core identifiers\", \"order\": 0 },\n \"location\": { \"label\": \"Genomic location\", \"order\": 1 },\n \"structure\": { \"label\": \"Gene structure\", \"order\": 2 },\n \"homology\": { \"label\": \"Homology\", \"order\": 3 },\n \"expression\": { \"label\": \"Gene expression\", \"order\": 4 },\n \"differential\": { \"label\": \"Differential expression\",\"order\": 5 },\n \"hierarchical\": { \"label\": \"Hierarchical annotations\",\"order\": 6 },\n \"pathways\": { \"label\": \"Pathways\", \"order\": 7 },\n \"GO\": { \"label\": \"Gene Ontology\", \"order\": 7 },\n \"PO\": { \"label\": \"Plant Ontology\", \"order\": 8 },\n \"lof\": { \"label\": \"Loss of function alleles\",\"order\": 9 },\n \"MAKER\": { \"label\": \"MAKER transcript metrics\",\"order\": 10 },\n \"xrefs\": { \"label\": \"External references\", \"order\": 11 },\n \"other\": { \"label\": \"Other\", \"order\": 99 }\n },\n\n \"patterns\": [\n {\n \"id\": \"homology\",\n \"match\": \"^homology__(.+)$\",\n \"group\": \"homology\",\n \"multiValued\": true,\n \"labelTemplate\": \"Homology: $1\"\n },\n {\n \"id\": \"pathways\",\n \"match\": \"^pathways__(.+)$\",\n \"group\": \"pathways\",\n \"multiValued\": true,\n \"labelTemplate\": \"Pathway: $1\"\n },\n {\n \"id\": \"maker\",\n \"match\": \"^MAKER__(.+)__attr_([a-z])$\",\n \"group\": \"MAKER\",\n \"labelTemplate\": \"MAKER: $1\"\n },\n {\n \"id\": \"xrefs\",\n \"match\": \"^(.+)__xrefs$\",\n \"group\": \"xrefs\",\n \"multiValued\": true,\n \"labelTemplate\": \"$1 (xrefs)\"\n },\n {\n \"id\": \"expr\",\n \"match\": \"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)__expr$\",\n \"group\": \"expression\",\n \"expression\": true,\n \"labelTemplate\": \"$1 · g$2\"\n },\n {\n \"id\": \"diffexpr\",\n \"match\": \"^(E[-_][A-Za-z0-9_-]+?)_g(\\\\d+)_g(\\\\d+)_(pval|l2fc)_attr_([a-z])$\",\n \"group\": \"differential\",\n \"diffExpression\": true,\n \"labelTemplate\": \"$1 · g$2 vs g$3 · $4\"\n },\n {\n \"id\": \"bins\",\n \"match\": \"^(fixed|uniform)_([0-9a-zA-Z]+)__bin$\",\n \"group\": \"bins\",\n \"is_hidden\": true,\n \"labelTemplate\": \"$1 bin ($2)\"\n },\n {\n \"id\": \"neighbors\",\n \"match\": \".*neighbors_[0-9]+$\",\n \"group\": \"neighbors\",\n \"is_hidden\": true,\n \"labelTemplate\": \"neighbors\"\n },\n {\n \"id\": \"vep_merged\",\n \"match\": \"^VEP__merged__(NAT|EMS)__attr_ss$\",\n \"group\": \"lof\",\n \"multiValued\": true,\n \"labelTemplate\": \"Merged $1 accessions\"\n },\n {\n \"id\": \"vep_detail\",\n \"match\": \"^VEP__(.+?)__(homo|het)__(.+?)__(\\\\d+)__attr_ss$\",\n \"group\": \"lof\",\n \"multiValued\": true,\n \"labelTemplate\": \"$1 ($2) $3/$4\"\n },\n {\n \"id\": \"generic_attr\",\n \"match\": \"^(.+)__attr_([a-z])$\",\n \"group\": \"other\",\n \"labelTemplate\": \"$1\"\n }\n ],\n\n \"fields\": {\n \"id\": { \"group\": \"core\", \"label\": \"Gene ID\", \"order\": 1 },\n \"name\": { \"group\": \"core\", \"label\": \"Name\", \"order\": 2 },\n \"description\": { \"group\": \"core\", \"label\": \"Description\", \"order\": 4 },\n \"summary\": { \"group\": \"core\", \"label\": \"Summary\", \"order\": 5 },\n \"synonyms\": { \"group\": \"core\", \"label\": \"Synonyms\", \"multiValued\": true, \"order\": 3 },\n \"biotype\": { \"group\": \"core\", \"label\": \"Biotype\", \"order\": 6 },\n \"taxon_id\": { \"group\": \"core\", \"label\": \"Taxon ID\", \"order\": 8 },\n \"system_name\": { \"group\": \"core\", \"label\": \"System name\", \"order\": 7 },\n \"db_type\": { \"group\": \"core\", \"label\": \"DB type\", \"order\": 9 },\n\n \"closest_rep_id\": { \"group\": \"homology\", \"label\": \"Closest representative ID\", \"order\": 1 },\n \"closest_rep_name\": { \"group\": \"homology\", \"label\": \"Closest representative name\", \"order\": 2 },\n \"closest_rep_identity\": { \"group\": \"homology\", \"label\": \"Closest representative identity\", \"order\": 3 },\n \"closest_rep_taxon_id\": { \"group\": \"homology\", \"label\": \"Closest representative taxon\", \"order\": 4 },\n \"closest_rep_description\": { \"group\": \"homology\", \"label\": \"Closest representative description\", \"order\": 5 },\n \"model_rep_id\": { \"group\": \"homology\", \"label\": \"Model representative ID\", \"order\": 6 },\n \"model_rep_name\": { \"group\": \"homology\", \"label\": \"Model representative name\", \"order\": 7 },\n \"model_rep_identity\": { \"group\": \"homology\", \"label\": \"Model representative identity\", \"order\": 8 },\n \"model_rep_taxon_id\": { \"group\": \"homology\", \"label\": \"Model representative taxon\", \"order\": 9 },\n \"model_rep_description\": { \"group\": \"homology\", \"label\": \"Model representative description\", \"order\": 10 },\n\n \"gene_tree\": { \"group\": \"homology\", \"label\": \"Gene tree ID\", \"order\": 11 },\n \"pan_tree\": { \"group\": \"homology\", \"label\": \"Pan-gene tree ID\", \"order\": 14 },\n\n \"capabilities\": { \"group\": \"other\", \"label\": \"Capabilities\", \"multiValued\": true },\n\n \"map\": { \"group\": \"location\", \"label\": \"Map\", \"order\": 1 },\n \"region\": { \"group\": \"location\", \"label\": \"Region\", \"order\": 2 },\n \"start\": { \"group\": \"location\", \"label\": \"Start\", \"order\": 3 },\n \"end\": { \"group\": \"location\", \"label\": \"End\", \"order\": 4 },\n \"strand\": { \"group\": \"location\", \"label\": \"Strand\", \"order\": 5 },\n\n \"GO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"GO terms\", \"multiValued\": true, \"order\": 1 },\n \"PO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"PO terms\", \"multiValued\": true, \"order\": 2 },\n \"TO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"TO terms\", \"multiValued\": true, \"order\": 3 },\n \"QTL_TO__ancestors\": { \"group\": \"hierarchical\", \"label\": \"QTL traits (TO)\", \"multiValued\": true, \"order\": 7 },\n \"domains__ancestors\": { \"group\": \"hierarchical\", \"label\": \"Domains\", \"multiValued\": true, \"order\": 4 },\n \"taxonomy__ancestors\": { \"group\": \"hierarchical\", \"label\": \"Taxonomy\", \"multiValued\": true, \"order\": 6 },\n \"supertree_attr_s\": { \"group\": \"homology\", \"label\": \"Supertree\", \"order\": 13 },\n \"gene_tree_root_taxon_id\": { \"group\": \"homology\", \"label\": \"Gene tree root taxon\", \"order\": 12 },\n \"protein__length\": { \"group\": \"structure\", \"label\": \"Protein length\" },\n \"transcript__count\": { \"group\": \"structure\", \"label\": \"Transcript count\" },\n \"transcript__exons\": { \"group\": \"structure\", \"label\": \"Exon count\" },\n \"transcript__length\": { \"group\": \"structure\", \"label\": \"Transcript length\" },\n \"expressed_in_gxa_attr_ss\": { \"group\": \"expression\", \"label\": \"Expressed in GXA\", \"multiValued\": true },\n\n \"MAKER__AED__attr_f\": { \"group\": \"MAKER\", \"label\": \"AED\", \"description\": \"Annotation Edit Distance\" },\n \"MAKER__QI1__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI1: Length of the 5' UTR\" },\n \"MAKER__QI2__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI2: Fraction of splice sites confirmed by EST\" },\n \"MAKER__QI3__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI3: Fraction of exons overlapping an EST\" },\n \"MAKER__QI4__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI4: Fraction of exons overlapping EST or protein\" },\n \"MAKER__QI5__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI5: Fraction of splice sites confirmed by SNAP\" },\n \"MAKER__QI6__attr_f\": { \"group\": \"MAKER\", \"label\": \"QI6: Fraction of exons overlapping a SNAP\" },\n \"MAKER__QI7__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI7: Number of exons in the mRNA\" },\n \"MAKER__QI8__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI8: Length of the 3' UTR\" },\n \"MAKER__QI9__attr_i\": { \"group\": \"MAKER\", \"label\": \"QI9: Length of the protein sequence\" },\n\n \"homology__all_orthologs\": { \"group\": \"homology\", \"label\": \"All orthologs\", \"multiValued\": true, \"order\": 15 },\n \"homology__ortholog_one2one\": { \"group\": \"homology\", \"label\": \"1:1 orthologs\", \"multiValued\": true, \"order\": 16 },\n \"homology__ortholog_one2many\": { \"group\": \"homology\", \"label\": \"1:many orthologs\", \"multiValued\": true, \"order\": 17 },\n \"homology__ortholog_many2many\": { \"group\": \"homology\", \"label\": \"Many:many orthologs\", \"multiValued\": true, \"order\": 18 },\n \"homology__syntenic_ortholog_one2one\":{ \"group\": \"homology\", \"label\": \"Syntenic 1:1 orthologs\", \"multiValued\": true, \"order\": 19 },\n \"homology__within_species_paralog\": { \"group\": \"homology\", \"label\": \"Within-species paralogs\", \"multiValued\": true, \"order\": 20 },\n\n \"pathways__ancestors\": { \"group\": \"hierarchical\", \"label\": \"Pathways\", \"multiValued\": true, \"order\": 5 },\n\n \"canonical_transcript__attr_s\": { \"group\": \"structure\", \"label\": \"Canonical transcript ID\" }\n },\n\n \"hidden\": [\n \"_version_\", \"_terms\", \"score\",\n \"gene_idx\", \"gene_idx_multi\", \"species_idx\",\n \"compara_idx\", \"compara_idx_multi\",\n \"_id\", \"annotations\", \"bins\", \"gene_structure\",\n \"homology\", \"location\", \"xrefs\",\n \"domain_roots\", \"familyRoot__ancestors\", \"taxonomy__ancestors\", \"capabilities\",\n \"saved_search\"\n ]}\n","export const study_info = {\n 'sorghum_bicolor': {\n '1': { label: 'Purdue EMS', type: 'EMS' },\n '2': { label: 'USDA Lubbock EMS', type: 'EMS' },\n '3': { label: 'Lozano', type: 'NAT' },\n '4': { label: 'USDA Lubbock EMS', type: 'EMS' },\n '5': { label: 'Boatwright SAP', type: 'NAT' },\n '7': { label: 'Kumar BAP', type: 'NAT' },\n '8': { label: 'Lasky landraces', type: 'NAT' },\n '9': { label: 'Sorghum Genomics Toolbox', type: 'NAT' }\n },\n 'zea_maysb73': {\n '15': { label: 'MaizeGDB 2024', type: 'NAT' }\n },\n 'oryza_sativa': {\n '7': { label: 'Rice 3K', type: 'NAT' },\n '20': { label: '19K-RGP', type: 'NAT' },\n '29': { label: 'Rice USDA mini core', type: 'NAT' },\n '38': { label: 'RAPDB 2024', type: 'NAT' }\n },\n 'oryza_aus': { '20': { label: '19K-RGP', type: 'NAT' } },\n 'oryza_sativa117425': { '20': { label: '19K-RGP', type: 'NAT' } },\n 'oryza_sativair64rs2': { '20': { label: '19K-RGP', type: 'NAT' } },\n 'oryza_sativamh63': { '20': { label: '19K-RGP', type: 'NAT' } }\n};\n","import { createSelector } from 'redux-bundler';\nimport { runExporterDownload } from '../components/exporter/downloadRunner';\n\nconst DEFAULT_FIELDS = ['id', 'name', 'system_name', 'biotype'];\nconst PREVIEW_ROWS = 20;\nconst PREVIEW_DEBOUNCE_MS = 250;\n\nfunction computePreviewSignature(store) {\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n return `${q}|${taxa.sort().join(',')}`;\n}\n\nlet debounceTimer = null;\nlet pendingRequestId = 0;\nlet pendingDownloadId = 0;\nlet currentDownloadController = null;\n\nconst markStale = (preview) => ({ ...preview, status: 'stale' });\n\nconst exporter = {\n name: 'exporter',\n\n getReducer: () => {\n const initialState = {\n selectedFields: DEFAULT_FIELDS,\n format: 'tsv',\n cutoffs: { exprMinTPM: 0.5, diffMaxPval: 0.05 },\n preview: { status: 'stale', data: null, error: null, requestId: 0, signature: null },\n download: { status: 'idle', progress: 0, total: 0, error: null, requestId: 0 }\n };\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'EXPORTER_FIELD_TOGGLED': {\n const idx = state.selectedFields.indexOf(payload);\n const selectedFields = idx === -1\n ? [...state.selectedFields, payload]\n : state.selectedFields.filter(f => f !== payload);\n return { ...state, selectedFields };\n }\n case 'EXPORTER_FIELDS_REORDERED':\n return { ...state, selectedFields: payload };\n case 'EXPORTER_FIELDS_BULK_SET': {\n const { names, selected } = payload;\n if (!Array.isArray(names) || names.length === 0) return state;\n if (selected) {\n const existing = new Set(state.selectedFields);\n const additions = names.filter(n => !existing.has(n));\n if (additions.length === 0) return state;\n return { ...state, selectedFields: [...state.selectedFields, ...additions] };\n }\n const remove = new Set(names);\n const next = state.selectedFields.filter(n => !remove.has(n));\n if (next.length === state.selectedFields.length) return state;\n return { ...state, selectedFields: next };\n }\n case 'EXPORTER_FORMAT_SET':\n return { ...state, format: payload };\n case 'EXPORTER_CUTOFFS_SET':\n return { ...state, cutoffs: { ...state.cutoffs, ...(payload || {}) } };\n case 'EXPORTER_FIELDS_CLEARED':\n return { ...state, selectedFields: [] };\n case 'EXPORTER_PREVIEW_INVALIDATED':\n return { ...state, preview: markStale(state.preview) };\n\n case 'EXPORTER_PREVIEW_STARTED':\n return {\n ...state,\n preview: { ...state.preview, status: 'loading', requestId: payload.requestId, error: null, signature: payload.signature }\n };\n case 'EXPORTER_PREVIEW_SUCCEEDED':\n if (payload.requestId !== state.preview.requestId) return state;\n return {\n ...state,\n preview: { status: 'ready', data: payload.data, error: null, requestId: payload.requestId, signature: state.preview.signature }\n };\n case 'EXPORTER_PREVIEW_FAILED':\n if (payload.requestId !== state.preview.requestId) return state;\n return {\n ...state,\n preview: { ...state.preview, status: 'error', error: payload.error }\n };\n\n case 'EXPORTER_DOWNLOAD_REQUESTED':\n return {\n ...state,\n download: { status: 'preparing', progress: 0, total: 0, error: null, requestId: payload.requestId }\n };\n case 'EXPORTER_DOWNLOAD_STARTED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'downloading', total: payload.total }\n };\n case 'EXPORTER_DOWNLOAD_PROGRESS':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, progress: payload.progress }\n };\n case 'EXPORTER_DOWNLOAD_COMPLETED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'done', progress: payload.written || state.download.progress }\n };\n case 'EXPORTER_DOWNLOAD_CANCELLED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'cancelled' }\n };\n case 'EXPORTER_DOWNLOAD_FAILED':\n if (payload.requestId !== state.download.requestId) return state;\n return {\n ...state,\n download: { ...state.download, status: 'error', error: payload.error }\n };\n case 'EXPORTER_DOWNLOAD_RESET':\n return {\n ...state,\n download: { status: 'idle', progress: 0, total: 0, error: null, requestId: state.download.requestId }\n };\n default:\n return state;\n }\n };\n },\n\n doToggleExporterField: fieldName => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELD_TOGGLED', payload: fieldName }),\n\n doReorderExporterFields: fieldList => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELDS_REORDERED', payload: fieldList }),\n\n doBulkSetExporterFields: (names, selected) => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELDS_BULK_SET', payload: { names, selected } }),\n\n doSetExporterFormat: fmt => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FORMAT_SET', payload: fmt }),\n\n doSetExporterCutoffs: cutoffs => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_CUTOFFS_SET', payload: cutoffs }),\n\n doClearExporterFields: () => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_FIELDS_CLEARED' }),\n\n doFetchExporterPreview: () => ({ dispatch, store }) => {\n clearTimeout(debounceTimer);\n const requestId = ++pendingRequestId;\n const signature = computePreviewSignature(store);\n dispatch({ type: 'EXPORTER_PREVIEW_STARTED', payload: { requestId, signature } });\n debounceTimer = setTimeout(() => {\n if (requestId !== pendingRequestId) return;\n\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n const fq = taxa.length ? `&fq=taxon_id:(${taxa.join(' OR ')})` : '';\n const url = `${api}/search?q=${q}&fl=*&rows=${PREVIEW_ROWS}${fq}`;\n\n fetch(url)\n .then(r => r.json())\n .then(json => {\n const docs = (json && json.response && json.response.docs) || [];\n dispatch({ type: 'EXPORTER_PREVIEW_SUCCEEDED', payload: { requestId, data: docs } });\n })\n .catch(err => {\n dispatch({ type: 'EXPORTER_PREVIEW_FAILED', payload: { requestId, error: String(err) } });\n });\n }, PREVIEW_DEBOUNCE_MS);\n },\n\n reactExporterPreview: createSelector(\n 'selectExporter',\n 'selectGrameneFiltersStatus',\n 'selectGrameneFiltersQueryString',\n 'selectGrameneGenomes',\n 'selectGrameneMaps',\n 'selectGrameneViewsOn',\n (exp, filtersStatus, q, g, m, viewsOn) => {\n if (!exp || !exp.preview) return;\n if (filtersStatus === 'init') return;\n if (exp.preview.status === 'loading') return;\n // Don't run the preview query unless the user has the exporter view open.\n if (!viewsOn || !viewsOn.has('export')) return;\n const maps = m || {};\n const taxa = Object.keys((g && g.active) || {}).filter(tid => maps[tid] && !maps[tid].hidden);\n const sig = `${q}|${taxa.sort().join(',')}`;\n if (exp.preview.signature === sig && exp.preview.status !== 'stale') return;\n return { actionCreator: 'doFetchExporterPreview' };\n }\n ),\n\n doStartExporterDownload: () => ({ dispatch, store }) => {\n if (currentDownloadController) {\n currentDownloadController.abort();\n }\n const requestId = ++pendingDownloadId;\n const controller = new AbortController();\n currentDownloadController = controller;\n dispatch({ type: 'EXPORTER_DOWNLOAD_REQUESTED', payload: { requestId } });\n\n const isSuperseded = () => requestId !== pendingDownloadId;\n\n runExporterDownload({\n dispatch,\n store,\n requestId,\n signal: controller.signal,\n isSuperseded\n }).catch(err => {\n if (err && err.name === 'AbortError') {\n dispatch({ type: 'EXPORTER_DOWNLOAD_CANCELLED', payload: { requestId } });\n } else {\n dispatch({ type: 'EXPORTER_DOWNLOAD_FAILED', payload: { requestId, error: String(err) } });\n }\n });\n },\n\n doCancelExporterDownload: () => ({ dispatch }) => {\n if (currentDownloadController) {\n currentDownloadController.abort();\n currentDownloadController = null;\n }\n pendingDownloadId++;\n },\n\n doResetExporterDownload: () => ({ dispatch }) =>\n dispatch({ type: 'EXPORTER_DOWNLOAD_RESET' }),\n\n selectExporter: state => state.exporter,\n selectExporterSelectedFields: state => state.exporter.selectedFields,\n selectExporterFormat: state => state.exporter.format,\n selectExporterCutoffs: state => state.exporter.cutoffs,\n selectExporterPreview: state => state.exporter.preview,\n selectExporterDownload: state => state.exporter.download\n};\n\nexport default exporter;\n","import { buildTableData, toJSONRows } from './formatters';\nimport { ANCESTOR_FIELD_MAP, collectAncestorIds } from './ancestorsResolver';\n\nconst PAGE_SIZE = 1000;\n\nfunction buildSearchURL(api, q, fl, rows, start, fq) {\n const params = [\n `q=${q}`,\n `rows=${rows}`,\n `start=${start}`,\n 'facet=false'\n ];\n if (fl) params.push(`fl=${encodeURIComponent(fl)}`);\n return `${api}/search?${params.join('&')}${fq}`;\n}\n\nfunction triggerBrowserSave(blob, filename) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 2000);\n}\n\nexport async function runExporterDownload({ dispatch, store, requestId, signal, isSuperseded }) {\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n const fq = taxa.length ? `&fq=taxon_id:(${taxa.join(' OR ')})` : '';\n const fields = store.selectExporterSelectedFields();\n const fl = fields.join(',');\n const format = store.selectExporterFormat();\n const catalog = store.selectFieldCatalog();\n const expressionStudies = store.selectExpressionStudies();\n const expressionSamples = store.selectExpressionSamples();\n const ancestorFields = fields.filter(n => ANCESTOR_FIELD_MAP[n]);\n\n const cutoffs = store.selectExporterCutoffs && store.selectExporterCutoffs();\n const buildResolverCtx = () => ({\n expressionStudies,\n expressionSamples,\n taxonomy: store.selectGrameneTaxonomy(),\n pathways: store.selectGramenePathways(),\n ontologies: store.selectOntologies(),\n cutoffs\n });\n\n const ensureAncestorRecords = async (docs) => {\n if (ancestorFields.length === 0 || docs.length === 0) return;\n const idsByOnt = collectAncestorIds(docs, ancestorFields);\n const waits = [];\n for (const [ontKey, ids] of Object.entries(idsByOnt)) {\n if (!ids.length) continue;\n if (ontKey === 'taxonomy') continue;\n if (ontKey === 'pathways') {\n const pathwaysCache = store.selectGramenePathways() || {};\n const missing = ids.filter(id => !pathwaysCache.hasOwnProperty(id));\n if (missing.length) store.doRequestGramenePathways(missing);\n continue;\n }\n const p = store.doEnsureOntologyRecords(ontKey, ids);\n if (p && typeof p.then === 'function') waits.push(p);\n }\n if (waits.length) await Promise.all(waits);\n };\n\n const fetchJSON = (url) => fetch(url, { signal }).then(r => {\n if (!r.ok) throw new Error(`HTTP ${r.status}`);\n return r.json();\n });\n\n const countUrl = buildSearchURL(api, q, 'id', 0, 0, fq);\n const countResp = await fetchJSON(countUrl);\n const total = (countResp && countResp.response && countResp.response.numFound) || 0;\n\n dispatch({ type: 'EXPORTER_DOWNLOAD_STARTED', payload: { requestId, total } });\n\n if (total === 0) {\n dispatch({ type: 'EXPORTER_DOWNLOAD_COMPLETED', payload: { requestId, written: 0 } });\n return;\n }\n\n const tsvPieces = [];\n const jsonRows = [];\n let progress = 0;\n\n if (format === 'tsv') {\n const { header } = buildTableData([], fields, catalog, buildResolverCtx());\n tsvPieces.push(header.join('\\t') + '\\n');\n }\n\n let start = 0;\n while (start < total) {\n if (isSuperseded()) {\n dispatch({ type: 'EXPORTER_DOWNLOAD_CANCELLED', payload: { requestId } });\n return;\n }\n const url = buildSearchURL(api, q, fl, PAGE_SIZE, start, fq);\n const resp = await fetchJSON(url);\n const docs = (resp && resp.response && resp.response.docs) || [];\n if (docs.length === 0) break;\n\n await ensureAncestorRecords(docs);\n const resolverCtx = buildResolverCtx();\n\n if (format === 'tsv') {\n const { rows } = buildTableData(docs, fields, catalog, resolverCtx);\n for (const row of rows) tsvPieces.push(row.join('\\t') + '\\n');\n } else {\n const rows = toJSONRows(docs, fields, resolverCtx);\n for (const r of rows) jsonRows.push(r);\n }\n\n start += docs.length;\n progress = start;\n dispatch({ type: 'EXPORTER_DOWNLOAD_PROGRESS', payload: { requestId, progress } });\n }\n\n if (isSuperseded()) {\n dispatch({ type: 'EXPORTER_DOWNLOAD_CANCELLED', payload: { requestId } });\n return;\n }\n\n const stamp = new Date().toISOString().slice(0, 19).replace(/[:T]/g, '-');\n let blob;\n let filename;\n if (format === 'tsv') {\n blob = new Blob(tsvPieces, { type: 'text/tab-separated-values' });\n filename = `gramene-export-${stamp}.tsv`;\n } else {\n blob = new Blob([JSON.stringify(jsonRows, null, 2)], { type: 'application/json' });\n filename = `gramene-export-${stamp}.json`;\n }\n\n triggerBrowserSave(blob, filename);\n dispatch({ type: 'EXPORTER_DOWNLOAD_COMPLETED', payload: { requestId, written: progress } });\n}\n","import {\n partitionFields,\n resolveExpressionForDoc,\n resolveDiffExpressionForDoc,\n EXPRESSION_EXTRA_COLUMNS,\n DIFFEXPRESSION_EXTRA_COLUMNS\n} from './expressionResolver';\nimport {\n ANCESTOR_FIELD_MAP,\n isAncestorField,\n formatAncestorsCellTSV,\n formatAncestorsJSON,\n resolveAncestorsForDoc,\n ANCESTOR_EXTRA_COLUMNS\n} from './ancestorsResolver';\n\nfunction scrubTSV(s) {\n return String(s).replace(/[\\t\\r\\n]/g, ' ');\n}\n\nfunction formatCellTSV(value) {\n if (value === null || value === undefined) return '';\n if (Array.isArray(value)) return value.map(formatCellTSV).join('|');\n if (typeof value === 'object') return JSON.stringify(value);\n return scrubTSV(value);\n}\n\nfunction formatDocFieldTSV(doc, name, resolverCtx) {\n if (isAncestorField(name)) {\n const ontKey = ANCESTOR_FIELD_MAP[name];\n const ids = Array.isArray(doc[name]) ? doc[name] : [];\n return scrubTSV(formatAncestorsCellTSV(ontKey, ids, doc.taxon_id, resolverCtx));\n }\n return formatCellTSV(doc[name]);\n}\n\nexport function buildTSVHeader(fieldNames, catalog) {\n return fieldNames.map(n => {\n const f = catalog && catalog.fields && catalog.fields[n];\n if (!f) return n;\n return f.tsvHeader || f.label;\n });\n}\n\nexport function buildTSVRow(doc, fieldNames, resolverCtx) {\n return fieldNames.map(n => formatDocFieldTSV(doc, n, resolverCtx));\n}\n\nconst EMPTY_EXPR_ROW = EXPRESSION_EXTRA_COLUMNS.map(() => '');\nconst EMPTY_DIFF_ROW = DIFFEXPRESSION_EXTRA_COLUMNS.map(() => '');\nconst EMPTY_ANC_ROW = ANCESTOR_EXTRA_COLUMNS.map(() => '');\n\nfunction exprRowToCells(er) {\n return [\n scrubTSV(er.experiment),\n scrubTSV(er.experiment_name),\n scrubTSV(er.assay),\n scrubTSV(er.sample),\n scrubTSV(er.value)\n ];\n}\n\nfunction diffRowToCells(dr) {\n return [\n scrubTSV(dr.diff_experiment),\n scrubTSV(dr.diff_experiment_name),\n scrubTSV(dr.group1_factors),\n scrubTSV(dr.group2_factors),\n scrubTSV(dr.l2fc),\n scrubTSV(dr.pval)\n ];\n}\n\nfunction ancRowToCells(ar) {\n return [\n scrubTSV(ar.hierarchy),\n scrubTSV(ar.term_id),\n scrubTSV(ar.term_name),\n scrubTSV(ar.term_type)\n ];\n}\n\nfunction splitPlainAndAncestor(nonExpressionFields) {\n const ancestorFields = [];\n const plainFields = [];\n for (const n of nonExpressionFields) {\n if (isAncestorField(n)) ancestorFields.push(n);\n else plainFields.push(n);\n }\n return { ancestorFields, plainFields };\n}\n\nfunction buildExpandedRows(docs, plainFields, ancestorFields, expressionFields, diffExpressionFields, resolverCtx) {\n const expressionStudies = resolverCtx && resolverCtx.expressionStudies;\n const expressionSamples = resolverCtx && resolverCtx.expressionSamples;\n const cutoffs = resolverCtx && resolverCtx.cutoffs;\n const hasExpr = expressionFields.length > 0;\n const hasDiff = diffExpressionFields.length > 0;\n const hasAnc = ancestorFields.length > 0;\n const rows = [];\n for (const doc of (docs || [])) {\n const baseCells = buildTSVRow(doc, plainFields, resolverCtx);\n const ancRows = hasAnc\n ? resolveAncestorsForDoc(doc, ancestorFields, resolverCtx)\n : [];\n const exprRows = hasExpr\n ? resolveExpressionForDoc(doc, expressionFields, expressionStudies, expressionSamples, cutoffs)\n : [];\n const diffRows = hasDiff\n ? resolveDiffExpressionForDoc(doc, diffExpressionFields, expressionStudies, expressionSamples, cutoffs)\n : [];\n const ancCells = ancRows.length ? ancRows.map(ancRowToCells) : (hasAnc ? [EMPTY_ANC_ROW] : [null]);\n const exprCells = exprRows.length ? exprRows.map(exprRowToCells) : (hasExpr ? [EMPTY_EXPR_ROW] : [null]);\n const diffCells = diffRows.length ? diffRows.map(diffRowToCells) : (hasDiff ? [EMPTY_DIFF_ROW] : [null]);\n for (const a of ancCells) {\n for (const e of exprCells) {\n for (const d of diffCells) {\n const out = [...baseCells];\n if (a) out.push(...a);\n if (e) out.push(...e);\n if (d) out.push(...d);\n rows.push(out);\n }\n }\n }\n }\n return rows;\n}\n\nexport function toTSV(docs, fieldNames, catalog, resolverCtx) {\n const { expressionFields, diffExpressionFields, nonExpressionFields } = partitionFields(fieldNames, catalog);\n const { ancestorFields, plainFields } = splitPlainAndAncestor(nonExpressionFields);\n\n if (expressionFields.length === 0 && diffExpressionFields.length === 0 && ancestorFields.length === 0) {\n const header = buildTSVHeader(fieldNames, catalog).join('\\t');\n const rows = (docs || []).map(d => buildTSVRow(d, fieldNames, resolverCtx).join('\\t'));\n return [header, ...rows].join('\\n');\n }\n\n const header = [\n ...buildTSVHeader(plainFields, catalog),\n ...(ancestorFields.length ? ANCESTOR_EXTRA_COLUMNS : []),\n ...(expressionFields.length ? EXPRESSION_EXTRA_COLUMNS : []),\n ...(diffExpressionFields.length ? DIFFEXPRESSION_EXTRA_COLUMNS : [])\n ].join('\\t');\n\n const rows = buildExpandedRows(docs, plainFields, ancestorFields, expressionFields, diffExpressionFields, resolverCtx);\n return [header, ...rows.map(r => r.join('\\t'))].join('\\n');\n}\n\nexport function buildTableData(docs, fieldNames, catalog, resolverCtx) {\n const { expressionFields, diffExpressionFields, nonExpressionFields } = partitionFields(fieldNames, catalog);\n const { ancestorFields, plainFields } = splitPlainAndAncestor(nonExpressionFields);\n\n if (expressionFields.length === 0 && diffExpressionFields.length === 0 && ancestorFields.length === 0) {\n return {\n header: buildTSVHeader(fieldNames, catalog),\n headerKeys: fieldNames.slice(),\n rows: (docs || []).map(d => buildTSVRow(d, fieldNames, resolverCtx))\n };\n }\n\n const header = [\n ...buildTSVHeader(plainFields, catalog),\n ...(ancestorFields.length ? ANCESTOR_EXTRA_COLUMNS : []),\n ...(expressionFields.length ? EXPRESSION_EXTRA_COLUMNS : []),\n ...(diffExpressionFields.length ? DIFFEXPRESSION_EXTRA_COLUMNS : [])\n ];\n const headerKeys = [\n ...plainFields,\n ...(ancestorFields.length ? ANCESTOR_EXTRA_COLUMNS : []),\n ...(expressionFields.length ? EXPRESSION_EXTRA_COLUMNS : []),\n ...(diffExpressionFields.length ? DIFFEXPRESSION_EXTRA_COLUMNS : [])\n ];\n const rows = buildExpandedRows(docs, plainFields, ancestorFields, expressionFields, diffExpressionFields, resolverCtx);\n return { header, headerKeys, rows };\n}\n\nexport function toJSONRows(docs, fieldNames, resolverCtx) {\n return (docs || []).map(d => {\n const row = {};\n for (const n of fieldNames) {\n if (isAncestorField(n)) {\n const ontKey = ANCESTOR_FIELD_MAP[n];\n const ids = Array.isArray(d[n]) ? d[n] : [];\n row[n] = formatAncestorsJSON(ontKey, ids, d.taxon_id, resolverCtx);\n } else {\n row[n] = d[n] !== undefined ? d[n] : null;\n }\n }\n return row;\n });\n}\n\nexport function toJSON(docs, fieldNames, resolverCtx) {\n return JSON.stringify(toJSONRows(docs, fieldNames, resolverCtx), null, 2);\n}\n","const EXPR_FIELD_RE = /^(E[-_][A-Za-z0-9_-]+?)_g(\\d+)__expr$/;\nconst DIFFEXPR_FIELD_RE = /^(E[-_][A-Za-z0-9_-]+?)_g(\\d+)_g(\\d+)_(pval|l2fc)_attr_([a-z])$/;\n\nexport const EXPRESSION_EXTRA_COLUMNS = [\n 'experiment',\n 'experiment_name',\n 'assay',\n 'sample',\n 'value'\n];\n\nexport const DIFFEXPRESSION_EXTRA_COLUMNS = [\n 'diff_experiment',\n 'diff_experiment_name',\n 'group1_factors',\n 'group2_factors',\n 'l2fc',\n 'pval'\n];\n\nexport function parseExprFieldName(name) {\n const m = name.match(EXPR_FIELD_RE);\n if (!m) return null;\n return {\n experimentId: m[1].replace(/_/g, '-'),\n group: 'g' + m[2],\n solrField: name\n };\n}\n\nexport function parseDiffExprFieldName(name) {\n const m = name.match(DIFFEXPR_FIELD_RE);\n if (!m) return null;\n return {\n experimentId: m[1].replace(/_/g, '-'),\n group1: 'g' + m[2],\n group2: 'g' + m[3],\n stat: m[4],\n solrField: name\n };\n}\n\nexport function isExpressionField(name, catalog) {\n const entry = catalog && catalog.fields && catalog.fields[name];\n if (entry && entry.expression) return true;\n return parseExprFieldName(name) !== null;\n}\n\nexport function isDiffExpressionField(name, catalog) {\n const entry = catalog && catalog.fields && catalog.fields[name];\n if (entry && entry.diffExpression) return true;\n return parseDiffExprFieldName(name) !== null;\n}\n\nexport function partitionFields(fieldNames, catalog) {\n const expressionFields = [];\n const diffExpressionFields = [];\n const nonExpressionFields = [];\n for (const n of fieldNames) {\n if (isDiffExpressionField(n, catalog)) diffExpressionFields.push(n);\n else if (isExpressionField(n, catalog)) expressionFields.push(n);\n else nonExpressionFields.push(n);\n }\n return { expressionFields, diffExpressionFields, nonExpressionFields };\n}\n\nfunction joinLabels(arr) {\n if (!Array.isArray(arr)) return '';\n return arr.map(f => f && f.label).filter(Boolean).join('; ');\n}\n\nexport function buildExperimentIndex(expressionStudies) {\n const index = {};\n if (!expressionStudies) return index;\n for (const arr of Object.values(expressionStudies)) {\n if (!Array.isArray(arr)) continue;\n for (const e of arr) if (e && e._id) index[e._id] = e;\n }\n return index;\n}\n\nfunction findAssay(expressionSamples, experimentId, group) {\n if (!expressionSamples) return null;\n const arr = expressionSamples[experimentId];\n if (!arr) return null;\n return arr.find(a => a.group === group) || null;\n}\n\nexport function resolveExpressionForDoc(doc, expressionFields, expressionStudies, expressionSamples, cutoffs) {\n const rows = [];\n const experimentIndex = buildExperimentIndex(expressionStudies);\n const minTPM = cutoffs && cutoffs.exprMinTPM;\n const minTPMActive = minTPM !== null && minTPM !== undefined && minTPM !== '' && Number.isFinite(+minTPM);\n for (const fieldName of expressionFields) {\n const parsed = parseExprFieldName(fieldName);\n if (!parsed) continue;\n const val = doc[fieldName];\n if (val === undefined || val === null) continue;\n if (minTPMActive && (!Number.isFinite(+val) || +val < +minTPM)) continue;\n const exp = experimentIndex[parsed.experimentId];\n const assay = findAssay(expressionSamples, parsed.experimentId, parsed.group);\n rows.push({\n field: fieldName,\n experiment: parsed.experimentId,\n experiment_name: exp ? (exp.description || exp.title || exp.name || '') : '',\n assay: parsed.group,\n sample: assay ? joinLabels(assay.factor) || joinLabels(assay.characteristic) : '',\n value: val\n });\n }\n return rows;\n}\n\nexport function resolveDiffExpressionForDoc(doc, diffExpressionFields, expressionStudies, expressionSamples, cutoffs) {\n const experimentIndex = buildExperimentIndex(expressionStudies);\n const byContrast = new Map();\n for (const fieldName of diffExpressionFields) {\n const parsed = parseDiffExprFieldName(fieldName);\n if (!parsed) continue;\n const val = doc[fieldName];\n if (val === undefined || val === null) continue;\n const key = `${parsed.experimentId}|${parsed.group1}|${parsed.group2}`;\n let entry = byContrast.get(key);\n if (!entry) {\n entry = {\n experimentId: parsed.experimentId,\n group1: parsed.group1,\n group2: parsed.group2,\n pval: '',\n l2fc: ''\n };\n byContrast.set(key, entry);\n }\n if (parsed.stat === 'pval') entry.pval = val;\n else entry.l2fc = val;\n }\n const maxPval = cutoffs && cutoffs.diffMaxPval;\n const maxPvalActive = maxPval !== null && maxPval !== undefined && maxPval !== '' && Number.isFinite(+maxPval);\n const rows = [];\n for (const entry of byContrast.values()) {\n if (maxPvalActive) {\n const pv = +entry.pval;\n if (!Number.isFinite(pv) || pv > +maxPval) continue;\n }\n const exp = experimentIndex[entry.experimentId];\n const assay1 = findAssay(expressionSamples, entry.experimentId, entry.group1);\n const assay2 = findAssay(expressionSamples, entry.experimentId, entry.group2);\n rows.push({\n diff_experiment: entry.experimentId,\n diff_experiment_name: exp ? (exp.description || exp.title || exp.name || '') : '',\n group1_factors: assay1 ? joinLabels(assay1.factor) || joinLabels(assay1.characteristic) : entry.group1,\n group2_factors: assay2 ? joinLabels(assay2.factor) || joinLabels(assay2.characteristic) : entry.group2,\n l2fc: entry.l2fc,\n pval: entry.pval\n });\n }\n return rows;\n}\n","// Maps gene-doc field name -> ontology key used for resolution.\nexport const ANCESTOR_FIELD_MAP = {\n GO__ancestors: 'GO',\n PO__ancestors: 'PO',\n TO__ancestors: 'TO',\n QTL_TO__ancestors: 'TO',\n domains__ancestors: 'domains',\n pathways__ancestors: 'pathways',\n taxonomy__ancestors: 'taxonomy'\n};\n\n// Display label used in the \"hierarchy\" column.\nexport const ANCESTOR_HIERARCHY_LABEL = {\n GO__ancestors: 'Gene Ontology',\n PO__ancestors: 'Plant Ontology',\n TO__ancestors: 'Trait Ontology',\n QTL_TO__ancestors: 'Trait Ontology',\n domains__ancestors: 'InterPro',\n pathways__ancestors: 'Plant Reactome',\n taxonomy__ancestors: 'Taxonomy'\n};\n\nexport const ANCESTOR_EXTRA_COLUMNS = [\n 'hierarchy',\n 'term_id',\n 'term_name',\n 'term_type'\n];\n\nexport function isAncestorField(name) {\n return Object.prototype.hasOwnProperty.call(ANCESTOR_FIELD_MAP, name);\n}\n\nexport function partitionAncestorFields(fieldNames) {\n const ancestor = [];\n const plain = [];\n for (const n of fieldNames) {\n if (isAncestorField(n)) ancestor.push(n);\n else plain.push(n);\n }\n return { ancestor, plain };\n}\n\n// Gather the ids referenced across docs for each ontology/field.\nexport function collectAncestorIds(docs, fieldNames) {\n const byOnt = {};\n for (const name of fieldNames) {\n const ont = ANCESTOR_FIELD_MAP[name];\n if (!ont) continue;\n if (!byOnt[ont]) byOnt[ont] = new Set();\n for (const d of (docs || [])) {\n const v = d && d[name];\n if (!Array.isArray(v)) continue;\n for (const id of v) if (id != null) byOnt[ont].add(+id);\n }\n }\n const out = {};\n for (const k of Object.keys(byOnt)) out[k] = Array.from(byOnt[k]);\n return out;\n}\n\nfunction getOntologyRecord(ontKey, id, ctx) {\n if (!ctx) return null;\n const idNum = +id;\n if (ontKey === 'taxonomy') {\n const t = ctx.taxonomy;\n return (t && t[idNum]) || null;\n }\n if (ontKey === 'pathways') {\n const p = ctx.pathways;\n return (p && p[idNum]) || null;\n }\n const bucket = ctx.ontologies && ctx.ontologies[ontKey];\n return (bucket && bucket[idNum]) || null;\n}\n\n// Returns list of ancestor ids *excluding* self.\nfunction ancestorsOfRecord(ontKey, record, docTaxonId, ctx) {\n if (!record) return null;\n if (ontKey === 'taxonomy') {\n const visited = new Set();\n const stack = Array.isArray(record.is_a) ? record.is_a.slice() : [];\n const taxonomy = (ctx && ctx.taxonomy) || {};\n while (stack.length) {\n const pid = +stack.pop();\n if (visited.has(pid)) continue;\n visited.add(pid);\n const parent = taxonomy[pid];\n if (parent && Array.isArray(parent.is_a)) {\n for (const g of parent.is_a) if (!visited.has(+g)) stack.push(g);\n }\n }\n return Array.from(visited);\n }\n if (ontKey === 'pathways') {\n const taxonKey = docTaxonId != null ? `ancestors_${docTaxonId}` : null;\n let arr = taxonKey && record[taxonKey];\n if (!Array.isArray(arr)) {\n const collected = new Set();\n for (const k of Object.keys(record)) {\n if (k.startsWith('ancestors_') && Array.isArray(record[k])) {\n for (const a of record[k]) collected.add(+a);\n }\n }\n arr = Array.from(collected);\n }\n return arr.filter(x => +x !== +record._id);\n }\n // GO / PO / TO / domains — `ancestors` already includes self\n if (Array.isArray(record.ancestors)) {\n return record.ancestors.filter(x => +x !== +record._id);\n }\n return [];\n}\n\nexport function mostSpecific(ontKey, ids, docTaxonId, ctx) {\n if (!Array.isArray(ids) || ids.length === 0) return [];\n const ancestorSet = new Set();\n let anyResolved = false;\n for (const id of ids) {\n const rec = getOntologyRecord(ontKey, id, ctx);\n if (!rec || rec.missing) continue;\n anyResolved = true;\n const anc = ancestorsOfRecord(ontKey, rec, docTaxonId, ctx);\n if (!anc) continue;\n for (const a of anc) ancestorSet.add(+a);\n }\n if (!anyResolved) return ids.slice();\n return ids.filter(id => !ancestorSet.has(+id));\n}\n\nfunction displayIdAndName(ontKey, id, ctx) {\n const rec = getOntologyRecord(ontKey, id, ctx);\n if (!rec || rec.missing) return { id: String(id), name: '' };\n const displayId = rec.id != null ? String(rec.id) : String(rec._id != null ? rec._id : id);\n let name = rec.name || '';\n if (ontKey === 'taxonomy' && !name) name = rec.display_name || '';\n return { id: displayId, name: String(name) };\n}\n\nexport function formatAncestorsCellTSV(ontKey, ids, docTaxonId, ctx) {\n const specific = mostSpecific(ontKey, ids, docTaxonId, ctx);\n return specific.map(id => {\n const { id: disp, name } = displayIdAndName(ontKey, id, ctx);\n return name ? `${disp} ${name}` : disp;\n }).join(';');\n}\n\nexport function formatAncestorsJSON(ontKey, ids, docTaxonId, ctx) {\n const specific = mostSpecific(ontKey, ids, docTaxonId, ctx);\n return specific.map(id => displayIdAndName(ontKey, id, ctx));\n}\n\nfunction termTypeForRecord(ontKey, rec) {\n if (!rec) return '';\n if (ontKey === 'GO') return rec.namespace || rec.type || '';\n if (ontKey === 'taxonomy') return rec.rank || '';\n return rec.type || rec.namespace || '';\n}\n\n// Expand a doc's selected ancestor fields into rows of\n// { hierarchy, term_id, term_name, term_type }, one per most-specific term.\nexport function resolveAncestorsForDoc(doc, ancestorFields, ctx) {\n const rows = [];\n for (const fieldName of ancestorFields) {\n const ontKey = ANCESTOR_FIELD_MAP[fieldName];\n if (!ontKey) continue;\n const ids = Array.isArray(doc[fieldName]) ? doc[fieldName] : [];\n if (!ids.length) continue;\n const specific = mostSpecific(ontKey, ids, doc.taxon_id, ctx);\n const hierarchy = ANCESTOR_HIERARCHY_LABEL[fieldName] || fieldName;\n for (const id of specific) {\n const rec = getOntologyRecord(ontKey, id, ctx);\n const { id: disp, name } = displayIdAndName(ontKey, id, ctx);\n rows.push({\n hierarchy,\n term_id: disp,\n term_name: name,\n term_type: termTypeForRecord(ontKey, rec)\n });\n }\n }\n return rows;\n}\n","import { getConfiguredCache } from 'money-clip';\n\nconst ONT_KEYS = ['GO', 'PO', 'TO', 'domains'];\n\n// Dedicated IndexedDB store for ontology records. The full term set per\n// ontology is stable enough to keep around indefinitely (default maxAge of\n// `Infinity`), and we don't want it to share the short TTL of the app-wide\n// cache configured in demo.js.\nconst cache = getConfiguredCache({\n version: 1,\n name: 'gramene_ontologies'\n});\n\nconst inflight = {};\n\nconst ontologies = {\n name: 'ontologies',\n\n getReducer: () => {\n const initialState = { GO: {}, PO: {}, TO: {}, domains: {}, loaded: {} };\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'ONTOLOGY_BULK_LOADED':\n return {\n ...state,\n [payload.key]: payload.records,\n loaded: { ...state.loaded, [payload.key]: true }\n };\n default:\n return state;\n }\n };\n },\n\n // Signature kept for backward compatibility — the `ids` argument is\n // ignored. On first call per ontology key we load the full term set\n // (cache hit if available, otherwise `${api}/${key}?rows=-1`) and\n // dispatch a single bulk load. Subsequent calls are no-ops.\n doEnsureOntologyRecords: (key, _ids) => ({ dispatch, store }) => {\n if (!ONT_KEYS.includes(key)) return Promise.resolve();\n const state = store.selectOntologies();\n if (state.loaded && state.loaded[key]) return Promise.resolve();\n if (inflight[key]) return inflight[key];\n\n inflight[key] = cache.get(key)\n .then(cached => {\n if (cached) {\n dispatch({ type: 'ONTOLOGY_BULK_LOADED', payload: { key, records: cached } });\n return;\n }\n const api = store.selectGrameneAPI();\n return fetch(`${api}/${key}?rows=-1`)\n .then(r => r.json())\n .then(docs => {\n const records = {};\n for (const d of (docs || [])) {\n if (d && d._id != null) records[d._id] = d;\n }\n dispatch({ type: 'ONTOLOGY_BULK_LOADED', payload: { key, records } });\n cache.set(key, records).catch(e => console.warn('Failed to cache ontology', key, e));\n });\n })\n .catch(err => {\n console.error(`Failed to load ontology ${key}`, err);\n })\n .finally(() => {\n delete inflight[key];\n });\n\n return inflight[key];\n },\n\n selectOntologies: state => state.ontologies\n};\n\nexport default ontologies;\n","import { createSelector } from 'redux-bundler';\n\n// State shape:\n// {\n// pivot: { status, signature, data: { [taxon_id]: <gene count> }, error, requestId },\n// activeTaxon: <taxon_id|null>,\n// byTaxon: {\n// [taxon_id]: {\n// selectedFields: [<solr field name>...],\n// fieldsModalOpen: <bool>,\n// fetch: { status, offset, total, signature, requestId, error },\n// rows: [<doc>...]\n// }\n// }\n// }\n// Per-taxon study lists are derived in the view layer from expressionStudies.\n\nconst PAGE_SIZE = 200;\n\nlet pivotPendingId = 0;\nconst fetchPending = {}; // per-taxon request id\nconst attrsPending = {}; // per-taxon request id for available attrs\nconst existencePending = {}; // per-taxon request id for field-existence check\n\nfunction pivotSignature(store) {\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n return `${q}|${taxa.sort().join(',')}`;\n}\n\nfunction fetchSignature(store, taxon) {\n const q = store.selectGrameneFiltersQueryString();\n const ev = store.selectExprViz();\n const sel = (ev.byTaxon[taxon] && ev.byTaxon[taxon].selectedFields) || [];\n return `${q}|${taxon}|${sel.slice().sort().join(',')}`;\n}\n\nconst ALWAYS_FL = ['id', 'name', 'system_name', 'taxon_id'];\n\nconst exprViz = {\n name: 'exprViz',\n\n getReducer: () => {\n const initialState = {\n pivot: { status: 'idle', signature: null, data: {}, error: null, requestId: 0 },\n activeTaxon: null,\n byTaxon: {}\n };\n\n function ensureTaxon(state, taxon) {\n if (state.byTaxon[taxon]) return state.byTaxon[taxon];\n return {\n selectedFields: [],\n fieldsModalOpen: false,\n fetch: { status: 'idle', offset: 0, total: 0, signature: null, requestId: 0, error: null },\n rows: [],\n availableAttrs: null,\n attrsSignature: null,\n attrsRequestId: 0,\n fieldExistence: null,\n existenceStatus: 'idle',\n existenceSignature: null,\n existenceRequestId: 0\n };\n }\n\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'EXPRVIZ_PIVOT_STARTED':\n return { ...state, pivot: { status: 'loading', signature: payload.signature, data: state.pivot.data, error: null, requestId: payload.requestId } };\n case 'EXPRVIZ_PIVOT_SUCCEEDED':\n if (payload.requestId !== state.pivot.requestId) return state;\n return { ...state, pivot: { status: 'ready', signature: state.pivot.signature, data: payload.data, error: null, requestId: payload.requestId } };\n case 'EXPRVIZ_PIVOT_FAILED':\n if (payload.requestId !== state.pivot.requestId) return state;\n return { ...state, pivot: { ...state.pivot, status: 'error', error: payload.error } };\n\n case 'EXPRVIZ_ACTIVE_TAXON_SET':\n return { ...state, activeTaxon: payload };\n\n case 'EXPRVIZ_FIELDS_MODAL_TOGGLED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: { ...state.byTaxon, [payload.taxon]: { ...t, fieldsModalOpen: payload.open } }\n };\n }\n case 'EXPRVIZ_FIELDS_SET': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n selectedFields: payload.fields,\n rows: [],\n fetch: { status: 'idle', offset: 0, total: 0, signature: null, requestId: 0, error: null }\n }\n }\n };\n }\n case 'EXPRVIZ_FIELDS_REORDERED': {\n const t = state.byTaxon[payload.taxon];\n if (!t) return state;\n // Same set of fields — preserve rows; only the column/axis order changes.\n const setA = new Set(t.selectedFields);\n const setB = new Set(payload.fields);\n if (setA.size !== setB.size || ![...setA].every(f => setB.has(f))) {\n return state;\n }\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, selectedFields: payload.fields }\n }\n };\n }\n\n case 'EXPRVIZ_FETCH_STARTED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n fetch: { ...t.fetch, status: 'loading', signature: payload.signature, requestId: payload.requestId, error: null }\n }\n }\n };\n }\n case 'EXPRVIZ_FETCH_BATCH': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fetch.requestId) return state;\n const rows = t.rows.concat(payload.docs);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n rows,\n fetch: { ...t.fetch, offset: rows.length, total: payload.total, status: rows.length >= payload.total ? 'done' : 'loading' }\n }\n }\n };\n }\n case 'EXPRVIZ_FETCH_FAILED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fetch.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, fetch: { ...t.fetch, status: 'error', error: payload.error } }\n }\n };\n }\n\n case 'EXPRVIZ_ATTRS_STARTED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, attrsRequestId: payload.requestId, attrsSignature: payload.signature }\n }\n };\n }\n case 'EXPRVIZ_ATTRS_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.attrsRequestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, availableAttrs: payload.attrs }\n }\n };\n }\n\n case 'EXPRVIZ_EXISTENCE_STARTED': {\n const t = ensureTaxon(state, payload.taxon);\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: {\n ...t,\n existenceStatus: 'loading',\n existenceRequestId: payload.requestId,\n existenceSignature: payload.signature\n }\n }\n };\n }\n case 'EXPRVIZ_EXISTENCE_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.existenceRequestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, existenceStatus: 'ready', fieldExistence: payload.counts }\n }\n };\n }\n\n case 'GRAMENE_SEARCH_CLEARED': {\n // Search context changed — invalidate pivot and any loaded rows.\n // Selected fields are kept so the user can re-run the load.\n const newByTaxon = {};\n for (const tid of Object.keys(state.byTaxon)) {\n newByTaxon[tid] = {\n ...state.byTaxon[tid],\n rows: [],\n fetch: { status: 'idle', offset: 0, total: 0, signature: null, requestId: 0, error: null },\n availableAttrs: null,\n attrsSignature: null,\n fieldExistence: null,\n existenceStatus: 'idle',\n existenceSignature: null\n };\n }\n return {\n ...state,\n pivot: { status: 'idle', signature: null, data: {}, error: null, requestId: 0 },\n byTaxon: newByTaxon\n };\n }\n\n default:\n return state;\n }\n };\n },\n\n doFetchExprVizPivot: () => ({ dispatch, store }) => {\n const requestId = ++pivotPendingId;\n const signature = pivotSignature(store);\n dispatch({ type: 'EXPRVIZ_PIVOT_STARTED', payload: { requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const g = store.selectGrameneGenomes();\n const m = store.selectGrameneMaps() || {};\n const taxa = Object.keys(g.active || {}).filter(tid => m[tid] && !m[tid].hidden);\n const fq = taxa.length ? `&fq=taxon_id:(${taxa.join(' OR ')})` : '';\n const facetField = \"{!facet.limit='300' facet.mincount='1' key='taxon_id'}taxon_id\";\n const url = `${api}/search?q=${q}${fq}&fq=expressed_in_gxa_attr_ss:*&rows=0&facet=true&facet.field=${facetField}`;\n\n fetch(url)\n .then(r => r.json())\n .then(json => {\n const arr = (json && json.facet_counts && json.facet_counts.facet_fields && json.facet_counts.facet_fields.taxon_id) || [];\n const data = {};\n for (let i = 0; i < arr.length; i += 2) {\n data[arr[i]] = arr[i + 1];\n }\n if (Object.keys(data).length === 0) {\n console.warn('[exprViz] no taxon_ids found with expression', { url, json });\n }\n dispatch({ type: 'EXPRVIZ_PIVOT_SUCCEEDED', payload: { requestId, data } });\n })\n .catch(err => {\n dispatch({ type: 'EXPRVIZ_PIVOT_FAILED', payload: { requestId, error: String(err) } });\n });\n },\n\n doSetExprVizActiveTaxon: tid => ({ dispatch }) =>\n dispatch({ type: 'EXPRVIZ_ACTIVE_TAXON_SET', payload: tid }),\n\n doToggleExprVizFieldsModal: (taxon, open) => ({ dispatch, store }) => {\n dispatch({ type: 'EXPRVIZ_FIELDS_MODAL_TOGGLED', payload: { taxon, open: !!open } });\n if (open) store.doFetchExprVizAvailableAttrs(taxon);\n },\n\n doFetchExprVizAvailableAttrs: taxon => ({ dispatch, store }) => {\n const q = store.selectGrameneFiltersQueryString();\n const signature = `${q}|${taxon}`;\n const ev = store.selectExprViz();\n const t = ev.byTaxon[taxon];\n if (t && t.availableAttrs && t.attrsSignature === signature) return;\n const requestId = (attrsPending[taxon] = (attrsPending[taxon] || 0) + 1);\n dispatch({ type: 'EXPRVIZ_ATTRS_STARTED', payload: { taxon, requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const facetField = \"{!facet.limit='2000' facet.mincount='1' key='attrs'}expressed_in_gxa_attr_ss\";\n const url = `${api}/search?q=${q}&fq=taxon_id:${taxon}&fq=expressed_in_gxa_attr_ss:*&rows=0&facet=true&facet.field=${facetField}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== attrsPending[taxon]) return;\n const arr = (json && json.facet_counts && json.facet_counts.facet_fields && json.facet_counts.facet_fields.attrs) || [];\n const attrs = [];\n for (let i = 0; i < arr.length; i += 2) attrs.push(arr[i]);\n dispatch({ type: 'EXPRVIZ_ATTRS_SUCCEEDED', payload: { taxon, requestId, attrs } });\n })\n .catch(() => { /* swallow — non-fatal; modal still works without filtering */ });\n },\n\n doSetExprVizFields: (taxon, fields) => ({ dispatch }) =>\n dispatch({ type: 'EXPRVIZ_FIELDS_SET', payload: { taxon, fields } }),\n\n doReorderExprVizFields: (taxon, fields) => ({ dispatch }) =>\n dispatch({ type: 'EXPRVIZ_FIELDS_REORDERED', payload: { taxon, fields } }),\n\n doFetchExprVizData: taxon => ({ dispatch, store }) => {\n const ev = store.selectExprViz();\n const t = ev.byTaxon[taxon];\n if (!t || t.selectedFields.length === 0) return;\n const requestId = (fetchPending[taxon] = (fetchPending[taxon] || 0) + 1);\n const signature = fetchSignature(store, taxon);\n dispatch({ type: 'EXPRVIZ_FETCH_STARTED', payload: { taxon, requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const q = store.selectGrameneFiltersQueryString();\n const fl = [...new Set([...ALWAYS_FL, ...t.selectedFields])].join(',');\n\n const fetchPage = (offset) => {\n if (requestId !== fetchPending[taxon]) return; // superseded\n const url = `${api}/search?q=${q}&fq=taxon_id:${taxon}&fl=${fl}&rows=${PAGE_SIZE}&start=${offset}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== fetchPending[taxon]) return;\n const docs = (json.response && json.response.docs) || [];\n const total = (json.response && json.response.numFound) || 0;\n dispatch({ type: 'EXPRVIZ_FETCH_BATCH', payload: { taxon, requestId, docs, total } });\n const next = offset + docs.length;\n if (docs.length > 0 && next < total) {\n fetchPage(next);\n }\n })\n .catch(err => {\n dispatch({ type: 'EXPRVIZ_FETCH_FAILED', payload: { taxon, requestId, error: String(err) } });\n });\n };\n fetchPage(0);\n },\n\n // Per-candidate-field non-null counts under the current q + taxon. Used by\n // FieldsModal to hide fields that have no data in the current result set\n // before the user picks. Uses stats.field (the swagger whitelist drops\n // facet.query) batched across multiple GETs to stay under URL limits.\n doFetchExprVizFieldExistence: (taxon, fields) => ({ dispatch, store }) => {\n if (!fields || fields.length === 0) return;\n const q = store.selectGrameneFiltersQueryString();\n const fieldsKey = fields.slice().sort().join(',');\n const signature = `${q}|${taxon}|${fieldsKey}`;\n const ev = store.selectExprViz();\n const t = ev.byTaxon[taxon];\n if (t && t.fieldExistence && t.existenceSignature === signature) return;\n\n const requestId = (existencePending[taxon] = (existencePending[taxon] || 0) + 1);\n dispatch({ type: 'EXPRVIZ_EXISTENCE_STARTED', payload: { taxon, requestId, signature } });\n\n const api = store.selectGrameneAPI();\n const BATCH_SIZE = 40;\n const batches = [];\n for (let i = 0; i < fields.length; i += BATCH_SIZE) {\n batches.push(fields.slice(i, i + BATCH_SIZE));\n }\n\n Promise.all(batches.map(batch => {\n const params = new URLSearchParams();\n params.append('q', q);\n params.append('fq', `taxon_id:${taxon}`);\n params.append('rows', '0');\n params.append('stats', 'true');\n batch.forEach(f => params.append('stats.field', f));\n return fetch(`${api}/search?${params.toString()}`)\n .then(r => r.json())\n .then(json => {\n const sf = (json && json.stats && json.stats.stats_fields) || {};\n const out = {};\n for (const f of Object.keys(sf)) {\n const s = sf[f];\n out[f] = s && typeof s.count === 'number' ? s.count : 0;\n }\n return out;\n });\n }))\n .then(results => {\n if (requestId !== existencePending[taxon]) return;\n const counts = Object.assign({}, ...results);\n dispatch({ type: 'EXPRVIZ_EXISTENCE_SUCCEEDED', payload: { taxon, requestId, counts } });\n })\n .catch(() => { /* swallow — non-fatal; modal falls back to showing all */ });\n },\n\n reactExprVizPivot: createSelector(\n 'selectExprViz',\n 'selectGrameneFiltersStatus',\n 'selectGrameneViews',\n 'selectGrameneFiltersQueryString',\n 'selectGrameneGenomes',\n 'selectGrameneMaps',\n (ev, filtersStatus, views, q, g, m) => {\n if (!ev || filtersStatus === 'init') return;\n const onView = views && views.options && views.options.find(v => v.id === 'exprViz');\n if (!onView || onView.show !== 'on') return;\n const maps = m || {};\n const taxa = Object.keys((g && g.active) || {}).filter(tid => maps[tid] && !maps[tid].hidden);\n const sig = `${q}|${taxa.sort().join(',')}`;\n if (ev.pivot.status === 'loading') return;\n if (ev.pivot.signature === sig && ev.pivot.status === 'ready') return;\n return { actionCreator: 'doFetchExprVizPivot' };\n }\n ),\n\n selectExprViz: state => state.exprViz,\n selectExprVizPivot: state => state.exprViz.pivot,\n selectExprVizActiveTaxon: state => state.exprViz.activeTaxon,\n selectExprVizByTaxon: state => state.exprViz.byTaxon\n};\n\nexport default exprViz;\n","import { createSelector } from 'redux-bundler';\n\n// Ontology over-representation analysis (clusterProfiler::enrichGO-style).\n//\n// For each species tab we run:\n// foreground: q=<filters>&fq=taxon_id:<tid>&rows=0 + facet on six __ancestors fields\n// background: q=taxon_id:<tid>&rows=0 + same facets (cached forever per tid)\n//\n// For every ontology section we compute a single hypergeometric universe:\n// N = # genes annotated to any term in this ontology section (= largest bg facet count)\n// K = # input genes annotated to any term in this section (= largest fg facet count)\n// and per term:\n// M = bg facet count, count = fg facet count\n// p = P(X >= count), X ~ Hypergeometric(N, M, K)\n// p-values are BH-adjusted across the tested terms in the section.\n// GO is split into its three sub-ontologies (BP/MF/CC) by namespace so each\n// gets its own (N, K) and BH correction, matching enrichGO. Terms with\n// fewer than `minGSSize` or more than `maxGSSize` annotated genes are\n// dropped before testing (enrichGO defaults: 10 / 500).\n\nconst ONTOLOGIES = [\n { key: 'GO', field: 'GO__ancestors', label: 'Gene Ontology', bucket: 'GO' },\n { key: 'PO', field: 'PO__ancestors', label: 'Plant Ontology', bucket: 'PO' },\n { key: 'TO', field: 'TO__ancestors', label: 'Trait Ontology', bucket: 'TO' },\n { key: 'QTL_TO', field: 'QTL_TO__ancestors', label: 'QTL Traits (TO)', bucket: 'TO' },\n { key: 'domains', field: 'domains__ancestors', label: 'InterPro Domains', bucket: 'domains' },\n { key: 'pathways', field: 'pathways__ancestors', label: 'Pathways', bucket: null }\n];\n\nconst FACET_PARAMS = ONTOLOGIES.map(o =>\n `facet.field=${encodeURIComponent(`{!facet.limit=10000 facet.mincount=1 key=${o.key}}${o.field}`)}`\n).join('&');\n\nconst fgPending = {};\nconst bgPending = {};\n\nfunction fgSig(q, taxon) { return `${q}|${taxon}`; }\nfunction bgSig(taxon) { return `bg|${taxon}`; }\n\nfunction parseFacets(json) {\n const out = {};\n const ff = (json && json.facet_counts && json.facet_counts.facet_fields) || {};\n for (const o of ONTOLOGIES) {\n const arr = ff[o.key] || [];\n const map = {};\n for (let i = 0; i < arr.length; i += 2) {\n map[+arr[i]] = +arr[i + 1];\n }\n out[o.key] = map;\n }\n return out;\n}\n\nconst ontologyEnrichment = {\n name: 'ontologyEnrichment',\n\n // Background facet counts depend only on the species — they're invariant\n // across filter changes and across sessions, so we persist whenever a bg\n // fetch completes. Foreground state piggybacks on the same write but is\n // self-invalidated by the signature check in the reactor.\n persistActions: ['ONTOLOGY_ENRICHMENT_BG_SUCCEEDED'],\n\n getReducer: () => {\n const initialState = {\n activeTaxon: null,\n byTaxon: {},\n ui: {\n pAdjCutoff: 0.05,\n minGSSize: 10,\n maxGSSize: 500,\n mostSpecific: false,\n ontology: 'all',\n search: ''\n }\n };\n\n function ensureTaxon(state, tid) {\n if (state.byTaxon[tid]) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [tid]: {\n fg: { status: 'idle', signature: null, requestId: 0, terms: null, numFound: 0, error: null },\n bg: { status: 'idle', signature: null, requestId: 0, terms: null, numFound: 0, error: null }\n }\n }\n };\n }\n\n return (state = initialState, { type, payload }) => {\n switch (type) {\n case 'ONTOLOGY_ENRICHMENT_ACTIVE_TAXON_SET':\n return { ...ensureTaxon(state, payload), activeTaxon: payload };\n\n case 'ONTOLOGY_ENRICHMENT_UI_SET':\n return { ...state, ui: { ...state.ui, ...(payload || {}) } };\n\n case 'ONTOLOGY_ENRICHMENT_FG_STARTED': {\n const next = ensureTaxon(state, payload.taxon);\n const t = next.byTaxon[payload.taxon];\n return {\n ...next,\n byTaxon: {\n ...next.byTaxon,\n [payload.taxon]: {\n ...t,\n fg: { status: 'loading', signature: payload.signature, requestId: payload.requestId, terms: t.fg.terms, numFound: t.fg.numFound, error: null }\n }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_FG_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, fg: { ...t.fg, status: 'ready', terms: payload.terms, numFound: payload.numFound } }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_FG_FAILED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.fg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, fg: { ...t.fg, status: 'error', error: payload.error } }\n }\n };\n }\n\n case 'ONTOLOGY_ENRICHMENT_BG_STARTED': {\n const next = ensureTaxon(state, payload.taxon);\n const t = next.byTaxon[payload.taxon];\n return {\n ...next,\n byTaxon: {\n ...next.byTaxon,\n [payload.taxon]: {\n ...t,\n bg: { status: 'loading', signature: payload.signature, requestId: payload.requestId, terms: t.bg.terms, numFound: t.bg.numFound, error: null }\n }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_BG_SUCCEEDED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.bg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, bg: { ...t.bg, status: 'ready', terms: payload.terms, numFound: payload.numFound } }\n }\n };\n }\n case 'ONTOLOGY_ENRICHMENT_BG_FAILED': {\n const t = state.byTaxon[payload.taxon];\n if (!t || payload.requestId !== t.bg.requestId) return state;\n return {\n ...state,\n byTaxon: {\n ...state.byTaxon,\n [payload.taxon]: { ...t, bg: { ...t.bg, status: 'error', error: payload.error } }\n }\n };\n }\n\n case 'GRAMENE_SEARCH_CLEARED': {\n // Filters changed — invalidate foreground but keep background\n // (it depends only on taxon).\n const newByTaxon = {};\n for (const tid of Object.keys(state.byTaxon)) {\n const t = state.byTaxon[tid];\n newByTaxon[tid] = {\n ...t,\n fg: { status: 'idle', signature: null, requestId: 0, terms: null, numFound: 0, error: null }\n };\n }\n return { ...state, byTaxon: newByTaxon };\n }\n\n default:\n return state;\n }\n };\n },\n\n doSetOntologyEnrichmentActiveTaxon: tid => ({ dispatch }) =>\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_ACTIVE_TAXON_SET', payload: tid }),\n\n doSetOntologyEnrichmentUI: patch => ({ dispatch }) =>\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_UI_SET', payload: patch }),\n\n doFetchOntologyEnrichmentForeground: taxon => ({ dispatch, store }) => {\n const q = store.selectGrameneFiltersQueryString();\n const signature = fgSig(q, taxon);\n const state = store.selectOntologyEnrichment();\n const t = state.byTaxon[taxon];\n if (t && t.fg.signature === signature && (t.fg.status === 'loading' || t.fg.status === 'ready')) return;\n const requestId = (fgPending[taxon] = (fgPending[taxon] || 0) + 1);\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_FG_STARTED', payload: { taxon, signature, requestId } });\n\n const api = store.selectGrameneAPI();\n const url = `${api}/search?q=${q}&fq=taxon_id:${taxon}&rows=0&facet=true&${FACET_PARAMS}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== fgPending[taxon]) return;\n const terms = parseFacets(json);\n const numFound = (json && json.response && json.response.numFound) || 0;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_FG_SUCCEEDED', payload: { taxon, requestId, terms, numFound } });\n store.doEnsureOntologyEnrichmentTermRecords(taxon);\n })\n .catch(err => {\n if (requestId !== fgPending[taxon]) return;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_FG_FAILED', payload: { taxon, requestId, error: String(err) } });\n });\n },\n\n doFetchOntologyEnrichmentBackground: taxon => ({ dispatch, store }) => {\n const signature = bgSig(taxon);\n const state = store.selectOntologyEnrichment();\n const t = state.byTaxon[taxon];\n if (t && t.bg.signature === signature && (t.bg.status === 'loading' || t.bg.status === 'ready')) return;\n const requestId = (bgPending[taxon] = (bgPending[taxon] || 0) + 1);\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_BG_STARTED', payload: { taxon, signature, requestId } });\n\n const api = store.selectGrameneAPI();\n const url = `${api}/search?q=taxon_id:${taxon}&rows=0&facet=true&${FACET_PARAMS}`;\n fetch(url)\n .then(r => r.json())\n .then(json => {\n if (requestId !== bgPending[taxon]) return;\n const terms = parseFacets(json);\n const numFound = (json && json.response && json.response.numFound) || 0;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_BG_SUCCEEDED', payload: { taxon, requestId, terms, numFound } });\n store.doEnsureOntologyEnrichmentTermRecords(taxon);\n })\n .catch(err => {\n if (requestId !== bgPending[taxon]) return;\n dispatch({ type: 'ONTOLOGY_ENRICHMENT_BG_FAILED', payload: { taxon, requestId, error: String(err) } });\n });\n },\n\n doEnsureOntologyEnrichmentTermRecords: taxon => ({ store }) => {\n const state = store.selectOntologyEnrichment();\n if (!state.byTaxon[taxon]) return;\n // The ontologies and pathways bundles bulk-load + persist on first\n // request; we just need to nudge each one once.\n const buckets = new Set();\n for (const o of ONTOLOGIES) {\n if (o.bucket) buckets.add(o.bucket);\n }\n for (const k of buckets) {\n store.doEnsureOntologyRecords(k);\n }\n if (store.doRequestGramenePathways) {\n store.doRequestGramenePathways();\n }\n },\n\n reactOntologyEnrichmentFetch: createSelector(\n 'selectOntologyEnrichment',\n 'selectGrameneFiltersStatus',\n 'selectGrameneFiltersQueryString',\n 'selectGrameneViewsOn',\n (gs, fStatus, q, viewsOn) => {\n if (!viewsOn || !viewsOn.has('ontologyEnrichment')) return;\n if (fStatus === 'init') return;\n const tid = gs.activeTaxon;\n if (!tid) return;\n const t = gs.byTaxon[tid];\n if (!t) return;\n const sig = fgSig(q, tid);\n // A 'loading' status from a rehydrated state with no live request is\n // treated as idle — otherwise we'd deadlock waiting on a fetch that\n // ended when the previous tab closed.\n const fgInFlight = t.fg.status === 'loading' && (fgPending[tid] || 0) === t.fg.requestId && t.fg.requestId > 0;\n if (t.fg.signature !== sig && !fgInFlight) {\n return { actionCreator: 'doFetchOntologyEnrichmentForeground', args: [tid] };\n }\n const bgInFlight = t.bg.status === 'loading' && (bgPending[tid] || 0) === t.bg.requestId && t.bg.requestId > 0;\n if (t.bg.status !== 'ready' && !bgInFlight) {\n return { actionCreator: 'doFetchOntologyEnrichmentBackground', args: [tid] };\n }\n }\n ),\n\n selectOntologyEnrichment: state => state.ontologyEnrichment,\n selectOntologyEnrichmentUI: state => state.ontologyEnrichment.ui,\n selectOntologyEnrichmentOntologyDefs: () => ONTOLOGIES,\n\n selectOntologyEnrichmentResults: createSelector(\n 'selectOntologyEnrichment',\n 'selectOntologies',\n 'selectGramenePathways',\n (gs, ontoBuckets, pathwayDocs) => {\n const tid = gs.activeTaxon;\n if (!tid) return null;\n const t = gs.byTaxon[tid];\n if (!t || !t.fg.terms || !t.bg.terms) return null;\n const ui = gs.ui;\n const out = {};\n for (const o of ONTOLOGIES) {\n const fg = t.fg.terms[o.key] || {};\n const bg = t.bg.terms[o.key] || {};\n const recs = o.key === 'pathways' ? (pathwayDocs || {}) : ((ontoBuckets && ontoBuckets[o.bucket]) || {});\n\n // GO is tested per sub-ontology (BP / MF / CC) so each gets its\n // own universe size and BH correction, matching enrichGO. We can\n // only split once ontology records have arrived and namespaces are\n // known; until then, fall through to a single-section test.\n if (o.key === 'GO' && Object.keys(recs).length > 0) {\n const byNs = { biological_process: { fg: {}, bg: {} },\n molecular_function: { fg: {}, bg: {} },\n cellular_component: { fg: {}, bg: {} } };\n for (const idStr of Object.keys(bg)) {\n const id = +idStr;\n const ns = recs[id] && recs[id].namespace;\n if (!byNs[ns]) continue;\n byNs[ns].bg[id] = bg[id];\n if (fg[id] != null) byNs[ns].fg[id] = fg[id];\n }\n for (const idStr of Object.keys(fg)) {\n const id = +idStr;\n const ns = recs[id] && recs[id].namespace;\n if (!byNs[ns]) continue;\n if (byNs[ns].fg[id] == null) byNs[ns].fg[id] = fg[id];\n }\n for (const ns of Object.keys(byNs)) {\n const sectionKey = `GO:${ns}`;\n const sectionLabel = `GO: ${titleCase(ns)}`;\n out[sectionKey] = enrichSection(\n byNs[ns].fg, byNs[ns].bg, recs, ui,\n o.key, o.field, o.label, sectionKey, sectionLabel\n );\n }\n } else {\n out[o.key] = enrichSection(\n fg, bg, recs, ui,\n o.key, o.field, o.label, o.key, o.label\n );\n }\n }\n return out;\n }\n )\n};\n\nfunction titleCase(s) {\n return String(s).split('_').map(w => w ? w[0].toUpperCase() + w.slice(1) : '').join(' ');\n}\n\n// One ORA section: hypergeometric over a single (N, K) universe, BH-adjusted\n// across tested terms. Universe sizes come from the largest facet count in\n// the section — for an ontology with a synthetic root that's the root's\n// gene count (exact), and for forests it's the most populated top-level\n// term (a conservative approximation).\nfunction enrichSection(fg, bg, recs, ui, ontKey, ontField, ontLabel, sectionKey, sectionLabel) {\n let N = 0, K = 0;\n for (const idStr of Object.keys(bg)) {\n const v = bg[idStr]; if (v > N) N = v;\n }\n for (const idStr of Object.keys(fg)) {\n const v = fg[idStr]; if (v > K) K = v;\n }\n const empty = {\n ontology: sectionKey, label: sectionLabel, field: ontField,\n tested: 0, passing: 0, rows: [],\n universeSize: N, deSize: K\n };\n if (N <= 0 || K <= 0) return empty;\n\n const minGS = Math.max(1, +ui.minGSSize || 1);\n const maxGS = Math.max(minGS, +ui.maxGSSize || N);\n\n const rows = [];\n for (const idStr of Object.keys(fg)) {\n const id = +idStr;\n const count = fg[id];\n const M = bg[id] || 0;\n if (M < count) continue;\n if (M < minGS || M > maxGS) continue;\n const termRec = recs && recs[id];\n if (termRec && (termRec.is_obsolete || termRec.obsolete)) continue;\n if (count > K || M > N) continue;\n\n const p = fisherUpperTail(count, K, M, N);\n const richFactor = M > 0 ? count / M : 0;\n const foldEnrichment = (M > 0 && K > 0) ? (count / K) / (M / N) : 0;\n const mu = M * K / N;\n const sigma2 = N > 1 ? mu * (N - K) * (N - M) / N / (N - 1) : 0;\n const zScore = sigma2 > 0 ? (count - mu) / Math.sqrt(sigma2) : 0;\n\n rows.push({\n ontology: ontKey,\n ontology_label: ontLabel,\n term_id: id,\n field: ontField,\n Count: count,\n DESize: K,\n SetSize: M,\n UniverseSize: N,\n GeneRatio: `${count}/${K}`,\n BgRatio: `${M}/${N}`,\n RichFactor: richFactor,\n FoldEnrichment: foldEnrichment,\n zScore,\n pvalue: p,\n pAdjust: 1\n });\n }\n\n // BH adjustment across all tested terms in this section.\n rows.sort((a, b) => a.pvalue - b.pvalue);\n const m = rows.length;\n let prev = 1;\n for (let i = m - 1; i >= 0; i--) {\n const adj = Math.min(prev, rows[i].pvalue * m / (i + 1));\n rows[i].pAdjust = adj;\n prev = adj;\n }\n\n const passing = rows.filter(r => r.pAdjust <= ui.pAdjCutoff && r.pvalue <= ui.pAdjCutoff);\n let display = passing;\n if (ui.mostSpecific) {\n display = collapseToMostSpecific(ontKey, passing, recs);\n }\n for (const r of display) {\n const rec = recs && recs[r.term_id];\n if (rec) {\n r.term_name = rec.name || rec.display_name || '';\n r.term_namespace = rec.namespace || rec.type || '';\n r.term_display_id = rec.id != null ? String(rec.id) : String(r.term_id);\n } else {\n r.term_name = '';\n r.term_namespace = '';\n r.term_display_id = String(r.term_id);\n }\n r.Description = r.term_name || r.term_display_id;\n }\n display.sort((a, b) => a.pAdjust - b.pAdjust || b.FoldEnrichment - a.FoldEnrichment);\n\n return {\n ontology: sectionKey,\n label: sectionLabel,\n field: ontField,\n tested: rows.length,\n passing: passing.length,\n rows: display,\n universeSize: N,\n deSize: K\n };\n}\n\n// ---------- math helpers ----------\n\nconst LF_CACHE = [0, 0];\nfunction logFactorial(n) {\n if (n < LF_CACHE.length) return LF_CACHE[n];\n let lf = LF_CACHE[LF_CACHE.length - 1];\n for (let i = LF_CACHE.length; i <= n; i++) {\n lf += Math.log(i);\n LF_CACHE.push(lf);\n }\n return LF_CACHE[n];\n}\nfunction logChoose(n, k) {\n if (k < 0 || k > n) return -Infinity;\n return logFactorial(n) - logFactorial(k) - logFactorial(n - k);\n}\nfunction logHypergeom(x, n, K, N) {\n return logChoose(K, x) + logChoose(N - K, n - x) - logChoose(N, n);\n}\nfunction logSumExp(a, b) {\n if (a === -Infinity) return b;\n if (b === -Infinity) return a;\n const m = Math.max(a, b);\n return m + Math.log(Math.exp(a - m) + Math.exp(b - m));\n}\nfunction fisherUpperTail(k, n, K, N) {\n const upper = Math.min(n, K);\n let logP = -Infinity;\n for (let x = k; x <= upper; x++) {\n logP = logSumExp(logP, logHypergeom(x, n, K, N));\n }\n const p = Math.exp(logP);\n if (!isFinite(p)) return 1;\n return Math.min(1, Math.max(0, p));\n}\n\n// ---------- ontology graph helpers ----------\n\nfunction ancestorsOf(ontKey, id, recs) {\n const out = new Set();\n const rec = recs && recs[id];\n if (!rec) return out;\n if (ontKey === 'pathways') {\n for (const k of Object.keys(rec)) {\n if (k.startsWith('ancestors_') && Array.isArray(rec[k])) {\n for (const a of rec[k]) if (+a !== +id) out.add(+a);\n }\n }\n return out;\n }\n if (Array.isArray(rec.ancestors)) {\n for (const a of rec.ancestors) if (+a !== +id) out.add(+a);\n return out;\n }\n if (Array.isArray(rec.is_a)) {\n const stack = rec.is_a.slice();\n while (stack.length) {\n const cur = +stack.pop();\n if (out.has(cur)) continue;\n out.add(cur);\n const r = recs[cur];\n if (r && Array.isArray(r.is_a)) for (const p of r.is_a) stack.push(p);\n }\n }\n return out;\n}\n\n// Drop any term that is an ancestor of another term in the same passing set.\n// Applied AFTER BH so a parent term can survive when none of its children\n// pass the p_adj cutoff.\nfunction collapseToMostSpecific(ontKey, rows, recs) {\n if (!rows || rows.length <= 1) return rows;\n const inSet = new Set(rows.map(r => +r.term_id));\n const covered = new Set();\n for (const r of rows) {\n const ancs = ancestorsOf(ontKey, +r.term_id, recs);\n for (const a of ancs) if (inSet.has(a)) covered.add(a);\n }\n return rows.filter(r => !covered.has(+r.term_id));\n}\n\nexport default ontologyEnrichment;\n","import {connect} from 'redux-bundler-react'\nimport React from 'react'\n\nconst Gene = ({gene}) => {\n return <div className=\"row\">{gene.id}</div>\n};\n\nconst Genes = (results, rows, doChangeQuantity) => {\n if (results && results.numFound > 0) {\n const moreButton = (results.numFound > rows)\n ? <button onClick={e => doChangeQuantity('Genes',20)}>more</button>\n : '';\n const fewerButton = (rows > 20)\n ? <button onClick={e => doChangeQuantity('Genes',-20)}>fewer</button>\n : '';\n const docsToShow = results.response.docs.slice(0,rows);\n return (\n <div id=\"Genes\" className=\"container mb40 anchor\">\n <div className=\"fancy-title mb40\">\n <h4>Genes</h4>\n </div>\n {docsToShow.map((doc,idx) => <Gene key={idx} gene={doc}/>)}\n {fewerButton}{moreButton}\n </div>\n );\n }\n};\n\nconst Pathway = ({pathway}) => {\n return <div className=\"row\">{pathway.name}</div>\n};\nconst Pathways = results => {\n if (results && results.numFound > 0) {\n return (\n <div id=\"Pathways\" className=\"container mb40 anchor\">\n <div className=\"fancy-title\">\n <h4>Pathways</h4>\n </div>\n {results.pathways.map((doc,idx) => (<Pathway key={idx} pathway={doc}/>))}\n </div>\n );\n }\n};\n\nconst Domain = ({domain}) => {\n return <div className=\"row\">{domain.id}</div>\n};\nconst Domains = results => {\n if (results && results.numFound > 0) {\n return (\n <div id=\"Domains\" className=\"container mb40 anchor\">\n <div className=\"fancy-title mb40\">\n <h4>Domains</h4>\n </div>\n {results.domains.map((doc,idx) => (<Domain key={idx} domain={doc}/>))}\n </div>\n );\n }\n};\n\nconst Taxon = ({taxon}) => {\n return <div className=\"row\">{taxon.id}</div>\n};\nconst Species = results => {\n if (results && results.numFound > 0) {\n return (\n <div id=\"Species\" className=\"container mb40 anchor\">\n <div className=\"fancy-title mb40\">\n <h4>Species</h4>\n </div>\n {results.taxonomy.map((doc,idx) => (<Taxon key={idx} taxon={doc}/>))}\n </div>\n );\n }\n};\n\nconst ResultList = ({grameneGenes, grameneDomains, gramenePathways, grameneTaxonomy, searchUI, searchUpdated, doChangeQuantity}) => {\n if (searchUI.Gramene) {\n return (\n <div id=\"gramene\" className=\"row\">\n <div className=\"fancy-title pt50\">\n <h3>Gramene search results</h3>\n </div>\n {searchUI.Genes && Genes(grameneGenes, searchUI.rows.Genes, doChangeQuantity)}\n {searchUI.Domains && Domains(grameneDomains)}\n {searchUI.Pathways && Pathways(gramenePathways)}\n {searchUI.Species && Species(grameneTaxonomy)}\n </div>\n )\n }\n else {\n return null;\n }\n};\n\nexport default connect(\n 'selectGrameneGenes',\n 'selectGrameneDomains',\n 'selectGramenePathways',\n 'selectGrameneTaxonomy',\n 'selectSearchUI',\n 'selectSearchUpdated',\n 'doChangeQuantity',\n ResultList\n);\n","import {connect} from 'redux-bundler-react'\nimport React from 'react'\n\nconst getStatus = (cat, results, isChecked, toggle) => {\n const tally = results ? results.numFound : <img src=\"/static/images/dna_spinner.svg\"/>;\n return (\n <li className='category-leaf'>\n <input type=\"checkbox\" checked={isChecked} onChange={e => toggle(cat)}/>\n <a data-scroll href={`#${cat}`} className=\"nav-link active\">{cat}<span style={{float:\"right\"}}>{tally}</span></a>\n </li>\n )\n};\n\nconst ResultSummary = ({grameneGenes, gramenePathways, grameneDomains, grameneTaxonomy, searchUI, searchUpdated, doToggleCategory}) => {\n const status = grameneGenes ?\n grameneGenes.numFound:\n<img src=\"/static/images/dna_spinner.svg\"/>;\n if (searchUI.Gramene) return (\n <li className=\"active category-expanded\">\n <a onClick={e => doToggleCategory('Gramene')}>\n Gramene Search<span style={{float:\"right\"}}>{status}</span>\n </a>\n <ul className=\"list-unstyled\">\n {getStatus('Genes', grameneGenes, searchUI.Genes, doToggleCategory)}\n {getStatus('Domains', grameneDomains, searchUI.Domains, doToggleCategory)}\n {getStatus('Pathways', gramenePathways, searchUI.Pathways, doToggleCategory)}\n {getStatus('Species', grameneTaxonomy, searchUI.Species, doToggleCategory)}\n</ul>\n </li>\n);\nelse return (\n <li className=\"active category-collapsed\">\n <a onClick={e => doToggleCategory('Gramene')}>\n Gramene Search<span\n style={{float:\"right\"}}>{status}</span>\n </a>\n </li>\n);\n};\n\nexport default connect(\n 'selectGrameneGenes',\n 'selectGramenePathways',\n 'selectGrameneDomains',\n 'selectGrameneTaxonomy',\n 'selectSearchUI',\n 'selectSearchUpdated',\n 'doToggleCategory',\n ResultSummary\n);\n","import {connect} from 'redux-bundler-react'\nimport React from 'react'\nimport ReactGA from 'react-ga4'\nimport { Button, Badge, Alert } from 'react-bootstrap'\nimport './styles.css'\n\nfunction showMatches(text, x) {\n let re = new RegExp(`(${x})`, 'ig');\n let match = text.split(re);\n return <span>\n {match.map((str, idx) => {\n if (idx % 2 === 1) {\n return <span key={idx} style={{fontWeight:'bolder'}}>{str}</span>\n }\n return <span key={idx}>{str}</span>\n })}\n </span>\n}\n\nfunction logAction(sugg) {\n ReactGA.event({\n category: 'Search',\n action: 'SetFilter',\n label: sugg.name\n })\n}\nfunction getLowestCommonAncestorName(tids, taxonomy) {\n let lca;\n tids.forEach(tid => {\n if (!lca) {\n lca = [...taxonomy[tid].ancestors];\n } else {\n let ancestors = new Set(taxonomy[tid].ancestors);\n while (!ancestors.has(lca[0])) {\n lca.shift();\n }\n }\n });\n return taxonomy[lca[0]].short_name;\n}\n\nconst TryPan = (props) => {\n const query = props.query;\n const pan = props.pan;\n return <div className=\"suggestion-panlink\">\n <a target=\"_blank\" href={pan.url + \"?suggestion=\" + query}>\n <img src={pan.svg} title={`Search at ${pan.name}`}/>\n </a>\n </div>;\n};\n\nconst TryAnotherSite = props => {\n const query = props.query;\n const config = props.config;\n let sites = Object.keys(config.panSite);\n return <div>\n <Alert variant={'info'}>Don't see what you're looking for? Search for <b>{query}</b> on one of our sister sites</Alert>\n {sites.map((p, idx) => <TryPan key={idx} query={query} pan={config.panSite[p]}/>)}\n </div>\n}\n\nconst Suggestions = props => {\n let suggestions = props.grameneSuggestions;\n if (suggestions && suggestions.grouped) {\n if (suggestions.grouped.category.matches === 0) {\n let sugg1 = {\n fq_field: 'text',\n fq_value: props.suggestionsQuery,\n name: `Genes containing \"${props.suggestionsQuery}\"`,\n category: 'Gene',\n };\n let sugg2 = {\n fq_field: 'text',\n fq_value: `${props.suggestionsQuery}*`,\n name: `Genes matching \"${props.suggestionsQuery}*\"`,\n category: 'Gene',\n };\n return (\n <div style={{margin: '10px', maxWidth: '820px'}}>\n <Alert variant={'info'}><em>No suggestions found.</em> You may still attempt a full text search, though it is unlikely to find any genes for you.</Alert>\n <Button id={'word'}\n size={'sm'}\n variant={'outline-secondary'}\n onClick={() => {logAction(sugg1); props.doAcceptSuggestion(sugg1); props.doAcceptGrameneSuggestion(sugg1)}}>\n {`All genes that contain the word \"${props.suggestionsQuery}\"`}\n </Button>\n <Button id={'word'}\n size={'sm'}\n variant={'outline-secondary'}\n onClick={() => {logAction(sugg2); props.doAcceptSuggestion(sugg2); props.doAcceptGrameneSuggestion(sugg2)}}>\n {`All genes that contain a word that starts with \"${props.suggestionsQuery}\"`}\n </Button>\n <TryAnotherSite query={props.suggestionsQuery} config={props.configuration}/>\n </div>\n );\n }\n else {\n return (\n <div style={{margin: '10px'}}>\n {suggestions.grouped.category.groups.map((g,idx) => {\n return <div key={idx} id='gramene-suggestion'>\n <h4 className=\"mt10\">{g.groupValue}</h4>\n {g.doclist.docs.map((sugg,jdx) =>\n <Button id={`${idx}-${jdx}`}\n key={jdx}\n disabled={sugg.num_genes === 0}\n size='sm'\n variant=\"outline-secondary\"\n onClick={() => {logAction(sugg); props.doAcceptSuggestion(sugg); props.doAcceptGrameneSuggestion(sugg)}}>\n {showMatches(sugg.display_name,props.suggestionsQuery)}{' '}\n <Badge bg=\"secondary\">{sugg.num_genes}</Badge>\n <i> {getLowestCommonAncestorName(sugg.taxon_id, props.grameneTaxonomy)}</i>\n </Button>\n )}\n </div>\n })}\n <TryAnotherSite query={props.suggestionsQuery} config={props.configuration}/>\n </div>\n );\n }\n }\n else {\n return <div></div>\n }\n}\n\nexport default connect(\n 'selectGrameneSuggestions',\n 'selectSuggestionsQuery',\n 'selectGrameneTaxonomy',\n 'selectConfiguration',\n 'doAcceptSuggestion',\n 'doAcceptGrameneSuggestion',\n Suggestions\n);\n","import React, { useState, useRef, useEffect } from 'react'\nimport { connect } from 'redux-bundler-react'\nimport { Navbar, Nav, NavDropdown, Container, OverlayTrigger, Popover} from 'react-bootstrap'\nimport Switch from 'react-switch'\nimport { IoAlertCircle } from 'react-icons/io5'\nimport { BsGearFill,BsTrash,BsChevronDown,BsChevronRight } from 'react-icons/bs'\nimport GeneList from './results/GeneList'\nimport TaxDist from './results/TaxDist'\nimport HelpDemo from './results/HelpDemo'\nimport GeneAttribs from './results/GeneAttribs'\nimport TaxonomyModal from './TaxonomyModal'\nimport Expression from './results/Expression'\nimport UserGeneLists from './results/UserGeneLists'\nimport ExporterView from './exporter/ExporterView'\nimport ExprVizView from './exprViz/ExprVizView'\nimport OntologyEnrichment from './results/OntologyEnrichment'\nimport Auth from './Auth'\nimport ReactGA from 'react-ga4'\nimport './styles.css';\n\nconst CollapsibleSection = ({ title, defaultOpen = true, extra, children }) => {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <div className=\"sidebar-section\">\n <div className=\"sidebar-section-header\" onClick={() => setOpen(!open)}>\n <b>{title}</b>\n <span className=\"sidebar-section-actions\">\n {extra}\n <span className=\"sidebar-section-toggle\">\n {open ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n </span>\n </div>\n {open && <div className=\"sidebar-section-body\">{children}</div>}\n </div>\n );\n};\n\nconst inventory = {\n help: HelpDemo,\n list: GeneList,\n taxonomy: TaxDist,\n attribs: GeneAttribs,\n expression: Expression,\n exprViz: ExprVizView,\n ontologyEnrichment: OntologyEnrichment,\n userLists: UserGeneLists,\n export: ExporterView\n};\n\nconst StatusCmp = props => {\n let content = props.grameneFiltersStatus;\n // if (props.grameneFiltersStatus === 'init') {\n // props.doClearGrameneFilters();\n // }\n if (props.grameneFiltersStatus === 'ready') {\n let tally = <span>Ready</span>;\n if (props.grameneSearch) {\n let genes = props.grameneSearch.response.numFound;\n let genomes = props.grameneSearch.facet_counts.facet_fields.taxon_id.length / 2;\n tally = <span><b>{genes}</b> genes in <b>{genomes}</b> genomes</span>;\n }\n const popover = (\n <Popover>\n <Popover.Header as=\"h3\">Genomes Filter</Popover.Header>\n <Popover.Body>Searching {props.activeGenomeCount} genomes</Popover.Body>\n </Popover>\n );\n\n content = <span>\n {tally}\n <OverlayTrigger placement=\"auto\" overlay={popover}>\n <span style={{float:'right', cursor:'pointer'}} onClick={props.doShowGrameneGenomes}><BsGearFill/></span>\n </OverlayTrigger>\n <TaxonomyModal/>\n </span>;\n }\n return <div style={{padding:'5px', color:'cornsilk', fontSize:'small'}}>{content}</div>\n};\n\nconst Status = connect(\n 'selectGrameneSearch',\n 'selectGrameneFiltersStatus',\n 'selectActiveGenomeCount',\n 'doShowGrameneGenomes',\n 'doClearGrameneFilters',\n StatusCmp\n);\n\nconst handleClick = (e, moveCopyMode, showMarked, node, actions) => {\n if (!e) e = window.event;\n e.cancelBubble = true;\n if (e.stopPropagation) e.stopPropagation();\n\n if (showMarked && moveCopyMode) {\n if (node.marked) {\n actions.selectTarget(node);\n }\n else {\n actions.unmarkTargets()\n }\n }\n console.log(node, showMarked);\n};\nfunction logAction(action) {\n ReactGA.event({\n category: 'Search',\n action: action\n })\n}\nconst Filter = ({node,moveCopyMode,showMarked,actions}) => {\n let classes = 'gramene-filter gramene-filter';\n if (node.operation) {\n classes = `${classes}-${node.operation}`\n }\n if (node.negate) {\n classes = `${classes} gramene-filter-NOT`\n }\n if (showMarked && node.marked) {\n classes = `${classes} gramene-filter-marked`\n }\n let content = '';\n let menu = '';\n let children = [];\n\n if (node.showMenu) {\n let key=1;\n let menuItems = [];\n if (node.hasOwnProperty('operation')) {\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Change to ${node.operation}`); actions.changeOperation(node)}}>convert to <i>{node.operation === 'AND' ? 'OR' : 'AND'}</i></li>);\n }\n if (node.leftIdx > 0) {\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Delete filter`); actions.deleteNode(node)}}>delete</li>);\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Move filter`); actions.markTargets(node,'move')}}>move{node.isSource && ' select destination'}</li>);\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Copy filter`); actions.markTargets(node,'copy')}}>copy{node.isSource && ' select destination'}</li>)\n }\n menuItems.push(<li key={key++} onClick={()=>{logAction(`Negate filter`); actions.negate(node)}}>negate</li>);\n menu = <div className='gramene-filter-menu'><ul>{menuItems}</ul></div>;\n }\n let warning;\n if (node.warning) {\n const popover = (\n <Popover>\n <Popover.Header as=\"h3\">Warning</Popover.Header>\n <Popover.Body>{node.warning}</Popover.Body>\n </Popover>\n );\n warning = (\n <OverlayTrigger placement=\"auto\" overlay={popover}><span style={{float:'right', color:'red', cursor:'pointer'}}><IoAlertCircle/></span></OverlayTrigger>\n )\n }\n if (node.operation) {\n children = node.children.map((child,idx) => <Filter key={idx} moveCopyMode={moveCopyMode} node={child} showMarked={showMarked} actions={actions}/>);\n content = (\n <div>\n <span className='gramene-filter-operation'\n onClick={()=>actions.toggleMenu(node)}>{node.operation}</span>\n {warning}\n </div>\n );\n }\n else {\n content = <span className='gramene-filter-text'\n onClick={()=>actions.toggleMenu(node)}>{node.category} | {node.name}</span>;\n }\n return (\n <div key={node.leftIdx} className={classes} onClick={(e)=>handleClick(e,moveCopyMode, showMarked,node,actions)}>\n {content}{menu}{children}\n </div>\n )\n};\n\nconst FiltersCmp = props => {\n const actions = {\n negate: props.doNegateGrameneFilter,\n deleteNode: props.doDeleteGrameneFilter,\n changeOperation: props.doChangeGrameneFilterOperation,\n selectTarget: props.doMoveOrCopyGrameneFilter,\n markTargets: props.doMarkGrameneFilterTargets,\n unmarkTargets: props.doUnmarkGrameneFilterTargets,\n toggleMenu: props.doToggleGrameneFilterMenu\n };\n const containerClass = props.configuration.id === 'sorghum' ? 'sorghumbase-filter-container': 'gramene-filter-container';\n if (props.grameneFilters.rightIdx > 1) {\n return <div className={containerClass}>\n <CollapsibleSection title=\"Filters\"\n extra={<span style={{cursor:'pointer', marginRight:'0.5rem'}} onClick={(e)=>{e.stopPropagation(); props.doClearGrameneFilters()}}><BsTrash/></span>}>\n <Filter node={props.grameneFilters}\n moveCopyMode={props.grameneFilters.moveCopyMode}\n showMarked={props.grameneFilters.showMarked}\n actions={actions}/>\n </CollapsibleSection>\n </div>\n }\n else {\n return <div className={containerClass}>\n <CollapsibleSection title=\"Filters\">\n <div className='gramene-filter gramene-filter-AND'>No filters defined</div>\n </CollapsibleSection>\n </div>\n }\n};\n\nconst Filters = connect(\n 'selectGrameneFilters',\n 'selectConfiguration',\n 'doNegateGrameneFilter',\n 'doDeleteGrameneFilter',\n 'doChangeGrameneFilterOperation',\n 'doMoveOrCopyGrameneFilter',\n 'doMarkGrameneFilterTargets',\n 'doUnmarkGrameneFilterTargets',\n 'doToggleGrameneFilterMenu',\n 'doClearGrameneFilters',\n FiltersCmp\n);\n\nconst ResultsCmp = props => {\n let activeViews = props.grameneViews.options;\n return props.grameneFilters.rightIdx > 0 ? (\n <div>\n {activeViews.map((v,idx) => {\n let p = Object.assign({}, props);\n const divRef = useRef(null);\n useEffect(() => {\n if (v.shouldScroll) {\n const navBarHeight=0;\n const scrollPosition = divRef.current.offsetTop - navBarHeight;\n window.scrollTo({\n top: scrollPosition,\n behavior: 'smooth'\n })\n props.doCancelShouldScroll();\n }\n }, [v.shouldScroll]);\n return (\n <div key={idx} ref={divRef}>\n {v.show === 'on' && <div style={{borderTopWidth:'medium'}} className='gramene-view-header'>{v.name}</div>}\n {v.show === 'on' && React.createElement(inventory[v.id], p)}\n </div>\n )\n })}\n </div>\n ) : null;\n};\n\nconst Results = connect(\n 'selectGrameneFilters',\n 'selectGrameneViews',\n 'doCancelShouldScroll',\n ResultsCmp\n);\n\nconst ViewsCmp = props => (\n <div className={'gramene-view-container'}>\n <CollapsibleSection title=\"Views\">\n {props.grameneViews.options.filter(view => view.show !== 'disabled').map((view,idx) => (\n <div style={{textWrap:'nowrap'}} key={idx}>\n <Switch onChange={()=>props.doToggleGrameneView(view.id)} checked={view.show === 'on'}\n height={18}\n width={30}\n handleDiameter={16}\n checkedIcon={false}\n uncheckedIcon={false}\n />\n <span className={`gramene-view-span-${view.show}`} onClick={(e) => {\n props.dontToggleGrameneView(view.id)\n }}>{view.name}</span>\n </div>\n ))}\n </CollapsibleSection>\n </div>\n);\n\nconst Views = connect(\n 'selectGrameneViews',\n 'doToggleGrameneView',\n 'dontToggleGrameneView',\n ViewsCmp\n);\n\nexport {Status, Filters, Results, Views, Auth};\n","import React from 'react'\nimport ReactGA from 'react-ga4'\nimport { connect } from 'redux-bundler-react'\nimport './genes.css'\nimport Expression from './details/Expression'\nimport Homology from './details/Homology'\nimport Location from './details/Location'\nimport Pathways from \"./details/Pathways\"\nimport VEP from \"./details/VEP\"\nimport Xrefs from \"./details/Xrefs\"\nimport Publications from \"./details/Publications\"\nimport Sequences from \"./details/Sequences\"\nimport {suggestionToFilters} from \"../utils\";\nimport {FullscreenContainer} from './details/generic'\nimport {GrFormPrevious, GrFormNextLink, GrFormNext, GrHpe} from 'react-icons/gr'\nimport {BsArrowsFullscreen} from 'react-icons/bs'\nimport { Badge, OverlayTrigger, Tooltip } from 'react-bootstrap'\n\nlet external = <small title=\"This link opens a page from an external site\"> <i className=\"fa fa-external-link\"/></small>;\n\nlet inventory = {\n sequences: Sequences,\n location: Location,\n expression: Expression,\n homology: Homology,\n pathways: Pathways,\n VEP: VEP,\n xrefs: Xrefs,\n pubs: Publications\n};\n\nfunction renderTairSummary(searchResult) {\n const summary = searchResult.summary;\n if(summary && summary !== \"NULL\" && searchResult.system_name === \"arabidopsis_thaliana\") {\n return (\n <div className=\"gene-summary-tair\">\n {trimSummary(summary)}\n </div>\n )\n }\n}\n\nfunction trimSummary(summary) {\n if(summary.length > 160) {\n const start = summary.substr(0, 150);\n const rest = summary.substr(150);\n return <p>{start}<span className=\"ellipsis\">…</span><span className=\"rest\">{rest}</span></p>\n }\n else {\n return <p>{summary}</p>\n }\n}\nconst PanLink = (props) => {\n const gene = props.gene;\n const pan = props.pan;\n return <div className=\"gene-panlink\">\n <a target=\"_blank\" href={pan.url + \"?idList=\" + gene.id}>\n <img src={pan.svg} title={`View this gene at ${pan.name}`}/>\n </a>\n </div>;\n};\n\nconst CurationComponent1 = ({ curation }) => {\n return (\n <div className=\"gene-curation\">\n <span>Curated gene structure</span>\n {curation.okay > 0 && <span className=\"status\">✔️ {curation.okay}</span>}\n {curation.flagged > -10 && <span className=\"status\">⚠️ {curation.flagged}</span>}\n </div>\n );\n};\nconst CurationComponent = ({ curation, gene }) => {\n const total = curation.okay + curation.flagged;\n const okayRatio = (curation.okay / total);\n const flaggedRatio = (curation.flagged / total);\n const tooltip = (\n <Tooltip id=\"tooltip\">\n <strong>Gene structure</strong><br/>\n Okay: {curation.okay} \n Flagged: {curation.flagged}\n </Tooltip>\n );\n return (\n <OverlayTrigger placement=\"left\" overlay={tooltip}>\n <a className=\"gene-curation\" target=\"_blank\" href={`https://devdata.gramene.org/curation/curations?idList=${gene.id}`}>\n <span className=\"okay\" style={{opacity: okayRatio}}>☑</span>\n <span className=\"flagged\" style={{opacity: flaggedRatio}}>⚠</span>\n </a>\n </OverlayTrigger>\n )\n};\n\nconst ClosestOrthologCmp = (props) => {\n let id, taxon_id, name, desc, species, className, identity;\n const gene = props.gene;\n\n if (gene.closest_rep_id) {\n name = gene.closest_rep_name || gene.closest_rep_id;\n desc = gene.closest_rep_description;\n species = gene.closest_rep_species_name;\n id = gene.closest_rep_id;\n taxon_id = gene.closest_rep_taxon_id;\n className = \"closest-ortholog\";\n identity = gene.closest_rep_identity || 0;\n }\n else if (gene.model_rep_id) {\n name = gene.model_rep_name || gene.model_rep_id;\n desc = gene.model_rep_description;\n species = gene.model_rep_species_name;\n id = gene.model_rep_id;\n taxon_id = gene.model_rep_taxon_id;\n className = \"model-ortholog\";\n identity = gene.model_rep_identity || 0;\n }\n var isZm = new RegExp(/^Zm00001e/);\n if (isZm.test(desc)) {\n desc='';\n }\n\n return (\n <div className={className} onClick={() => {\n props.doEnsureGrameneGenome(taxon_id);\n props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene',\n fq_field: 'id',\n fq_value: id,\n name: name\n }))\n }}>\n <div className=\"gene-species\">{species}</div>\n {identity > 0 && <div className=\"rep-identity\">{Math.round(identity*100)}</div>}\n <h3 className=\"gene-id\">{name}</h3>\n <p>{desc}</p>\n </div>\n );\n};\n\nconst ClosestOrtholog = connect(\n 'doReplaceGrameneFilters','doEnsureGrameneGenome',\n ClosestOrthologCmp\n);\n\nfunction renderClosestOrtholog(gene) {\n\n if (shouldShowClosestOrtholog(gene)) {\n\n // we used to not add the closest ortholog to the DOM if the homology detail was visible.\n // however, that could cause the height of the result to change. Instead we set visibility:hidden\n // so that the renderer takes into account the height of the ortholog even if not shown.\n return (\n <ClosestOrtholog gene={gene}/>\n );\n }\n}\n\n// show closest ortholog prominently if we have data to show:-\n// a. either there's a closest ortholog (determined by traversing the gene tree until an id or description looks\n// curated) b. or there's a model ortholog (traverse tree to find an ortholog in arabidopsis)\nfunction shouldShowClosestOrtholog(searchResult) {\n return (\n searchResult.closest_rep_id || (\n searchResult.model_rep_id &&\n searchResult.model_rep_id !== searchResult.id\n )\n );\n}\n\nconst allDetails = [\n {\n id: 'VEP',\n label: 'Germplasm',\n popup: 'Germplasm with protein truncating variants (PTVs)',\n available: false\n },\n {\n id: 'sequences',\n label: 'Sequences',\n popup: 'Gene/cDNA/protein fasta',\n available: true\n },\n {\n id: 'location',\n label: 'Location',\n popup: 'Genome Browser',\n available: false\n },\n {\n id: 'expression',\n label: 'Expression',\n popup: 'Gene Expression Atlas',\n available: false\n },\n {\n id: 'homology',\n label: 'Homology',\n popup: 'Gene Family Tree',\n available: false\n },\n {\n id: 'pathways',\n label: 'Pathways',\n popup: 'Plant Reactome Pathways',\n available: false\n },\n {\n id: 'pubs',\n label: 'Papers',\n popup: 'Curated Publications',\n available: false\n },\n {\n id: 'xrefs',\n label: 'Xrefs',\n popup: 'Database Cross-references',\n available: false\n }\n];\n\n\nclass Gene extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n details: allDetails.map(o => ({...o})).filter(d => props.config.details[d.id]),\n expandedDetail: props.expandedDetail,\n fullscreen: false,\n };\n let hasData = {};\n props.searchResult.capabilities.forEach(c => {\n hasData[c] = true;\n if (c === 'PanOryza') {\n hasData.xrefs = true;\n }\n });\n this.state.details.forEach(d => d.available |= hasData.hasOwnProperty(d.id));\n }\n getDetailStatus(d) {\n if (this.state.expandedDetail === d.id) return 'expanded';\n if (d.available) return 'closed'\n return d.id === \"pubs\" ? 'empty' : 'disabled';\n }\n setExpanded(d) {\n if (d.available || d.id === \"pubs\") {\n if (this.state.expandedDetail === d.id) {\n this.setState({expandedDetail: null, fullscreen: false})\n }\n else {\n const geneId = this.props.searchResult.id;\n if (!(this.props.geneDocs && this.props.geneDocs.hasOwnProperty(geneId))) {\n this.props.requestGene(geneId)\n }\n ReactGA.event({\n category: 'Search',\n action: 'Details',\n label: d.label\n });\n this.setState({expandedDetail: d.id, fullscreen: false})\n }\n }\n }\n ensureGene(id) {\n if (!(this.props.geneDocs && this.props.geneDocs.hasOwnProperty(id))) {\n this.props.requestGene(id);\n return false;\n }\n return this.props.geneDocs[id].hasOwnProperty('taxon_id')\n }\n renderMetadata() {\n let gene = this.props.searchResult;\n if (gene.model_rep_taxon_id) {\n gene.model_rep_species_name = this.props.taxLut[gene.model_rep_taxon_id].short_name;\n }\n if (gene.closest_rep_taxon_id) {\n gene.closest_rep_species_name = this.props.taxLut[gene.closest_rep_taxon_id].short_name;\n }\n return renderTairSummary(gene) || renderClosestOrtholog(gene);\n }\n render() {\n const panSite = this.props.config.panSite;\n const searchResult = this.props.searchResult;\n const taxName = this.props.taxName;\n const curation = this.props.curation;\n // let orthologs='';\n // if (this.props.orthologs && this.props.orthologs.hasOwnProperty(searchResult.id)) {\n // orthologs = this.props.orthologs[searchResult.id].join(', ');\n // }\n const numWordsInDescription = searchResult.description.split(' ').length;\n return (\n <div className=\"result-gene\">\n <div className=\"result-gene-summary\">\n <div className=\"result-gene-title-body\">\n {panSite.hasOwnProperty(searchResult.system_name) && <PanLink pan={panSite[searchResult.system_name]} gene={searchResult}/>}\n {curation && <CurationComponent curation={curation} gene={searchResult}/> }\n <div className=\"gene-title\">\n <div className=\"gene-species\">{taxName}</div>\n <h3 className=\"gene-name\">{searchResult.name}\n {searchResult.id !== searchResult.name && <small className=\"gene-id\"> {searchResult.id}</small>}\n </h3>\n </div>\n {searchResult.synonyms && <small className=\"gene-synonyms\">{searchResult.synonyms.join(', ')}</small>}\n {searchResult.description !== \"unknown\" && (numWordsInDescription > 1 || searchResult.can_show.pubs) && <p className=\"gene-description\">{searchResult.description}</p>}\n </div>\n {this.renderMetadata()}\n </div>\n <div className=\"gene-detail-tabs\">\n {this.state.details.map((d,idx) => {\n const isExpanded = this.state.expandedDetail === d.id;\n return (\n <OverlayTrigger\n key={idx}\n placement={'bottom'}\n overlay={\n <Tooltip id={`tooltip`}>{d.popup}</Tooltip>\n }\n >\n <div key={idx}\n className={`col-md-1 text-center gene-detail-tab-${this.getDetailStatus(d)}`}\n style={{position: 'relative'}}\n onClick={()=>this.setExpanded(d)}\n >\n {d.label}\n {isExpanded && (\n <BsArrowsFullscreen\n style={{\n position: 'absolute',\n right: 8,\n top: '50%',\n transform: 'translateY(-50%)',\n cursor: 'pointer',\n }}\n title=\"View full screen\"\n onClick={(e) => {\n e.stopPropagation();\n this.setState({fullscreen: true});\n }}\n />\n )}\n </div>\n </OverlayTrigger>\n );\n })}\n </div>\n {this.state.expandedDetail && this.ensureGene(searchResult.id) && (\n <FullscreenContainer\n className=\"visible-detail\"\n fullscreen={this.state.fullscreen}\n onExitFullscreen={() => this.setState({fullscreen: false})}\n title={(this.state.details.find(d => d.id === this.state.expandedDetail) || {}).label}\n >\n {React.createElement(inventory[this.state.expandedDetail], this.props)}\n </FullscreenContainer>\n )}\n </div>\n )\n }\n}\n\nconst GeneList = props => {\n if (props.grameneSearch && props.grameneSearch.response && props.grameneTaxonomy) {\n let prev,page,next;\n const numFound = props.grameneSearch.response.numFound;\n if (numFound > props.grameneSearchRows) {\n const pageNum = props.grameneSearchOffset/props.grameneSearchRows;\n page = <span style={{padding:'10px'}}>page <b>{pageNum + 1}</b> of <b>{Math.ceil(numFound/props.grameneSearchRows)}</b></span>;\n prev = <GrHpe/>;\n if (pageNum > 0) {\n prev = <Badge onClick={()=>props.doRequestResultsPage(pageNum - 1)}><GrFormPrevious/></Badge>\n }\n next = <GrHpe/>;\n if (numFound > props.grameneSearchOffset + props.grameneSearchRows) {\n next = <Badge onClick={()=>props.doRequestResultsPage(pageNum + 1)}><GrFormNext/></Badge>\n }\n }\n return <div>\n <div>{prev}{page}{next}</div>\n {props.grameneSearch.response.docs.map((g,idx) => (\n <Gene key={idx}\n searchResult={g}\n config={props.configuration}\n taxName={props.grameneTaxonomy[g.taxon_id].name}\n geneDocs={props.grameneGenes}\n requestGene={props.doRequestGrameneGene}\n requestOrthologs={props.doRequestOrthologs}\n orthologs={props.grameneOrthologs}\n taxLut={props.grameneTaxonomy}\n curation={props.curatedGenes ? props.curatedGenes[g.id] : null}\n expandedDetail={props.grameneSearch.response.numFound === 1 && g.can_show.homology ? 'homology' : null}\n />\n ))}\n {prev}{page}{next}\n </div>\n }\n return null;\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneSearch',\n 'selectGrameneTaxonomy',\n 'selectGrameneGenes',\n 'selectGrameneOrthologs',\n 'selectGrameneSearchOffset',\n 'selectGrameneSearchRows',\n 'selectCuratedGenes',\n 'doRequestGrameneGene',\n 'doRequestOrthologs',\n 'doRequestResultsPage',\n GeneList);\n","import React, { useRef, useEffect, useState } from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport {Tabs, Tab, Form, Row, Col} from 'react-bootstrap';\nimport BAR, {haveBAR} from \"gramene-efp-browser\";\n\nfunction DynamicIframe(props) {\n // Create a ref for the iframe element\n const iframeRef = useRef(null);\n const [iframeHeight, setIframeHeight] = useState(500); // Default height\n\n useEffect(() => {\n const handleMessage = (event) => {\n if (event.data.type === 'heightChange') {\n setIframeHeight(event.data.height + 44);\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n\n return () => window.removeEventListener(\"message\", handleMessage);\n }, []);\n\n return (\n <iframe\n ref={iframeRef}\n src={props.url}\n title=\"Dynamic Iframe\"\n style={{ width: '100%', height: `${iframeHeight}px`, border: 'none' }}\n />\n );\n}\n\nconst Detail = props => {\n const gene = props.geneDocs[props.searchResult.id];\n const [atlasExperiment, setAtlasExperiment] = useState(null);\n const [atlasExperimentList, setAtlasExperimentList] = useState([]);\n const [atlasFacets, setAtlasFacets] = useState(null);\n const [isLocal, setIsLocal] = useState(false);\n const [activeTab, setActiveTab] = useState('gene');\n\n const handleLocalAPIChange = (event) => {\n setIsLocal(event.target.checked);\n };\n useEffect(() => {\n if (!props.expressionStudies) return;\n const tid = Math.floor(gene.taxon_id / 1000);\n if (props.expressionStudies[tid]) {\n let facets={Differential: {}, Baseline: {}};\n let eList = props.expressionStudies[tid].sort((a,b) => {\n const a_name = `${a.type}:${a.description || a._id}`;\n const b_name = `${b.type}:${b.description || b._id}`;\n return a_name < b_name ? -1 : 1;\n });\n if (props.searchResult.hasOwnProperty('expressed_in_gxa_attr_ss')) {\n const in_gxa = new Set(props.searchResult.expressed_in_gxa_attr_ss);\n eList = eList.filter(e => in_gxa.has(e._id))\n }\n eList.forEach(e => {e.factors.forEach(factor => facets[e.type][factor] = 1);});\n setAtlasExperimentList(eList);\n setAtlasFacets(facets);\n let refExp = eList.filter(e => e.isRef);\n if (refExp.length === 1) {\n setAtlasExperiment(refExp[0]._id);\n } else {\n // no reference experiment - choose first\n setAtlasExperiment(eList[0]._id);\n }\n }\n }, [props.expressionStudies]);\n\n let paralogs_url;\n let gene_url = `https://dev.gramene.org/static/atlasWidget.html?genes=${gene.atlas_id || gene._id}&localAPI=${isLocal}`;\n let paralogs = [];\n if (props.grameneParalogs && props.grameneParalogs[gene._id]) {\n paralogs = props.grameneParalogs[gene._id];\n } else if (gene.homology) {\n props.doRequestParalogs(gene._id, gene.homology.supertree, gene.taxon_id);\n }\n // if (gene.homology && gene.homology.homologous_genes && gene.homology.homologous_genes.within_species_paralog) {\n // paralogs = gene.homology.homologous_genes.within_species_paralog;\n // }\n if (paralogs.length > 0 && atlasExperiment) {\n paralogs_url= `https://dev.gramene.org/static/atlasWidget.html?genes=${paralogs.join(' ')}&experiment=${atlasExperiment}&localAPI=${isLocal}`;\n }\n return <Tabs activeKey={activeTab} onSelect={(k) => setActiveTab(k)}>\n {paralogs_url &&\n <Tab tabClassName=\"gxa\" eventKey=\"paralogs\" title={`Paralogs`} key=\"gxaparalogs\">\n <Form.Select aria-label='experiment selector'\n placeholder='Select experiment'\n onChange={(e) => setAtlasExperiment(e.target.value)}>\n { atlasExperimentList.map((e,idx) =>\n <option key={idx} value={e._id}>{e.type}: {e.description || e._id}</option>\n )}\n </Form.Select>\n {activeTab === \"paralogs\" && <DynamicIframe url={paralogs_url}/> }\n </Tab>\n }\n <Tab tabClassName=\"gxa\" eventKey=\"gene\" title=\"All Studies\" key=\"gxa\">\n {/*<Form.Check*/}\n {/* type=\"switch\"*/}\n {/* id=\"localAPI\"*/}\n {/* label=\"Local API\"*/}\n {/* checked={isLocal}*/}\n {/* onChange={handleLocalAPIChange}*/}\n {/*/>*/}\n {activeTab === \"gene\" && <DynamicIframe url={gene_url}/> }\n </Tab>\n {haveBAR(gene) &&\n <Tab tabClassName=\"eFP\" eventKey=\"eFP\" title=\"eFP Browser\" key=\"bar\"><BAR gene={gene}/></Tab>\n }\n </Tabs>\n};\n\nexport default connect(\n 'selectGrameneParalogs',\n 'selectExpressionStudies',\n 'doRequestParalogs',\n //'doRequestParalogExpression',\n Detail\n);\n\n","import React from 'react'\nimport _ from 'lodash';\nimport {connect} from \"redux-bundler-react\";\nimport TreeVis from \"gramene-genetree-vis\";\nimport treesClient from \"gramene-trees-client\";\nimport {\n TBrowse,\n computePivotState,\n fromGrameneGenetree,\n fromGrameneNeighborhood,\n labelsZone,\n msaZone,\n neighborhoodZone,\n treeZone,\n} from \"tbrowse\";\nimport {Detail, Title, Description, Content, Explore, Links} from \"./generic\";\nimport {suggestionToFilters} from \"../../utils\";\nimport {Spinner, Alert} from \"react-bootstrap\";\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/msa.less';\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/tree.less';\n\nconst TBROWSE_ZONES = [treeZone, labelsZone, msaZone, neighborhoodZone];\n\nclass Homology extends React.Component {\n constructor(props) {\n super(props);\n this.state = {viewer: 'treevis', neighborhood: null, neighborhoodTreeId: null};\n if (!props.geneDocs.hasOwnProperty(props.searchResult.id)) {\n props.requestGene(props.searchResult.id)\n }\n this.taxonomy = treesClient.taxonomy.tree(Object.values(props.grameneTaxonomy))\n }\n fetchNeighborhood(treeId) {\n if (this._neighborhoodFetchedFor === treeId) return;\n this._neighborhoodFetchedFor = treeId;\n const api = this.props.grameneAPI;\n const url = new URL(`${api}/search`);\n url.searchParams.set('fl', 'id,name,gene_tree,gene_idx,region,start,end,strand,biotype,system_name,description');\n url.searchParams.set('fq', `{!graph from=compara_neighbors_10 to=compara_idx_multi maxDepth=1}gene_tree:${treeId}`);\n url.searchParams.set('rows', '100000');\n url.searchParams.set('start', '0');\n fetch(url.toString(), {headers: {Accept: 'application/json'}})\n .then(res => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .then(json => {\n if (this._neighborhoodFetchedFor !== treeId) return;\n this.setState({neighborhood: fromGrameneNeighborhood(json), neighborhoodTreeId: treeId});\n })\n .catch(err => {\n console.warn('tbrowse neighborhood fetch failed:', err);\n this._neighborhoodFetchedFor = null;\n });\n }\n renderTreeVis() {\n return (\n <div className=\"gene-genetree\">\n <TreeVis genetree={this.tree}\n initialGeneOfInterest={this.gene}\n genomesOfInterest={this.props.grameneGenomes.active}\n taxonomy={this.taxonomy}\n allowGeneSelection={true}\n pivotTree={true}\n enableCuration={false}\n enablePhyloview={true}\n numberOfNeighbors={10}\n ensemblUrl={this.props.configuration.ensemblURL}/>\n </div>\n )\n }\n renderTBrowse() {\n const treeId = this.gene.homology.gene_tree.id;\n if (this._tbrowseTreeId !== treeId) {\n const raw = this.props.grameneTrees[treeId];\n const adapted = fromGrameneGenetree([raw]);\n this._tbrowseTreeId = treeId;\n this._tbrowseData = adapted;\n const pivot = computePivotState(adapted.tree, this.gene._id);\n const zoneIds = TBROWSE_ZONES.map(z => z.id);\n this._tbrowseInitialViewState = {\n selectedNodeId: null,\n collapsedNodeIds: pivot ? pivot.collapsedNodeIds : [],\n prunedNodeIds: [],\n swappedNodeIds: pivot ? pivot.swappedNodeIds : [],\n compressedNodeIds: [],\n nodeOfInterestId: pivot ? pivot.targetId : null,\n zones: zoneIds.map(id => ({id, width: 25, visible: true})),\n zoneStates: {},\n search: null,\n };\n }\n this.fetchNeighborhood(treeId);\n const neighborhood = this.state.neighborhoodTreeId === treeId ? this.state.neighborhood : undefined;\n return (\n <div className=\"gene-genetree\" style={{height: 600, width: '100%'}}>\n <TBrowse\n tree={this._tbrowseData.tree}\n taxonomy={this._tbrowseData.taxonomy}\n msa={this._tbrowseData.msa}\n geneMetadata={this._tbrowseData.geneMetadata}\n proteinDomains={this._tbrowseData.proteinDomains}\n exonJunctions={this._tbrowseData.exonJunctions}\n neighborhood={neighborhood}\n zones={TBROWSE_ZONES}\n nodeOfInterest={this.gene._id}\n initialViewState={this._tbrowseInitialViewState}\n />\n </div>\n )\n }\n renderViewerToggle() {\n const {viewer} = this.state;\n const btn = (id, label) => (\n <button\n key={id}\n type=\"button\"\n onClick={() => this.setState({viewer: id})}\n style={{\n padding: '4px 10px',\n marginRight: 4,\n fontSize: 12,\n border: '1px solid #ccc',\n background: viewer === id ? '#2878dc' : '#fff',\n color: viewer === id ? '#fff' : '#222',\n cursor: 'pointer',\n borderRadius: 3,\n }}>\n {label}\n </button>\n );\n return (\n <div style={{margin: '8px 0'}}>\n {btn('treevis', 'TreeVis')}\n {btn('tbrowse', 'TBrowse (beta)')}\n </div>\n );\n }\n filterAllHomologs() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'gene_tree',\n fq_value: this.tree._id,\n name: `Homologs of ${this.gene.name}`\n }))\n }\n filterOrthologs() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'homology__all_orthologs',\n fq_value: this.gene._id,\n name: `Orthologs of ${this.gene.name}`\n }))\n }\n filterParalogs() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'homology__within_species_paralog',\n fq_value: this.gene._id,\n name: `Paralogs of ${this.gene.name}`\n }))\n }\n searchSupertree() {\n this.props.doReplaceGrameneFilters(suggestionToFilters({\n category: 'Gene Tree',\n fq_field: 'supertree_attr_s',\n fq_value: this.gene.homology.supertree,\n name: this.gene.homology.supertree\n }))\n }\n orthologList() {\n return this.orthoParaList('ortholog');\n }\n\n paralogList() {\n return this.orthoParaList('within_species_paralog');\n }\n\n orthoParaList(type) {\n var homology, thisGeneId;\n homology = _.get(this.gene, 'homology.homologous_genes');\n thisGeneId = this.gene._id;\n\n if (homology) {\n var homologs = _(homology)\n .pickBy(function filterCategories(thing, name) {\n return name.indexOf(type) === 0;\n })\n .values()\n .flatten()\n .uniq()\n .value();\n\n if (!_.isEmpty(homologs)) {\n if (!homologs.includes(thisGeneId)) {\n console.log(\"add to homologs list\",thisGeneId);\n homologs.push(thisGeneId);\n }\n return homologs; // only return something if we have something. We're testing for truthiness later.\n }\n }\n }\n explorations() {\n let x = [{\n name: 'Homologs',\n category: 'Gene Tree',\n count: this.tree.geneCount,\n handleClick: this.filterAllHomologs.bind(this)\n }];\n if (this.orthologs) {\n x.push({\n name: 'Orthologs',\n category: 'Gene Tree',\n count: this.orthologs.length,\n handleClick: this.filterOrthologs.bind(this)\n });\n }\n if (this.paralogs) {\n x.push({\n name: 'Paralogs',\n category: 'Gene Tree',\n count: this.paralogs.length,\n handleClick: this.filterParalogs.bind(this)\n });\n }\n if (this.gene.homology.supertree) {\n x.push({\n name: `Supertree`,\n category: `Gene Tree`,\n count: this.gene.homology.supertree,\n handleClick: this.searchSupertree.bind(this)\n })\n }\n return x;\n }\n links() {\n let links = [\n {\n name: 'Ensembl Gene Tree view',\n url: `${this.props.configuration.ensemblURL}/${this.gene.system_name}/Gene/Compara_Tree?g=${this.gene._id}`\n }\n ];\n if (this.props.curation && this.props.curation.taxa.hasOwnProperty(this.gene.taxon_id)) {\n links.push({\n name: 'Curate',\n url: this.props.curation.url + this.gene._id\n })\n }\n return links;\n }\n render() {\n const id = this.props.searchResult.id;\n if (!this.props.geneDocs.hasOwnProperty(id)) {\n return <Spinner/>\n }\n this.gene = this.props.geneDocs[id];\n const treeId = this.gene.homology.gene_tree.id;\n if (! this.props.grameneTrees.hasOwnProperty(treeId)) {\n this.props.doRequestGrameneTree(treeId);\n }\n else {\n const tree = this.props.grameneTrees[treeId];\n if (tree.hasOwnProperty('taxon_id')) {\n this.tree = treesClient.genetree.tree([this.props.grameneTrees[treeId]]);\n this.orthologs = this.orthologList();\n this.paralogs = this.paralogList();\n }\n }\n let flagged=0;\n // if (this.props.curation && this.props.curation.taxa.hasOwnProperty(this.gene.taxon_id)) {\n // flagged = this.props.curatedGenes && this.props.curatedGenes[id] ? this.props.curatedGenes[id].flagged : 0;\n // }\n return (\n <Detail>\n {/*<Title key=\"title\">Compara Gene Tree</Title>*/}\n <Description key=\"description\">\n This phylogram shows the relationships between this gene and others similar to it, as determined by Ensembl Compara.\n {flagged > 1 && <Alert variant={'warning'}>This gene was flagged for potential gene structural annotation issues by {flagged} curators</Alert>}\n </Description>\n {this.tree && <Content key=\"content\">\n {this.renderViewerToggle()}\n {this.state.viewer === 'tbrowse' ? this.renderTBrowse() : this.renderTreeVis()}\n </Content>}\n {this.tree && <Explore key=\"explore\" explorations={this.explorations()}/>}\n <Links key=\"links\" links={this.links()}/>\n </Detail>\n )\n }\n}\n\nexport default connect(\n 'selectGrameneTaxonomy',\n 'selectGrameneTrees',\n 'selectGrameneGenomes',\n 'selectGrameneAPI',\n 'selectConfiguration',\n 'selectCuration',\n 'selectCuratedGenes',\n 'doRequestGrameneTree',\n 'doAcceptGrameneSuggestion',\n 'doReplaceGrameneFilters',\n Homology\n);\n\n","import React, { useState, useEffect, useLayoutEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport keyBy from 'lodash/keyBy';\nimport _ from \"lodash\";\nimport ReactGA from \"react-ga4\";\nimport { BiLinkExternal } from \"react-icons/bi\";\nimport { Button, Badge, Modal } from \"react-bootstrap\";\n\n// Controlled fullscreen wrapper. Parent owns `fullscreen` state and the\n// `onExitFullscreen` callback.\n//\n// To keep embedded widgets (Reactome diagram, BioDalliance, TBrowse)\n// alive across the toggle, the children render through createPortal\n// into a single STABLE detached div. We then physically move that div\n// between an inline anchor and the modal body via appendChild — React\n// never sees the portal target change, so it never unmounts the\n// children. The widgets' DOM, canvases, and event handlers move with\n// the div.\nexport const FullscreenContainer = ({ fullscreen, onExitFullscreen, title, className, children }) => {\n const [stableNode] = useState(() =>\n typeof document !== 'undefined' ? document.createElement('div') : null\n );\n const inlineRef = useRef(null);\n const modalRef = useRef(null);\n\n useLayoutEffect(() => {\n if (!stableNode) return;\n if (className) stableNode.className = className;\n const parent = fullscreen ? modalRef.current : inlineRef.current;\n if (parent && stableNode.parentNode !== parent) {\n parent.appendChild(stableNode);\n }\n });\n\n useEffect(() => {\n // Container width changes when toggling fullscreen. Embedded widgets\n // that listen for window resize (Pathways, etc.) re-measure on this\n // event.\n window.dispatchEvent(new Event('resize'));\n }, [fullscreen]);\n\n return (\n <>\n <div ref={inlineRef} />\n {fullscreen && (\n <Modal show fullscreen onHide={onExitFullscreen}>\n <Modal.Header closeButton>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div ref={modalRef} />\n </Modal.Body>\n </Modal>\n )}\n {stableNode && createPortal(children, stableNode)}\n </>\n );\n};\n\nexport const Detail = props => {\n const subComponents = keyBy(props.children, 'key');\n return (\n <div className=\"detail\">\n <div className=\"intro\">\n {subComponents.title}\n {subComponents.description}\n </div>\n <div className=\"content-wrapper\">\n {subComponents.content}\n </div>\n <div className=\"actions\">\n <div className=\"action-wrapper\" xs={12} sm={5}>\n {subComponents.explore}\n </div>\n <div className=\"action-wrapper\" xs={12} sm={7}>\n {subComponents.links}\n </div>\n </div>\n </div>\n );\n};\n\nexport const Title = props => <h4>{props.children}</h4>;\nexport const Description = props => <p className=\"description\">{props.children}</p>;\nexport const Content = props => <div className=\"content\">{props.children}</div>;\n\nconst QueryTerm = props => {\n let category, name, badge;\n name = props.name;\n if (props.category) {\n category = props.category + ' | ';\n }\n if (_.isNumber(props.count)) {\n badge = <Badge style={{marginLeft: \"0.5rem\"}} bg='secondary'>{props.count}</Badge>\n }\n return (\n <Button variant='outline-dark' onClick={props.handleClick}>\n {category}{name}{badge}\n </Button>\n )\n};\n\nfunction renderExplorations(explorations) {\n return explorations.map(\n (exploration, idx) =>\n <QueryTerm key={idx} {...exploration} />\n );\n}\nexport const Explore = props => (\n <div className=\"explore\">\n <h5>Search Filters</h5>\n <div>\n {renderExplorations(props.explorations)}\n </div>\n </div>\n);\n\nfunction renderLinks(links) {\n let external = <small title=\"This link opens a page from an external site\"> <BiLinkExternal/></small>;\n return links.map((link, idx) =>\n <li key={idx}>\n <a href={link.url} target=\"_blank\" className=\"external-link\" onClick={()=>{\n ReactGA.event({\n category: \"outbound link\", action: \"follow\", label: link.name\n })\n }}>{link.name}{external}</a>\n {/*<ReactGA.OutboundLink*/}\n {/* eventLabel={link.name}*/}\n {/* to={link.url}*/}\n {/* target=\"_blank\"*/}\n {/* className=\"external-link\"*/}\n {/*>*/}\n {/* {link.name}{external}*/}\n {/*</ReactGA.OutboundLink>*/}\n </li>\n )\n}\n\nexport const Links = props => (\n <div className=\"links\">\n <h5>Links to other resources</h5>\n <ul>\n {renderLinks(props.links)}\n </ul>\n </div>\n);\n","import { initializeApp, getApps, getApp } from \"firebase/app\";\n\nexport const getFirebaseApp = (config) => {\n if (!config) return null;\n const name = config.projectId || '[DEFAULT]';\n if (getApps().some(a => a.name === name)) return getApp(name);\n return initializeApp(config, name);\n};\n\nexport const suggestionToFilters = (suggestion) => {\n return {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 3,\n children: [\n {\n fq_field: suggestion.fq_field,\n fq_value: suggestion.fq_value,\n name: suggestion.name,\n category: suggestion.category,\n leftIdx: 1,\n rightIdx: 2,\n negate: false,\n marked: false\n }\n ]\n }\n}\n","import React from 'react'\nimport getProp from 'lodash/get';\nimport isEqual from 'lodash/isEqual';\nimport {Button} from \"react-bootstrap\";\nimport Browser from \"./location/browser\";\nimport {connect} from \"redux-bundler-react\";\nimport {Detail, Title, Description, Content, Explore, Links} from \"./generic\";\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/msa.less';\nimport '../../../../node_modules/gramene-genetree-vis/src/styles/tree.less';\n\nclass Location extends React.Component {\n constructor(props) {\n super(props);\n this.gene = this.props.geneDocs[this.props.searchResult.id];\n this.initRegion();\n this.state = {\n visibleRange: this.initVisibleRange()\n };\n }\n\n initVisibleRange() {\n var location, span, padding, result;\n location = this.gene.location;\n if(!location) {\n throw new Error(`Could not find the location of the gene in props.`);\n }\n\n span = location.end - location.start + 1;\n padding = Math.floor(.1 * span);\n\n result = {\n chr: location.region,\n start: location.start - padding,\n end: location.end + padding\n };\n\n result.displayName = `${result.chr}:${result.start}-${result.end}`;\n\n return result;\n }\n\n initRegion() {\n var region, isChromosome, regionType, regionName;\n region = this.gene.location.region;\n if (region) {\n isChromosome = /^\\d+$/.test(region);\n if (isChromosome) {\n regionType = 'chromosome';\n regionName = 'Chromosome ' + region;\n }\n else {\n regionType = 'scaffold';\n regionName = region;\n }\n this.region = {\n isChromsome: isChromosome,\n name: regionName,\n type: regionType\n };\n }\n }\n\n\n handleViewChange(chr, start, end) {\n var visibleRange = {\n chr: chr,\n start: start,\n end: end,\n displayName: `${chr}:${start}-${end}`\n };\n\n if(!isEqual(visibleRange, this.state.visibleRange)) {\n this.setState({\n visibleRange: visibleRange\n });\n }\n }\n\n updateQuery(restrictToVisibleRange) {\n var location, geneName, visibleRange, filter, filterDisplayName, fq;\n location = this.gene.location;\n geneName = this.gene.name;\n // category: 'Gene Tree',\n // fq_field: 'gene_tree',\n // fq_value: this.tree._id,\n // name: `Homologs of ${this.gene.name}`\n\n let terms = [\n {\n category: \"Map\",\n name: location.map,\n fq_field: 'map',\n fq_value: location.map\n },\n {\n category: \"Region\",\n name: location.region,\n fq_field: 'region',\n fq_value: location.region\n }\n ];\n fq = `map:${location.map} AND region:${location.region}`;\n\n if (restrictToVisibleRange) {\n visibleRange = this.state.visibleRange;\n\n terms.push({\n category: \"Interval\",\n name: `${visibleRange.start}-${visibleRange.end}`,\n fq_field: 'start',\n fq_value: `[${visibleRange.start} TO ${visibleRange.end}]`\n });\n fq += ` AND (start:[${visibleRange.start} TO ${visibleRange.end}]`\n + ` OR end:[${visibleRange.start} TO ${visibleRange.end}])`;\n\n filterDisplayName = visibleRange.displayName;\n } else {\n filterDisplayName = \"Shares \" + this.region.type + \" with \" + geneName;\n }\n\n console.log(\"User asked to filter by location\");\n filter = {\n category: 'Location',\n id: fq,\n fq: fq,\n display_name: filterDisplayName\n };\n\n // QueryActions.removeAllFilters();\n // QueryActions.setFilter(filter);\n this.props.doAddGrameneRangeQuery(terms);\n if (this.props.closeModal) this.props.closeModal();\n }\n\n explorations() {\n var visible, result;\n visible = this.state.visibleRange;\n result = [\n {\n name: `All on ${this.region.name}`,\n handleClick: ()=>this.updateQuery(false)\n }\n ];\n if (visible) {\n result.push({\n name: `All within ${getProp(visible, 'displayName')}`,\n handleClick: ()=>this.updateQuery(true)\n });\n }\n return result;\n }\n\n links() {\n function jgiify(id) {\n return id.replace('SORBI_3','Sobic.').replace(/\\.v[0-9]\\.[0-9]$/,'');\n }\n var gene = this.gene;\n let links = [\n {name: 'Ensembl Browser', url: `${this.props.config.ensemblURL}/${gene.system_name}/Gene/Summary?g=${gene._id}`}\n ];\n if (gene.annotations.taxonomy.ancestors.includes(4557))\n links.push({name: 'Phytozome', url: `https://phytozome-next.jgi.doe.gov/report/gene/Sbicolor_v5_1/${jgiify(gene._id)}`})\n if (gene.taxon_id === 3702)\n links.push(\n {name: 'tair', url: `https://www.arabidopsis.org/servlets/TairObject?name=${gene._id}&type=locus`},\n {name: 'ThaleMine', url: `https://bar.utoronto.ca/thalemine/keywordSearchResults.do?searchTerm=${gene._id}&searchSubmit=search`}\n );\n if (gene.taxon_id === 39947)\n links.push({name: 'RAP-DB', url: `https://rapdb.dna.affrc.go.jp/locus/?name=${gene._id}`});\n const isMaize = new RegExp(/^Zm[0-9]+/);\n if (isMaize.test(gene._id))\n links.push({name: 'MaizeGDB', url: `http://www.maizegdb.org/gene_center/gene/${gene._id}`});\n return links;\n }\n\n render() {\n return (\n <Detail>\n {/*<Title key=\"title\">Genome location: {this.renderGenePosition()}</Title>*/}\n <Description key=\"description\">Currently viewing: {this.renderLocation()} {this.renderResetButton()}</Description>\n <Content key=\"content\">\n {this.renderBrowser()}\n </Content>\n <Explore key=\"explore\" explorations={this.explorations()}/>\n <Links key=\"links\" links={this.links()}/>\n </Detail>\n );\n }\n\n\n renderBrowser() {\n return (\n <Browser gene={this.gene} {...this.props} {...this.state} onViewChange={ this.handleViewChange.bind(this) }/>\n );\n }\n\n renderGenePosition() {\n var location = this.gene.location;\n return (\n <span className=\"location\">\n <span className=\"region\">{this.region.name}</span>:<span className=\"start\">{location.start}</span>-<span\n className=\"end\">{location.end}</span>\n </span>\n );\n }\n\n renderLocation() {\n var location = this.state.visibleRange;\n return (\n <span className=\"location\">\n <span className=\"region\">{location.chr}</span>:<span className=\"start\">{location.start}</span>-<span\n className=\"end\">{location.end}</span>\n </span>\n );\n }\n\n resetVisibleRange() {\n const {chr, start, end} = this.initVisibleRange();\n this.handleViewChange(chr, start, end);\n }\n\n renderResetButton() {\n // let active=isEqual(this.props.visibleRange, this.state.visibleRange);\n return (\n <Button\n size=\"sm\"\n variant=\"outline-dark\"\n onClick={() => this.resetVisibleRange()}>\n Reset\n </Button>\n )\n }\n}\n\nexport default connect('doAddGrameneRangeQuery',Location);\n\n","import React from \"react\";\nimport DallianceBrowser from \"./dallianceBrowser.js\";\n\nexport default class Browser extends React.Component {\n constructor(props) {\n super(props);\n }\n\n render() {\n return (\n <div className=\"location-browser\" style={{ position: 'relative', overflow: 'hidden' }}>\n <DallianceBrowser {...this.props} expanded={!!this.props.closeModal} />\n </div>\n )\n }\n\n}\n\n// Browser.propTypes = {\n// gene: React.PropTypes.object.isRequired,\n// expanded: React.PropTypes.bool,\n// visibleRange: React.PropTypes.object.isRequired,\n// onViewChange: React.PropTypes.func.isRequired\n// };","import React from \"react\";\nimport isEqual from \"lodash/isEqual\";\n\n// var ensemblREST = require('../../../../../package.json').gramene.ensemblREST;\n//const ensemblREST = 'http://data.gramene.org/ensembl63';\n// const ensemblREST = 'https://data.sorghumbase.org/ensembl2';\n// const ensemblREST = 'https://data.gramene.org/vitis-ensembl1';\n// const ensemblREST = 'https://data.gramene.org/pansite-ensembl';\n\n// calculate this once.\nconst PREFIX = '/static/gramene-dalliance/';\n\nexport default class DallianceBrowser extends React.Component {\n\n constructor(props) {\n super(props);\n this.initialVisibleRange = props.visibleRange;\n }\n\n shouldComponentUpdate(newProps) {\n // should we reset the view to initial state?\n if(isEqual(newProps.visibleRange, this.initialVisibleRange)) {\n this.browser.setLocation(newProps.visibleRange.chr, newProps.visibleRange.start, newProps.visibleRange.end);\n }\n\n return false;\n }\n\n biodallianceElementId() {\n return this.props.gene._id + 'Browser';\n }\n\n browser() {\n var g, view, start, end, browser;\n g = this.props.gene;\n view = this.props.visibleRange;\n start = view.start;\n end = view.end;\n\n this.browser = browser = new Browser(\n {\n pageName: this.biodallianceElementId(),\n chr: g.location.region,\n viewStart: start,\n viewEnd: end,\n cookieKey: g._id + 'BrowserCookie',\n prefix: PREFIX,\n\n coordSystem: {\n speciesName: g.system_name,\n taxon: g.taxon_id,\n auth: 'Gramene',\n version: '3',\n ucscName: 'IRGSP-1.0'\n },\n\n sources: [\n {\n name: 'DNA',\n ensemblURI: this.props.config.ensemblRest,\n species: g.system_name,\n tier_type: 'sequence'\n },\n {\n name: 'Genes',\n uri: this.props.config.ensemblRest,\n tier_type: 'ensembl',\n species: g.system_name,\n type: ['gene', 'transcript', 'exon', 'cds']\n }\n ],\n\n // hubs: ['/Track_Hubs/DRP000315/hub.txt'],\n disablePoweredBy: true,\n setDocumentTitle: false,\n noDefaultLabels: true,//!this.props.expanded,\n noPersist: true,\n noPersistView: true,\n maxWorkers: 2,\n noTitle: true,\n noLocationField: false,\n noLeapButtons: true,//!this.props.expanded,\n noZoomSlider: false, //!this.props.expanded,\n noTrackAdder: true,//!this.props.expanded,\n noTrackEditor: true,//!this.props.expanded,\n noExport: true,//!this.props.expanded,\n noOptions: true,//!this.props.expanded,\n noHelp: true,\n maxViewWidth: 1000000\n }\n );\n\n browser.addViewListener(this.props.onViewChange);\n }\n\n cancel() {\n if (typeof this.timeoutID == \"number\") {\n window.clearTimeout(this.timeoutID);\n delete this.timeoutID;\n }\n }\n\n componentDidMount() {\n // this.browser();\n this.cancel();\n var self = this;\n this.timeoutID = window.setTimeout(function () {self.browser();}, 0);\n }\n\n componentWillUnmount() {\n this.cancel();\n }\n\n render() {\n return (\n <div id={this.biodallianceElementId()}/>\n );\n }\n}\n\n// DallianceBrowser.propTypes = {\n// gene: React.PropTypes.object.isRequired,\n// visibleRange: React.PropTypes.object.isRequired,\n// expanded: React.PropTypes.bool,\n// onViewChange: React.PropTypes.func.isRequired\n// };\n","import React from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport FlatToNested from 'flat-to-nested';\nimport {Explore, Links} from \"./generic\";\nimport treesClient from \"gramene-trees-client\";\nimport TreeMenu from \"react-simple-tree-menu\";\nimport '../../../../node_modules/react-simple-tree-menu/dist/main.css';\n\nimport {Spinner} from \"react-bootstrap\";\nimport _ from 'lodash'\nimport \"./tree-view.css\"\n\nconst reactomeURL = \"https://plantreactome.gramene.org\";\n\n// The Reactome Diagram library is GWT-compiled and uses a single shared\n// GWT iframe + window globals — multiple Reactome.Diagram instances on\n// the same page step on each other. We work around this by rendering\n// each pathway diagram inside its own <iframe>, so each gets its own\n// document + window + Reactome global. The iframe communicates with\n// the parent through postMessage.\nfunction buildIframeSrcDoc() {\n const proxy = JSON.stringify(reactomeURL);\n return `<!DOCTYPE html>\n<html><head>\n <style>html,body{margin:0;padding:0;height:100%;width:100%;overflow:hidden;}</style>\n <script async src=\"${reactomeURL}/DiagramJs/diagram/diagram.nocache.js\"><\\/script>\n</head><body>\n <div id=\"holder\" style=\"width:100%;height:100%;\"></div>\n <script>\n (function(){\n var diagram = null;\n var loadedPathway = null;\n var pendingPathwayId = null;\n var pendingReactionId = null;\n var pendingFlag = null;\n var resizeTimer = null;\n\n function dimensions() {\n return [\n Math.max(100, document.body.clientWidth),\n Math.max(100, document.body.clientHeight)\n ];\n }\n\n function whenReady(cb) {\n if (window.Reactome && window.Reactome.Diagram) cb();\n else setTimeout(function(){ whenReady(cb); }, 100);\n }\n\n function applyLoad() {\n if (!pendingPathwayId) return;\n whenReady(function(){\n if (diagram) {\n try { diagram.detach(); } catch(e) {}\n }\n var dims = dimensions();\n diagram = window.Reactome.Diagram.create({\n proxyPrefix: ${proxy},\n placeHolder: 'holder',\n width: dims[0],\n height: dims[1]\n });\n var pw = pendingPathwayId;\n diagram.loadDiagram(pw);\n diagram.onDiagramLoaded(function(){\n loadedPathway = pw;\n if (pendingFlag) diagram.flagItems(pendingFlag);\n if (pendingReactionId) diagram.selectItem(pendingReactionId);\n });\n });\n }\n\n window.addEventListener('message', function(e){\n var data = e.data;\n if (!data || typeof data !== 'object') return;\n if (data.type === 'load') {\n pendingPathwayId = data.pathwayId || null;\n pendingReactionId = data.reactionId || null;\n if (data.flag) pendingFlag = data.flag;\n applyLoad();\n } else if (data.type === 'select') {\n pendingReactionId = data.id || null;\n if (diagram && loadedPathway) {\n if (data.id) diagram.selectItem(data.id);\n else diagram.resetSelection();\n }\n }\n });\n\n window.addEventListener('resize', function(){\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(function(){\n if (loadedPathway) applyLoad();\n }, 300);\n });\n })();\n <\\/script>\n</body></html>`;\n}\n\nclass Pathways extends React.Component {\n constructor(props) {\n super(props);\n this.taxonomy = treesClient.taxonomy.tree(Object.values(props.grameneTaxonomy))\n this.gene = props.geneDocs[props.searchResult.id];\n this.iframeRef = React.createRef();\n // srcDoc is constant — the per-instance pathway/reaction state is\n // pushed in via postMessage so changing pathway doesn't reload the\n // GWT script.\n this._iframeSrcDoc = buildIframeSrcDoc();\n this._iframeReady = false;\n this.state = {\n treeVisible: true,\n height: 500,\n currentPathwayId: null,\n currentReactionId: null,\n };\n }\n\n postLoad() {\n const win = this.iframeRef.current && this.iframeRef.current.contentWindow;\n if (!win || !this.state.currentPathwayId) return;\n win.postMessage({\n type: 'load',\n pathwayId: this.state.currentPathwayId,\n reactionId: this.state.currentReactionId,\n flag: this.gene._id,\n }, '*');\n }\n\n postSelect() {\n const win = this.iframeRef.current && this.iframeRef.current.contentWindow;\n if (!win) return;\n win.postMessage({ type: 'select', id: this.state.currentReactionId || null }, '*');\n }\n\n handleIframeLoad = () => {\n this._iframeReady = true;\n if (this.state.currentPathwayId) this.postLoad();\n }\n\n startResize(e) {\n e.preventDefault();\n const startY = e.clientY;\n const startHeight = this.state.height;\n\n const onMouseMove = (moveEvent) => {\n const newHeight = Math.max(200, startHeight + (moveEvent.clientY - startY));\n this.setState({ height: newHeight });\n };\n\n const onMouseUp = () => {\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n };\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n\n toggleTree() {\n this.setState({ treeVisible: !this.state.treeVisible });\n }\n\n stableId(dbId) {\n let prefix = this.taxonomy.indices.id[this.gene.taxon_id].model.reactomePrefix || 'OSA';\n return `R-${prefix}-${dbId}`;\n }\n\n loadDiagram(pathwayId, reactionId) {\n this.setState({\n currentPathwayId: pathwayId,\n currentReactionId: reactionId || null,\n });\n }\n\n componentDidMount() {\n // If pathway docs are already cached, build the hierarchy now so the\n // initial render selects a default node (componentDidUpdate would\n // otherwise never run if no redux change follows the mount).\n if (!this.state.hierarchy && this.pathwayIds) {\n const haveDocs = this.pathwayIds.filter(id => this.props.gramenePathways.hasOwnProperty(id));\n if (haveDocs.length === this.pathwayIds.length) {\n const docs = this.pathwayIds.map(id => this.props.gramenePathways[id]);\n this.getHierarchy(this.makeTaxonSpecific(docs, this.gene.taxon_id));\n }\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (this.state.hierarchy && !this.state.selectedNode) {\n let node = this.state.hierarchy[0];\n let path = [0];\n while (node.nodes) {\n path.push(0);\n node = node.nodes[0];\n }\n this.loadNodes(path);\n }\n if (!this.state.hierarchy && this.pathwayIds) {\n const haveDocs = this.pathwayIds.filter(id => this.props.gramenePathways.hasOwnProperty(id));\n if (haveDocs.length === this.pathwayIds.length) {\n const docs = this.pathwayIds.map(id => this.props.gramenePathways[id]);\n this.getHierarchy(this.makeTaxonSpecific(docs, this.gene.taxon_id));\n }\n }\n if (this._iframeReady) {\n if (prevState.currentPathwayId !== this.state.currentPathwayId && this.state.currentPathwayId) {\n this.postLoad();\n } else if (prevState.currentReactionId !== this.state.currentReactionId &&\n prevState.currentPathwayId === this.state.currentPathwayId) {\n this.postSelect();\n }\n }\n }\n\n componentWillMount() {\n const pathways = this.gene.annotations.pathways;\n if (!pathways) {\n throw new Error(\"No pathway annotation present for \" + this.gene._id);\n }\n this.pathwayIds = _.clone(pathways.ancestors);\n pathways.entries.forEach(reaction => {\n const [, , id] = reaction.id.split('-');\n this.pathwayIds.push(+id);\n });\n this.props.doRequestGramenePathways(this.pathwayIds);\n }\n\n makeTaxonSpecific(docs, taxon_id) {\n let lineageField = 'lineage_' + taxon_id;\n if (!docs[0].hasOwnProperty(lineageField)) {\n let tid = Math.floor(taxon_id / 1000);\n lineageField = 'lineage_' + tid;\n }\n return docs.map(doc => {\n let tsDoc = _.pick(doc, ['_id', 'name', 'type']);\n tsDoc.lineage = doc[lineageField];\n return tsDoc;\n });\n }\n\n getHierarchy(docs) {\n const pathways = _.keyBy(docs, '_id');\n const nodes = [];\n this.pathwayIds.forEach(pwyId => {\n if (pathways[pwyId]) {\n const pwy = pathways[pwyId];\n pwy.lineage.forEach(line => {\n const parentOffset = line.length - 2;\n nodes.push({\n id: pwyId,\n key: pwyId,\n label: pwy.name,\n type: pwy.type,\n checkbox: false,\n selected: false,\n parent: parentOffset >= 0 ? line[parentOffset] : undefined,\n });\n });\n }\n });\n const nested = new FlatToNested({ children: 'nodes' }).convert(nodes);\n this.setState({ hierarchy: [nested], selectedNode: undefined });\n }\n\n possiblyLoadNodes(node) {\n if (!node.selected) {\n let selectedNode = this.state.selectedNode;\n if (selectedNode) selectedNode.selected = false;\n node.selected = true;\n selectedNode = node;\n if (node.type === \"Pathway\") {\n this.loadDiagram(this.stableId(node.id));\n } else {\n const reaction = this.stableId(node.id);\n const pathway = this.stableId(node.parent.split(\"/\").pop());\n this.loadDiagram(pathway, reaction);\n }\n this.setState({ selectedNode });\n }\n }\n\n loadNodes(nodes) {\n let hierarchy = this.state.hierarchy;\n let selectedNode = this.state.selectedNode;\n let offset = nodes.shift();\n let nodeRef = hierarchy[offset];\n let lineage = [nodeRef];\n while (nodeRef.nodes) {\n nodeRef = nodeRef.nodes[0];\n lineage.unshift(nodeRef);\n }\n if (lineage[0].id !== 2894885) {\n let pathway = this.stableId(lineage[0].id);\n let reaction = undefined;\n if (lineage[0].type === \"Reaction\") {\n reaction = pathway;\n pathway = this.stableId(lineage[1].id);\n }\n if (lineage[0].selected) {\n selectedNode = undefined;\n lineage[0].selected = false;\n this.loadDiagram(pathway);\n } else {\n if (selectedNode) selectedNode.selected = false;\n selectedNode = lineage[0];\n lineage[0].selected = true;\n if (reaction) this.loadDiagram(pathway, reaction);\n else this.loadDiagram(pathway);\n }\n this.setState({ hierarchy, selectedNode });\n }\n }\n\n renderHierarchy() {\n if (this.state.hierarchy) {\n const path = [];\n const allPaths = [];\n let nodes = this.state.hierarchy;\n while (nodes) {\n path.push(nodes[0].key);\n allPaths.push(path.join('/'));\n nodes = nodes[0].nodes ? nodes[0].nodes : undefined;\n }\n return <TreeMenu\n data={this.state.hierarchy}\n hasSearch={false}\n onClickItem={(item) => this.possiblyLoadNodes(item)}\n initialActiveKey={path.join('/')}\n initialOpenNodes={allPaths}\n />;\n }\n return <Spinner/>;\n }\n\n updateQuery() {\n this.props.doAcceptGrameneSuggestion({\n category: 'Plant Reactome',\n fq_field: 'pathways__ancestors',\n fq_value: this.state.selectedNode.id,\n name: this.state.selectedNode.label,\n });\n }\n\n render() {\n let reactomeLink, searchFilter;\n if (this.state.selectedNode) {\n const xrefLUT = _.keyBy(this.gene.xrefs, 'db');\n const links = [\n { name: 'Plant Reactome ' + this.state.selectedNode.type, url: `${reactomeURL}/content/detail/${this.stableId(this.state.selectedNode.id)}` }\n ];\n if (xrefLUT.hasOwnProperty('notGramene_Plant_Reactome')) {\n links.push({ name: 'Plant Reactome Gene', url: `${reactomeURL}/content/detail/${xrefLUT.notGramene_Plant_Reactome.ids[0]}` });\n }\n reactomeLink = <Links key=\"links\" links={links}/>;\n const filters = [\n {\n name: `All genes in this ${this.state.selectedNode.type}`,\n handleClick: () => this.updateQuery(),\n },\n ];\n searchFilter = <Explore key=\"explore\" explorations={filters}/>;\n }\n return (\n <div className=\"pathways-container\">\n <div className=\"pathways-layout\" style={{ height: this.state.height }}>\n <button\n className=\"pathways-tree-toggle\"\n onClick={() => this.toggleTree()}\n title={this.state.treeVisible ? 'Hide pathway hierarchy' : 'Show pathway hierarchy'}\n >\n {this.state.treeVisible ? '◀' : '▶'}\n </button>\n {this.state.treeVisible && (\n <div className=\"pathways-tree-panel\">\n {this.renderHierarchy()}\n </div>\n )}\n <div className=\"pathways-diagram-panel\">\n <iframe\n ref={this.iframeRef}\n onLoad={this.handleIframeLoad}\n srcDoc={this._iframeSrcDoc}\n title=\"Pathway diagram\"\n style={{ width: '100%', height: '100%', border: 0, display: 'block' }}\n />\n </div>\n </div>\n <div\n className=\"pathways-resize-handle\"\n onMouseDown={(e) => this.startResize(e)}\n title=\"Drag to resize\"\n />\n {searchFilter}\n {reactomeLink}\n </div>\n );\n }\n}\n\nexport default connect(\n 'selectGrameneTaxonomy',\n 'selectGramenePathways',\n 'doRequestGramenePathways',\n 'doAcceptGrameneSuggestion',\n Pathways\n);\n","import React, {useState, useEffect, useRef, useCallback} from 'react';\nimport {connect} from \"redux-bundler-react\";\nimport {Button} from 'react-bootstrap';\nimport { AgGridReact } from \"ag-grid-react\";\nimport _ from 'lodash';\nimport \"ag-grid-community/styles/ag-grid.css\";\nimport \"ag-grid-community/styles/ag-theme-quartz.css\";\nimport '@fortawesome/fontawesome-free/css/all.min.css';\nimport \"./VEP.css\";\nimport { study_info } from '../../../vepStudyInfo';\n\nconst ggURL = {\n xIRRI: 'https://gringlobal.irri.org/gringlobal/accessiondetail?id=',\n IRRI: 'https://www.irri.org/genesys-rice#/a/',\n ARS: 'https://npgsweb.ars-grin.gov/gringlobal/accessiondetail.aspx?id=',\n ICRISAT: 'https://genebank.icrisat.org/IND/PassportSummary?ID=',\n sorbmutdb: 'https://www.depts.ttu.edu/igcast/sorbmutdb.php',\n maizeGDB: 'https://wgs.maizegdb.org/',\n NCBI: 'https://www.ncbi.nlm.nih.gov/biosample/?term='\n};\n\nconst rice_studies = {'1': {label: 'Rice 3K', type: 'NAT'}};\nconst AccessionLink = ({germplasm, gene_id}) => {\n const genebank = germplasm.stock_center;\n const url = ggURL[genebank];\n if (germplasm.germplasm_dbid) { // link to stock center\n const germ_id = germplasm.germplasm_dbid;\n if (germ_id && url && germ_id !== \"0\") {\n return <a target=\"_blank\" href={`${url}${germ_id}`}>\n {germplasm.pub_id} ({genebank})</a>;\n }\n }\n if (genebank === \"sorbmutdb\") {\n return (\n <form id={germplasm.pub_id} action={url} method=\"post\" target=\"_blank\">\n <input type=\"hidden\" name=\"search\" value={gene_id.replace('SORBI_3','Sobic.')} />\n <input type=\"hidden\" name=\"submit\" value=\"Search\" />\n <button type=\"submit\" className=\"button-like-link\">SorbMutDB</button>\n </form>\n );\n }\n if (germplasm.pop_id === '15' && germplasm.stock_center === 'NOT FOUND') {\n return <a target=\"_blank\" href={ggURL['maizeGDB']}>{germplasm.pub_id} (SNPVersity)</a>\n }\n return <span>{germplasm.pub_id}</span>\n}\nfunction compareGermplasm(a, b) {\n const aSub = a?.germplasm?.subpop ?? '';\n const bSub = b?.germplasm?.subpop ?? '';\n const subCmp = aSub.localeCompare(bSub, 'en', { sensitivity: 'accent' });\n if (subCmp !== 0) return subCmp;\n\n const aPub = a?.germplasm?.pub_id ?? '';\n const bPub = b?.germplasm?.pub_id ?? '';\n return aPub.localeCompare(bPub, 'en', { sensitivity: 'accent' });\n}\nfunction group_germplasm(gene, germplasmLUT, vep_obj) {\n let accessionTable = [];\n Object.entries(vep_obj).forEach(([key,accessions]) => {\n const parts = key.split(\"__\");\n if (parts[0] === \"VEP\") {\n if (parts[1] !== \"merged\") {\n accessions.filter(ens_id => germplasmLUT.hasOwnProperty(ens_id)).forEach(ens_id => {\n const germplasm = germplasmLUT[ens_id][0];\n const pop = study_info[parts[3]][parts[4]];\n const conseq = parts[1].replaceAll(\"_\",\" \");\n const status = parts[2] === \"het\" ? \"heterozygous\" : \"homozygous\";\n const accInfo = {\n key: [pop.label,conseq,status].join('%%%'),\n germplasm: germplasm,\n pop: pop\n };\n accessionTable.push(accInfo);\n });\n }\n }\n });\n // group accessionTable by key field\n const groups = _.groupBy(accessionTable, 'key');\n let grouped = [];\n let id=0;\n Object.keys(groups).sort().forEach((group) => {\n const [pop,conseq,status] = group.split('%%%');\n id++;\n const tally = groups[group].length;\n grouped.push({\n id: id,\n group: group,\n summary: true,\n pop: pop,\n conseq: conseq,\n status: status,\n tally: tally\n });\n groups[group].sort(compareGermplasm).forEach(acc => {\n id++;\n grouped.push({\n id: id,\n group: group,\n summary: false,\n pop:pop,\n conseq: conseq,\n status: status,\n accession: acc,\n tally: tally\n })\n })\n })\n return grouped;\n}\nconst THRESHOLD = 5;\nconst GridWithGroups = ({groups,gene_id,doGrin}) => {\n const [rowData, setRowData] = useState(groups);\n\n const initialExpanded = {};\n rowData.forEach((row) => {\n if (row.summary) {\n initialExpanded[row.group] = (row.tally < THRESHOLD);\n }\n });\n const [expandedGroups, setExpandedGroups] = useState(initialExpanded);\n\n\n // Toggle group visibility\n const toggleGroup = (group) => {\n setExpandedGroups((prevExpandedGroups) => ({\n ...prevExpandedGroups,\n [group]: !prevExpandedGroups[group], // Toggle the group's state\n }));\n };\n\n // Filter the data to show/hide rows based on the expanded group state\n const getVisibleRowData = () => {\n const visibleRows = [];\n rowData.forEach((row) => {\n if (row.summary) {\n if (row.tally > 1) {\n visibleRows.push(row);\n }\n } else if (expandedGroups[row.group]) {\n visibleRows.push(row); // Show non-summary rows if the group is expanded\n }\n });\n return visibleRows;\n };\n\n // Define columns with a custom renderer for the summary rows\n const columnDefs = [\n { field: 'pop', headerName: 'Study/Population', flex: 1, minWidth: 120,\n cellRenderer: (params) => {\n if (params.data.summary || params.data.tally === 1) {\n return params.value;\n }\n return null;\n }\n },\n { field: 'conseq', headerName: 'VEP consequence', flex: 1, minWidth: 130,\n cellRenderer: (params) => {\n if (params.data.summary || params.data.tally === 1) {\n return params.value;\n }\n return null;\n }\n },\n { field: 'status', headerName: 'Allele status', flex: 1, minWidth: 100,\n cellRenderer: (params) => {\n if (params.data.summary || params.data.tally === 1) {\n return params.value;\n }\n return null;\n }\n },\n { field: 'accession', headerName: doGrin ? 'Order Germplasm' : 'Accession', flex: 1, minWidth: 140,\n headerComponent: (props) => {\n return (\n <div style={{display: 'flex', alignItems: 'center'}}>\n {doGrin && <i className=\"fas fa-shopping-cart\"> </i>}\n <span>{props.displayName}</span>\n </div>\n );\n }, // Use the custom header with the shopping cart icon\n cellRenderer: (params) => {\n if (params.value) {\n return <AccessionLink germplasm={params.value.germplasm} gene_id={gene_id} />;\n }\n if (params.data.summary) {\n return (\n <span\n onClick={() => toggleGroup(params.data.group)}\n >\n {params.data.tally} Accessions {expandedGroups[params.data.group] ? '▼' : '▶'}\n </span>\n );\n }\n return null;\n }\n },\n { field: 'synonym', headerName: 'Synonym', filter:false, sortable:false, flex: 1, minWidth: 110, cellRenderer: (params) => {\n if (params.data.accession) {\n return params.data.accession.germplasm.ens_id\n }\n return null;\n }},\n { field: 'subpop', headerName: 'Subpopulation', filter:false, sortable: false, flex: 1, minWidth: 110, cellRenderer: (params) => {\n if (params.data.accession && params.data.accession.germplasm.subpop && params.data.accession.germplasm.subpop !== \"?\") {\n return params.data.accession.germplasm.subpop\n }\n return null;\n }},\n { field: 'search', headerName: 'All LOF Genes', sortable:false, filter:false, flex: 1, minWidth: 100,\n cellRenderer: (params) => {\n if (params.data.accession) {\n const currentURL = new URL(window.location.href);\n const accession = params.data.accession;\n currentURL.search = '';\n currentURL.searchParams.set('category', 'Germplasm');\n currentURL.searchParams.set('fq_field', `VEP__merged__${accession.pop.type}__attr_ss`);\n currentURL.searchParams.set('fq_value', accession.germplasm.ens_id);\n currentURL.searchParams.set('name', accession.germplasm.ens_id);\n\n return <Button size='sm' href={currentURL.toString()}>Search</Button>\n\n }\n return null;\n }\n }\n ];\n\n const defaultColDef = {\n sortable: true,\n filter: \"agTextColumnFilter\",\n cellStyle: (params) => {\n if (params.data.summary) {\n return {cursor: 'pointer'};\n }\n return null;\n }\n };\n\n const nVisible = getVisibleRowData().length;\n const tableHeight = 50 + Math.min(nVisible, 10) * 42;\n return (\n <div style={{ overflowX: \"auto\", width: \"100%\", maxWidth: \"1200px\" }}>\n <div\n className=\"ag-theme-quartz\"\n style={{ height: tableHeight, minWidth: \"810px\", width: \"100%\" }}\n >\n <AgGridReact\n rowData={getVisibleRowData()}\n columnDefs={columnDefs}\n getRowNodeId={(data) => data.id}\n animateRows={true}\n defaultColDef={defaultColDef}\n />\n </div>\n </div>\n );\n};\n\nconst Detail = props => {\n const gene = props.geneDocs[props.searchResult.id];\n if (props.grameneConsequences && props.grameneConsequences[gene._id] && props.grameneGermplasm) {\n const groups = group_germplasm(gene, props.grameneGermplasm, props.grameneConsequences[gene._id]);\n\n return <div>\n <h5>Predicted loss-of-function alleles were detected in these germplasm.</h5>\n <div >Explore other variants within this gene in the <a target=\"_blank\"\n href={`${props.configuration.ensemblURL}/${gene.system_name}/Gene/Variation_Gene/Image?db=core;g=${props.searchResult.id}`}>\n Variant image</a> page in the Ensembl genome browser.</div>\n <GridWithGroups groups={...groups} gene_id={gene._id} doGrin={!props.configuration.hasOwnProperty('noGRIN')}/>\n </div>\n } else {\n props.doRequestVEP(gene._id);\n return <pre>loading</pre>;\n }\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneConsequences',\n 'selectGrameneGermplasm',\n 'doRequestVEP',\n Detail\n);\n\n","import React from 'react'\nimport ReactGA from 'react-ga4'\n// import {connect} from \"redux-bundler-react\";\nimport _ from 'lodash'\nimport dbxrefs from 'gramene-dbxrefs';\nimport {Detail, Title, Description, Content} from \"./generic\";\n\nconst HOW_MANY_TO_SHOW_BY_DEFAULT = 10;\n\nclass Xref extends React.Component {\n constructor(props) {\n super(props);\n this.state = {showAll: false};\n }\n\n toggleShowAll() {\n this.setState({showAll: !this.state.showAll});\n }\n\n possiblyTruncateList(vals) {\n var ellipsis, ellipsisChar, ellipsisTitle;\n\n if (vals.length > HOW_MANY_TO_SHOW_BY_DEFAULT) {\n if (this.state.showAll) {\n ellipsisChar = '^ show first ' + HOW_MANY_TO_SHOW_BY_DEFAULT;\n ellipsisTitle = 'Show less';\n }\n else {\n ellipsisChar = '… show all (' + (vals.length - HOW_MANY_TO_SHOW_BY_DEFAULT) + ' more)';\n ellipsisTitle = 'Show more';\n vals = vals.slice(0, HOW_MANY_TO_SHOW_BY_DEFAULT);\n }\n\n ellipsis = (\n <li key=\"showMore\" className=\"showAll\">\n <a title={ellipsisTitle} onClick={this.toggleShowAll.bind(this)}>{ellipsisChar}</a>\n </li>\n );\n\n vals.push(ellipsis);\n }\n\n return vals;\n }\n\n render() {\n var db = this.props.xref.label;\n var urlfcn = this.props.xref.url;\n\n var members = this.props.members.sort();\n\n var vals = members.map(function (item, idx) {\n var url = urlfcn(item),\n liClass = idx < HOW_MANY_TO_SHOW_BY_DEFAULT ? \"default\" : \"extra\";\n let external = <small title=\"This link opens a page from an external site\"> <i className=\"fa fa-external-link\"/></small>;\n return (\n <li key={idx} className={liClass}>\n <a href={url} target=\"_blank\" onClick={()=>{\n ReactGA.event({\n category: \"outbound link\", action: \"follow\", label: item\n })\n }}>{item}{external}</a>\n {/*<ReactGA.OutboundLink*/}\n {/* eventLabel={db}*/}\n {/* to={url}*/}\n {/* target=\"_blank\"*/}\n {/*>*/}\n {/* {item}{external}*/}\n {/*</ReactGA.OutboundLink>*/}\n </li>\n )\n })\n\n vals = this.possiblyTruncateList(vals);\n\n return (\n <tr>\n <td className=\"xref-name-col\">{db}</td>\n <td className=\"xref-value-col\">\n <ol className=\"xref-id-list\">{vals}</ol>\n </td>\n </tr>\n );\n }\n}\n\nfunction formatXrefsForGene(gene) {\n if(!gene || !_.isArray(gene.xrefs)) {\n throw new Error(\"No xrefs for \" + _.get(gene._id));\n }\n return gene.xrefs\n .filter(xr => dbxrefs.isKnown(xr.db) && xr.db !== \"PUBMED\")\n .sort()\n .map((xr,idx) => {\n var xref = dbxrefs.fetch(xr.db);\n return (\n <Xref key={idx} xref={xref} members={xr.ids} source={xr.source} text={xr.text} />\n )\n })\n}\n\nconst Xrefs = ({searchResult, geneDocs}) => (\n <Detail>\n <Title key=\"title\">Cross-references</Title>\n <Description key=\"description\">References to this gene in other databases:</Description>\n <Content key=\"content\">\n <table className=\"xrefs table\">\n <thead>\n <tr>\n <th className=\"xref-name-col\">Database</th>\n <th className=\"xref-value-col\">IDs and links</th>\n </tr>\n </thead>\n <tbody>\n {formatXrefsForGene(geneDocs[searchResult.id])}\n </tbody>\n </table>\n </Content>\n </Detail>\n);\n\nexport default Xrefs;\n\n","import React from 'react'\nimport ReactGA from 'react-ga4'\n// import {connect} from \"redux-bundler-react\";\nimport _ from 'lodash'\nimport dbxrefs from 'gramene-dbxrefs';\nimport {Detail, Title, Description, Content} from \"./generic\";\n\nconst HOW_MANY_TO_SHOW_BY_DEFAULT = 10;\n\nclass Xref extends React.Component {\n constructor(props) {\n super(props);\n this.state = {showAll: false};\n }\n\n toggleShowAll() {\n this.setState({showAll: !this.state.showAll});\n }\n\n possiblyTruncateList(vals) {\n var ellipsis, ellipsisChar, ellipsisTitle;\n\n if (vals.length > HOW_MANY_TO_SHOW_BY_DEFAULT) {\n if (this.state.showAll) {\n ellipsisChar = '^ show first ' + HOW_MANY_TO_SHOW_BY_DEFAULT;\n ellipsisTitle = 'Show less';\n }\n else {\n ellipsisChar = '… show all (' + (vals.length - HOW_MANY_TO_SHOW_BY_DEFAULT) + ' more)';\n ellipsisTitle = 'Show more';\n vals = vals.slice(0, HOW_MANY_TO_SHOW_BY_DEFAULT);\n }\n\n ellipsis = (\n <li key=\"showMore\" className=\"showAll\">\n <a title={ellipsisTitle} onClick={this.toggleShowAll.bind(this)}>{ellipsisChar}</a>\n </li>\n );\n\n vals.push(ellipsis);\n }\n\n return vals;\n }\n\n render() {\n var db = this.props.xref.label;\n var urlfcn = this.props.xref.url;\n\n var members = this.props.members.sort();\n\n var vals = members.map(function (item, idx) {\n var url = urlfcn(item),\n liClass = idx < HOW_MANY_TO_SHOW_BY_DEFAULT ? \"default\" : \"extra\";\n let external = <small title=\"This link opens a page from an external site\"> <i className=\"fa fa-external-link\"/></small>;\n return (\n <li key={idx} className={liClass}>\n <a href={url} target=\"_blank\" onClick={()=>{\n ReactGA.event({\n category: \"outbound link\", action: \"follow\", label: item\n })\n }}>{item}{external}</a>\n {/*<ReactGA.OutboundLink*/}\n {/* eventLabel={db}*/}\n {/* to={url}*/}\n {/* target=\"_blank\"*/}\n {/*>*/}\n {/* {item}{external}*/}\n {/*</ReactGA.OutboundLink>*/}\n </li>\n )\n })\n\n vals = this.possiblyTruncateList(vals);\n\n return (\n <tr>\n {/*<td className=\"xref-name-col\">{db}</td>*/}\n <td className=\"xref-value-col\">\n <ol className=\"xref-id-list\">{vals}</ol>\n </td>\n <td className=\"xref-name-col\">{this.props.source}</td>\n <td className=\"xref-value-col\">{this.props.text}</td>\n </tr>\n );\n }\n}\n\nfunction formatPubsForGene(gene) {\n if(!gene || !_.isArray(gene.xrefs)) {\n throw new Error(\"No xrefs for \" + _.get(gene._id));\n }\n let pubs = gene.xrefs.filter(xr => xr.db === \"PUBMED\");\n if (pubs.length === 0) {\n return <tr><td colSpan={3}>No publications found.</td></tr>\n }\n return pubs.sort((a,b) => {\n if (a.source) {\n if (b.source) {\n if (a.source < b.source) {\n return -1;\n }\n if (a.source > b.source) {\n return 1;\n }\n }\n else {\n return -1;\n }\n }\n else if (b.source) {\n return 1;\n }\n if (a.db < b.db) {\n return -1;\n }\n if (a.db > b.db) {\n return 1;\n }\n return 0;\n })\n .map((xr,idx) => {\n var xref = dbxrefs.fetch(xr.db);\n return (\n <Xref key={idx} xref={xref} members={xr.ids} source={xr.source} text={xr.text} />\n )\n })\n}\nconst formURL = 'https://docs.google.com/forms/d/e/1FAIpQLSey-xPyTysdd9c2phXT6kcbjEDeCppG4dLG7LjZCeLpx_KGog/viewform?usp=pp_url&entry.1266455249=';\nconst Publications = ({searchResult, geneDocs}) => (\n <Detail>\n <Title key=\"title\">Curated publications</Title>\n <Description key=\"description\">Functions described in the literature:</Description>\n <Content key=\"content\">\n <table className=\"xrefs xrefs-pubs table\">\n <thead>\n <tr>\n <th className=\"xref-10-col\">PubMed link</th>\n <th className=\"xref-10-col\">Curation source</th>\n <th className=\"xref-80-col\">Title/Description</th>\n </tr>\n </thead>\n <tbody>\n {formatPubsForGene(geneDocs[searchResult.id])}\n </tbody>\n <tfoot>\n <tr>\n <th colSpan={3}>Submit a gene function <a target=\"_blank\" href={formURL + searchResult.id}>here</a></th>\n </tr>\n </tfoot>\n </table>\n </Content>\n </Detail>\n);\n\nexport default Publications;\n\n","import React, { useState, useEffect } from 'react';\nimport {connect} from \"redux-bundler-react\";\nimport {Tabs, Tab, Form, Container, Row, Col, ToggleButton, ButtonGroup } from 'react-bootstrap';\nimport { AiOutlineCopy } from 'react-icons/ai';\nimport './sequences.css';\nimport keyBy from \"lodash/keyBy\";\n\nconst CodeBlock = props => {\n const plainFasta = `>${props.id}\\n${props.seq}`\n\n const [showNotification, setShowNotification] = useState(false);\n\n const copyCode = () => {\n // Use the Clipboard API to write text to the clipboard\n navigator.clipboard.writeText(plainFasta)\n .then(() => {\n setShowNotification(true);\n })\n .catch((err) => {\n console.error('Unable to copy to clipboard', err);\n });\n };\n\n useEffect(() => {\n if (showNotification) {\n const notificationTimeout = setTimeout(() => {\n setShowNotification(false);\n }, 2000); // Hide the notification after 2 seconds\n\n return () => clearTimeout(notificationTimeout);\n }\n }, [showNotification]);\n\n return (\n <div className=\"fasta-container\">\n <code className=\"fasta\"><span className=\"header\">>{props.id}</span><br/>{\n props.blocks.map((block,idx) =>\n <span key={idx} className={block.kind}>{block.seq}</span>\n )\n }</code>\n <p className=\"fasta-key\">\n <b>Key:</b> 5'UTR \n <span className=\"square-utr5\"> </span>\n CDS \n <span className=\"square-cds\"> </span>\n 3'UTR \n <span className=\"square-utr3\"> </span>\n </p>\n <button className=\"copy-button\" onClick={copyCode}><AiOutlineCopy /></button>\n {showNotification && <div className=\"notification\">Sequence copied</div>}\n </div>\n );\n};\n\nconst decoratePeptide = (seq, transcript) => {\n let junctions = [];\n if (transcript.exon_junctions) {\n transcript.exon_junctions.forEach((ej, idx) => {\n if (ej > transcript.cds.start && ej <= transcript.cds.end) {\n junctions.push(Math.floor((ej - transcript.cds.start) / 3));\n }\n });\n }\n if (junctions.length === 0) {\n return [{kind:'cds', seq:seq}];\n }\n let offset = 0;\n let blocks = [];\n junctions.forEach((j, idx) => {\n let kind = idx % 2 === 0 ? \"cds\" : \"cds-other\";\n blocks.push({kind: kind, seq: seq.substring(offset, j)});\n offset = j;\n });\n blocks.push({kind: junctions.length % 2 === 0 ? \"cds\" : \"cds-other\", seq: seq.substring(junctions.pop())});\n return blocks;\n}\nconst decorateSeq = (geneSeq, gene, up, down, tid, mode) => {\n // return a list of blocks with kind and seq properties\n let blocks = [];\n const transcript = gene.gene_structure.transcripts.find(tr => tr.id === tid);\n const offset = gene.location.strand === 1\n ? gene.location.start - geneSeq.start\n : geneSeq.end - gene.location.end\n if (up > 0) {\n const TSS = gene.gene_structure.exons.find(exon => exon.id === transcript.exons[0]).start;\n blocks.push({\n kind:'upstream',\n seq: geneSeq.seq.substring(offset - up + TSS - 1, offset + TSS - 1).toLowerCase()\n })\n }\n // add exons and introns based on tid\n let pos_in_transcript = 0;\n let pos_in_gene = 0;\n let blockType = 'utr5';\n let extra = '';\n transcript.exons.forEach((eid, e_idx) => {\n const exon = gene.gene_structure.exons.find(exon => exon.id === eid);\n if (e_idx > 0 && mode === \"dna\") {\n blocks.push({\n kind: 'intron',\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + exon.start - 1).toLowerCase()\n });\n pos_in_gene = exon.start-1;\n }\n if (mode === \"rna\") {\n extra = e_idx % 2 === 1 ? '-other' : '';\n }\n let exon_length = exon.end - exon.start + 1;\n if (transcript.cds && pos_in_transcript < transcript.cds.start && pos_in_transcript + exon_length >= transcript.cds.start) {\n // CDS starts in this exon\n const utr5_len = transcript.cds.start - pos_in_transcript - 1;\n if (utr5_len > 0) {\n blocks.push({\n kind: blockType + extra,\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + utr5_len)\n });\n exon_length -= utr5_len;\n pos_in_gene += utr5_len;\n pos_in_transcript = transcript.cds.start - 1;\n }\n blockType = 'cds';\n }\n if (blockType === 'cds' && pos_in_transcript + exon_length >= transcript.cds.end) {\n // CDS ends in this exon\n const cds_len = transcript.cds.end - pos_in_transcript;\n if (cds_len > 0) {\n blocks.push({\n kind: blockType + extra,\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + cds_len)\n });\n exon_length -= cds_len;\n pos_in_gene += cds_len;\n pos_in_transcript = transcript.cds.end;\n }\n blockType = 'utr3';\n }\n if (exon_length > 0) {\n blocks.push({\n kind: blockType + extra,\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + exon_length)\n })\n }\n pos_in_gene = exon.end;\n pos_in_transcript += exon_length;\n })\n // check if there's more to the gene locus after end of transcript?\n // downstream is currently relative to end of transcript but upstream is relative to first TSS\n if (down > 0) {\n blocks.push({\n kind:'downstream',\n seq: geneSeq.seq.substring(offset + pos_in_gene, offset + pos_in_gene + down).toLowerCase()\n })\n }\n return blocks;\n};\nconst buildId = (gene, geneSeq, up, down) => {\n let gs = gene.location.strand === 1 ? gene.location.start - up : gene.location.start - down;\n let ge = gene.location.strand === 1 ? gene.location.end + down : gene.location.end + up;\n let extras = [];\n if (gene.location.strand === -1) {\n extras.push('reverse')\n }\n if (up > 0) {\n extras.push(`upstream=${up}`)\n }\n if (down > 0) {\n extras.push(`downstream=${down}`)\n }\n return `${geneSeq.genome}|${gene._id}|${gene.location.region}:${gs}..${ge} ${extras.join('|')}`\n};\nconst Detail = props => {\n const gene = props.geneDocs[props.searchResult.id];\n const [tab, setTab] = useState('dna');\n const [upstream, setUpstream] = useState(0);\n const [downstream, setDownstream] = useState(0);\n const [tid, setTid] = useState(gene.gene_structure.canonical_transcript);\n let geneSeq;\n let rnaSeq;\n let pepSeq;\n if (props.geneSequences && props.geneSequences[gene._id]) {\n geneSeq = props.geneSequences[gene._id];\n }\n else {\n props.doRequestGeneSequence(gene)\n return <pre>loading</pre>;\n }\n if (props.rnaSequences && props.rnaSequences[tid]) {\n rnaSeq = props.rnaSequences[tid]\n }\n else {\n props.doRequestRnaSequence(tid, gene)\n return <pre>loading</pre>;\n }\n const maxUp = gene.location.strand === 1 ? gene.location.start - geneSeq.start : geneSeq.end - gene.location.end;\n const maxDown = gene.location.strand === -1 ? gene.location.start - geneSeq.start : geneSeq.end - gene.location.end;\n const transcript = gene.gene_structure.transcripts.find(tr => tr.id === tid);\n let tl_id;\n if (transcript.translation) {\n tl_id = transcript.translation.id;\n if (props.pepSequences && props.pepSequences[tl_id]) {\n pepSeq = props.pepSequences[tl_id];\n }\n else {\n props.doRequestPepSequence(tl_id, gene);\n return <pre>loading</pre>;\n }\n }\n return <Tabs activeKey={tab}\n onSelect={(k) => setTab(k)}\n >\n <Tab tabClassName=\"dna\" eventKey=\"dna\" title=\"Genomic sequence\">\n <Container style={{ maxWidth: '100ch', marginLeft: 0}}>\n <Row>\n <Col><b><i>Show flanking sequence</i></b></Col>\n </Row>\n <div className=\"flanking-guide\">\n <span className=\"flanking-label-left\">Upstream</span>\n <div className=\"horizontal-line\"/>\n <span className=\"flanking-center-label\">Transcript (unspliced)</span>\n <div className=\"horizontal-line\"/>\n <span className=\"flanking-label-right\">Downstream</span>\n\n <span className=\"flanking-value-left\">{upstream}</span>\n <Form.Range\n className=\"reverse-slide\"\n style={{width: '60px'}}\n value={upstream}\n onChange={(e) => setUpstream(e.target.value)}\n min={0}\n max={maxUp}\n step={10}\n />\n <span/>\n <Form.Range\n style={{width: '60px'}}\n value={downstream}\n onChange={(e) => setDownstream(e.target.value)}\n min={0}\n max={maxDown}\n step={10}\n />\n <span className=\"flanking-value-right\">{downstream}</span>\n </div>\n {gene.gene_structure.transcripts.length > 1 &&\n <Row>\n <Col><b><i>Highlight transcript</i></b><br/>\n <ButtonGroup>{gene.gene_structure.transcripts.sort((a,b) => a.id.localeCompare(b.id)).map((tr, idx) => {\n let v = tr.id === gene.gene_structure.canonical_transcript ? 'primary' : 'secondary';\n if (tr.id !== tid) {\n v = `outline-${v}`\n }\n return <ToggleButton\n variant={v}\n key={idx}\n id={`radio-${idx}`}\n type=\"radio\"\n name={tr.id}\n value={tr.id}\n checked={tr.id === tid}\n onChange={e => setTid(e.currentTarget.value)}\n >{tr.id}</ToggleButton>\n })}</ButtonGroup>\n </Col>\n </Row>\n }\n </Container>\n {geneSeq && <CodeBlock id={buildId(gene,geneSeq,+upstream,+downstream)} seq={geneSeq.seq.substring(maxUp - +upstream, maxUp + gene.location.end - gene.location.start + 1 + +downstream)} blocks={decorateSeq(geneSeq,gene,+upstream,+downstream,tid,\"dna\")}/>}\n </Tab>\n <Tab tabClassName=\"rna\" eventKey=\"rna\" title=\"Transcript sequence\">\n <Container style={{ width: '100ch', marginLeft: 0}}>\n {gene.gene_structure.transcripts.length > 1 &&\n <Row>\n <Col><b><i>Select transcript</i></b><br/>\n <ButtonGroup>{gene.gene_structure.transcripts.sort((a,b) => a.id.localeCompare(b.id)).map((tr, idx) => {\n let v = tr.id === gene.gene_structure.canonical_transcript ? 'primary' : 'secondary';\n if (tr.id !== tid) {\n v = `outline-${v}`\n }\n return <ToggleButton\n variant={v}\n key={idx}\n id={`radio-${idx}`}\n type=\"radio\"\n name={tr.id}\n value={tr.id}\n checked={tr.id === tid}\n onChange={e => setTid(e.currentTarget.value)}\n >{tr.id}</ToggleButton>\n })}</ButtonGroup>\n </Col>\n </Row>\n }\n </Container>\n {geneSeq && <CodeBlock id={tid} seq={rnaSeq.seq} blocks={decorateSeq(geneSeq,gene,0,0,tid,\"rna\")}/>}\n </Tab>\n {gene.biotype === \"protein_coding\" &&\n <Tab tabClassName=\"pep\" eventKey=\"pep\" title=\"Peptide sequence\">\n <Container style={{ width: '100ch', marginLeft: 0}}>\n {gene.gene_structure.transcripts.length > 1 &&\n <Row>\n <Col><b><i>Select transcript</i></b><br/>\n <ButtonGroup>{gene.gene_structure.transcripts.sort((a,b) => a.id.localeCompare(b.id)).map((tr, idx) => {\n let v = tr.id === gene.gene_structure.canonical_transcript ? 'primary' : 'secondary';\n if (tr.id !== tid) {\n v = `outline-${v}`\n }\n return <ToggleButton\n variant={v}\n key={idx}\n id={`radio-${idx}`}\n type=\"radio\"\n name={tr.id}\n value={tr.id}\n checked={tr.id === tid}\n onChange={e => setTid(e.currentTarget.value)}\n >{tr.id}</ToggleButton>\n })}</ButtonGroup>\n </Col>\n </Row>\n }\n </Container>\n {geneSeq && <CodeBlock id={tl_id} seq={pepSeq.seq} blocks={decoratePeptide(pepSeq.seq,transcript)}/>}\n </Tab>}\n </Tabs>\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGeneSequences',\n 'selectRnaSequences',\n 'selectPepSequences',\n 'doRequestGeneSequence',\n 'doRequestRnaSequence',\n 'doRequestPepSequence',\n Detail\n);\n\n","import React from 'react'\nimport { connect } from 'redux-bundler-react'\nimport Vis from \"gramene-search-vis\"\nimport Selection from './selection.js'\nimport '../../../node_modules/gramene-search-vis/styles/main.less';\n\nclass TaxDist extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n collapseEmpties: true,\n comparaOnly: true,\n showCompara: props.configuration.hasOwnProperty('partialCompara')\n };\n }\n handleSelection(selections) {\n this.setState({selections})\n }\n handleHighlight(highlight) {\n this.setState({highlight})\n }\n handleFilter() {\n this.setState({selections:null})\n }\n toggleEmpties() {\n this.setState({collapseEmpties: !this.state.collapseEmpties})\n }\n toggleCompara() {\n this.setState({comparaOnly: !this.state.comparaOnly})\n }\n render() {\n let selectedTaxa = {};\n if (this.props.grameneSearch) {\n if (this.state.collapseEmpties) {\n this.props.grameneSearch.facet_counts.facet_fields.taxon_id.filter((tid, idx) => idx % 2 === 0).forEach(tid => {\n selectedTaxa[tid] = true;\n })\n } else {\n if (Object.keys(this.props.grameneGenomes.active).length === 0 && this.props.grameneMaps) {\n Object.keys(this.props.grameneMaps).forEach(tid => selectedTaxa[tid] = true);\n } else {\n Object.keys(this.props.grameneGenomes.active).forEach(tid => selectedTaxa[tid]= true);\n }\n }\n if (this.state.showCompara && this.state.comparaOnly && this.props.grameneMaps) {\n Object.keys(selectedTaxa).forEach(tid => {\n if (!this.props.grameneMaps[tid].in_compara) {\n delete selectedTaxa[tid];\n }\n })\n }\n }\n return (\n <div className=\"results-vis big-vis\">\n {this.props.grameneTaxDist && <span>\n <button type=\"button\"\n className=\"btn btn-outline-primary btn-sm\"\n onClick={this.toggleEmpties.bind(this)}>\n {this.state.collapseEmpties ? 'Expand' : 'Collapse'} empty branches\n </button>\n {this.state.showCompara && <button type=\"button\"\n className=\"btn btn-outline-success btn-sm\"\n onClick={this.toggleCompara.bind(this)}>\n Show {this.state.comparaOnly ? 'all genomes' : 'only genomes in gene trees'}\n </button>\n }\n </span>}\n {this.props.grameneTaxDist && <Vis taxonomy={this.props.grameneTaxDist}\n selectedTaxa={selectedTaxa}\n onSelection={this.handleSelection.bind(this)}\n onHighlight={this.handleHighlight.bind(this)}\n />}\n {this.renderSelection()}\n </div>\n );\n }\n renderSelection() {\n if (this.state.selections && this.props.grameneTaxDist) {\n return <Selection taxonomy={this.props.grameneTaxDist}\n selectedTaxa={{}}\n selections={this.state.selections}\n onFilter={this.handleFilter.bind(this)}/>\n }\n }\n}\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneTaxDist',\n 'selectGrameneGenomes',\n 'selectGrameneSearch',\n 'selectGrameneMaps',\n TaxDist\n);\n","import React from 'react';\nimport numeral from 'numeral';\nimport _ from \"lodash\";\n\nimport {Table, Button, Badge} from 'react-bootstrap';\nimport {connect} from \"redux-bundler-react\";\n\nfunction selectionStats(selections, taxonomy) {\n const selectionData = getSelectionData(selections, taxonomy);\n const totalGeneResults = taxonomy.model.results.count;\n const fq = fqFromSelections(selections);\n\n return {\n selectedGenes: selectionData.resultsCount,\n totalGeneResults,\n fq,\n numSelectedBins: selectionData.binsCount,\n proportionGenesSelected: selectionData.resultsCount / totalGeneResults\n }\n}\n\nfunction getSelectionData(selection, taxonomy) {\n return _.reduce(selection, (countAcc, sel) => {\n const bins = taxonomy.getBins(sel.binFrom.idx, sel.binTo.idx);\n countAcc.binsCount += bins.length;\n countAcc.resultsCount += _.reduce(bins, (acc, bin) => acc + bin.results.count, 0);\n return countAcc;\n }, {resultsCount: 0, binsCount: 0});\n}\n\nconst selectionToSolrRange = (sel)=>`[${sel.binFrom.idx} TO ${sel.binTo.idx}]`;\n\nfunction fqFromSelections(selections) {\n const rangeStrings = selections.map(selectionToSolrRange);\n return `fixed_1000__bin:(${rangeStrings.join(' ')})`;\n}\n\nconst Selections = ({selections, taxonomy, doAcceptGrameneSuggestion, onFilter}) => {\n const stats = selectionStats(selections, taxonomy);\n\n const setFilter = () => {\n doAcceptGrameneSuggestion({\n category: 'Selections',\n fq_field: 'fixed_1000__bin',\n fq_value: `(${selections.map(selectionToSolrRange).join(' ')})`,\n name: `${selections.length} region${selections.length === 1 ? '':'s'}`\n });\n onFilter();\n };\n\n const formatProportion = (prop) => '(' + (_.isFinite(prop) ? numeral(prop).format('0.0%') : undefined) + ')';\n\n return (\n <div>\n <Table>\n <tbody>\n <tr>\n <th>Number of selected genes</th>\n <td>{stats.selectedGenes} {formatProportion(stats.proportionGenesSelected)}</td>\n <td><Button size='sm' onClick={setFilter}>selections |<Badge>{stats.selectedGenes}</Badge></Button>\n </td>\n </tr>\n </tbody>\n </Table>\n </div>\n )\n};\n\nexport default connect(\n 'doAcceptGrameneSuggestion',\n Selections\n);\n","import React from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport {Alert, Container, Row, Card, CardGroup} from 'react-bootstrap'\nimport './genes.css'\n\nconst examples = [\n {\n subsite: {\n maize:1,\n sorghum:1,\n main:1,\n },\n text: \"What are the orthologs of Arabidopsis thaliana's PAD4 gene in Andropogoneae?\",\n filters: {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 5,\n children: [\n {\n fq_field: 'homology__all_orthologs',\n fq_value: 'AT3G52430',\n name: 'Orthologs of PAD4',\n category: 'Gene Tree',\n leftIdx:1,\n rightIdx:2,\n negate: false,\n marked: false\n },\n {\n fq_field: 'taxonomy__ancestors',\n fq_value: 147429,\n name: 'Andropogoneae',\n category: 'Taxonomy',\n leftIdx:3,\n rightIdx:4,\n negate: false,\n marked: false\n }\n ]\n }\n },\n {\n subsite: {\n maize:1,\n sorghum:1,\n grapevine:1,\n rice:1,\n main:1,\n },\n text: \"Which genes are curated in the scientific literature?\",\n filters: {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 3,\n children: [\n {\n fq_field: 'capabilities',\n fq_value: 'pubs',\n name: 'publication',\n category: 'Curated',\n leftIdx: 1,\n rightIdx: 2,\n negate: false,\n marked: false\n }\n ]\n }\n },\n {\n subsite: {\n grapevine:1\n },\n text: \"What are the orthologs of Arabidopsis thaliana's PAD4 gene in rosids?\",\n filters: {\n status: 'init',\n rows: 20,\n operation: 'AND',\n negate: false,\n leftIdx: 0,\n rightIdx: 5,\n children: [\n {\n fq_field: 'homology__all_orthologs',\n fq_value: 'AT3G52430',\n name: 'Orthologs of PAD4',\n category: 'Gene Tree',\n leftIdx:1,\n rightIdx:2,\n negate: false,\n marked: false\n },\n {\n fq_field: 'taxonomy__ancestors',\n fq_value: 71275,\n name: 'rosids',\n category: 'Taxonomy',\n leftIdx:3,\n rightIdx:4,\n negate: false,\n marked: false\n }\n ]\n }\n }\n];\nconst HelpDemo = ({configuration,doReplaceGrameneFilters}) => (\n <Container fluid style={{padding: '40px'}}>\n <Row>\n <h3>Search Features</h3>\n </Row>\n <Row>\n <CardGroup style={{width:'80%'}}>\n <Card style={{'backgroundColor':'#f3f6f5', 'borderColor':'#DDE5E3'}}>\n <Card.Body>\n <Card.Title>Suggestions</Card.Title>\n <Card.Text>Matching terms are provided as you type:</Card.Text>\n <div className='gene-search-pic-sugg'/>\n </Card.Body>\n </Card>\n <Card style={{'backgroundColor':'#f3f6f5', 'borderColor':'#DDE5E3'}}>\n <Card.Body>\n <Card.Title>Visualization</Card.Title>\n <Card.Text>See the distribution of results across all genomes:</Card.Text>\n <div className='gene-search-pic-results'/>\n </Card.Body>\n </Card>\n <Card style={{'backgroundColor':'#f3f6f5', 'borderColor':'#DDE5E3'}}>\n <Card.Body>\n <Card.Title>Gene tree view</Card.Title>\n <Card.Text>Explore evolutionary history of a gene family:</Card.Text>\n <div className='gene-search-pic-genetree'/>\n </Card.Body>\n </Card>\n </CardGroup>\n </Row>\n <Row>\n <h4>For Example</h4>\n </Row>\n <Row>\n <small>\n You can ask sophisticated questions about the genes:<br/>\n <ul>\n {examples.filter(e => !!e.subsite[configuration.id]).map((e,idx) => (\n <li key={idx}><a onClick={() => doReplaceGrameneFilters(e.filters)}>{e.text}</a></li>\n ))}\n </ul>\n </small>\n </Row>\n </Container>\n);\n\nexport default connect(\n 'selectConfiguration',\n 'doReplaceGrameneFilters',\n HelpDemo\n);\n\n","import { connect } from 'redux-bundler-react'\n\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport StatsByGroup from \"./StatsByGroup\";\n\n\nclass GeneAttribs extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n };\n }\n render() {\n if (this.props.grameneGeneAttribs && this.props.grameneSearch) {\n const groups = this.props.grameneGeneAttribs;\n const stats = this.props.grameneSearch.stats;\n return <StatsByGroup groups={groups} stats={stats} />;\n }\n return null;\n }\n}\n\nexport default connect(\n 'selectGrameneSearch',\n 'selectGrameneGeneAttribs',\n GeneAttribs\n);\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\n\n/**\n * StatsByGroup\n *\n * Props:\n * - groups: {\n * [groupName: string]: Array<{\n * name: string,\n * description: string,\n * dtype: \"i\" | \"f\",\n * fieldName: string\n * }>\n * }\n * - stats: {\n * stats_fields: {\n * [fieldName: string]: {\n * min?: number,\n * max?: number,\n * count?: number,\n * mean?: number,\n * stddev?: number,\n * percentiles?: (string | number)[] // [\"10.0\", v10, \"20.0\", v20, ...] (order preserved)\n * }\n * }\n * }\n *\n * Columns: attr, desc, mean, stddev, min, max, count, dist\n */\nexport default function StatsByGroup({ groups, stats }) {\n const fields = stats?.stats_fields || {};\n\n return (\n <div style={{ fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\", lineHeight: 1.35 }}>\n {Object.entries(groups).map(([groupName, attrs]) => (\n <GroupTable\n key={groupName}\n groupName={groupName}\n attributes={attrs}\n fields={fields}\n />\n ))}\n </div>\n );\n}\n\nfunction GroupTable({ groupName, attributes, fields }) {\n const hasAny = attributes?.some((a) => fields[a.fieldName]);\n\n const columns = useMemo(\n () => [\n { key: \"attr\", label: \"Attribute\", min: 120 },\n { key: \"desc\", label: \"Description\", min: 380, flex: true },\n { key: \"mean\", label: \"Mean\", min: 100 },\n { key: \"stddev\", label: \"Std Dev\", min: 110 },\n { key: \"min\", label: \"Min\", min: 90 },\n { key: \"max\", label: \"Max\", min: 90 },\n { key: \"count\", label: \"Count\", min: 90 },\n { key: \"dist\", label: \"Distribution\",min: 220 },\n ],\n []\n );\n\n const initial = useMemo(\n () => columns.map((c) => (c.flex ? Math.max(380, c.min) : c.min)),\n [columns]\n );\n\n const { colWidths, startResize, resizing } = useResizableColumns({\n initialWidths: initial,\n minWidths: columns.map((c) => c.min || 60),\n });\n\n const nfInt = useMemo(() => new Intl.NumberFormat(\"en-US\", { maximumFractionDigits: 0 }), []);\n const nfFloat = useMemo(\n () => new Intl.NumberFormat(\"en-US\", { minimumFractionDigits: 0, maximumFractionDigits: 3 }),\n []\n );\n\n return (\n <section style={{ marginBottom: 24 }}>\n <header style={{ display: \"flex\", alignItems: \"baseline\", gap: 12, marginBottom: 8 }}>\n <h2 style={{ margin: 0, fontSize: 18 }}>{groupName}</h2>\n {!hasAny && <span style={{ fontSize: 12, color: \"#666\" }}>No stats available for this group.</span>}\n </header>\n\n <div\n style={{\n overflowX: \"auto\",\n border: \"1px solid #eee\",\n borderRadius: 8,\n boxShadow: \"0 1px 2px rgba(0,0,0,0.04)\",\n }}\n >\n <table style={tableStyle}>\n <colgroup>\n {colWidths.map((w, i) => (\n <col key={i} style={{ width: w }} />\n ))}\n </colgroup>\n\n <thead>\n <tr>\n {columns.map((col, i) => (\n <ResizableTh\n key={col.key}\n label={col.label}\n index={i}\n onResizeStart={startResize}\n />\n ))}\n </tr>\n </thead>\n\n <tbody>\n {attributes.map((a) => {\n const s = fields[a.fieldName] || {};\n return (\n <tr key={a.fieldName}>\n <Td mono title={a.fieldName}>{a.name}</Td>\n <Td title={a.description}>{a.description}</Td>\n <Td align=\"right\">{fmtValue(s.mean, a.dtype, true, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtValue(s.stddev, a.dtype, true, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtValue(s.min, a.dtype, false, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtValue(s.max, a.dtype, false, nfInt, nfFloat)}</Td>\n <Td align=\"right\">{fmtCount(s.count, nfInt)}</Td>\n <Td>\n <PercentileHeatmapNormalized\n percentilesArr={s.percentiles}\n min={s.min}\n max={s.max}\n />\n </Td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n\n <div style={{ marginTop: 6, fontSize: 12, color: \"#666\" }}>\n <em>Tip:</em> Drag the divider at the right edge of any header to resize.\n {resizing && <span style={{ marginLeft: 8, color: \"#999\" }}>(resizing…)</span>}\n </div>\n </section>\n );\n}\n\n/* ===================== Percentiles / Heatmap ===================== */\n\n/**\n * Convert alternating array into ordered pairs: [[\"10.0\", v10], [\"20.0\", v20], ...]\n * - Preserves the exact order provided by Solr\n */\nfunction percentilesArrayToPairs(arr) {\n if (!Array.isArray(arr)) return [];\n const out = [];\n for (let i = 0; i < arr.length - 1; i += 2) {\n out.push([String(arr[i]), arr[i + 1]]);\n }\n return out;\n}\n\nfunction normalizeBetween(value, min, max) {\n if (!isFinite(min) || !isFinite(max) || max <= min || !isFinite(value)) return null;\n return (value - min) / (max - min);\n}\n\n// White -> Blue (0 -> 1)\nfunction rgbWhiteToBlue(vNorm) {\n const t = clamp01(vNorm);\n const rg = Math.round(255 * (1 - t));\n return `rgb(${rg}, ${rg}, 255)`;\n}\nfunction clamp01(x) {\n if (typeof x !== \"number\" || !isFinite(x)) return 0;\n return Math.max(0, Math.min(1, x));\n}\nfunction fmtFloat(v) {\n if (v == null || !isFinite(v)) return \"n/a\";\n return v.toFixed(3);\n}\n\n/**\n * PercentileHeatmapNormalized\n * - Infers bins from percentilesArr (order preserved)\n * - Colors normalized by row min/max\n */\nfunction PercentileHeatmapNormalized({ percentilesArr, min, max }) {\n const pairs = useMemo(() => percentilesArrayToPairs(percentilesArr), [percentilesArr]);\n const n = pairs.length || 1; // avoid zero columns\n const validScale = isFinite(min) && isFinite(max) && max > min;\n\n return (\n <div style={{ ...heatRowDynamic, gridTemplateColumns: `repeat(${n}, 1fr)` }}>\n {pairs.map(([pStr, raw], idx) => {\n const rawNum = typeof raw === \"number\" && isFinite(raw) ? raw : null;\n const norm = rawNum == null ? null : (validScale ? normalizeBetween(rawNum, min, max) : null);\n const bg = norm == null ? \"#f2f2f2\" : rgbWhiteToBlue(norm);\n const label = `${pStr} → raw ${fmtFloat(rawNum)} (norm ${fmtFloat(norm)})`;\n return <HeatCell key={`${pStr}-${idx}`} background={bg} label={label} />;\n })}\n </div>\n );\n}\n\nfunction HeatCell({ background, label }) {\n const [hover, setHover] = useState(false);\n return (\n <div\n style={{ ...heatCell, background }}\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n title={label}\n >\n {hover && <span style={popover}>{label}</span>}\n </div>\n );\n}\n\n/* ===================== Resizable columns ===================== */\n\nfunction useResizableColumns({ initialWidths, minWidths }) {\n const [colWidths, setColWidths] = useState(initialWidths);\n const [resizing, setResizing] = useState(false);\n const activeRef = useRef(null); // { index, startX, startW }\n\n useEffect(() => {\n if (initialWidths?.length) setColWidths(initialWidths);\n }, [initialWidths?.length]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const onMouseMove = (e) => {\n if (!activeRef.current) return;\n const { index, startX, startW } = activeRef.current;\n const dx = e.clientX - startX;\n const next = [...colWidths];\n const minW = minWidths?.[index] ?? 60;\n next[index] = Math.max(minW, startW + dx);\n setColWidths(next);\n };\n\n const endResize = () => {\n activeRef.current = null;\n setResizing(false);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", endResize);\n };\n\n const startResize = (index, ev) => {\n const startX = ev.clientX;\n const startW = colWidths[index];\n activeRef.current = { index, startX, startW };\n setResizing(true);\n document.body.style.cursor = \"col-resize\";\n document.body.style.userSelect = \"none\";\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", endResize);\n };\n\n useEffect(() => {\n return () => {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", endResize);\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return { colWidths, setColWidths, startResize, resizing };\n}\n\nfunction ResizableTh({ label, index, onResizeStart }) {\n return (\n <th style={thStyle}>\n <div style={{ position: \"relative\", width: \"100%\" }}>\n <span>{label}</span>\n <span\n onMouseDown={(e) => onResizeStart(index, e)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n title=\"Drag to resize column\"\n style={resizerStyle}\n />\n </div>\n </th>\n );\n}\n\n/* ===================== Formatting helpers ===================== */\n\nfunction fmtCount(v, nfInt) {\n if (v === null || v === undefined) return \"—\";\n return nfInt.format(v);\n}\n\nfunction fmtValue(v, dtype = \"f\", isStat = false, nfInt, nfFloat) {\n if (v === null || v === undefined || Number.isNaN(v)) return \"—\";\n const isIntType = dtype === \"i\";\n return isIntType && !isStat ? nfInt.format(v) : nfFloat.format(v);\n}\n\n/* ===================== Cells & Styles ===================== */\n\nfunction Td({ children, align = \"left\", mono = false, title }) {\n return (\n <td\n title={title}\n style={{\n ...cellBase,\n textAlign: align,\n borderBottom: \"1px solid #eee\",\n padding: \"8px 10px\",\n fontFamily: mono ? \"ui-monospace, SFMono-Regular, Menlo, monospace\" : undefined,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n verticalAlign: \"top\",\n }}\n >\n {children}\n </td>\n );\n}\n\nconst tableStyle = {\n width: \"100%\",\n borderCollapse: \"collapse\",\n tableLayout: \"fixed\",\n minWidth: 980,\n};\n\nconst cellBase = {\n fontSize: 13,\n lineHeight: 1.35,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst thStyle = {\n ...cellBase,\n textAlign: \"left\",\n borderBottom: \"1px solid #ddd\",\n background: \"#fafafa\",\n fontWeight: 600,\n padding: \"10px 10px\",\n position: \"relative\",\n};\n\nconst resizerStyle = {\n position: \"absolute\",\n right: -5,\n top: 0,\n height: \"100%\",\n width: 10,\n cursor: \"col-resize\",\n boxShadow: \"inset -1px 0 0 rgba(0,0,0,0.08)\",\n};\n\nconst heatRowDynamic = {\n display: \"grid\",\n gap: 2,\n alignItems: \"center\",\n width: \"100%\",\n minWidth: 200,\n};\n\nconst heatCell = {\n height: 16,\n borderRadius: 3,\n position: \"relative\",\n boxShadow: \"inset 0 0 0 1px rgba(0,0,0,0.06)\",\n};\n\nconst popover = {\n position: \"absolute\",\n left: \"50%\",\n top: -26,\n transform: \"translateX(-50%)\",\n padding: \"2px 6px\",\n fontSize: 11,\n background: \"rgba(0,0,0,0.8)\",\n color: \"#fff\",\n borderRadius: 4,\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n};\n","import React from \"react\";\nimport { connect } from 'redux-bundler-react'\nimport { Modal, Button } from \"react-bootstrap\";\nimport { BsChevronDown, BsChevronRight } from \"react-icons/bs\";\n\n// name → subtle background colour. Checked against node.name at render time.\nconst CLADE_COLORS = {\n \"Chlorophyta\": \"#e8f5e9\",\n \"Bryophyta\": \"#f1f8e9\",\n \"Liliopsida\": \"#fff8e1\", // monocots\n \"eudicotyledons\": \"#fce4ec\",\n \"Poaceae\": \"#fff3e0\",\n \"Fabaceae\": \"#ede7f6\",\n \"Brassicaceae\": \"#e1f5fe\",\n \"Solanaceae\": \"#ffebee\",\n};\n\nfunction findRoots(tax) {\n return Object.values(tax).filter(n =>\n !n.is_a || n.is_a.length === 0 || !n.is_a.some(p => tax[p])\n );\n}\n\n// Post-order: attach .leafIds (taxon_ids of maps in subtree) and .isLeaf\nfunction annotate(node, tax, maps) {\n const leafIds = [];\n if (maps[node._id]) { node.isLeaf = true; leafIds.push(node._id); }\n (node.children || []).forEach(cid => {\n const child = tax[cid];\n if (!child) return;\n annotate(child, tax, maps);\n child.leafIds.forEach(id => leafIds.push(id));\n });\n node.leafIds = leafIds;\n}\n\n// Walk down the spine through single-child internals until a branch point,\n// leaf, or node that is itself a genome.\nfunction compressChain(node, tax, maps) {\n const chain = [node];\n let cur = node;\n while (true) {\n const kids = (cur.children || [])\n .map(cid => tax[cid])\n .filter(c => c && c.leafIds && c.leafIds.length > 0);\n if (kids.length !== 1) break;\n if (maps[cur._id]) break;\n cur = kids[0];\n chain.push(cur);\n }\n return { chain, terminal: cur };\n}\n\n// Render a breadcrumb chain. If the chain has more than 3 nodes, collapse the\n// middle into a hoverable ellipsis that reveals the hidden names on hover.\nconst CHAIN_DISPLAY_MAX = 3;\nfunction renderChain(chain) {\n const nameOf = n => n.short_name || n.name;\n if (chain.length <= CHAIN_DISPLAY_MAX) {\n return chain.map((n, i) => (\n <React.Fragment key={n._id}>\n {i > 0 && <span className=\"tax-sep\"> › </span>}\n {nameOf(n)}\n </React.Fragment>\n ));\n }\n const first = chain[0];\n const last = chain[chain.length - 1];\n const middle = chain.slice(1, -1);\n const fullTitle = chain.map(nameOf).join(' › ');\n return (\n <>\n {nameOf(first)}\n <span className=\"tax-sep\"> › </span>\n <span className=\"tax-ellipsis\" title={fullTitle}>\n <span className=\"tax-ellipsis-short\">…</span>\n <span className=\"tax-ellipsis-full\">\n {middle.map(n => (\n <React.Fragment key={n._id}>\n {nameOf(n)}\n <span className=\"tax-sep\"> › </span>\n </React.Fragment>\n ))}\n </span>\n </span>\n <span className=\"tax-sep\"> › </span>\n {nameOf(last)}\n </>\n );\n}\n\n// Drop a parent when its single child has the same name (e.g. species node\n// above a subspecies-less record that repeats the species name). The terminal\n// (last element) is always preserved; only redundant ancestors are removed.\nfunction dedupAdjacent(chain) {\n const out = [];\n for (const n of chain) {\n if (out.length && out[out.length - 1].name === n.name) {\n out[out.length - 1] = n; // keep the child, drop the parent\n } else {\n out.push(n);\n }\n }\n return out;\n}\n\n// Use the node's direct `rank` field when it carries a real value.\nfunction getRank(node) {\n const r = node && node.rank;\n return r && r !== 'no rank' ? r : null;\n}\n\n// Search nodes whose name or a synonym contains the query. Prefix matches rank higher.\nfunction searchTaxonomy(query, tax) {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n const out = [];\n Object.values(tax).forEach(n => {\n const name = n.name || '';\n const nameLc = name.toLowerCase();\n if (nameLc.includes(q)) {\n out.push({ node: n, matched: name, via: 'name', prefix: nameLc.startsWith(q) });\n return;\n }\n const syns = n.synonym || [];\n for (const s of syns) {\n const sLc = s.toLowerCase();\n if (sLc.includes(q)) {\n out.push({ node: n, matched: s, via: 'synonym', prefix: sLc.startsWith(q) });\n return;\n }\n }\n });\n out.sort((a, b) =>\n (a.prefix === b.prefix ? 0 : a.prefix ? -1 : 1)\n || a.node.name.localeCompare(b.node.name)\n );\n return out.slice(0, 20);\n}\n\n// Compute the { selected, expanded } pair for a fresh modal opening:\n// selection is seeded from active genomes (or everything non-hidden),\n// and every ancestor of a selected genome is pre-expanded so the user sees\n// all of their current selections without manually drilling in.\nfunction computeOpenState(props) {\n const { grameneMaps, grameneTaxonomy, grameneGenomes } = props;\n const activeKeys = Object.keys(grameneGenomes.active || {});\n const seedAll = activeKeys.length === 0;\n const selected = new Set();\n Object.values(grameneMaps || {}).forEach(m => {\n if (m.hidden) return;\n if (seedAll || grameneGenomes.active[m.taxon_id]) selected.add(m.taxon_id);\n });\n const expanded = new Set();\n if (grameneTaxonomy) {\n selected.forEach(tid => {\n let cur = grameneTaxonomy[tid];\n const seen = new Set();\n while (cur && !seen.has(cur._id)) {\n seen.add(cur._id);\n expanded.add(cur._id);\n const pid = cur.is_a && cur.is_a[0];\n cur = pid ? grameneTaxonomy[pid] : null;\n }\n });\n }\n return { selected, expanded };\n}\n\nclass TaxonomyModal extends React.Component {\n constructor(props) {\n super(props);\n const { grameneMaps, grameneTaxonomy } = props;\n\n let roots = [];\n if (grameneTaxonomy) {\n roots = findRoots(grameneTaxonomy);\n roots.forEach(r => annotate(r, grameneTaxonomy, grameneMaps));\n }\n\n const { selected, expanded } = computeOpenState(props);\n this.state = {\n selected,\n expanded,\n roots,\n query: '',\n highlightId: null,\n activeIdx: 0,\n };\n this.rowRefs = {};\n this._matches = [];\n this._activeHitEl = null;\n }\n\n handleQueryChange(e) {\n this.setState({ query: e.target.value, activeIdx: 0 });\n }\n\n handleSearchKeyDown(e) {\n const n = this._matches.length;\n if (e.key === 'ArrowDown') {\n if (n === 0) return;\n e.preventDefault();\n this.setState({ activeIdx: Math.min(this.state.activeIdx + 1, n - 1) });\n } else if (e.key === 'ArrowUp') {\n if (n === 0) return;\n e.preventDefault();\n this.setState({ activeIdx: Math.max(this.state.activeIdx - 1, 0) });\n } else if (e.key === 'Enter') {\n if (n === 0) return;\n e.preventDefault();\n const hit = this._matches[this.state.activeIdx] || this._matches[0];\n if (hit) this.pickMatch(hit.node);\n } else if (e.key === 'Escape') {\n if (this.state.query) {\n e.preventDefault();\n this.setState({ query: '', activeIdx: 0 });\n }\n }\n }\n\n componentDidUpdate(prevProps, prevState) {\n // On each hidden→shown transition, reseed selection from current active\n // genomes and expand every ancestor so selected taxa are visible.\n const wasShown = prevProps.grameneGenomes && prevProps.grameneGenomes.show;\n const isShown = this.props.grameneGenomes && this.props.grameneGenomes.show;\n if (!wasShown && isShown) {\n const { selected, expanded } = computeOpenState(this.props);\n this.setState({ selected, expanded, query: '', activeIdx: 0, highlightId: null });\n }\n // Keep the highlighted hit scrolled into view inside the dropdown.\n if (prevState.activeIdx !== this.state.activeIdx && this._activeHitEl) {\n this._activeHitEl.scrollIntoView({ block: 'nearest' });\n }\n }\n\n pickMatch(node) {\n // Expand every ancestor so the node is visible, then scroll + flash.\n const { grameneTaxonomy } = this.props;\n const expanded = new Set(this.state.expanded);\n let cur = node;\n const seen = new Set();\n while (cur && !seen.has(cur._id)) {\n seen.add(cur._id);\n expanded.add(cur._id);\n const pid = cur.is_a && cur.is_a[0];\n cur = pid ? grameneTaxonomy[pid] : null;\n }\n this.setState({ expanded, query: '', highlightId: node._id }, () => {\n const el = this.rowRefs[node._id];\n if (el && el.scrollIntoView) el.scrollIntoView({ block: 'center', behavior: 'smooth' });\n clearTimeout(this._hlTimer);\n this._hlTimer = setTimeout(() => this.setState({ highlightId: null }), 1800);\n });\n }\n\n toggleExpand(id) {\n const expanded = new Set(this.state.expanded);\n expanded.has(id) ? expanded.delete(id) : expanded.add(id);\n this.setState({ expanded });\n }\n\n toggleLeaf(taxonId) {\n const selected = new Set(this.state.selected);\n selected.has(taxonId) ? selected.delete(taxonId) : selected.add(taxonId);\n this.setState({ selected });\n }\n\n toggleSubtree(terminal) {\n const selected = new Set(this.state.selected);\n const allOn = terminal.leafIds.every(id => selected.has(id));\n terminal.leafIds.forEach(id => allOn ? selected.delete(id) : selected.add(id));\n this.setState({ selected });\n }\n\n selectAll() {\n const s = new Set();\n Object.values(this.props.grameneMaps).forEach(m => {\n if (!m.hidden) s.add(m.taxon_id);\n });\n this.setState({ selected: s });\n }\n\n selectNone() {\n this.setState({ selected: new Set() });\n }\n\n handleClose() {\n const active = {};\n this.state.selected.forEach(id => { active[id] = true; });\n if (Object.keys(active).length === 0) {\n Object.values(this.props.grameneMaps).forEach(m => {\n if (!m.hidden) active[m.taxon_id] = true;\n });\n }\n this.props.doUpdateGrameneGenomes(active);\n }\n\n renderNode(node, depth, inheritedColor) {\n const { grameneTaxonomy, grameneMaps } = this.props;\n const { selected, expanded } = this.state;\n\n const { chain: rawChain, terminal } = compressChain(node, grameneTaxonomy, grameneMaps);\n const chain = dedupAdjacent(rawChain);\n const leafIds = terminal.leafIds;\n if (leafIds.length === 0) return null;\n\n const selCount = leafIds.reduce((n, id) => n + (selected.has(id) ? 1 : 0), 0);\n const total = leafIds.length;\n const allOn = selCount === total;\n const someOn = selCount > 0 && !allOn;\n\n const visibleKids = (terminal.children || [])\n .map(cid => grameneTaxonomy[cid])\n .filter(c => c && c.leafIds.length > 0);\n const hasKids = visibleKids.length > 0;\n const terminalIsGenome = !!grameneMaps[terminal._id];\n\n const isOpen = expanded.has(terminal._id);\n\n // Deepest clade colour in the chain wins; falls back to inherited.\n const color = chain.reduce(\n (acc, n) => CLADE_COLORS[n.name] || acc,\n inheritedColor\n );\n\n const isHighlighted = rawChain.some(n => n._id === this.state.highlightId);\n\n return (\n <div\n key={terminal._id}\n className={\"tax-node\" + (isHighlighted ? \" tax-node-highlight\" : \"\")}\n style={{ background: color }}\n ref={el => {\n // Register every traversed node (including dedupped-away parents) so\n // search results targeting any ancestor still scroll to this row.\n rawChain.forEach(n => { this.rowRefs[n._id] = el; });\n }}\n >\n <div className=\"tax-row\" style={{ paddingLeft: depth * 7 }}>\n {hasKids ? (\n <span\n className=\"tax-chevron\"\n onClick={() => this.toggleExpand(terminal._id)}\n >\n {isOpen ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n ) : (\n <span className=\"tax-chevron-spacer\"/>\n )}\n\n <input\n type=\"checkbox\"\n checked={allOn}\n ref={el => { if (el) el.indeterminate = someOn; }}\n onChange={() => {\n if (hasKids) this.toggleSubtree(terminal);\n else if (terminalIsGenome) this.toggleLeaf(terminal._id);\n }}\n />\n {' '}\n <span className={hasKids ? \"tax-label tax-label-internal\" : \"tax-label\"}>\n {renderChain(chain)}\n </span>\n\n {(hasKids || terminalIsGenome) && (\n <span className=\"tax-count\"> ({selCount} / {total})</span>\n )}\n\n {hasKids && terminalIsGenome && (\n <label className=\"tax-self-leaf\">\n <input\n type=\"checkbox\"\n checked={selected.has(terminal._id)}\n onChange={() => this.toggleLeaf(terminal._id)}\n />\n <em>this genome</em>\n </label>\n )}\n </div>\n\n {hasKids && isOpen && (\n <div className=\"tax-children\">\n {visibleKids.map(c => this.renderNode(c, depth + 1, color))}\n </div>\n )}\n </div>\n );\n }\n\n render() {\n const { roots } = this.state;\n const { grameneTaxonomy, grameneMaps } = this.props;\n\n // Hide the root spine: start rendering at the first real branch point.\n const topLevel = [];\n roots.forEach(r => {\n const { terminal } = compressChain(r, grameneTaxonomy || {}, grameneMaps || {});\n (terminal.children || []).forEach(cid => {\n const child = grameneTaxonomy && grameneTaxonomy[cid];\n if (child && child.leafIds && child.leafIds.length > 0) {\n topLevel.push(child);\n }\n });\n });\n\n return (\n <Modal\n show={this.props.grameneGenomes.show}\n onHide={this.handleClose.bind(this)}\n size='lg'\n >\n <Modal.Header closeButton>\n <Modal.Title>Select Genomes of Interest</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Button variant=\"outline-secondary\" onClick={this.selectAll.bind(this)}>All</Button>{' '}\n <Button variant=\"outline-secondary\" onClick={this.selectNone.bind(this)}>None</Button>\n\n {(() => {\n this._matches = this.state.query\n ? searchTaxonomy(this.state.query, grameneTaxonomy || {})\n : [];\n const matches = this._matches;\n const activeIdx = Math.min(this.state.activeIdx, Math.max(0, matches.length - 1));\n return (\n <div className=\"tax-search\">\n <input\n type=\"text\"\n className=\"tax-search-input\"\n placeholder=\"Find taxon by name or synonym…\"\n value={this.state.query}\n onChange={this.handleQueryChange.bind(this)}\n onKeyDown={this.handleSearchKeyDown.bind(this)}\n />\n {this.state.query && (\n <div className=\"tax-search-results\">\n {matches.length === 0 ? (\n <div className=\"tax-search-empty\">No matches</div>\n ) : matches.map(({ node, matched, via }, i) => {\n const rank = getRank(node);\n const count = (node.leafIds && node.leafIds.length) || 0;\n const isLeaf = !!(grameneMaps && grameneMaps[node._id]);\n const isActive = i === activeIdx;\n return (\n <div\n key={node._id}\n ref={el => { if (isActive) this._activeHitEl = el; }}\n className={\"tax-search-hit\" + (isActive ? \" tax-search-hit-active\" : \"\")}\n onMouseDown={e => e.preventDefault()}\n onMouseEnter={() => this.setState({ activeIdx: i })}\n onClick={() => this.pickMatch(node)}\n >\n <span className=\"tax-search-name\">{node.name}</span>\n {via === 'synonym' && (\n <span className=\"tax-search-syn\"> {matched} <em>syn.</em></span>\n )}\n {rank && <span className=\"tax-search-rank\"> {rank}</span>}\n {!isLeaf && (\n <span className=\"tax-search-count\"> · {count} genome{count === 1 ? '' : 's'}</span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })()}\n\n <div className=\"tax-tree\">\n {topLevel.map(n => this.renderNode(n, 0, null))}\n </div>\n <Button onClick={this.handleClose.bind(this)}>Submit</Button>\n </Modal.Body>\n </Modal>\n );\n }\n}\n\nexport default connect(\n 'selectGrameneGenomes',\n 'selectGrameneMaps',\n 'selectGrameneTaxonomy',\n 'doUpdateGrameneGenomes',\n TaxonomyModal\n)\n","import React, { useState, Suspense } from 'react'\nimport {connect} from \"redux-bundler-react\";\nimport { Accordion, Button } from 'react-bootstrap';\nimport \"./expression.css\";\nimport Study from './Study';\nconst LazyStudy = React.lazy(() => import('./Study'));\n\nconst StudyList = props => {\n return <Accordion alwaysOpen defaultActiveKey={props.studies.length === 1 ? \"study_0\" : undefined}>\n {props.studies.map((study, idx) => {\n return (\n <Accordion.Item key={idx} eventKey={'study_'+idx}>\n <Accordion.Header>{study.description}</Accordion.Header>\n <Accordion.Body>\n {/*<Suspense fallback={<div>Loading...</div>}>*/}\n {/* <LazyStudy id={study._id}/>*/}\n {/*</Suspense>*/}\n <Study id={study._id}/>\n </Accordion.Body>\n </Accordion.Item>\n )\n })}\n </Accordion>\n};\n\nconst Expression = props => {\n let searchTaxa = {};\n if (props.grameneSearch) {\n const taxon_id_facet = props.grameneSearch.facet_counts.facet_fields.taxon_id;\n taxon_id_facet.filter((tid, idx) => idx % 2 === 0).forEach(tid => {\n if (tid > 1000000) {\n const tid2 = Math.floor(tid / 1000);\n if (props.expressionStudies[tid2]) {\n searchTaxa[tid2] = tid;\n }\n }\n else {\n searchTaxa[tid] = tid;\n }\n });\n }\n const availableTaxa = Object.keys(props.expressionStudies)\n .filter(tid => searchTaxa[tid])\n .sort((a,b) => props.grameneMaps[searchTaxa[a]].left_index - props.grameneMaps[searchTaxa[b]].left_index);\n return availableTaxa && props.grameneTaxonomy &&\n <div>\n <div>This is where you can launch a component for the selected samples. props.desiredSamples lists them.\n This component can request the data from the API\n organize samples by factor metadata? One big table with all the studies?\n <Button\n onClick={console.log(Object.keys(props.desiredSamples))}\n >Show Samples ({Object.keys(props.desiredSamples).length} selected)</Button>\n </div>\n <Accordion alwaysOpen defaultActiveKey={availableTaxa.length === 1 ? \"tax_0\" : undefined}>\n {availableTaxa.map((tid, idx) => {\n const baselineStudies = props.expressionStudies[tid].filter(study => study.type === 'Baseline');\n const n = baselineStudies.length;\n return <Accordion.Item key={idx} eventKey={'tax_'+idx}>\n <Accordion.Header>{props.grameneTaxonomy[tid].name} - {n} {n === 1 ? 'study' : 'studies'}</Accordion.Header>\n <Accordion.Body><StudyList studies={baselineStudies}/></Accordion.Body>\n </Accordion.Item>\n })}\n </Accordion>\n </div>\n};\n\nexport default connect(\n 'selectConfiguration',\n 'selectGrameneSearch',\n 'selectGrameneTaxonomy',\n 'selectGrameneMaps',\n 'selectExpressionStudies',\n 'selectDesiredSamples', // current set of samples to fetch expression data for\n Expression\n);\n","import {connect} from \"redux-bundler-react\";\nimport React, { useEffect, useMemo, useState } from 'react';\nimport {Table, Form, Button, Alert, Spinner, Container, Row, Col, Modal} from 'react-bootstrap';\nimport { getFirebaseApp } from \"../utils\";\nimport {getAuth, onAuthStateChanged} from \"firebase/auth\";\n\nconst MAX_GENE_IDS = 1000; // Define the maximum number of gene IDs allowed\n\nconst formatCreatedAt = (value) => {\n if (!value) return '';\n const d = new Date(value);\n if (isNaN(d.getTime())) return '';\n return d.toLocaleDateString();\n};\n\nconst applySortFilter = (lists, search, sort) => {\n const s = search.trim().toLowerCase();\n let result = s\n ? lists.filter(l => (l.label || '').toLowerCase().includes(s))\n : lists.slice();\n const { key, dir } = sort;\n const mult = dir === 'asc' ? 1 : -1;\n result.sort((a, b) => {\n let av = a[key], bv = b[key];\n if (key === 'createdAt') {\n av = av ? new Date(av).getTime() : 0;\n bv = bv ? new Date(bv).getTime() : 0;\n } else if (key === 'n_genes') {\n av = av || 0;\n bv = bv || 0;\n } else {\n av = (av || '').toString().toLowerCase();\n bv = (bv || '').toString().toLowerCase();\n }\n if (av < bv) return -1 * mult;\n if (av > bv) return 1 * mult;\n return 0;\n });\n return result;\n};\n\nconst SortHeader = ({ label, sortKey, sort, onToggle }) => {\n const active = sort.key === sortKey;\n const indicator = active ? (sort.dir === 'asc' ? ' ▲' : ' ▼') : '';\n return (\n <th\n style={{ cursor: 'pointer', userSelect: 'none', position: 'sticky', top: 0, background: '#fff', zIndex: 1 }}\n onClick={() => onToggle(sortKey)}\n >\n {label}{indicator}\n </th>\n );\n};\n\nconst stickyHeaderStyle = { position: 'sticky', top: 0, background: '#fff', zIndex: 1 };\n\nconst GeneListDisplayComponent = props => {\n const [publicGeneLists, setPublicGeneLists] = useState([]);\n const [privateGeneLists, setPrivateGeneLists] = useState([]);\n const [error, setError] = useState(null);\n const [notice, setNotice] = useState(null);\n const [user, setUser] = useState({});\n const [editingId, setEditingId] = useState(null);\n const [editLabel, setEditLabel] = useState('');\n const [editIsPublic, setEditIsPublic] = useState(false);\n const [deleteTarget, setDeleteTarget] = useState(null);\n const [search, setSearch] = useState('');\n const [sort, setSort] = useState({ key: 'createdAt', dir: 'desc' });\n const auth = props.auth;\n if (auth) onAuthStateChanged(auth, (user) => setUser(user));\n\n const toggleSort = (key) => setSort(s =>\n s.key === key ? { key, dir: s.dir === 'asc' ? 'desc' : 'asc' } : { key, dir: 'asc' }\n );\n\n const currentUid = user && user.uid;\n const mergedLists = useMemo(() => {\n const byId = new Map();\n [...publicGeneLists, ...privateGeneLists].forEach(l => byId.set(l._id, l));\n return Array.from(byId.values());\n }, [publicGeneLists, privateGeneLists]);\n\n const displayedLists = useMemo(\n () => applySortFilter(mergedLists, search, sort),\n [mergedLists, search, sort]\n );\n\n const fetchPrivateGeneLists = async () => {\n if (!auth) {\n setPrivateGeneLists([]);\n setError(null);\n setNotice(null);\n return;\n }\n if (!user || typeof user.getIdToken !== 'function') {\n setPrivateGeneLists([]);\n setError(null);\n setNotice('Log in to create and manage your personal gene lists.');\n return;\n }\n try {\n const token = await user.getIdToken();\n const response = await fetch(`${props.api}/gene_lists?site=${props.site}&isPublic=false`, {\n method: 'GET',\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`\n }\n });\n const result = await response.json();\n\n if (response.ok) {\n setError(null);\n setNotice(null);\n setPrivateGeneLists(result);\n } else {\n setError('Error fetching gene lists.');\n }\n } catch (err) {\n setError('Failed to fetch private gene lists. Please try again later.');\n }\n };\n // Fetch saved gene lists from a backend or local storage\n const fetchPublicGeneLists = async () => {\n try {\n // Replace this with actual fetch from your backend or storage\n const response = await fetch(`${props.api}/gene_lists?site=${props.site}&isPublic=true`);\n const result = await response.json();\n\n if (response.ok) {\n setPublicGeneLists(result); // array of saved gene lists\n } else {\n setError('Error fetching gene lists.');\n }\n } catch (err) {\n setError('Failed to fetch gene lists. Please try again later.');\n }\n };\n\n // Example functions for viewing and deleting lists\n const viewGeneList = (list) => {\n props.addFilter({\n category: 'Gene List',\n fq_field: 'saved_search',\n fq_value: list.hash,\n name: list.label\n })\n };\n\n const startEdit = (list) => {\n setEditingId(list._id);\n setEditLabel(list.label || '');\n setEditIsPublic(!!list.isPublic);\n };\n\n const cancelEdit = () => {\n setEditingId(null);\n setEditLabel('');\n setEditIsPublic(false);\n };\n\n const saveEdit = async (listId) => {\n try {\n const token = await user.getIdToken();\n const response = await fetch(`${props.api}/gene_lists?listId=${encodeURIComponent(listId)}`, {\n method: 'PATCH',\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`\n },\n body: JSON.stringify({ label: editLabel, isPublic: editIsPublic })\n });\n if (response.ok) {\n cancelEdit();\n setError(null);\n await fetchPrivateGeneLists();\n await fetchPublicGeneLists();\n } else if (response.status === 401) {\n setError('You must be signed in to edit a gene list.');\n } else if (response.status === 404) {\n setError('Gene list not found or you do not own it.');\n } else if (response.status === 400) {\n setError('Nothing to update — please enter a label.');\n } else {\n setError('Failed to update gene list.');\n }\n } catch (err) {\n setError('Failed to update gene list.');\n }\n };\n\n const requestDelete = (list) => setDeleteTarget(list);\n const cancelDelete = () => setDeleteTarget(null);\n\n const confirmDelete = async () => {\n if (!deleteTarget) return;\n const listId = deleteTarget._id;\n setDeleteTarget(null);\n try {\n const token = await user.getIdToken();\n const response = await fetch(`${props.api}/gene_lists?listId=${encodeURIComponent(listId)}`, {\n method: 'DELETE',\n headers: { \"Authorization\": `Bearer ${token}` }\n });\n if (response.ok) {\n await fetchPrivateGeneLists();\n await fetchPublicGeneLists();\n } else if (response.status === 401) {\n alert('You must be signed in to delete a gene list.');\n } else if (response.status === 404) {\n alert('Gene list not found or you do not own it.');\n } else {\n alert('Failed to delete gene list.');\n }\n } catch (err) {\n alert('Failed to delete gene list.');\n }\n };\n\n // Fetch data when the component is mounted or after a save\n useEffect(() => {\n fetchPublicGeneLists();\n }, [props.refreshKey]);\n useEffect(() => {\n fetchPrivateGeneLists();\n }, [user, props.refreshKey]);\n\n return (\n <div className=\"gene-list-display-component\">\n {error && (\n <Alert variant=\"danger\">\n {error}\n </Alert>\n )}\n\n {notice && (\n <Alert variant=\"info\">\n {notice}\n </Alert>\n )}\n\n {mergedLists.length > 0 ? (\n <div className=\"mt-4\">\n <div className=\"d-flex justify-content-end mb-2\">\n <Form.Control\n type=\"search\"\n placeholder=\"Search...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n style={{ maxWidth: 220 }}\n size=\"sm\"\n />\n </div>\n <div style={{ maxHeight: 500, overflowY: 'auto', border: '1px solid #dee2e6', borderRadius: 4 }}>\n <Table striped hover className=\"mb-0\">\n <thead>\n <tr>\n <SortHeader label=\"List Name\" sortKey=\"label\" sort={sort} onToggle={toggleSort} />\n <SortHeader label=\"Owner\" sortKey=\"owner\" sort={sort} onToggle={toggleSort} />\n <SortHeader label=\"Genes\" sortKey=\"n_genes\" sort={sort} onToggle={toggleSort} />\n <SortHeader label=\"Created\" sortKey=\"createdAt\" sort={sort} onToggle={toggleSort} />\n <th style={stickyHeaderStyle}>Actions</th>\n </tr>\n </thead>\n <tbody>\n {displayedLists.map((list, index) => {\n const isMine = currentUid && list.uid === currentUid;\n const ownerLabel = isMine ? 'You' : (list.owner || 'Unknown');\n return editingId === list._id ? (\n <tr key={index}>\n <td>\n <Form.Control\n type=\"text\"\n value={editLabel}\n onChange={(e) => setEditLabel(e.target.value)}\n placeholder=\"List name\"\n />\n <Form.Check\n type=\"switch\"\n id={`edit-public-${list._id}`}\n label=\"Public\"\n checked={editIsPublic}\n onChange={() => setEditIsPublic(!editIsPublic)}\n className=\"mt-2\"\n />\n </td>\n <td>{ownerLabel}</td>\n <td>{list.n_genes || 0}</td>\n <td>{formatCreatedAt(list.createdAt)}</td>\n <td>\n <Button variant=\"primary\" size=\"sm\" onClick={() => saveEdit(list._id)}>\n Save\n </Button>\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={cancelEdit} className=\"ml-2\">\n Cancel\n </Button>\n </td>\n </tr>\n ) : (\n <tr key={index}>\n <td>{list.label}{list.isPublic ? ' (public)' : ''}</td>\n <td>{ownerLabel}</td>\n <td>{list.n_genes || 0}</td>\n <td>{formatCreatedAt(list.createdAt)}</td>\n <td>\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={() => viewGeneList(list)}>\n View\n </Button>\n {isMine && (\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={() => startEdit(list)} className=\"ml-2\">\n Edit\n </Button>\n )}\n {isMine && (\n <Button variant=\"outline-danger\" size=\"sm\" onClick={() => requestDelete(list)} className=\"ml-2\">\n Delete\n </Button>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </Table>\n </div>\n </div>\n ) : (\n <Alert variant=\"warning\" className=\"mt-4\">\n No saved gene lists found.\n </Alert>\n )}\n\n <Modal show={!!deleteTarget} onHide={cancelDelete} centered>\n <Modal.Header closeButton>\n <Modal.Title>Delete gene list?</Modal.Title>\n </Modal.Header>\n <Modal.Body>\n Are you sure you want to delete\n {deleteTarget ? <> <strong>{deleteTarget.label}</strong></> : ' this gene list'}?\n This action cannot be undone.\n </Modal.Body>\n <Modal.Footer>\n <Button variant=\"secondary\" onClick={cancelDelete} autoFocus>\n Cancel\n </Button>\n <Button variant=\"danger\" onClick={confirmDelete}>\n Delete\n </Button>\n </Modal.Footer>\n </Modal>\n </div>\n );\n};\n\nconst GeneListComponent = props => {\n const [geneList, setGeneList] = useState('');\n const [listHash, setListHash] = useState(null);\n const [validationError, setValidationError] = useState([]);\n const [listName, setListName] = useState('');\n const [listIsPublic, setListIsPublic] = useState(false);\n const [validatedList, setValidatedList] = useState([]);\n const [errorMessage, setErrorMessage] = useState('');\n const [loading, setLoading] = useState(false); // New loading state\n const [user, setUser] = useState({});\n const auth = props.auth;\n if (auth) onAuthStateChanged(auth, (user) => setUser(user));\n\n // Function to handle gene list input\n const handleGeneListChange = (event) => {\n setGeneList(event.target.value);\n };\n\n // Function to handle drag and drop of gene list\n const handleDrop = (event) => {\n event.preventDefault();\n const geneData = event.dataTransfer.getData('text');\n setGeneList(geneData);\n };\n\n // Function to handle drag over (needed for drop)\n const handleDragOver = (event) => {\n event.preventDefault();\n };\n\n // Function to submit gene list for validation\n const handleSubmit = async () => {\n const geneArray = geneList.split('\\n').filter(Boolean); // Convert the gene list into an array and filter out empty values\n\n if (geneArray.length > MAX_GENE_IDS) {\n setErrorMessage(`You have exceeded the maximum limit of ${MAX_GENE_IDS} gene IDs.`);\n return;\n }\n\n setErrorMessage(''); // Reset error message if validation passes\n setLoading(true); // Set loading state to true to show progress\n\n try {\n const response = await fetch(`${props.api}/gene_lists/validate`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(geneArray),\n });\n\n const result = await response.json();\n\n if (result.hash) {\n setListHash(result.hash);\n setValidatedList(result.ids);\n setValidationError(result.missing);\n } else {\n // Handle errors from validation\n alert('Error during validation.');\n }\n } catch (error) {\n alert('There was an error with the validation service.',error);\n } finally {\n setLoading(false); // Set loading to false when the request is complete\n }\n };\n\n // Function to save the validated gene list\n const handleSaveList = async () => {\n const queryParams = {\n label: listName,\n hash: listHash,\n site: props.site,\n n_genes: validatedList.length,\n isPublic: listIsPublic\n };\n const queryString = new URLSearchParams(queryParams).toString();\n\n const token = await user.getIdToken();\n try {\n const response = await fetch(`${props.api}/gene_lists?${queryString}`, {\n method: 'POST',\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": `Bearer ${token}`\n }\n });\n if (!response.ok) {\n throw new Error('Failed to save list');\n }\n const result = await response.json();\n console.log(result);\n setGeneList('');\n setListHash(null);\n setValidatedList([]);\n setValidationError([]);\n setListName('');\n setListIsPublic(false);\n if (props.onListSaved) props.onListSaved();\n\n } catch (error) {\n console.error(\"There was an problem with fetch\", error)\n }\n };\n\n return (\n <div className=\"gene-list-component\">\n <Form>\n {/* Input for Gene List */}\n <Form.Group controlId=\"geneList\">\n <Form.Label>Paste or drop your gene list here:</Form.Label>\n <Form.Control\n as=\"textarea\"\n rows={10}\n value={geneList}\n onChange={handleGeneListChange}\n placeholder={`Paste or drop your gene list here (Maximum: ${MAX_GENE_IDS} IDs)`}\n onDrop={handleDrop}\n onDragOver={handleDragOver}\n />\n </Form.Group>\n\n {/* Display error if gene list exceeds limit */}\n {errorMessage && (\n <Alert variant=\"danger\">\n {errorMessage}\n </Alert>\n )}\n\n {/* Button to submit for validation */}\n <Button variant=\"primary\" onClick={handleSubmit}>\n Validate Gene List\n </Button>\n </Form>\n\n {/* Display validation in progress */}\n {loading && (\n <div className=\"validation-summary mt-4\">\n <h3>Validation in Progress...</h3>\n <Spinner animation=\"border\" role=\"status\">\n <span className=\"sr-only\">Validating...</span>\n </Spinner>\n </div>\n )}\n\n\n {/* Display validation summary */}\n {!loading && listHash && (\n <div className=\"validation-summary mt-3 p-3 border rounded bg-light\">\n <div>\n <span className=\"text-success\">\n <strong>{validatedList.length}</strong> valid\n </span>\n {validationError.length > 0 && (\n <div className=\"text-danger mt-1\">\n <strong>{validationError.length}</strong> not found\n </div>\n )}\n </div>\n {validationError.length > 0 && (\n <details className=\"mt-2\">\n <summary style={{cursor: 'pointer'}}>Show unrecognized IDs</summary>\n <pre className=\"small mt-2 mb-0\" style={{maxHeight: 150, overflow: 'auto'}}>\n {validationError.join('\\n')}\n </pre>\n </details>\n )}\n </div>\n )}\n\n {/* Input for saving validated gene list */}\n {!loading && validatedList.length > 0 && (\n <div className=\"save-list mt-4\">\n <Form.Group controlId=\"listName\">\n <Form.Label>Save Validated Gene List</Form.Label>\n <Form.Control\n type=\"text\"\n value={listName}\n onChange={(e) => setListName(e.target.value)}\n placeholder=\"Enter list name\"\n />\n <Form.Check\n type='switch'\n id='listIsPublic'\n label='Public'\n onChange={(e) => setListIsPublic(!listIsPublic)}\n />\n </Form.Group>\n {user ?\n <Button variant=\"primary\" onClick={handleSaveList}>\n Save Gene List\n </Button>\n : <Button variant=\"secondary\" disabled>Login Required</Button> }\n </div>\n )}\n </div>\n );\n};\n\nconst UserGeneListsComponent = props => {\n const [refreshKey, setRefreshKey] = useState(0);\n const handleListSaved = () => setRefreshKey(k => k + 1);\n const firebaseConfig = props.configuration && props.configuration.firebaseConfig;\n const auth = useMemo(() => {\n const app = getFirebaseApp(firebaseConfig);\n return app ? getAuth(app) : null;\n }, [firebaseConfig]);\n if (!auth) {\n return (\n <Alert variant=\"info\">\n User gene lists are not available on this site.\n </Alert>\n );\n }\n return (\n <Container fluid>\n <Row>\n <Col><GeneListComponent api={props.configuration.grameneData} site={props.configuration.id} auth={auth} onListSaved={handleListSaved}/></Col>\n <Col><GeneListDisplayComponent api={props.configuration.grameneData} site={props.configuration.id} auth={auth} addFilter={props.doAcceptGrameneSuggestion} refreshKey={refreshKey}/></Col>\n </Row>\n </Container>\n )\n}\n\nexport default connect(\n 'selectConfiguration',\n 'doAcceptGrameneSuggestion',\n UserGeneListsComponent\n);\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport FieldTree from './FieldTree';\nimport Preview from './Preview';\nimport ExportFooter from './ExportFooter';\nimport './styles.css';\n\nconst MIN_LEFT_PCT = 15;\nconst MAX_LEFT_PCT = 85;\n\nconst ExporterViewCmp = props => {\n const {\n fieldCatalog: catalog,\n grameneFieldCatalogIsLoading: isLoading,\n grameneFieldCatalogRaw: raw,\n grameneFieldCatalogShouldUpdate: shouldUpdate,\n doFetchGrameneFieldCatalog\n } = props;\n const [fieldQuery, setFieldQuery] = useState('');\n const [leftPct, setLeftPct] = useState(50);\n const [dragging, setDragging] = useState(false);\n const containerRef = useRef(null);\n\n useEffect(() => {\n if (shouldUpdate) doFetchGrameneFieldCatalog();\n }, [shouldUpdate, doFetchGrameneFieldCatalog]);\n\n const onPointerMove = useCallback((e) => {\n const el = containerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const pct = ((e.clientX - rect.left) / rect.width) * 100;\n if (!Number.isFinite(pct)) return;\n setLeftPct(Math.max(MIN_LEFT_PCT, Math.min(MAX_LEFT_PCT, pct)));\n }, []);\n\n useEffect(() => {\n if (!dragging) return;\n const onUp = () => setDragging(false);\n window.addEventListener('pointermove', onPointerMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n const prev = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n return () => {\n window.removeEventListener('pointermove', onPointerMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n document.body.style.userSelect = prev;\n };\n }, [dragging, onPointerMove]);\n\n if (!catalog || !catalog.groups) {\n const msg = isLoading ? 'Loading…' : (raw && raw.error) ? `error: ${String(raw.error)}` : 'init';\n return (\n <div className=\"exporter-view\">\n <em style={{padding: '1rem'}}>Loading field catalog… ({msg})</em>\n </div>\n );\n }\n\n const gridStyle = {\n gridTemplateColumns: `${leftPct}% 8px ${100 - leftPct}%`\n };\n\n return (\n <div className=\"exporter-view\" ref={containerRef} style={gridStyle}>\n <div className=\"exporter-pane\">\n <div className=\"exporter-pane-header exporter-pane-header-row\">\n <b>Available fields</b>\n <small style={{color: '#888', marginLeft: '0.5rem'}}>\n {Object.keys(catalog.fields).length} total\n </small>\n <input\n type=\"search\"\n className=\"form-control exporter-field-search exporter-field-search-inline\"\n placeholder=\"Search fields…\"\n value={fieldQuery}\n onChange={e => setFieldQuery(e.target.value)}\n />\n </div>\n <div className=\"exporter-pane-body\">\n <FieldTree query={fieldQuery}/>\n </div>\n </div>\n\n <div\n className={'exporter-divider' + (dragging ? ' dragging' : '')}\n onPointerDown={e => { e.preventDefault(); setDragging(true); }}\n onDoubleClick={() => setLeftPct(50)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n title=\"Drag to resize · double-click to reset\"\n />\n\n <div className=\"exporter-pane exporter-right-pane\">\n <div className=\"exporter-right-split\">\n <div className=\"exporter-preview-section\">\n <Preview/>\n </div>\n <ExportFooter/>\n </div>\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectGrameneFieldCatalogIsLoading',\n 'selectGrameneFieldCatalogRaw',\n 'selectGrameneFieldCatalogShouldUpdate',\n 'doFetchGrameneFieldCatalog',\n ExporterViewCmp\n);\n","import React, { useState, useMemo } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { BsChevronDown, BsChevronRight } from 'react-icons/bs';\n\nconst MAX_VISIBLE_PER_GROUP = 200;\n\nfunction collectFieldNames(group) {\n const names = [...(group.fields || [])];\n for (const s of group.subgroups || []) names.push(...collectFieldNames(s));\n return names;\n}\n\nfunction collectMatchingFieldNames(group) {\n const names = [...(group.matchingFields || [])];\n for (const s of group.subgroups || []) names.push(...collectMatchingFieldNames(s));\n return names;\n}\n\nfunction filterGroup(group, q, catalog) {\n const matchingFields = (group.fields || []).filter(name => {\n if (!q) return true;\n const f = catalog.fields[name];\n return name.toLowerCase().includes(q) || (f && f.label.toLowerCase().includes(q));\n });\n const groupLabelMatches = q && group.label && group.label.toLowerCase().includes(q);\n const subgroups = (group.subgroups || [])\n .map(s => filterGroup(s, groupLabelMatches ? '' : q, catalog))\n .filter(s => s);\n if (!q) return { ...group, matchingFields, subgroups };\n if (groupLabelMatches) {\n return {\n ...group,\n matchingFields: group.fields || [],\n subgroups: (group.subgroups || []).map(s => filterGroup(s, '', catalog))\n };\n }\n if (matchingFields.length === 0 && subgroups.length === 0) return null;\n return { ...group, matchingFields, subgroups };\n}\n\nconst FieldRow = ({ name, catalog, selectedSet, onToggle }) => {\n const f = catalog.fields[name];\n if (!f) return null;\n const linked = f.linkedFields;\n const checked = linked\n ? linked.every(n => selectedSet.has(n))\n : selectedSet.has(name);\n return (\n <li>\n <label title={name + (f.description ? '\\n' + f.description : '')}>\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={() => onToggle(name)}\n />\n <span className=\"exporter-field-label\">{f.label}</span>\n {f.multiValued && <span className=\"exporter-field-badge\">[]</span>}\n </label>\n </li>\n );\n};\n\nconst GroupNode = ({ group, depth, catalog, selectedSet, onToggle, onBulkSet, openMap, setOpen, forceOpen }) => {\n const matchingNames = collectMatchingFieldNames(group);\n const total = matchingNames.length;\n const isAllLinkedSelected = (name) => {\n const f = catalog.fields[name];\n const linked = f && f.linkedFields;\n if (linked) return linked.every(n => selectedSet.has(n));\n return selectedSet.has(name);\n };\n const selectedCount = matchingNames.reduce((n, name) => n + (isAllLinkedSelected(name) ? 1 : 0), 0);\n const allSelected = total > 0 && selectedCount === total;\n const noneSelected = selectedCount === 0;\n const isOpen = forceOpen || openMap[group.id] || false;\n const visible = (group.matchingFields || []).slice(0, MAX_VISIBLE_PER_GROUP);\n const truncated = (group.matchingFields || []).length - visible.length;\n\n const expandLinked = (names) => {\n const out = [];\n for (const n of names) {\n const f = catalog.fields[n];\n if (f && f.linkedFields) out.push(...f.linkedFields);\n else out.push(n);\n }\n return out;\n };\n\n const handleBulk = (e, selected) => {\n e.stopPropagation();\n if (matchingNames.length === 0) return;\n onBulkSet(expandLinked(matchingNames), selected);\n };\n\n return (\n <div className=\"exporter-group\" style={{ marginLeft: depth > 0 ? '0.75rem' : 0 }}>\n <div className=\"exporter-group-header\" onClick={() => setOpen(group.id, !isOpen)}>\n <span className=\"exporter-group-chevron\">\n {isOpen ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n <b>{group.label}</b>\n <span className=\"exporter-group-actions\">\n <button\n type=\"button\"\n className=\"exporter-group-action\"\n disabled={allSelected || total === 0}\n onClick={e => handleBulk(e, true)}\n title=\"Select all fields in this group\"\n >All</button>\n <button\n type=\"button\"\n className=\"exporter-group-action\"\n disabled={noneSelected}\n onClick={e => handleBulk(e, false)}\n title=\"Deselect all fields in this group\"\n >None</button>\n </span>\n <span className=\"exporter-group-count\">{selectedCount}/{total}</span>\n </div>\n {isOpen && (\n <>\n {(group.subgroups || []).map(sub => (\n <GroupNode\n key={sub.id}\n group={sub}\n depth={depth + 1}\n catalog={catalog}\n selectedSet={selectedSet}\n onToggle={onToggle}\n onBulkSet={onBulkSet}\n openMap={openMap}\n setOpen={setOpen}\n forceOpen={forceOpen}\n />\n ))}\n {visible.length > 0 && (\n <ul className=\"exporter-group-fields\">\n {visible.map(name => (\n <FieldRow\n key={name}\n name={name}\n catalog={catalog}\n selectedSet={selectedSet}\n onToggle={onToggle}\n />\n ))}\n {truncated > 0 && (\n <li className=\"exporter-group-truncated\">\n <em>… {truncated} more. Refine search to see.</em>\n </li>\n )}\n </ul>\n )}\n </>\n )}\n </div>\n );\n};\n\nconst FieldTreeCmp = props => {\n const { fieldCatalog: catalog, exporterSelectedFields, doToggleExporterField, doBulkSetExporterFields, query = '' } = props;\n const [openMap, setOpenMap] = useState({});\n\n const selectedSet = useMemo(() => new Set(exporterSelectedFields), [exporterSelectedFields]);\n\n const handleToggle = (name) => {\n const f = catalog && catalog.fields && catalog.fields[name];\n const linked = f && f.linkedFields;\n if (linked) {\n const allSelected = linked.every(n => selectedSet.has(n));\n doBulkSetExporterFields(linked, !allSelected);\n } else {\n doToggleExporterField(name);\n }\n };\n\n const q = query.trim().toLowerCase();\n\n const filtered = useMemo(() => {\n if (!catalog || !catalog.groups) return [];\n return catalog.groups\n .map(g => filterGroup(g, q, catalog))\n .filter(g => g && ((g.matchingFields && g.matchingFields.length) || (g.subgroups && g.subgroups.length)));\n }, [catalog, q]);\n\n if (!catalog || !catalog.groups) {\n return <div className=\"exporter-panel-empty\">Loading field catalog…</div>;\n }\n\n const setOpen = (id, val) => setOpenMap(s => ({ ...s, [id]: val }));\n const forceOpen = !!q;\n\n return (\n <div className=\"exporter-field-tree\">\n <div className=\"exporter-field-tree-body\">\n {filtered.map(group => (\n <GroupNode\n key={group.id}\n group={group}\n depth={0}\n catalog={catalog}\n selectedSet={selectedSet}\n onToggle={handleToggle}\n onBulkSet={doBulkSetExporterFields}\n openMap={openMap}\n setOpen={setOpen}\n forceOpen={forceOpen}\n />\n ))}\n {filtered.length === 0 && (\n <div className=\"exporter-panel-empty\">No fields match \"{query}\".</div>\n )}\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectExporterSelectedFields',\n 'doToggleExporterField',\n 'doBulkSetExporterFields',\n FieldTreeCmp\n);\n","import React, { useEffect, useMemo, useState, useRef } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { BsArrowLeftShort, BsArrowRightShort, BsSliders } from 'react-icons/bs';\nimport { buildTableData, toJSON } from './formatters';\nimport { ANCESTOR_FIELD_MAP, collectAncestorIds } from './ancestorsResolver';\nimport CutoffsModal from './CutoffsModal';\n\nconst PreviewCmp = props => {\n const {\n fieldCatalog: catalog,\n exporterSelectedFields: fields,\n exporterFormat: format,\n exporterPreview: preview,\n expressionStudies,\n expressionSamples,\n grameneTaxonomy,\n gramenePathways,\n ontologies,\n exporterCutoffs,\n doSetExporterFormat,\n doReorderExporterFields,\n doClearExporterFields,\n doSetExporterCutoffs,\n doEnsureOntologyRecords,\n doRequestGramenePathways\n } = props;\n\n const [showCutoffs, setShowCutoffs] = useState(false);\n const docs = preview.data || [];\n\n const ancestorFieldsSelected = useMemo(\n () => fields.filter(n => ANCESTOR_FIELD_MAP[n]),\n [fields]\n );\n\n useEffect(() => {\n if (ancestorFieldsSelected.length === 0 || docs.length === 0) return;\n const idsByOnt = collectAncestorIds(docs, ancestorFieldsSelected);\n for (const [ontKey, ids] of Object.entries(idsByOnt)) {\n if (!ids.length) continue;\n if (ontKey === 'taxonomy') continue; // already cached globally\n if (ontKey === 'pathways') {\n if (doRequestGramenePathways) doRequestGramenePathways(ids);\n continue;\n }\n if (doEnsureOntologyRecords) doEnsureOntologyRecords(ontKey, ids);\n }\n }, [docs, ancestorFieldsSelected, doEnsureOntologyRecords, doRequestGramenePathways]);\n\n if (fields.length === 0) {\n return (\n <div className=\"exporter-preview-empty\">\n <em>Select at least one field to preview.</em>\n </div>\n );\n }\n\n const renderStatus = () => {\n if (preview.status === 'loading') return <small className=\"exporter-preview-status\">Loading…</small>;\n if (preview.status === 'error') return <small className=\"exporter-preview-status error\">Error: {preview.error}</small>;\n if (preview.status === 'stale') return <small className=\"exporter-preview-status\">Refreshing…</small>;\n if (preview.status === 'idle') return <small className=\"exporter-preview-status\">Idle</small>;\n return null;\n };\n\n const resolverCtx = {\n expressionStudies,\n expressionSamples,\n taxonomy: grameneTaxonomy,\n pathways: gramenePathways,\n ontologies,\n cutoffs: exporterCutoffs\n };\n\n const moveField = (name, delta) => {\n const idx = fields.indexOf(name);\n if (idx === -1) return;\n const target = idx + delta;\n if (target < 0 || target >= fields.length) return;\n const next = [...fields];\n [next[idx], next[target]] = [next[target], next[idx]];\n doReorderExporterFields(next);\n };\n\n return (\n <div className=\"exporter-preview\">\n <div className=\"exporter-preview-toolbar\">\n <span className=\"exporter-preview-title\"><b>Preview</b> (first 20 genes)</span>\n <span className=\"exporter-preview-fields-count\">\n {fields.length} field{fields.length === 1 ? '' : 's'}\n {fields.length > 0 && (\n <button\n className=\"btn btn-sm btn-link exporter-clear-btn\"\n onClick={doClearExporterFields}\n >clear</button>\n )}\n </span>\n <span className=\"exporter-preview-format\">\n <label>\n <input\n type=\"radio\"\n name=\"exporter-format\"\n value=\"tsv\"\n checked={format === 'tsv'}\n onChange={() => doSetExporterFormat('tsv')}\n /> TSV\n </label>\n <label>\n <input\n type=\"radio\"\n name=\"exporter-format\"\n value=\"json\"\n checked={format === 'json'}\n onChange={() => doSetExporterFormat('json')}\n /> JSON\n </label>\n </span>\n <button\n type=\"button\"\n className=\"btn btn-sm btn-light exporter-cutoffs-btn\"\n onClick={() => setShowCutoffs(true)}\n title=\"Expression cutoffs\"\n >\n <BsSliders/> Cutoffs\n </button>\n {renderStatus()}\n </div>\n {showCutoffs && (\n <CutoffsModal\n cutoffs={exporterCutoffs}\n onApply={doSetExporterCutoffs}\n onClose={() => setShowCutoffs(false)}\n />\n )}\n <div className=\"exporter-preview-body\">\n {format === 'tsv' ? (\n <TSVTable\n docs={docs}\n fields={fields}\n catalog={catalog}\n resolverCtx={resolverCtx}\n onMoveField={moveField}\n />\n ) : (\n <pre className=\"exporter-preview-json\">{toJSON(docs, fields, resolverCtx)}</pre>\n )}\n </div>\n </div>\n );\n};\n\nconst MIN_COL_WIDTH = 40;\n\nconst TSVTable = ({ docs, fields, catalog, resolverCtx, onMoveField }) => {\n const { header, headerKeys, rows } = buildTableData(docs, fields, catalog, resolverCtx);\n const reorderableCount = fields.length;\n const [colWidths, setColWidths] = useState({});\n const thRefs = useRef({});\n\n const startResize = (key) => (e) => {\n e.preventDefault();\n e.stopPropagation();\n const th = thRefs.current[key];\n const startWidth = (th && th.getBoundingClientRect().width) || 100;\n const startX = e.clientX;\n const onMove = (ev) => {\n const delta = ev.clientX - startX;\n const next = Math.max(MIN_COL_WIDTH, startWidth + delta);\n setColWidths(prev => ({ ...prev, [key]: next }));\n };\n const onUp = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n document.body.style.userSelect = '';\n };\n document.body.style.userSelect = 'none';\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n };\n\n return (\n <div className=\"exporter-preview-tsv-scroll\">\n <table className=\"exporter-preview-tsv\">\n <thead>\n <tr>\n {header.map((h, i) => {\n const key = headerKeys[i];\n const fieldIdx = fields.indexOf(key);\n const reorderable = fieldIdx !== -1;\n const w = colWidths[key];\n const thStyle = w ? { width: `${w}px`, maxWidth: `${w}px`, minWidth: `${w}px` } : undefined;\n return (\n <th key={key} title={key} style={thStyle} ref={el => { thRefs.current[key] = el; }}>\n <div className=\"exporter-preview-th-inner\">\n <button\n type=\"button\"\n className=\"exporter-preview-reorder-btn\"\n disabled={!reorderable || fieldIdx === 0}\n onClick={() => onMoveField(key, -1)}\n title=\"Move left\"\n ><BsArrowLeftShort/></button>\n <span className=\"exporter-preview-th-label\">{h}</span>\n <button\n type=\"button\"\n className=\"exporter-preview-reorder-btn\"\n disabled={!reorderable || fieldIdx === reorderableCount - 1}\n onClick={() => onMoveField(key, 1)}\n title=\"Move right\"\n ><BsArrowRightShort/></button>\n </div>\n <span\n className=\"exporter-preview-col-resizer\"\n onPointerDown={startResize(key)}\n onDoubleClick={() => setColWidths(prev => { const n = { ...prev }; delete n[key]; return n; })}\n title=\"Drag to resize · double-click to reset\"\n />\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, r) => (\n <tr key={r}>\n {row.map((c, i) => {\n const key = headerKeys[i];\n const w = colWidths[key];\n const tdStyle = w ? { width: `${w}px`, maxWidth: `${w}px`, minWidth: `${w}px` } : undefined;\n return (\n <td key={key} title={c} style={tdStyle}>{c}</td>\n );\n })}\n </tr>\n ))}\n {rows.length === 0 && (\n <tr>\n <td colSpan={header.length} className=\"exporter-preview-empty-row\">\n <em>No rows.</em>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectExporterSelectedFields',\n 'selectExporterFormat',\n 'selectExporterPreview',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'selectGrameneTaxonomy',\n 'selectGramenePathways',\n 'selectOntologies',\n 'selectExporterCutoffs',\n 'doSetExporterFormat',\n 'doReorderExporterFields',\n 'doClearExporterFields',\n 'doSetExporterCutoffs',\n 'doEnsureOntologyRecords',\n 'doRequestGramenePathways',\n PreviewCmp\n);\n","import React, { useState, useEffect } from 'react';\n\nconst parseNumberOrNull = (v) => {\n if (v === '' || v === null || v === undefined) return null;\n const n = +v;\n return Number.isFinite(n) ? n : null;\n};\n\nconst CutoffsModal = ({ cutoffs, onApply, onClose }) => {\n const [exprMinTPM, setExprMinTPM] = useState(\n cutoffs && cutoffs.exprMinTPM != null ? String(cutoffs.exprMinTPM) : ''\n );\n const [diffMaxPval, setDiffMaxPval] = useState(\n cutoffs && cutoffs.diffMaxPval != null ? String(cutoffs.diffMaxPval) : ''\n );\n\n useEffect(() => {\n const onKey = (e) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n const apply = () => {\n onApply({\n exprMinTPM: parseNumberOrNull(exprMinTPM),\n diffMaxPval: parseNumberOrNull(diffMaxPval)\n });\n onClose();\n };\n\n return (\n <div className=\"exporter-modal-backdrop\" onClick={onClose}>\n <div className=\"exporter-modal\" onClick={e => e.stopPropagation()} role=\"dialog\" aria-modal=\"true\">\n <div className=\"exporter-modal-header\">\n <b>Expression cutoffs</b>\n <button type=\"button\" className=\"exporter-modal-close\" onClick={onClose} aria-label=\"Close\">×</button>\n </div>\n <div className=\"exporter-modal-body\">\n <div className=\"exporter-modal-field\">\n <label>\n Minimum TPM (gene expression)\n <input\n type=\"number\"\n step=\"0.1\"\n min=\"0\"\n value={exprMinTPM}\n onChange={e => setExprMinTPM(e.target.value)}\n placeholder=\"no minimum\"\n />\n </label>\n <small>Exclude expression rows with TPM below this value. Blank disables the cutoff.</small>\n </div>\n <div className=\"exporter-modal-field\">\n <label>\n Maximum p-value (differential expression)\n <input\n type=\"number\"\n step=\"0.001\"\n min=\"0\"\n max=\"1\"\n value={diffMaxPval}\n onChange={e => setDiffMaxPval(e.target.value)}\n placeholder=\"no maximum\"\n />\n </label>\n <small>Exclude diff-expression contrasts with p-value above this. Blank disables the cutoff.</small>\n </div>\n </div>\n <div className=\"exporter-modal-footer\">\n <button type=\"button\" className=\"btn btn-sm btn-link\" onClick={onClose}>Cancel</button>\n <button type=\"button\" className=\"btn btn-sm btn-primary\" onClick={apply}>Apply</button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default CutoffsModal;\n","import React from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Modal, Button, ProgressBar } from 'react-bootstrap';\n\nconst ExportFooterCmp = props => {\n const {\n exporterSelectedFields,\n exporterFormat,\n exporterDownload: dl,\n doStartExporterDownload,\n doCancelExporterDownload,\n doResetExporterDownload\n } = props;\n\n const inFlight = dl.status === 'preparing' || dl.status === 'downloading';\n const pct = dl.total > 0\n ? Math.min(100, Math.round((dl.progress / dl.total) * 100))\n : 0;\n\n const canStart = !inFlight && exporterSelectedFields.length > 0;\n\n return (\n <>\n <div className=\"exporter-footer\">\n <div className=\"exporter-footer-summary\">\n <small>\n {exporterSelectedFields.length} field{exporterSelectedFields.length === 1 ? '' : 's'} selected\n · format: <b>{exporterFormat.toUpperCase()}</b>\n </small>\n </div>\n <Button\n variant=\"primary\"\n size=\"sm\"\n disabled={!canStart}\n onClick={doStartExporterDownload}\n >\n Download {exporterFormat.toUpperCase()}\n </Button>\n </div>\n\n <Modal show={dl.status !== 'idle'} onHide={doResetExporterDownload} centered backdrop=\"static\">\n <Modal.Header closeButton={!inFlight}>\n <Modal.Title>\n {dl.status === 'preparing' && 'Preparing export…'}\n {dl.status === 'downloading' && 'Exporting…'}\n {dl.status === 'done' && 'Export complete'}\n {dl.status === 'cancelled' && 'Export cancelled'}\n {dl.status === 'error' && 'Export failed'}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n {inFlight && (\n <>\n <ProgressBar\n now={pct}\n label={dl.total > 0 ? `${dl.progress.toLocaleString()} / ${dl.total.toLocaleString()}` : 'Counting…'}\n striped\n animated\n />\n <div style={{ marginTop: '0.5rem', fontSize: '0.85rem', color: '#666' }}>\n Fetching genes in pages of 1000. This may take a while for large result sets.\n </div>\n </>\n )}\n {dl.status === 'done' && (\n <div>\n Wrote <b>{dl.progress.toLocaleString()}</b> genes to disk.\n </div>\n )}\n {dl.status === 'cancelled' && (\n <div>\n Stopped at <b>{dl.progress.toLocaleString()}</b> / {dl.total.toLocaleString()} genes. No file was saved.\n </div>\n )}\n {dl.status === 'error' && (\n <div className=\"text-danger\">{dl.error}</div>\n )}\n </Modal.Body>\n <Modal.Footer>\n {inFlight ? (\n <Button variant=\"outline-secondary\" size=\"sm\" onClick={doCancelExporterDownload}>\n Cancel\n </Button>\n ) : (\n <Button variant=\"secondary\" size=\"sm\" onClick={doResetExporterDownload}>\n Close\n </Button>\n )}\n </Modal.Footer>\n </Modal>\n </>\n );\n};\n\nexport default connect(\n 'selectExporterSelectedFields',\n 'selectExporterFormat',\n 'selectExporterDownload',\n 'doStartExporterDownload',\n 'doCancelExporterDownload',\n 'doResetExporterDownload',\n ExportFooterCmp\n);\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Tabs, Tab, Button, ToggleButton, ToggleButtonGroup } from 'react-bootstrap';\nimport FieldsModal from './FieldsModal';\nimport ExprTable, { buildFieldInfo } from './ExprTable';\nimport ParallelCoordsPlot from './ParallelCoordsPlot';\nimport HeatmapPlot from './HeatmapPlot';\nimport './styles.css';\n\nfunction speciesTaxonId(tid) {\n const n = +tid;\n return n > 1000000 ? Math.floor(n / 1000) : n;\n}\n\nfunction genomeName(grameneMaps, tid) {\n if (!grameneMaps) return tid;\n const direct = grameneMaps[tid];\n if (direct && direct.display_name) return direct.display_name;\n const sp = grameneMaps[speciesTaxonId(tid)];\n if (sp && sp.display_name) return sp.display_name;\n return tid;\n}\n\nconst ExprVizViewCmp = props => {\n const {\n exprVizPivot: pivot,\n exprViz,\n exprVizActiveTaxon: activeTaxon,\n grameneMaps,\n expressionStudies,\n expressionSamples,\n doSetExprVizActiveTaxon,\n doToggleExprVizFieldsModal,\n doFetchExprVizData\n } = props;\n\n const studiesFor = tid => {\n if (!expressionStudies) return [];\n return expressionStudies[tid] || expressionStudies[speciesTaxonId(tid)] || [];\n };\n\n const taxa = useMemo(() => {\n const ids = Object.keys(pivot.data || {});\n if (!grameneMaps) return ids;\n return ids.sort((a, b) => {\n const ma = grameneMaps[a] || grameneMaps[speciesTaxonId(a)];\n const mb = grameneMaps[b] || grameneMaps[speciesTaxonId(b)];\n return ((ma && ma.left_index) || 0) - ((mb && mb.left_index) || 0);\n });\n }, [pivot.data, grameneMaps]);\n\n useEffect(() => {\n if (taxa.length === 0) return;\n if (!activeTaxon || !taxa.includes(String(activeTaxon))) {\n doSetExprVizActiveTaxon(taxa[0]);\n }\n }, [taxa, activeTaxon, doSetExprVizActiveTaxon]);\n\n if (pivot.status === 'loading') {\n return <div className=\"exprviz-view\"><em>Loading studies…</em></div>;\n }\n if (pivot.status === 'error') {\n return <div className=\"exprviz-view\"><em>Error: {pivot.error}</em></div>;\n }\n if (taxa.length === 0) {\n return <div className=\"exprviz-view\"><em>No expression studies for current results.</em></div>;\n }\n\n return (\n <div className=\"exprviz-view\">\n <Tabs\n activeKey={activeTaxon || taxa[0]}\n onSelect={k => doSetExprVizActiveTaxon(k)}\n className=\"exprviz-tabs\"\n >\n {taxa.map(tid => {\n const studies = studiesFor(tid);\n const taxName = genomeName(grameneMaps, tid);\n const geneCount = pivot.data[tid] || 0;\n return (\n <Tab\n key={tid}\n eventKey={tid}\n title={`${taxName} (${studies.length} studies · ${geneCount} genes)`}\n >\n <TaxonPanel\n taxon={tid}\n studies={studies}\n expressionSamples={expressionSamples}\n tabState={exprViz.byTaxon[tid]}\n onOpenFields={() => doToggleExprVizFieldsModal(tid, true)}\n onLoad={() => doFetchExprVizData(tid)}\n onReorder={(next) => props.doReorderExprVizFields(tid, next)}\n onAddRangeQuery={props.doAddGrameneRangeQuery}\n />\n </Tab>\n );\n })}\n </Tabs>\n <FieldsModal/>\n </div>\n );\n};\n\n// Compact axis labels for the parallel-coords plot. The raw Solr field name\n// (e.g. \"E_CURD_148_g5__expr\") is uninformative; we prefer the assay's\n// factor labels, falling back to \"organism part\" then to the group id.\n// `full` is exposed via an SVG <title> so the user can hover to see study,\n// group, and every factor/characteristic.\nconst AXIS_LABEL_MAX = 22;\n\nfunction truncateLabel(s, n) {\n if (!s) return '';\n return s.length > n ? s.slice(0, n - 1) + '…' : s;\n}\n\nfunction compactAssayLabel(assay, group) {\n if (!assay) return group || '';\n const factorVals = (assay.factor || []).map(f => f && f.label).filter(Boolean);\n if (factorVals.length) return factorVals.join('; ');\n const chars = assay.characteristic || [];\n const organ = chars.find(c => c && c.type === 'organism part');\n if (organ && organ.label) return organ.label;\n const firstChar = chars.find(c => c && c.label);\n if (firstChar) return firstChar.label;\n return group || '';\n}\n\nfunction assayPairs(list) {\n return (list || [])\n .filter(x => x && x.label)\n .map(x => ({ name: x.type || '', value: x.label }));\n}\n\nfunction buildAxisLabels(fields, studies, expressionSamples) {\n const labels = {};\n if (!fields) return labels;\n const studyById = {};\n (studies || []).forEach(s => { if (s && s._id) studyById[s._id] = s; });\n const findAssay = (studyId, group) => {\n const arr = expressionSamples && expressionSamples[studyId];\n return arr ? arr.find(a => a.group === group) : null;\n };\n for (const f of fields) {\n const m = f.match(/^(.+?)_g(\\d+)__expr$/);\n if (!m) {\n labels[f] = {\n short: truncateLabel(f.replace(/__expr$/, ''), AXIS_LABEL_MAX),\n structured: { studyTitle: f, group: '', factors: [], characteristics: [] }\n };\n continue;\n }\n const expId = m[1].replace(/_/g, '-');\n const group = 'g' + m[2];\n const assay = findAssay(expId, group);\n const study = studyById[expId];\n const studyName = (study && study.description) || expId;\n labels[f] = {\n short: truncateLabel(compactAssayLabel(assay, group), AXIS_LABEL_MAX),\n structured: {\n studyTitle: studyName,\n group,\n factors: assayPairs(assay && assay.factor),\n characteristics: assayPairs(assay && assay.characteristic)\n }\n };\n }\n return labels;\n}\n\nfunction rowMatchesSelections(row, selections) {\n for (const f of Object.keys(selections)) {\n const v = row[f];\n if (v == null || Array.isArray(v)) return false;\n const n = +v;\n if (!Number.isFinite(n)) return false;\n const [lo, hi] = selections[f];\n if (n < lo || n > hi) return false;\n }\n return true;\n}\n\nfunction fmt(n) {\n if (!Number.isFinite(n)) return String(n);\n const a = Math.abs(n);\n if (a !== 0 && (a < 0.001 || a >= 1e6)) return n.toExponential(3);\n return Number(n.toFixed(4)).toString();\n}\n\nfunction tsvCell(v) {\n if (v == null) return '';\n if (Array.isArray(v)) return v.join(',');\n const s = typeof v === 'object' ? JSON.stringify(v) : String(v);\n return s.replace(/[\\t\\r\\n]+/g, ' ');\n}\n\n// Mirror the on-screen table header in the TSV: one row per metadata level\n// the table is showing (Study, then one row per distinct factor type, then\n// one row per distinct characteristic type), followed by the leaf header\n// (Gene ID / Name / per-sample group). The first two columns are repurposed\n// to carry the row category and the row's specific name, matching the\n// pinned-column labels in ExprTable.\nfunction downloadTsv(filename, rows, fields, studies, expressionSamples) {\n const cols = ['id', 'name', ...fields];\n const fieldInfo = buildFieldInfo(fields, studies, expressionSamples);\n\n const factorTypes = new Set();\n const charTypes = new Set();\n for (const f of fields) {\n const info = fieldInfo[f];\n if (!info) continue;\n Object.keys(info.factors || {}).forEach(t => factorTypes.add(t));\n Object.keys(info.characteristics || {}).forEach(t => charTypes.add(t));\n }\n const factorTypeList = Array.from(factorTypes).sort();\n const charTypeList = Array.from(charTypes).sort();\n\n const metaRow = (cat, label, getValue) => {\n const cells = [cat, label];\n for (const f of fields) cells.push(tsvCell(getValue(fieldInfo[f] || {})));\n return cells.join('\\t');\n };\n\n const lines = [];\n lines.push(metaRow('Study', 'Title', info => info.studyDescription || ''));\n for (const t of factorTypeList) {\n lines.push(metaRow('Factor', t, info => (info.factors && info.factors[t]) || ''));\n }\n for (const t of charTypeList) {\n lines.push(metaRow('Characteristic', t, info => (info.characteristics && info.characteristics[t]) || ''));\n }\n // Leaf header — column ids for the data rows.\n lines.push(['Gene ID', 'Name', ...fields.map(f => {\n const info = fieldInfo[f];\n return (info && info.group) || f.replace(/__expr$/, '');\n })].join('\\t'));\n\n for (const r of rows) lines.push(cols.map(c => tsvCell(r[c])).join('\\t'));\n\n const blob = new Blob([lines.join('\\n') + '\\n'], { type: 'text/tab-separated-values' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\nconst TaxonPanel = ({ taxon, studies, expressionSamples, tabState, onOpenFields, onLoad, onReorder, onAddRangeQuery }) => {\n const selected = (tabState && tabState.selectedFields) || [];\n const rows = (tabState && tabState.rows) || [];\n const fetchInfo = (tabState && tabState.fetch) || { status: 'idle', total: 0 };\n const [scale, setScale] = useState('linear');\n const [vizMode, setVizMode] = useState('heatmap'); // 'parallel' | 'heatmap'\n const [selections, setSelections] = useState({});\n const [clearVersion, setClearVersion] = useState(0);\n const [hoveredId, setHoveredId] = useState(null);\n const [plotHeight, setPlotHeight] = useState(320);\n // Mirror of the table's currently displayed (post-sort, post-filter) rows.\n // When the user clicks a column header to sort, ag-grid resorts and emits\n // modelUpdated; we capture that order here so the heatmap below renders\n // in the same order. Null until the table has emitted at least once.\n const [tableOrder, setTableOrder] = useState(null);\n const resizeStateRef = useRef(null);\n\n // Drag the horizontal separator between the plot and the table to retune\n // their relative sizes. Bounded so neither pane disappears entirely.\n const startResize = (e) => {\n e.preventDefault();\n resizeStateRef.current = { startY: e.clientY, startHeight: plotHeight };\n const onMove = (ev) => {\n const s = resizeStateRef.current;\n if (!s) return;\n const next = Math.max(120, Math.min(1200, s.startHeight + (ev.clientY - s.startY)));\n setPlotHeight(next);\n };\n const onUp = () => {\n resizeStateRef.current = null;\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n };\n document.body.style.cursor = 'row-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n };\n\n const hasBrush = Object.keys(selections).length > 0;\n const filteredRows = useMemo(() => {\n if (!hasBrush) return rows;\n return rows.filter(r => rowMatchesSelections(r, selections));\n }, [rows, selections, hasBrush]);\n\n // Drop fields with no numeric data in the loaded rows so empty axes/columns\n // don't clutter the visualization. Selected-but-empty fields stay in the\n // underlying selection so a future load can repopulate them.\n const visibleFields = useMemo(() => {\n if (rows.length === 0 || selected.length === 0) return selected;\n return selected.filter(f => rows.some(r => {\n const v = r[f];\n return v != null && !Array.isArray(v) && Number.isFinite(+v);\n }));\n }, [rows, selected]);\n\n const handleReorder = onReorder\n ? (newVisibleOrder) => {\n const visibleSet = new Set(newVisibleOrder);\n const hidden = selected.filter(f => !visibleSet.has(f));\n onReorder([...newVisibleOrder, ...hidden]);\n }\n : undefined;\n\n const axisLabels = useMemo(\n () => buildAxisLabels(visibleFields, studies, expressionSamples),\n [visibleFields, studies, expressionSamples]\n );\n\n const fieldInfo = useMemo(\n () => buildFieldInfo(visibleFields, studies, expressionSamples),\n [visibleFields, studies, expressionSamples]\n );\n\n useEffect(() => {\n if (rows.length === 0 && hasBrush) {\n setSelections({});\n setClearVersion(v => v + 1);\n }\n }, [rows.length, hasBrush]);\n\n return (\n <div className=\"exprviz-tab-panel\">\n <div className=\"exprviz-toolbar\">\n <Button size=\"sm\" onClick={onOpenFields}>\n Select fields ({selected.length} selected, {studies.length} studies)\n </Button>\n <Button\n size=\"sm\"\n variant=\"primary\"\n disabled={selected.length === 0 || fetchInfo.status === 'loading'}\n onClick={onLoad}\n >\n {fetchInfo.status === 'loading' ? 'Loading…' : 'Load data'}\n </Button>\n <ToggleButtonGroup\n type=\"radio\"\n name={`exprviz-viz-${taxon}`}\n size=\"sm\"\n value={vizMode}\n onChange={setVizMode}\n >\n <ToggleButton id={`exprviz-viz-${taxon}-hm`} value=\"heatmap\" variant=\"outline-secondary\" title=\"Heatmap: cell color encodes expression level; hover for sample metadata\">Heatmap</ToggleButton>\n <ToggleButton id={`exprviz-viz-${taxon}-pc`} value=\"parallel\" variant=\"outline-secondary\" title=\"Parallel coordinates: one polyline per gene with brushable axes\">Parallel</ToggleButton>\n </ToggleButtonGroup>\n {vizMode === 'parallel' && (\n <>\n <ToggleButtonGroup\n type=\"radio\"\n name={`exprviz-scale-${taxon}`}\n size=\"sm\"\n value={scale}\n onChange={setScale}\n >\n <ToggleButton id={`exprviz-scale-${taxon}-lin`} value=\"linear\" variant=\"outline-secondary\">Linear</ToggleButton>\n <ToggleButton id={`exprviz-scale-${taxon}-log`} value=\"log\" variant=\"outline-secondary\">Log</ToggleButton>\n </ToggleButtonGroup>\n <Button\n size=\"sm\"\n variant=\"outline-secondary\"\n disabled={!hasBrush}\n onClick={() => { setClearVersion(v => v + 1); setSelections({}); }}\n >\n Clear brushes\n </Button>\n <Button\n size=\"sm\"\n variant=\"success\"\n disabled={!hasBrush || !onAddRangeQuery}\n onClick={() => {\n const terms = Object.keys(selections).map(field => {\n const [lo, hi] = selections[field];\n return {\n category: 'Expression',\n name: `${field}: ${fmt(lo)}–${fmt(hi)}`,\n fq_field: field,\n fq_value: `[${lo} TO ${hi}]`\n };\n });\n onAddRangeQuery(terms);\n }}\n title=\"Add brush ranges as an AND-conjunction filter on the search\"\n >\n Apply as filter\n </Button>\n </>\n )}\n <Button\n size=\"sm\"\n variant=\"outline-secondary\"\n disabled={filteredRows.length === 0 || visibleFields.length === 0}\n onClick={() => downloadTsv(`expression_${taxon}.tsv`, filteredRows, visibleFields, studies, expressionSamples)}\n title=\"Download the visible rows and columns as tab-delimited text\"\n >\n Download TSV\n </Button>\n <span className=\"exprviz-status\">\n {hasBrush ? `${filteredRows.length} of ${rows.length}` : rows.length}\n {fetchInfo.total ? ` / ${fetchInfo.total}` : ''} genes\n {hasBrush ? ' (brushed)' : ' loaded'}\n </span>\n </div>\n <div className=\"exprviz-body\">\n <div className=\"exprviz-plot\" style={{ height: plotHeight }}>\n {vizMode === 'heatmap' ? (\n <HeatmapPlot\n rows={tableOrder || filteredRows}\n fields={visibleFields}\n scale={scale}\n axisLabels={axisLabels}\n fieldInfo={fieldInfo}\n hoveredId={hoveredId}\n onHoverRow={setHoveredId}\n />\n ) : (\n <ParallelCoordsPlot\n rows={rows}\n fields={visibleFields}\n scale={scale}\n onBrushChange={setSelections}\n onReorder={handleReorder}\n clearVersion={clearVersion}\n hoveredId={hoveredId}\n axisLabels={axisLabels}\n />\n )}\n </div>\n <div\n className=\"exprviz-resizer\"\n role=\"separator\"\n aria-orientation=\"horizontal\"\n aria-label=\"Resize plot\"\n onMouseDown={startResize}\n title=\"Drag to resize\"\n />\n <div className=\"exprviz-table\">\n <ExprTable\n rows={filteredRows}\n fields={visibleFields}\n onReorder={handleReorder}\n studies={studies}\n expressionSamples={expressionSamples}\n onHoverRow={setHoveredId}\n onDisplayedOrderChange={setTableOrder}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectExprViz',\n 'selectExprVizPivot',\n 'selectExprVizActiveTaxon',\n 'selectGrameneMaps',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'doSetExprVizActiveTaxon',\n 'doToggleExprVizFieldsModal',\n 'doFetchExprVizData',\n 'doReorderExprVizFields',\n 'doAddGrameneRangeQuery',\n ExprVizViewCmp\n);\n","import React, { useState, useMemo, useEffect } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Modal, Button, ToggleButton, ToggleButtonGroup } from 'react-bootstrap';\n\nfunction speciesTaxonId(tid) {\n const n = +tid;\n return n > 1000000 ? Math.floor(n / 1000) : n;\n}\n\nconst EXPERIMENT_KEYS = [\n { key: 'exp:study', label: 'Study' },\n { key: 'exp:type', label: 'Study type' },\n { key: 'exp:organism', label: 'Organism' }\n];\n\n// One record per expression field (one sample group within one study).\n// `props` is a flat map of property-key → value used for filtering and display.\nfunction buildFieldRecords(taxon, studyIds, expressionStudies, expressionSamples, fieldCatalog, grameneMaps) {\n const records = [];\n const factorTypes = new Set();\n const charTypes = new Set();\n if (!expressionSamples || !expressionStudies) return { records, factorTypes: [], charTypes: [] };\n\n const studyById = {};\n const list = expressionStudies[taxon] || expressionStudies[speciesTaxonId(taxon)] || [];\n list.forEach(s => { studyById[s._id] = s; });\n\n for (const studyId of studyIds) {\n const study = studyById[studyId];\n if (!study) continue;\n const samples = expressionSamples[studyId];\n if (!samples) continue;\n\n const byGroup = {};\n for (const s of samples) if (!byGroup[s.group]) byGroup[s.group] = s;\n\n for (const group of Object.keys(byGroup)) {\n const sample = byGroup[group];\n const fieldName = `${studyId.replace(/-/g, '_')}_${group}__expr`;\n if (fieldCatalog && fieldCatalog.fields && !fieldCatalog.fields[fieldName]) continue;\n\n const props = {};\n props['exp:study'] = study.description || studyId;\n props['exp:type'] = study.type || '(unknown)';\n const taxon_id = study.taxon_id;\n const taxName = grameneMaps && (grameneMaps[taxon_id] || grameneMaps[speciesTaxonId(taxon_id)]);\n props['exp:organism'] = (taxName && taxName.display_name) || String(taxon_id);\n\n const usedFactorTypes = new Set();\n (sample.factor || []).forEach(f => {\n props[`fac:${f.type}`] = f.label;\n factorTypes.add(f.type);\n usedFactorTypes.add(f.type);\n });\n (sample.characteristic || []).forEach(c => {\n if (usedFactorTypes.has(c.type)) return; // factor takes precedence\n props[`char:${c.type}`] = c.label;\n charTypes.add(c.type);\n });\n\n records.push({ fieldName, studyId, group, props });\n }\n }\n return {\n records,\n factorTypes: Array.from(factorTypes).sort(),\n charTypes: Array.from(charTypes).sort()\n };\n}\n\nfunction fieldMatches(field, selections, excludeKey) {\n for (const key of Object.keys(selections)) {\n if (key === excludeKey) continue;\n const values = selections[key];\n if (!values || values.size === 0) continue;\n const v = field.props[key];\n if (v == null || !values.has(v)) return false;\n }\n return true;\n}\n\nfunction valueCounts(records, key, selections) {\n const counts = new Map();\n for (const f of records) {\n if (!fieldMatches(f, selections, key)) continue;\n const v = f.props[key];\n if (v == null) continue;\n counts.set(v, (counts.get(v) || 0) + 1);\n }\n return counts;\n}\n\nfunction labelForKey(key, tree) {\n for (const grp of tree) {\n for (const t of grp.types) if (t.key === key) return t.label;\n }\n return key;\n}\n\nconst FieldsModalCmp = props => {\n const {\n fieldCatalog,\n exprViz,\n expressionStudies,\n expressionSamples,\n grameneMaps,\n doToggleExprVizFieldsModal,\n doSetExprVizFields,\n doFetchExprVizFieldExistence\n } = props;\n\n const taxon = Object.keys(exprViz.byTaxon).find(t => exprViz.byTaxon[t].fieldsModalOpen);\n const open = !!taxon;\n const availableAttrs = taxon && exprViz.byTaxon[taxon] && exprViz.byTaxon[taxon].availableAttrs;\n\n const studyIds = useMemo(() => {\n if (!taxon || !expressionStudies) return [];\n const list = expressionStudies[taxon] || expressionStudies[speciesTaxonId(taxon)] || [];\n let ids = list.map(s => s._id);\n if (availableAttrs) {\n const allow = new Set(availableAttrs);\n ids = ids.filter(id => allow.has(id));\n }\n return ids;\n }, [taxon, expressionStudies, availableAttrs]);\n\n const allRecords = useMemo(\n () => buildFieldRecords(taxon, studyIds, expressionStudies, expressionSamples, fieldCatalog, grameneMaps),\n [taxon, studyIds, expressionStudies, expressionSamples, fieldCatalog, grameneMaps]\n );\n\n const candidateFields = useMemo(\n () => allRecords.records.map(r => r.fieldName),\n [allRecords]\n );\n\n // Trigger the field-existence facet check whenever the modal is open and\n // the candidate field list is known. The bundle caches per (q, taxon, fields).\n useEffect(() => {\n if (open && taxon && candidateFields.length > 0) {\n doFetchExprVizFieldExistence(taxon, candidateFields);\n }\n }, [open, taxon, candidateFields, doFetchExprVizFieldExistence]);\n\n const fieldExistence = taxon && exprViz.byTaxon[taxon] && exprViz.byTaxon[taxon].fieldExistence;\n const existenceStatus = taxon && exprViz.byTaxon[taxon] && exprViz.byTaxon[taxon].existenceStatus;\n\n // Once existence counts are loaded, drop fields with no data in the current\n // result set. Until then, render with the full candidate set so the modal\n // doesn't flash empty during the precheck.\n const { records, factorTypes, charTypes } = useMemo(() => {\n if (!fieldExistence) return allRecords;\n const live = new Set(Object.keys(fieldExistence).filter(f => fieldExistence[f] > 0));\n const filtered = allRecords.records.filter(r => live.has(r.fieldName));\n const factorTypes = new Set();\n const charTypes = new Set();\n for (const r of filtered) {\n for (const k of Object.keys(r.props)) {\n if (k.startsWith('fac:')) factorTypes.add(k.slice(4));\n else if (k.startsWith('char:')) charTypes.add(k.slice(5));\n }\n }\n return {\n records: filtered,\n factorTypes: Array.from(factorTypes).sort(),\n charTypes: Array.from(charTypes).sort()\n };\n }, [allRecords, fieldExistence]);\n\n const propTree = useMemo(() => [\n { group: 'experiment', label: 'Experiment', types: EXPERIMENT_KEYS },\n { group: 'factors', label: 'Factors', types: factorTypes.map(t => ({ key: `fac:${t}`, label: t })) },\n { group: 'characteristics', label: 'Characteristics', types: charTypes.map(t => ({ key: `char:${t}`, label: t })) }\n ], [factorTypes, charTypes]);\n\n const [selections, setSelections] = useState({});\n const [expandedKey, setExpandedKey] = useState(null);\n const [collapsedGroups, setCollapsedGroups] = useState({});\n const [valueSort, setValueSort] = useState('count');\n const [orderedSelectedKeys, setOrderedSelectedKeys] = useState([]);\n const [searchQuery, setSearchQuery] = useState('');\n const searchLc = searchQuery.trim().toLowerCase();\n const isSearching = searchLc.length > 0;\n\n // Distinct values per property type, ignoring the type's own selection but\n // applying every other selected type. Counts shown next to a property type\n // reflect \"how many distinct values exist among the fields currently\n // matching the rest of the filter.\"\n const valueSetByKey = useMemo(() => {\n const allKeys = new Set();\n for (const r of records) for (const k of Object.keys(r.props)) allKeys.add(k);\n const m = {};\n for (const key of allKeys) {\n const set = new Set();\n for (const r of records) {\n if (!fieldMatches(r, selections, key)) continue;\n const v = r.props[key];\n if (v != null) set.add(v);\n }\n m[key] = set;\n }\n return m;\n }, [records, selections]);\n\n // Distinct values per property type across the unfiltered candidate set.\n // A type with a single value across every record can't discriminate (e.g.\n // \"Organism\" when every field belongs to the same species), so we hide it\n // from the property tree.\n const totalValueCountByKey = useMemo(() => {\n const m = {};\n for (const r of records) {\n for (const [k, v] of Object.entries(r.props)) {\n if (v == null) continue;\n if (!m[k]) m[k] = new Set();\n m[k].add(v);\n }\n }\n return m;\n }, [records]);\n\n // Reset state when modal (re)opens for a taxon.\n useEffect(() => {\n if (open && taxon) {\n setSelections({});\n setExpandedKey(null);\n setCollapsedGroups({});\n setOrderedSelectedKeys([]);\n setSearchQuery('');\n }\n }, [open, taxon]);\n\n // Keep orderedSelectedKeys in sync with selections (preserves the order in\n // which the user first selected each property type).\n useEffect(() => {\n setOrderedSelectedKeys(prev => {\n const active = Object.keys(selections);\n const activeSet = new Set(active);\n const kept = prev.filter(k => activeSet.has(k));\n const newOnes = active.filter(k => !prev.includes(k));\n return [...kept, ...newOnes];\n });\n }, [selections]);\n\n const matchingFields = useMemo(\n () => records.filter(r => fieldMatches(r, selections, null)),\n [records, selections]\n );\n\n if (!open) return null;\n\n const toggleValue = (key, value) => {\n setSelections(prev => {\n const next = { ...prev };\n const set = new Set(next[key] || []);\n if (set.has(value)) set.delete(value); else set.add(value);\n if (set.size === 0) delete next[key]; else next[key] = set;\n return next;\n });\n };\n\n const clearTypeSelection = (key) => {\n setSelections(prev => {\n if (!prev[key]) return prev;\n const next = { ...prev };\n delete next[key];\n return next;\n });\n };\n\n const toggleGroup = (g) => setCollapsedGroups(prev => ({ ...prev, [g]: !prev[g] }));\n\n const renderValues = (key, typeLabelMatches) => {\n const counts = valueCounts(records, key, selections);\n let entries = Array.from(counts.entries());\n if (isSearching && !typeLabelMatches) {\n entries = entries.filter(([v]) => String(v).toLowerCase().includes(searchLc));\n }\n if (valueSort === 'name') entries.sort((a, b) => String(a[0]).localeCompare(String(b[0])));\n else entries.sort((a, b) => b[1] - a[1] || String(a[0]).localeCompare(String(b[0])));\n const sel = selections[key] || new Set();\n\n return (\n <div className=\"exprviz-tree-values\">\n <div className=\"exprviz-values-toolbar\">\n <ToggleButtonGroup\n type=\"radio\"\n name={`exprviz-vsort-${key}`}\n size=\"sm\"\n value={valueSort}\n onChange={setValueSort}\n >\n <ToggleButton id={`exprviz-vsort-name-${key}`} value=\"name\" variant=\"outline-secondary\">Name</ToggleButton>\n <ToggleButton id={`exprviz-vsort-count-${key}`} value=\"count\" variant=\"outline-secondary\">Count</ToggleButton>\n </ToggleButtonGroup>\n {sel.size > 0 && (\n <Button size=\"sm\" variant=\"link\" onClick={() => clearTypeSelection(key)}>clear</Button>\n )}\n </div>\n {entries.map(([v, c]) => (\n <label key={v} className=\"exprviz-tree-value\">\n <input type=\"checkbox\" checked={sel.has(v)} onChange={() => toggleValue(key, v)} />\n <span className=\"exprviz-tree-value-label\" title={v}>{v}</span>\n <span className=\"exprviz-tree-value-count\">{c}</span>\n </label>\n ))}\n {entries.length === 0 && <em className=\"exprviz-tree-empty\">No values</em>}\n </div>\n );\n };\n\n return (\n <Modal show={open} onHide={() => doToggleExprVizFieldsModal(taxon, false)} size=\"xl\" scrollable>\n <Modal.Header closeButton>\n <Modal.Title>\n Filter expression fields ({matchingFields.length} of {records.length} match)\n {existenceStatus === 'loading' && (\n <span className=\"exprviz-modal-loading\"> · checking field availability…</span>\n )}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <div className=\"exprviz-fields-layout\">\n <div className=\"exprviz-tree\">\n <input\n type=\"text\"\n className=\"exprviz-tree-search\"\n placeholder=\"Search property types and values…\"\n value={searchQuery}\n onChange={e => setSearchQuery(e.target.value)}\n />\n {propTree.map(grp => {\n const typeRows = grp.types.map(t => {\n // Hide property types that can't discriminate among the\n // candidates: zero values, or a single value shared by every\n // record. The selection-aware count (valueSetByKey) is what\n // we display; the unfiltered count gates visibility so a type\n // doesn't pop in/out as the user clicks values.\n const totalDistinct = (totalValueCountByKey[t.key] && totalValueCountByKey[t.key].size) || 0;\n if (totalDistinct < 2) return null;\n const numValues = (valueSetByKey[t.key] && valueSetByKey[t.key].size) || 0;\n if (numValues === 0) return null;\n const typeLabelMatches = isSearching && t.label.toLowerCase().includes(searchLc);\n let matchingValueCount = numValues;\n if (isSearching && !typeLabelMatches) {\n const vset = valueSetByKey[t.key] || new Set();\n matchingValueCount = 0;\n for (const v of vset) if (String(v).toLowerCase().includes(searchLc)) matchingValueCount++;\n if (matchingValueCount === 0) return null;\n }\n const sel = selections[t.key];\n const selCount = sel ? sel.size : 0;\n const isExpanded = isSearching ? !typeLabelMatches : (expandedKey === t.key);\n return (\n <div key={t.key} className={`exprviz-tree-type${selCount > 0 ? ' is-active' : ''}`}>\n <div\n className=\"exprviz-tree-type-header\"\n onClick={() => setExpandedKey(isExpanded ? null : t.key)}\n >\n <span className=\"exprviz-tree-caret\">{isExpanded ? '▾' : '▸'}</span>\n <span className=\"exprviz-tree-type-label\">{t.label}</span>\n <span className=\"exprviz-tree-type-count\">\n {selCount > 0 ? `${selCount}/${numValues}` : numValues}\n </span>\n </div>\n {isExpanded && renderValues(t.key, typeLabelMatches)}\n </div>\n );\n }).filter(Boolean);\n if (isSearching && typeRows.length === 0) return null;\n const groupCollapsed = !isSearching && collapsedGroups[grp.group];\n return (\n <div key={grp.group} className=\"exprviz-tree-group\">\n <div className=\"exprviz-tree-group-header\" onClick={() => toggleGroup(grp.group)}>\n <span className=\"exprviz-tree-caret\">{groupCollapsed ? '▶' : '▼'}</span>\n <strong>{grp.label}</strong>\n </div>\n {!groupCollapsed && grp.types.length === 0 && (\n <div className=\"exprviz-tree-empty\"><em>(none)</em></div>\n )}\n {!groupCollapsed && typeRows}\n </div>\n );\n })}\n </div>\n <div className=\"exprviz-fields-preview\">\n {orderedSelectedKeys.length === 0 ? (\n <div className=\"exprviz-fields-placeholder\">\n <em>Select a property type to preview the property values for each matching field.</em>\n </div>\n ) : (\n <table className=\"exprviz-fields-table\">\n <thead>\n <tr>\n {orderedSelectedKeys.map(k => <th key={k}>{labelForKey(k, propTree)}</th>)}\n </tr>\n </thead>\n <tbody>\n {matchingFields.map(f => (\n <tr key={f.fieldName} title={f.fieldName}>\n {orderedSelectedKeys.map(k => <td key={k}>{f.props[k] || ''}</td>)}\n </tr>\n ))}\n {matchingFields.length === 0 && (\n <tr><td colSpan={orderedSelectedKeys.length}><em>No matching fields</em></td></tr>\n )}\n </tbody>\n </table>\n )}\n </div>\n </div>\n </Modal.Body>\n <Modal.Footer>\n <Button variant=\"secondary\" onClick={() => doToggleExprVizFieldsModal(taxon, false)}>\n Cancel\n </Button>\n <Button\n variant=\"primary\"\n disabled={matchingFields.length === 0}\n onClick={() => {\n doSetExprVizFields(taxon, matchingFields.map(f => f.fieldName));\n doToggleExprVizFieldsModal(taxon, false);\n }}\n >\n Apply ({matchingFields.length} fields)\n </Button>\n </Modal.Footer>\n </Modal>\n );\n};\n\nexport default connect(\n 'selectFieldCatalog',\n 'selectExprViz',\n 'selectExpressionStudies',\n 'selectExpressionSamples',\n 'selectGrameneMaps',\n 'doToggleExprVizFieldsModal',\n 'doSetExprVizFields',\n 'doFetchExprVizFieldExistence',\n FieldsModalCmp\n);\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { AgGridReact } from 'ag-grid-react';\nimport 'ag-grid-community/styles/ag-grid.css';\nimport 'ag-grid-community/styles/ag-theme-quartz.css';\n\nconst baseColDefs = [\n { field: 'id', headerName: 'Gene ID', pinned: 'left', width: 160, suppressMovable: true },\n { field: 'name', headerName: 'Name', pinned: 'left', width: 140, suppressMovable: true }\n];\n\n// Hoisted so the reference is stable across renders. ag-grid otherwise sees a\n// \"new\" defaultColDef on every parent re-render (e.g. when hovering a row\n// triggers setHoveredId in the parent) and re-applies column state, which\n// snaps any user-resized columns back to their original widths.\nconst DEFAULT_COL_DEF = {\n resizable: true,\n sortable: true,\n filter: false,\n suppressMenu: true,\n // Click cycle: input order → descending → ascending → input order. The\n // ag-grid default is asc → desc → null; for expression data the\n // top-of-column user usually wants is \"highest first,\" so we hit that on\n // the first click.\n sortingOrder: ['desc', 'asc', null]\n};\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\nexport function buildFieldInfo(fields, studies, expressionSamples) {\n const info = {};\n if (!fields || !studies || !expressionSamples) return info;\n const wanted = new Set(fields);\n for (const study of studies) {\n const studyId = study._id;\n const samples = expressionSamples[studyId];\n if (!samples) continue;\n const byGroup = {};\n for (const s of samples) if (!byGroup[s.group]) byGroup[s.group] = s;\n for (const group of Object.keys(byGroup)) {\n const fieldName = `${studyId.replace(/-/g, '_')}_${group}__expr`;\n if (!wanted.has(fieldName)) continue;\n const sample = byGroup[group];\n const factors = {};\n (sample.factor || []).forEach(f => { factors[f.type] = f.label; });\n const characteristics = {};\n (sample.characteristic || []).forEach(c => {\n if (factors[c.type] != null) return;\n characteristics[c.type] = c.label;\n });\n info[fieldName] = {\n studyId,\n studyDescription: study.description || studyId,\n group,\n replicates: samples.filter(s => s.group === group).length,\n factors,\n characteristics\n };\n }\n }\n return info;\n}\n\n// Plain right-aligned label cell for the metadata header rows above the\n// Gene ID / Name columns. Rendered as a React component (instead of\n// relying on ag-grid's default group label) so the alignment is controlled\n// by our own DOM and isn't fighting the quartz theme's CSS.\nconst LabelHeaderGroup = (props) => {\n const { displayName } = props;\n return <div className=\"exprviz-label-header\">{displayName}</div>;\n};\n\n// Same idea, but for the cells that toggle a section between expanded and\n// collapsed. The caret + label sit at the right edge.\nconst ToggleHeaderGroup = (props) => {\n const { displayName, onToggle, expanded, suffix } = props;\n return (\n <div\n className=\"exprviz-toggle-header\"\n onClick={onToggle}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onToggle && onToggle(); } }}\n title={expanded ? 'Click to collapse' : 'Click to expand'}\n >\n <span className=\"exprviz-toggle-caret\">{expanded ? '▼' : '▶'}</span>\n {' '}{displayName}{suffix ? ` ${suffix}` : ''}\n </div>\n );\n};\n\nfunction exprValueFormatter(p) {\n const v = p.value;\n if (v == null) return '';\n if (Array.isArray(v)) return v.join(', ');\n if (typeof v === 'object') return JSON.stringify(v);\n return String(v);\n}\n\n// Discover every distinct factor and characteristic type across the loaded\n// fields. Each becomes one header row (with adjacent equal-value cells\n// merged). Order is alphabetical for stability across reloads.\nfunction collectMetadataTypes(fields, fieldInfo) {\n const factorTypes = new Set();\n const charTypes = new Set();\n for (const f of fields || []) {\n const info = fieldInfo[f];\n if (!info) continue;\n Object.keys(info.factors || {}).forEach(t => factorTypes.add(t));\n Object.keys(info.characteristics || {}).forEach(t => charTypes.add(t));\n }\n return {\n factorTypes: Array.from(factorTypes).sort(),\n charTypes: Array.from(charTypes).sort()\n };\n}\n\n// Wrap a leaf column in N nested column groups so it participates at every\n// header row, with a custom label per level. Lets the Gene ID / Name columns\n// carry the row labels (\"Study\"/\"Factor\"/\"Characteristic\" and the type name).\nfunction wrapLeafWithLabels(leaf, labels) {\n let wrapped = leaf;\n for (let i = labels.length - 1; i >= 0; i--) {\n const label = labels[i];\n const cls = label.headerClass\n ? `${label.headerClass} exprviz-hg-labels`\n : 'exprviz-hg-labels';\n wrapped = {\n headerName: label.headerName,\n headerClass: cls,\n // Always render through one of our components so the alignment and\n // spacing are controlled by our own DOM, not ag-grid's defaults.\n headerGroupComponent: label.headerGroupComponent || LabelHeaderGroup,\n headerGroupComponentParams: label.headerGroupComponentParams,\n children: [wrapped]\n };\n }\n return wrapped;\n}\n\n// Build the column tree:\n// row 1 — Study | Title | <study description>…\n// row 2..(2+F-1) — Factor | <factor type> | <value or blank>…\n// row 2+F..end-1 — Characteristic | <char type> | <value or blank>…\n// leaf row — Gene ID | Name | g3, g4, …\n// Adjacent expression cells sharing the same value at a given level merge\n// (because they're children of one group definition). Blank values for a\n// type that's defined only in other studies render as empty cells, and\n// adjacent blanks under the same parent merge automatically.\nfunction buildColumnDefs(fields, fieldInfo, expanded, toggles) {\n if (!fields || fields.length === 0) return baseColDefs;\n const { factorTypes, charTypes } = collectMetadataTypes(fields, fieldInfo);\n\n const levels = [{ kind: 'study', getValue: (info) => (info && info.studyDescription) || '' }];\n if (expanded.factors) {\n for (const t of factorTypes) {\n levels.push({\n kind: 'factor', type: t,\n getValue: (info) => (info && info.factors && info.factors[t]) || '',\n headerClass: 'exprviz-hg-factors'\n });\n }\n } else if (factorTypes.length > 0) {\n // One placeholder level standing in for the collapsed factor rows.\n levels.push({\n kind: 'factors-collapsed',\n getValue: () => '',\n headerClass: 'exprviz-hg-factors exprviz-hg-collapsed'\n });\n }\n if (expanded.chars) {\n for (const t of charTypes) {\n levels.push({\n kind: 'char', type: t,\n getValue: (info) => (info && info.characteristics && info.characteristics[t]) || '',\n headerClass: 'exprviz-hg-chars'\n });\n }\n } else if (charTypes.length > 0) {\n levels.push({\n kind: 'chars-collapsed',\n getValue: () => '',\n headerClass: 'exprviz-hg-chars exprviz-hg-collapsed'\n });\n }\n\n // Walk fields, opening a new group at level i (and resetting all levels\n // below) the first time the value at level i differs from the previous\n // field's. Same value → same parent group → ag-grid merges the cells.\n const exprTopGroups = [];\n const currentGroups = new Array(levels.length).fill(null);\n const currentKeys = new Array(levels.length).fill(undefined);\n\n for (const f of fields) {\n const info = fieldInfo[f] || {};\n let firstChange = levels.length;\n for (let i = 0; i < levels.length; i++) {\n const key = levels[i].getValue(info);\n if (currentGroups[i] === null || currentKeys[i] !== key) {\n firstChange = i;\n break;\n }\n }\n for (let i = firstChange; i < levels.length; i++) {\n const key = levels[i].getValue(info);\n const group = {\n headerName: key,\n headerClass: levels[i].headerClass,\n children: []\n };\n currentGroups[i] = group;\n currentKeys[i] = key;\n if (i === 0) exprTopGroups.push(group);\n else currentGroups[i - 1].children.push(group);\n }\n\n const leaf = {\n field: f,\n headerName: info.group || f.replace(/__expr$/, ''),\n width: 160,\n suppressMovable: false,\n valueFormatter: exprValueFormatter\n };\n currentGroups[levels.length - 1].children.push(leaf);\n }\n\n // Labels for the two pinned columns. The leftmost column carries the row\n // category (\"Study\" / \"Factor\" / \"Characteristic\"); the next column shows\n // the specific row name (the literal \"Title\" for the study row, then each\n // factor/characteristic type name). The first row of each\n // factor/characteristic section gets a clickable caret that toggles the\n // section between expanded (one row per type) and collapsed (one\n // placeholder row).\n const studyLabels = [{ headerName: 'Study' }];\n const titleLabels = [{ headerName: 'Title' }];\n\n if (expanded.factors) {\n factorTypes.forEach((t, i) => {\n studyLabels.push({\n headerName: 'Factor',\n headerClass: 'exprviz-hg-factors',\n ...(i === 0 ? {\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: { onToggle: toggles.toggleFactors, expanded: true }\n } : {})\n });\n titleLabels.push({ headerName: t, headerClass: 'exprviz-hg-factors' });\n });\n } else if (factorTypes.length > 0) {\n studyLabels.push({\n headerName: 'Factors',\n headerClass: 'exprviz-hg-factors exprviz-hg-collapsed',\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: {\n onToggle: toggles.toggleFactors,\n expanded: false,\n suffix: `(${factorTypes.length})`\n }\n });\n titleLabels.push({ headerName: '', headerClass: 'exprviz-hg-factors exprviz-hg-collapsed' });\n }\n\n if (expanded.chars) {\n charTypes.forEach((t, i) => {\n studyLabels.push({\n headerName: 'Characteristic',\n headerClass: 'exprviz-hg-chars',\n ...(i === 0 ? {\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: { onToggle: toggles.toggleChars, expanded: true }\n } : {})\n });\n titleLabels.push({ headerName: t, headerClass: 'exprviz-hg-chars' });\n });\n } else if (charTypes.length > 0) {\n studyLabels.push({\n headerName: 'Characteristics',\n headerClass: 'exprviz-hg-chars exprviz-hg-collapsed',\n headerGroupComponent: ToggleHeaderGroup,\n headerGroupComponentParams: {\n onToggle: toggles.toggleChars,\n expanded: false,\n suffix: `(${charTypes.length})`\n }\n });\n titleLabels.push({ headerName: '', headerClass: 'exprviz-hg-chars exprviz-hg-collapsed' });\n }\n\n const idCol = wrapLeafWithLabels(baseColDefs[0], studyLabels);\n const nameCol = wrapLeafWithLabels(baseColDefs[1], titleLabels);\n\n return [idCol, nameCol, ...exprTopGroups];\n}\n\nconst ExprTable = ({ rows, fields, onReorder, studies, expressionSamples, onHoverRow, onDisplayedOrderChange }) => {\n const fieldInfo = useMemo(\n () => buildFieldInfo(fields, studies, expressionSamples),\n [fields, studies, expressionSamples]\n );\n\n // Default: factor rows expanded, characteristic rows collapsed (per spec).\n const [expanded, setExpanded] = useState({ factors: true, chars: false });\n const toggleFactors = useCallback(\n () => setExpanded(e => ({ ...e, factors: !e.factors })),\n []\n );\n const toggleChars = useCallback(\n () => setExpanded(e => ({ ...e, chars: !e.chars })),\n []\n );\n\n const columnDefs = useMemo(\n () => buildColumnDefs(fields, fieldInfo, expanded, { toggleFactors, toggleChars }),\n [fields, fieldInfo, expanded, toggleFactors, toggleChars]\n );\n\n // ag-grid emits modelUpdated after the rowData/sort/filter pipeline runs,\n // so this single hook covers user-driven sort changes AND the auto-resort\n // that ag-grid performs whenever the rowData prop is replaced (e.g. when\n // the parallel-coords brush narrows filteredRows). Walking\n // forEachNodeAfterFilterAndSort gives us the rows in their current\n // displayed order; we pass that up so the heatmap can mirror the table.\n const handleModelUpdated = useCallback((e) => {\n if (!onDisplayedOrderChange || !e.api) return;\n const out = [];\n e.api.forEachNodeAfterFilterAndSort(node => {\n if (node.data) out.push(node.data);\n });\n onDisplayedOrderChange(out);\n }, [onDisplayedOrderChange]);\n\n const onColumnMoved = (e) => {\n if (!onReorder || !e.finished) return;\n const allCols = e.api.getAllGridColumns ? e.api.getAllGridColumns() : (e.columnApi && e.columnApi.getAllGridColumns && e.columnApi.getAllGridColumns());\n if (!allCols) return;\n const next = allCols\n .map(c => c.getColId())\n .filter(id => fields.includes(id));\n if (!arraysEqual(next, fields)) {\n onReorder(next);\n }\n };\n\n if (!rows || rows.length === 0) {\n return <div className=\"exprviz-table-empty\"><em>No data loaded.</em></div>;\n }\n\n return (\n <div className=\"ag-theme-quartz exprviz-aggrid\">\n <AgGridReact\n rowData={rows}\n columnDefs={columnDefs}\n defaultColDef={DEFAULT_COL_DEF}\n animateRows={false}\n suppressFieldDotNotation={true}\n suppressDragLeaveHidesColumns={true}\n suppressColumnVirtualisation={true}\n groupHeaderHeight={24}\n onColumnMoved={onColumnMoved}\n onModelUpdated={handleModelUpdated}\n onCellMouseOver={e => onHoverRow && onHoverRow(e.data && e.data.id)}\n onCellMouseOut={() => onHoverRow && onHoverRow(null)}\n />\n </div>\n );\n};\n\nexport default ExprTable;\n","import React, { useEffect, useRef, useState } from 'react';\nimport * as d3 from 'd3';\n\n// Parallel-coordinates plot with per-axis brushing and drag-to-reorder axes.\n// - Axis labels are draggable horizontally; on drop, onReorder(newOrder) fires.\n// - Brushes on axes intersect (AND): a row is \"in\" only when every active brush contains it.\n// - Numeric fields use a linear or symlog scale; non-numeric values are skipped.\n\nconst MARGIN = { top: 100, right: 24, bottom: 24, left: 32 };\nconst LABEL_ROTATION = -40;\nconst BRUSH_WIDTH = 16;\n\nfunction isNumeric(v) {\n if (v == null) return false;\n if (Array.isArray(v)) return false;\n const n = +v;\n return Number.isFinite(n);\n}\n\nfunction arraysEqual(a, b) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\n// Powers-of-10 tick values spanning [lo, hi]; includes 0 if the range crosses zero.\n// Clamped to |v| >= 0.1 to keep low-magnitude tick labels from overlapping near 0.\nconst MIN_LOG_TICK = 0.1;\nfunction logTickValues([lo, hi]) {\n const ticks = new Set();\n if (lo <= 0 && hi >= 0) ticks.add(0);\n if (hi >= MIN_LOG_TICK) {\n const start = Math.max(-1, Math.floor(Math.log10(lo > 0 ? lo : MIN_LOG_TICK)));\n const end = Math.ceil(Math.log10(hi));\n for (let p = start; p <= end; p++) {\n const v = Math.pow(10, p);\n if (v >= MIN_LOG_TICK && v <= hi) ticks.add(v);\n }\n }\n if (lo <= -MIN_LOG_TICK) {\n const start = Math.max(-1, Math.floor(Math.log10(hi < 0 ? -hi : MIN_LOG_TICK)));\n const end = Math.ceil(Math.log10(-lo));\n for (let p = start; p <= end; p++) {\n const v = -Math.pow(10, p);\n if (-v >= MIN_LOG_TICK && v >= lo) ticks.add(v);\n }\n }\n return Array.from(ticks).sort((a, b) => a - b);\n}\n\nfunction logTickFormat(v) {\n if (v === 0) return '0';\n const a = Math.abs(v);\n if (a >= 0.01 && a < 10000) return d3.format('~g')(v);\n return d3.format('.0e')(v);\n}\n\nconst ParallelCoordsPlot = ({\n rows,\n fields,\n scale = 'linear',\n onBrushChange,\n onReorder,\n clearVersion = 0,\n hoveredId = null,\n axisLabels = null\n}) => {\n const svgRef = useRef(null);\n const containerRef = useRef(null);\n // selections in data domain: { [field]: [lo, hi] }\n const selectionsRef = useRef({});\n const lastClearRef = useRef(0);\n // Track container size so the d3 render reruns when the user drags the\n // pane resizer (or when the window is resized). The values themselves\n // aren't read inside the effect — the effect always reads clientWidth/\n // clientHeight — but listing them in the deps array is what triggers it.\n const [size, setSize] = useState({ w: 0, h: 0 });\n // Custom HTML tooltip for axis labels — gives us bold labels and structured\n // sections, which the native SVG <title> can't do.\n const [tooltip, setTooltip] = useState(null);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setSize((prev) => {\n if (Math.abs(prev.w - width) < 1 && Math.abs(prev.h - height) < 1) return prev;\n return { w: width, h: height };\n });\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n useEffect(() => {\n if (clearVersion !== lastClearRef.current) {\n selectionsRef.current = {};\n lastClearRef.current = clearVersion;\n if (onBrushChange) onBrushChange({});\n }\n Object.keys(selectionsRef.current).forEach(f => {\n if (!fields || !fields.includes(f)) delete selectionsRef.current[f];\n });\n\n const svg = d3.select(svgRef.current);\n svg.selectAll('*').remove();\n if (!fields || fields.length === 0 || !rows || rows.length === 0) return;\n\n const el = containerRef.current;\n const width = (el && el.clientWidth) || 600;\n const height = (el && el.clientHeight) || 300;\n const innerW = width - MARGIN.left - MARGIN.right;\n const innerH = height - MARGIN.top - MARGIN.bottom;\n\n svg.attr('viewBox', `0 0 ${width} ${height}`);\n\n const g = svg.append('g').attr('transform', `translate(${MARGIN.left},${MARGIN.top})`);\n\n // Mutable order during drag — starts as a copy of fields.\n let order = fields.slice();\n const x = d3.scalePoint().range([0, innerW]).padding(0.5).domain(order);\n\n const yByField = {};\n let globalExt = null;\n if (scale === 'log') {\n const all = [];\n fields.forEach(f => {\n rows.forEach(r => {\n const v = r[f];\n if (isNumeric(v)) all.push(+v);\n });\n });\n globalExt = all.length ? d3.extent(all) : [0, 1];\n }\n fields.forEach(f => {\n if (scale === 'log') {\n yByField[f] = d3.scaleSymlog().domain(globalExt).range([innerH, 0]).nice();\n } else {\n const vals = rows.map(r => r[f]).filter(isNumeric).map(Number);\n const ext = vals.length ? d3.extent(vals) : [0, 1];\n yByField[f] = d3.scaleLinear().domain(ext).range([innerH, 0]).nice();\n }\n });\n\n function pathForRow(row, posOf) {\n const pts = order.map(f => {\n const v = row[f];\n if (!isNumeric(v)) return null;\n return [posOf(f), yByField[f](Number(v))];\n });\n return line(pts);\n }\n\n const line = d3.line()\n .defined(d => d != null && Number.isFinite(d[1]))\n .x(d => d[0])\n .y(d => d[1]);\n\n const linesG = g.append('g').attr('class', 'exprviz-pc-lines');\n const paths = linesG\n .selectAll('path')\n .data(rows)\n .enter()\n .append('path')\n .attr('fill', 'none')\n .attr('stroke', 'steelblue')\n .attr('stroke-width', 1)\n .attr('data-id', d => d && d.id != null ? String(d.id) : null)\n .attr('d', row => pathForRow(row, f => x(f)));\n\n function isBrushedIn(row) {\n for (const f of order) {\n const sel = selectionsRef.current[f];\n if (!sel) continue;\n const v = row[f];\n if (!isNumeric(v)) return false;\n const n = Number(v);\n const [lo, hi] = sel;\n if (n < lo || n > hi) return false;\n }\n return true;\n }\n\n function applyBrushStyles() {\n const anyActive = Object.keys(selectionsRef.current).length > 0;\n paths\n .classed('exprviz-pc-line-in', d => !anyActive || isBrushedIn(d))\n .classed('exprviz-pc-line-out', d => anyActive && !isBrushedIn(d));\n }\n applyBrushStyles();\n\n // axis groups, keyed by field name so D3 can match them across reorders\n const axisG = g.selectAll('.exprviz-pc-axis')\n .data(order, d => d)\n .enter()\n .append('g')\n .attr('class', 'exprviz-pc-axis')\n .attr('transform', d => `translate(${x(d)},0)`);\n\n axisG.each(function(f) {\n const ax = d3.select(this);\n const axisGen = d3.axisLeft(yByField[f]);\n if (scale === 'log') {\n axisGen.tickValues(logTickValues(yByField[f].domain())).tickFormat(logTickFormat);\n } else {\n axisGen.ticks(5);\n }\n ax.call(axisGen);\n\n // Compact axis label. Hovering the label or its drag-handle rect shows\n // a custom HTML tooltip (rendered outside the SVG by React) that can\n // include bold labels and section headings.\n const labelInfo = (axisLabels && axisLabels[f])\n || { short: f.replace(/__expr$/, ''), structured: { studyTitle: f, group: '', factors: [], characteristics: [] } };\n const showTip = (event) => setTooltip({\n x: event.clientX,\n y: event.clientY,\n info: labelInfo.structured\n });\n const moveTip = (event) => setTooltip(t =>\n t ? { ...t, x: event.clientX, y: event.clientY } : null\n );\n const hideTip = () => setTooltip(null);\n\n ax.append('text')\n .attr('class', 'exprviz-pc-axis-label')\n .attr('x', 4).attr('y', -4)\n .attr('text-anchor', 'start')\n .attr('transform', `rotate(${LABEL_ROTATION}, 0, -4)`)\n .attr('fill', '#333')\n .style('font-size', '10px')\n .style('cursor', 'grab')\n .text(labelInfo.short)\n .on('mouseenter', showTip)\n .on('mousemove', moveTip)\n .on('mouseleave', hideTip);\n\n // hit area for grabbing — sits along the rotated label\n ax.append('rect')\n .attr('class', 'exprviz-pc-axis-handle')\n .attr('x', 0).attr('y', -11)\n .attr('width', 140).attr('height', 14)\n .attr('transform', `rotate(${LABEL_ROTATION}, 0, -4)`)\n .attr('fill', 'transparent')\n .style('cursor', 'grab')\n .on('mouseenter', showTip)\n .on('mousemove', moveTip)\n .on('mouseleave', hideTip);\n\n const brush = d3.brushY()\n .extent([[-BRUSH_WIDTH / 2, 0], [BRUSH_WIDTH / 2, innerH]])\n .on('brush end', (event) => {\n const s = event.selection;\n if (!s) {\n delete selectionsRef.current[f];\n } else {\n const y = yByField[f];\n const a = y.invert(s[0]);\n const b = y.invert(s[1]);\n selectionsRef.current[f] = [Math.min(a, b), Math.max(a, b)];\n }\n applyBrushStyles();\n // event.sourceEvent is null when brush.move is called programmatically\n // (e.g. when this effect re-runs and we restore prior selections).\n // Skipping that case avoids a re-render loop with the parent.\n if (event.type === 'end' && event.sourceEvent && onBrushChange) {\n onBrushChange({ ...selectionsRef.current });\n }\n });\n\n const brushG = ax.append('g').attr('class', 'exprviz-pc-brush').call(brush);\n\n const prior = selectionsRef.current[f];\n if (prior) {\n const y = yByField[f];\n const py0 = y(prior[1]);\n const py1 = y(prior[0]);\n if (Number.isFinite(py0) && Number.isFinite(py1)) {\n brushG.call(brush.move, [py0, py1]);\n }\n }\n });\n\n // Drag-to-reorder: while dragging, only the dragged axis moves and the\n // line segments connecting to it are recomputed. Other axes stay put.\n // The new order is computed once at drag end and emitted via onReorder.\n const drag = d3.drag()\n .container(function() { return g.node(); })\n .subject(function(event, d) { return { x: x(d), y: 0 }; })\n .on('start', function(event, d) {\n const axNode = this.parentNode;\n d3.select(axNode).raise().classed('exprviz-pc-axis-dragging', true);\n d3.select(axNode).select('.exprviz-pc-axis-label').style('cursor', 'grabbing');\n linesG.classed('exprviz-pc-lines-dragging', true);\n })\n .on('drag', function(event, d) {\n const axNode = this.parentNode;\n const newX = Math.max(0, Math.min(innerW, event.x));\n d3.select(axNode).attr('transform', `translate(${newX},0)`);\n paths.attr('d', row => pathForRow(row, f => f === d ? newX : x(f)));\n })\n .on('end', function(event, d) {\n const axNode = this.parentNode;\n const newX = Math.max(0, Math.min(innerW, event.x));\n d3.select(axNode).classed('exprviz-pc-axis-dragging', false);\n d3.select(axNode).select('.exprviz-pc-axis-label').style('cursor', 'grab');\n linesG.classed('exprviz-pc-lines-dragging', false);\n\n const newOrder = order.slice().sort((a, b) => {\n const xa = a === d ? newX : x(a);\n const xb = b === d ? newX : x(b);\n return xa - xb;\n });\n\n if (onReorder && !arraysEqual(newOrder, fields)) {\n // Snap the dragged axis to its target slot for the brief moment\n // before the parent re-renders with the new order.\n x.domain(newOrder);\n d3.select(axNode).attr('transform', `translate(${x(d)},0)`);\n paths.attr('d', row => pathForRow(row, f => x(f)));\n onReorder(newOrder);\n } else {\n // No order change — restore the dragged axis to its original slot.\n d3.select(axNode).attr('transform', `translate(${x(d)},0)`);\n paths.attr('d', row => pathForRow(row, f => x(f)));\n }\n });\n\n axisG.selectAll('.exprviz-pc-axis-label, .exprviz-pc-axis-handle').call(drag);\n }, [rows, fields, scale, onBrushChange, onReorder, clearVersion, axisLabels, size.w, size.h]);\n\n // Highlight the polyline matching the hovered row id without rebuilding the\n // SVG. Raises the highlighted path so it draws above its neighbors.\n useEffect(() => {\n const svg = d3.select(svgRef.current);\n if (svg.empty()) return;\n const paths = svg.selectAll('.exprviz-pc-lines path');\n paths.classed('exprviz-pc-line-hover', false);\n if (hoveredId == null) return;\n const target = paths.filter(function() {\n return this.getAttribute('data-id') === String(hoveredId);\n });\n target.classed('exprviz-pc-line-hover', true).raise();\n }, [hoveredId, rows, fields, scale]);\n\n if (!fields || fields.length === 0) {\n return <div className=\"exprviz-plot-empty\"><em>Select fields to plot.</em></div>;\n }\n\n return (\n <div ref={containerRef} className=\"exprviz-pc-container\">\n <svg ref={svgRef} width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\"/>\n {tooltip && <AxisTooltip x={tooltip.x} y={tooltip.y} info={tooltip.info}/>}\n </div>\n );\n};\n\n// Position-fixed so it can escape the plot pane's clipping. Offset slightly\n// from the cursor and clamped to the viewport so it never spills off-screen.\nconst AxisTooltip = ({ x, y, info }) => {\n const ref = useRef(null);\n const [pos, setPos] = useState({ left: x + 12, top: y + 12 });\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n const w = el.offsetWidth;\n const h = el.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let left = x + 12;\n let top = y + 12;\n if (left + w > vw - 4) left = Math.max(4, x - 12 - w);\n if (top + h > vh - 4) top = Math.max(4, y - 12 - h);\n setPos({ left, top });\n }, [x, y, info]);\n const { studyTitle, group, factors, characteristics } = info;\n return (\n <div ref={ref} className=\"exprviz-pc-tooltip\" style={pos}>\n <div><span className=\"exprviz-pc-tip-key\">Study:</span> {studyTitle}{group ? ` (${group})` : ''}</div>\n {factors.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Factors</div>\n {factors.map((p, i) => (\n <div key={`f-${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n {characteristics.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Characteristics</div>\n {characteristics.map((p, i) => (\n <div key={`c-${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n </div>\n );\n};\n\nexport default ParallelCoordsPlot;\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport * as d3 from 'd3';\n\n// Heatmap of (gene × sample) expression values. A compact, color-mapped\n// stand-in for the data table; columns line up with the table's column order\n// so switching modes preserves the user's mental model.\n//\n// Scale: discrete threshold-based color bins (5 levels, configurable below)\n// going from pale blue (low) to dark blue (high). The bin cutoffs are\n// global — they don't adapt to the data — so colors are comparable across\n// different gene sets and tabs. Edit BIN_CUTOFFS / BIN_COLORS to retune.\n\n// 4 cutoffs → 5 bins → 5 colors. A value v gets BIN_COLORS[i] where i is\n// the largest index such that v >= BIN_CUTOFFS[i-1] (with i=0 below all).\n// Defaults assume TPM-like expression magnitudes; adjust for FPKM / counts.\nconst BIN_CUTOFFS = [1, 10, 100, 1000];\nconst BIN_COLORS = [\n '#e8f1f8', // pale blue — below first cutoff\n '#b8d3e6',\n '#6da6cf',\n '#2e6fae',\n '#0a3d72' // dark blue — above last cutoff\n];\n\nconst MIN_CELL_H = 20;\nconst MIN_CELL_W = 20;\nconst CELL_GAP = 1;\nconst HEADER_LABEL_ROTATION = -40;\nconst LABEL_FONT_SIZE = 11;\n// Reasonable bounds for label-fit margins so a single huge label can't\n// monopolize the visualization space.\nconst LEFT_MARGIN_MIN = 36;\nconst LEFT_MARGIN_MAX = 220;\nconst HEADER_HEIGHT_MIN = 60;\nconst HEADER_HEIGHT_MAX = 200;\nconst RIGHT_MARGIN = 16;\nconst BODY_BOTTOM = 12;\n\nfunction isNumeric(v) {\n if (v == null || Array.isArray(v)) return false;\n return Number.isFinite(+v);\n}\n\nfunction fmt(n) {\n if (!Number.isFinite(n)) return String(n);\n const a = Math.abs(n);\n if (a !== 0 && (a < 0.001 || a >= 1e6)) return n.toExponential(3);\n return Number(n.toFixed(4)).toString();\n}\n\nfunction studyIdOfField(field) {\n const m = field && field.match(/^(.+?)_g\\d+__expr$/);\n return m ? m[1] : field;\n}\n\n// One shared canvas context for label measurement — avoids re-creating it\n// per render and keeps the math accurate (font metrics depend on the\n// browser's actual font rendering).\nlet _measureCtx = null;\nfunction measureText(s, fontSize = LABEL_FONT_SIZE) {\n if (!s) return 0;\n if (!_measureCtx) {\n if (typeof document === 'undefined') return s.length * 6.5;\n _measureCtx = document.createElement('canvas').getContext('2d');\n }\n _measureCtx.font = `${fontSize}px sans-serif`;\n return _measureCtx.measureText(String(s)).width;\n}\n\nconst HeatmapPlot = ({\n rows,\n fields,\n axisLabels = null,\n fieldInfo = null,\n onHoverRow = null\n}) => {\n const containerRef = useRef(null);\n const innerRef = useRef(null);\n const headerSvgRef = useRef(null);\n const bodySvgRef = useRef(null);\n const bodyScrollRef = useRef(null);\n const [size, setSize] = useState({ w: 0, h: 0 });\n const [tooltip, setTooltip] = useState(null);\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || typeof ResizeObserver === 'undefined') return;\n const ro = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n setSize(prev => {\n if (Math.abs(prev.w - width) < 1 && Math.abs(prev.h - height) < 1) return prev;\n return { w: width, h: height };\n });\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const colorOfValue = useMemo(() => {\n const scale = d3.scaleThreshold().domain(BIN_CUTOFFS).range(BIN_COLORS);\n return v => (isNumeric(v) ? scale(+v) : '#f2f2f2');\n }, []);\n\n // Pre-compute label-fit dimensions so the d3 effect can lay things out\n // and the React legend can use the same numbers.\n const layout = useMemo(() => {\n const containerW = (size.w || 600);\n const containerH = (size.h || 300);\n\n // Left margin: enough to fit the longest gene name / id, capped.\n let maxRowLabel = 0;\n for (const r of (rows || [])) {\n const w = measureText(r.name || r.id || '');\n if (w > maxRowLabel) maxRowLabel = w;\n }\n const leftMargin = Math.max(\n LEFT_MARGIN_MIN,\n Math.min(LEFT_MARGIN_MAX, Math.ceil(maxRowLabel) + 12)\n );\n\n // Header height: the rotated column label takes up labelWidth*sin(40°)\n // vertical pixels. Cap to keep things sane on pathologically long names.\n let maxColLabel = 0;\n for (const f of (fields || [])) {\n const lab = (axisLabels && axisLabels[f] && axisLabels[f].short) || f;\n const w = measureText(lab);\n if (w > maxColLabel) maxColLabel = w;\n }\n const sinR = Math.sin(Math.abs(HEADER_LABEL_ROTATION) * Math.PI / 180);\n const headerH = Math.max(\n HEADER_HEIGHT_MIN,\n Math.min(HEADER_HEIGHT_MAX, Math.ceil(maxColLabel * sinR) + 18)\n );\n\n const availPlotW = Math.max(0, containerW - leftMargin - RIGHT_MARGIN);\n const availPlotH = Math.max(0, containerH - headerH - BODY_BOTTOM);\n\n const nFields = (fields && fields.length) || 0;\n const nRows = (rows && rows.length) || 0;\n const fitCellW = nFields > 0 ? availPlotW / nFields : MIN_CELL_W;\n const fitCellH = nRows > 0 ? availPlotH / nRows : MIN_CELL_H;\n const cellW = Math.max(MIN_CELL_W, fitCellW);\n const cellH = Math.max(MIN_CELL_H, fitCellH);\n\n const innerW = cellW * nFields;\n const innerH = cellH * nRows;\n // Total width of the inner block (header + body share this width so the\n // outer container's horizontal scroll moves them together).\n const totalW = leftMargin + innerW + RIGHT_MARGIN;\n\n return { leftMargin, headerH, cellW, cellH, innerW, innerH, totalW, containerW, containerH };\n }, [rows, fields, axisLabels, size.w, size.h]);\n\n useEffect(() => {\n const headerSvg = d3.select(headerSvgRef.current);\n const bodySvg = d3.select(bodySvgRef.current);\n headerSvg.selectAll('*').remove();\n bodySvg.selectAll('*').remove();\n if (!fields || fields.length === 0 || !rows || rows.length === 0) return;\n\n const { leftMargin, headerH, cellW, cellH, innerW, innerH, totalW } = layout;\n\n // ---- header SVG: rotated column labels, study separator ticks ----\n headerSvg.attr('width', totalW).attr('height', headerH);\n const hg = headerSvg.append('g')\n .attr('transform', `translate(${leftMargin},${headerH})`);\n const labelGroup = hg.append('g').attr('class', 'exprviz-hm-collabels');\n let prevStudy = null;\n fields.forEach((f, i) => {\n const cx = i * cellW + cellW / 2;\n const label = (axisLabels && axisLabels[f] && axisLabels[f].short) || f;\n const t = labelGroup.append('text')\n .attr('class', 'exprviz-hm-collabel')\n .attr('transform', `translate(${cx},-6) rotate(${HEADER_LABEL_ROTATION})`)\n .attr('text-anchor', 'start')\n .attr('font-size', LABEL_FONT_SIZE)\n .text(label);\n const struct = axisLabels && axisLabels[f] && axisLabels[f].structured;\n if (struct) {\n const titleParts = [struct.studyTitle];\n if (struct.group) titleParts.push(`Group: ${struct.group}`);\n struct.factors && struct.factors.forEach(p => titleParts.push(`${p.name}: ${p.value}`));\n struct.characteristics && struct.characteristics.forEach(p => titleParts.push(`${p.name}: ${p.value}`));\n t.append('title').text(titleParts.join('\\n'));\n }\n // Tick marks at study boundaries inside the header so groupings stay\n // visible even after a horizontal scroll.\n const sid = studyIdOfField(f);\n if (i > 0 && sid !== prevStudy) {\n hg.append('line')\n .attr('x1', i * cellW).attr('x2', i * cellW)\n .attr('y1', -4).attr('y2', 0)\n .attr('stroke', '#666').attr('stroke-width', 1);\n }\n prevStudy = sid;\n });\n\n // ---- body SVG ----\n const bodyH = innerH + BODY_BOTTOM;\n bodySvg.attr('width', totalW).attr('height', bodyH);\n const g = bodySvg.append('g').attr('transform', `translate(${leftMargin},0)`);\n\n // Vertical separators between studies — full height.\n prevStudy = null;\n fields.forEach((f, i) => {\n const sid = studyIdOfField(f);\n if (i > 0 && sid !== prevStudy) {\n g.append('line')\n .attr('class', 'exprviz-hm-study-sep')\n .attr('x1', i * cellW).attr('x2', i * cellW)\n .attr('y1', 0).attr('y2', innerH)\n .attr('stroke', '#fff').attr('stroke-width', 2);\n }\n prevStudy = sid;\n });\n\n // ---- cells ----\n const cellsGroup = g.append('g').attr('class', 'exprviz-hm-cells');\n // Hover outline lives in its own <g> so cell event handlers can update\n // it imperatively without re-running this effect.\n const overlayGroup = g.append('g').attr('class', 'exprviz-hm-overlay');\n const showHover = (row, field, mx, my, value) => {\n const ax = axisLabels && axisLabels[field] && axisLabels[field].structured;\n const info = fieldInfo && fieldInfo[field];\n setTooltip({\n x: mx + 12,\n y: my + 12,\n gene: { id: row.id, name: row.name },\n value,\n study: (ax && ax.studyTitle) || (info && info.studyDescription) || '',\n group: (ax && ax.group) || (info && info.group) || '',\n replicates: info && info.replicates,\n factors: (ax && ax.factors) || (info && info.factors ? Object.entries(info.factors).map(([name, value]) => ({ name, value })) : []),\n characteristics: (ax && ax.characteristics) || (info && info.characteristics ? Object.entries(info.characteristics).map(([name, value]) => ({ name, value })) : [])\n });\n if (onHoverRow) onHoverRow(row.id);\n };\n const clearHover = () => {\n overlayGroup.selectAll('*').remove();\n setTooltip(null);\n if (onHoverRow) onHoverRow(null);\n };\n\n const cellInnerW = Math.max(0.5, cellW - CELL_GAP);\n const cellInnerH = Math.max(0.5, cellH - CELL_GAP);\n rows.forEach((row, ri) => {\n const rg = cellsGroup.append('g')\n .attr('class', 'exprviz-hm-row')\n .attr('data-id', row.id)\n .attr('transform', `translate(0, ${ri * cellH})`);\n fields.forEach((f, ci) => {\n const v = row[f];\n const numeric = isNumeric(v);\n const fill = colorOfValue(v);\n const rect = rg.append('rect')\n .attr('x', ci * cellW).attr('y', 0)\n .attr('width', cellInnerW).attr('height', cellInnerH)\n .attr('fill', fill).attr('stroke', 'none');\n rect.on('pointerenter pointermove', (event) => {\n overlayGroup.selectAll('*').remove();\n overlayGroup.append('rect')\n .attr('x', ci * cellW).attr('y', ri * cellH)\n .attr('width', cellInnerW).attr('height', cellInnerH)\n .attr('fill', 'none')\n .attr('stroke', '#d62728').attr('stroke-width', 1.5)\n .attr('pointer-events', 'none');\n showHover(row, f, event.clientX, event.clientY, numeric ? +v : null);\n });\n rect.on('pointerleave', clearHover);\n });\n });\n\n // ---- row labels (always rendered: cellH >= MIN_CELL_H = 20) ----\n const labels = g.append('g').attr('class', 'exprviz-hm-rowlabels');\n rows.forEach((row, ri) => {\n labels.append('text')\n .attr('x', -6)\n .attr('y', ri * cellH + cellH / 2)\n .attr('text-anchor', 'end')\n .attr('dominant-baseline', 'middle')\n .attr('font-size', Math.min(LABEL_FONT_SIZE, cellH - 2))\n .text(row.name || row.id);\n });\n }, [rows, fields, axisLabels, fieldInfo, layout, colorOfValue, onHoverRow]);\n\n // Inner block width matches the SVG width so when content is wider than\n // the container, the outer container scrolls horizontally and both\n // header + body translate together (col labels stay aligned with cells).\n const innerStyle = { width: layout.totalW || '100%' };\n\n return (\n <div className=\"exprviz-hm-container\" ref={containerRef}>\n <div className=\"exprviz-hm-inner\" ref={innerRef} style={innerStyle}>\n <div className=\"exprviz-hm-header\">\n <svg ref={headerSvgRef}/>\n </div>\n <div className=\"exprviz-hm-body\" ref={bodyScrollRef}>\n <svg ref={bodySvgRef}/>\n </div>\n </div>\n <Legend/>\n {tooltip && (\n <div\n className=\"exprviz-pc-tooltip\"\n style={{ left: tooltip.x, top: tooltip.y }}\n >\n <div>\n <span className=\"exprviz-pc-tip-key\">{tooltip.gene.id}</span>\n {tooltip.gene.name ? <> · {tooltip.gene.name}</> : null}\n </div>\n <div>\n <span className=\"exprviz-pc-tip-key\">Value:</span> {tooltip.value == null ? '—' : fmt(tooltip.value)}\n </div>\n {tooltip.study && (\n <>\n <div className=\"exprviz-pc-tip-section\">Study</div>\n <div className=\"exprviz-pc-tip-row\">{tooltip.study}</div>\n {tooltip.group && (\n <div className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">Group:</span> {tooltip.group}\n {tooltip.replicates ? ` (${tooltip.replicates} rep${tooltip.replicates === 1 ? '' : 's'})` : ''}\n </div>\n )}\n </>\n )}\n {tooltip.factors && tooltip.factors.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Factors</div>\n {tooltip.factors.map((p, i) => (\n <div key={`f${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n {tooltip.characteristics && tooltip.characteristics.length > 0 && (\n <>\n <div className=\"exprviz-pc-tip-section\">Characteristics</div>\n {tooltip.characteristics.map((p, i) => (\n <div key={`c${i}`} className=\"exprviz-pc-tip-row\">\n <span className=\"exprviz-pc-tip-key\">{p.name}:</span> {p.value}\n </div>\n ))}\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n\n// 5-bin discrete legend, positioned in the top-right of the heatmap pane.\n// Lives outside the scroll container so it's always visible regardless of\n// where the user has scrolled.\nconst Legend = () => (\n <div className=\"exprviz-hm-legend\" title=\"Expression bins. Edit BIN_CUTOFFS / BIN_COLORS in HeatmapPlot.js to retune.\">\n {BIN_COLORS.map((color, i) => {\n const lo = i === 0 ? null : BIN_CUTOFFS[i - 1];\n const hi = i === BIN_CUTOFFS.length ? null : BIN_CUTOFFS[i];\n let label;\n if (lo == null) label = `< ${hi}`;\n else if (hi == null) label = `≥ ${lo}`;\n else label = `${lo}–${hi}`;\n return (\n <div className=\"exprviz-hm-legend-bin\" key={i}>\n <span className=\"exprviz-hm-legend-swatch\" style={{ background: color }}/>\n <span className=\"exprviz-hm-legend-label\">{label}</span>\n </div>\n );\n })}\n </div>\n);\n\nexport default HeatmapPlot;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { connect } from 'redux-bundler-react';\nimport { Accordion, Form, Badge, OverlayTrigger, Tooltip } from 'react-bootstrap';\nimport { BsChevronDown, BsChevronRight, BsInfoCircle } from 'react-icons/bs';\nimport './ontologyEnrichment.css';\n\nfunction speciesTaxonId(tid) {\n const n = +tid;\n return n > 1000000 ? Math.floor(n / 1000) : n;\n}\n\nfunction genomeName(grameneMaps, tid) {\n if (!grameneMaps) return String(tid);\n const direct = grameneMaps[tid];\n if (direct && direct.display_name) return direct.display_name;\n const sp = grameneMaps[speciesTaxonId(tid)];\n if (sp && sp.display_name) return sp.display_name;\n return String(tid);\n}\n\nfunction fmtP(p) {\n if (p == null) return '';\n if (p === 0) return '0';\n if (p < 1e-4) return p.toExponential(2);\n return p.toPrecision(3);\n}\n\nfunction fmtFold(f) {\n if (!isFinite(f)) return '';\n if (f >= 100) return f.toFixed(0);\n return f.toFixed(2);\n}\n\n// ---------- species tree helpers ----------\n\nfunction findRoots(tax) {\n return Object.values(tax).filter(n =>\n !n.is_a || n.is_a.length === 0 || !n.is_a.some(p => tax[p])\n );\n}\n\n// Place each facet tid onto a taxonomy node id (fall back to species level\n// when the exact subspecies tid isn't in grameneTaxonomy).\nfunction placeTaxa(taxonomy, taxa) {\n const placement = {};\n const byPlace = {};\n for (const { tid, count } of taxa) {\n const place = taxonomy[tid] ? +tid : speciesTaxonId(tid);\n placement[tid] = place;\n if (!byPlace[place]) byPlace[place] = [];\n byPlace[place].push({ tid, count });\n }\n return { placement, byPlace };\n}\n\n// Set of taxonomy node ids on the path from any placed leaf back to its root.\nfunction relevantNodeIds(taxonomy, byPlace) {\n const out = new Set();\n for (const placeId of Object.keys(byPlace)) {\n let cur = taxonomy[placeId];\n const seen = new Set();\n while (cur && !seen.has(+cur._id)) {\n seen.add(+cur._id);\n out.add(+cur._id);\n const pid = cur.is_a && cur.is_a[0];\n cur = pid ? taxonomy[pid] : null;\n }\n }\n return out;\n}\n\nfunction relevantChildren(node, taxonomy, relevant) {\n return (node.children || [])\n .map(cid => taxonomy[cid])\n .filter(c => c && relevant.has(+c._id));\n}\n\n// Walk down through single-relevant-child internal nodes to a branch / leaf.\nfunction compressChain(node, taxonomy, relevant, byPlace) {\n const chain = [node];\n let cur = node;\n while (true) {\n if (byPlace[cur._id]) break; // node itself is a placed leaf\n const kids = relevantChildren(cur, taxonomy, relevant);\n if (kids.length !== 1) break;\n cur = kids[0];\n chain.push(cur);\n }\n return { chain, terminal: cur };\n}\n\nconst CHAIN_DISPLAY_MAX = 3;\nfunction renderChain(chain) {\n const nameOf = n => n.short_name || n.name || String(n._id);\n if (chain.length <= CHAIN_DISPLAY_MAX) {\n return chain.map((n, i) => (\n <React.Fragment key={n._id}>\n {i > 0 && <span className=\"tax-sep\"> › </span>}\n {nameOf(n)}\n </React.Fragment>\n ));\n }\n const first = chain[0];\n const last = chain[chain.length - 1];\n const middle = chain.slice(1, -1);\n const fullTitle = chain.map(nameOf).join(' › ');\n return (\n <>\n {nameOf(first)}\n <span className=\"tax-sep\"> › </span>\n <span className=\"tax-ellipsis\" title={fullTitle}>\n <span className=\"tax-ellipsis-short\">…</span>\n <span className=\"tax-ellipsis-full\">\n {middle.map(n => (\n <React.Fragment key={n._id}>\n {nameOf(n)}\n <span className=\"tax-sep\"> › </span>\n </React.Fragment>\n ))}\n </span>\n </span>\n <span className=\"tax-sep\"> › </span>\n {nameOf(last)}\n </>\n );\n}\n\nfunction dedupAdjacent(chain) {\n const out = [];\n for (const n of chain) {\n if (out.length && out[out.length - 1].name === n.name) {\n out[out.length - 1] = n;\n } else {\n out.push(n);\n }\n }\n return out;\n}\n\nconst SpeciesTreeNode = ({\n node, depth, taxonomy, relevant, byPlace, grameneMaps,\n expanded, onToggleExpand, activeTaxon, onSelect\n}) => {\n const { chain: rawChain, terminal } = compressChain(node, taxonomy, relevant, byPlace);\n const chain = dedupAdjacent(rawChain);\n const placed = byPlace[terminal._id] || [];\n const kids = relevantChildren(terminal, taxonomy, relevant);\n const hasKids = kids.length > 0;\n const isOpen = expanded.has(+terminal._id);\n\n return (\n <div className=\"tax-node oe-tree-node\">\n <div className=\"tax-row\" style={{ paddingLeft: depth * 7 }}>\n {hasKids ? (\n <span className=\"tax-chevron\" onClick={() => onToggleExpand(+terminal._id)}>\n {isOpen ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n ) : (\n <span className=\"tax-chevron-spacer\"/>\n )}\n <span className={hasKids ? 'tax-label tax-label-internal' : 'tax-label'}>\n {renderChain(chain)}\n </span>\n </div>\n\n {placed.map(({ tid, count }) => {\n const isActive = String(activeTaxon) === String(tid);\n return (\n <div\n key={tid}\n className={'oe-tree-leaf' + (isActive ? ' oe-tree-leaf-active' : '')}\n style={{ paddingLeft: (depth + 1) * 7 + 18 }}\n onClick={() => onSelect(tid)}\n >\n <input\n type=\"radio\"\n readOnly\n checked={isActive}\n onChange={() => onSelect(tid)}\n />\n <span className=\"oe-tree-leaf-name\">{genomeName(grameneMaps, tid)}</span>\n <span className=\"oe-tree-leaf-count\">{count.toLocaleString()}</span>\n </div>\n );\n })}\n\n {hasKids && isOpen && (\n <div className=\"tax-children\">\n {kids.map(c => (\n <SpeciesTreeNode\n key={c._id}\n node={c}\n depth={depth + 1}\n taxonomy={taxonomy}\n relevant={relevant}\n byPlace={byPlace}\n grameneMaps={grameneMaps}\n expanded={expanded}\n onToggleExpand={onToggleExpand}\n activeTaxon={activeTaxon}\n onSelect={onSelect}\n />\n ))}\n </div>\n )}\n </div>\n );\n};\n\nconst SpeciesTree = ({ taxonomy, grameneMaps, taxa, activeTaxon, onSelect }) => {\n const { placement, byPlace } = useMemo(() => placeTaxa(taxonomy, taxa), [taxonomy, taxa]);\n const relevant = useMemo(() => relevantNodeIds(taxonomy, byPlace), [taxonomy, byPlace]);\n const roots = useMemo(\n () => findRoots(taxonomy).filter(r => relevant.has(+r._id)),\n [taxonomy, relevant]\n );\n\n // Default: every relevant internal node expanded so the user sees the\n // full pruned tree on first paint.\n const [expanded, setExpanded] = useState(() => new Set(relevant));\n useEffect(() => {\n setExpanded(new Set(relevant));\n }, [relevant]);\n\n const handleToggle = (id) => {\n setExpanded(prev => {\n const next = new Set(prev);\n next.has(id) ? next.delete(id) : next.add(id);\n return next;\n });\n };\n\n // Skip the root spine: if a root has only one relevant child and isn't\n // itself a placed leaf, render from its child instead.\n const topLevel = [];\n for (const r of roots) {\n const { terminal } = compressChain(r, taxonomy, relevant, byPlace);\n if (byPlace[terminal._id]) {\n topLevel.push(r);\n } else {\n const kids = relevantChildren(terminal, taxonomy, relevant);\n kids.forEach(k => topLevel.push(k));\n }\n }\n\n return (\n <div className=\"oe-tree\">\n {topLevel.map(n => (\n <SpeciesTreeNode\n key={n._id}\n node={n}\n depth={0}\n taxonomy={taxonomy}\n relevant={relevant}\n byPlace={byPlace}\n grameneMaps={grameneMaps}\n expanded={expanded}\n onToggleExpand={handleToggle}\n activeTaxon={activeTaxon}\n onSelect={onSelect}\n />\n ))}\n </div>\n );\n};\n\n// ---------- enrichment panel ----------\n\nconst HelpIcon = ({ text }) => (\n <OverlayTrigger placement=\"top\" overlay={<Tooltip>{text}</Tooltip>}>\n <span className=\"oe-help\" tabIndex={0}><BsInfoCircle/></span>\n </OverlayTrigger>\n);\n\nconst LabeledHelp = ({ label, help }) => (\n <Form.Label>\n {label} <HelpIcon text={help}/>\n </Form.Label>\n);\n\nconst ControlsBar = ({ ui, onChange }) => (\n <div className=\"oe-controls\">\n <Form.Group className=\"oe-control\">\n <LabeledHelp\n label=\"p.adjust ≤\"\n help=\"Adjusted p-value cutoff (Benjamini–Hochberg). Terms with p.adjust above this are not reported as significant.\"\n />\n <Form.Control\n type=\"number\" step=\"0.01\" min=\"0\" max=\"1\"\n value={ui.pAdjCutoff}\n onChange={e => onChange({ pAdjCutoff: +e.target.value })}\n />\n </Form.Group>\n <Form.Group className=\"oe-control\">\n <LabeledHelp\n label=\"minGSSize\"\n help=\"Minimum gene set size: a term must have at least this many annotated genes in the universe to be tested. Filters out terms too small to give reliable enrichment statistics. clusterProfiler default: 10.\"\n />\n <Form.Control\n type=\"number\" step=\"1\" min=\"1\"\n value={ui.minGSSize}\n onChange={e => onChange({ minGSSize: Math.max(1, +e.target.value) })}\n />\n </Form.Group>\n <Form.Group className=\"oe-control\">\n <LabeledHelp\n label=\"maxGSSize\"\n help=\"Maximum gene set size: terms with more than this many annotated genes are excluded. Drops the very general top-level terms (e.g. GO root) which carry little biological signal. clusterProfiler default: 500.\"\n />\n <Form.Control\n type=\"number\" step=\"1\" min=\"1\"\n value={ui.maxGSSize}\n onChange={e => onChange({ maxGSSize: Math.max(1, +e.target.value) })}\n />\n </Form.Group>\n <div className=\"oe-control oe-switch\">\n <Form.Check\n type=\"switch\"\n id=\"oe-most-specific\"\n label=\"Drop ancestor terms\"\n checked={!!ui.mostSpecific}\n onChange={e => onChange({ mostSpecific: e.target.checked })}\n />\n <HelpIcon text=\"If a passing term has a more specific descendant that also passes, hide the ancestor — keeps only the most-specific significant term in each branch. Applied after BH correction. Analogous to clusterProfiler's simplify() (off by default in enrichGO).\"/>\n </div>\n <Form.Group className=\"oe-control oe-control-grow\">\n <LabeledHelp\n label=\"Filter terms\"\n help=\"Live text filter on the result table — matches term ID or name.\"\n />\n <Form.Control\n type=\"text\"\n placeholder=\"term id or name…\"\n value={ui.search || ''}\n onChange={e => onChange({ search: e.target.value })}\n />\n </Form.Group>\n </div>\n);\n\nconst TermRow = ({ row, showType, onAddFilter }) => {\n const handleClick = () => onAddFilter && onAddFilter(row);\n return (\n <tr onClick={handleClick} title=\"Click to add as a filter\">\n <td className=\"oe-term-id\">{row.term_display_id}</td>\n <td className=\"oe-term-name\">{row.term_name || <em>(loading…)</em>}</td>\n {showType && <td className=\"oe-term-type\">{row.term_namespace || ''}</td>}\n <td className=\"oe-num\">{row.GeneRatio}</td>\n <td className=\"oe-num\">{row.BgRatio}</td>\n <td className=\"oe-num\">{fmtFold(row.FoldEnrichment)}</td>\n <td className=\"oe-num\">{fmtP(row.pvalue)}</td>\n <td className=\"oe-num\">{fmtP(row.pAdjust)}</td>\n </tr>\n );\n};\n\n// InterPro entry types and pathway types are useful per-row context\n// (e.g. Domain vs Family vs Repeat for InterPro), and aren't reflected in\n// the section title the way GO namespaces are. Show a Type column for\n// those two ontologies only.\nconst ONTS_WITH_TYPE_COLUMN = new Set(['domains', 'pathways']);\n\nconst SORT_ACCESSORS = {\n term: r => r.term_display_id || '',\n name: r => (r.term_name || '').toLowerCase(),\n type: r => (r.term_namespace || '').toLowerCase(),\n count: r => r.Count,\n setSize: r => r.SetSize,\n fold: r => r.FoldEnrichment,\n p: r => r.pvalue,\n pAdj: r => r.pAdjust\n};\n\n// Defaults chosen so a single click does what the user usually wants:\n// numeric \"more interesting\" columns descend; p-values and text columns ascend.\nconst SORT_DEFAULT_DIR = {\n term: 'asc', name: 'asc', type: 'asc',\n count: 'desc', setSize: 'desc', fold: 'desc',\n p: 'asc', pAdj: 'asc'\n};\n\nconst SortableTh = ({ label, sortKey, activeKey, activeDir, onSort, numeric, help }) => {\n const active = activeKey === sortKey;\n const arrow = active ? (activeDir === 'asc' ? ' ▲' : ' ▼') : '';\n const cls = 'oe-sort-th'\n + (active ? ' oe-sort-th-active' : '')\n + (numeric ? ' oe-num' : '');\n const inner = (\n <span className=\"oe-th-inner\">\n {label}{arrow}\n </span>\n );\n return (\n <th className={cls} onClick={() => onSort(sortKey)}>\n {help\n ? <OverlayTrigger placement=\"top\" overlay={<Tooltip>{help}</Tooltip>}>{inner}</OverlayTrigger>\n : inner}\n </th>\n );\n};\n\nconst OntologySection = ({ block, search, onAddFilter }) => {\n const filtered = useMemo(() => {\n if (!search) return block.rows;\n const needle = search.toLowerCase();\n return block.rows.filter(r =>\n (r.term_display_id && r.term_display_id.toLowerCase().includes(needle)) ||\n (r.term_name && r.term_name.toLowerCase().includes(needle))\n );\n }, [block.rows, search]);\n\n const showType = ONTS_WITH_TYPE_COLUMN.has(block.ontology);\n const [sortKey, setSortKey] = useState('pAdj');\n const [sortDir, setSortDir] = useState('asc');\n\n const handleSort = (key) => {\n if (key === sortKey) {\n setSortDir(d => (d === 'asc' ? 'desc' : 'asc'));\n } else {\n setSortKey(key);\n setSortDir(SORT_DEFAULT_DIR[key] || 'asc');\n }\n };\n\n const sorted = useMemo(() => {\n const accessor = SORT_ACCESSORS[sortKey];\n if (!accessor) return filtered;\n const sign = sortDir === 'desc' ? -1 : 1;\n const arr = filtered.slice();\n arr.sort((a, b) => {\n const va = accessor(a);\n const vb = accessor(b);\n if (typeof va === 'number' && typeof vb === 'number') {\n if (va === vb) return 0;\n return (va - vb) * sign;\n }\n return String(va).localeCompare(String(vb)) * sign;\n });\n return arr;\n }, [filtered, sortKey, sortDir]);\n\n return (\n <Accordion.Item eventKey={block.ontology}>\n <Accordion.Header>\n <span className=\"oe-ont-title\">{block.label}</span>\n <Badge bg=\"secondary\" className=\"oe-ont-badge\">\n {block.passing} significant / {block.tested} tested\n </Badge>\n {block.universeSize > 0 && (\n <Badge bg=\"light\" text=\"dark\" className=\"oe-ont-badge\">\n input {block.deSize} / universe {block.universeSize.toLocaleString()}\n </Badge>\n )}\n </Accordion.Header>\n <Accordion.Body>\n {sorted.length === 0\n ? <em>No terms pass the current cutoffs.</em>\n : (\n <table className=\"oe-table\">\n <thead>\n <tr>\n <SortableTh label=\"Term\" sortKey=\"term\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort}\n help=\"Ontology term identifier (e.g. GO:0008150). Click a row to add the term as a filter.\"/>\n <SortableTh label=\"Description\" sortKey=\"name\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort}\n help=\"Human-readable name of the term.\"/>\n {showType && <SortableTh label=\"Type\" sortKey=\"type\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort}\n help=\"Sub-classification within the ontology (e.g. Domain / Family / Repeat for InterPro).\"/>}\n <SortableTh label=\"GeneRatio\" sortKey=\"count\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"Count / DESize: how many of the input genes are annotated to this term, over the total input genes that have any annotation in this ontology.\"/>\n <SortableTh label=\"BgRatio\" sortKey=\"setSize\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"SetSize / UniverseSize: how many genes in the species are annotated to this term, over the total genes annotated anywhere in this ontology (the universe).\"/>\n <SortableTh label=\"FoldEnrichment\" sortKey=\"fold\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"(Count/DESize) / (SetSize/UniverseSize). Ratio of observed to expected overlap. Values > 1 mean the term is over-represented in the input.\"/>\n <SortableTh label=\"pvalue\" sortKey=\"p\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"Raw upper-tail hypergeometric p-value: P(overlap ≥ observed) under the null that the input is a random sample from the universe.\"/>\n <SortableTh label=\"p.adjust\" sortKey=\"pAdj\" activeKey={sortKey} activeDir={sortDir} onSort={handleSort} numeric\n help=\"Benjamini–Hochberg adjusted p-value, computed across all terms tested in this ontology section. Use this (not the raw p-value) for significance.\"/>\n </tr>\n </thead>\n <tbody>\n {sorted.map(r => (\n <TermRow\n key={`${r.ontology}:${r.term_id}`}\n row={r}\n showType={showType}\n onAddFilter={onAddFilter}\n />\n ))}\n </tbody>\n </table>\n )\n }\n </Accordion.Body>\n </Accordion.Item>\n );\n};\n\nconst TaxonPanel = ({ taxon, ontologyEnrichment, results, ui, onUiChange, onAddFilter }) => {\n if (!taxon) return <div className=\"oe-panel\"><em>Select a species on the left.</em></div>;\n const t = ontologyEnrichment.byTaxon[taxon];\n if (!t) return <div className=\"oe-panel\"><em>Initializing…</em></div>;\n if (t.fg.status === 'loading' || t.bg.status === 'loading' || t.fg.status === 'idle' || t.bg.status === 'idle') {\n return <div className=\"oe-panel oe-loading\"><em>Loading enrichment…</em></div>;\n }\n if (t.fg.status === 'error') return <div className=\"oe-panel\"><em>Foreground error: {t.fg.error}</em></div>;\n if (t.bg.status === 'error') return <div className=\"oe-panel\"><em>Background error: {t.bg.error}</em></div>;\n if (!results) return <div className=\"oe-panel\"><em>No data.</em></div>;\n\n const allBlocks = ui.ontology === 'all'\n ? Object.values(results)\n : (results[ui.ontology] ? [results[ui.ontology]] : []);\n // Hide ontologies that aren't used in this species at all.\n const blocks = allBlocks.filter(b => b.tested > 0);\n\n return (\n <div className=\"oe-panel\">\n <div className=\"oe-summary\">\n Foreground: <b>{t.fg.numFound.toLocaleString()}</b> genes ·\n Background: <b>{t.bg.numFound.toLocaleString()}</b> genes\n </div>\n <ControlsBar ui={ui} onChange={onUiChange} />\n <Accordion alwaysOpen defaultActiveKey={blocks.length === 1 ? blocks[0].ontology : undefined}>\n {blocks.map(b => (\n <OntologySection\n key={b.ontology}\n block={b}\n search={ui.search}\n onAddFilter={onAddFilter}\n />\n ))}\n </Accordion>\n </div>\n );\n};\n\nconst OntologyEnrichmentViewCmp = props => {\n const {\n grameneSearch,\n grameneMaps,\n grameneTaxonomy,\n ontologyEnrichment,\n ontologyEnrichmentUI: ui,\n ontologyEnrichmentResults: results,\n doSetOntologyEnrichmentActiveTaxon,\n doSetOntologyEnrichmentUI,\n doFetchOntologyEnrichmentForeground,\n doFetchOntologyEnrichmentBackground,\n doAcceptGrameneSuggestion\n } = props;\n\n const taxa = useMemo(() => {\n if (!grameneSearch || !grameneSearch.facet_counts) return [];\n const arr = grameneSearch.facet_counts.facet_fields.taxon_id || [];\n const ids = [];\n const counts = {};\n for (let i = 0; i < arr.length; i += 2) {\n ids.push(arr[i]);\n counts[arr[i]] = +arr[i + 1];\n }\n if (grameneMaps) {\n ids.sort((a, b) => {\n const ma = grameneMaps[a] || grameneMaps[speciesTaxonId(a)];\n const mb = grameneMaps[b] || grameneMaps[speciesTaxonId(b)];\n return ((ma && ma.left_index) || 0) - ((mb && mb.left_index) || 0);\n });\n }\n return ids.map(tid => ({ tid, count: counts[tid] }));\n }, [grameneSearch, grameneMaps]);\n\n const activeTaxon = ontologyEnrichment.activeTaxon;\n\n const [treeWidth, setTreeWidth] = useState(280);\n const beginResize = (e) => {\n e.preventDefault();\n const startX = e.clientX;\n const startWidth = treeWidth;\n const onMove = (ev) => {\n const next = Math.max(150, Math.min(800, startWidth + (ev.clientX - startX)));\n setTreeWidth(next);\n };\n const onUp = () => {\n document.removeEventListener('mousemove', onMove);\n document.removeEventListener('mouseup', onUp);\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n };\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'col-resize';\n document.addEventListener('mousemove', onMove);\n document.addEventListener('mouseup', onUp);\n };\n\n useEffect(() => {\n if (taxa.length === 0) return;\n if (!activeTaxon || !taxa.find(t => String(t.tid) === String(activeTaxon))) {\n doSetOntologyEnrichmentActiveTaxon(taxa[0].tid);\n }\n }, [taxa, activeTaxon, doSetOntologyEnrichmentActiveTaxon]);\n\n useEffect(() => {\n if (!activeTaxon) return;\n const t = ontologyEnrichment.byTaxon[activeTaxon];\n if (!t) return;\n if (t.fg.status === 'idle') doFetchOntologyEnrichmentForeground(activeTaxon);\n if (t.bg.status === 'idle') doFetchOntologyEnrichmentBackground(activeTaxon);\n }, [activeTaxon, ontologyEnrichment, doFetchOntologyEnrichmentForeground, doFetchOntologyEnrichmentBackground]);\n\n if (taxa.length === 0) {\n return <div className=\"oe-view\"><em>No species in the current results.</em></div>;\n }\n if (!grameneTaxonomy) {\n return <div className=\"oe-view\"><em>Loading taxonomy…</em></div>;\n }\n\n const handleAddFilter = (row) => {\n if (!doAcceptGrameneSuggestion) return;\n const label = row.term_name\n ? `${row.term_display_id} ${row.term_name}`\n : row.term_display_id;\n doAcceptGrameneSuggestion({\n fq_field: row.field,\n fq_value: String(row.term_id),\n name: label,\n category: row.ontology_label\n });\n };\n\n return (\n <div className=\"oe-view oe-layout\">\n <div className=\"oe-layout-tree\" style={{ flex: `0 0 ${treeWidth}px` }}>\n <SpeciesTree\n taxonomy={grameneTaxonomy}\n grameneMaps={grameneMaps}\n taxa={taxa}\n activeTaxon={activeTaxon}\n onSelect={tid => doSetOntologyEnrichmentActiveTaxon(String(tid))}\n />\n </div>\n <div\n className=\"oe-splitter\"\n onMouseDown={beginResize}\n title=\"Drag to resize\"\n />\n <div className=\"oe-layout-panel\">\n <TaxonPanel\n taxon={activeTaxon ? String(activeTaxon) : null}\n ontologyEnrichment={ontologyEnrichment}\n results={results}\n ui={ui}\n onUiChange={doSetOntologyEnrichmentUI}\n onAddFilter={handleAddFilter}\n />\n </div>\n </div>\n );\n};\n\nexport default connect(\n 'selectGrameneSearch',\n 'selectGrameneMaps',\n 'selectGrameneTaxonomy',\n 'selectOntologyEnrichment',\n 'selectOntologyEnrichmentUI',\n 'selectOntologyEnrichmentResults',\n 'doSetOntologyEnrichmentActiveTaxon',\n 'doSetOntologyEnrichmentUI',\n 'doFetchOntologyEnrichmentForeground',\n 'doFetchOntologyEnrichmentBackground',\n 'doAcceptGrameneSuggestion',\n OntologyEnrichmentViewCmp\n);\n","import React, { useMemo, useState } from 'react'\nimport { Button, Modal } from 'react-bootstrap'\nimport { connect } from \"redux-bundler-react\";\nimport { getFirebaseApp } from \"./utils\";\nimport { getAuth, onAuthStateChanged, signOut, GoogleAuthProvider, signInWithPopup } from \"firebase/auth\";\nimport { BsChevronDown, BsChevronRight } from 'react-icons/bs';\n\nconst provider = new GoogleAuthProvider();\n\nconst Auth = props => {\n const firebaseConfig = props.configuration && props.configuration.firebaseConfig;\n const auth = useMemo(() => {\n const app = getFirebaseApp(firebaseConfig);\n return app ? getAuth(app) : null;\n }, [firebaseConfig]);\n const [user, setUser] = useState({});\n const [open, setOpen] = useState(true);\n if (!auth) return null;\n onAuthStateChanged(auth, (user) => setUser(user));\n\n function handleLogin() {\n signInWithPopup(auth, provider)\n .then((result) => {\n setUser(result.user)\n }).catch((err) => {\n console.log(err)\n });\n }\n function handleLogout() {\n signOut(auth)\n .then(() => {\n setUser(null);\n }).catch((err) => {\n console.log(err)\n });\n }\n return (\n <div className={props.configuration.id === 'sorghum' ? 'sorghumbase-auth-container': 'gramene-auth-container'}>\n <div className=\"sidebar-section\">\n <div className=\"sidebar-section-header\" onClick={() => setOpen(!open)}>\n <b>Account</b>\n <span className=\"sidebar-section-actions\">\n <span className=\"sidebar-section-toggle\">\n {open ? <BsChevronDown/> : <BsChevronRight/>}\n </span>\n </span>\n </div>\n {open && <div className=\"sidebar-section-body\">\n <div>\n {user\n ? <Button size=\"sm\" variant=\"success\" onClick={handleLogout}>{user.displayName}</Button>\n : <Button size=\"sm\" variant=\"success\" onClick={handleLogin}>Login</Button>\n }\n </div>\n </div>}\n </div>\n </div>\n )\n}\n\nexport default connect(\n 'selectConfiguration',\n Auth\n)\n"],"names":[],"version":3,"file":"index.js.map"}
|