@sjcrh/proteinpaint-client 2.196.0 → 2.197.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/2dmaf-HV22W5N3.js +1373 -0
- package/dist/AIProjectAdmin-7QGTPN3B.js +958 -0
- package/dist/AppHeader-NOKET4YE.js +835 -0
- package/dist/BoxPlot-SPG66F4C.js +1217 -0
- package/dist/CorrelationVolcano-3LEMTFXP.js +619 -0
- package/dist/DE-WCCADMXA.js +95 -0
- package/dist/DEinput-IZNPYPKH.js +301 -0
- package/dist/DifferentialAnalysis-SDZXIUXP.js +242 -0
- package/dist/DifferentialAnalysis-SDZXIUXP.js.map +7 -0
- package/dist/Disco-M5RNUOWG.js +3297 -0
- package/dist/Disco.UI-RVUOPT6Y.js +249 -0
- package/dist/DmrPlot-R2N534FS.js +642 -0
- package/dist/GB-DY6XWOJE.js +1356 -0
- package/dist/GB-DY6XWOJE.js.map +7 -0
- package/dist/GSEA-3TB3PYEV.js +846 -0
- package/dist/GSEA-3TB3PYEV.js.map +7 -0
- package/dist/GeneExpInput-VWCPHOVO.js +367 -0
- package/dist/HicApp-F2MY3NXP.js +2250 -0
- package/dist/IDCViewer-PT7IV6T2.js +10799 -0
- package/dist/IDCViewer-PT7IV6T2.js.map +7 -0
- package/dist/NumBinaryEditor-AL2NWII2.js +271 -0
- package/dist/NumBinaryEditor.unit.spec-NFRJHFNX.js +286 -0
- package/dist/NumContEditor-CTFJVIHU.js +109 -0
- package/dist/NumContEditor.unit.spec-FXGGCMTD.js +169 -0
- package/dist/NumCustomBinEditor-JFIJ2X6E.js +38 -0
- package/dist/NumCustomBinEditor.unit.spec-ZKIZXS53.js +284 -0
- package/dist/NumDiscreteEditor-E7SPHF55.js +179 -0
- package/dist/NumDiscreteEditor.unit.spec-QKKRZJMU.js +202 -0
- package/dist/NumRegularBinEditor-JSLTZIAQ.js +38 -0
- package/dist/NumRegularBinEditor.unit.spec-W73BA6L4.js +227 -0
- package/dist/NumSplineEditor-ZEXYGKKF.js +198 -0
- package/dist/NumSplineEditor.unit.spec-EHKI4CY7.js +199 -0
- package/dist/NumericDensity-ZXM6TB33.js +38 -0
- package/dist/NumericDensity.unit.spec-PUFRE5XA.js +221 -0
- package/dist/NumericHandler-73TUDM3R.js +39 -0
- package/dist/NumericHandler.unit.spec-EITBD47U.js +219 -0
- package/dist/ProteomeInput-QICOUSRW.js +395 -0
- package/dist/ProteomeInput-QICOUSRW.js.map +7 -0
- package/dist/RunChart2-4JYV2Z7B.js +758 -0
- package/dist/SC-77HA6SBW.js +1120 -0
- package/dist/SC-77HA6SBW.js.map +7 -0
- package/dist/Volcano-3546I4MG.js +1385 -0
- package/dist/Volcano-3546I4MG.js.map +7 -0
- package/dist/WSIViewer-DQAXX7QJ.js +48562 -0
- package/dist/WsiSamplesPlot-AGOLPLK3.js +165 -0
- package/dist/adSandbox-ZE5QOTN5.js +38 -0
- package/dist/animatedBubbleChart-ILMDNAVK.js +555 -0
- package/dist/app-JBFRJ5OO.js +49 -0
- package/dist/app-YVNRAZWU.js +37 -0
- package/dist/app.js +16 -16
- package/dist/bam-A2PVAF3J.js +860 -0
- package/dist/barchart-2XQ7F6LT.js +47 -0
- package/dist/barchart.data-6XLK7D63.js +22 -0
- package/dist/barchart.events-DKJDKSPN.js +47 -0
- package/dist/barchart.integration.spec-UTTCQJRL.js +2196 -0
- package/dist/barchart2-2FRVUVJG.js +314 -0
- package/dist/block-3KOPYQ25.js +6255 -0
- package/dist/block-3KOPYQ25.js.map +7 -0
- package/dist/block.init-3KLLFGGV.js +38 -0
- package/dist/block.mds.expressionrank-XU3MBIOX.js +359 -0
- package/dist/block.mds.geneboxplot-VQTBL7T4.js +828 -0
- package/dist/block.mds.junction-IYWWRIJD.js +1545 -0
- package/dist/block.mds.svcnv-BMY5DCAM.js +6801 -0
- package/dist/block.svg-AT4GYQHX.js +164 -0
- package/dist/block.tk.aicheck-RANOFGDZ.js +283 -0
- package/dist/block.tk.ase-CBWJA3RN.js +365 -0
- package/dist/block.tk.bam-D7JBRNFQ.js +1906 -0
- package/dist/block.tk.bedgraphdot-IEHNIGVI.js +384 -0
- package/dist/block.tk.bigwig.ui-3SAXUJU4.js +212 -0
- package/dist/block.tk.hicstraw-R5EHQFGM.js +823 -0
- package/dist/block.tk.junction-JFCEXZZC.js +2364 -0
- package/dist/block.tk.junction.textmatrixui-4V7MV6TD.js +199 -0
- package/dist/block.tk.ld-LP4DIHAJ.js +99 -0
- package/dist/block.tk.menu-FTVZU2HA.js +1029 -0
- package/dist/block.tk.pgv-CRAMVKU4.js +944 -0
- package/dist/brainImaging-DXLK5XZ6.js +423 -0
- package/dist/brainRegions-AMSXQT3T.js +221 -0
- package/dist/bubbleHeatmap-SXBARILL.js +383 -0
- package/dist/chunk-23AEAG37.js +314 -0
- package/dist/chunk-23AEAG37.js.map +7 -0
- package/dist/chunk-2AHDWWQO.js +276 -0
- package/dist/chunk-2OJ577BB.js +299 -0
- package/dist/chunk-433DTQ6C.js +26 -0
- package/dist/chunk-46CPDZSW.js +617 -0
- package/dist/chunk-47EYZQA7.js +98 -0
- package/dist/chunk-4M22UIJQ.js +2327 -0
- package/dist/chunk-4YDERN37.js +194 -0
- package/dist/chunk-5ERYRSVV.js +1825 -0
- package/dist/chunk-6W6UMGAV.js +230 -0
- package/dist/chunk-6Z4XHMZV.js +54 -0
- package/dist/chunk-7P4DUYAQ.js +1245 -0
- package/dist/chunk-7P4DUYAQ.js.map +7 -0
- package/dist/chunk-7YWPWCHD.js +448 -0
- package/dist/chunk-7Z6E3NA5.js +787 -0
- package/dist/chunk-7Z6E3NA5.js.map +7 -0
- package/dist/chunk-AC3RAKUI.js +102 -0
- package/dist/chunk-BSOB3BVG.js +217 -0
- package/dist/chunk-CJJA6RVM.js +254 -0
- package/dist/chunk-CUXOQIUA.js +1102 -0
- package/dist/chunk-D5ZYSW45.js +216 -0
- package/dist/chunk-DA6RR5IR.js +170 -0
- package/dist/chunk-DD6KDZVR.js +302 -0
- package/dist/chunk-DI5ULDWN.js +54 -0
- package/dist/chunk-DXM5IMGV.js +446 -0
- package/dist/chunk-FYY3T565.js +188 -0
- package/dist/chunk-FYY3T565.js.map +7 -0
- package/dist/chunk-GFETCJ7S.js +176 -0
- package/dist/chunk-H42SJNXA.js +1535 -0
- package/dist/chunk-H42SJNXA.js.map +7 -0
- package/dist/chunk-HCNF7EFT.js +292 -0
- package/dist/chunk-I62GOCNI.js +31 -0
- package/dist/chunk-IBYOP2FV.js +2833 -0
- package/dist/chunk-JD2ECQ3Z.js +2681 -0
- package/dist/chunk-JF47NF5G.js +236 -0
- package/dist/chunk-JHZK6IDA.js +20904 -0
- package/dist/chunk-JHZK6IDA.js.map +7 -0
- package/dist/chunk-JOA4KJTM.js +222 -0
- package/dist/chunk-JT7HC65V.js +556 -0
- package/dist/chunk-JT7HC65V.js.map +7 -0
- package/dist/chunk-K6AW4GFM.js +37 -0
- package/dist/chunk-K7QY24X2.js +1223 -0
- package/dist/chunk-K7QY24X2.js.map +7 -0
- package/dist/chunk-KOLVLBMI.js +100 -0
- package/dist/chunk-KQ6EF3FG.js +448 -0
- package/dist/chunk-KTKZSYIH.js +24 -0
- package/dist/chunk-KTKZSYIH.js.map +7 -0
- package/dist/chunk-LBWKMNVU.js +129 -0
- package/dist/chunk-LFGIMCUD.js +55 -0
- package/dist/chunk-LKB3DITY.js +343 -0
- package/dist/chunk-M2PPUO4E.js +315 -0
- package/dist/chunk-M2PPUO4E.js.map +7 -0
- package/dist/chunk-MCXQL4W2.js +226 -0
- package/dist/chunk-MLYSQG3C.js +833 -0
- package/dist/chunk-MYZJUT2H.js +272 -0
- package/dist/chunk-NOCLG6IN.js +5070 -0
- package/dist/chunk-NOCLG6IN.js.map +7 -0
- package/dist/chunk-NVRLD4TF.js +2786 -0
- package/dist/chunk-NZCX4A7X.js +14 -0
- package/dist/chunk-OVHCUTQM.js +102 -0
- package/dist/chunk-P3NKHTNT.js +34 -0
- package/dist/chunk-PFOCEOVT.js +477 -0
- package/dist/chunk-PJSOYF5U.js +158 -0
- package/dist/chunk-PK5HXJ3S.js +272 -0
- package/dist/chunk-Q555GFBW.js +1942 -0
- package/dist/chunk-Q555GFBW.js.map +7 -0
- package/dist/chunk-QAVZUWY3.js +399 -0
- package/dist/chunk-QOAUM6UV.js +148 -0
- package/dist/chunk-QOEPKNVD.js +185 -0
- package/dist/chunk-QOEPKNVD.js.map +7 -0
- package/dist/chunk-QXPJLSAD.js +4284 -0
- package/dist/chunk-QZLP27O6.js +50 -0
- package/dist/chunk-SENZWOCC.js +203 -0
- package/dist/chunk-SFIX7XVT.js +514 -0
- package/dist/chunk-SJWAMUL5.js +117 -0
- package/dist/chunk-U3CMLIGB.js +6364 -0
- package/dist/chunk-UF6ZP6UR.js +381 -0
- package/dist/chunk-UVWUP6N7.js +1275 -0
- package/dist/chunk-UYEJ5DEZ.js +142 -0
- package/dist/chunk-V2ET64EJ.js +119 -0
- package/dist/chunk-WQEGWR63.js +102 -0
- package/dist/chunk-WYSEBR5S.js +58 -0
- package/dist/chunk-XB6F5OUB.js +386 -0
- package/dist/chunk-XVYSEXFV.js +368 -0
- package/dist/chunk-YGKVY5IU.js +480 -0
- package/dist/chunk-ZPXSPJV2.js +263 -0
- package/dist/chunk-ZRSJVACE.js +1500 -0
- package/dist/chunk-ZRSJVACE.js.map +7 -0
- package/dist/condition-YCPNILTV.js +332 -0
- package/dist/controls-RW5MWSLN.js +41 -0
- package/dist/controls.config-MP3CSYR4.js +39 -0
- package/dist/correlation-7AQRU4YR.js +102 -0
- package/dist/cuminc-WYLKIOXR.js +1149 -0
- package/dist/cuminc.integration.spec-MSAWDLD7.js +678 -0
- package/dist/cuminc.integration.spec-MSAWDLD7.js.map +7 -0
- package/dist/customdata.inputui-YU4IQJOV.js +289 -0
- package/dist/dataDownload-72DIPZ45.js +330 -0
- package/dist/dataDownload.integration.spec-HRLMWQN7.js +193 -0
- package/dist/databrowser.ui-3PE25HK4.js +433 -0
- package/dist/dictionary-Y3ICL4AE.js +118 -0
- package/dist/dnaMethylation-SVGDW64U.js +38 -0
- package/dist/dnaMethylation.integration.spec-B7GLAFZI.js +203 -0
- package/dist/dofetch-42KOXNPF.js +51 -0
- package/dist/e2pca-CLFGEFJH.js +350 -0
- package/dist/ep-PUHV2DMO.js +1256 -0
- package/dist/expclust.gdc.spec-N7YDJAOZ.js +307 -0
- package/dist/facet-JFFJJCNT.js +521 -0
- package/dist/forms2-XZAWW3RN.js +539 -0
- package/dist/gb-SQJ5PWOH.js +88 -0
- package/dist/geneExpClustering-EG2BLMQX.js +249 -0
- package/dist/geneExpression-J42BGP3B.js +38 -0
- package/dist/geneExpression-QRK3LNMV.js +313 -0
- package/dist/geneExpression.unit.spec-X7HVIFZA.js +102 -0
- package/dist/geneORA-SVBPO66K.js +278 -0
- package/dist/geneRanking-HNMMLZIX.js +553 -0
- package/dist/geneVariant-RVQKNVQO.js +39 -0
- package/dist/geneVariant-SO5FEJUZ.js +41 -0
- package/dist/geneVariant.integration.spec-DOMX4GMP.js +198 -0
- package/dist/genefusion.ui-QS7AG46F.js +309 -0
- package/dist/geneset-JKOX3VIW.js +208 -0
- package/dist/genomeBrowser.spec-IRSTT2OX.js +281 -0
- package/dist/grin2-G6DA4M7Q.js +1095 -0
- package/dist/grin2-G6DA4M7Q.js.map +7 -0
- package/dist/grin2-VZLCISPM.js +75 -0
- package/dist/hierCluster-6AW23EB5.js +63 -0
- package/dist/hierCluster-REXTCODR.js +59 -0
- package/dist/hierCluster.config-3Z3R66XH.js +40 -0
- package/dist/hierCluster.integration.spec-XE47Q64Z.js +488 -0
- package/dist/hierCluster.interactivity-2YJYYKVK.js +54 -0
- package/dist/hierCluster.renderers-LE7W2AL6.js +21 -0
- package/dist/imagePlot-WMZJJ5CJ.js +163 -0
- package/dist/importPlot-P35EGIJJ.js +8 -0
- package/dist/isoformExpression-3TFPEXB4.js +40 -0
- package/dist/isoformExpression.unit.spec-SPQFK3EA.js +208 -0
- package/dist/launch.adhoc-ZQSJBLMJ.js +42 -0
- package/dist/leftlabel.sample-SJRQ6LJ2.js +264 -0
- package/dist/lollipop-RXM6UBZ7.js +171 -0
- package/dist/maf-NWXJWBNF.js +459 -0
- package/dist/maftimeline-D7UENAP5.js +593 -0
- package/dist/matrix-77LNADX2.js +63 -0
- package/dist/matrix-YDOLKY6G.js +58 -0
- package/dist/matrix.cells-VEC5LEWV.js +28 -0
- package/dist/matrix.config-GTAAAUGQ.js +41 -0
- package/dist/matrix.data-T4GEX6ZH.js +25 -0
- package/dist/matrix.groups-7NWHHP5Q.js +27 -0
- package/dist/matrix.integration.spec-5GBTFRZA.js +3072 -0
- package/dist/matrix.integration.spec-5GBTFRZA.js.map +7 -0
- package/dist/matrix.interactivity-ONT6WCRU.js +42 -0
- package/dist/matrix.layout-LDXHGOHF.js +44 -0
- package/dist/matrix.legend-5MDW65HV.js +22 -0
- package/dist/matrix.renderers-OEPLQG3C.js +38 -0
- package/dist/matrix.serieses-4RX7TUQ7.js +21 -0
- package/dist/matrix.sort-UKMMECBZ.js +27 -0
- package/dist/matrix.sort.unit.spec-VWOXPVRE.js +472 -0
- package/dist/matrix.sorterUi-H64DDQIL.js +18 -0
- package/dist/matrix.sorterUi.unit.spec-DH4434FK.js +342 -0
- package/dist/mavb-ARUWOZES.js +732 -0
- package/dist/mds.fimo-ZEAE5BC3.js +518 -0
- package/dist/mds.samplescatterplot-C5EBKBVF.js +1550 -0
- package/dist/mds.survivalplot-RS7Z3J3Q.js +483 -0
- package/dist/numericDictTermCluster-CSQOV4TM.js +65 -0
- package/dist/oncomatrix-5UVM3KUA.js +295 -0
- package/dist/oncomatrix.spec-CU3EZCMO.js +448 -0
- package/dist/plot.2dvaf-JD27DSDS.js +377 -0
- package/dist/plot.app-NMPMG3S2.js +41 -0
- package/dist/plot.barplot-T4LPKFXW.js +102 -0
- package/dist/plot.boxplot-22ETOHNI.js +152 -0
- package/dist/plot.brainImaging-Q7S7KSHW.js +51 -0
- package/dist/plot.disco-NIPBER5N.js +102 -0
- package/dist/plot.dzi-DAX7GUTF.js +33 -0
- package/dist/plot.ssgq-7J6S35RW.js +139 -0
- package/dist/plot.vaf2cov-7EWFTD72.js +259 -0
- package/dist/plot.wsi-E45KZGKD.js +36 -0
- package/dist/polar2-LPT2XMD2.js +231 -0
- package/dist/profileForms-EYN2KLSY.js +446 -0
- package/dist/profilePlot-I7VQM3CH.js +54 -0
- package/dist/proteinView-JP5TF3ZK.js +1568 -0
- package/dist/qualitative-7X3ECW7Q.js +43 -0
- package/dist/radar2-V3FYBFAG.js +326 -0
- package/dist/radarFacility2-O6GQLBBN.js +334 -0
- package/dist/regression-CLG6NYVF.js +56 -0
- package/dist/regression.inputs-RLOBIRJH.js +48 -0
- package/dist/regression.inputs.term-ZKIP6KDO.js +48 -0
- package/dist/regression.inputs.values.table-2VD4AO5T.js +45 -0
- package/dist/regression.integration.spec-JEIMN7MS.js +784 -0
- package/dist/regression.results-FT6VSWGR.js +40 -0
- package/dist/regression.spec-V4S52JQM.js +708 -0
- package/dist/report-UPQFSI4D.js +222 -0
- package/dist/sampleScatter.spec-QSRF3STG.js +202 -0
- package/dist/sampleView-JIGZ7GTP.js +48 -0
- package/dist/samplelst-VJMYHVXI.js +111 -0
- package/dist/samplematrix-LO4QB37V.js +2198 -0
- package/dist/sc-4VZBGFZP.js +86 -0
- package/dist/scatter-LQECXZLB.js +851 -0
- package/dist/selectGenomeWithTklst-IJTCLRIN.js +134 -0
- package/dist/singleCellCellType-FJ53DRXD.js +38 -0
- package/dist/singleCellCellType.unit.spec-VOE4KY6L.js +160 -0
- package/dist/singleCellGeneExpression-RZE5UVL4.js +38 -0
- package/dist/singleCellGeneExpression.unit.spec-2DASF7PD.js +153 -0
- package/dist/singleCellPlot-Q5UNIW3M.js +54 -0
- package/dist/singlecell-N7F5KVIB.js +1572 -0
- package/dist/singlecell-TX5AQ4WM.js +86 -0
- package/dist/snp-S4O7SVDD.js +38 -0
- package/dist/snp.unit.spec-WSQMZSTE.js +176 -0
- package/dist/snplocus-Y2R5C4ZP.js +208 -0
- package/dist/spliceevent.a53ss.diagram-FGRQR73W.js +151 -0
- package/dist/spliceevent.exonskip.diagram-TVH44RNL.js +277 -0
- package/dist/spliceevent.noeventdiagram-G2CMYYE7.js +460 -0
- package/dist/ssGSEA-BH53XGEZ.js +38 -0
- package/dist/ssGSEA.unit.spec-BYIVB7FZ.js +88 -0
- package/dist/summarizeCnvGeneexp-IZNOX4E7.js +163 -0
- package/dist/summarizeGeneexpSurvival-DJZ2R24E.js +114 -0
- package/dist/summarizeMutationCnv-CO2TVWOI.js +164 -0
- package/dist/summarizeMutationDiagnosis-EUZXCSZP.js +40 -0
- package/dist/summarizeMutationSurvival-CXFT3HWL.js +99 -0
- package/dist/summary-JHZCDE35.js +49 -0
- package/dist/summary.integration.spec-WBEYSDCA.js +414 -0
- package/dist/summaryInput-JVH3R54R.js +235 -0
- package/dist/sunburst-CTJTXHSA.js +284 -0
- package/dist/survival-DLLVUG2P.js +46 -0
- package/dist/survival-XFVYNI6S.js +58 -0
- package/dist/survival.integration.spec-KVXHHAA3.js +915 -0
- package/dist/survival.integration.spec-KVXHHAA3.js.map +7 -0
- package/dist/svgraph-ACEBMDIX.js +1387 -0
- package/dist/svmr-IQEDSZ2C.js +3842 -0
- package/dist/table-2IF6UGHR.js +200 -0
- package/dist/termCollection-JOLQJYJ3.js +38 -0
- package/dist/termCollection-PSXFFR32.js +179 -0
- package/dist/termCollection.unit.spec-4SOZP4FY.js +208 -0
- package/dist/tk-AAIHEQO6.js +46 -0
- package/dist/tk-IRXFL5NV.js +997 -0
- package/dist/tk-IRXFL5NV.js.map +7 -0
- package/dist/tp.ui-6STLQEXX.js +1459 -0
- package/dist/tvs.dt-FSA7KPSQ.js +39 -0
- package/dist/tvs.dtcnv.categorical-FSPGH7DP.js +40 -0
- package/dist/tvs.dtcnv.continuous-T4ZMSDB4.js +72 -0
- package/dist/tvs.dtfusion-UL3YENUM.js +40 -0
- package/dist/tvs.dtitd-XJOSZUWG.js +40 -0
- package/dist/tvs.dtitd-XJOSZUWG.js.map +7 -0
- package/dist/tvs.dtsnvindel-5TPUT5RJ.js +40 -0
- package/dist/tvs.dtsv-OTNHXYOJ.js +40 -0
- package/dist/tvs.samplelst-FQKTAQZF.js +104 -0
- package/dist/tvs.termCollection-ZAPCUMUW.js +159 -0
- package/dist/violin-HEFFKPL5.js +46 -0
- package/dist/violin.integration.spec-774N4G5A.js +1425 -0
- package/dist/violin.interactivity-XNYJSK53.js +38 -0
- package/dist/violin.renderer-R74VSGRC.js +40 -0
- package/dist/vocabulary-OHMC6NWL.js +41 -0
- package/package.json +3 -3
- package/dist/2dmaf-SKNV7IHT.js +0 -1373
- package/dist/AIProjectAdmin-AOTVRBNH.js +0 -958
- package/dist/AppHeader-M2ZSS3M3.js +0 -835
- package/dist/BoxPlot-P3EECSQA.js +0 -1217
- package/dist/CorrelationVolcano-YCQ5S6MT.js +0 -619
- package/dist/DE-RBMOQZCR.js +0 -95
- package/dist/DEinput-PTW6RS6U.js +0 -301
- package/dist/DifferentialAnalysis-M6IDWPYX.js +0 -245
- package/dist/DifferentialAnalysis-M6IDWPYX.js.map +0 -7
- package/dist/Disco-GUKDAHUY.js +0 -3297
- package/dist/Disco.UI-YBIMV7RH.js +0 -249
- package/dist/DmrPlot-JQPLLU6P.js +0 -642
- package/dist/GB-UOTFNVJE.js +0 -1353
- package/dist/GB-UOTFNVJE.js.map +0 -7
- package/dist/GeneExpInput-3OPDDCXR.js +0 -367
- package/dist/HicApp-VFOWRP6G.js +0 -2250
- package/dist/IDCViewer-Y7EOIIBG.js +0 -10455
- package/dist/IDCViewer-Y7EOIIBG.js.map +0 -7
- package/dist/NumBinaryEditor-RL44SO3T.js +0 -271
- package/dist/NumBinaryEditor.unit.spec-P73PGAX5.js +0 -286
- package/dist/NumContEditor-MIC7M73G.js +0 -109
- package/dist/NumContEditor.unit.spec-5XZH7OCG.js +0 -169
- package/dist/NumCustomBinEditor-W357XTIR.js +0 -38
- package/dist/NumCustomBinEditor.unit.spec-CJMK4CYW.js +0 -284
- package/dist/NumDiscreteEditor-PRSUMS3I.js +0 -179
- package/dist/NumDiscreteEditor.unit.spec-A6R56P3Z.js +0 -202
- package/dist/NumRegularBinEditor-7OHUEUCC.js +0 -38
- package/dist/NumRegularBinEditor.unit.spec-NOAX42UZ.js +0 -227
- package/dist/NumSplineEditor-XI7AT5LM.js +0 -198
- package/dist/NumSplineEditor.unit.spec-ZH4M2N2C.js +0 -199
- package/dist/NumericDensity-X6IHQAW3.js +0 -38
- package/dist/NumericDensity.unit.spec-EKVD4AUG.js +0 -221
- package/dist/NumericHandler-5ONBWFJ5.js +0 -39
- package/dist/NumericHandler.unit.spec-SHI6E4VA.js +0 -219
- package/dist/ProteomeInput-HN46MIBP.js +0 -396
- package/dist/ProteomeInput-HN46MIBP.js.map +0 -7
- package/dist/RunChart2-Y6IY6MW2.js +0 -758
- package/dist/SC-JYF564FK.js +0 -1130
- package/dist/SC-JYF564FK.js.map +0 -7
- package/dist/Volcano-WZGAUYGY.js +0 -1380
- package/dist/Volcano-WZGAUYGY.js.map +0 -7
- package/dist/WSIViewer-RLLL7MAL.js +0 -48562
- package/dist/WsiSamplesPlot-FU3TCOTY.js +0 -165
- package/dist/adSandbox-ZINST5DE.js +0 -38
- package/dist/animatedBubbleChart-PIQWCVBJ.js +0 -555
- package/dist/app-N42SVGI2.js +0 -37
- package/dist/app-RWN4XLCP.js +0 -49
- package/dist/bam-QTSTXJ4N.js +0 -860
- package/dist/barchart-27BYTRVI.js +0 -47
- package/dist/barchart.data-OUNVH4JU.js +0 -22
- package/dist/barchart.events-PY4CEDSO.js +0 -47
- package/dist/barchart.integration.spec-H4WGHQ7R.js +0 -2196
- package/dist/barchart2-TIOTRAC2.js +0 -314
- package/dist/block-YPM767A4.js +0 -6226
- package/dist/block-YPM767A4.js.map +0 -7
- package/dist/block.init-LRZ3QAGC.js +0 -38
- package/dist/block.mds.expressionrank-IV7JLC52.js +0 -359
- package/dist/block.mds.geneboxplot-IBCE5XZU.js +0 -828
- package/dist/block.mds.junction-ISSCJHNF.js +0 -1545
- package/dist/block.mds.svcnv-ZEBVBTL7.js +0 -6801
- package/dist/block.svg-FYWA5VYH.js +0 -164
- package/dist/block.tk.aicheck-AD6DTKXR.js +0 -283
- package/dist/block.tk.ase-LO2J4KRE.js +0 -365
- package/dist/block.tk.bam-XGX22FCN.js +0 -1906
- package/dist/block.tk.bedgraphdot-SUIRFNFL.js +0 -384
- package/dist/block.tk.bigwig.ui-2Q7FAK3V.js +0 -212
- package/dist/block.tk.hicstraw-4MVP2PCL.js +0 -823
- package/dist/block.tk.junction-F54FTEPB.js +0 -2364
- package/dist/block.tk.junction.textmatrixui-ETROZJVK.js +0 -199
- package/dist/block.tk.ld-NJEDKSTU.js +0 -99
- package/dist/block.tk.menu-LZOY4FKT.js +0 -1029
- package/dist/block.tk.pgv-I3XHJ7VU.js +0 -944
- package/dist/brainImaging-BGP6VRFV.js +0 -423
- package/dist/brainRegions-AAN7LM2Y.js +0 -221
- package/dist/bubbleHeatmap-HNEU4CYA.js +0 -383
- package/dist/chunk-25XCVML7.js +0 -236
- package/dist/chunk-2XV6U42J.js +0 -100
- package/dist/chunk-36NAWXQ7.js +0 -5067
- package/dist/chunk-36NAWXQ7.js.map +0 -7
- package/dist/chunk-3LYZMOLO.js +0 -58
- package/dist/chunk-427UL37G.js +0 -222
- package/dist/chunk-4C3XRI6J.js +0 -54
- package/dist/chunk-4O6H4ZHL.js +0 -514
- package/dist/chunk-53JJ7SXN.js +0 -276
- package/dist/chunk-5CR24RTX.js +0 -381
- package/dist/chunk-5HMX4NUJ.js +0 -217
- package/dist/chunk-5QTJUPFS.js +0 -26
- package/dist/chunk-5V2BMEAS.js +0 -55
- package/dist/chunk-6MBTPVIM.js +0 -1275
- package/dist/chunk-6MQWYMPB.js +0 -183
- package/dist/chunk-6MQWYMPB.js.map +0 -7
- package/dist/chunk-7D3WX34I.js +0 -1230
- package/dist/chunk-7D3WX34I.js.map +0 -7
- package/dist/chunk-7FSIZZOX.js +0 -176
- package/dist/chunk-7KRS7L4U.js +0 -1443
- package/dist/chunk-7KRS7L4U.js.map +0 -7
- package/dist/chunk-A3URBFXN.js +0 -119
- package/dist/chunk-A45KH7LP.js +0 -254
- package/dist/chunk-B4GS7OLB.js +0 -4284
- package/dist/chunk-BWQV2OBL.js +0 -102
- package/dist/chunk-BXGQXLHP.js +0 -2786
- package/dist/chunk-CDJAHMAN.js +0 -299
- package/dist/chunk-CXHLROWX.js +0 -37
- package/dist/chunk-EKKQMKQI.js +0 -102
- package/dist/chunk-EPWIJEMK.js +0 -158
- package/dist/chunk-F7Y67LK7.js +0 -230
- package/dist/chunk-FDBVAL6K.js +0 -14
- package/dist/chunk-FISP5YN2.js +0 -292
- package/dist/chunk-G3FSS7GR.js +0 -477
- package/dist/chunk-GE4NJDV4.js +0 -98
- package/dist/chunk-GYGU4UT5.js +0 -34
- package/dist/chunk-I5IPJG2R.js +0 -148
- package/dist/chunk-I73KUUYG.js +0 -287
- package/dist/chunk-I73KUUYG.js.map +0 -7
- package/dist/chunk-IFK24IXL.js +0 -194
- package/dist/chunk-ILE6ML2D.js +0 -50
- package/dist/chunk-IRKP6IZ4.js +0 -216
- package/dist/chunk-J6ZOUCWN.js +0 -170
- package/dist/chunk-JFRSVFWO.js +0 -736
- package/dist/chunk-JFRSVFWO.js.map +0 -7
- package/dist/chunk-JNBJG57F.js +0 -448
- package/dist/chunk-K5UVG3FQ.js +0 -117
- package/dist/chunk-KE5B34CS.js +0 -102
- package/dist/chunk-L6A2BEXB.js +0 -2681
- package/dist/chunk-LSWU6EAQ.js +0 -31
- package/dist/chunk-LWEGSYDD.js +0 -226
- package/dist/chunk-LYVLF6HO.js +0 -1825
- package/dist/chunk-MBUQ34CF.js +0 -189
- package/dist/chunk-MBUQ34CF.js.map +0 -7
- package/dist/chunk-MN3KDNHC.js +0 -617
- package/dist/chunk-MTHEEXT2.js +0 -1450
- package/dist/chunk-MTHEEXT2.js.map +0 -7
- package/dist/chunk-MTZSN3H4.js +0 -302
- package/dist/chunk-N7O7NPUO.js +0 -534
- package/dist/chunk-N7O7NPUO.js.map +0 -7
- package/dist/chunk-NNFAUP2I.js +0 -315
- package/dist/chunk-NNFAUP2I.js.map +0 -7
- package/dist/chunk-OF5FE6GT.js +0 -142
- package/dist/chunk-OVSKJROY.js +0 -815
- package/dist/chunk-OVSKJROY.js.map +0 -7
- package/dist/chunk-PJ3FCJBZ.js +0 -480
- package/dist/chunk-PU2Q4SZR.js +0 -2327
- package/dist/chunk-PZPS56Z6.js +0 -343
- package/dist/chunk-QKR3ZD3S.js +0 -833
- package/dist/chunk-QMXCK4Y5.js +0 -203
- package/dist/chunk-ROJ3LJLE.js +0 -448
- package/dist/chunk-SLHWUFAW.js +0 -1943
- package/dist/chunk-SLHWUFAW.js.map +0 -7
- package/dist/chunk-U3G4JGKJ.js +0 -54
- package/dist/chunk-VDZ5QOF6.js +0 -446
- package/dist/chunk-VO5XZ2EG.js +0 -129
- package/dist/chunk-VRH7NP6R.js +0 -263
- package/dist/chunk-VTMJGRT5.js +0 -272
- package/dist/chunk-W5X6C7LY.js +0 -399
- package/dist/chunk-WJGUNGFK.js +0 -272
- package/dist/chunk-WKT46ZJ6.js +0 -368
- package/dist/chunk-WQCQWUUP.js +0 -2833
- package/dist/chunk-WY2PGUVX.js +0 -20898
- package/dist/chunk-WY2PGUVX.js.map +0 -7
- package/dist/chunk-WZ2U5QXJ.js +0 -6364
- package/dist/chunk-WZUWK5Q6.js +0 -1102
- package/dist/chunk-XPMTUVSS.js +0 -1220
- package/dist/chunk-XPMTUVSS.js.map +0 -7
- package/dist/chunk-YYFQPGIE.js +0 -386
- package/dist/condition-GVIEMQG7.js +0 -332
- package/dist/controls-73K3XBDR.js +0 -41
- package/dist/controls.config-FQKY2LRE.js +0 -39
- package/dist/correlation-AOAXIUFJ.js +0 -102
- package/dist/cuminc-OD2PPCEK.js +0 -1149
- package/dist/cuminc.integration.spec-TMIFW7EO.js +0 -678
- package/dist/cuminc.integration.spec-TMIFW7EO.js.map +0 -7
- package/dist/customdata.inputui-SWLGLATL.js +0 -289
- package/dist/dataDownload-456HL2OE.js +0 -330
- package/dist/dataDownload.integration.spec-5YS4MWK5.js +0 -193
- package/dist/databrowser.ui-7APC5MNM.js +0 -433
- package/dist/dictionary-A3HA5MVK.js +0 -118
- package/dist/dnaMethylation-6ONBKARD.js +0 -38
- package/dist/dnaMethylation.integration.spec-T3WEGVX3.js +0 -203
- package/dist/dofetch-RVPQUMVX.js +0 -51
- package/dist/e2pca-75WZ46XG.js +0 -350
- package/dist/ep-QG5CWPTW.js +0 -1256
- package/dist/expclust.gdc.spec-KBBQJR4M.js +0 -307
- package/dist/facet-QGB2Q7YV.js +0 -521
- package/dist/forms2-CJGDCWYH.js +0 -539
- package/dist/gb-NEFAHKQI.js +0 -88
- package/dist/geneExpClustering-ZVR44UZC.js +0 -249
- package/dist/geneExpression-25EX4DFK.js +0 -313
- package/dist/geneExpression-FALOA4GC.js +0 -38
- package/dist/geneExpression.unit.spec-BQLELQUS.js +0 -102
- package/dist/geneORA-K2B7JYWD.js +0 -278
- package/dist/geneRanking-6AXL5ZJS.js +0 -553
- package/dist/geneVariant-RZFDP5J5.js +0 -41
- package/dist/geneVariant-UIBZ5UIQ.js +0 -39
- package/dist/geneVariant.integration.spec-4EZQMPQB.js +0 -198
- package/dist/genefusion.ui-YK4TNS2P.js +0 -309
- package/dist/geneset-47J4D5ID.js +0 -208
- package/dist/genomeBrowser.spec-LFFWRIWG.js +0 -281
- package/dist/grin2-DQB2WW3C.js +0 -75
- package/dist/grin2-TZFU4JM3.js +0 -1078
- package/dist/grin2-TZFU4JM3.js.map +0 -7
- package/dist/gsea-KKLAMLMG.js +0 -47
- package/dist/hierCluster-3MZEJG6B.js +0 -59
- package/dist/hierCluster-YGBC4XCZ.js +0 -63
- package/dist/hierCluster.config-A4N54K3A.js +0 -40
- package/dist/hierCluster.integration.spec-GLKXFZDM.js +0 -488
- package/dist/hierCluster.interactivity-4TPWGIVC.js +0 -54
- package/dist/hierCluster.renderers-WUWSXXHU.js +0 -21
- package/dist/imagePlot-JRPYOV3Q.js +0 -163
- package/dist/importPlot-A3PFUP6K.js +0 -8
- package/dist/isoformExpression-5L4O3WKL.js +0 -40
- package/dist/isoformExpression.unit.spec-SLB6XIX4.js +0 -208
- package/dist/launch.adhoc-QI7TPYSC.js +0 -42
- package/dist/leftlabel.sample-OSIRTJFW.js +0 -264
- package/dist/lollipop-LAELXNQY.js +0 -171
- package/dist/maf-HZAYVZFO.js +0 -459
- package/dist/maftimeline-BLBNUGAL.js +0 -593
- package/dist/matrix-LVJSHXDM.js +0 -58
- package/dist/matrix-S5QQV4JU.js +0 -63
- package/dist/matrix.cells-JUTRYPG4.js +0 -28
- package/dist/matrix.config-ZTWWYNIZ.js +0 -41
- package/dist/matrix.data-BREYB54F.js +0 -25
- package/dist/matrix.groups-WMHTLOXC.js +0 -27
- package/dist/matrix.integration.spec-S6FIEE2X.js +0 -3072
- package/dist/matrix.integration.spec-S6FIEE2X.js.map +0 -7
- package/dist/matrix.interactivity-TMBVAM5M.js +0 -42
- package/dist/matrix.layout-POK5NOUV.js +0 -44
- package/dist/matrix.legend-6XVQ67AC.js +0 -22
- package/dist/matrix.renderers-G5FQZZ73.js +0 -38
- package/dist/matrix.serieses-XNLQSQS6.js +0 -21
- package/dist/matrix.sort-XNES23OQ.js +0 -27
- package/dist/matrix.sort.unit.spec-65BDBQUV.js +0 -472
- package/dist/matrix.sorterUi-WC2YX7S7.js +0 -18
- package/dist/matrix.sorterUi.unit.spec-GZQBW7F7.js +0 -342
- package/dist/mavb-T2UCRWWM.js +0 -732
- package/dist/mds.fimo-65UUK7ER.js +0 -518
- package/dist/mds.samplescatterplot-4NHGQBJF.js +0 -1550
- package/dist/mds.survivalplot-WVAHDM3Z.js +0 -483
- package/dist/numericDictTermCluster-CXASCSQ6.js +0 -65
- package/dist/oncomatrix-5WMOICWR.js +0 -295
- package/dist/oncomatrix.spec-POVBNFJR.js +0 -448
- package/dist/plot.2dvaf-63K5RSIU.js +0 -377
- package/dist/plot.app-V5IY25QS.js +0 -41
- package/dist/plot.barplot-IQTYHNFE.js +0 -102
- package/dist/plot.boxplot-2RMTO7AS.js +0 -152
- package/dist/plot.brainImaging-DLUHAHHG.js +0 -51
- package/dist/plot.disco-WK6GDLNF.js +0 -102
- package/dist/plot.dzi-3V3FWE7U.js +0 -33
- package/dist/plot.ssgq-TENK2RP4.js +0 -139
- package/dist/plot.vaf2cov-P2QOOZGZ.js +0 -259
- package/dist/plot.wsi-BVRGJF4E.js +0 -36
- package/dist/polar2-NNOZOQQJ.js +0 -231
- package/dist/profileForms-RS4GEZZV.js +0 -446
- package/dist/profilePlot-3DLME3NH.js +0 -54
- package/dist/proteinView-NPKJAQAI.js +0 -1568
- package/dist/qualitative-S45RXXRJ.js +0 -43
- package/dist/radar2-EX7YBNMT.js +0 -326
- package/dist/radarFacility2-WU5O6O77.js +0 -334
- package/dist/regression-7MCOYJVD.js +0 -56
- package/dist/regression.inputs-QHSWJ23R.js +0 -48
- package/dist/regression.inputs.term-EJ4Z5Q5O.js +0 -48
- package/dist/regression.inputs.values.table-YKMAWNXN.js +0 -45
- package/dist/regression.integration.spec-XOX7OXXA.js +0 -784
- package/dist/regression.results-YKPOTPCC.js +0 -40
- package/dist/regression.spec-YIIY2AZA.js +0 -708
- package/dist/report-JEJFCWUU.js +0 -222
- package/dist/sampleScatter.spec-LBAZBDYA.js +0 -202
- package/dist/sampleView-WKZT5ZFE.js +0 -48
- package/dist/samplelst-HXM3H6M4.js +0 -111
- package/dist/samplematrix-LCGHK2EK.js +0 -2198
- package/dist/sc-3OE2G4BU.js +0 -86
- package/dist/scatter-AGVUDTTU.js +0 -851
- package/dist/selectGenomeWithTklst-WF2XZ6GH.js +0 -134
- package/dist/singleCellCellType-2SRGROMS.js +0 -38
- package/dist/singleCellCellType.unit.spec-DCGHNRJI.js +0 -160
- package/dist/singleCellGeneExpression-RASZA4NO.js +0 -38
- package/dist/singleCellGeneExpression.unit.spec-5MRGH2OO.js +0 -153
- package/dist/singleCellPlot-TIYA3GNM.js +0 -54
- package/dist/singlecell-CFA43TTU.js +0 -1572
- package/dist/singlecell-JS5SIZHY.js +0 -86
- package/dist/snp-VXZXPMKS.js +0 -38
- package/dist/snp.unit.spec-TR5TCO7X.js +0 -176
- package/dist/snplocus-VLPH5Y65.js +0 -208
- package/dist/spliceevent.a53ss.diagram-PATK67SH.js +0 -151
- package/dist/spliceevent.exonskip.diagram-7B3SEOAJ.js +0 -277
- package/dist/spliceevent.noeventdiagram-4NPNZUEN.js +0 -460
- package/dist/ssGSEA-XMW5BLAU.js +0 -38
- package/dist/ssGSEA.unit.spec-ASUWKVUT.js +0 -88
- package/dist/summarizeCnvGeneexp-KWRFGX32.js +0 -163
- package/dist/summarizeGeneexpSurvival-FIPIMEJR.js +0 -114
- package/dist/summarizeMutationCnv-IUYRVLZG.js +0 -164
- package/dist/summarizeMutationDiagnosis-ZFJPCABL.js +0 -40
- package/dist/summarizeMutationSurvival-HFHYB7DT.js +0 -99
- package/dist/summary-AZUNEZ5I.js +0 -49
- package/dist/summary.integration.spec-WLBAJL44.js +0 -414
- package/dist/summaryInput-NJWVXDXW.js +0 -235
- package/dist/sunburst-PXGF4WM6.js +0 -284
- package/dist/survival-RAU4XCKG.js +0 -58
- package/dist/survival-ZZ4QLZHK.js +0 -46
- package/dist/survival.integration.spec-GBQ5X362.js +0 -915
- package/dist/survival.integration.spec-GBQ5X362.js.map +0 -7
- package/dist/svgraph-7UCFRL6A.js +0 -1387
- package/dist/svmr-DB3RY2ID.js +0 -3842
- package/dist/table-HJRWWXGM.js +0 -200
- package/dist/termCollection-AW7M6DTP.js +0 -38
- package/dist/termCollection-WPON7RG3.js +0 -179
- package/dist/termCollection.unit.spec-254ESHOE.js +0 -208
- package/dist/tk-SUAFM5YA.js +0 -46
- package/dist/tp.ui-ELEQGSK2.js +0 -1459
- package/dist/tvs.dt-DCXY66YY.js +0 -39
- package/dist/tvs.dtcnv.categorical-SFQZMYX7.js +0 -40
- package/dist/tvs.dtcnv.continuous-AUZNJMC3.js +0 -72
- package/dist/tvs.dtfusion-5F7MYFHZ.js +0 -40
- package/dist/tvs.dtsnvindel-JJSPL4PH.js +0 -40
- package/dist/tvs.dtsv-DARTSV5H.js +0 -40
- package/dist/tvs.samplelst-HHBIO26C.js +0 -104
- package/dist/tvs.termCollection-KCMALH6B.js +0 -159
- package/dist/violin-C26FW5WK.js +0 -46
- package/dist/violin.integration.spec-QQ43XWHQ.js +0 -1425
- package/dist/violin.interactivity-H2BHC6M4.js +0 -38
- package/dist/violin.renderer-GSG2I7AV.js +0 -40
- package/dist/vocabulary-3G525O5V.js +0 -41
- package/dist/vocabulary-3G525O5V.js.map +0 -7
- /package/dist/{2dmaf-SKNV7IHT.js.map → 2dmaf-HV22W5N3.js.map} +0 -0
- /package/dist/{AIProjectAdmin-AOTVRBNH.js.map → AIProjectAdmin-7QGTPN3B.js.map} +0 -0
- /package/dist/{AppHeader-M2ZSS3M3.js.map → AppHeader-NOKET4YE.js.map} +0 -0
- /package/dist/{BoxPlot-P3EECSQA.js.map → BoxPlot-SPG66F4C.js.map} +0 -0
- /package/dist/{CorrelationVolcano-YCQ5S6MT.js.map → CorrelationVolcano-3LEMTFXP.js.map} +0 -0
- /package/dist/{DE-RBMOQZCR.js.map → DE-WCCADMXA.js.map} +0 -0
- /package/dist/{DEinput-PTW6RS6U.js.map → DEinput-IZNPYPKH.js.map} +0 -0
- /package/dist/{Disco-GUKDAHUY.js.map → Disco-M5RNUOWG.js.map} +0 -0
- /package/dist/{Disco.UI-YBIMV7RH.js.map → Disco.UI-RVUOPT6Y.js.map} +0 -0
- /package/dist/{DmrPlot-JQPLLU6P.js.map → DmrPlot-R2N534FS.js.map} +0 -0
- /package/dist/{GeneExpInput-3OPDDCXR.js.map → GeneExpInput-VWCPHOVO.js.map} +0 -0
- /package/dist/{HicApp-VFOWRP6G.js.map → HicApp-F2MY3NXP.js.map} +0 -0
- /package/dist/{NumBinaryEditor-RL44SO3T.js.map → NumBinaryEditor-AL2NWII2.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-P73PGAX5.js.map → NumBinaryEditor.unit.spec-NFRJHFNX.js.map} +0 -0
- /package/dist/{NumContEditor-MIC7M73G.js.map → NumContEditor-CTFJVIHU.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-5XZH7OCG.js.map → NumContEditor.unit.spec-FXGGCMTD.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-W357XTIR.js.map → NumCustomBinEditor-JFIJ2X6E.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-CJMK4CYW.js.map → NumCustomBinEditor.unit.spec-ZKIZXS53.js.map} +0 -0
- /package/dist/{NumDiscreteEditor-PRSUMS3I.js.map → NumDiscreteEditor-E7SPHF55.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-A6R56P3Z.js.map → NumDiscreteEditor.unit.spec-QKKRZJMU.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-7OHUEUCC.js.map → NumRegularBinEditor-JSLTZIAQ.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-NOAX42UZ.js.map → NumRegularBinEditor.unit.spec-W73BA6L4.js.map} +0 -0
- /package/dist/{NumSplineEditor-XI7AT5LM.js.map → NumSplineEditor-ZEXYGKKF.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-ZH4M2N2C.js.map → NumSplineEditor.unit.spec-EHKI4CY7.js.map} +0 -0
- /package/dist/{NumericDensity-X6IHQAW3.js.map → NumericDensity-ZXM6TB33.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-EKVD4AUG.js.map → NumericDensity.unit.spec-PUFRE5XA.js.map} +0 -0
- /package/dist/{NumericHandler-5ONBWFJ5.js.map → NumericHandler-73TUDM3R.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-SHI6E4VA.js.map → NumericHandler.unit.spec-EITBD47U.js.map} +0 -0
- /package/dist/{RunChart2-Y6IY6MW2.js.map → RunChart2-4JYV2Z7B.js.map} +0 -0
- /package/dist/{WSIViewer-RLLL7MAL.js.map → WSIViewer-DQAXX7QJ.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-FU3TCOTY.js.map → WsiSamplesPlot-AGOLPLK3.js.map} +0 -0
- /package/dist/{adSandbox-ZINST5DE.js.map → adSandbox-ZE5QOTN5.js.map} +0 -0
- /package/dist/{animatedBubbleChart-PIQWCVBJ.js.map → animatedBubbleChart-ILMDNAVK.js.map} +0 -0
- /package/dist/{app-N42SVGI2.js.map → app-JBFRJ5OO.js.map} +0 -0
- /package/dist/{app-RWN4XLCP.js.map → app-YVNRAZWU.js.map} +0 -0
- /package/dist/{bam-QTSTXJ4N.js.map → bam-A2PVAF3J.js.map} +0 -0
- /package/dist/{barchart-27BYTRVI.js.map → barchart-2XQ7F6LT.js.map} +0 -0
- /package/dist/{barchart.data-OUNVH4JU.js.map → barchart.data-6XLK7D63.js.map} +0 -0
- /package/dist/{barchart.events-PY4CEDSO.js.map → barchart.events-DKJDKSPN.js.map} +0 -0
- /package/dist/{barchart.integration.spec-H4WGHQ7R.js.map → barchart.integration.spec-UTTCQJRL.js.map} +0 -0
- /package/dist/{barchart2-TIOTRAC2.js.map → barchart2-2FRVUVJG.js.map} +0 -0
- /package/dist/{block.init-LRZ3QAGC.js.map → block.init-3KLLFGGV.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-IV7JLC52.js.map → block.mds.expressionrank-XU3MBIOX.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-IBCE5XZU.js.map → block.mds.geneboxplot-VQTBL7T4.js.map} +0 -0
- /package/dist/{block.mds.junction-ISSCJHNF.js.map → block.mds.junction-IYWWRIJD.js.map} +0 -0
- /package/dist/{block.mds.svcnv-ZEBVBTL7.js.map → block.mds.svcnv-BMY5DCAM.js.map} +0 -0
- /package/dist/{block.svg-FYWA5VYH.js.map → block.svg-AT4GYQHX.js.map} +0 -0
- /package/dist/{block.tk.aicheck-AD6DTKXR.js.map → block.tk.aicheck-RANOFGDZ.js.map} +0 -0
- /package/dist/{block.tk.ase-LO2J4KRE.js.map → block.tk.ase-CBWJA3RN.js.map} +0 -0
- /package/dist/{block.tk.bam-XGX22FCN.js.map → block.tk.bam-D7JBRNFQ.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-SUIRFNFL.js.map → block.tk.bedgraphdot-IEHNIGVI.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-2Q7FAK3V.js.map → block.tk.bigwig.ui-3SAXUJU4.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-4MVP2PCL.js.map → block.tk.hicstraw-R5EHQFGM.js.map} +0 -0
- /package/dist/{block.tk.junction-F54FTEPB.js.map → block.tk.junction-JFCEXZZC.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-ETROZJVK.js.map → block.tk.junction.textmatrixui-4V7MV6TD.js.map} +0 -0
- /package/dist/{block.tk.ld-NJEDKSTU.js.map → block.tk.ld-LP4DIHAJ.js.map} +0 -0
- /package/dist/{block.tk.menu-LZOY4FKT.js.map → block.tk.menu-FTVZU2HA.js.map} +0 -0
- /package/dist/{block.tk.pgv-I3XHJ7VU.js.map → block.tk.pgv-CRAMVKU4.js.map} +0 -0
- /package/dist/{brainImaging-BGP6VRFV.js.map → brainImaging-DXLK5XZ6.js.map} +0 -0
- /package/dist/{brainRegions-AAN7LM2Y.js.map → brainRegions-AMSXQT3T.js.map} +0 -0
- /package/dist/{bubbleHeatmap-HNEU4CYA.js.map → bubbleHeatmap-SXBARILL.js.map} +0 -0
- /package/dist/{chunk-53JJ7SXN.js.map → chunk-2AHDWWQO.js.map} +0 -0
- /package/dist/{chunk-CDJAHMAN.js.map → chunk-2OJ577BB.js.map} +0 -0
- /package/dist/{chunk-5QTJUPFS.js.map → chunk-433DTQ6C.js.map} +0 -0
- /package/dist/{chunk-MN3KDNHC.js.map → chunk-46CPDZSW.js.map} +0 -0
- /package/dist/{chunk-GE4NJDV4.js.map → chunk-47EYZQA7.js.map} +0 -0
- /package/dist/{chunk-PU2Q4SZR.js.map → chunk-4M22UIJQ.js.map} +0 -0
- /package/dist/{chunk-IFK24IXL.js.map → chunk-4YDERN37.js.map} +0 -0
- /package/dist/{chunk-LYVLF6HO.js.map → chunk-5ERYRSVV.js.map} +0 -0
- /package/dist/{chunk-F7Y67LK7.js.map → chunk-6W6UMGAV.js.map} +0 -0
- /package/dist/{chunk-U3G4JGKJ.js.map → chunk-6Z4XHMZV.js.map} +0 -0
- /package/dist/{chunk-JNBJG57F.js.map → chunk-7YWPWCHD.js.map} +0 -0
- /package/dist/{chunk-EKKQMKQI.js.map → chunk-AC3RAKUI.js.map} +0 -0
- /package/dist/{chunk-5HMX4NUJ.js.map → chunk-BSOB3BVG.js.map} +0 -0
- /package/dist/{chunk-A45KH7LP.js.map → chunk-CJJA6RVM.js.map} +0 -0
- /package/dist/{chunk-WZUWK5Q6.js.map → chunk-CUXOQIUA.js.map} +0 -0
- /package/dist/{chunk-IRKP6IZ4.js.map → chunk-D5ZYSW45.js.map} +0 -0
- /package/dist/{chunk-J6ZOUCWN.js.map → chunk-DA6RR5IR.js.map} +0 -0
- /package/dist/{chunk-MTZSN3H4.js.map → chunk-DD6KDZVR.js.map} +0 -0
- /package/dist/{chunk-4C3XRI6J.js.map → chunk-DI5ULDWN.js.map} +0 -0
- /package/dist/{chunk-VDZ5QOF6.js.map → chunk-DXM5IMGV.js.map} +0 -0
- /package/dist/{chunk-7FSIZZOX.js.map → chunk-GFETCJ7S.js.map} +0 -0
- /package/dist/{chunk-FISP5YN2.js.map → chunk-HCNF7EFT.js.map} +0 -0
- /package/dist/{chunk-LSWU6EAQ.js.map → chunk-I62GOCNI.js.map} +0 -0
- /package/dist/{chunk-WQCQWUUP.js.map → chunk-IBYOP2FV.js.map} +0 -0
- /package/dist/{chunk-L6A2BEXB.js.map → chunk-JD2ECQ3Z.js.map} +0 -0
- /package/dist/{chunk-25XCVML7.js.map → chunk-JF47NF5G.js.map} +0 -0
- /package/dist/{chunk-427UL37G.js.map → chunk-JOA4KJTM.js.map} +0 -0
- /package/dist/{chunk-CXHLROWX.js.map → chunk-K6AW4GFM.js.map} +0 -0
- /package/dist/{chunk-2XV6U42J.js.map → chunk-KOLVLBMI.js.map} +0 -0
- /package/dist/{chunk-ROJ3LJLE.js.map → chunk-KQ6EF3FG.js.map} +0 -0
- /package/dist/{chunk-VO5XZ2EG.js.map → chunk-LBWKMNVU.js.map} +0 -0
- /package/dist/{chunk-5V2BMEAS.js.map → chunk-LFGIMCUD.js.map} +0 -0
- /package/dist/{chunk-PZPS56Z6.js.map → chunk-LKB3DITY.js.map} +0 -0
- /package/dist/{chunk-LWEGSYDD.js.map → chunk-MCXQL4W2.js.map} +0 -0
- /package/dist/{chunk-QKR3ZD3S.js.map → chunk-MLYSQG3C.js.map} +0 -0
- /package/dist/{chunk-VTMJGRT5.js.map → chunk-MYZJUT2H.js.map} +0 -0
- /package/dist/{chunk-BXGQXLHP.js.map → chunk-NVRLD4TF.js.map} +0 -0
- /package/dist/{chunk-FDBVAL6K.js.map → chunk-NZCX4A7X.js.map} +0 -0
- /package/dist/{chunk-BWQV2OBL.js.map → chunk-OVHCUTQM.js.map} +0 -0
- /package/dist/{chunk-GYGU4UT5.js.map → chunk-P3NKHTNT.js.map} +0 -0
- /package/dist/{chunk-G3FSS7GR.js.map → chunk-PFOCEOVT.js.map} +0 -0
- /package/dist/{chunk-EPWIJEMK.js.map → chunk-PJSOYF5U.js.map} +0 -0
- /package/dist/{chunk-WJGUNGFK.js.map → chunk-PK5HXJ3S.js.map} +0 -0
- /package/dist/{chunk-W5X6C7LY.js.map → chunk-QAVZUWY3.js.map} +0 -0
- /package/dist/{chunk-I5IPJG2R.js.map → chunk-QOAUM6UV.js.map} +0 -0
- /package/dist/{chunk-B4GS7OLB.js.map → chunk-QXPJLSAD.js.map} +0 -0
- /package/dist/{chunk-ILE6ML2D.js.map → chunk-QZLP27O6.js.map} +0 -0
- /package/dist/{chunk-QMXCK4Y5.js.map → chunk-SENZWOCC.js.map} +0 -0
- /package/dist/{chunk-4O6H4ZHL.js.map → chunk-SFIX7XVT.js.map} +0 -0
- /package/dist/{chunk-K5UVG3FQ.js.map → chunk-SJWAMUL5.js.map} +0 -0
- /package/dist/{chunk-WZ2U5QXJ.js.map → chunk-U3CMLIGB.js.map} +0 -0
- /package/dist/{chunk-5CR24RTX.js.map → chunk-UF6ZP6UR.js.map} +0 -0
- /package/dist/{chunk-6MBTPVIM.js.map → chunk-UVWUP6N7.js.map} +0 -0
- /package/dist/{chunk-OF5FE6GT.js.map → chunk-UYEJ5DEZ.js.map} +0 -0
- /package/dist/{chunk-A3URBFXN.js.map → chunk-V2ET64EJ.js.map} +0 -0
- /package/dist/{chunk-KE5B34CS.js.map → chunk-WQEGWR63.js.map} +0 -0
- /package/dist/{chunk-3LYZMOLO.js.map → chunk-WYSEBR5S.js.map} +0 -0
- /package/dist/{chunk-YYFQPGIE.js.map → chunk-XB6F5OUB.js.map} +0 -0
- /package/dist/{chunk-WKT46ZJ6.js.map → chunk-XVYSEXFV.js.map} +0 -0
- /package/dist/{chunk-PJ3FCJBZ.js.map → chunk-YGKVY5IU.js.map} +0 -0
- /package/dist/{chunk-VRH7NP6R.js.map → chunk-ZPXSPJV2.js.map} +0 -0
- /package/dist/{condition-GVIEMQG7.js.map → condition-YCPNILTV.js.map} +0 -0
- /package/dist/{controls-73K3XBDR.js.map → controls-RW5MWSLN.js.map} +0 -0
- /package/dist/{controls.config-FQKY2LRE.js.map → controls.config-MP3CSYR4.js.map} +0 -0
- /package/dist/{correlation-AOAXIUFJ.js.map → correlation-7AQRU4YR.js.map} +0 -0
- /package/dist/{cuminc-OD2PPCEK.js.map → cuminc-WYLKIOXR.js.map} +0 -0
- /package/dist/{customdata.inputui-SWLGLATL.js.map → customdata.inputui-YU4IQJOV.js.map} +0 -0
- /package/dist/{dataDownload-456HL2OE.js.map → dataDownload-72DIPZ45.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-5YS4MWK5.js.map → dataDownload.integration.spec-HRLMWQN7.js.map} +0 -0
- /package/dist/{databrowser.ui-7APC5MNM.js.map → databrowser.ui-3PE25HK4.js.map} +0 -0
- /package/dist/{dictionary-A3HA5MVK.js.map → dictionary-Y3ICL4AE.js.map} +0 -0
- /package/dist/{dnaMethylation-6ONBKARD.js.map → dnaMethylation-SVGDW64U.js.map} +0 -0
- /package/dist/{dnaMethylation.integration.spec-T3WEGVX3.js.map → dnaMethylation.integration.spec-B7GLAFZI.js.map} +0 -0
- /package/dist/{dofetch-RVPQUMVX.js.map → dofetch-42KOXNPF.js.map} +0 -0
- /package/dist/{e2pca-75WZ46XG.js.map → e2pca-CLFGEFJH.js.map} +0 -0
- /package/dist/{ep-QG5CWPTW.js.map → ep-PUHV2DMO.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-KBBQJR4M.js.map → expclust.gdc.spec-N7YDJAOZ.js.map} +0 -0
- /package/dist/{facet-QGB2Q7YV.js.map → facet-JFFJJCNT.js.map} +0 -0
- /package/dist/{forms2-CJGDCWYH.js.map → forms2-XZAWW3RN.js.map} +0 -0
- /package/dist/{gb-NEFAHKQI.js.map → gb-SQJ5PWOH.js.map} +0 -0
- /package/dist/{geneExpClustering-ZVR44UZC.js.map → geneExpClustering-EG2BLMQX.js.map} +0 -0
- /package/dist/{geneExpression-FALOA4GC.js.map → geneExpression-J42BGP3B.js.map} +0 -0
- /package/dist/{geneExpression-25EX4DFK.js.map → geneExpression-QRK3LNMV.js.map} +0 -0
- /package/dist/{geneExpression.unit.spec-BQLELQUS.js.map → geneExpression.unit.spec-X7HVIFZA.js.map} +0 -0
- /package/dist/{geneORA-K2B7JYWD.js.map → geneORA-SVBPO66K.js.map} +0 -0
- /package/dist/{geneRanking-6AXL5ZJS.js.map → geneRanking-HNMMLZIX.js.map} +0 -0
- /package/dist/{geneVariant-RZFDP5J5.js.map → geneVariant-RVQKNVQO.js.map} +0 -0
- /package/dist/{geneVariant-UIBZ5UIQ.js.map → geneVariant-SO5FEJUZ.js.map} +0 -0
- /package/dist/{geneVariant.integration.spec-4EZQMPQB.js.map → geneVariant.integration.spec-DOMX4GMP.js.map} +0 -0
- /package/dist/{genefusion.ui-YK4TNS2P.js.map → genefusion.ui-QS7AG46F.js.map} +0 -0
- /package/dist/{geneset-47J4D5ID.js.map → geneset-JKOX3VIW.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-LFFWRIWG.js.map → genomeBrowser.spec-IRSTT2OX.js.map} +0 -0
- /package/dist/{grin2-DQB2WW3C.js.map → grin2-VZLCISPM.js.map} +0 -0
- /package/dist/{gsea-KKLAMLMG.js.map → hierCluster-6AW23EB5.js.map} +0 -0
- /package/dist/{hierCluster-3MZEJG6B.js.map → hierCluster-REXTCODR.js.map} +0 -0
- /package/dist/{hierCluster-YGBC4XCZ.js.map → hierCluster.config-3Z3R66XH.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-GLKXFZDM.js.map → hierCluster.integration.spec-XE47Q64Z.js.map} +0 -0
- /package/dist/{hierCluster.config-A4N54K3A.js.map → hierCluster.interactivity-2YJYYKVK.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-4TPWGIVC.js.map → hierCluster.renderers-LE7W2AL6.js.map} +0 -0
- /package/dist/{imagePlot-JRPYOV3Q.js.map → imagePlot-WMZJJ5CJ.js.map} +0 -0
- /package/dist/{hierCluster.renderers-WUWSXXHU.js.map → importPlot-P35EGIJJ.js.map} +0 -0
- /package/dist/{importPlot-A3PFUP6K.js.map → isoformExpression-3TFPEXB4.js.map} +0 -0
- /package/dist/{isoformExpression.unit.spec-SLB6XIX4.js.map → isoformExpression.unit.spec-SPQFK3EA.js.map} +0 -0
- /package/dist/{isoformExpression-5L4O3WKL.js.map → launch.adhoc-ZQSJBLMJ.js.map} +0 -0
- /package/dist/{leftlabel.sample-OSIRTJFW.js.map → leftlabel.sample-SJRQ6LJ2.js.map} +0 -0
- /package/dist/{lollipop-LAELXNQY.js.map → lollipop-RXM6UBZ7.js.map} +0 -0
- /package/dist/{maf-HZAYVZFO.js.map → maf-NWXJWBNF.js.map} +0 -0
- /package/dist/{maftimeline-BLBNUGAL.js.map → maftimeline-D7UENAP5.js.map} +0 -0
- /package/dist/{launch.adhoc-QI7TPYSC.js.map → matrix-77LNADX2.js.map} +0 -0
- /package/dist/{matrix-LVJSHXDM.js.map → matrix-YDOLKY6G.js.map} +0 -0
- /package/dist/{matrix-S5QQV4JU.js.map → matrix.cells-VEC5LEWV.js.map} +0 -0
- /package/dist/{matrix.cells-JUTRYPG4.js.map → matrix.config-GTAAAUGQ.js.map} +0 -0
- /package/dist/{matrix.config-ZTWWYNIZ.js.map → matrix.data-T4GEX6ZH.js.map} +0 -0
- /package/dist/{matrix.data-BREYB54F.js.map → matrix.groups-7NWHHP5Q.js.map} +0 -0
- /package/dist/{matrix.groups-WMHTLOXC.js.map → matrix.interactivity-ONT6WCRU.js.map} +0 -0
- /package/dist/{matrix.interactivity-TMBVAM5M.js.map → matrix.layout-LDXHGOHF.js.map} +0 -0
- /package/dist/{matrix.layout-POK5NOUV.js.map → matrix.legend-5MDW65HV.js.map} +0 -0
- /package/dist/{matrix.legend-6XVQ67AC.js.map → matrix.renderers-OEPLQG3C.js.map} +0 -0
- /package/dist/{matrix.renderers-G5FQZZ73.js.map → matrix.serieses-4RX7TUQ7.js.map} +0 -0
- /package/dist/{matrix.serieses-XNLQSQS6.js.map → matrix.sort-UKMMECBZ.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-65BDBQUV.js.map → matrix.sort.unit.spec-VWOXPVRE.js.map} +0 -0
- /package/dist/{matrix.sort-XNES23OQ.js.map → matrix.sorterUi-H64DDQIL.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-GZQBW7F7.js.map → matrix.sorterUi.unit.spec-DH4434FK.js.map} +0 -0
- /package/dist/{mavb-T2UCRWWM.js.map → mavb-ARUWOZES.js.map} +0 -0
- /package/dist/{mds.fimo-65UUK7ER.js.map → mds.fimo-ZEAE5BC3.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-4NHGQBJF.js.map → mds.samplescatterplot-C5EBKBVF.js.map} +0 -0
- /package/dist/{mds.survivalplot-WVAHDM3Z.js.map → mds.survivalplot-RS7Z3J3Q.js.map} +0 -0
- /package/dist/{numericDictTermCluster-CXASCSQ6.js.map → numericDictTermCluster-CSQOV4TM.js.map} +0 -0
- /package/dist/{oncomatrix-5WMOICWR.js.map → oncomatrix-5UVM3KUA.js.map} +0 -0
- /package/dist/{oncomatrix.spec-POVBNFJR.js.map → oncomatrix.spec-CU3EZCMO.js.map} +0 -0
- /package/dist/{plot.2dvaf-63K5RSIU.js.map → plot.2dvaf-JD27DSDS.js.map} +0 -0
- /package/dist/{matrix.sorterUi-WC2YX7S7.js.map → plot.app-NMPMG3S2.js.map} +0 -0
- /package/dist/{plot.barplot-IQTYHNFE.js.map → plot.barplot-T4LPKFXW.js.map} +0 -0
- /package/dist/{plot.boxplot-2RMTO7AS.js.map → plot.boxplot-22ETOHNI.js.map} +0 -0
- /package/dist/{plot.brainImaging-DLUHAHHG.js.map → plot.brainImaging-Q7S7KSHW.js.map} +0 -0
- /package/dist/{plot.disco-WK6GDLNF.js.map → plot.disco-NIPBER5N.js.map} +0 -0
- /package/dist/{plot.dzi-3V3FWE7U.js.map → plot.dzi-DAX7GUTF.js.map} +0 -0
- /package/dist/{plot.ssgq-TENK2RP4.js.map → plot.ssgq-7J6S35RW.js.map} +0 -0
- /package/dist/{plot.vaf2cov-P2QOOZGZ.js.map → plot.vaf2cov-7EWFTD72.js.map} +0 -0
- /package/dist/{plot.wsi-BVRGJF4E.js.map → plot.wsi-E45KZGKD.js.map} +0 -0
- /package/dist/{polar2-NNOZOQQJ.js.map → polar2-LPT2XMD2.js.map} +0 -0
- /package/dist/{profileForms-RS4GEZZV.js.map → profileForms-EYN2KLSY.js.map} +0 -0
- /package/dist/{plot.app-V5IY25QS.js.map → profilePlot-I7VQM3CH.js.map} +0 -0
- /package/dist/{proteinView-NPKJAQAI.js.map → proteinView-JP5TF3ZK.js.map} +0 -0
- /package/dist/{profilePlot-3DLME3NH.js.map → qualitative-7X3ECW7Q.js.map} +0 -0
- /package/dist/{radar2-EX7YBNMT.js.map → radar2-V3FYBFAG.js.map} +0 -0
- /package/dist/{radarFacility2-WU5O6O77.js.map → radarFacility2-O6GQLBBN.js.map} +0 -0
- /package/dist/{qualitative-S45RXXRJ.js.map → regression-CLG6NYVF.js.map} +0 -0
- /package/dist/{regression-7MCOYJVD.js.map → regression.inputs-RLOBIRJH.js.map} +0 -0
- /package/dist/{regression.inputs-QHSWJ23R.js.map → regression.inputs.term-ZKIP6KDO.js.map} +0 -0
- /package/dist/{regression.inputs.term-EJ4Z5Q5O.js.map → regression.inputs.values.table-2VD4AO5T.js.map} +0 -0
- /package/dist/{regression.integration.spec-XOX7OXXA.js.map → regression.integration.spec-JEIMN7MS.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-YKMAWNXN.js.map → regression.results-FT6VSWGR.js.map} +0 -0
- /package/dist/{regression.spec-YIIY2AZA.js.map → regression.spec-V4S52JQM.js.map} +0 -0
- /package/dist/{report-JEJFCWUU.js.map → report-UPQFSI4D.js.map} +0 -0
- /package/dist/{sampleScatter.spec-LBAZBDYA.js.map → sampleScatter.spec-QSRF3STG.js.map} +0 -0
- /package/dist/{regression.results-YKPOTPCC.js.map → sampleView-JIGZ7GTP.js.map} +0 -0
- /package/dist/{samplelst-HXM3H6M4.js.map → samplelst-VJMYHVXI.js.map} +0 -0
- /package/dist/{samplematrix-LCGHK2EK.js.map → samplematrix-LO4QB37V.js.map} +0 -0
- /package/dist/{sc-3OE2G4BU.js.map → sc-4VZBGFZP.js.map} +0 -0
- /package/dist/{scatter-AGVUDTTU.js.map → scatter-LQECXZLB.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-WF2XZ6GH.js.map → selectGenomeWithTklst-IJTCLRIN.js.map} +0 -0
- /package/dist/{sampleView-WKZT5ZFE.js.map → singleCellCellType-FJ53DRXD.js.map} +0 -0
- /package/dist/{singleCellCellType.unit.spec-DCGHNRJI.js.map → singleCellCellType.unit.spec-VOE4KY6L.js.map} +0 -0
- /package/dist/{singleCellCellType-2SRGROMS.js.map → singleCellGeneExpression-RZE5UVL4.js.map} +0 -0
- /package/dist/{singleCellGeneExpression.unit.spec-5MRGH2OO.js.map → singleCellGeneExpression.unit.spec-2DASF7PD.js.map} +0 -0
- /package/dist/{singleCellGeneExpression-RASZA4NO.js.map → singleCellPlot-Q5UNIW3M.js.map} +0 -0
- /package/dist/{singlecell-CFA43TTU.js.map → singlecell-N7F5KVIB.js.map} +0 -0
- /package/dist/{singlecell-JS5SIZHY.js.map → singlecell-TX5AQ4WM.js.map} +0 -0
- /package/dist/{singleCellPlot-TIYA3GNM.js.map → snp-S4O7SVDD.js.map} +0 -0
- /package/dist/{snp.unit.spec-TR5TCO7X.js.map → snp.unit.spec-WSQMZSTE.js.map} +0 -0
- /package/dist/{snplocus-VLPH5Y65.js.map → snplocus-Y2R5C4ZP.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-PATK67SH.js.map → spliceevent.a53ss.diagram-FGRQR73W.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-7B3SEOAJ.js.map → spliceevent.exonskip.diagram-TVH44RNL.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-4NPNZUEN.js.map → spliceevent.noeventdiagram-G2CMYYE7.js.map} +0 -0
- /package/dist/{snp-VXZXPMKS.js.map → ssGSEA-BH53XGEZ.js.map} +0 -0
- /package/dist/{ssGSEA.unit.spec-ASUWKVUT.js.map → ssGSEA.unit.spec-BYIVB7FZ.js.map} +0 -0
- /package/dist/{summarizeCnvGeneexp-KWRFGX32.js.map → summarizeCnvGeneexp-IZNOX4E7.js.map} +0 -0
- /package/dist/{summarizeGeneexpSurvival-FIPIMEJR.js.map → summarizeGeneexpSurvival-DJZ2R24E.js.map} +0 -0
- /package/dist/{summarizeMutationCnv-IUYRVLZG.js.map → summarizeMutationCnv-CO2TVWOI.js.map} +0 -0
- /package/dist/{ssGSEA-XMW5BLAU.js.map → summarizeMutationDiagnosis-EUZXCSZP.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-HFHYB7DT.js.map → summarizeMutationSurvival-CXFT3HWL.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-ZFJPCABL.js.map → summary-JHZCDE35.js.map} +0 -0
- /package/dist/{summary.integration.spec-WLBAJL44.js.map → summary.integration.spec-WBEYSDCA.js.map} +0 -0
- /package/dist/{summaryInput-NJWVXDXW.js.map → summaryInput-JVH3R54R.js.map} +0 -0
- /package/dist/{sunburst-PXGF4WM6.js.map → sunburst-CTJTXHSA.js.map} +0 -0
- /package/dist/{summary-AZUNEZ5I.js.map → survival-DLLVUG2P.js.map} +0 -0
- /package/dist/{survival-RAU4XCKG.js.map → survival-XFVYNI6S.js.map} +0 -0
- /package/dist/{svgraph-7UCFRL6A.js.map → svgraph-ACEBMDIX.js.map} +0 -0
- /package/dist/{svmr-DB3RY2ID.js.map → svmr-IQEDSZ2C.js.map} +0 -0
- /package/dist/{table-HJRWWXGM.js.map → table-2IF6UGHR.js.map} +0 -0
- /package/dist/{survival-ZZ4QLZHK.js.map → termCollection-JOLQJYJ3.js.map} +0 -0
- /package/dist/{termCollection-WPON7RG3.js.map → termCollection-PSXFFR32.js.map} +0 -0
- /package/dist/{termCollection.unit.spec-254ESHOE.js.map → termCollection.unit.spec-4SOZP4FY.js.map} +0 -0
- /package/dist/{termCollection-AW7M6DTP.js.map → tk-AAIHEQO6.js.map} +0 -0
- /package/dist/{tp.ui-ELEQGSK2.js.map → tp.ui-6STLQEXX.js.map} +0 -0
- /package/dist/{tk-SUAFM5YA.js.map → tvs.dt-FSA7KPSQ.js.map} +0 -0
- /package/dist/{tvs.dtcnv.categorical-SFQZMYX7.js.map → tvs.dtcnv.categorical-FSPGH7DP.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-AUZNJMC3.js.map → tvs.dtcnv.continuous-T4ZMSDB4.js.map} +0 -0
- /package/dist/{tvs.dtfusion-5F7MYFHZ.js.map → tvs.dtfusion-UL3YENUM.js.map} +0 -0
- /package/dist/{tvs.dtsnvindel-JJSPL4PH.js.map → tvs.dtsnvindel-5TPUT5RJ.js.map} +0 -0
- /package/dist/{tvs.dtsv-DARTSV5H.js.map → tvs.dtsv-OTNHXYOJ.js.map} +0 -0
- /package/dist/{tvs.samplelst-HHBIO26C.js.map → tvs.samplelst-FQKTAQZF.js.map} +0 -0
- /package/dist/{tvs.termCollection-KCMALH6B.js.map → tvs.termCollection-ZAPCUMUW.js.map} +0 -0
- /package/dist/{tvs.dt-DCXY66YY.js.map → violin-HEFFKPL5.js.map} +0 -0
- /package/dist/{violin.integration.spec-QQ43XWHQ.js.map → violin.integration.spec-774N4G5A.js.map} +0 -0
- /package/dist/{violin-C26FW5WK.js.map → violin.interactivity-XNYJSK53.js.map} +0 -0
- /package/dist/{violin.interactivity-H2BHC6M4.js.map → violin.renderer-R74VSGRC.js.map} +0 -0
- /package/dist/{violin.renderer-GSG2I7AV.js.map → vocabulary-OHMC6NWL.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../mass/sessionBtn.js", "../mass/about.ts", "../mass/chat.ts", "../mass/nav.js"],
|
|
4
|
-
"sourcesContent": ["import { getCompInit } from '#rx'\nimport { Menu } from '#dom/menu'\nimport { to_textfile } from '#dom/downloadTextfile'\nimport { dofetch3 } from '#common/dofetch'\nimport { parentCorsMessage } from '#common/embedder-helpers'\nimport { select } from 'd3-selection'\nimport { importPlot } from '#plots/importPlot.js'\n\nclass MassSessionBtn {\n\tstatic type = 'sessionBtn'\n\n\tconstructor() {\n\t\tthis.type = MassSessionBtn.type\n\t\tthis.route = 'termdb'\n\t\tthis.embedderOrigin = window.location.origin\n\t\tthis.hostURL = sessionStorage.getItem('hostURL') || this.embedderOrigin\n\t}\n\n\tasync init(appState) {\n\t\tconst tip = new Menu({ padding: '0px' })\n\t\tconst copytip = new Menu({ padding: '5px' })\n\t\tthis.dom = {\n\t\t\tbutton: this.opts.button,\n\t\t\ttip,\n\t\t\tcopytip\n\t\t}\n\n\t\tthis.dom.button.on('click', event => {\n\t\t\tevent.stopPropagation()\n\t\t\tthis.dom.tip.clear()\n\t\t\tthis.showMenu()\n\t\t})\n\n\t\tthis.dslabel = appState.vocab.dslabel\n\t\tthis.savedSessions = JSON.parse(localStorage.getItem('savedMassSessions') || `{}`)\n\t\tthis.requiredAuth = appState.termdbConfig?.requiredAuth?.find(a => a.route == this.route && a.type == 'jwt')\n\t}\n\n\tasync showMenu() {\n\t\tthis.dom.tip.clear().d.style('padding', 0)\n\t\tthis.dom.tip.d.attr('id', 'sjpp-session-menu')\n\t\tconst gt = `<span style='margin-left: 24px; float: right'>></span>`\n\t\tconst options = [\n\t\t\t{ label: `Open`, title: 'Recover a saved session', callback: this.open },\n\t\t\t{ label: `Save`, title: 'Save the current view', callback: this.save },\n\t\t\t{ label: `Share`, title: 'Share the current view', callback: this.getSessionUrl }\n\t\t]\n\n\t\tif (!this.serverCachedSessions) await this.setServerCachedSessions()\n\t\tif (Object.keys(this.savedSessions).length || Object.keys(this.serverCachedSessions).length) {\n\t\t\toptions.push({ label: `Delete`, title: 'Delete a saved session', callback: this.delete })\n\t\t}\n\n\t\tthis.dom.tip\n\t\t\t.clear()\n\t\t\t.d.selectAll('.sja_menuoption sja_sharp_border')\n\t\t\t.data(options)\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.attr('data-testid', d => `sjpp-session-btn-${d.label.toLowerCase().replace(/\\s/g, '-')}`)\n\t\t\t.attr('aria-label', d => d.title)\n\t\t\t.html(d => d.label)\n\t\t\t.on('click', (event, d) => {\n\t\t\t\tthis.dom.tip.clear().d.style('padding', '10px')\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tthis.showBackBtn()\n\t\t\t\td.callback.call(this)\n\t\t\t})\n\n\t\tthis.dom.tip.showunder(this.dom.button.node())\n\t}\n\n\tasync open() {\n\t\tconst radioName = `sjpp-session-open-radio-` + Math.random().toString().slice(-6)\n\t\t// always open in the current tab for now, to avoid the tricky part of the code\n\t\t// that involves parent-child window messaging\n\t\t// TODO: re-enable when the new tab option works reliably\n\t\tthis.dom.tip.d.append('div').style('display', 'none').style('padding', '3px 9px').html(`\n\t\t\t<b>Open in</b>\n\t\t\t<label>\n\t\t\t\t<input type='radio' name='${radioName}' value='new' style='margin-right: 0; vertical-align: bottom'/>\n\t\t\t\t<span>a new tab</span>\n\t\t\t</label>\n\t\t\t<label style='margin-left: 5px'>\n\t\t\t\t<input type='radio' name='${radioName}' value='current' checked=checked style='margin-right: 0; vertical-align: bottom'/>\n\t\t\t\t<span>current tab</span>\n\t\t\t</label>\n\t\t`)\n\n\t\tconst t = await this.listSessions({\n\t\t\ttrClickHandler: async (event, d) => {\n\t\t\t\tconst { loc, id } = d\n\t\t\t\tif (!id) return\n\t\t\t\tif (loc.includes('browser')) {\n\t\t\t\t\tthis.sessionName = id\n\t\t\t\t\tconst state = structuredClone(this.savedSessions[id])\n\t\t\t\t\tawait preprocessState(state, this.app)\n\t\t\t\t\tconst targetWindow = this.dom.tip.d.node().querySelector(`[name=\"${radioName}\"]:checked`).value\n\t\t\t\t\tif (targetWindow == 'current') {\n\t\t\t\t\t\tthis.app.dispatch({ type: 'app_refresh', state })\n\t\t\t\t\t} else if (window.location.origin == this.hostURL) {\n\t\t\t\t\t\twindow.open(`/?mass-session-id=${id}&src=browser`)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (state.embedder) parentCorsMessage({ state })\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tconst { protocol, host, search, origin, href } = window.location\n\t\t\t\t\t\t\tconst embedder = { protocol, host, search, origin, href }\n\t\t\t\t\t\t\tparentCorsMessage({ state: Object.assign({ embedder }, state) })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.dom.tip.hide()\n\t\t\t\t} else if (loc == 'server') {\n\t\t\t\t\tconst headers = await this.app.vocabApi.mayGetAuthHeaders(this.route)\n\t\t\t\t\tconst body = { id, route: this.route, dslabel: this.dslabel, embedder: window.location.hostname }\n\t\t\t\t\tconst res = await dofetch3(`/massSession?`, { headers, body })\n\t\t\t\t\tif (!res.state) throw res.error || 'unable to get the cached session from the server'\n\t\t\t\t\tawait preprocessState(res.state, this.app)\n\t\t\t\t\tthis.savedSessions[id] = res.state\n\n\t\t\t\t\tconst targetWindow = this.dom.tip.d.node().querySelector(`[name=\"${radioName}\"]:checked`).value\n\t\t\t\t\tif (targetWindow == 'current') {\n\t\t\t\t\t\tthis.app.dispatch({ type: 'app_refresh', state: res.state })\n\t\t\t\t\t} else if (window.location.origin == this.hostURL) {\n\t\t\t\t\t\twindow.open(`/?mass-session-id=${id}&src=cred&dslabel=${this.dslabel}&route=${this.route}`)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// server-cached sessions should have an state.embedder object, no need to check\n\t\t\t\t\t\tparentCorsMessage(res)\n\t\t\t\t\t}\n\t\t\t\t\tthis.dom.tip.hide()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tt.headtr.select('th').html('Open from')\n\n\t\t// open session from a local file\n\t\tconst tr1 = t.tbody.insert('tr', 'tr')\n\t\ttr1.append('td').style('text-align', 'center').style('padding', '3px 9px').html('Local file')\n\t\tconst label = tr1.append('td').style('text-align', 'left').append('label')\n\t\tlabel\n\t\t\t.append('span')\n\t\t\t.style('padding', '3px 9px')\n\t\t\t.style('text-decoration', 'underline')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html('Choose File')\n\t\tlabel\n\t\t\t.append('input')\n\t\t\t.attr('type', 'file')\n\t\t\t.attr('placeholder', 'file name')\n\t\t\t.style('opacity', 0)\n\t\t\t.style('width', '0.1px')\n\t\t\t.style('height', '0.1px')\n\t\t\t.style('position', 'absolute')\n\t\t\t.on('change', async () => {\n\t\t\t\tconst file = event.target.files.item(0)\n\t\t\t\tconst json = await file.text()\n\t\t\t\tlet sessionName = file.name\n\t\t\t\tif (this.savedSessions[sessionName]) {\n\t\t\t\t\tsessionName = prompt(\n\t\t\t\t\t\t`Leave as-is to overwrite a session with the same name, or enter a different session name.`,\n\t\t\t\t\t\tsessionName\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthis.sessionName = sessionName\n\t\t\t\tconst state = JSON.parse(json)\n\t\t\t\tawait preprocessState(state, this.app)\n\t\t\t\tthis.savedSessions[sessionName] = state\n\t\t\t\tlocalStorage.setItem('savedMassSessions', JSON.stringify(this.savedSessions))\n\t\t\t\tconst targetWindow = this.dom.tip.d.node().querySelector(`[name=\"${radioName}\"]:checked`).value\n\t\t\t\tif (targetWindow == 'current') {\n\t\t\t\t\tthis.app.dispatch({ type: 'app_refresh', state })\n\t\t\t\t} else if (window.location.origin == this.hostURL) {\n\t\t\t\t\twindow.open(`/?mass-session-id=${sessionName}&src=browser`)\n\t\t\t\t} else {\n\t\t\t\t\tif (state.embedder) parentCorsMessage({ state })\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst { protocol, host, search, origin, href } = window.location\n\t\t\t\t\t\tconst embedder = { protocol, host, search, origin, href }\n\t\t\t\t\t\tparentCorsMessage({ state: Object.assign({ embedder }, state) })\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dom.tip.hide()\n\t\t\t})\n\t}\n\n\tasync listSessions(opts = {}) {\n\t\tconst table = this.dom.tip.d.append('table').attr('class', 'sjpp-controls-table')\n\n\t\tconst headtr = table.append('thead').append('tr')\n\t\theadtr\n\t\t\t.selectAll('th')\n\t\t\t.data(['Cache Location', 'Session ID'])\n\t\t\t.enter()\n\t\t\t.append('th')\n\t\t\t.style('text-align', (d, i) => (i === 0 ? 'center' : 'left'))\n\t\t\t.style('padding', '3px 9px')\n\t\t\t.html(d => d)\n\n\t\tconst sessionIds = Object.keys(this.savedSessions).map(id => ({ loc: 'browser', id }))\n\t\tif (!this.serverCachedSessions) await this.setServerCachedSessions()\n\t\tsessionIds.push(...this.serverCachedSessions.map(id => ({ loc: 'server', id })))\n\n\t\tconst tbody = table.append('tbody')\n\t\tconst trs = tbody\n\t\t\t.selectAll('tr')\n\t\t\t.data(sessionIds)\n\t\t\t.enter()\n\t\t\t.append('tr')\n\t\t\t.on('click', opts.trClickHandler || null)\n\n\t\ttrs\n\t\t\t.selectAll('td')\n\t\t\t.data(d => [d, d])\n\t\t\t.enter()\n\t\t\t.append('td')\n\t\t\t.style('text-align', (d, i) => (i === 0 ? 'center' : 'left'))\n\t\t\t.style('padding', '3px 9px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html((d, i) => (i === 0 ? d.loc : d.id))\n\n\t\tif (!this.serverCachedSessions.length && this.requiredAuth && !this.app.vocabApi.hasVerifiedToken()) {\n\t\t\tconst tbody2 = table\n\t\t\t\t.append('tbody')\n\t\t\t\t.append('tr')\n\t\t\t\t.selectAll('td')\n\t\t\t\t.data(['server', 'requires sign-in'])\n\t\t\t\t.enter()\n\t\t\t\t.append('td')\n\t\t\t\t.style('text-align', (d, i) => (i === 0 ? 'center' : 'left'))\n\t\t\t\t.style('padding', '3px 9px')\n\t\t\t\t.html(d => d)\n\t\t}\n\t\treturn { table, headtr, tbody, trs }\n\t}\n\n\tasync setServerCachedSessions() {\n\t\tconst state = this.app.getState()\n\t\tthis.requiredAuth = state.termdbConfig?.requiredAuth?.find(a => a.route == this.route && a.type == 'jwt')\n\t\tif (!this.requiredAuth) {\n\t\t\tthis.serverCachedSessions = []\n\t\t\treturn\n\t\t}\n\t\tconst headers = this.app.vocabApi.mayGetAuthHeaders(this.route)\n\t\tconst body = { route: this.route, dslabel: this.dslabel, embedder: window.location.hostname }\n\t\tconst res = await dofetch3('/sessionIds', { headers, body })\n\t\tthis.serverCachedSessions = res.sessionIds || []\n\t}\n\n\tasync save(d) {\n\t\tconst div = this.dom.tip.d\n\t\tconst inputDiv = div.append('div')\n\t\tinputDiv.append('span').html('Save as')\n\t\tconst sessionNames = Object.keys(this.savedSessions)\n\t\tif (!this.serverCachedSessions) await this.setServerCachedSessions()\n\t\tsessionNames.push(...this.serverCachedSessions.filter(d => !sessionNames.includes(d)))\n\t\tconst placeholder = this.sessionName || 'unnamed-session'\n\t\tconst input = inputDiv\n\t\t\t.append('input')\n\t\t\t.attr('type', 'text')\n\t\t\t.attr('placeholder', placeholder)\n\t\t\t.style('width', '220px')\n\t\t\t.on('input', () => {\n\t\t\t\tsearchResultDiv.selectAll('*').remove()\n\t\t\t\tconst value = input.property('value')\n\t\t\t\tconst exactMatch = sessionNames.filter(s => s === value)\n\t\t\t\tconst startsWith = sessionNames.filter(s => s.startsWith(value))\n\t\t\t\tconst includes = sessionNames.filter(s => s.includes(value) && s !== value && !startsWith.includes(s))\n\t\t\t\tsearchResultDiv\n\t\t\t\t\t.selectAll('div')\n\t\t\t\t\t.data([...exactMatch, ...startsWith, ...includes])\n\t\t\t\t\t.enter()\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t.attr('data-testid', `sjpp-save-session-option`)\n\t\t\t\t\t.html(d => d)\n\t\t\t\t\t.on('click', (event, d) => {\n\t\t\t\t\t\tinput.property('value', d)\n\t\t\t\t\t\tsearchResultDiv.selectAll('*').remove()\n\t\t\t\t\t})\n\t\t\t})\n\n\t\tconst searchResultDiv = div.append('div')\n\t\tconst submitDiv = div.append('div')\n\t\tsubmitDiv.append('span').html('Save to ')\n\t\tsubmitDiv\n\t\t\t.append('button')\n\t\t\t.style('min-width', '80px')\n\t\t\t.html('Browser')\n\t\t\t.attr(\n\t\t\t\t'title',\n\t\t\t\t`Save the session in your current browser's cache. The session can be easily recovered, but not shared among your other devices`\n\t\t\t)\n\t\t\t.on('click', () => {\n\t\t\t\tthis.sessionName = input.property('value') || placeholder\n\t\t\t\tthis.savedSessions[this.sessionName] = this.app.getState()\n\t\t\t\tlocalStorage.setItem('savedMassSessions', JSON.stringify(this.savedSessions))\n\t\t\t\tthis.confirmAction(`Cached '<b>${this.sessionName}</b>' in browser`)\n\t\t\t})\n\n\t\tsubmitDiv\n\t\t\t.append('button')\n\t\t\t.style('min-width', '80px')\n\t\t\t.html('File')\n\t\t\t.attr(\n\t\t\t\t'title',\n\t\t\t\t`Save the session into a local file. The session can be easily recoved using the 'Open from local file' option.`\n\t\t\t)\n\t\t\t.on('click', () => {\n\t\t\t\tconst name = input.property('value') || placeholder\n\t\t\t\tthis.savedSessions[name] = this.app.getState()\n\t\t\t\tthis.download(name)\n\t\t\t\tthis.confirmAction(`Downloaded '<b>${name}</b>'`)\n\t\t\t})\n\n\t\t// assume that a jwt-type credential will include the user email in the jwt payload,\n\t\t// which could be trusted for saving sessions under cachedir/termdbSessions/[embedderHostName]/[email]\n\t\tif (this.requiredAuth) {\n\t\t\tconst requiresSignIn = this.app.vocabApi.hasVerifiedToken() ? '' : 'Requires sign-in. '\n\t\t\tsubmitDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('min-width', '80px')\n\t\t\t\t.html('Server')\n\t\t\t\t.attr(\n\t\t\t\t\t'title',\n\t\t\t\t\t`${requiresSignIn}Save the session into a remote server. The session can be easily shared across your different devices and recovered using the 'Open from server' option.`\n\t\t\t\t)\n\t\t\t\t.property('disabled', !this.app.vocabApi.hasVerifiedToken())\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tif (!this.app.vocabApi.hasVerifiedToken()) {\n\t\t\t\t\t\talert('Requires sign-in')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst name = input.property('value') || placeholder\n\t\t\t\t\tthis.savedSessions[name] = this.app.getState()\n\t\t\t\t\tconst res = await this.getSessionUrl(name)\n\t\t\t\t\tif (res.id != name) throw `error saving ${name}`\n\t\t\t\t\t// this.download(name)\n\t\t\t\t\tthis.confirmAction(`Saved '<b>${name}</b>' on the server`)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tdownload(name = '') {\n\t\tconst sessionName = name || this.sessionName\n\t\tconst ext = sessionName?.endsWith('.txt') ? '' : '.txt'\n\t\tconst filename = `${sessionName}${ext}`\n\t\tto_textfile(filename, JSON.stringify(this.savedSessions[sessionName]))\n\t}\n\n\tasync getSessionUrl(filename = '') {\n\t\tconst headers = await this.app.vocabApi.mayGetAuthHeaders('termdb')\n\t\tconst state = structuredClone(this.app.getState())\n\t\tconst { protocol, host, search, origin, href } = window.location\n\t\tstate.embedder = { protocol, host, search, origin, href }\n\t\tif (filename) {\n\t\t\t// a non-empty filename value implies saving by email and having auth session,\n\t\t\t// since it's easy for different users to use the same non-random filename\n\t\t\tstate.__sessionFor__ = {\n\t\t\t\troute: this.route,\n\t\t\t\tfilename,\n\t\t\t\tdslabel: this.dslabel,\n\t\t\t\tembedder: window.location.hostname\n\t\t\t}\n\t\t}\n\t\tconst res = await dofetch3('/massSession', {\n\t\t\theaders,\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(state)\n\t\t})\n\n\t\tif (filename) {\n\t\t\treturn res\n\t\t} else {\n\t\t\tconst url = `${this.hostURL}/?mass-session-id=${res.id}&noheader=1`\n\t\t\tthis.dom.tip.showunder(this.dom.button.node())\n\t\t\tconst linkDiv = this.dom.tip.d.append('div').style('margin', '10px')\n\t\t\tlinkDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'flex')\n\t\t\t\t.style('margin-bottom', '12px')\n\t\t\t\t.html(`Open or copy the session link.`)\n\n\t\t\tconst a = linkDiv.append('a').style('display', 'none').attr('href', url).attr('target', '_blank').html(res.id)\n\n\t\t\t// open button\n\t\t\tlinkDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.text('Open link')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\ta.node().click()\n\t\t\t\t})\n\n\t\t\t// copy button\n\t\t\tlinkDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t.text('Copy link')\n\t\t\t\t.on('click', async event => {\n\t\t\t\t\tawait navigator.clipboard.writeText(url)\n\t\t\t\t\tthis.dom.copytip.clear().showunder(event.target)\n\t\t\t\t\tthis.dom.copytip.d.append('div').html('✓')\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.dom.copytip.hide()\n\t\t\t\t\t}, 1000)\n\t\t\t\t})\n\n\t\t\tif (this.hostURL != window.location.origin) {\n\t\t\t\t// Avoid the multi-window/tab sequence to recover the session:\n\t\t\t\t// intercept the click on the URL link, so that the embedder URL is opened\n\t\t\t\t// instead of the hostURL with mass session id, and this window will post\n\t\t\t\t// a message to the child window with the link data instead\n\t\t\t\t//\n\t\t\t\t// NOTE: the multi-window/tab sequence is only necessary when the URL link\n\t\t\t\t// was not opened by the embedder window\n\t\t\t\t//\n\t\t\t\ta.on('click', event => {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tparentCorsMessage({ state }, 'noredirect')\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlinkDiv.append('div').html(`\n\t\t\t\t\t<br>\n\t\t\t\t\t<div style=\"max-width: 400px; font-size: 1em; opacity:.6\">\n\t\t\t\t\t<span>NOTES</span>\n\t\t\t\t\t<ul>\n\t\t\t\t\t<li>A recovered session may hide data or views to users that are not authorized to access the saved datasets or features.</li>\n\t\t\t\t\t<li>This session will be saved for ${this.opts.massSessionDuration} days.</li>\n\t\t\t\t\t</ul>\n\t\t\t\t\t</div>`)\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.dom.button.property('disabled', false)\n\t\t\t}, 1000)\n\t\t}\n\t}\n\n\tasync delete() {\n\t\tconst t = await this.listSessions({\n\t\t\ttrClickHandler: function (event) {\n\t\t\t\tconst input = this.lastChild.querySelector('input')\n\t\t\t\tconst checked = event.target == input ? input.checked : !input.checked\n\t\t\t\tselect(this).style('text-decoration', checked ? 'line-through' : '')\n\t\t\t\tif (event.target != input) input.checked = checked\n\t\t\t\tconst checkedRows = t.table.node().querySelectorAll('input:checked')\n\t\t\t\tsubmitBtn.property('disabled', checkedRows.length ? false : true)\n\t\t\t}\n\t\t})\n\n\t\t// add a 3rd column for the checkboxes\n\t\tt.headtr.append('th').html('Delete')\n\t\tt.trs.each(function (d) {\n\t\t\tselect(this)\n\t\t\t\t.append('td')\n\t\t\t\t.style('text-align', 'center')\n\t\t\t\t.append('input')\n\t\t\t\t.attr('type', 'checkbox')\n\t\t\t\t.attr('value', d.id)\n\t\t})\n\n\t\tconst submitBtn = this.dom.tip.d\n\t\t\t.append('div')\n\t\t\t.style('text-align', 'center')\n\t\t\t.append('button')\n\t\t\t.html('Delete selected sessions')\n\t\t\t.property('disabled', true)\n\t\t\t.on('click', async () => {\n\t\t\t\tconst inputs = t.table.node().querySelectorAll('input')\n\t\t\t\tconst sessionIdsDeletedFromServer = []\n\t\t\t\tfor (const input of inputs) {\n\t\t\t\t\tif (select(input).property('checked')) {\n\t\t\t\t\t\tconst d = input.parentNode.parentNode.__data__\n\t\t\t\t\t\tif (d.loc == 'browser') {\n\t\t\t\t\t\t\tdelete this.savedSessions[input.value] //checkedIds.push(input.value)\n\t\t\t\t\t\t} else if (d.loc == 'server') {\n\t\t\t\t\t\t\tdelete this.serverCachedSessions[input.value]\n\t\t\t\t\t\t\tsessionIdsDeletedFromServer.push(input.value)\n\t\t\t\t\t\t} else throw `unknown cache location=${d.loc}`\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlocalStorage.setItem('savedMassSessions', JSON.stringify(this.savedSessions))\n\t\t\t\ttry {\n\t\t\t\t\tconst headers = await this.app.vocabApi.mayGetAuthHeaders('termdb')\n\t\t\t\t\tconst body = {\n\t\t\t\t\t\tids: sessionIdsDeletedFromServer,\n\t\t\t\t\t\troute: this.route,\n\t\t\t\t\t\tdslabel: this.dslabel,\n\t\t\t\t\t\tembedder: window.location.hostname\n\t\t\t\t\t}\n\t\t\t\t\tconst res = dofetch3(`/massSession?`, { method: 'DELETE', headers, body })\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow e\n\t\t\t\t}\n\t\t\t\tthis.dom.tip.hide()\n\t\t\t})\n\t}\n\n\tshowBackBtn() {\n\t\tthis.dom.tip.d\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_clbtext2')\n\t\t\t.style('margin-bottom', '10px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html(`< Session Menu`)\n\t\t\t.on('click', () => this.showMenu())\n\t}\n\n\tconfirmAction(html) {\n\t\tthis.dom.tip.clear().d.append('div').html(html).transition().delay(3000).duration(1000).style('opacity', 0)\n\n\t\tsetTimeout(() => {\n\t\t\tthis.dom.tip.hide()\n\t\t}, 3500)\n\t}\n}\n\n// may need to edit state based on updated expectations,\n// such as new or deprecated plot settings keys/values\nasync function preprocessState(state, app) {\n\tdelete state.termdbConfig\n\tif (state.plots) {\n\t\tconst promises = []\n\t\tfor (const plot of state.plots) {\n\t\t\tpromises.push(\n\t\t\t\t(async () => {\n\t\t\t\t\tconst _ = await importPlot(plot.chartType)\n\t\t\t\t\treturn await _.getPlotConfig(plot, app)\n\t\t\t\t})()\n\t\t\t)\n\t\t}\n\t\ttry {\n\t\t\tawait Promise.all(promises)\n\t\t} catch (e) {\n\t\t\tconsole.log(e)\n\t\t\tapp.printError(e)\n\t\t}\n\t}\n}\n\nexport const sessionBtnInit = getCompInit(MassSessionBtn)\n", "import { getId } from './nav'\nimport { type AppApi, getCompInit } from '#rx'\nimport type { Elem, Div, H2 } from '../types/d3'\nimport type { SelectCohortEntry } from '#types'\nimport { renderTable, type TableRow } from '#dom'\nimport { select } from 'd3-selection'\n\n/* \n\"about\" tab will display following contents inside this.subheader:\n- if ds uses subcohorts:\n\t- <h2> for selectCohort.title\n\t- description\n\t- radio button options\n- custom html via massNav.about.html (todo images and cartoon)\n- active items to launch demo plots\n- server info\n*/\n\nconst cohortTableActiveColor = 'yellow'\n\n// this type is fully defined in MassNav def in dataset.ts but not in a form that can extract \"about\" config to share. thus need to repeat here to avoid tsc err\ntype AboutObj = {\n\thtml: string\n\tactiveItems?: { items: any }\n\tdisclaimer?: any\n}\n\ntype MassAboutOpts = {\n\t/** Optional. Set in the dataset file under .massNav.tabs.about. Otherwise null. */\n\taboutOverrides: AboutObj | null\n\t/** Required. Provided from nav component */\n\tapp: AppApi\n\t/** Required. Provided from nav component */\n\tinstanceNum: number\n\t/** Optional. Set in the dataset file under .termdb.selectCohort. Otherwise null. */\n\tselectCohort: SelectCohortEntry | null\n\t/** Required. .dom.subheader.about in nav component, assigned to this.subheader */\n\tsubheader: Elem\n}\n\ntype MassAboutDom = {\n\t/** Fine print dom shown between the cohort specific content and the server info */\n\tcohortAsterisk?: Div\n\t/** Displays description */\n\tcohortDescription: Div\n\t/** Div for cohort radio buttons */\n\tcohortOpts?: Div\n\t/** Text above radio cohort options */\n\tcohortPrompt?: Div\n\t/** */\n\tcohortTable?: Div\n\t/** Title above the cohort introduction/content */\n\tcohortTitle?: H2\n}\n//TODO: Make a validate opts fn\nexport class MassAbout {\n\tstatic type = 'about'\n\n\taboutOverrides: AboutObj | null\n\tapp: AppApi\n\tdom: MassAboutDom\n\tinstanceNum: number\n\tselectCohort: SelectCohortEntry | null\n\tsubheader: Elem // where all contents are rendered\n\ttype: string\n\topts: MassAboutOpts\n\tstate: any\n\n\tconstructor(opts: MassAboutOpts) {\n\t\tthis.opts = opts\n\t\tthis.type = MassAbout.type\n\t\tthis.app = opts.app\n\t\tthis.subheader = opts.subheader\n\t\tthis.instanceNum = opts.instanceNum\n\t\tthis.aboutOverrides = opts.aboutOverrides\n\t\tthis.selectCohort = opts.selectCohort\n\t\tthis.dom = {\n\t\t\tcohortDescription: this.subheader\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-desc')\n\t\t\t\t.style('margin-left', '10px')\n\t\t}\n\n\t\tif (opts?.selectCohort?.title) {\n\t\t\tthis.dom.cohortTitle = opts.subheader\n\t\t\t\t.append('h2')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-title')\n\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t.text(opts.selectCohort.title)\n\t\t}\n\n\t\tif (opts.selectCohort?.prompt) {\n\t\t\tthis.dom.cohortPrompt = this.subheader\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-prompt')\n\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t.style('padding-top', '30px')\n\t\t\t\t.style('padding-bottom', '10px')\n\t\t\t\t.style('font-weight', 'bold')\n\t\t\t\t.style('font-size', '1.2em')\n\t\t\t\t.text(opts.selectCohort.prompt)\n\t\t}\n\n\t\tif (opts.selectCohort) {\n\t\t\tthis.dom.cohortOpts = this.subheader.append('div').style('margin-bottom', '30px').style('margin-left', '10px')\n\t\t}\n\t}\n\n\t/* render all contents into this.subheader\n\tdo it through init() means that contents are rendered just once on launching mass ui and won't be rerendered or updated\n\tsince there's no reason to update about tab contents while user is interacting with mass ui\n\t*/\n\tinit(appState) {\n\t\t/** If selectCohort available, options in the about html will not show */\n\t\tthis.initCohort(appState)\n\t\tthis.initCustomHtml()\n\t\tthis.initActiveItems()\n\t\tthis.initDisclaimer()\n\t\t//Always show the release version and server launch date at the bottom\n\t\tthis.showServerInfo()\n\t}\n\n\tasync main() {\n\t\t// do not render unless the cohort tab is active\n\t\tif (this.state.nav.activeTab !== 0) return\n\t\tawait this.renderCohortsTable()\n\t\tif (this.opts.selectCohort) {\n\t\t\tif (this.opts.selectCohort.description) {\n\t\t\t\tthis.dom.cohortDescription.html(this.opts.selectCohort.description)\n\t\t\t} else if (this.opts.selectCohort.descriptionByCohort) {\n\t\t\t\tthis.dom.cohortDescription.html(\n\t\t\t\t\tthis.opts.selectCohort.descriptionByCohort[\n\t\t\t\t\t\tthis.state.termdbConfig.selectCohort.values[this.state.activeCohort].keys.join(',')\n\t\t\t\t\t]\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tinitCohort = appState => {\n\t\tif (this.selectCohort == null) return\n\t\t//Move to validate opts fn\n\t\tif (!this.selectCohort.values) return\n\n\t\tconst instanceNum = this.instanceNum\n\t\tconst activeCohort = appState.activeCohort\n\t\tconst app = this.app\n\n\t\t//TODO: replace with make_radios\n\t\tthis.dom\n\t\t\t.cohortOpts!.append('table')\n\t\t\t.attr('data-testid', 'sjpp-about-cohort-options-table')\n\t\t\t.selectAll('tr')\n\t\t\t.data(this.selectCohort.values)\n\t\t\t.enter()\n\t\t\t.append('tr')\n\t\t\t.each(function (d, i, nodes) {\n\t\t\t\tconst tr = select(nodes[i])\n\t\t\t\tconst td0 = tr.append('td')\n\t\t\t\tconst radioName = 'sja-termdb-cohort-' + instanceNum\n\t\t\t\tconst radioId = radioName + '-' + i\n\t\t\t\ttd0\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.style('scale', '1.2')\n\t\t\t\t\t.attr('type', 'radio')\n\t\t\t\t\t.attr('name', radioName)\n\t\t\t\t\t.attr('id', radioId)\n\t\t\t\t\t.attr('value', i)\n\t\t\t\t\t.property('checked', i === activeCohort)\n\t\t\t\t\t.style('margin-right', '5px')\n\t\t\t\t\t.style('margin-left', '0px')\n\t\t\t\t\t.on('click', async event => {\n\t\t\t\t\t\tconst state = app.getState()\n\t\t\t\t\t\tconst clearOnChange = state.termdbConfig.selectCohort.clearOnChange\n\t\t\t\t\t\tif (clearOnChange) {\n\t\t\t\t\t\t\tconst subactions: any[] = []\n\t\t\t\t\t\t\tconst toBeCleared: string[] = []\n\t\t\t\t\t\t\tconst plots = state.plots\n\t\t\t\t\t\t\tconst filter = state.termfilter.filter.lst.find(f => f.tag == 'filterUiRoot')?.lst\n\t\t\t\t\t\t\tconst groups = state.groups\n\n\t\t\t\t\t\t\tif (clearOnChange.plots && plots?.length) toBeCleared.push('plots')\n\t\t\t\t\t\t\tfor (const plot of plots) {\n\t\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\t\ttype: 'plot_delete',\n\t\t\t\t\t\t\t\t\tid: plot.id\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (clearOnChange.filter && filter?.length) toBeCleared.push('filters')\n\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\ttype: 'filter_replace',\n\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\ttype: 'tvslst',\n\t\t\t\t\t\t\t\t\tin: true,\n\t\t\t\t\t\t\t\t\tjoin: '',\n\t\t\t\t\t\t\t\t\ttag: 'filterUiRoot',\n\t\t\t\t\t\t\t\t\tlst: []\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (clearOnChange.groups && groups?.length) {\n\t\t\t\t\t\t\t\ttoBeCleared.push('groups')\n\t\t\t\t\t\t\t\tfor (const group of groups) {\n\t\t\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\t\t\ttype: 'delete_group',\n\t\t\t\t\t\t\t\t\t\tname: group.name\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfor (const term of state.customTerms) {\n\t\t\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\t\t\ttype: 'delete_customTerm',\n\t\t\t\t\t\t\t\t\t\tname: term.name\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsubactions.push({ type: 'cohort_set', activeCohort: i })\n\t\t\t\t\t\t\tif (toBeCleared.length) {\n\t\t\t\t\t\t\t\tconst confirm = window.confirm(\n\t\t\t\t\t\t\t\t\t`Changing the cohort will clear all ${joinByComma(\n\t\t\t\t\t\t\t\t\t\ttoBeCleared\n\t\t\t\t\t\t\t\t\t)}. To proceed, click \"OK\". To save the session, click \"Cancel\" and then click the \"Session\" button at the top of the page.`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tif (!confirm) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tapp.dispatch({\n\t\t\t\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\t\t\t\tsubactions\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else app.dispatch({ type: 'cohort_set', activeCohort: i })\n\t\t\t\t\t})\n\n\t\t\t\ttd0\n\t\t\t\t\t.append('label')\n\t\t\t\t\t.style('font-size', '1.4em')\n\t\t\t\t\t.attr('for', radioId)\n\t\t\t\t\t.attr('colspan', 2)\n\t\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t\t.html((d: any) => d.label)\n\n\t\t\t\ttr.selectAll('td')\n\t\t\t\t\t.style('max-width', '600px')\n\t\t\t\t\t.style('padding-bottom', '10px')\n\t\t\t\t\t.style('padding-right', '20px')\n\t\t\t\t\t.style('vertical-align', 'top')\n\t\t\t})\n\n\t\tthis.dom.cohortTable = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-about-cohort-table')\n\t\t\t.style('margin-left', '12px')\n\n\t\tif (this.selectCohort.asterisk) {\n\t\t\tthis.dom.cohortAsterisk = this.subheader\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-asterisk')\n\t\t\t\t.style('margin', '10px')\n\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t.text(this.selectCohort.asterisk)\n\t\t}\n\t}\n\n\trenderCohortsTable = async () => {\n\t\tif (!this.dom.cohortTable) return\n\t\tthis.dom.cohortTable.selectAll('*').remove()\n\t\tconst columns = [{ label: 'Feature' }]\n\t\tconst rows: TableRow[] = []\n\t\tconst result = await this.app.vocabApi.getCohortsData()\n\t\tif ('error' in result) throw result.error\n\t\tif (this.selectCohort?.values) {\n\t\t\t// selectCohort.values[] contains ordered set of cohorts\n\t\t\t// ensure cohorts in cohorts table follow this order\n\t\t\tconst values = this.selectCohort.values\n\t\t\tresult.cohorts.sort((a, b) => {\n\t\t\t\tconst aIndex = values.findIndex(v => v.keys.toString() == a.cohort)\n\t\t\t\tconst bIndex = values.findIndex(v => v.keys.toString() == b.cohort)\n\t\t\t\tif (aIndex < bIndex) return -1\n\t\t\t\tif (aIndex > bIndex) return 1\n\t\t\t\treturn 0\n\t\t\t})\n\t\t}\n\t\tif (!result.cfeatures.length) return\n\t\tfor (const feature of result.features) rows.push([{ value: feature.name }])\n\t\tfor (const cohort of result.cohorts) {\n\t\t\tif (cohort.subcohorts?.length) continue\n\t\t\tcolumns.push({ label: cohort.name })\n\t\t\tfor (const [i, feature] of result.features.entries()) {\n\t\t\t\tconst cf = result.cfeatures.find(cf => cf.idfeature === feature.idfeature && cf.cohort === cohort.cohort)\n\t\t\t\tif (cf) rows[i].push({ value: cf.value })\n\t\t\t}\n\t\t}\n\n\t\trenderTable({\n\t\t\trows,\n\t\t\tcolumns,\n\t\t\tdiv: this.dom.cohortTable,\n\t\t\tshowLines: false,\n\t\t\tmaxHeight: '60vh',\n\t\t\theader: { style: { 'font-size': '1.2em', 'font-weight': 'bold' } }\n\t\t})\n\n\t\tthis.dom.cohortTable.select('table').style('border-collapse', 'collapse')\n\t\tthis.dom.cohortTable.selectAll(`tbody > tr > td`).style('background-color', 'transparent').style('padding', '6px')\n\t\tconst state = this.app.getState()\n\t\tconst selectCohort = state.termdbConfig.selectCohort\n\t\tconst activeCohort = state.activeCohort\n\t\tconst keys = selectCohort.values[activeCohort].keys\n\t\tlet selector = `tbody > tr > td:nth-child(${activeCohort + 2})`\n\t\tconst combined = keys.length > 1\n\t\tif (combined) {\n\t\t\tselector = ''\n\t\t\tfor (const key of keys) {\n\t\t\t\tconst i = result.cohorts.map(c => c.cohort).indexOf(key)\n\t\t\t\tif (selector !== '') selector += ','\n\t\t\t\tselector += `tbody > tr > td:nth-child(${i + 2})`\n\t\t\t}\n\t\t}\n\t\tconst activeColumns = this.dom.cohortTable.selectAll(selector)\n\t\tconst color = state.termdbConfig.massNav?.activeColor || cohortTableActiveColor\n\t\tactiveColumns.style('background-color', color)\n\t}\n\n\tinitCustomHtml = () => {\n\t\tif (this.selectCohort != null) return\n\t\tif (!this.aboutOverrides?.html) return\n\t\tthis.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-custom-about-content')\n\t\t\t.style('padding', '10px')\n\t\t\t.html(this.aboutOverrides.html)\n\t}\n\n\tinitActiveItems = () => {\n\t\tif (!this.aboutOverrides?.activeItems) return\n\n\t\t// todo: customize general holder by activeItems.holderStyle{}\n\t\tconst div = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-custom-about-activeItems')\n\t\t\t.style('padding', '0px 0px 10px 20px')\n\n\t\tfor (const item of this.aboutOverrides.activeItems.items) {\n\t\t\t// todo: by item.type, item.divStyle{}\n\t\t\tdiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('margin', '5px')\n\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t.attr('data-testid', 'sjpp-custom-active-item-btn')\n\t\t\t\t.html(item.title)\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\t/* First, set the active tab to toggle to the plots tab and wait for the tab to be set,\n\t\t\t\t\totherwise the plotDiv is hidden when rendering and\n\t\t\t\t\tmay cause issues. A known issue is that getMaxLabelWidth getBBox on a hidden div returns width=0\n\t\t\t\t\tthis affects the legend rendering in plots like the scatter resulting in overlapping texts\n\t\t\t\t\t*/\n\t\t\t\t\tawait this.app.dispatch({\n\t\t\t\t\t\ttype: 'tab_set',\n\t\t\t\t\t\tactiveTab: 1\n\t\t\t\t\t})\n\t\t\t\t\t// after switching tab so plot div is shown, dispatch to create the plot\n\t\t\t\t\tthis.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tid: getId(),\n\t\t\t\t\t\tconfig: structuredClone(item.plot)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t}\n\t}\n\n\tinitDisclaimer = () => {\n\t\tconst d = this.aboutOverrides?.disclaimer\n\t\tif (!d) return\n\t\t// customize styling from d{}\n\t\tconst div = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-custom-about-disclaimer')\n\t\t\t.style('margin', '10px 0 20px 10px')\n\t\t\t.style('opacity', 0.7)\n\t\t\t.style('padding', '10px')\n\t\t\t.style('background-color', '#f8f9fa')\n\t\t\t.style('border-left', '4px solid #6c757d')\n\t\t\t.style('font-size', '0.8em')\n\t\tdiv.append('div').style('margin-bottom', '8px').style('font-weight', 'bold').text('DISCLAIMER')\n\t\tdiv.append('div').text(d.text)\n\t}\n\n\tshowServerInfo = () => {\n\t\tconst state = this.app.getState()\n\t\tconst about = state.termdbConfig.massNav?.tabs?.about\n\t\tif (!about && !this.app.opts.pkgver && !this.app.opts.launchDate) return\n\t\tconst dataRelease = about?.dataRelease\n\t\tconst additionalInfo = about?.additionalInfo\n\t\tconst div = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-about-server-info')\n\t\t\t.style('margin', '10px')\n\t\t\t.style('font-size', '.8em')\n\n\t\tconst htmlArr: string[] = []\n\t\tif (dataRelease) {\n\t\t\thtmlArr.push(`Data Release: <a href=${dataRelease.link} target=_blank>${dataRelease.version}</a>`)\n\t\t}\n\t\tif (this.app.opts.pkgver) {\n\t\t\thtmlArr.push(\n\t\t\t\t`Software Release: <a href=https://github.com/stjude/proteinpaint/pkgs/container/ppfull target=_blank>${this.app.opts.pkgver}</a>`\n\t\t\t)\n\t\t}\n\t\tif (this.app.opts.launchDate) {\n\t\t\thtmlArr.push(`Server Launched: ${this.app.opts.launchDate}`)\n\t\t}\n\t\tif (additionalInfo) {\n\t\t\thtmlArr.push(additionalInfo)\n\t\t}\n\t\tdiv.append('div').html(htmlArr.join('; '))\n\t}\n}\n\nexport const aboutInit = getCompInit(MassAbout)\n\nfunction joinByComma(arr) {\n\tif (!arr.length) return ''\n\telse if (arr.length == 1) return arr[0]\n\telse if (arr.length == 2) return arr.join(' and ')\n\telse return `${arr.slice(0, -1).join(', ')}, and ${arr.slice(-1)}`\n}\n", "import { getCompInit, type RxComponent } from '#rx'\nimport type { MassAppApi } from './types/mass'\nimport { Menu } from '#dom'\nimport { keyupEnter } from '#src/client'\nimport { dofetch3 } from '#common/dofetch'\nimport type { ChatRequest, ChatResponse, OmnisearchResult } from '#types'\nimport { sayerror } from '../dom/sayerror.ts'\nimport { select } from 'd3-selection'\nimport { fillTermWrapper } from '#termsetting'\nimport { dtsnvindel, dtcnv, dtsv, dtfusionrna } from '#shared/common.js'\nimport { DNA_METHYLATION } from '#shared/terms.js'\nimport { getDNAMethUnit } from '#tw/dnaMethylation'\nimport { first_genetrack_tolist } from '#common/1stGenetk'\n\nconst MIN_PROMPT_LENGTH_FOR_OMNISEARCH = 3 // Set a minimum prompt length for omnisearch to trigger\nconst MAX_PROMPT_LENGTH_FOR_OMNISEARCH = 15 // Set a maximum prompt length for omnisearch to trigger\nconst MIN_PROMPT_LENGTH_FOR_CHAT = 5 // Set a minimum prompt length for chat submission\n\n/** Build a region-based dnaMethylation term for the given coordinates. */\nfunction makeMethylationRegionTerm(opts: { chr: string; start: number; stop: number }, vocabApi: any) {\n\tconst { chr, start, stop } = opts\n\tif (!chr || !Number.isInteger(start) || !Number.isInteger(stop)) throw new Error('invalid coordinate')\n\treturn {\n\t\tchr,\n\t\tstart,\n\t\tstop,\n\t\ttype: DNA_METHYLATION,\n\t\tunit: getDNAMethUnit('region', vocabApi),\n\t\tgenomicFeatureType: 'region'\n\t}\n}\n\n/**\n * Embed a genome browser of a gene/region into `holder` with a \"Submit Region\" button. On submit,\n * builds a region-based dnaMethylation term from the region the user navigated to and passes it to\n * `callback`. Returns the Block instance. Used by the mass omnisearch to open a methylation region\n * picker for a gene. (The dnaMethylation search handler keeps its own equivalent inline logic.)\n */\nasync function embedMethylationRegionPicker(opts: {\n\tholder: any\n\tgenomeObj: any\n\tvocabApi: any\n\tchr: string\n\tstart: number\n\tstop: number\n\tcallback: (term: any) => void | Promise<void>\n\tdebug?: boolean\n}) {\n\tconst { holder, genomeObj, vocabApi, chr, start, stop, callback } = opts\n\tif (!chr || !Number.isInteger(start) || !Number.isInteger(stop)) throw new Error('unable to retrieve gene coordinate')\n\n\tholder.selectAll('*').remove()\n\tholder.style('display', 'block')\n\tholder.append('div').style('opacity', 0.6).text('Navigate genome browser to desired region')\n\n\tconst arg: any = {\n\t\tholder,\n\t\tgenome: genomeObj, // genome obj\n\t\tchr,\n\t\tstart,\n\t\tstop,\n\t\ttklst: [],\n\t\tnobox: true,\n\t\twidth: 500,\n\t\thidegenelegend: true,\n\t\tdebugmode: opts.debug\n\t}\n\tfirst_genetrack_tolist(genomeObj, arg.tklst)\n\tconst _ = await import('#src/block')\n\tconst blockInstance = new _.Block(arg)\n\n\tholder\n\t\t.append('div')\n\t\t.attr('data-testid', 'sjpp-dnaMethylation-submitDiv')\n\t\t.style('margin', '10px 0px')\n\t\t.append('button')\n\t\t.style('border', 'none')\n\t\t.style('border-radius', '20px')\n\t\t.style('padding', '10px 15px')\n\t\t.text('Submit Region')\n\t\t.on('click', async () => {\n\t\t\tconst { chr, start, stop } = blockInstance.rglst[0]\n\t\t\tawait callback(makeMethylationRegionTerm({ chr, start, stop }, vocabApi))\n\t\t})\n\n\treturn blockInstance\n}\n\nclass MassAiChatBot implements RxComponent {\n\tstatic type = 'chat'\n\ttype: string\n\topts: any\n\tapp: MassAppApi\n\tdom!: any\n\tstate: any\n\tid!: string\n\tclear: any\n\tshowTerms: any\n\tnoResult: any\n\tisChat: any\n\n\tconstructor(opts: any) {\n\t\tthis.type = MassAiChatBot.type\n\t\tthis.opts = opts\n\t\tthis.app = opts.app\n\t\tthis.opts.usecase = this.opts.usecase || { target: 'dictionary', detail: 'term' }\n\t\tthis.opts.targetType = this.opts.targetType ? this.opts.targetType : 'Dictionary Variables'\n\t\tthis.isChat = this.app.getState().termdbConfig?.queries?.chat // Storing if chat is supported by the dataset for easy access in other methods\n\t\tsetRenderers(this) // needed so that this.showTerms, noResult, clear work\n\t}\n\n\tgetState(appState: any) {\n\t\treturn {\n\t\t\tcohortStr:\n\t\t\t\tappState.activeCohort == -1 || !appState.termdbConfig.selectCohort\n\t\t\t\t\t? ''\n\t\t\t\t\t: appState.termdbConfig.selectCohort.values[appState.activeCohort].keys.slice().sort().join(','),\n\t\t\tsearch: appState.search,\n\t\t\tnav: appState.nav\n\t\t}\n\t}\n\n\tasync init() {\n\t\t// Note: no server-side request here \u2014 the omnisearch resolves dictionary terms, genes, and the\n\t\t// dataset's gene data types together in a single request per search (see doSearch), so nothing is\n\t\t// fetched eagerly at component init.\n\t\tthis.initDom()\n\t}\n\n\t// Search method, adapted from MassSearch.doSearch\n\tasync doSearch(prompt: string) {\n\t\tif (!prompt) {\n\t\t\tthis.clear({ hide: true })\n\t\t\treturn\n\t\t}\n\t\tconst cohortStr = this.getState(this.app.getState()).cohortStr\n\t\t// Single server request that searches dictionary variables and genes together, and reports the\n\t\t// dataset's gene data types. The server (termdb/chat, runOmnisearch) does the gene lookup for the\n\t\t// search results, so the client does not need an extra genelookup request during omnisearch.\n\t\tconst data: OmnisearchResult = await dofetch3('termdb/chat', {\n\t\t\tbody: {\n\t\t\t\tgenome: this.app.vocabApi.vocab.genome,\n\t\t\t\tdslabel: this.app.vocabApi.vocab.dslabel,\n\t\t\t\tomnisearch: true,\n\t\t\t\tprompt,\n\t\t\t\tcohortStr,\n\t\t\t\tusecase: this.opts.usecase,\n\t\t\t\ttreeFilter: this.app.vocabApi.state?.treeFilter\n\t\t\t}\n\t\t})\n\t\tif (data.error) throw data.error\n\t\tconst lst: any[] = Array.isArray(data.dictionaryTerms) ? data.dictionaryTerms : []\n\t\t// Each gene match carries its own available data types (a gene may have e.g. SNV/indel while\n\t\t// another does not), so action buttons are decided per gene rather than dataset-wide.\n\t\tconst genes: { gene: string; dataTypes: any; coord?: any }[] = Array.isArray(data.genes) ? data.genes : []\n\n\t\t// Build one entry per gene, skipping any whose name already appears among the dictionary results.\n\t\t// Each gene renders as a single row whose buttons are the actions available for that gene, and\n\t\t// its own per-variant-type options (SNV/indel, CNV, SV/fusion) are attached for showTerm to use.\n\t\tconst dictNames = new Set(lst.map((t: any) => t.name?.toUpperCase()))\n\t\tconst geneMap = new Map<string, any>()\n\t\tfor (const g of genes) {\n\t\t\tconst gene = g?.gene\n\t\t\tif (!gene || dictNames.has(gene.toUpperCase())) continue\n\t\t\tconst dt = g.dataTypes || {}\n\t\t\t// per-gene variant sub-type buttons; svfusion maps to two dts (SV and fusion), tried in order\n\t\t\tconst geneVariantTypes: any[] = []\n\t\t\tif (dt.snvindel) geneVariantTypes.push({ label: 'SNV/indel', testid: 'snvindel', dtCandidates: [dtsnvindel] })\n\t\t\tif (dt.cnv) geneVariantTypes.push({ label: 'CNV', testid: 'cnv', dtCandidates: [dtcnv] })\n\t\t\tif (dt.svfusion)\n\t\t\t\tgeneVariantTypes.push({ label: 'SV/fusion', testid: 'svfusion', dtCandidates: [dtsv, dtfusionrna] })\n\t\t\tconst entry: any = { name: gene, gene, isGene: true }\n\t\t\tif (dt.geneExpression) entry.isGeneExpression = true\n\t\t\tif (geneVariantTypes.length) {\n\t\t\t\tentry.isGeneVariant = true\n\t\t\t\tentry.geneVariantTypes = geneVariantTypes\n\t\t\t}\n\t\t\tif (dt.dnaMethylation) {\n\t\t\t\tentry.isMethylation = true\n\t\t\t\t// server-resolved default coordinate, used to seed the genome browser region picker\n\t\t\t\tentry.coord = g.coord\n\t\t\t}\n\t\t\t// only list a gene if it has at least one available data type / action\n\t\t\tif (entry.isGeneExpression || entry.isGeneVariant || entry.isMethylation) {\n\t\t\t\tgeneMap.set(gene.toUpperCase(), entry)\n\t\t\t}\n\t\t}\n\t\tfor (const entry of geneMap.values()) lst.push(entry)\n\t\tif (!lst.length) {\n\t\t\t// Show the \"No match...\" message one time at the first miss\n\t\t\tif (!this.dom.noMatchShown) {\n\t\t\t\tthis.dom.noMatchShown = true\n\t\t\t\tthis.noResult()\n\t\t\t}\n\t\t} else {\n\t\t\tthis.dom.noMatchShown = false\n\t\t\tthis.showTerms({ lst })\n\t\t}\n\t}\n\n\tinitDom() {\n\t\t//const cohortStr = this.getState(appState).cohortStr\n\t\tlet text = 'Search an item'\n\t\tlet height = '1px' // No white space needed for search only\n\t\tif (this.isChat) {\n\t\t\ttext = 'Ask a question'\n\t\t\theight = '200px'\n\t\t}\n\t\tthis.dom = {\n\t\t\ttip: new Menu({ padding: '5px' }),\n\t\t\tdiv: this.opts.subheader,\n\t\t\terror: this.opts.subheader.append('div').attr('id', 'sjpp-corrVolcano-error').style('opacity', 0.75),\n\t\t\tbubbleDiv: this.opts.subheader\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sjpp_show_scrollbar')\n\t\t\t\t.style('margin', '5px 20px 0px 20px')\n\t\t\t\t.style('height', height)\n\t\t\t\t.style('overflow', 'auto')\n\t\t\t\t.style('scroll-behavior', 'smooth')\n\t\t}\n\n\t\tconst inputSel = this.dom.div\n\t\t\t.append('input')\n\t\t\t.attr('type', 'search')\n\t\t\t.style('margin', '15px')\n\t\t\t.style('padding', '17px')\n\t\t\t.style('border-radius', '34px')\n\t\t\t.attr('size', 70)\n\t\t\t.attr('placeholder', text)\n\n\t\t// Store the input node so the search result tip can position under it\n\t\tthis.dom.inputNode = inputSel.node()\n\n\t\t// Result panel inside the tip, mirroring MassSearch.initUI\n\t\tthis.dom.resultDiv = this.dom.tip.d\n\t\t\t.style('border-left', 'solid 1px rgb(133,182,225)')\n\t\t\t.style('padding-left', '5px')\n\t\t\t.attr('tabindex', -1)\n\n\t\tinputSel\n\t\t\t.on('keyup.search', async (event: KeyboardEvent) => {\n\t\t\t\tif (keyupEnter(event)) return\n\t\t\t\tconst prompt = (event.target as HTMLInputElement).value.trim()\n\t\t\t\tif (!prompt) {\n\t\t\t\t\tthis.dom.noMatchShown = false\n\t\t\t\t\tthis.clear({ hide: true })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (MIN_PROMPT_LENGTH_FOR_OMNISEARCH <= prompt.length && prompt.length <= MAX_PROMPT_LENGTH_FOR_OMNISEARCH) {\n\t\t\t\t\t//console.log(\n\t\t\t\t\t//\t`User prompt: \"${prompt}\", cohortStr: \"${cohortStr}\", usecase: \"${this.opts.usecase}\", targetType: \"${this.opts.targetType}\"`\n\t\t\t\t\t//)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.doSearch(prompt) // Search as user types\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tif (e.stack) console.log(e.stack)\n\t\t\t\t\t\tsayerror(this.dom.resultDiv, 'Error: ' + (e.message || e))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.dom.noMatchShown = false\n\t\t\t\t\tthis.clear({ hide: true })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('keyup.submit', async (event: any) => {\n\t\t\t\tif (!keyupEnter(event)) return\n\t\t\t\tif (!this.isChat) {\n\t\t\t\t\t// Prevents unnecessary server side call when chat not supported by ds\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst prompt = event.target.value.trim()\n\t\t\t\tif (!prompt) return\n\t\t\t\tthis.addBubble({ msg: escapeHtml(prompt), me: 1 })\n\t\t\t\tevent.target.value = ''\n\t\t\t\tconst serverBubble = this.addBubble({ msg: '...' }) // Keep server bubble always below prompt bubble so that responses are below the prompt always\n\t\t\t\tif (prompt.length <= MIN_PROMPT_LENGTH_FOR_CHAT) {\n\t\t\t\t\tserverBubble.text('Your prompt is too short. Enter a longer prompt.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst body: ChatRequest = {\n\t\t\t\t\tgenome: this.app.vocabApi.vocab.genome,\n\t\t\t\t\tdslabel: this.app.vocabApi.vocab.dslabel,\n\t\t\t\t\tfilter: this.app.vocabApi.state.termfilter?.filter,\n\t\t\t\t\tprompt\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst data = await dofetch3('termdb/chat', { body })\n\t\t\t\t\tif (data.error) throw data.error\n\n\t\t\t\t\tconst result: ChatResponse = data\n\t\t\t\t\tif (result.type === 'text') {\n\t\t\t\t\t\tserverBubble.text(result.text)\n\t\t\t\t\t} else if (result.type === 'html') {\n\t\t\t\t\t\tserverBubble.html(result.html)\n\t\t\t\t\t} else if (result.type === 'plot') {\n\t\t\t\t\t\t// Determine if plot state is complete or not. A field whose value carries a\n\t\t\t\t\t\t// `possible_options` array means the server could not resolve that term and\n\t\t\t\t\t\t// is offering the user a choice. If found, show click boxes; otherwise the\n\t\t\t\t\t\t// plot state is complete and can be dispatched directly.\n\t\t\t\t\t\tconst optionField = findPossibleOptionsField(result.plot)\n\t\t\t\t\t\tif (optionField) {\n\t\t\t\t\t\t\tthis.showPossibleOptions(serverBubble, result.plot, optionField, result.msg)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.app.dispatch({\n\t\t\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\t\t\tconfig: result.plot\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tserverBubble.text(`${result.msg ? result.msg + '. ' : ''}Please refer to the plot generated below.`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (e: any) {\n\t\t\t\t\tif (e.stack) console.log(e.stack)\n\t\t\t\t\tserverBubble.html(`Error: ${e.message || e}`)\n\t\t\t\t}\n\t\t\t})\n\t\t\t.node()\n\t\t\t.focus()\n\t}\n\n\taddBubble(arg: { msg: string; me?: number }) {\n\t\t/** {\nmsg: add a chat bubble for this msg; msg is html as it might contain hyperlinks\nme: if 1, is me; otherwise is ai\n}\nreturn the created bubble and allow to be modified\n*/\n\t\tconst bubble = this.dom.bubbleDiv\n\t\t\t.append('div')\n\t\t\t.style('padding', '10px')\n\t\t\t.html(`${arg.me ? '<span style=\"font-size:.7em\">[ME]</span> ' : ''}${arg.msg}`)\n\t\tif (arg.me) bubble.style('background', '#f1f1f1')\n\t\t// set this to scroll to bottom\n\t\tconst n = this.dom.bubbleDiv.node()\n\t\tn.scrollTop = n.scrollHeight\n\t\treturn bubble\n\t}\n\n\t// Render click boxes for an incomplete plot state. `fieldKey` is the field of `plot` whose\n\t// value holds `possible_options`. Clicking a box completes the plot state by replacing that\n\t// field with the chosen option's id and dispatches plot_create.\n\tshowPossibleOptions(bubble: any, plot: any, fieldKey: string, msg?: string) {\n\t\tconst options = plot[fieldKey].possible_options || []\n\t\tbubble.text(`${msg ? msg + '. ' : ''}Multiple options are available. Please select one:`)\n\t\tconst boxDiv = bubble.append('div').style('margin-top', '5px')\n\t\tfor (const opt of options) {\n\t\t\tboxDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t.attr('data-testid', `sjpp-mass-chat-option-${opt.id}`)\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('margin', '3px')\n\t\t\t\t.style('padding', '5px 10px')\n\t\t\t\t.style('border-radius', '5px')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.text(opt.name)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\t// Complete the plot state with the chosen option's id and dispatch the plot.\n\t\t\t\t\tconst config = JSON.parse(JSON.stringify(plot))\n\t\t\t\t\tconfig[fieldKey] = { id: opt.id }\n\t\t\t\t\tthis.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig\n\t\t\t\t\t})\n\t\t\t\t\tbubble.selectAll('*').remove()\n\t\t\t\t\tbubble.text(`Selected \"${opt.name}\". Please refer to the plot generated below.`)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tmain() {\n\t\t// If the subheader is hidden, it means the chat component is not visible, so we skip focusing the input to avoid accidental typing into the search/chat bar. The user can click on the chat again to focus when they want to use it.\n\t\tif (this.opts.subheader.style('display') == 'none') {\n\t\t\tthis.dom.inputNode.blur()\n\t\t\treturn\n\t\t}\n\t\tif (this.opts?.focus != 'off') this.dom.inputNode.focus()\n\t}\n}\n\nexport const chatInit = getCompInit(MassAiChatBot)\n\n// Prevents HTML/script injection in the chat UI (XSS) by entering markup in the prompt (Proposed fix by copilot)\nfunction escapeHtml(s: string): string {\n\treturn s\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/\"/g, '"')\n\t\t.replace(/'/g, ''')\n}\n\n// Scan a plot state for a field whose value carries a `possible_options` array, indicating the\n// server could not resolve that term and is offering the user a list of choices. Returns the field\n// name (e.g. 'term') or null if the plot state is complete.\nfunction findPossibleOptionsField(plot: any): string | null {\n\tif (!plot || typeof plot !== 'object') return null\n\tfor (const key of Object.keys(plot)) {\n\t\tconst val = plot[key]\n\t\tif (val && typeof val === 'object' && Array.isArray(val.possible_options)) return key\n\t}\n\treturn null\n}\n\n// Minimal renderers ported from MassSearch\nfunction setRenderers(self: any) {\n\tlet text = 'No match'\n\tif (self.isChat) {\n\t\ttext = 'No match. Using the chatbot...'\n\t}\n\tself.noResult = () => {\n\t\tself.clear()\n\t\tself.dom.resultDiv.append('div').text(text).style('padding', '3px 3px 3px 0px').style('opacity', 0.5)\n\n\t\t// Hide the popup after 2 seconds\n\t\tsetTimeout(() => {\n\t\t\tself.clear({ hide: true })\n\t\t}, 1500)\n\t}\n\n\tself.showTerms = (data: any) => {\n\t\tif (self.opts.disable_terms)\n\t\t\tdata.lst.forEach((t: any) => {\n\t\t\t\tif (t.disabled) self.opts.disable_terms.push(t)\n\t\t\t})\n\t\tself.clear({ hide: !data.lst.length })\n\t\tif (data.lst.length) {\n\t\t\tself.dom.resultDiv.append('table').selectAll().data(data.lst).enter().append('tr').each(self.showTerm)\n\t\t}\n\t}\n\n\t// dispatch a plot and reset the search box/popup\n\tself.launchPlot = async (config: any) => {\n\t\tif (self.state?.nav?.activeTab == 0) {\n\t\t\tawait self.app.dispatch({ type: 'tab_set', activeTab: 1 })\n\t\t}\n\t\tself.app.dispatch({ type: 'plot_create', config })\n\t\tself.dom.inputNode.value = '' // clear the search box\n\t\tself.clear({ hide: true })\n\t}\n\n\t// open a mutated-vs-wildtype barchart for one gene, restricted to a variant data type.\n\t// dtCandidates are tried in order (svfusion has two dts) until a matching predefined groupset\n\t// is found, since fillTermWrapper throws when the dataset lacks a groupset for a given dt.\n\tself.launchGeneVariantPlot = async (gene: string, dtCandidates: number[]) => {\n\t\tlet tw: any\n\t\tlet lastErr: any\n\t\tfor (const dt of dtCandidates) {\n\t\t\tconst candidate: any = {\n\t\t\t\tterm: {\n\t\t\t\t\tid: gene,\n\t\t\t\t\tname: gene,\n\t\t\t\t\tgenes: [{ kind: 'gene', id: gene, gene, name: gene, type: 'geneVariant' }],\n\t\t\t\t\ttype: 'geneVariant'\n\t\t\t\t},\n\t\t\t\tq: { type: 'predefined-groupset', dtLst: [dt] }\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait fillTermWrapper(candidate, self.app.vocabApi)\n\t\t\t\ttw = candidate\n\t\t\t\tbreak\n\t\t\t} catch (e) {\n\t\t\t\tlastErr = e\n\t\t\t}\n\t\t}\n\t\tif (!tw) throw lastErr\n\t\tawait self.launchPlot({ chartType: 'summary', term: tw })\n\t}\n\n\t// DNA methylation: open a genome browser at the gene's default coordinates inline in the result\n\t// area with a \"Submit Region\" button (see embedMethylationRegionPicker above); on submit, open a\n\t// violin plot of the region-based dnaMethylation term's per-sample beta values.\n\tself.launchMethylationPlot = async (gene: string, coord: { chr: string; start: number; stop: number }) => {\n\t\t// coord is the gene's default genomic coordinate, resolved server-side by the omnisearch\n\t\t// (GeneMatch.coord) and used to seed the genome browser track \u2014 no genelookup request here.\n\t\tif (!coord) throw `Could not resolve coordinates for gene \"${gene}\"`\n\n\t\t// render the region picker inline in the chat result area, replacing the result list\n\t\tself.dom.tip.clear()\n\t\tself.dom.tip.showunder(self.dom.inputNode)\n\t\tconst holder = self.dom.resultDiv.append('div').style('margin', '10px')\n\t\tholder.append('div').style('margin-bottom', '5px').text(gene)\n\n\t\tawait embedMethylationRegionPicker({\n\t\t\tholder: holder.append('div'),\n\t\t\tgenomeObj: self.app.opts.genome,\n\t\t\tvocabApi: self.app.vocabApi,\n\t\t\tchr: coord.chr,\n\t\t\tstart: coord.start,\n\t\t\tstop: coord.stop,\n\t\t\tcallback: async (term: any) => {\n\t\t\t\tawait self.launchPlot({ chartType: 'summary', term: { term } })\n\t\t\t}\n\t\t})\n\t}\n\n\tself.showTerm = function (term: any) {\n\t\tconst tr = select(this)\n\n\t\tif (term.isGene) {\n\t\t\t// Gene row: gene name as a plain label, with an action button per available data type\n\t\t\t// ('Gene expression', variant types, 'DNA methylation') \u2014 all shown together in the same row.\n\t\t\ttr.append('td').text(term.name).style('padding', '5px 10px')\n\t\t\tconst btnTd = tr.append('td')\n\t\t\tconst addBtn = (label: string, testid: string, onClick: () => Promise<void>) => {\n\t\t\t\tbtnTd\n\t\t\t\t\t.append('span')\n\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t.attr('data-testid', testid)\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.style('margin', '0px 3px')\n\t\t\t\t\t.style('padding', '5px 10px')\n\t\t\t\t\t.style('border-radius', '5px')\n\t\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t\t.text(label)\n\t\t\t\t\t.on('click', () => void onClick().catch(e => sayerror(self.dom.resultDiv, 'Error: ' + (e?.message || e))))\n\t\t\t}\n\t\t\tif (term.isGeneExpression) {\n\t\t\t\t// open a summary plot of the gene's expression\n\t\t\t\taddBtn('Gene expression', `sjpp-mass-chat-gene-exp-${term.gene}`, async () => {\n\t\t\t\t\tawait self.launchPlot({\n\t\t\t\t\t\tchartType: 'summary',\n\t\t\t\t\t\tterm: { term: { gene: term.gene, name: term.name, type: 'geneExpression' } }\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (term.isGeneVariant) {\n\t\t\t\t// one button per variant data type available for THIS gene (snvindel/cnv/svfusion);\n\t\t\t\t// each opens a mutated-vs-wildtype barchart restricted to that data type.\n\t\t\t\tfor (const vt of term.geneVariantTypes || []) {\n\t\t\t\t\taddBtn(vt.label, `sjpp-mass-chat-gene-${vt.testid}-${term.gene}`, async () => {\n\t\t\t\t\t\tawait self.launchGeneVariantPlot(term.gene, vt.dtCandidates)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (term.isMethylation) {\n\t\t\t\t// open a violin plot of the gene's per-sample DNA methylation beta values\n\t\t\t\taddBtn('DNA methylation', `sjpp-mass-chat-gene-methylation-${term.gene}`, async () => {\n\t\t\t\t\tawait self.launchMethylationPlot(term.gene, term.coord)\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// Dictionary term row\n\t\tconst button = tr.append('td').text(term.name)\n\t\tif (term.type) {\n\t\t\tbutton\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t.attr('data-testid', `sjpp-mass-chat-term-${term.id}`)\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tawait self.launchPlot({\n\t\t\t\t\t\tchartType: term.type == 'survival' ? 'survival' : 'summary',\n\t\t\t\t\t\tterm: { term }\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t} else {\n\t\t\tbutton.style('padding', '5px 10px').style('opacity', 0.5)\n\t\t}\n\n\t\ttr.append('td')\n\t\t\t.text((term.__ancestorNames || []).join(' > '))\n\t\t\t.style('opacity', 0.5)\n\t\t\t.style('font-size', '.7em')\n\t}\n\n\tself.clear = (opts: any = {}) => {\n\t\tself.dom.tip.clear()\n\t\tif (opts.hide) self.dom.tip.hide()\n\t\telse self.dom.tip.showunder(self.dom.inputNode)\n\t}\n}\n", "import { getCompInit, multiInit } from '#rx'\nimport { recoverInit } from '../rx/src/recover'\nimport { chartsInit } from './charts'\nimport { groupsInit } from './groups'\nimport { sessionBtnInit } from './sessionBtn'\nimport { aboutInit } from './about.ts'\nimport { chatInit } from './chat.ts'\nimport { dofetch3 } from '#common/dofetch'\nimport { Menu, icons as icon_functions } from '#dom'\nimport { getFilterItemByTag, filterRxCompInit } from '#filter/filter'\n\n/*\ntodo: steps to add a new tab\n*/\n\nconst activeTabBgColor = '#ececec', // default bg color of active tab; inactive tab is transparent\n\tactiveTabBgColorHover = '#e0e0e0',\n\tactiveTabTextColor = 'black',\n\tinactiveTabBgColorHover = '#fcfced',\n\tinactiveTabTextColor = 'gray'\n\n// to be used for assigning unique\n// radio button names by object instance\n// otherwise termdp app popups\nlet instanceNum = 0\n\n// to distinguish from IDs assigned by other code or users\nconst idPrefix = '_MASS_AUTOID_' + Math.random().toString().slice(-6)\nlet id = (+new Date()).toString().slice(-8)\n\nconst headtip = new Menu({ padding: '0px', offsetX: 0, offsetY: 0 })\nheadtip.d.style('z-index', 5555)\n// headtip must get a crazy high z-index so it can stay on top of all, no matter if server config has base_zindex or not\n\n// data elements for navigation header tabs\nconst aboutTab = { top: 'ABOUT', mid: '', btm: '', subheader: 'about' }\nconst chartTab = { top: 'CHARTS', mid: 'NONE', btm: '', subheader: 'charts' }\nconst groupsTab = { top: 'GROUPS', mid: 'NONE', btm: '', subheader: 'groups' }\nconst filterTab = { top: 'FILTER', mid: 'NONE', btm: '', subheader: 'filter' }\nconst cartTab = { top: 'CART', mid: 'NONE', btm: '', subheader: 'cart' }\n\nexport function getId() {\n\treturn idPrefix + '_' + id++\n}\n\nclass TdbNav {\n\tstatic type = 'nav'\n\n\tconstructor(opts) {\n\t\tthis.type = TdbNav.type\n\t\tthis.instanceNum = instanceNum++\n\t\tthis.tabs = [] // array of tab objects corresponding to what's shown on header, based on ds customization. hidden tabs are not in this array. filled in initUI()\n\t\tthis.activeTab = 0 // array index for .tabs[]; -1 for no active tabs and all closed\n\t\tthis.activeCohort = 0 // -1 = unselected, 0,1,2... = selected\n\t\tthis.samplecounts = {} // tracks sample count by .activeCohort value and stringified filter json\n\t\tthis.searching = false\n\t\tthis.massSessionDuration = opts.massSessionDuration\n\t\tthis.sessionDaysLeft = opts.app.opts.sessionDaysLeft || null\n\t\tthis.sessionId = opts.app.opts.sessionId || null\n\t\tthis.pkgver = opts.pkgver || null //Release version\n\t\tsetInteractivity(this)\n\t\tsetRenderers(this)\n\t}\n\n\tasync init(appState) {\n\t\ttry {\n\t\t\tthis.cohortFilter = getFilterItemByTag(appState.termfilter.filter, 'cohortFilter')\n\t\t\tthis.initUI(appState)\n\t\t\tif (appState?.termdbConfig?.selectCohort) {\n\t\t\t\tthis.dom.tds.filter(d => d.colNum === 0).style('display', '')\n\t\t\t\tthis.cohortNames = appState.termdbConfig.selectCohort.values.map(d => d.keys.slice().sort().join(','))\n\t\t\t}\n\n\t\t\tthis.components = await multiInit({\n\t\t\t\tfilter: filterRxCompInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tvocabApi: this.app.vocabApi,\n\t\t\t\t\tholder: this.dom.subheader.filter.append('div').style('margin', '5px'),\n\t\t\t\t\thideLabel: this.opts.header_mode === 'with_tabs',\n\t\t\t\t\temptyLabel: '+Add new filter',\n\t\t\t\t\tcallback: filter => {\n\t\t\t\t\t\tthis.app.dispatch({\n\t\t\t\t\t\t\ttype: 'filter_replace',\n\t\t\t\t\t\t\tfilter\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tcharts: chartsInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tholder: this.dom.subheader.charts,\n\t\t\t\t\tvocab: this.opts.vocab\n\t\t\t\t}),\n\t\t\t\tgroups: groupsInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tholder: this.dom.subheader.groups,\n\t\t\t\t\tvocab: this.opts.vocab\n\t\t\t\t}),\n\t\t\t\trecover: recoverInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tholder: this.dom.recoverDiv,\n\t\t\t\t\t// TODO: ???? may limit the tracked state to only the filter, activeCohort ???\n\t\t\t\t\tgetState: appState => appState,\n\t\t\t\t\treactsTo: action => action.type != 'plot_edit',\n\t\t\t\t\tmaxHistoryLen: 5\n\t\t\t\t}),\n\t\t\t\tsessionBtn: sessionBtnInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tbutton: this.dom.saveBtn,\n\t\t\t\t\tmassSessionDuration: this.opts.massSessionDuration,\n\t\t\t\t\tsessionDaysLeft: this.app.opts.sessionDaysLeft || null\n\t\t\t\t}),\n\t\t\t\tabout: aboutInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tsubheader: this.dom.subheader.about,\n\t\t\t\t\tinstanceNum: this.instanceNum,\n\t\t\t\t\taboutOverrides: appState?.termdbConfig?.massNav?.tabs?.about || null,\n\t\t\t\t\tselectCohort: appState?.termdbConfig?.selectCohort || null\n\t\t\t\t}),\n\t\t\t\tchat: chatInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tsubheader: this.dom.subheader.chat\n\t\t\t\t})\n\t\t\t})\n\t\t\tthis.mayShowMessage_sessionDaysLeft()\n\t\t} catch (e) {\n\t\t\tthrow e\n\t\t}\n\t}\n\n\treactsTo(action) {\n\t\tif (action.type.includes('cache_termq')) return true\n\t\tif (action.type.startsWith('filter')) return true\n\t\tif (action.type.startsWith('cohort')) return true\n\t\tif (action.type.startsWith('tab')) return true\n\n\t\t// do not use startsWith('plot_') to exclude 'plot_edit' as no need for nav to react to that\n\t\tif (action.type == 'plot_prep') return true\n\t\tif (action.type == 'plot_create') return true\n\t\tif (action.type == 'plot_delete') return true\n\n\t\tif (action.type == 'app_refresh') return true\n\t\tif (action.type.endsWith('_customTerm')) return true\n\t\tif (action.type.endsWith('_group')) return true\n\t}\n\n\tgetState(appState) {\n\t\treturn {\n\t\t\tsearching: this.searching, // for detection of internal state change\n\t\t\tnav: appState.nav,\n\t\t\tactiveCohort: appState.activeCohort,\n\t\t\ttermdbConfig: appState.termdbConfig,\n\t\t\tfilter: appState.termfilter.filter,\n\t\t\tplots: appState.plots,\n\t\t\tgroups: appState.groups\n\t\t}\n\t}\n\n\tasync main() {\n\t\tthis.dom.tabDiv.style('display', this.state.nav.header_mode === 'with_tabs' ? 'inline-block' : 'none')\n\t\tthis.dom.tip.hide()\n\t\tthis.activeTab = this.state.nav.activeTab\n\t\tthis.prevCohort = this.activeCohort\n\t\tthis.activeCohort = +this.state.activeCohort\n\t\tthis.filterUiRoot = getFilterItemByTag(this.state.filter, 'filterUiRoot')\n\t\tthis.cohortFilter = getFilterItemByTag(this.state.filter, 'cohortFilter')\n\t\tif (this.cohortNames) {\n\t\t\tthis.activeCohortName = this.cohortNames[this.activeCohort]\n\t\t\tif (this.activeCohort !== -1)\n\t\t\t\tthis.activeCohortLabel = this.state.termdbConfig.selectCohort.values[this.activeCohort].shortLabel\n\t\t}\n\t\tthis.filterJSON = JSON.stringify(this.state.filter)\n\n\t\tthis.cohortsData = await this.app.vocabApi.getCohortsData()\n\n\t\tif (this.state.nav.header_mode === 'with_tabs') {\n\t\t\tif (!(this.activeCohort in this.samplecounts)) {\n\t\t\t\tthis.samplecounts[this.activeCohort] = await this.app.vocabApi.getCohortSampleCount(this.activeCohortName)\n\t\t\t}\n\t\t\tif (!(this.filterJSON in this.samplecounts)) {\n\t\t\t\tif (!this.filterUiRoot || !this.filterUiRoot.lst.length) {\n\t\t\t\t\tthis.samplecounts[this.filterJSON] = this.samplecounts[this.activeCohort]\n\t\t\t\t} else {\n\t\t\t\t\tconst n = await this.app.vocabApi.getFilteredSampleCount(this.filterJSON)\n\t\t\t\t\tthis.samplecounts[this.filterJSON] = n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.updateUI()\n\t}\n}\n\nexport const navInit = getCompInit(TdbNav)\n\nfunction setRenderers(self) {\n\tself.initUI = appState => {\n\t\tconst verifiedToken = self.app.vocabApi.verifiedToken\n\t\tconst invalidTokenErrorHandling = appState.termdbConfig.invalidTokenErrorHandling\n\t\t//Show error message if login failed and all charts require login. If the dataset does not require login verifiedToken is true\n\t\t//Currently only the profile and carereg always require a token.\n\t\t// Note that if the user did not login the public token was used. So only if the user did login and the token passed was invalid this error is shown\n\t\tif (!verifiedToken && invalidTokenErrorHandling?.affectedCharts?.includes('*'))\n\t\t\tthrow new Error(appState.termdbConfig.invalidTokenErrorHandling.errorMessage)\n\t\tconst header = self.opts.holder.append('div').style('white-space', 'nowrap')\n\t\tconst massNav = appState.termdbConfig?.massNav || {}\n\t\tlet titleDiv = header\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('float', 'right')\n\t\t\t.style('font-size', '1.1em')\n\t\t\t.style('margin', '50px 10px 0 0')\n\t\t\t.text(massNav?.title?.text) //this line will be executed in update UI to reflect cohort changes\n\n\t\tconst tabDiv = header.append('div').style('display', 'none').style('vertical-align', 'bottom')\n\t\tconst controlsDiv = header\n\t\t\t//Fix for adding message underneath the search bar and buttons\n\t\t\t.append('div')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.style('margin', '10px')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('float', 'right')\n\n\t\tif (self.opts.header_mode === 'only_buttons') {\n\t\t\t// if header_mode is only_buttons, show only buttons\n\t\t\ttabDiv.style('display', 'none')\n\t\t\ttitleDiv.style('display', 'none')\n\t\t\tcontrolsDiv.style('display', 'none')\n\t\t}\n\t\tself.opts.holder.attr('class', 'sjpp-nav')\n\t\tself.dom = {\n\t\t\tholder: self.opts.holder,\n\t\t\theader,\n\t\t\ttabDiv,\n\t\t\tcontrolsDiv,\n\t\t\tsearchDiv: controlsDiv.append('div').style('margin', '10px'),\n\t\t\tsessionDiv: controlsDiv.append('div').style('display', 'inline-block'),\n\t\t\trecoverDiv: controlsDiv.append('div').style('display', 'inline-block'),\n\t\t\tpdfDiv: controlsDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('padding', '4px')\n\t\t\t\t.style('vertical-align', 'middle'),\n\t\t\tdeleteAllDiv: controlsDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('padding', '4px')\n\t\t\t\t.style('vertical-align', 'middle'),\n\n\t\t\thelpDiv: controlsDiv.append('div').style('display', 'none'),\n\t\t\tsessionElapsedMessageDiv: controlsDiv.append('div').style('display', 'none'),\n\t\t\tsubheaderDiv: self.opts.holder.append('div').style('display', 'block').style('border-bottom', '1px solid #000'),\n\t\t\tmessageDiv: self.opts.holder.append('div').style('margin', '30px').style('display', 'none'),\n\t\t\ttitleDiv,\n\t\t\ttip: new Menu({ padding: '5px' })\n\t\t}\n\t\ticon_functions['trash'](self.dom.deleteAllDiv, {\n\t\t\thandler: self.deletePlots,\n\t\t\ttitle: 'Delete all plots. To revert, click Undo button'\n\t\t})\n\n\t\ticon_functions['pdf'](self.dom.pdfDiv, {\n\t\t\thandler: self.opts.downloadPlots,\n\t\t\ttitle: 'Generate a PDF of all the plots opened'\n\t\t})\n\n\t\tif (self.opts.header_mode === 'with_cohortHtmlSelect') {\n\t\t\t// not part of filter div\n\t\t\tself.dom.cohortStandaloneDiv = header\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('margin', '10px')\n\t\t\t\t.style('vertical-align', 'top')\n\n\t\t\tself.dom.cohortStandaloneDiv.append('label').html('Cohort: ')\n\t\t\tself.dom.cohortSelect = self.dom.cohortStandaloneDiv.append('select').on('change', async function () {\n\t\t\t\tself.app.dispatch({ type: 'cohort_set', activeCohort: +this.value })\n\t\t\t})\n\n\t\t\tself.dom.cohortSelect\n\t\t\t\t.selectAll('option')\n\t\t\t\t.data(appState.termdbConfig.selectCohort.values)\n\t\t\t\t.enter()\n\t\t\t\t.append('option')\n\t\t\t\t.attr('value', (d, i) => i)\n\t\t\t\t.property('selected', (d, i) => i === appState.activeCohort)\n\t\t\t\t.html(d => d.shortLabel)\n\t\t}\n\n\t\tself.dom.subheader = Object.freeze({\n\t\t\t// For either the COHORT or ABOUT tab\n\t\t\tabout: self.dom.subheaderDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-mass-nav-subheader-about')\n\t\t\t\t.style('display', 'none'),\n\t\t\tsearch: self.dom.subheaderDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-mass-nav-subheader-search')\n\t\t\t\t.style('display', 'none'),\n\t\t\tgroups: self.dom.subheaderDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-mass-nav-subheader-groups')\n\t\t\t\t.style('display', 'none'),\n\t\t\tcharts: self.dom.subheaderDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-mass-nav-subheader-charts')\n\t\t\t\t.style('display', 'none'),\n\t\t\tfilter: self.dom.subheaderDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-mass-nav-subheader-filter')\n\t\t\t\t.style('display', 'none'),\n\t\t\tchat: self.dom.subheaderDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-mass-nav-subheader-chat')\n\t\t\t\t.style('display', 'none')\n\t\t\t// cart: self.dom.subheaderDiv.append('div').style('display', 'none').html('<br/>Cart feature under construction - work in progress<br/> <br/>'),\n\t\t})\n\n\t\tif (!massNav.tabs?.about?.hide) {\n\t\t\t// about tab is not hidden\n\t\t\tself.tabs.push(aboutTab)\n\t\t\t// about tab contents are conditionally determined by 1) override 2) ds using or not using cohort.\n\t\t\t// furbish an override object with default properties based on conditions if those properties are missing\n\t\t\tconst override = Object.assign({}, massNav.tabs?.about)\n\t\t\tif (appState.termdbConfig?.selectCohort) {\n\t\t\t\t// ds has cohort selection and no customization to about tab\n\t\t\t\tif (!override.top) override.top = 'COHORT'\n\t\t\t\t// do not assign \"mid\" here as it will be dynamically assigned with active cohort name\n\t\t\t} else {\n\t\t\t\t// ds doesn't use cohort selection. if mid is missing, use dslabel\n\t\t\t\tif (!override.mid) override.mid = self.pickDatasetLabel(appState)\n\t\t\t}\n\t\t\tObject.assign(aboutTab, override) // apply ds customizations\n\t\t}\n\t\tif (!massNav.tabs?.charts?.hide) {\n\t\t\t// charts tab is not hidden\n\t\t\tself.tabs.push(chartTab)\n\t\t\tObject.assign(chartTab, massNav.tabs?.charts)\n\t\t}\n\t\tif (!massNav.tabs?.groups?.hide) {\n\t\t\t// group tab is not hidden\n\t\t\tself.tabs.push(groupsTab)\n\t\t\tObject.assign(groupsTab, massNav.tabs?.groups)\n\t\t}\n\t\tif (!massNav.tabs?.filter?.hide) {\n\t\t\t// filter tab is not hidden\n\t\t\tself.tabs.push(filterTab)\n\t\t\tObject.assign(filterTab, massNav.tabs?.filter)\n\t\t}\n\t\t/** When chat is enabled for a ds, show name as \"CHAT\". When not enabled, it should show \"SEARCH\" with ONLY omnisearch functionality\n\t\t **/\n\t\tif (!massNav.tabs?.chat?.hide) {\n\t\t\tif (appState.termdbConfig?.queries?.chat) {\n\t\t\t\tconst chatTab = { top: 'CHAT', mid: '', btm: '', subheader: 'chat' }\n\t\t\t\tObject.assign(chatTab, massNav.tabs?.chat)\n\t\t\t\tchatTab.top = 'CHAT' // Copilot mentioned that Object.assign may overwrite {chat/search}.top. Therefore this line has been added.\n\t\t\t\tself.tabs.push(chatTab)\n\t\t\t} else {\n\t\t\t\tconst searchTab = { top: 'SEARCH', mid: '', btm: '', subheader: 'chat' }\n\t\t\t\tObject.assign(searchTab, massNav.tabs?.chat)\n\t\t\t\tsearchTab.top = 'SEARCH' // Copilot mentioned that Object.assign may overwrite {chat/search}.top. Therefore this line has been added.\n\t\t\t\tself.tabs.push(searchTab)\n\t\t\t}\n\t\t}\n\n\t\tconst table = self.dom.tabDiv\n\t\t\t.append('table')\n\t\t\t.attr('data-testid', 'sjpp-nav-tabs-table')\n\t\t\t.style('border-collapse', 'collapse')\n\n\t\t// using a table layout for tabs, iterate through each tab\n\t\t// once for each of [top, mid, btm] row\n\t\ttable\n\t\t\t.selectAll('tr')\n\t\t\t.data(['top', 'mid', 'btm'])\n\t\t\t.enter()\n\t\t\t.append('tr')\n\t\t\t.attr('class', (d, i) => `sjpp-nav-tabs-row-${i}`)\n\t\t\t.style('font-size', (d, i) => (i == 1 ? '20px' : '12px'))\n\t\t\t.selectAll('td')\n\t\t\t.data((key, i) =>\n\t\t\t\tself.tabs.map((row, colNum) => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trowNum: i,\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tcolNum,\n\t\t\t\t\t\tlabel: row[key],\n\t\t\t\t\t\tsubheader: row.subheader,\n\t\t\t\t\t\tdisabled: row.disabled,\n\t\t\t\t\t\tdisabledMessage: row.disabledMessage\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\n\t\t\t.enter()\n\t\t\t.append('td')\n\t\t\t.attr('class', d => `sjpp-nav-tab-col-${d.colNum}`)\n\t\t\t// hide the about (e.g. cohort tab) until there is termdbConfig.selectCohort or termdbCongfig.massNav.tabs.about\n\t\t\t.style('display', 'none') // d => (d.colNum === 0 || self.activeCohort !== -1 ? '' : 'none'))\n\t\t\t.style('width', '100px')\n\t\t\t.style('padding', d => (d.rowNum === 0 ? '12px 12px 3px 12px' : '3px 12px'))\n\t\t\t.style('text-align', 'center')\n\t\t\t.style('border-left', '1px solid #ccc')\n\t\t\t.style('border-right', '1px solid #ccc')\n\t\t\t.style('color', '#aaa')\n\t\t\t.style('opacity', d => (d.disabled ? 0.5 : 1))\n\t\t\t.style('cursor', d => (d.disabled ? 'not-allowed' : 'pointer'))\n\t\t\t.attr('title', d => d.disabledMessage || '')\n\t\t\t.html(d => d.label)\n\t\t\t.on('click', (event, d) => {\n\t\t\t\tself.setTab(event, d)\n\t\t\t})\n\t\t\t.on('mouseover', (event, d) => {\n\t\t\t\tself.mouseover(event, d)\n\t\t\t})\n\t\t\t.on('mouseout', () => {\n\t\t\t\tself.mouseout()\n\t\t\t})\n\n\t\tself.dom.trs = table.selectAll('tr')\n\t\tself.dom.tds = table.selectAll('td')\n\t\tself.subheaderKeys = self.tabs.map(d => d.subheader)\n\n\t\tself.dom.saveBtn = self.dom.sessionDiv\n\t\t\t.append('button')\n\t\t\t.attr('data-testid', 'sjpp-nav-session-btn')\n\t\t\t.style('margin', '10px')\n\t\t\t.text('Session \u25BC')\n\n\t\t//.on('click', self.getSessionUrl)\n\n\t\tif (self.sessionDaysLeft != null) {\n\t\t\t//Only show if called from `mass-session-id` URL\n\t\t\tself.dom.fileBtn = self.dom.sessionDiv\n\t\t\t\t.append('button')\n\t\t\t\t.attr('data-testid', 'sjpp-nav-file-btn')\n\t\t\t\t.style('margin', '10px')\n\t\t\t\t.text('Export Session')\n\t\t\t\t.on('click', event => {\n\t\t\t\t\tself.getSessionFile(event)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tself.deletePlots = () => {\n\t\tconst state = self.app.getState()\n\t\tconst subactions = []\n\t\tfor (const plot of state.plots) subactions.push({ type: 'plot_delete', id: plot.id })\n\n\t\tself.app.dispatch({ type: 'app_refresh', subactions })\n\t}\n\n\tself.mayShowMessage_sessionDaysLeft = () => {\n\t\tif (!Number.isFinite(self.sessionDaysLeft)) {\n\t\t\t// info not available, do not show msg\n\t\t\treturn\n\t\t}\n\t\tself.dom.sessionElapsedMessageDiv.style('display', 'block')\n\t\tself.dom.remainingDaysMessage = self.dom.sessionElapsedMessageDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'block')\n\t\t\t.style('opacity', '0.65')\n\t\t\t.html(\n\t\t\t\t`<u>${self.sessionDaysLeft} days</u> left until this session is removed. Click the \"Session \u25BC\" button and select \"Save\" option to create a new one.`\n\t\t\t)\n\t}\n\n\tself.updateUI = async () => {\n\t\tif (!self.dom.subheaderDiv) return\n\t\tif (self.activeTab && self.state.termdbConfig.selectCohort && self.activeCohort == -1) {\n\t\t\t// showing charts or filter tab; cohort selection is enabled but no cohort is selected\n\t\t\tself.dom.subheaderDiv.style('display', 'none')\n\t\t\tself.dom.messageDiv.selectAll('text').remove()\n\t\t\tself.dom.messageDiv.style('display', '').text('No cohort selected. Please select a cohort in the \"COHORT\" tab.')\n\t\t} else {\n\t\t\tif (self.dom.subheaderDiv) self.dom.subheaderDiv.style('display', self.activeTab != -1 ? 'block' : 'none')\n\t\t\tif (self.dom.messageDiv) self.dom.messageDiv.style('display', 'none')\n\t\t}\n\t\tconst selectCohort = self.state.termdbConfig.selectCohort\n\t\tconst massNav = self.state.termdbConfig.massNav\n\t\tself.dom.searchDiv.style('display', selectCohort && self.activeCohort == -1 ? 'none' : 'inline-block')\n\t\t//self.dom.holder.style('margin-bottom', self.state.nav.header_mode === 'with_tabs' ? '20px' : '')//To be checked why it was needed\n\t\tself.dom.header.style('border-bottom', self.state.nav.header_mode === 'with_tabs' ? '1px solid #000' : '')\n\t\tself.dom.tds\n\t\t\t.style('display', '')\n\t\t\t//Only show black text when the tab is active and the subheader is displayed\n\t\t\t.style('color', d => (d.colNum == self.activeTab ? activeTabTextColor : inactiveTabTextColor))\n\t\t\t.style('background-color', d =>\n\t\t\t\td.colNum == self.activeTab && self.dom.subheaderDiv.style('display') != 'none'\n\t\t\t\t\t? self.state.termdbConfig.massNav?.activeColor || activeTabBgColor\n\t\t\t\t\t: 'transparent'\n\t\t\t)\n\t\t\t.html(function (d, i) {\n\t\t\t\tif (d.key == 'top') return this.innerHTML\n\n\t\t\t\tif (d.subheader == 'groups') {\n\t\t\t\t\tif (d.key == 'mid') return self.state.groups.length || 'NONE'\n\t\t\t\t\treturn ''\n\t\t\t\t}\n\n\t\t\t\tif (d.subheader === 'charts') {\n\t\t\t\t\t// only a plot in it's own sandbox will be counted; do not separately count child plots in the same sandbox\n\t\t\t\t\tconst n = self.state.plots.filter(p => !p.parentId).length\n\t\t\t\t\tif (d.key == 'mid') return !n ? 'NONE' : n\n\t\t\t\t\telse return ''\n\t\t\t\t} else if (d.subheader === 'about') {\n\t\t\t\t\tif (self.activeCohort != -1 && self.activeCohort in self.samplecounts) {\n\t\t\t\t\t\tconst aboutMap = {\n\t\t\t\t\t\t\ttop: this.innerHTML,\n\t\t\t\t\t\t\tmid: self.activeCohortLabel,\n\t\t\t\t\t\t\tbtm: self.samplecounts[self.activeCohort]\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn aboutMap[d.key] || ''\n\t\t\t\t\t} else if (!selectCohort) {\n\t\t\t\t\t\tconst aboutMap = {\n\t\t\t\t\t\t\ttop: massNav?.tabs?.about?.top || 'ABOUT',\n\t\t\t\t\t\t\tmid: massNav?.tabs?.about?.mid || this.innerHTML,\n\t\t\t\t\t\t\tbtm: massNav?.tabs?.about?.btm || self.samplecounts[self.activeCohort]\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn aboutMap[d.key] || ''\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn d.key === 'mid' ? 'NONE' : this.innerHTML\n\t\t\t\t\t}\n\t\t\t\t} else if (d.subheader === 'filter') {\n\t\t\t\t\tconst filter = self.filterUiRoot ? self.filterUiRoot : { lst: [] }\n\t\t\t\t\tif (filter.lst.length === 0) {\n\t\t\t\t\t\t// Do not show number of samples at bottom of FILTER tab when no filter applied\n\t\t\t\t\t\treturn d.key === 'mid' ? 'NONE' : ''\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst n = self.samplecounts[self.filterJSON] != undefined ? '' + self.samplecounts[self.filterJSON] : ''\n\t\t\t\t\t\treturn d.key === 'mid' ? filter.lst.length : n\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn d.key === 'mid' ? this.innerHTML : ' '\n\t\t\t\t}\n\t\t\t})\n\n\t\t// const visibleSubheaders = []\n\t\tfor (const key in self.dom.subheader) {\n\t\t\tself.dom.subheader[key].style(\n\t\t\t\t'display',\n\t\t\t\tself.activeTab == -1 ? 'none' : self.tabs[self.activeTab].subheader === key ? 'block' : 'none'\n\t\t\t)\n\t\t}\n\n\t\tif (self.opts.header_mode === 'with_cohortHtmlSelect') {\n\t\t\tself.dom.cohortSelect.selectAll('option').property('value', self.activeCohort)\n\t\t}\n\t}\n}\n\nfunction setInteractivity(self) {\n\tself.setTab = async (event, d) => {\n\t\t// a disabled tab is shown to advertise the capability but cannot be activated\n\t\tif (d.disabled) return\n\t\tif (d.colNum === self.activeTab && !self.searching) {\n\t\t\t// The about tab should not be hidden on double click with or without plots\n\t\t\tif (self.activeTab == 0) return\n\t\t\tself.prevCohort = self.activeCohort\n\t\t\tawait self.updateUI()\n\n\t\t\t// if the user double-clicks on the same tab, hide the subheader\n\t\t\tself.app.dispatch({ type: 'tab_set', activeTab: -1 })\n\t\t\treturn\n\t\t}\n\t\tself.activeTab = d.colNum\n\t\tself.searching = false\n\t\tself.app.dispatch({ type: 'tab_set', activeTab: self.activeTab })\n\t\tconst chartsIdx = self.subheaderKeys.indexOf('charts')\n\t\tif (self.activeTab == chartsIdx && self.activeCohort != -1 && !self.state.plots.length) {\n\t\t\t// show dictionary or default plot in charts tab if no other\n\t\t\t// plots have been created\n\t\t\tconst defaultChartType = self.state.termdbConfig.defaultChartType || 'dictionary'\n\t\t\tself.app.dispatch({\n\t\t\t\ttype: 'plot_create',\n\t\t\t\tid: getId(),\n\t\t\t\tconfig: { chartType: defaultChartType }\n\t\t\t})\n\t\t}\n\t}\n\n\tself.mouseover = (event, d) => {\n\t\tconst defaultActiveColor = self.state.termdbConfig.massNav?.activeColor || activeTabBgColor\n\t\tself.dom.tds.style('background-color', t => {\n\t\t\t//light yellow for inactive tabs and grey-yellow for this active tab\n\t\t\tif (t.colNum === d.colNum)\n\t\t\t\treturn self.activeTab == t.colNum\n\t\t\t\t\t? self.state.termdbConfig.massNav?.activeColorHover || activeTabBgColorHover\n\t\t\t\t\t: inactiveTabBgColorHover\n\t\t\treturn self.activeTab == t.colNum ? defaultActiveColor : 'transparent'\n\t\t})\n\t}\n\n\tself.mouseout = () => {\n\t\tconst defaultActiveColor = self.state.termdbConfig.massNav?.activeColor || activeTabBgColor\n\t\tself.dom.tds.style('background-color', t => (self.activeTab == t.colNum ? defaultActiveColor : 'transparent'))\n\t}\n\n\tself.getSessionFile = async event => {\n\t\t//Download mass-session-id file\n\t\tconst res = await dofetch3(`/massSession?id=${self.sessionId}`)\n\t\tconst a = document.createElement('a')\n\t\tconst dataStr = 'data:application/json;charset=utf-8,' + encodeURIComponent(JSON.stringify(res.state))\n\t\ta.setAttribute('href', dataStr)\n\t\ta.download = `${self.sessionId}.json`\n\t\ta.click()\n\t\ta.remove()\n\t}\n\n\tself.pickDatasetLabel = appState => {\n\t\tconst dslabel = appState.vocab.dslabel.toUpperCase()\n\t\treturn dslabel.length > 10 ? `${dslabel.slice(0, 10)}...` : dslabel\n\t}\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["event", "id", "d", "instanceNum", "event", "d", "cf", "chr", "start", "stop", "prompt", "event", "setRenderers", "appState", "event"]
|
|
7
|
-
}
|
package/dist/chunk-MTZSN3H4.js
DELETED
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
appear2 as appear,
|
|
3
|
-
axisstyle,
|
|
4
|
-
bwSetting,
|
|
5
|
-
disappear2 as disappear,
|
|
6
|
-
makeNumericAxisConfig,
|
|
7
|
-
rgb2hex
|
|
8
|
-
} from "./chunk-WY2PGUVX.js";
|
|
9
|
-
import {
|
|
10
|
-
dofetch3
|
|
11
|
-
} from "./chunk-LYVLF6HO.js";
|
|
12
|
-
import {
|
|
13
|
-
axisLeft
|
|
14
|
-
} from "./chunk-LOZEKOES.js";
|
|
15
|
-
import {
|
|
16
|
-
format,
|
|
17
|
-
linear
|
|
18
|
-
} from "./chunk-SOTB4FRE.js";
|
|
19
|
-
|
|
20
|
-
// src/block.tk.bigwig.js
|
|
21
|
-
function bigwigfromtemplate(tk, template) {
|
|
22
|
-
tk.scale = {};
|
|
23
|
-
if (template.scale) {
|
|
24
|
-
for (const k in template.scale) {
|
|
25
|
-
tk.scale[k] = template.scale[k];
|
|
26
|
-
}
|
|
27
|
-
} else {
|
|
28
|
-
tk.scale.auto = 1;
|
|
29
|
-
}
|
|
30
|
-
if (tk.normalize) {
|
|
31
|
-
} else {
|
|
32
|
-
tk.normalize = {
|
|
33
|
-
dividefactor: 1,
|
|
34
|
-
disable: 1
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
tk.barheight = template.height || 50;
|
|
38
|
-
tk.height_main = tk.toppad + tk.barheight + tk.bottompad;
|
|
39
|
-
if (!tk.ncolor) tk.ncolor = "#BD005E";
|
|
40
|
-
if (!tk.ncolor2) tk.ncolor2 = "#5E00BD";
|
|
41
|
-
if (!tk.pcolor) tk.pcolor = "#005EBD";
|
|
42
|
-
if (!tk.pcolor2) tk.pcolor2 = "#FA7D00";
|
|
43
|
-
}
|
|
44
|
-
function bigwigmaketk(tk, block) {
|
|
45
|
-
tk.img = tk.glider.append("image");
|
|
46
|
-
tk.tklabel.attr("y", tk.barheight / 2);
|
|
47
|
-
tk.leftaxis = tk.gleft.append("g");
|
|
48
|
-
tk.config_handle = block.maketkconfighandle(tk).on("click", () => {
|
|
49
|
-
tk.tkconfigtip.clear().showunder(tk.config_handle.node());
|
|
50
|
-
bigwigconfigpanel(tk, block, tk.tkconfigtip.d, () => bigwigload(tk, block));
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
async function bigwigload(tk, block) {
|
|
54
|
-
block.tkcloakon(tk);
|
|
55
|
-
const par = block.tkarg_q(tk);
|
|
56
|
-
if (tk.dotplotfactor) par.dotplotfactor = tk.dotplotfactor;
|
|
57
|
-
if (tk.bgcolor) par.bgcolor = tk.bgcolor;
|
|
58
|
-
tk.height_main = tk.toppad + tk.barheight + tk.bottompad;
|
|
59
|
-
tk.img.attr("width", block.width).attr("height", tk.barheight);
|
|
60
|
-
let errtext;
|
|
61
|
-
try {
|
|
62
|
-
let data;
|
|
63
|
-
if (tk.imgData) {
|
|
64
|
-
data = tk.imgData;
|
|
65
|
-
} else {
|
|
66
|
-
data = await dofetch3("tkbigwig", { method: "POST", body: JSON.stringify(par) });
|
|
67
|
-
}
|
|
68
|
-
if (data.error) throw data.error;
|
|
69
|
-
if (!data.src) throw "data.src missing";
|
|
70
|
-
tk.tklabel.transition().attr("y", tk.barheight / 2);
|
|
71
|
-
tk.img.attr("xlink:href", data.src);
|
|
72
|
-
if (data.minv != void 0) {
|
|
73
|
-
tk.scale.min = data.minv;
|
|
74
|
-
}
|
|
75
|
-
if (data.maxv != void 0) {
|
|
76
|
-
tk.scale.max = data.maxv;
|
|
77
|
-
}
|
|
78
|
-
tk.leftaxis.selectAll("*").remove();
|
|
79
|
-
if (data.nodata) {
|
|
80
|
-
throw "No data in view range";
|
|
81
|
-
}
|
|
82
|
-
const scale = linear().domain([tk.scale.min, tk.scale.max]).range([tk.barheight, 0]);
|
|
83
|
-
const axis = axisLeft().scale(scale).tickValues([tk.scale.min, tk.scale.max]);
|
|
84
|
-
if (tk.integer4axis) {
|
|
85
|
-
axis.tickFormat(format("d"));
|
|
86
|
-
}
|
|
87
|
-
axisstyle({
|
|
88
|
-
axis: tk.leftaxis.call(axis),
|
|
89
|
-
color: "black",
|
|
90
|
-
showline: true
|
|
91
|
-
});
|
|
92
|
-
} catch (err) {
|
|
93
|
-
tk.img.attr("width", 0).attr("height", 0);
|
|
94
|
-
if (err.stack) {
|
|
95
|
-
console.log(err.stack);
|
|
96
|
-
}
|
|
97
|
-
errtext = typeof err == "string" ? err : err.message;
|
|
98
|
-
} finally {
|
|
99
|
-
block.tkcloakoff(tk, { error: errtext });
|
|
100
|
-
block.block_setheight();
|
|
101
|
-
for (const panel of tk.subpanels) {
|
|
102
|
-
bigwigloadsubpanel(tk, block, panel);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
async function bigwigloadsubpanel(tk, block, panel) {
|
|
107
|
-
block.tkcloakon_subpanel(panel);
|
|
108
|
-
const par = block.tkarg_q(tk);
|
|
109
|
-
if (tk.dotplotfactor) {
|
|
110
|
-
par.dotplotfactor = tk.dotplotfactor;
|
|
111
|
-
}
|
|
112
|
-
par.width = panel.width;
|
|
113
|
-
par.rglst = [
|
|
114
|
-
{
|
|
115
|
-
chr: panel.chr,
|
|
116
|
-
start: panel.start,
|
|
117
|
-
stop: panel.stop,
|
|
118
|
-
width: panel.width
|
|
119
|
-
}
|
|
120
|
-
];
|
|
121
|
-
delete par.percentile;
|
|
122
|
-
delete par.autoscale;
|
|
123
|
-
panel.img.attr("width", panel.width).attr("height", tk.barheight);
|
|
124
|
-
let errtext;
|
|
125
|
-
try {
|
|
126
|
-
if (tk.imgData) throw "subpanel not supported by imgData yet";
|
|
127
|
-
const data = await dofetch3("tkbigwig", { method: "POST", body: JSON.stringify(par) });
|
|
128
|
-
if (data.error) throw data.error;
|
|
129
|
-
panel.img.attr("xlink:href", data.src);
|
|
130
|
-
} catch (err) {
|
|
131
|
-
panel.img.attr("width", 0).attr("height", 0);
|
|
132
|
-
if (err.stack) {
|
|
133
|
-
console.log(err.stack);
|
|
134
|
-
}
|
|
135
|
-
errtext = typeof err == "string" ? err : err.message;
|
|
136
|
-
} finally {
|
|
137
|
-
block.tkcloakoff_subpanel(panel, { error: errtext });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
function bigwigconfigpanel(tk, block, holder, loader) {
|
|
141
|
-
const config = {
|
|
142
|
-
pcolor: {},
|
|
143
|
-
ncolor: {},
|
|
144
|
-
pcolor2: {},
|
|
145
|
-
ncolor2: {},
|
|
146
|
-
// .row
|
|
147
|
-
// .lab
|
|
148
|
-
dotplot: {},
|
|
149
|
-
// .row
|
|
150
|
-
dividefactor: {}
|
|
151
|
-
};
|
|
152
|
-
{
|
|
153
|
-
const row = holder.append("div").style("margin-bottom", "15px");
|
|
154
|
-
row.append("span").html("Height ");
|
|
155
|
-
row.append("input").attr("size", 5).property("value", tk.barheight).on("keyup", (event) => {
|
|
156
|
-
if (event.code != "Enter") return;
|
|
157
|
-
const s = event.target.value;
|
|
158
|
-
if (s == "") return;
|
|
159
|
-
const v = Number.parseInt(s);
|
|
160
|
-
if (Number.isNaN(v) || v <= 1) {
|
|
161
|
-
alert("track height must be positive integer");
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
tk.barheight = v;
|
|
165
|
-
loader(bwSetting.height);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
config.pcolor.row = holder.append("div").style("margin-bottom", "15px");
|
|
169
|
-
config.pcolor.lab = config.pcolor.row.append("span").text("Positive value color").style("padding-right", "10px");
|
|
170
|
-
config.pcolor.row.append("input").attr("type", "color").property("value", rgb2hex(tk.pcolor)).on("change", (event) => {
|
|
171
|
-
tk.pcolor = event.target.value;
|
|
172
|
-
loader(bwSetting.pcolor);
|
|
173
|
-
});
|
|
174
|
-
config.ncolor.row = holder.append("div").style("margin-bottom", "15px");
|
|
175
|
-
config.ncolor.lab = config.ncolor.row.append("span").text("Negative value color").style("padding-right", "10px");
|
|
176
|
-
config.ncolor.row.append("input").attr("type", "color").property("value", rgb2hex(tk.ncolor)).on("change", (event) => {
|
|
177
|
-
tk.ncolor = event.target.value;
|
|
178
|
-
loader(bwSetting.ncolor);
|
|
179
|
-
});
|
|
180
|
-
if (!tk.scale.auto) {
|
|
181
|
-
config.pcolor2.row = holder.append("div").style("margin-bottom", "15px");
|
|
182
|
-
config.pcolor2.lab = config.pcolor2.row.append("span").html("≥Max color").style("padding-right", "10px");
|
|
183
|
-
config.pcolor2.row.append("input").attr("type", "color").property("value", rgb2hex(tk.pcolor2)).on("change", (event) => {
|
|
184
|
-
tk.pcolor2 = event.target.value;
|
|
185
|
-
loader(bwSetting.pcolor2);
|
|
186
|
-
});
|
|
187
|
-
config.ncolor2.row = holder.append("div").style("margin-bottom", "15px");
|
|
188
|
-
config.ncolor2.lab = config.ncolor2.row.append("span").html("≤Min color").style("padding-right", "10px");
|
|
189
|
-
config.ncolor2.row.append("input").attr("type", "color").property("value", rgb2hex(tk.ncolor2)).on("change", (event) => {
|
|
190
|
-
tk.ncolor2 = event.target.value;
|
|
191
|
-
loader(bwSetting.ncolor2);
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
{
|
|
195
|
-
const setting = {};
|
|
196
|
-
if (tk.scale.auto) {
|
|
197
|
-
setting.auto = 1;
|
|
198
|
-
} else if (tk.scale.percentile) {
|
|
199
|
-
setting.percentile = tk.scale.percentile;
|
|
200
|
-
} else {
|
|
201
|
-
setting.fixed = { min: tk.scale.min, max: tk.scale.max };
|
|
202
|
-
}
|
|
203
|
-
makeNumericAxisConfig({
|
|
204
|
-
holder: holder.append("div").style("margin-bottom", "15px"),
|
|
205
|
-
setting,
|
|
206
|
-
callback: (s) => {
|
|
207
|
-
if (s.auto) {
|
|
208
|
-
tk.scale.auto = 1;
|
|
209
|
-
loader(bwSetting.autoscale);
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
if (s.fixed) {
|
|
213
|
-
delete tk.scale.auto;
|
|
214
|
-
delete tk.scale.percentile;
|
|
215
|
-
tk.scale.max = s.fixed.max;
|
|
216
|
-
tk.scale.min = s.fixed.min;
|
|
217
|
-
loader(bwSetting.fixedscale);
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
delete tk.scale.auto;
|
|
221
|
-
tk.scale.percentile = s.percentile;
|
|
222
|
-
loader(bwSetting.percentilescale);
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
{
|
|
227
|
-
config.dotplot.row = holder.append("div").style("margin-bottom", "15px");
|
|
228
|
-
config.dotplot.row.append("span").html("Dot plot ");
|
|
229
|
-
const s = config.dotplot.row.append("select").on("change", (event) => {
|
|
230
|
-
const i = event.target.selectedIndex;
|
|
231
|
-
if (i == 0) {
|
|
232
|
-
delete tk.dotplotfactor;
|
|
233
|
-
} else {
|
|
234
|
-
tk.dotplotfactor = Number.parseInt(event.target.options[i].innerHTML);
|
|
235
|
-
}
|
|
236
|
-
loader(i == 0 ? bwSetting.nodotplot : bwSetting.usedotplot);
|
|
237
|
-
});
|
|
238
|
-
let o = s.append("option").text("no");
|
|
239
|
-
if (!tk.dotplotfactor) {
|
|
240
|
-
o.property("selected", 1);
|
|
241
|
-
}
|
|
242
|
-
o = s.append("option").text("5");
|
|
243
|
-
if (tk.dotplotfactor == 5) {
|
|
244
|
-
o.property("selected", 1);
|
|
245
|
-
}
|
|
246
|
-
o = s.append("option").text("10");
|
|
247
|
-
if (tk.dotplotfactor == 10) {
|
|
248
|
-
o.property("selected", 1);
|
|
249
|
-
}
|
|
250
|
-
o = s.append("option").text("15");
|
|
251
|
-
if (tk.dotplotfactor == 15) {
|
|
252
|
-
o.property("selected", 1);
|
|
253
|
-
}
|
|
254
|
-
o = s.append("option").text("20");
|
|
255
|
-
if (tk.dotplotfactor == 20) {
|
|
256
|
-
o.property("selected", 1);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
config.dividefactor.row = holder.append("div");
|
|
260
|
-
{
|
|
261
|
-
const id = Math.random().toString();
|
|
262
|
-
const input = config.dividefactor.row.append("input").attr("type", "checkbox").attr("id", id);
|
|
263
|
-
if (!tk.normalize.disable) {
|
|
264
|
-
input.property("checked", 1);
|
|
265
|
-
}
|
|
266
|
-
config.dividefactor.row.append("label").html(" Apply normalization").attr("for", id);
|
|
267
|
-
const folder = config.dividefactor.row.append("div").style("margin", "5px 10px 0px 20px").style("display", tk.normalize.disable ? "none" : "block");
|
|
268
|
-
folder.append("span").html("Divide raw value by ");
|
|
269
|
-
const factorinput = folder.append("input").attr("type", "number").style("width", "60px").property("value", tk.normalize.dividefactor).on("keyup", (event) => {
|
|
270
|
-
if (event.code != "Enter" && event.code != "NumpadEnter") return;
|
|
271
|
-
const v = event.target.value;
|
|
272
|
-
if (v <= 0) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
tk.normalize.dividefactor = v;
|
|
276
|
-
loader(bwSetting.usedividefactor);
|
|
277
|
-
});
|
|
278
|
-
folder.append("div").text("Enter a value above zero").style("font-size", ".7em").style("color", "#858585");
|
|
279
|
-
input.on("change", (event) => {
|
|
280
|
-
if (event.target.checked) {
|
|
281
|
-
appear(folder);
|
|
282
|
-
delete tk.normalize.disable;
|
|
283
|
-
factorinput.property("value", tk.normalize.dividefactor);
|
|
284
|
-
loader(bwSetting.usedividefactor);
|
|
285
|
-
return;
|
|
286
|
-
}
|
|
287
|
-
disappear(folder);
|
|
288
|
-
tk.normalize.disable = 1;
|
|
289
|
-
loader(bwSetting.nodividefactor);
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
return config;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
export {
|
|
296
|
-
bigwigfromtemplate,
|
|
297
|
-
bigwigmaketk,
|
|
298
|
-
bigwigload,
|
|
299
|
-
bigwigloadsubpanel,
|
|
300
|
-
bigwigconfigpanel
|
|
301
|
-
};
|
|
302
|
-
//# sourceMappingURL=chunk-MTZSN3H4.js.map
|