@sjcrh/proteinpaint-client 2.197.0 → 2.198.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-R3PFZNRN.js +1373 -0
- package/dist/AIProjectAdmin-DM3KG6SR.js +958 -0
- package/dist/AppHeader-6DZQ6YZX.js +835 -0
- package/dist/BoxPlot-76NINVX4.js +1217 -0
- package/dist/CorrelationVolcano-U5UMJNH5.js +619 -0
- package/dist/DE-AXNYWIQK.js +95 -0
- package/dist/DEinput-JH6YY6LS.js +301 -0
- package/dist/DifferentialAnalysis-25P4CGIY.js +242 -0
- package/dist/Disco-NVMLF3BK.js +3392 -0
- package/dist/Disco-NVMLF3BK.js.map +7 -0
- package/dist/Disco.UI-C7CZINUQ.js +249 -0
- package/dist/DmrPlot-WROR4ENM.js +642 -0
- package/dist/GB-JUABODPH.js +1394 -0
- package/dist/GB-JUABODPH.js.map +7 -0
- package/dist/GSEA-Y5R2THIJ.js +846 -0
- package/dist/GeneExpInput-JDU6EI7K.js +367 -0
- package/dist/Geomap-J763OK2F.js +89 -0
- package/dist/Geomap-J763OK2F.js.map +7 -0
- package/dist/HicApp-UNIJLH4B.js +2250 -0
- package/dist/IDCViewer-KVPCIUDW.js +10803 -0
- package/dist/IDCViewer-KVPCIUDW.js.map +7 -0
- package/dist/NumBinaryEditor-WMN2GGO4.js +271 -0
- package/dist/NumBinaryEditor.unit.spec-TAMXV6SE.js +286 -0
- package/dist/NumContEditor-XYIOJY4E.js +109 -0
- package/dist/NumContEditor.unit.spec-WDZ75BHO.js +169 -0
- package/dist/NumCustomBinEditor-5SY3C4TY.js +38 -0
- package/dist/NumCustomBinEditor.unit.spec-XHTAIXR3.js +284 -0
- package/dist/NumDiscreteEditor-NRDRX4FD.js +179 -0
- package/dist/NumDiscreteEditor.unit.spec-2CJW7OAT.js +202 -0
- package/dist/NumRegularBinEditor-DUDVTNDC.js +38 -0
- package/dist/NumRegularBinEditor.unit.spec-H3GNQHMN.js +227 -0
- package/dist/NumSplineEditor-7Q4AC7KH.js +198 -0
- package/dist/NumSplineEditor.unit.spec-YRZK5PH5.js +199 -0
- package/dist/NumericDensity-NTNWUESG.js +38 -0
- package/dist/NumericDensity.unit.spec-5I5U6T6P.js +221 -0
- package/dist/NumericHandler-MEW2KMPX.js +39 -0
- package/dist/NumericHandler.unit.spec-JFX4BPRG.js +219 -0
- package/dist/ProteomeInput-K2ZHR2U6.js +395 -0
- package/dist/RunChart2-BEBDU7RC.js +758 -0
- package/dist/SC-XCBFJVUJ.js +1120 -0
- package/dist/Volcano-4Y4TP3UX.js +1385 -0
- package/dist/WSIViewer-ZLQU62PD.js +48562 -0
- package/dist/WsiSamplesPlot-JMBSITOM.js +165 -0
- package/dist/adSandbox-664IRCRL.js +38 -0
- package/dist/animatedBubbleChart-TX7NW34K.js +555 -0
- package/dist/app-63WJ3BMP.js +37 -0
- package/dist/app-77FIZHCG.js +49 -0
- package/dist/app.js +19 -19
- package/dist/bam-IETNVAYD.js +860 -0
- package/dist/barchart-YUVXJNH4.js +47 -0
- package/dist/barchart.data-P4EIQXGE.js +22 -0
- package/dist/barchart.events-JPVCLTIG.js +47 -0
- package/dist/barchart.integration.spec-ZH7DEQI2.js +2196 -0
- package/dist/barchart2-XO2FG76J.js +314 -0
- package/dist/bars.renderer-AUIWUJDH.js +12 -0
- package/dist/block-NBTCOT3H.js +6255 -0
- package/dist/block.init-X7Y2EEVR.js +38 -0
- package/dist/block.mds.expressionrank-BIAOZIZ3.js +359 -0
- package/dist/block.mds.geneboxplot-CNICDVLK.js +828 -0
- package/dist/block.mds.junction-PQXCTSUI.js +1545 -0
- package/dist/block.mds.svcnv-32KMVTCT.js +6801 -0
- package/dist/block.svg-LRTOYQK2.js +164 -0
- package/dist/block.tk.aicheck-HDV7ZIUD.js +283 -0
- package/dist/block.tk.ase-JIDWKMYI.js +365 -0
- package/dist/block.tk.bam-5X3OS5HB.js +1906 -0
- package/dist/block.tk.bedgraphdot-T7JX7YQL.js +384 -0
- package/dist/block.tk.bigwig.ui-OSAYEBAE.js +212 -0
- package/dist/block.tk.hicstraw-DEY3VQFK.js +823 -0
- package/dist/block.tk.junction-7UAFEZSJ.js +2364 -0
- package/dist/block.tk.junction.textmatrixui-27LHS33U.js +199 -0
- package/dist/block.tk.ld-DF2PI7OO.js +99 -0
- package/dist/block.tk.menu-L2D5KBIV.js +1029 -0
- package/dist/block.tk.pgv-QO56SKBV.js +944 -0
- package/dist/brainImaging-NIPQWFWO.js +423 -0
- package/dist/brainRegions-ZNZ2WHSU.js +221 -0
- package/dist/bubbleHeatmap-ERWNEKZB.js +383 -0
- package/dist/chunk-2GYWFQML.js +299 -0
- package/dist/chunk-2HYJ4GDH.js +50 -0
- package/dist/chunk-2MG6XE6R.js +272 -0
- package/dist/chunk-2X6W4E3W.js +1507 -0
- package/dist/chunk-2X6W4E3W.js.map +7 -0
- package/dist/chunk-33K5PA52.js +54 -0
- package/dist/chunk-37XDBPOP.js +26 -0
- package/dist/chunk-3EWB3246.js +58 -0
- package/dist/chunk-3RSKOPIY.js +100 -0
- package/dist/chunk-3XVVN66M.js +4085 -0
- package/dist/chunk-3XVVN66M.js.map +7 -0
- package/dist/chunk-4DPVT4NE.js +1102 -0
- package/dist/chunk-4IH7DORZ.js +98 -0
- package/dist/chunk-4QNBFIIR.js +399 -0
- package/dist/chunk-4STKL6SR.js +217 -0
- package/dist/chunk-4TZIVSL5.js +34 -0
- package/dist/chunk-5ABGFJSP.js +467 -0
- package/dist/chunk-5AZNP47R.js +302 -0
- package/dist/chunk-5RL2OHXX.js +5070 -0
- package/dist/chunk-5VOPABBA.js +20941 -0
- package/dist/chunk-5VOPABBA.js.map +7 -0
- package/dist/chunk-6BB43SIB.js +102 -0
- package/dist/chunk-7OHRR2IE.js +276 -0
- package/dist/chunk-ARBHWDMY.js +226 -0
- package/dist/chunk-ARBHWDMY.js.map +7 -0
- package/dist/chunk-ASATD4T7.js +14 -0
- package/dist/chunk-AZ47Q7BX.js +1223 -0
- package/dist/chunk-B5B3LZB3.js +236 -0
- package/dist/chunk-BHGISFCA.js +2681 -0
- package/dist/chunk-BMBOZ64T.js +2786 -0
- package/dist/chunk-BOZJHPJP.js +216 -0
- package/dist/chunk-CDD7LYJM.js +194 -0
- package/dist/chunk-CTQ3IUCA.js +2327 -0
- package/dist/chunk-D7TID3HR.js +158 -0
- package/dist/chunk-DBKNWR4J.js +1561 -0
- package/dist/chunk-DBKNWR4J.js.map +7 -0
- package/dist/chunk-E55LLYRX.js +55 -0
- package/dist/chunk-ESGXULRH.js +386 -0
- package/dist/chunk-EZ4LZ6ZT.js +117 -0
- package/dist/chunk-F3SJTVP5.js +4284 -0
- package/dist/chunk-F5IXNJO7.js +222 -0
- package/dist/chunk-FJYECRHW.js +448 -0
- package/dist/chunk-FPNRUQOU.js +833 -0
- package/dist/chunk-G5S4R77D.js +1942 -0
- package/dist/chunk-G764NXQN.js +170 -0
- package/dist/chunk-GAPI4MML.js +148 -0
- package/dist/chunk-HLUZOZXJ.js +272 -0
- package/dist/chunk-HOKIK2FR.js +375 -0
- package/dist/chunk-I6WR4CG7.js +323 -0
- package/dist/chunk-I6WR4CG7.js.map +7 -0
- package/dist/chunk-KLGL6XZD.js +129 -0
- package/dist/chunk-L7IRWUKT.js +480 -0
- package/dist/chunk-LFCYMSVA.js +314 -0
- package/dist/chunk-LX6G7HJJ.js +617 -0
- package/dist/chunk-M2G5R4WB.js +142 -0
- package/dist/chunk-M4TTGGT4.js +102 -0
- package/dist/chunk-M6EF3WVV.js +1825 -0
- package/dist/chunk-M6KHT3MM.js +146 -0
- package/dist/chunk-MCZFHWIR.js +230 -0
- package/dist/chunk-MFQACKYU.js +448 -0
- package/dist/chunk-MVGAGTM3.js +343 -0
- package/dist/chunk-NELOT3NJ.js +119 -0
- package/dist/chunk-NRKMXULC.js +54 -0
- package/dist/chunk-NSTL4MY2.js +2110 -0
- package/dist/chunk-NSTL4MY2.js.map +7 -0
- package/dist/chunk-NYRZNRG5.js +177 -0
- package/dist/chunk-ONPKE6DC.js +368 -0
- package/dist/chunk-OXVLWQ6M.js +556 -0
- package/dist/chunk-PFRWS4CR.js +203 -0
- package/dist/chunk-PJKQUXEN.js +1275 -0
- package/dist/chunk-Q2L44HK3.js +6364 -0
- package/dist/chunk-QNHT74XC.js +1245 -0
- package/dist/chunk-RKO6BL5N.js +446 -0
- package/dist/chunk-T25QNZHB.js +254 -0
- package/dist/chunk-U7TBYVIQ.js +31 -0
- package/dist/chunk-UGRQXBL4.js +381 -0
- package/dist/chunk-USFSHSCJ.js +477 -0
- package/dist/chunk-VJ6UFVGC.js +2833 -0
- package/dist/chunk-W3WPPOXH.js +292 -0
- package/dist/chunk-WFCSOTBO.js +263 -0
- package/dist/chunk-WHP4AKDM.js +185 -0
- package/dist/chunk-WZ2L57MB.js +102 -0
- package/dist/chunk-XPY6AWXO.js +787 -0
- package/dist/chunk-Y4UAKFWC.js +37 -0
- package/dist/chunk-YQBS2ZCK.js +514 -0
- package/dist/chunk-Z5U6HOE4.js +190 -0
- package/dist/chunk-Z5U6HOE4.js.map +7 -0
- package/dist/chunk-ZNEJUKJW.js +140 -0
- package/dist/chunk-ZNEJUKJW.js.map +7 -0
- package/dist/chunk-ZTHM2TKP.js +176 -0
- package/dist/condition-2PASYSUC.js +332 -0
- package/dist/controls-5IMJ6K5L.js +41 -0
- package/dist/controls.config-P5PG2DHW.js +39 -0
- package/dist/correlation-U3EDLNHR.js +102 -0
- package/dist/cuminc-2HUFEROK.js +1149 -0
- package/dist/cuminc.integration.spec-WFWAPTDA.js +678 -0
- package/dist/customdata.inputui-ZHWNEPFH.js +289 -0
- package/dist/dataDownload-VBSJBKMP.js +330 -0
- package/dist/dataDownload.integration.spec-LUFSETOP.js +193 -0
- package/dist/databrowser.ui-6H2KMSTJ.js +433 -0
- package/dist/dictionary-V37LXFIP.js +118 -0
- package/dist/dnaMethylation-OIZMHMLK.js +38 -0
- package/dist/dnaMethylation.integration.spec-CWPTJ74H.js +203 -0
- package/dist/dofetch-IWPZQB5N.js +51 -0
- package/dist/e2pca-7SLIAGYW.js +350 -0
- package/dist/ep-7L6KF6K4.js +1256 -0
- package/dist/expclust.gdc.spec-JT452Q3G.js +307 -0
- package/dist/facet-CXOUU5AS.js +521 -0
- package/dist/forms2-VPNCLQOY.js +539 -0
- package/dist/gb-P4VRXRED.js +88 -0
- package/dist/geneExpClustering-FQTCKRJJ.js +249 -0
- package/dist/geneExpression-BHO5326K.js +313 -0
- package/dist/geneExpression-ZMERB64E.js +38 -0
- package/dist/geneExpression.unit.spec-CNVHZWNG.js +102 -0
- package/dist/geneORA-FXVUCXGX.js +278 -0
- package/dist/geneRanking-SFK4UBKQ.js +553 -0
- package/dist/geneVariant-IYEHB4H7.js +41 -0
- package/dist/geneVariant-LIRRLUFR.js +39 -0
- package/dist/geneVariant.integration.spec-Y2NPNTYX.js +198 -0
- package/dist/genefusion.ui-L3HIJM3N.js +309 -0
- package/dist/geneset-A6VUFX63.js +208 -0
- package/dist/genomeBrowser.spec-CB4HHHBN.js +281 -0
- package/dist/grin2-FKBIMH5N.js +75 -0
- package/dist/grin2-V36KLEBU.js +1143 -0
- package/dist/grin2-V36KLEBU.js.map +7 -0
- package/dist/hierCluster-QFPRMHVA.js +63 -0
- package/dist/hierCluster-YWC3XYPV.js +59 -0
- package/dist/hierCluster.config-F7YYZNM3.js +40 -0
- package/dist/hierCluster.integration.spec-AF4L3YT6.js +488 -0
- package/dist/hierCluster.interactivity-RPY74PK6.js +54 -0
- package/dist/hierCluster.renderers-LOKHZ3V2.js +21 -0
- package/dist/imagePlot-BBEXA754.js +163 -0
- package/dist/importPlot-7QGANZGK.js +8 -0
- package/dist/isoformExpression-4SLLCVFD.js +40 -0
- package/dist/isoformExpression.unit.spec-GEL4JJ64.js +208 -0
- package/dist/launch.adhoc-LWLBQJS5.js +42 -0
- package/dist/leftlabel.sample-RTEZOIH2.js +264 -0
- package/dist/legacyDataset-VLD7ZYWI.js +119 -0
- package/dist/lollipop-XKQK5QZU.js +171 -0
- package/dist/maf-AZQPPWDO.js +459 -0
- package/dist/maftimeline-7MSVYKQU.js +593 -0
- package/dist/matrix-BGLWC25D.js +58 -0
- package/dist/matrix-IQR5SRMK.js +63 -0
- package/dist/matrix.cells-5C57NWOY.js +28 -0
- package/dist/matrix.config-2DQXAN2E.js +41 -0
- package/dist/matrix.data-ADCGF5H6.js +25 -0
- package/dist/matrix.groups-V4ITQ5F7.js +27 -0
- package/dist/matrix.integration.spec-IBNOO2WP.js +3072 -0
- package/dist/matrix.interactivity-JNELJFOV.js +42 -0
- package/dist/matrix.layout-WBVIV6GR.js +44 -0
- package/dist/matrix.legend-YHOWPK77.js +22 -0
- package/dist/matrix.renderers-5BGVRR3M.js +38 -0
- package/dist/matrix.serieses-2GZJOASZ.js +21 -0
- package/dist/matrix.sort-WKIWPJKP.js +27 -0
- package/dist/matrix.sort.unit.spec-L2E4D4AS.js +472 -0
- package/dist/matrix.sorterUi-TEJWWJ64.js +18 -0
- package/dist/matrix.sorterUi.unit.spec-SHP7C4P7.js +342 -0
- package/dist/mavb-4MXNYUEO.js +732 -0
- package/dist/mds.fimo-WHIJIBOI.js +518 -0
- package/dist/mds.samplescatterplot-BRJ6NG2D.js +1550 -0
- package/dist/mds.survivalplot-OPCMB5PB.js +483 -0
- package/dist/numericDictTermCluster-7MIFOP2K.js +65 -0
- package/dist/oncomatrix-BGG6BEUI.js +295 -0
- package/dist/oncomatrix.spec-LYQ4L4F3.js +448 -0
- package/dist/plot.2dvaf-6WVCP2ZI.js +377 -0
- package/dist/plot.app-MLBP6WFP.js +41 -0
- package/dist/plot.barplot-JEPRZSCU.js +102 -0
- package/dist/plot.boxplot-GNFW42VM.js +152 -0
- package/dist/plot.brainImaging-5ACNSD45.js +51 -0
- package/dist/plot.disco-Q2V2KKIH.js +102 -0
- package/dist/plot.dzi-KVT6S7K7.js +33 -0
- package/dist/plot.ssgq-4N3KFJQ2.js +139 -0
- package/dist/plot.vaf2cov-ITRG5U43.js +259 -0
- package/dist/plot.wsi-26YZNU4V.js +36 -0
- package/dist/polar2-J7GVUK4X.js +231 -0
- package/dist/profileForms-VXV2JLXU.js +446 -0
- package/dist/profilePlot-ZZYZK4SY.js +54 -0
- package/dist/proteinView-7KN532D3.js +1568 -0
- package/dist/qualitative-MLRVLIAU.js +43 -0
- package/dist/radar2-WM2ZBOH3.js +326 -0
- package/dist/radarFacility2-3SBR2JJ3.js +334 -0
- package/dist/regression-WMRPQJW2.js +56 -0
- package/dist/regression.inputs-VWZKSYNY.js +48 -0
- package/dist/regression.inputs.term-OWE6GWHM.js +48 -0
- package/dist/regression.inputs.values.table-4INNZQI2.js +45 -0
- package/dist/regression.integration.spec-XKQ2JOOT.js +784 -0
- package/dist/regression.results-VZBYMBYC.js +40 -0
- package/dist/regression.spec-DU3UTDCJ.js +708 -0
- package/dist/render-N5FOF247.js +38 -0
- package/dist/report-DW3OHB67.js +222 -0
- package/dist/sampleScatter.spec-REFSK2V4.js +202 -0
- package/dist/sampleView-ICOT2R6O.js +48 -0
- package/dist/samplelst-TJEVASYG.js +111 -0
- package/dist/samplematrix-6DAWCXQ3.js +2198 -0
- package/dist/sc-53LNOB7N.js +86 -0
- package/dist/scatter-DKYSS4DL.js +851 -0
- package/dist/selectGenomeWithTklst-WTX66TV3.js +134 -0
- package/dist/singleCellCellType-D2CN2BHQ.js +38 -0
- package/dist/singleCellCellType.unit.spec-LADUCI4R.js +160 -0
- package/dist/singleCellGeneExpression-YR2ZT34W.js +38 -0
- package/dist/singleCellGeneExpression.unit.spec-BM63M432.js +153 -0
- package/dist/singleCellPlot-3ICIOILE.js +54 -0
- package/dist/singlecell-6ZUFA3BQ.js +86 -0
- package/dist/singlecell-KX7W4U57.js +1572 -0
- package/dist/snp-VIURB7L3.js +38 -0
- package/dist/snp.unit.spec-ACZNZUNS.js +176 -0
- package/dist/snplocus-3LW4ZUZR.js +208 -0
- package/dist/spliceevent.a53ss.diagram-AKTZGWNM.js +151 -0
- package/dist/spliceevent.exonskip.diagram-XZHXB77R.js +283 -0
- package/dist/spliceevent.exonskip.diagram-XZHXB77R.js.map +7 -0
- package/dist/spliceevent.noeventdiagram-YTXWWNTJ.js +460 -0
- package/dist/ssGSEA-THW4WFMI.js +38 -0
- package/dist/ssGSEA.unit.spec-HTRGQI2K.js +88 -0
- package/dist/summarizeCnvGeneexp-RFYC3H2Z.js +163 -0
- package/dist/summarizeGeneexpSurvival-DQBZUTQ6.js +114 -0
- package/dist/summarizeMutationCnv-7AYEMHAI.js +164 -0
- package/dist/summarizeMutationDiagnosis-AKFJDSAF.js +40 -0
- package/dist/summarizeMutationSurvival-QJHZRQBZ.js +99 -0
- package/dist/summary-A5P7AYK4.js +49 -0
- package/dist/summary.integration.spec-HQISXGNL.js +414 -0
- package/dist/summaryInput-HP675QOQ.js +235 -0
- package/dist/sunburst-65LSYRXX.js +284 -0
- package/dist/survival-QNEI6YVK.js +46 -0
- package/dist/survival-UI74VXSM.js +58 -0
- package/dist/survival.integration.spec-X5N3JQXS.js +915 -0
- package/dist/svgraph-PSX2NER3.js +1387 -0
- package/dist/svmr-QDQ33EFX.js +3842 -0
- package/dist/table-LWAI27UO.js +200 -0
- package/dist/termCollection-3JHR74FG.js +179 -0
- package/dist/termCollection-CDF5LYUG.js +38 -0
- package/dist/termCollection.unit.spec-HOJKYWHF.js +208 -0
- package/dist/tk-GL4QCL4K.js +1019 -0
- package/dist/tk-GL4QCL4K.js.map +7 -0
- package/dist/tk-OEQFO73V.js +46 -0
- package/dist/tp.ui-SHNERDGC.js +1459 -0
- package/dist/tvs.dt-CZDC4TSR.js +39 -0
- package/dist/tvs.dtcnv.categorical-OPBDHZGB.js +40 -0
- package/dist/tvs.dtcnv.continuous-AR6P4EP3.js +72 -0
- package/dist/tvs.dtfusion-2YQ7N6FQ.js +40 -0
- package/dist/tvs.dtitd-ATCHW735.js +40 -0
- package/dist/tvs.dtsnvindel-WHHWAATJ.js +40 -0
- package/dist/tvs.dtsv-3UMCW65O.js +40 -0
- package/dist/tvs.numeric-TOEPASWN.js +21 -0
- package/dist/tvs.samplelst-M7XKXRTZ.js +104 -0
- package/dist/tvs.termCollection-WT4WZMYR.js +159 -0
- package/dist/violin-2YGXTBDS.js +46 -0
- package/dist/violin.integration.spec-YWNHVAGS.js +1425 -0
- package/dist/violin.interactivity-J6BE2UQL.js +38 -0
- package/dist/violin.renderer-3GRUWP2U.js +40 -0
- package/dist/vocabulary-2INCVPYJ.js +41 -0
- package/dist/vocabulary-2INCVPYJ.js.map +7 -0
- package/package.json +3 -3
- package/dist/2dmaf-HV22W5N3.js +0 -1373
- package/dist/AIProjectAdmin-7QGTPN3B.js +0 -958
- package/dist/AppHeader-NOKET4YE.js +0 -835
- package/dist/BoxPlot-SPG66F4C.js +0 -1217
- package/dist/CorrelationVolcano-3LEMTFXP.js +0 -619
- package/dist/DE-WCCADMXA.js +0 -95
- package/dist/DEinput-IZNPYPKH.js +0 -301
- package/dist/DifferentialAnalysis-SDZXIUXP.js +0 -242
- package/dist/Disco-M5RNUOWG.js +0 -3297
- package/dist/Disco-M5RNUOWG.js.map +0 -7
- package/dist/Disco.UI-RVUOPT6Y.js +0 -249
- package/dist/DmrPlot-R2N534FS.js +0 -642
- package/dist/GB-DY6XWOJE.js +0 -1356
- package/dist/GB-DY6XWOJE.js.map +0 -7
- package/dist/GSEA-3TB3PYEV.js +0 -846
- package/dist/GeneExpInput-VWCPHOVO.js +0 -367
- package/dist/HicApp-F2MY3NXP.js +0 -2250
- package/dist/IDCViewer-PT7IV6T2.js +0 -10799
- package/dist/IDCViewer-PT7IV6T2.js.map +0 -7
- package/dist/NumBinaryEditor-AL2NWII2.js +0 -271
- package/dist/NumBinaryEditor.unit.spec-NFRJHFNX.js +0 -286
- package/dist/NumContEditor-CTFJVIHU.js +0 -109
- package/dist/NumContEditor.unit.spec-FXGGCMTD.js +0 -169
- package/dist/NumCustomBinEditor-JFIJ2X6E.js +0 -38
- package/dist/NumCustomBinEditor.unit.spec-ZKIZXS53.js +0 -284
- package/dist/NumDiscreteEditor-E7SPHF55.js +0 -179
- package/dist/NumDiscreteEditor.unit.spec-QKKRZJMU.js +0 -202
- package/dist/NumRegularBinEditor-JSLTZIAQ.js +0 -38
- package/dist/NumRegularBinEditor.unit.spec-W73BA6L4.js +0 -227
- package/dist/NumSplineEditor-ZEXYGKKF.js +0 -198
- package/dist/NumSplineEditor.unit.spec-EHKI4CY7.js +0 -199
- package/dist/NumericDensity-ZXM6TB33.js +0 -38
- package/dist/NumericDensity.unit.spec-PUFRE5XA.js +0 -221
- package/dist/NumericHandler-73TUDM3R.js +0 -39
- package/dist/NumericHandler.unit.spec-EITBD47U.js +0 -219
- package/dist/ProteomeInput-QICOUSRW.js +0 -395
- package/dist/RunChart2-4JYV2Z7B.js +0 -758
- package/dist/SC-77HA6SBW.js +0 -1120
- package/dist/Volcano-3546I4MG.js +0 -1385
- package/dist/WSIViewer-DQAXX7QJ.js +0 -48562
- package/dist/WsiSamplesPlot-AGOLPLK3.js +0 -165
- package/dist/adSandbox-ZE5QOTN5.js +0 -38
- package/dist/animatedBubbleChart-ILMDNAVK.js +0 -555
- package/dist/app-JBFRJ5OO.js +0 -49
- package/dist/app-YVNRAZWU.js +0 -37
- package/dist/bam-A2PVAF3J.js +0 -860
- package/dist/barchart-2XQ7F6LT.js +0 -47
- package/dist/barchart.data-6XLK7D63.js +0 -22
- package/dist/barchart.events-DKJDKSPN.js +0 -47
- package/dist/barchart.integration.spec-UTTCQJRL.js +0 -2196
- package/dist/barchart2-2FRVUVJG.js +0 -314
- package/dist/bars.renderer-57KSYAAT.js +0 -12
- package/dist/block-3KOPYQ25.js +0 -6255
- package/dist/block.init-3KLLFGGV.js +0 -38
- package/dist/block.mds.expressionrank-XU3MBIOX.js +0 -359
- package/dist/block.mds.geneboxplot-VQTBL7T4.js +0 -828
- package/dist/block.mds.junction-IYWWRIJD.js +0 -1545
- package/dist/block.mds.svcnv-BMY5DCAM.js +0 -6801
- package/dist/block.svg-AT4GYQHX.js +0 -164
- package/dist/block.tk.aicheck-RANOFGDZ.js +0 -283
- package/dist/block.tk.ase-CBWJA3RN.js +0 -365
- package/dist/block.tk.bam-D7JBRNFQ.js +0 -1906
- package/dist/block.tk.bedgraphdot-IEHNIGVI.js +0 -384
- package/dist/block.tk.bigwig.ui-3SAXUJU4.js +0 -212
- package/dist/block.tk.hicstraw-R5EHQFGM.js +0 -823
- package/dist/block.tk.junction-JFCEXZZC.js +0 -2364
- package/dist/block.tk.junction.textmatrixui-4V7MV6TD.js +0 -199
- package/dist/block.tk.ld-LP4DIHAJ.js +0 -99
- package/dist/block.tk.menu-FTVZU2HA.js +0 -1029
- package/dist/block.tk.pgv-CRAMVKU4.js +0 -944
- package/dist/brainImaging-DXLK5XZ6.js +0 -423
- package/dist/brainRegions-AMSXQT3T.js +0 -221
- package/dist/bubbleHeatmap-SXBARILL.js +0 -383
- package/dist/chunk-23AEAG37.js +0 -314
- package/dist/chunk-2AHDWWQO.js +0 -276
- package/dist/chunk-2OJ577BB.js +0 -299
- package/dist/chunk-433DTQ6C.js +0 -26
- package/dist/chunk-46CPDZSW.js +0 -617
- package/dist/chunk-47EYZQA7.js +0 -98
- package/dist/chunk-4M22UIJQ.js +0 -2327
- package/dist/chunk-4YDERN37.js +0 -194
- package/dist/chunk-5ERYRSVV.js +0 -1825
- package/dist/chunk-6W6UMGAV.js +0 -230
- package/dist/chunk-6Z4XHMZV.js +0 -54
- package/dist/chunk-7P4DUYAQ.js +0 -1245
- package/dist/chunk-7YWPWCHD.js +0 -448
- package/dist/chunk-7Z6E3NA5.js +0 -787
- package/dist/chunk-AC3RAKUI.js +0 -102
- package/dist/chunk-BKPDYW5T.js +0 -177
- package/dist/chunk-BSOB3BVG.js +0 -217
- package/dist/chunk-CJJA6RVM.js +0 -254
- package/dist/chunk-CUXOQIUA.js +0 -1102
- package/dist/chunk-D5ZYSW45.js +0 -216
- package/dist/chunk-DA6RR5IR.js +0 -170
- package/dist/chunk-DD6KDZVR.js +0 -302
- package/dist/chunk-DI5ULDWN.js +0 -54
- package/dist/chunk-DXM5IMGV.js +0 -446
- package/dist/chunk-FYY3T565.js +0 -188
- package/dist/chunk-FYY3T565.js.map +0 -7
- package/dist/chunk-GFETCJ7S.js +0 -176
- package/dist/chunk-H42SJNXA.js +0 -1535
- package/dist/chunk-H42SJNXA.js.map +0 -7
- package/dist/chunk-HCNF7EFT.js +0 -292
- package/dist/chunk-I62GOCNI.js +0 -31
- package/dist/chunk-IBYOP2FV.js +0 -2833
- package/dist/chunk-JD2ECQ3Z.js +0 -2681
- package/dist/chunk-JF47NF5G.js +0 -236
- package/dist/chunk-JHZK6IDA.js +0 -20904
- package/dist/chunk-JHZK6IDA.js.map +0 -7
- package/dist/chunk-JOA4KJTM.js +0 -222
- package/dist/chunk-JT7HC65V.js +0 -556
- package/dist/chunk-K6AW4GFM.js +0 -37
- package/dist/chunk-K7QY24X2.js +0 -1223
- package/dist/chunk-KOLVLBMI.js +0 -100
- package/dist/chunk-KQ6EF3FG.js +0 -448
- package/dist/chunk-LBWKMNVU.js +0 -129
- package/dist/chunk-LFGIMCUD.js +0 -55
- package/dist/chunk-LKB3DITY.js +0 -343
- package/dist/chunk-LQJMCE7G.js +0 -467
- package/dist/chunk-M2PPUO4E.js +0 -315
- package/dist/chunk-M2PPUO4E.js.map +0 -7
- package/dist/chunk-MCXQL4W2.js +0 -226
- package/dist/chunk-MCXQL4W2.js.map +0 -7
- package/dist/chunk-MLYSQG3C.js +0 -833
- package/dist/chunk-MNIBZTQE.js +0 -146
- package/dist/chunk-MYZJUT2H.js +0 -272
- package/dist/chunk-NOCLG6IN.js +0 -5070
- package/dist/chunk-NVRLD4TF.js +0 -2786
- package/dist/chunk-NZCX4A7X.js +0 -14
- package/dist/chunk-OVHCUTQM.js +0 -102
- package/dist/chunk-P3NKHTNT.js +0 -34
- package/dist/chunk-PFOCEOVT.js +0 -477
- package/dist/chunk-PJSOYF5U.js +0 -158
- package/dist/chunk-PK5HXJ3S.js +0 -272
- package/dist/chunk-Q555GFBW.js +0 -1942
- package/dist/chunk-QAVZUWY3.js +0 -399
- package/dist/chunk-QOAUM6UV.js +0 -148
- package/dist/chunk-QOEPKNVD.js +0 -185
- package/dist/chunk-QXPJLSAD.js +0 -4284
- package/dist/chunk-QZLP27O6.js +0 -50
- package/dist/chunk-SENZWOCC.js +0 -203
- package/dist/chunk-SFIX7XVT.js +0 -514
- package/dist/chunk-SJWAMUL5.js +0 -117
- package/dist/chunk-SOTB4FRE.js +0 -2098
- package/dist/chunk-SOTB4FRE.js.map +0 -7
- package/dist/chunk-TJYRBEBK.js +0 -2878
- package/dist/chunk-TJYRBEBK.js.map +0 -7
- package/dist/chunk-U3CMLIGB.js +0 -6364
- package/dist/chunk-UF6ZP6UR.js +0 -381
- package/dist/chunk-UN3O2MNB.js +0 -375
- package/dist/chunk-UVWUP6N7.js +0 -1275
- package/dist/chunk-UYEJ5DEZ.js +0 -142
- package/dist/chunk-V2ET64EJ.js +0 -119
- package/dist/chunk-WQEGWR63.js +0 -102
- package/dist/chunk-WYSEBR5S.js +0 -58
- package/dist/chunk-XB6F5OUB.js +0 -386
- package/dist/chunk-XVYSEXFV.js +0 -368
- package/dist/chunk-YGKVY5IU.js +0 -480
- package/dist/chunk-ZPXSPJV2.js +0 -263
- package/dist/chunk-ZRSJVACE.js +0 -1500
- package/dist/chunk-ZRSJVACE.js.map +0 -7
- package/dist/condition-YCPNILTV.js +0 -332
- package/dist/controls-RW5MWSLN.js +0 -41
- package/dist/controls.config-MP3CSYR4.js +0 -39
- package/dist/correlation-7AQRU4YR.js +0 -102
- package/dist/cuminc-WYLKIOXR.js +0 -1149
- package/dist/cuminc.integration.spec-MSAWDLD7.js +0 -678
- package/dist/customdata.inputui-YU4IQJOV.js +0 -289
- package/dist/dataDownload-72DIPZ45.js +0 -330
- package/dist/dataDownload.integration.spec-HRLMWQN7.js +0 -193
- package/dist/databrowser.ui-3PE25HK4.js +0 -433
- package/dist/dictionary-Y3ICL4AE.js +0 -118
- package/dist/dnaMethylation-SVGDW64U.js +0 -38
- package/dist/dnaMethylation.integration.spec-B7GLAFZI.js +0 -203
- package/dist/dofetch-42KOXNPF.js +0 -51
- package/dist/e2pca-CLFGEFJH.js +0 -350
- package/dist/ep-PUHV2DMO.js +0 -1256
- package/dist/expclust.gdc.spec-N7YDJAOZ.js +0 -307
- package/dist/facet-JFFJJCNT.js +0 -521
- package/dist/forms2-XZAWW3RN.js +0 -539
- package/dist/gb-SQJ5PWOH.js +0 -88
- package/dist/geneExpClustering-EG2BLMQX.js +0 -249
- package/dist/geneExpression-J42BGP3B.js +0 -38
- package/dist/geneExpression-QRK3LNMV.js +0 -313
- package/dist/geneExpression.unit.spec-X7HVIFZA.js +0 -102
- package/dist/geneORA-SVBPO66K.js +0 -278
- package/dist/geneRanking-HNMMLZIX.js +0 -553
- package/dist/geneVariant-RVQKNVQO.js +0 -39
- package/dist/geneVariant-SO5FEJUZ.js +0 -41
- package/dist/geneVariant.integration.spec-DOMX4GMP.js +0 -198
- package/dist/genefusion.ui-QS7AG46F.js +0 -309
- package/dist/geneset-JKOX3VIW.js +0 -208
- package/dist/genomeBrowser.spec-IRSTT2OX.js +0 -281
- package/dist/grin2-G6DA4M7Q.js +0 -1095
- package/dist/grin2-G6DA4M7Q.js.map +0 -7
- package/dist/grin2-VZLCISPM.js +0 -75
- package/dist/hierCluster-6AW23EB5.js +0 -63
- package/dist/hierCluster-REXTCODR.js +0 -59
- package/dist/hierCluster.config-3Z3R66XH.js +0 -40
- package/dist/hierCluster.integration.spec-XE47Q64Z.js +0 -488
- package/dist/hierCluster.interactivity-2YJYYKVK.js +0 -54
- package/dist/hierCluster.renderers-LE7W2AL6.js +0 -21
- package/dist/imagePlot-WMZJJ5CJ.js +0 -163
- package/dist/importPlot-P35EGIJJ.js +0 -8
- package/dist/isoformExpression-3TFPEXB4.js +0 -40
- package/dist/isoformExpression.unit.spec-SPQFK3EA.js +0 -208
- package/dist/launch.adhoc-ZQSJBLMJ.js +0 -42
- package/dist/leftlabel.sample-SJRQ6LJ2.js +0 -264
- package/dist/legacyDataset-TNIIJABK.js +0 -119
- package/dist/lollipop-RXM6UBZ7.js +0 -171
- package/dist/maf-NWXJWBNF.js +0 -459
- package/dist/maftimeline-D7UENAP5.js +0 -593
- package/dist/matrix-77LNADX2.js +0 -63
- package/dist/matrix-YDOLKY6G.js +0 -58
- package/dist/matrix.cells-VEC5LEWV.js +0 -28
- package/dist/matrix.config-GTAAAUGQ.js +0 -41
- package/dist/matrix.data-T4GEX6ZH.js +0 -25
- package/dist/matrix.groups-7NWHHP5Q.js +0 -27
- package/dist/matrix.integration.spec-5GBTFRZA.js +0 -3072
- package/dist/matrix.interactivity-ONT6WCRU.js +0 -42
- package/dist/matrix.layout-LDXHGOHF.js +0 -44
- package/dist/matrix.legend-5MDW65HV.js +0 -22
- package/dist/matrix.renderers-OEPLQG3C.js +0 -38
- package/dist/matrix.serieses-4RX7TUQ7.js +0 -21
- package/dist/matrix.sort-UKMMECBZ.js +0 -27
- package/dist/matrix.sort.unit.spec-VWOXPVRE.js +0 -472
- package/dist/matrix.sorterUi-H64DDQIL.js +0 -18
- package/dist/matrix.sorterUi.unit.spec-DH4434FK.js +0 -342
- package/dist/mavb-ARUWOZES.js +0 -732
- package/dist/mds.fimo-ZEAE5BC3.js +0 -518
- package/dist/mds.samplescatterplot-C5EBKBVF.js +0 -1550
- package/dist/mds.survivalplot-RS7Z3J3Q.js +0 -483
- package/dist/numericDictTermCluster-CSQOV4TM.js +0 -65
- package/dist/oncomatrix-5UVM3KUA.js +0 -295
- package/dist/oncomatrix.spec-CU3EZCMO.js +0 -448
- package/dist/plot.2dvaf-JD27DSDS.js +0 -377
- package/dist/plot.app-NMPMG3S2.js +0 -41
- package/dist/plot.barplot-T4LPKFXW.js +0 -102
- package/dist/plot.boxplot-22ETOHNI.js +0 -152
- package/dist/plot.brainImaging-Q7S7KSHW.js +0 -51
- package/dist/plot.disco-NIPBER5N.js +0 -102
- package/dist/plot.dzi-DAX7GUTF.js +0 -33
- package/dist/plot.ssgq-7J6S35RW.js +0 -139
- package/dist/plot.vaf2cov-7EWFTD72.js +0 -259
- package/dist/plot.wsi-E45KZGKD.js +0 -36
- package/dist/polar2-LPT2XMD2.js +0 -231
- package/dist/profileForms-EYN2KLSY.js +0 -446
- package/dist/profilePlot-I7VQM3CH.js +0 -54
- package/dist/proteinView-JP5TF3ZK.js +0 -1568
- package/dist/qualitative-7X3ECW7Q.js +0 -43
- package/dist/radar2-V3FYBFAG.js +0 -326
- package/dist/radarFacility2-O6GQLBBN.js +0 -334
- package/dist/regression-CLG6NYVF.js +0 -56
- package/dist/regression.inputs-RLOBIRJH.js +0 -48
- package/dist/regression.inputs.term-ZKIP6KDO.js +0 -48
- package/dist/regression.inputs.values.table-2VD4AO5T.js +0 -45
- package/dist/regression.integration.spec-JEIMN7MS.js +0 -784
- package/dist/regression.results-FT6VSWGR.js +0 -40
- package/dist/regression.spec-V4S52JQM.js +0 -708
- package/dist/report-UPQFSI4D.js +0 -222
- package/dist/sampleScatter.spec-QSRF3STG.js +0 -202
- package/dist/sampleView-JIGZ7GTP.js +0 -48
- package/dist/samplelst-VJMYHVXI.js +0 -111
- package/dist/samplematrix-LO4QB37V.js +0 -2198
- package/dist/sc-4VZBGFZP.js +0 -86
- package/dist/scatter-LQECXZLB.js +0 -851
- package/dist/selectGenomeWithTklst-IJTCLRIN.js +0 -134
- package/dist/singleCellCellType-FJ53DRXD.js +0 -38
- package/dist/singleCellCellType.unit.spec-VOE4KY6L.js +0 -160
- package/dist/singleCellGeneExpression-RZE5UVL4.js +0 -38
- package/dist/singleCellGeneExpression.unit.spec-2DASF7PD.js +0 -153
- package/dist/singleCellPlot-Q5UNIW3M.js +0 -54
- package/dist/singlecell-N7F5KVIB.js +0 -1572
- package/dist/singlecell-TX5AQ4WM.js +0 -86
- package/dist/snp-S4O7SVDD.js +0 -38
- package/dist/snp.unit.spec-WSQMZSTE.js +0 -176
- package/dist/snplocus-Y2R5C4ZP.js +0 -208
- package/dist/spliceevent.a53ss.diagram-FGRQR73W.js +0 -151
- package/dist/spliceevent.exonskip.diagram-TVH44RNL.js +0 -277
- package/dist/spliceevent.exonskip.diagram-TVH44RNL.js.map +0 -7
- package/dist/spliceevent.noeventdiagram-G2CMYYE7.js +0 -460
- package/dist/ssGSEA-BH53XGEZ.js +0 -38
- package/dist/ssGSEA.unit.spec-BYIVB7FZ.js +0 -88
- package/dist/summarizeCnvGeneexp-IZNOX4E7.js +0 -163
- package/dist/summarizeGeneexpSurvival-DJZ2R24E.js +0 -114
- package/dist/summarizeMutationCnv-CO2TVWOI.js +0 -164
- package/dist/summarizeMutationDiagnosis-EUZXCSZP.js +0 -40
- package/dist/summarizeMutationSurvival-CXFT3HWL.js +0 -99
- package/dist/summary-JHZCDE35.js +0 -49
- package/dist/summary.integration.spec-WBEYSDCA.js +0 -414
- package/dist/summaryInput-JVH3R54R.js +0 -235
- package/dist/sunburst-CTJTXHSA.js +0 -284
- package/dist/survival-DLLVUG2P.js +0 -46
- package/dist/survival-XFVYNI6S.js +0 -58
- package/dist/survival.integration.spec-KVXHHAA3.js +0 -915
- package/dist/svgraph-ACEBMDIX.js +0 -1387
- package/dist/svmr-IQEDSZ2C.js +0 -3842
- package/dist/table-2IF6UGHR.js +0 -200
- package/dist/termCollection-JOLQJYJ3.js +0 -38
- package/dist/termCollection-PSXFFR32.js +0 -179
- package/dist/termCollection.unit.spec-4SOZP4FY.js +0 -208
- package/dist/tk-AAIHEQO6.js +0 -46
- package/dist/tk-IRXFL5NV.js +0 -997
- package/dist/tk-IRXFL5NV.js.map +0 -7
- package/dist/tp.ui-6STLQEXX.js +0 -1459
- package/dist/tvs.dt-FSA7KPSQ.js +0 -39
- package/dist/tvs.dtcnv.categorical-FSPGH7DP.js +0 -40
- package/dist/tvs.dtcnv.continuous-T4ZMSDB4.js +0 -72
- package/dist/tvs.dtfusion-UL3YENUM.js +0 -40
- package/dist/tvs.dtitd-XJOSZUWG.js +0 -40
- package/dist/tvs.dtsnvindel-5TPUT5RJ.js +0 -40
- package/dist/tvs.dtsv-OTNHXYOJ.js +0 -40
- package/dist/tvs.numeric-KYAU5OV3.js +0 -21
- package/dist/tvs.samplelst-FQKTAQZF.js +0 -104
- package/dist/tvs.termCollection-ZAPCUMUW.js +0 -159
- package/dist/violin-HEFFKPL5.js +0 -46
- package/dist/violin.integration.spec-774N4G5A.js +0 -1425
- package/dist/violin.interactivity-XNYJSK53.js +0 -38
- package/dist/violin.renderer-R74VSGRC.js +0 -40
- package/dist/vocabulary-OHMC6NWL.js +0 -41
- /package/dist/{2dmaf-HV22W5N3.js.map → 2dmaf-R3PFZNRN.js.map} +0 -0
- /package/dist/{AIProjectAdmin-7QGTPN3B.js.map → AIProjectAdmin-DM3KG6SR.js.map} +0 -0
- /package/dist/{AppHeader-NOKET4YE.js.map → AppHeader-6DZQ6YZX.js.map} +0 -0
- /package/dist/{BoxPlot-SPG66F4C.js.map → BoxPlot-76NINVX4.js.map} +0 -0
- /package/dist/{CorrelationVolcano-3LEMTFXP.js.map → CorrelationVolcano-U5UMJNH5.js.map} +0 -0
- /package/dist/{DE-WCCADMXA.js.map → DE-AXNYWIQK.js.map} +0 -0
- /package/dist/{DEinput-IZNPYPKH.js.map → DEinput-JH6YY6LS.js.map} +0 -0
- /package/dist/{DifferentialAnalysis-SDZXIUXP.js.map → DifferentialAnalysis-25P4CGIY.js.map} +0 -0
- /package/dist/{Disco.UI-RVUOPT6Y.js.map → Disco.UI-C7CZINUQ.js.map} +0 -0
- /package/dist/{DmrPlot-R2N534FS.js.map → DmrPlot-WROR4ENM.js.map} +0 -0
- /package/dist/{GSEA-3TB3PYEV.js.map → GSEA-Y5R2THIJ.js.map} +0 -0
- /package/dist/{GeneExpInput-VWCPHOVO.js.map → GeneExpInput-JDU6EI7K.js.map} +0 -0
- /package/dist/{HicApp-F2MY3NXP.js.map → HicApp-UNIJLH4B.js.map} +0 -0
- /package/dist/{NumBinaryEditor-AL2NWII2.js.map → NumBinaryEditor-WMN2GGO4.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-NFRJHFNX.js.map → NumBinaryEditor.unit.spec-TAMXV6SE.js.map} +0 -0
- /package/dist/{NumContEditor-CTFJVIHU.js.map → NumContEditor-XYIOJY4E.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-FXGGCMTD.js.map → NumContEditor.unit.spec-WDZ75BHO.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-JFIJ2X6E.js.map → NumCustomBinEditor-5SY3C4TY.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-ZKIZXS53.js.map → NumCustomBinEditor.unit.spec-XHTAIXR3.js.map} +0 -0
- /package/dist/{NumDiscreteEditor-E7SPHF55.js.map → NumDiscreteEditor-NRDRX4FD.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-QKKRZJMU.js.map → NumDiscreteEditor.unit.spec-2CJW7OAT.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-JSLTZIAQ.js.map → NumRegularBinEditor-DUDVTNDC.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-W73BA6L4.js.map → NumRegularBinEditor.unit.spec-H3GNQHMN.js.map} +0 -0
- /package/dist/{NumSplineEditor-ZEXYGKKF.js.map → NumSplineEditor-7Q4AC7KH.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-EHKI4CY7.js.map → NumSplineEditor.unit.spec-YRZK5PH5.js.map} +0 -0
- /package/dist/{NumericDensity-ZXM6TB33.js.map → NumericDensity-NTNWUESG.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-PUFRE5XA.js.map → NumericDensity.unit.spec-5I5U6T6P.js.map} +0 -0
- /package/dist/{NumericHandler-73TUDM3R.js.map → NumericHandler-MEW2KMPX.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-EITBD47U.js.map → NumericHandler.unit.spec-JFX4BPRG.js.map} +0 -0
- /package/dist/{ProteomeInput-QICOUSRW.js.map → ProteomeInput-K2ZHR2U6.js.map} +0 -0
- /package/dist/{RunChart2-4JYV2Z7B.js.map → RunChart2-BEBDU7RC.js.map} +0 -0
- /package/dist/{SC-77HA6SBW.js.map → SC-XCBFJVUJ.js.map} +0 -0
- /package/dist/{Volcano-3546I4MG.js.map → Volcano-4Y4TP3UX.js.map} +0 -0
- /package/dist/{WSIViewer-DQAXX7QJ.js.map → WSIViewer-ZLQU62PD.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-AGOLPLK3.js.map → WsiSamplesPlot-JMBSITOM.js.map} +0 -0
- /package/dist/{adSandbox-ZE5QOTN5.js.map → adSandbox-664IRCRL.js.map} +0 -0
- /package/dist/{animatedBubbleChart-ILMDNAVK.js.map → animatedBubbleChart-TX7NW34K.js.map} +0 -0
- /package/dist/{app-JBFRJ5OO.js.map → app-63WJ3BMP.js.map} +0 -0
- /package/dist/{app-YVNRAZWU.js.map → app-77FIZHCG.js.map} +0 -0
- /package/dist/{bam-A2PVAF3J.js.map → bam-IETNVAYD.js.map} +0 -0
- /package/dist/{barchart-2XQ7F6LT.js.map → barchart-YUVXJNH4.js.map} +0 -0
- /package/dist/{barchart.data-6XLK7D63.js.map → barchart.data-P4EIQXGE.js.map} +0 -0
- /package/dist/{barchart.events-DKJDKSPN.js.map → barchart.events-JPVCLTIG.js.map} +0 -0
- /package/dist/{barchart.integration.spec-UTTCQJRL.js.map → barchart.integration.spec-ZH7DEQI2.js.map} +0 -0
- /package/dist/{barchart2-2FRVUVJG.js.map → barchart2-XO2FG76J.js.map} +0 -0
- /package/dist/{bars.renderer-57KSYAAT.js.map → bars.renderer-AUIWUJDH.js.map} +0 -0
- /package/dist/{block-3KOPYQ25.js.map → block-NBTCOT3H.js.map} +0 -0
- /package/dist/{block.init-3KLLFGGV.js.map → block.init-X7Y2EEVR.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-XU3MBIOX.js.map → block.mds.expressionrank-BIAOZIZ3.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-VQTBL7T4.js.map → block.mds.geneboxplot-CNICDVLK.js.map} +0 -0
- /package/dist/{block.mds.junction-IYWWRIJD.js.map → block.mds.junction-PQXCTSUI.js.map} +0 -0
- /package/dist/{block.mds.svcnv-BMY5DCAM.js.map → block.mds.svcnv-32KMVTCT.js.map} +0 -0
- /package/dist/{block.svg-AT4GYQHX.js.map → block.svg-LRTOYQK2.js.map} +0 -0
- /package/dist/{block.tk.aicheck-RANOFGDZ.js.map → block.tk.aicheck-HDV7ZIUD.js.map} +0 -0
- /package/dist/{block.tk.ase-CBWJA3RN.js.map → block.tk.ase-JIDWKMYI.js.map} +0 -0
- /package/dist/{block.tk.bam-D7JBRNFQ.js.map → block.tk.bam-5X3OS5HB.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-IEHNIGVI.js.map → block.tk.bedgraphdot-T7JX7YQL.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-3SAXUJU4.js.map → block.tk.bigwig.ui-OSAYEBAE.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-R5EHQFGM.js.map → block.tk.hicstraw-DEY3VQFK.js.map} +0 -0
- /package/dist/{block.tk.junction-JFCEXZZC.js.map → block.tk.junction-7UAFEZSJ.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-4V7MV6TD.js.map → block.tk.junction.textmatrixui-27LHS33U.js.map} +0 -0
- /package/dist/{block.tk.ld-LP4DIHAJ.js.map → block.tk.ld-DF2PI7OO.js.map} +0 -0
- /package/dist/{block.tk.menu-FTVZU2HA.js.map → block.tk.menu-L2D5KBIV.js.map} +0 -0
- /package/dist/{block.tk.pgv-CRAMVKU4.js.map → block.tk.pgv-QO56SKBV.js.map} +0 -0
- /package/dist/{brainImaging-DXLK5XZ6.js.map → brainImaging-NIPQWFWO.js.map} +0 -0
- /package/dist/{brainRegions-AMSXQT3T.js.map → brainRegions-ZNZ2WHSU.js.map} +0 -0
- /package/dist/{bubbleHeatmap-SXBARILL.js.map → bubbleHeatmap-ERWNEKZB.js.map} +0 -0
- /package/dist/{chunk-2OJ577BB.js.map → chunk-2GYWFQML.js.map} +0 -0
- /package/dist/{chunk-QZLP27O6.js.map → chunk-2HYJ4GDH.js.map} +0 -0
- /package/dist/{chunk-MYZJUT2H.js.map → chunk-2MG6XE6R.js.map} +0 -0
- /package/dist/{chunk-DI5ULDWN.js.map → chunk-33K5PA52.js.map} +0 -0
- /package/dist/{chunk-433DTQ6C.js.map → chunk-37XDBPOP.js.map} +0 -0
- /package/dist/{chunk-WYSEBR5S.js.map → chunk-3EWB3246.js.map} +0 -0
- /package/dist/{chunk-KOLVLBMI.js.map → chunk-3RSKOPIY.js.map} +0 -0
- /package/dist/{chunk-CUXOQIUA.js.map → chunk-4DPVT4NE.js.map} +0 -0
- /package/dist/{chunk-47EYZQA7.js.map → chunk-4IH7DORZ.js.map} +0 -0
- /package/dist/{chunk-QAVZUWY3.js.map → chunk-4QNBFIIR.js.map} +0 -0
- /package/dist/{chunk-BSOB3BVG.js.map → chunk-4STKL6SR.js.map} +0 -0
- /package/dist/{chunk-P3NKHTNT.js.map → chunk-4TZIVSL5.js.map} +0 -0
- /package/dist/{chunk-LQJMCE7G.js.map → chunk-5ABGFJSP.js.map} +0 -0
- /package/dist/{chunk-DD6KDZVR.js.map → chunk-5AZNP47R.js.map} +0 -0
- /package/dist/{chunk-NOCLG6IN.js.map → chunk-5RL2OHXX.js.map} +0 -0
- /package/dist/{chunk-WQEGWR63.js.map → chunk-6BB43SIB.js.map} +0 -0
- /package/dist/{chunk-2AHDWWQO.js.map → chunk-7OHRR2IE.js.map} +0 -0
- /package/dist/{chunk-NZCX4A7X.js.map → chunk-ASATD4T7.js.map} +0 -0
- /package/dist/{chunk-K7QY24X2.js.map → chunk-AZ47Q7BX.js.map} +0 -0
- /package/dist/{chunk-JF47NF5G.js.map → chunk-B5B3LZB3.js.map} +0 -0
- /package/dist/{chunk-JD2ECQ3Z.js.map → chunk-BHGISFCA.js.map} +0 -0
- /package/dist/{chunk-NVRLD4TF.js.map → chunk-BMBOZ64T.js.map} +0 -0
- /package/dist/{chunk-D5ZYSW45.js.map → chunk-BOZJHPJP.js.map} +0 -0
- /package/dist/{chunk-4YDERN37.js.map → chunk-CDD7LYJM.js.map} +0 -0
- /package/dist/{chunk-4M22UIJQ.js.map → chunk-CTQ3IUCA.js.map} +0 -0
- /package/dist/{chunk-PJSOYF5U.js.map → chunk-D7TID3HR.js.map} +0 -0
- /package/dist/{chunk-LFGIMCUD.js.map → chunk-E55LLYRX.js.map} +0 -0
- /package/dist/{chunk-XB6F5OUB.js.map → chunk-ESGXULRH.js.map} +0 -0
- /package/dist/{chunk-SJWAMUL5.js.map → chunk-EZ4LZ6ZT.js.map} +0 -0
- /package/dist/{chunk-QXPJLSAD.js.map → chunk-F3SJTVP5.js.map} +0 -0
- /package/dist/{chunk-JOA4KJTM.js.map → chunk-F5IXNJO7.js.map} +0 -0
- /package/dist/{chunk-KQ6EF3FG.js.map → chunk-FJYECRHW.js.map} +0 -0
- /package/dist/{chunk-MLYSQG3C.js.map → chunk-FPNRUQOU.js.map} +0 -0
- /package/dist/{chunk-Q555GFBW.js.map → chunk-G5S4R77D.js.map} +0 -0
- /package/dist/{chunk-DA6RR5IR.js.map → chunk-G764NXQN.js.map} +0 -0
- /package/dist/{chunk-QOAUM6UV.js.map → chunk-GAPI4MML.js.map} +0 -0
- /package/dist/{chunk-PK5HXJ3S.js.map → chunk-HLUZOZXJ.js.map} +0 -0
- /package/dist/{chunk-UN3O2MNB.js.map → chunk-HOKIK2FR.js.map} +0 -0
- /package/dist/{chunk-LBWKMNVU.js.map → chunk-KLGL6XZD.js.map} +0 -0
- /package/dist/{chunk-YGKVY5IU.js.map → chunk-L7IRWUKT.js.map} +0 -0
- /package/dist/{chunk-23AEAG37.js.map → chunk-LFCYMSVA.js.map} +0 -0
- /package/dist/{chunk-46CPDZSW.js.map → chunk-LX6G7HJJ.js.map} +0 -0
- /package/dist/{chunk-UYEJ5DEZ.js.map → chunk-M2G5R4WB.js.map} +0 -0
- /package/dist/{chunk-AC3RAKUI.js.map → chunk-M4TTGGT4.js.map} +0 -0
- /package/dist/{chunk-5ERYRSVV.js.map → chunk-M6EF3WVV.js.map} +0 -0
- /package/dist/{chunk-MNIBZTQE.js.map → chunk-M6KHT3MM.js.map} +0 -0
- /package/dist/{chunk-6W6UMGAV.js.map → chunk-MCZFHWIR.js.map} +0 -0
- /package/dist/{chunk-7YWPWCHD.js.map → chunk-MFQACKYU.js.map} +0 -0
- /package/dist/{chunk-LKB3DITY.js.map → chunk-MVGAGTM3.js.map} +0 -0
- /package/dist/{chunk-V2ET64EJ.js.map → chunk-NELOT3NJ.js.map} +0 -0
- /package/dist/{chunk-6Z4XHMZV.js.map → chunk-NRKMXULC.js.map} +0 -0
- /package/dist/{chunk-BKPDYW5T.js.map → chunk-NYRZNRG5.js.map} +0 -0
- /package/dist/{chunk-XVYSEXFV.js.map → chunk-ONPKE6DC.js.map} +0 -0
- /package/dist/{chunk-JT7HC65V.js.map → chunk-OXVLWQ6M.js.map} +0 -0
- /package/dist/{chunk-SENZWOCC.js.map → chunk-PFRWS4CR.js.map} +0 -0
- /package/dist/{chunk-UVWUP6N7.js.map → chunk-PJKQUXEN.js.map} +0 -0
- /package/dist/{chunk-U3CMLIGB.js.map → chunk-Q2L44HK3.js.map} +0 -0
- /package/dist/{chunk-7P4DUYAQ.js.map → chunk-QNHT74XC.js.map} +0 -0
- /package/dist/{chunk-DXM5IMGV.js.map → chunk-RKO6BL5N.js.map} +0 -0
- /package/dist/{chunk-CJJA6RVM.js.map → chunk-T25QNZHB.js.map} +0 -0
- /package/dist/{chunk-I62GOCNI.js.map → chunk-U7TBYVIQ.js.map} +0 -0
- /package/dist/{chunk-UF6ZP6UR.js.map → chunk-UGRQXBL4.js.map} +0 -0
- /package/dist/{chunk-PFOCEOVT.js.map → chunk-USFSHSCJ.js.map} +0 -0
- /package/dist/{chunk-IBYOP2FV.js.map → chunk-VJ6UFVGC.js.map} +0 -0
- /package/dist/{chunk-HCNF7EFT.js.map → chunk-W3WPPOXH.js.map} +0 -0
- /package/dist/{chunk-ZPXSPJV2.js.map → chunk-WFCSOTBO.js.map} +0 -0
- /package/dist/{chunk-QOEPKNVD.js.map → chunk-WHP4AKDM.js.map} +0 -0
- /package/dist/{chunk-OVHCUTQM.js.map → chunk-WZ2L57MB.js.map} +0 -0
- /package/dist/{chunk-7Z6E3NA5.js.map → chunk-XPY6AWXO.js.map} +0 -0
- /package/dist/{chunk-K6AW4GFM.js.map → chunk-Y4UAKFWC.js.map} +0 -0
- /package/dist/{chunk-SFIX7XVT.js.map → chunk-YQBS2ZCK.js.map} +0 -0
- /package/dist/{chunk-GFETCJ7S.js.map → chunk-ZTHM2TKP.js.map} +0 -0
- /package/dist/{condition-YCPNILTV.js.map → condition-2PASYSUC.js.map} +0 -0
- /package/dist/{controls-RW5MWSLN.js.map → controls-5IMJ6K5L.js.map} +0 -0
- /package/dist/{controls.config-MP3CSYR4.js.map → controls.config-P5PG2DHW.js.map} +0 -0
- /package/dist/{correlation-7AQRU4YR.js.map → correlation-U3EDLNHR.js.map} +0 -0
- /package/dist/{cuminc-WYLKIOXR.js.map → cuminc-2HUFEROK.js.map} +0 -0
- /package/dist/{cuminc.integration.spec-MSAWDLD7.js.map → cuminc.integration.spec-WFWAPTDA.js.map} +0 -0
- /package/dist/{customdata.inputui-YU4IQJOV.js.map → customdata.inputui-ZHWNEPFH.js.map} +0 -0
- /package/dist/{dataDownload-72DIPZ45.js.map → dataDownload-VBSJBKMP.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-HRLMWQN7.js.map → dataDownload.integration.spec-LUFSETOP.js.map} +0 -0
- /package/dist/{databrowser.ui-3PE25HK4.js.map → databrowser.ui-6H2KMSTJ.js.map} +0 -0
- /package/dist/{dictionary-Y3ICL4AE.js.map → dictionary-V37LXFIP.js.map} +0 -0
- /package/dist/{dnaMethylation-SVGDW64U.js.map → dnaMethylation-OIZMHMLK.js.map} +0 -0
- /package/dist/{dnaMethylation.integration.spec-B7GLAFZI.js.map → dnaMethylation.integration.spec-CWPTJ74H.js.map} +0 -0
- /package/dist/{dofetch-42KOXNPF.js.map → dofetch-IWPZQB5N.js.map} +0 -0
- /package/dist/{e2pca-CLFGEFJH.js.map → e2pca-7SLIAGYW.js.map} +0 -0
- /package/dist/{ep-PUHV2DMO.js.map → ep-7L6KF6K4.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-N7YDJAOZ.js.map → expclust.gdc.spec-JT452Q3G.js.map} +0 -0
- /package/dist/{facet-JFFJJCNT.js.map → facet-CXOUU5AS.js.map} +0 -0
- /package/dist/{forms2-XZAWW3RN.js.map → forms2-VPNCLQOY.js.map} +0 -0
- /package/dist/{gb-SQJ5PWOH.js.map → gb-P4VRXRED.js.map} +0 -0
- /package/dist/{geneExpClustering-EG2BLMQX.js.map → geneExpClustering-FQTCKRJJ.js.map} +0 -0
- /package/dist/{geneExpression-QRK3LNMV.js.map → geneExpression-BHO5326K.js.map} +0 -0
- /package/dist/{geneExpression-J42BGP3B.js.map → geneExpression-ZMERB64E.js.map} +0 -0
- /package/dist/{geneExpression.unit.spec-X7HVIFZA.js.map → geneExpression.unit.spec-CNVHZWNG.js.map} +0 -0
- /package/dist/{geneORA-SVBPO66K.js.map → geneORA-FXVUCXGX.js.map} +0 -0
- /package/dist/{geneRanking-HNMMLZIX.js.map → geneRanking-SFK4UBKQ.js.map} +0 -0
- /package/dist/{geneVariant-RVQKNVQO.js.map → geneVariant-IYEHB4H7.js.map} +0 -0
- /package/dist/{geneVariant-SO5FEJUZ.js.map → geneVariant-LIRRLUFR.js.map} +0 -0
- /package/dist/{geneVariant.integration.spec-DOMX4GMP.js.map → geneVariant.integration.spec-Y2NPNTYX.js.map} +0 -0
- /package/dist/{genefusion.ui-QS7AG46F.js.map → genefusion.ui-L3HIJM3N.js.map} +0 -0
- /package/dist/{geneset-JKOX3VIW.js.map → geneset-A6VUFX63.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-IRSTT2OX.js.map → genomeBrowser.spec-CB4HHHBN.js.map} +0 -0
- /package/dist/{grin2-VZLCISPM.js.map → grin2-FKBIMH5N.js.map} +0 -0
- /package/dist/{hierCluster-6AW23EB5.js.map → hierCluster-QFPRMHVA.js.map} +0 -0
- /package/dist/{hierCluster-REXTCODR.js.map → hierCluster-YWC3XYPV.js.map} +0 -0
- /package/dist/{hierCluster.config-3Z3R66XH.js.map → hierCluster.config-F7YYZNM3.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-XE47Q64Z.js.map → hierCluster.integration.spec-AF4L3YT6.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-2YJYYKVK.js.map → hierCluster.interactivity-RPY74PK6.js.map} +0 -0
- /package/dist/{hierCluster.renderers-LE7W2AL6.js.map → hierCluster.renderers-LOKHZ3V2.js.map} +0 -0
- /package/dist/{imagePlot-WMZJJ5CJ.js.map → imagePlot-BBEXA754.js.map} +0 -0
- /package/dist/{importPlot-P35EGIJJ.js.map → importPlot-7QGANZGK.js.map} +0 -0
- /package/dist/{isoformExpression-3TFPEXB4.js.map → isoformExpression-4SLLCVFD.js.map} +0 -0
- /package/dist/{isoformExpression.unit.spec-SPQFK3EA.js.map → isoformExpression.unit.spec-GEL4JJ64.js.map} +0 -0
- /package/dist/{launch.adhoc-ZQSJBLMJ.js.map → launch.adhoc-LWLBQJS5.js.map} +0 -0
- /package/dist/{leftlabel.sample-SJRQ6LJ2.js.map → leftlabel.sample-RTEZOIH2.js.map} +0 -0
- /package/dist/{legacyDataset-TNIIJABK.js.map → legacyDataset-VLD7ZYWI.js.map} +0 -0
- /package/dist/{lollipop-RXM6UBZ7.js.map → lollipop-XKQK5QZU.js.map} +0 -0
- /package/dist/{maf-NWXJWBNF.js.map → maf-AZQPPWDO.js.map} +0 -0
- /package/dist/{maftimeline-D7UENAP5.js.map → maftimeline-7MSVYKQU.js.map} +0 -0
- /package/dist/{matrix-77LNADX2.js.map → matrix-BGLWC25D.js.map} +0 -0
- /package/dist/{matrix-YDOLKY6G.js.map → matrix-IQR5SRMK.js.map} +0 -0
- /package/dist/{matrix.cells-VEC5LEWV.js.map → matrix.cells-5C57NWOY.js.map} +0 -0
- /package/dist/{matrix.config-GTAAAUGQ.js.map → matrix.config-2DQXAN2E.js.map} +0 -0
- /package/dist/{matrix.data-T4GEX6ZH.js.map → matrix.data-ADCGF5H6.js.map} +0 -0
- /package/dist/{matrix.groups-7NWHHP5Q.js.map → matrix.groups-V4ITQ5F7.js.map} +0 -0
- /package/dist/{matrix.integration.spec-5GBTFRZA.js.map → matrix.integration.spec-IBNOO2WP.js.map} +0 -0
- /package/dist/{matrix.interactivity-ONT6WCRU.js.map → matrix.interactivity-JNELJFOV.js.map} +0 -0
- /package/dist/{matrix.layout-LDXHGOHF.js.map → matrix.layout-WBVIV6GR.js.map} +0 -0
- /package/dist/{matrix.legend-5MDW65HV.js.map → matrix.legend-YHOWPK77.js.map} +0 -0
- /package/dist/{matrix.renderers-OEPLQG3C.js.map → matrix.renderers-5BGVRR3M.js.map} +0 -0
- /package/dist/{matrix.serieses-4RX7TUQ7.js.map → matrix.serieses-2GZJOASZ.js.map} +0 -0
- /package/dist/{matrix.sort-UKMMECBZ.js.map → matrix.sort-WKIWPJKP.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-VWOXPVRE.js.map → matrix.sort.unit.spec-L2E4D4AS.js.map} +0 -0
- /package/dist/{matrix.sorterUi-H64DDQIL.js.map → matrix.sorterUi-TEJWWJ64.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-DH4434FK.js.map → matrix.sorterUi.unit.spec-SHP7C4P7.js.map} +0 -0
- /package/dist/{mavb-ARUWOZES.js.map → mavb-4MXNYUEO.js.map} +0 -0
- /package/dist/{mds.fimo-ZEAE5BC3.js.map → mds.fimo-WHIJIBOI.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-C5EBKBVF.js.map → mds.samplescatterplot-BRJ6NG2D.js.map} +0 -0
- /package/dist/{mds.survivalplot-RS7Z3J3Q.js.map → mds.survivalplot-OPCMB5PB.js.map} +0 -0
- /package/dist/{numericDictTermCluster-CSQOV4TM.js.map → numericDictTermCluster-7MIFOP2K.js.map} +0 -0
- /package/dist/{oncomatrix-5UVM3KUA.js.map → oncomatrix-BGG6BEUI.js.map} +0 -0
- /package/dist/{oncomatrix.spec-CU3EZCMO.js.map → oncomatrix.spec-LYQ4L4F3.js.map} +0 -0
- /package/dist/{plot.2dvaf-JD27DSDS.js.map → plot.2dvaf-6WVCP2ZI.js.map} +0 -0
- /package/dist/{plot.app-NMPMG3S2.js.map → plot.app-MLBP6WFP.js.map} +0 -0
- /package/dist/{plot.barplot-T4LPKFXW.js.map → plot.barplot-JEPRZSCU.js.map} +0 -0
- /package/dist/{plot.boxplot-22ETOHNI.js.map → plot.boxplot-GNFW42VM.js.map} +0 -0
- /package/dist/{plot.brainImaging-Q7S7KSHW.js.map → plot.brainImaging-5ACNSD45.js.map} +0 -0
- /package/dist/{plot.disco-NIPBER5N.js.map → plot.disco-Q2V2KKIH.js.map} +0 -0
- /package/dist/{plot.dzi-DAX7GUTF.js.map → plot.dzi-KVT6S7K7.js.map} +0 -0
- /package/dist/{plot.ssgq-7J6S35RW.js.map → plot.ssgq-4N3KFJQ2.js.map} +0 -0
- /package/dist/{plot.vaf2cov-7EWFTD72.js.map → plot.vaf2cov-ITRG5U43.js.map} +0 -0
- /package/dist/{plot.wsi-E45KZGKD.js.map → plot.wsi-26YZNU4V.js.map} +0 -0
- /package/dist/{polar2-LPT2XMD2.js.map → polar2-J7GVUK4X.js.map} +0 -0
- /package/dist/{profileForms-EYN2KLSY.js.map → profileForms-VXV2JLXU.js.map} +0 -0
- /package/dist/{profilePlot-I7VQM3CH.js.map → profilePlot-ZZYZK4SY.js.map} +0 -0
- /package/dist/{proteinView-JP5TF3ZK.js.map → proteinView-7KN532D3.js.map} +0 -0
- /package/dist/{qualitative-7X3ECW7Q.js.map → qualitative-MLRVLIAU.js.map} +0 -0
- /package/dist/{radar2-V3FYBFAG.js.map → radar2-WM2ZBOH3.js.map} +0 -0
- /package/dist/{radarFacility2-O6GQLBBN.js.map → radarFacility2-3SBR2JJ3.js.map} +0 -0
- /package/dist/{regression-CLG6NYVF.js.map → regression-WMRPQJW2.js.map} +0 -0
- /package/dist/{regression.inputs-RLOBIRJH.js.map → regression.inputs-VWZKSYNY.js.map} +0 -0
- /package/dist/{regression.inputs.term-ZKIP6KDO.js.map → regression.inputs.term-OWE6GWHM.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-2VD4AO5T.js.map → regression.inputs.values.table-4INNZQI2.js.map} +0 -0
- /package/dist/{regression.integration.spec-JEIMN7MS.js.map → regression.integration.spec-XKQ2JOOT.js.map} +0 -0
- /package/dist/{regression.results-FT6VSWGR.js.map → regression.results-VZBYMBYC.js.map} +0 -0
- /package/dist/{regression.spec-V4S52JQM.js.map → regression.spec-DU3UTDCJ.js.map} +0 -0
- /package/dist/{sampleView-JIGZ7GTP.js.map → render-N5FOF247.js.map} +0 -0
- /package/dist/{report-UPQFSI4D.js.map → report-DW3OHB67.js.map} +0 -0
- /package/dist/{sampleScatter.spec-QSRF3STG.js.map → sampleScatter.spec-REFSK2V4.js.map} +0 -0
- /package/dist/{singleCellCellType-FJ53DRXD.js.map → sampleView-ICOT2R6O.js.map} +0 -0
- /package/dist/{samplelst-VJMYHVXI.js.map → samplelst-TJEVASYG.js.map} +0 -0
- /package/dist/{samplematrix-LO4QB37V.js.map → samplematrix-6DAWCXQ3.js.map} +0 -0
- /package/dist/{sc-4VZBGFZP.js.map → sc-53LNOB7N.js.map} +0 -0
- /package/dist/{scatter-LQECXZLB.js.map → scatter-DKYSS4DL.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-IJTCLRIN.js.map → selectGenomeWithTklst-WTX66TV3.js.map} +0 -0
- /package/dist/{singleCellGeneExpression-RZE5UVL4.js.map → singleCellCellType-D2CN2BHQ.js.map} +0 -0
- /package/dist/{singleCellCellType.unit.spec-VOE4KY6L.js.map → singleCellCellType.unit.spec-LADUCI4R.js.map} +0 -0
- /package/dist/{singleCellPlot-Q5UNIW3M.js.map → singleCellGeneExpression-YR2ZT34W.js.map} +0 -0
- /package/dist/{singleCellGeneExpression.unit.spec-2DASF7PD.js.map → singleCellGeneExpression.unit.spec-BM63M432.js.map} +0 -0
- /package/dist/{snp-S4O7SVDD.js.map → singleCellPlot-3ICIOILE.js.map} +0 -0
- /package/dist/{singlecell-TX5AQ4WM.js.map → singlecell-6ZUFA3BQ.js.map} +0 -0
- /package/dist/{singlecell-N7F5KVIB.js.map → singlecell-KX7W4U57.js.map} +0 -0
- /package/dist/{ssGSEA-BH53XGEZ.js.map → snp-VIURB7L3.js.map} +0 -0
- /package/dist/{snp.unit.spec-WSQMZSTE.js.map → snp.unit.spec-ACZNZUNS.js.map} +0 -0
- /package/dist/{snplocus-Y2R5C4ZP.js.map → snplocus-3LW4ZUZR.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-FGRQR73W.js.map → spliceevent.a53ss.diagram-AKTZGWNM.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-G2CMYYE7.js.map → spliceevent.noeventdiagram-YTXWWNTJ.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-EUZXCSZP.js.map → ssGSEA-THW4WFMI.js.map} +0 -0
- /package/dist/{ssGSEA.unit.spec-BYIVB7FZ.js.map → ssGSEA.unit.spec-HTRGQI2K.js.map} +0 -0
- /package/dist/{summarizeCnvGeneexp-IZNOX4E7.js.map → summarizeCnvGeneexp-RFYC3H2Z.js.map} +0 -0
- /package/dist/{summarizeGeneexpSurvival-DJZ2R24E.js.map → summarizeGeneexpSurvival-DQBZUTQ6.js.map} +0 -0
- /package/dist/{summarizeMutationCnv-CO2TVWOI.js.map → summarizeMutationCnv-7AYEMHAI.js.map} +0 -0
- /package/dist/{summary-JHZCDE35.js.map → summarizeMutationDiagnosis-AKFJDSAF.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-CXFT3HWL.js.map → summarizeMutationSurvival-QJHZRQBZ.js.map} +0 -0
- /package/dist/{survival-DLLVUG2P.js.map → summary-A5P7AYK4.js.map} +0 -0
- /package/dist/{summary.integration.spec-WBEYSDCA.js.map → summary.integration.spec-HQISXGNL.js.map} +0 -0
- /package/dist/{summaryInput-JVH3R54R.js.map → summaryInput-HP675QOQ.js.map} +0 -0
- /package/dist/{sunburst-CTJTXHSA.js.map → sunburst-65LSYRXX.js.map} +0 -0
- /package/dist/{termCollection-JOLQJYJ3.js.map → survival-QNEI6YVK.js.map} +0 -0
- /package/dist/{survival-XFVYNI6S.js.map → survival-UI74VXSM.js.map} +0 -0
- /package/dist/{survival.integration.spec-KVXHHAA3.js.map → survival.integration.spec-X5N3JQXS.js.map} +0 -0
- /package/dist/{svgraph-ACEBMDIX.js.map → svgraph-PSX2NER3.js.map} +0 -0
- /package/dist/{svmr-IQEDSZ2C.js.map → svmr-QDQ33EFX.js.map} +0 -0
- /package/dist/{table-2IF6UGHR.js.map → table-LWAI27UO.js.map} +0 -0
- /package/dist/{termCollection-PSXFFR32.js.map → termCollection-3JHR74FG.js.map} +0 -0
- /package/dist/{tk-AAIHEQO6.js.map → termCollection-CDF5LYUG.js.map} +0 -0
- /package/dist/{termCollection.unit.spec-4SOZP4FY.js.map → termCollection.unit.spec-HOJKYWHF.js.map} +0 -0
- /package/dist/{tvs.dt-FSA7KPSQ.js.map → tk-OEQFO73V.js.map} +0 -0
- /package/dist/{tp.ui-6STLQEXX.js.map → tp.ui-SHNERDGC.js.map} +0 -0
- /package/dist/{tvs.numeric-KYAU5OV3.js.map → tvs.dt-CZDC4TSR.js.map} +0 -0
- /package/dist/{tvs.dtcnv.categorical-FSPGH7DP.js.map → tvs.dtcnv.categorical-OPBDHZGB.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-T4ZMSDB4.js.map → tvs.dtcnv.continuous-AR6P4EP3.js.map} +0 -0
- /package/dist/{tvs.dtfusion-UL3YENUM.js.map → tvs.dtfusion-2YQ7N6FQ.js.map} +0 -0
- /package/dist/{tvs.dtitd-XJOSZUWG.js.map → tvs.dtitd-ATCHW735.js.map} +0 -0
- /package/dist/{tvs.dtsnvindel-5TPUT5RJ.js.map → tvs.dtsnvindel-WHHWAATJ.js.map} +0 -0
- /package/dist/{tvs.dtsv-OTNHXYOJ.js.map → tvs.dtsv-3UMCW65O.js.map} +0 -0
- /package/dist/{violin-HEFFKPL5.js.map → tvs.numeric-TOEPASWN.js.map} +0 -0
- /package/dist/{tvs.samplelst-FQKTAQZF.js.map → tvs.samplelst-M7XKXRTZ.js.map} +0 -0
- /package/dist/{tvs.termCollection-ZAPCUMUW.js.map → tvs.termCollection-WT4WZMYR.js.map} +0 -0
- /package/dist/{violin.interactivity-XNYJSK53.js.map → violin-2YGXTBDS.js.map} +0 -0
- /package/dist/{violin.integration.spec-774N4G5A.js.map → violin.integration.spec-YWNHVAGS.js.map} +0 -0
- /package/dist/{violin.renderer-R74VSGRC.js.map → violin.interactivity-J6BE2UQL.js.map} +0 -0
- /package/dist/{vocabulary-OHMC6NWL.js.map → violin.renderer-3GRUWP2U.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../mass/sessionBtn.js", "../mass/about.ts", "../mass/search.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\t/** when true, render the world map from termdbConfig.geomap directly on the landing tab */\n\tshowGeomap?: boolean\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.initGeomap(appState)\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\t// render the world map (from termdbConfig.geomap) directly on the landing tab when the dataset opts in.\n\t// the renderer (and its ~170KB world.json basemap) is dynamically imported so it never loads for\n\t// datasets that don't enable the map.\n\tinitGeomap = async appState => {\n\t\tif (!this.aboutOverrides?.showGeomap) return\n\t\tconst geomap = appState.termdbConfig?.geomap\n\t\tif (!geomap?.sites?.length) return\n\t\tconst holder = this.subheader.append('div').attr('data-testid', 'sjpp-about-geomap').style('padding', '10px')\n\t\tconst { renderGeomap } = await import('#plots/geomap/render.ts')\n\t\trenderGeomap(holder, geomap)\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", "// Mass omnisearch (search-as-you-type): resolves a typed prompt to dictionary variables, genes, and a\n// genomic coordinate via one termdb/chat request, and renders the results as rows whose action buttons\n// launch plots. Extracted from chat.ts; the functions here operate on the MassAiChatBot instance (`self`),\n// which owns the DOM (self.dom), app api (self.app), and options (self.opts).\nimport { keyupEnter } from '#src/client'\nimport { dofetch3 } from '#common/dofetch'\nimport type { 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\n// Coordinate search is allowed regardless of prompt length, but other prompts are gated by these bounds.\nconst MIN_PROMPT_LENGTH_FOR_OMNISEARCH = 3\nconst MAX_PROMPT_LENGTH_FOR_OMNISEARCH = 20\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\n/** Genomic coordinate shape-filter + \"chr\" prefix toggling (moved from server chat/search.ts). Matches a\n * typed \"chr:start-stop\" range (e.g. \"chr7:100000-200000\" or, with the prefix omitted, \"7:100000-200000\")\n * and returns the candidate coordinate strings to try server-side \u2014 both the typed spelling and the\n * \"chr\"-toggled one, since only the server's genome object knows which chromosome name it uses. Returns\n * null when the prompt is not a coordinate range (a bare chr, a gene name, or partial typing), so no\n * coordinate is sent to the server. Chromosome existence and position validity are left to the server's\n * string2pos(); this is only a cheap shape/spelling step. */\nfunction parseCoordCandidates(prompt: string): string[] | null {\n\tconst m = /^\\s*(\\w+)\\s*:\\s*([\\d,]+)\\s*-\\s*([\\d,]+)\\s*$/.exec(prompt)\n\tif (!m) return null\n\tconst [, chrToken, start, stop] = m\n\tconst chrCandidates = /^chr/i.test(chrToken)\n\t\t? [chrToken, chrToken.replace(/^chr/i, '')] // \"chr7\" -> try \"chr7\", then \"7\"\n\t\t: [chrToken, 'chr' + chrToken] // \"7\" -> try \"7\", then \"chr7\"\n\treturn chrCandidates.map(chr => `${chr}:${start}-${stop}`)\n}\n\n/** keyup handler for the omnisearch input: run the omnisearch (doSearch) as the user types. A typed\n * genomic coordinate range triggers a search regardless of prompt length (no length cutoff \u2014 coordinate\n * strings can be long); any other prompt is gated by the length bounds. Otherwise clear the results popup.\n * Wired in chat.ts's initDom. `self` is the MassAiChatBot instance. */\nexport async function handleOmnisearchKeyup(self: any, event: KeyboardEvent) {\n\tif (keyupEnter(event)) return\n\tconst prompt = (event.target as HTMLInputElement).value.trim()\n\tif (!prompt) {\n\t\tself.dom.noMatchShown = false\n\t\tself.clear({ hide: true })\n\t\treturn\n\t}\n\t// A coordinate (regex passes) is searched regardless of length; only a coordinate triggers the\n\t// server's coordinate resolution (its candidates are passed to doSearch). Other prompts stay gated.\n\tconst coordCandidates = parseCoordCandidates(prompt)\n\tif (\n\t\tcoordCandidates ||\n\t\t(MIN_PROMPT_LENGTH_FOR_OMNISEARCH <= prompt.length && prompt.length <= MAX_PROMPT_LENGTH_FOR_OMNISEARCH)\n\t) {\n\t\ttry {\n\t\t\tawait doSearch(self, prompt, coordCandidates) // Search as user types\n\t\t} catch (e: any) {\n\t\t\tif (e.stack) console.log(e.stack)\n\t\t\tsayerror(self.dom.resultDiv, 'Error: ' + (e.message || e))\n\t\t}\n\t} else {\n\t\tself.dom.noMatchShown = false\n\t\tself.clear({ hide: true })\n\t}\n}\n\n/** Server call for the mass omnisearch: POST the prompt (and, when the client's coordinate regex passed,\n * the \"chr:start-stop\" candidate spellings) to termdb/chat and return the OmnisearchResult. The server does\n * the gene/dictionary lookup and resolves the typed coordinate via string2pos (the genome object stays\n * server-side). Separated from the rendering (renderOmnisearchResults) and takes plain params (no DOM /\n * component instance) so it can be integration-tested against a running server on its own. */\nexport async function fetchOmnisearch(opts: {\n\tgenome: string\n\tdslabel: string\n\tprompt: string\n\tcohortStr?: string\n\tusecase?: any\n\ttreeFilter?: any\n\tcoordCandidates?: string[] | null\n}): Promise<OmnisearchResult> {\n\tconst data: OmnisearchResult = await dofetch3('termdb/chat', {\n\t\tbody: {\n\t\t\tgenome: opts.genome,\n\t\t\tdslabel: opts.dslabel,\n\t\t\tomnisearch: true,\n\t\t\tprompt: opts.prompt,\n\t\t\tcohortStr: opts.cohortStr,\n\t\t\tusecase: opts.usecase,\n\t\t\ttreeFilter: opts.treeFilter,\n\t\t\tcoordCandidates: opts.coordCandidates || undefined\n\t\t}\n\t})\n\tif (data.error) throw data.error\n\treturn data\n}\n\n/** Build the result rows from an OmnisearchResult and render them into the results popup (or show the\n * \"No match\" message): one row per dictionary term, per gene (with the action buttons available for that\n * gene), and the typed genomic coordinate. Separated from the server call (fetchOmnisearch) so each can be\n * tested on its own. */\nfunction renderOmnisearchResults(self: any, data: OmnisearchResult) {\n\t// Genomic coordinate typed as the prompt (e.g. \"chr7:100000-200000\" or \"7:100000-200000\") is\n\t// treated as another searchable data type alongside dictionary terms and genes: the server returns\n\t// a parsed coordinate when the prompt is a valid range and the dataset supports the genomic view.\n\t// A coordinate result is added below whose \"Genome Browser\" button opens the genomic view.\n\tconst coord = data.coord || null\n\tconst lst: any[] = Array.isArray(data.dictionaryTerms) ? data.dictionaryTerms : []\n\t// Each gene match carries its own available data types (a gene may have e.g. SNV/indel while\n\t// another does not), so action buttons are decided per gene rather than dataset-wide.\n\tconst genes: { gene: string; dataTypes: any; coord?: any }[] = Array.isArray(data.genes) ? data.genes : []\n\n\t// Build one entry per gene, skipping any whose name already appears among the dictionary results.\n\t// Each gene renders as a single row whose buttons are the actions available for that gene, and\n\t// its own per-variant-type options (SNV/indel, CNV, SV/fusion) are attached for showTerm to use.\n\tconst dictNames = new Set(lst.map((t: any) => t.name?.toUpperCase()))\n\tconst geneMap = new Map<string, any>()\n\tfor (const g of genes) {\n\t\tconst gene = g?.gene\n\t\tif (!gene || dictNames.has(gene.toUpperCase())) continue\n\t\tconst dt = g.dataTypes || {}\n\t\t// per-gene variant sub-type buttons; svfusion maps to two dts (SV and fusion), tried in order\n\t\tconst geneVariantTypes: any[] = []\n\t\tif (dt.snvindel) geneVariantTypes.push({ label: 'SNV/indel', testid: 'snvindel', dtCandidates: [dtsnvindel] })\n\t\tif (dt.cnv) geneVariantTypes.push({ label: 'CNV', testid: 'cnv', dtCandidates: [dtcnv] })\n\t\tif (dt.svfusion)\n\t\t\tgeneVariantTypes.push({ label: 'SV/fusion', testid: 'svfusion', dtCandidates: [dtsv, dtfusionrna] })\n\t\tconst entry: any = { name: gene, gene, isGene: true }\n\t\tif (dt.geneExpression) entry.isGeneExpression = true\n\t\tif (geneVariantTypes.length) {\n\t\t\tentry.isGeneVariant = true\n\t\t\tentry.geneVariantTypes = geneVariantTypes\n\t\t}\n\t\t// genome browser is offered whenever any genomic-alteration data type (snvindel/cnv/svfusion)\n\t\t// is available for this gene; the browser's mds3 track renders all available types together\n\t\tif (dt.genomeBrowser) {\n\t\t\tentry.isGenomeBrowser = true\n\t\t\t// server-resolved default coordinate, used to seed the genome browser's genomic view\n\t\t\tentry.coord = g.coord\n\t\t}\n\t\tif (dt.dnaMethylation) {\n\t\t\tentry.isMethylation = true\n\t\t\t// server-resolved default coordinate, used to seed the genome browser region picker\n\t\t\tentry.coord = g.coord\n\t\t}\n\t\t// only list a gene if it has at least one available data type / action\n\t\tif (entry.isGeneExpression || entry.isGeneVariant || entry.isGenomeBrowser || entry.isMethylation) {\n\t\t\tgeneMap.set(gene.toUpperCase(), entry)\n\t\t}\n\t}\n\tfor (const entry of geneMap.values()) lst.push(entry)\n\t// Add the genomic coordinate as its own result entry (like a gene entry), rendered by showTerm\n\tif (coord) {\n\t\tlst.push({\n\t\t\tisCoord: true,\n\t\t\tname: `${coord.chr}:${coord.start.toLocaleString()}-${coord.stop.toLocaleString()}`,\n\t\t\tcoord\n\t\t})\n\t}\n\tif (!lst.length) {\n\t\t// Show the \"No match...\" message one time at the first miss\n\t\tif (!self.dom.noMatchShown) {\n\t\t\tself.dom.noMatchShown = true\n\t\t\tself.noResult()\n\t\t}\n\t} else {\n\t\tself.dom.noMatchShown = false\n\t\tself.showTerms({ lst })\n\t}\n}\n\n// Search method, adapted from MassSearch.doSearch. Thin orchestration: fetch results from the server\n// (fetchOmnisearch), then render them (renderOmnisearchResults). `coordCandidates` (when the prompt matched\n// the coordinate regex on the client) are the \"chr:start-stop\" spellings the server resolves via\n// string2pos; pass null/undefined for a normal gene/dictionary search.\nexport async function doSearch(self: any, prompt: string, coordCandidates?: string[] | null) {\n\tif (!prompt) {\n\t\tself.clear({ hide: true })\n\t\treturn\n\t}\n\tconst data = await fetchOmnisearch({\n\t\tgenome: self.app.vocabApi.vocab.genome,\n\t\tdslabel: self.app.vocabApi.vocab.dslabel,\n\t\tprompt,\n\t\tcohortStr: self.getState(self.app.getState()).cohortStr,\n\t\tusecase: self.opts.usecase,\n\t\ttreeFilter: self.app.vocabApi.state?.treeFilter,\n\t\tcoordCandidates\n\t})\n\trenderOmnisearchResults(self, data)\n}\n\n// Minimal renderers ported from MassSearch. Assigns the omnisearch renderers (noResult, showTerms,\n// launchPlot, the plot-launchers, showTerm, clear) onto the component instance `self`.\nexport function setSearchRenderers(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// Open the genome browser as a separate mass chart (chartType 'genomeBrowser') with full plot state,\n\t// via launchPlot -> plot_create. The plot's mds3 track renders the dataset's SNV/indel, CNV and\n\t// SV/fusion data (whichever it has).\n\t// - 'protein': gene/protein view, seeded by gene symbol (blockIsProteinMode=true)\n\t// - 'genomic': genomic view over a region (chr/start/stop) from opts.coord (blockIsProteinMode=false)\n\t// \u2014 used both for a gene's locus and for a coordinate typed into the omnisearch box\n\t// blockIsProteinMode is set explicitly so each view opens as named regardless of the dataset's\n\t// default gbRestrictMode. launchPlot() dispatches plot_create and closes the search popup.\n\tself.launchGenomeBrowserView = async (\n\t\tmode: 'protein' | 'genomic',\n\t\topts: { gene?: string; coord?: { chr: string; start: number; stop: number } }\n\t) => {\n\t\tif (mode == 'protein') {\n\t\t\tif (!opts.gene) throw new Error('gene symbol required for protein view')\n\t\t\tawait self.launchPlot({\n\t\t\t\tchartType: 'genomeBrowser',\n\t\t\t\tgeneSearchResult: { geneSymbol: opts.gene },\n\t\t\t\tblockIsProteinMode: true\n\t\t\t})\n\t\t\treturn\n\t\t}\n\t\tif (!opts.coord) throw new Error('coordinate required for genomic view')\n\t\tawait self.launchPlot({\n\t\t\tchartType: 'genomeBrowser',\n\t\t\tgeneSearchResult: { chr: opts.coord.chr, start: opts.coord.start, stop: opts.coord.stop },\n\t\t\tblockIsProteinMode: false\n\t\t})\n\t}\n\n\t// \"Genome Browser\": open a chooser popup offering protein vs genomic view of the gene; picking a view\n\t// opens the genome browser as a separate mass chart with plot state (see launchGenomeBrowserView).\n\t// The two buttons and the protein/genomic decision mirror the genome browser's\n\t// GeneSearchRenderer.renderGeneSearch (which shows the same \"Protein view of <gene>\" / \"Genomic view\n\t// of <gene>\" buttons on an interactive gene search); here they live in the omnisearch popup since the\n\t// omnisearch already resolved the gene. A mode-restricted dataset (gbRestrictMode) skips the chooser\n\t// and opens its one allowed view directly.\n\tself.launchGenomeBrowser = async (gene: string, coord?: { chr: string; start: number; stop: number }) => {\n\t\tconst gbRestrictMode = self.app.getState().termdbConfig?.queries?.gbRestrictMode\n\t\tif (gbRestrictMode == 'protein') {\n\t\t\tawait self.launchGenomeBrowserView('protein', { gene })\n\t\t\treturn\n\t\t}\n\t\tif (gbRestrictMode == 'genomic') {\n\t\t\t// genomic view requires the gene's locus (server-resolved in search.ts). Error out rather than\n\t\t\t// falling back to a dataset default region, which would open a locus unrelated to the gene.\n\t\t\tif (!coord) throw new Error(`Unable to resolve genomic coordinates for gene \"${gene}\".`)\n\t\t\tawait self.launchGenomeBrowserView('genomic', { coord })\n\t\t\treturn\n\t\t}\n\n\t\t// both views allowed: show the two view buttons; clicking opens the browser chart in that view\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\t\tconst btndiv = holder.append('div')\n\t\tconst addViewBtn = (label: string, testid: string, mode: 'protein' | 'genomic') => {\n\t\t\tbtndiv\n\t\t\t\t.append('button')\n\t\t\t\t.attr('data-testid', testid)\n\t\t\t\t.style('margin-right', '10px')\n\t\t\t\t.text(label)\n\t\t\t\t.on(\n\t\t\t\t\t'click',\n\t\t\t\t\t() =>\n\t\t\t\t\t\tvoid self\n\t\t\t\t\t\t\t.launchGenomeBrowserView(mode, { gene, coord })\n\t\t\t\t\t\t\t.catch(e => sayerror(self.dom.resultDiv, 'Error: ' + (e?.message || e)))\n\t\t\t\t)\n\t\t}\n\t\taddViewBtn(`Protein view of ${gene}`, `sjpp-mass-chat-gb-protein-${gene}`, 'protein')\n\t\t// genomic view needs a coordinate; omit the button if the gene could not be resolved to one\n\t\tif (coord) addViewBtn(`Genomic view of ${gene}`, `sjpp-mass-chat-gb-genomic-${gene}`, 'genomic')\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 new Error(`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 (this: any, term: any) {\n\t\tconst tr = select(this)\n\n\t\tif (term.isCoord) {\n\t\t\t// Genomic coordinate row: region label + a \"Genome Browser\" button opening the genomic view as\n\t\t\t// a separate mass chart with plot state. No protein view \u2014 a bare region is not tied to one gene.\n\t\t\ttr.append('td').text(term.name).style('padding', '5px 10px')\n\t\t\ttr.append('td')\n\t\t\t\t.append('span')\n\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t.attr('data-testid', 'sjpp-mass-chat-coord-genomebrowser')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('margin', '0px 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('Genome Browser')\n\t\t\t\t.on(\n\t\t\t\t\t'click',\n\t\t\t\t\t() =>\n\t\t\t\t\t\tvoid self\n\t\t\t\t\t\t\t.launchGenomeBrowserView('genomic', { coord: term.coord })\n\t\t\t\t\t\t\t.catch(e => sayerror(self.dom.resultDiv, 'Error: ' + (e?.message || e)))\n\t\t\t\t)\n\t\t\treturn\n\t\t}\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.isGenomeBrowser) {\n\t\t\t\t// open a chooser window offering \"Protein view\"/\"Genomic view\" of the gene; picking a view\n\t\t\t\t// opens the genome browser as a separate mass chart with plot state, whose mds3 track shows\n\t\t\t\t// the gene's SNV/indel, CNV and SV/fusion data (whichever the dataset has). See launchGenomeBrowser.\n\t\t\t\taddBtn('Genome Browser', `sjpp-mass-chat-gene-genomebrowser-${term.gene}`, async () => {\n\t\t\t\t\tawait self.launchGenomeBrowser(term.gene, term.coord)\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, 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 } from '#types'\n// Mass omnisearch (search-as-you-type) lives in ./search.ts; this file owns the AI-chat path and the\n// shared DOM scaffold (the input + result popup + chat bubbles).\nimport { setSearchRenderers, handleOmnisearchKeyup } from './search.ts'\n\nconst MIN_PROMPT_LENGTH_FOR_CHAT = 5 // Set a minimum prompt length for chat submission\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\tsetSearchRenderers(this) // sets omnisearch renderers (showTerms, noResult, clear, showTerm, launchers) on this\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 in search.ts), so\n\t\t// nothing is fetched eagerly at component init.\n\t\tthis.initDom()\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.attr('data-testid', 'sjpp-mass-omnisearch-input')\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// omnisearch (search-as-you-type) \u2014 handler lives in ./search.ts\n\t\t\t.on('keyup.search', (event: KeyboardEvent) => handleOmnisearchKeyup(this, event))\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 and dispatches plot_create.\n\t// Each option completes the plot in one of two ways:\n\t// - opt.config: a config patch merged into the plot (the incomplete field is dropped). Used when the\n\t// choice sets other fields, e.g. the genome browser view sets blockIsProteinMode: true|false.\n\t// - otherwise: the incomplete field is set to { id: opt.id }, e.g. survival term selection -> term:{id}.\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 and dispatch the plot. An option may carry a `config` patch\n\t\t\t\t\t// (merged into the plot, dropping the incomplete field \u2014 e.g. the genome browser view sets\n\t\t\t\t\t// blockIsProteinMode); otherwise complete the incomplete field with the chosen option's id.\n\t\t\t\t\tconst config = JSON.parse(JSON.stringify(plot))\n\t\t\t\t\tif (opt.config) {\n\t\t\t\t\t\tdelete config[fieldKey]\n\t\t\t\t\t\tObject.assign(config, opt.config)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconfig[fieldKey] = { id: opt.id }\n\t\t\t\t\t}\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", "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", "event", "prompt", "appState", "event"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
colorinframe
|
|
3
|
+
} from "./chunk-5VOPABBA.js";
|
|
4
|
+
import {
|
|
5
|
+
IN_frame,
|
|
6
|
+
OUT_frame
|
|
7
|
+
} from "./chunk-2X6W4E3W.js";
|
|
8
|
+
|
|
9
|
+
// src/spliceevent.phrase.js
|
|
10
|
+
function spliceevent_phrase_default(evt) {
|
|
11
|
+
const htmls = [];
|
|
12
|
+
if (evt.isaltexon || evt.isskipexon) {
|
|
13
|
+
const exonstart = Math.min(...evt.skippedexon);
|
|
14
|
+
const exonstop = Math.max(...evt.skippedexon);
|
|
15
|
+
htmls.push(
|
|
16
|
+
'<div style="display:inline-block">' + (exonstart == exonstop ? "exon " + (exonstart + 1) : "exons " + (exonstart + 1) + "-" + (exonstop + 1)) + " " + (evt.isaltexon ? "alternative usage" : "skipping") + "</div>"
|
|
17
|
+
);
|
|
18
|
+
if (evt.isaltexon) {
|
|
19
|
+
htmls.push(
|
|
20
|
+
"<div class=sja_tinylogo_body>" + evt.gmB.isoform + ", " + evt.gmA.isoform + "</div><div class=sja_tinylogo_head>ISOFORMS</div>"
|
|
21
|
+
);
|
|
22
|
+
} else {
|
|
23
|
+
htmls.push("<div class=sja_tinylogo_body>" + evt.gm.isoform + "</div><div class=sja_tinylogo_head>ISOFORM</div>");
|
|
24
|
+
}
|
|
25
|
+
if (evt.junctionB.data) {
|
|
26
|
+
htmls.push(
|
|
27
|
+
"<div class=sja_tinylogo_body>" + evt.junctionB.data.length + "</div><div class=sja_tinylogo_head>SAMPLE" + (evt.junctionB.data.length > 1 ? "S" : "") + "</div>"
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
htmls.push("<div class=sja_tinylogo_body>" + evt.percentage + " %</div><div class=sja_tinylogo_head>PERCENT</div>");
|
|
31
|
+
if (evt.framenocheck) {
|
|
32
|
+
if (evt.utr3) {
|
|
33
|
+
htmls.push(`<div class=sja_tinylogo_body style="background-color:#ededed">3' UTR</div>`);
|
|
34
|
+
} else if (evt.utr5) {
|
|
35
|
+
htmls.push(`<div class=sja_tinylogo_body style="background-color:#ededed">5' UTR</div>`);
|
|
36
|
+
}
|
|
37
|
+
} else if (evt.frame == IN_frame) {
|
|
38
|
+
htmls.push(
|
|
39
|
+
'<div class=sja_tinylogo_body style="background-color:' + colorinframe + ';color:white">IN</div><div class=sja_tinylogo_head>FRAME</div>'
|
|
40
|
+
);
|
|
41
|
+
} else if (evt.frame == OUT_frame) {
|
|
42
|
+
htmls.push("<div class=sja_tinylogo_body>OUT</div><div class=sja_tinylogo_head>FRAME</div>");
|
|
43
|
+
} else {
|
|
44
|
+
htmls.push("<div class=sja_tinylogo_body>?</div><div class=sja_tinylogo_head>FRAME</div>");
|
|
45
|
+
}
|
|
46
|
+
} else {
|
|
47
|
+
return "unknown event type!!";
|
|
48
|
+
}
|
|
49
|
+
return htmls.join(" ");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
spliceevent_phrase_default
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=chunk-E55LLYRX.js.map
|