@sjcrh/proteinpaint-client 2.191.2 → 2.191.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{2dmaf-V4WJ2LEK.js → 2dmaf-AGYGXGUT.js} +3 -3
- package/dist/{AIProjectAdmin-JMN5O6YU.js → AIProjectAdmin-AYPMZLCD.js} +206 -79
- package/dist/AIProjectAdmin-AYPMZLCD.js.map +7 -0
- package/dist/{AppHeader-Y4SEKCEF.js → AppHeader-6HL2GGMM.js} +10 -10
- package/dist/{BoxPlot-ZXQZGCR3.js → BoxPlot-KZHJGR2R.js} +3 -3
- package/dist/{CorrelationVolcano-R5IWD6WA.js → CorrelationVolcano-ICDRXFUR.js} +3 -3
- package/dist/{DE-ZV6O7B6Y.js → DE-XYOBENUC.js} +10 -10
- package/dist/{DEinput-FTOALZKN.js → DEinput-Q2TQ2KMY.js} +3 -3
- package/dist/{DifferentialAnalysis-NLCA766A.js → DifferentialAnalysis-PLQOZDV6.js} +4 -4
- package/dist/{Disco-Y5Z4A7GN.js → Disco-SFLOG7EW.js} +5 -5
- package/dist/{Disco.UI-GSWZYIUT.js → Disco.UI-VF6NGHZ3.js} +6 -6
- package/dist/{DmrPlot-FEFUCIGT.js → DmrPlot-ZUIQQBCR.js} +4 -4
- package/dist/{GB-AOXF2JJB.js → GB-ZQ3RF3TI.js} +5 -5
- package/dist/{GeneExpInput-CXYRKQU7.js → GeneExpInput-7QIBZOKQ.js} +4 -4
- package/dist/{HicApp-GLNNZ4H5.js → HicApp-RSZ2KEDE.js} +4 -4
- package/dist/{NumBinaryEditor-6ZAL6CCP.js → NumBinaryEditor-2W3DAPDZ.js} +3 -3
- package/dist/{NumBinaryEditor.unit.spec-3VTJLILH.js → NumBinaryEditor.unit.spec-M5B6TNSD.js} +4 -4
- package/dist/{NumContEditor-3LOAR676.js → NumContEditor-4K5FPKEN.js} +3 -3
- package/dist/{NumContEditor.unit.spec-WIMYCOVO.js → NumContEditor.unit.spec-6G7AP2M2.js} +4 -4
- package/dist/{NumCustomBinEditor-XIOAYWOD.js → NumCustomBinEditor-DHLGY3FL.js} +4 -4
- package/dist/{NumCustomBinEditor.unit.spec-N5OV6MKR.js → NumCustomBinEditor.unit.spec-FHQ6P4JL.js} +4 -4
- package/dist/{NumDiscreteEditor-AT6FKYGI.js → NumDiscreteEditor-XUCSTPY2.js} +5 -5
- package/dist/{NumDiscreteEditor.unit.spec-BDR5GZ46.js → NumDiscreteEditor.unit.spec-HMD6VS2S.js} +4 -4
- package/dist/{NumRegularBinEditor-Z4NBS4VZ.js → NumRegularBinEditor-3WT42ZBR.js} +4 -4
- package/dist/{NumRegularBinEditor.unit.spec-BRWYNQ55.js → NumRegularBinEditor.unit.spec-5F346HKA.js} +4 -4
- package/dist/{NumSplineEditor-B45BAWQ2.js → NumSplineEditor-TOAQ5FPH.js} +3 -3
- package/dist/{NumSplineEditor.unit.spec-5RDBCZ4N.js → NumSplineEditor.unit.spec-27JDSKBE.js} +4 -4
- package/dist/{NumericDensity-L7HIVV7D.js → NumericDensity-IP6XHMQF.js} +3 -3
- package/dist/{NumericDensity.unit.spec-PL3XDJCV.js → NumericDensity.unit.spec-KWT77AFV.js} +3 -3
- package/dist/{NumericHandler-KJYZOCCG.js → NumericHandler-7ZWXP7GY.js} +4 -4
- package/dist/{NumericHandler.unit.spec-VC7NPLJW.js → NumericHandler.unit.spec-MK2GEPAY.js} +4 -4
- package/dist/{ProteomeInput-A3GRPIAH.js → ProteomeInput-IIJOKE46.js} +6 -6
- package/dist/{RunChart2-MSNU3ZNT.js → RunChart2-PLRREVZ4.js} +3 -3
- package/dist/{SC-FNKG2FK5.js → SC-DC3QBYYA.js} +3 -3
- package/dist/{Volcano-IRJMPHXJ.js → Volcano-VD2E62U3.js} +3 -3
- package/dist/{WSIViewer-KITT7I67.js → WSIViewer-5RE356CT.js} +39 -6
- package/dist/WSIViewer-5RE356CT.js.map +7 -0
- package/dist/{WsiSamplesPlot-G3YZ6SIE.js → WsiSamplesPlot-QPIERW3J.js} +4 -4
- package/dist/{adSandbox-GIQTJ4VA.js → adSandbox-4AVU36ND.js} +4 -4
- package/dist/{app-MGNEMS2K.js → app-E36H76Q7.js} +10 -10
- package/dist/{app-UQTHPQFD.js → app-I4D3X3MD.js} +3 -3
- package/dist/app.js +8 -8
- package/dist/{bam-5PROQBRT.js → bam-IW44TWN3.js} +5 -5
- package/dist/{barchart-BQYJ73Z4.js → barchart-RXVVLBQY.js} +3 -3
- package/dist/{barchart.events-W2CIDD4B.js → barchart.events-2WWFMZYY.js} +3 -3
- package/dist/{barchart.integration.spec-JF2IHFQE.js → barchart.integration.spec-CYR3XRHD.js} +10 -10
- package/dist/{barchart2-V6W4UAFH.js → barchart2-DRRTYOAK.js} +4 -4
- package/dist/{block-5V2FCT7Q.js → block-WGOA676W.js} +23 -23
- package/dist/{block.init-43IUNDNB.js → block.init-PEK25OMQ.js} +4 -4
- package/dist/{block.mds.expressionrank-LI6MZPBE.js → block.mds.expressionrank-N2L46BXD.js} +5 -5
- package/dist/{block.mds.geneboxplot-673AIJMJ.js → block.mds.geneboxplot-RWQUY72S.js} +4 -4
- package/dist/{block.mds.junction-UWNVNV3X.js → block.mds.junction-PTXDDQGZ.js} +9 -9
- package/dist/{block.mds.svcnv-Z5VFCUUE.js → block.mds.svcnv-ZQXSEZWZ.js} +16 -16
- package/dist/{block.svg-MGK4GWLL.js → block.svg-OVZSRPOX.js} +3 -3
- package/dist/{block.tk.aicheck-OFNDGG7Q.js → block.tk.aicheck-X5QHG6LL.js} +3 -3
- package/dist/{block.tk.ase-IDZQY7MW.js → block.tk.ase-BPB2PABO.js} +5 -5
- package/dist/{block.tk.bam-K7A2Q5NI.js → block.tk.bam-E7JVNL5W.js} +3 -3
- package/dist/{block.tk.bedgraphdot-PPTKCCPK.js → block.tk.bedgraphdot-U76UV2L6.js} +3 -3
- package/dist/{block.tk.bigwig.ui-PI6EAU43.js → block.tk.bigwig.ui-HH3ETZSD.js} +3 -3
- package/dist/{block.tk.hicstraw-EZ2GS2K4.js → block.tk.hicstraw-O5MGNX56.js} +3 -3
- package/dist/{block.tk.junction-4WSLQGSQ.js → block.tk.junction-TIAW3OKP.js} +6 -6
- package/dist/{block.tk.junction.textmatrixui-7EJUSVMB.js → block.tk.junction.textmatrixui-NSWBQ7VJ.js} +4 -4
- package/dist/{block.tk.ld-KLVO7M37.js → block.tk.ld-NQ2OIWL5.js} +5 -5
- package/dist/{block.tk.menu-KZSL7BAR.js → block.tk.menu-JY5CEFKV.js} +3 -3
- package/dist/{block.tk.pgv-NYWGB4VH.js → block.tk.pgv-NFUQC4QX.js} +5 -5
- package/dist/{brainImaging-MTIIMJHW.js → brainImaging-3OMQ4JBW.js} +3 -3
- package/dist/{chunk-RZY34QRF.js → chunk-26NIOETK.js} +3 -3
- package/dist/{chunk-O7NFSCEW.js → chunk-3FCUJ5L3.js} +2 -2
- package/dist/{chunk-2NQLAH3L.js → chunk-46NCFHG3.js} +4 -4
- package/dist/{chunk-5SXCIKYV.js → chunk-4732T6NY.js} +2 -2
- package/dist/{chunk-P4QGOUDH.js → chunk-4NCLILLO.js} +2 -2
- package/dist/{chunk-CKA52OEA.js → chunk-4RGJAFAC.js} +2 -2
- package/dist/{chunk-2TCCXOAV.js → chunk-4VMWYVLU.js} +2 -2
- package/dist/{chunk-6GZJCSA6.js → chunk-5YQ2VPEW.js} +4 -4
- package/dist/{chunk-Z3SC67OA.js → chunk-6ME3635L.js} +2 -2
- package/dist/{chunk-YNBT4N6T.js → chunk-6ML236VW.js} +37 -37
- package/dist/{chunk-QNMB7LYW.js → chunk-757JGDTF.js} +53 -57
- package/dist/chunk-757JGDTF.js.map +7 -0
- package/dist/{chunk-YWZCJMHS.js → chunk-7E73OOQ4.js} +2 -2
- package/dist/{chunk-UCLROZRF.js → chunk-AFZX3KM2.js} +2 -2
- package/dist/{chunk-F6N6JBZR.js → chunk-ALZ4PTHT.js} +2 -2
- package/dist/{chunk-L4TUTGTA.js → chunk-APO4BA2P.js} +82 -82
- package/dist/{chunk-3D5GZIGG.js → chunk-BF5R4XFD.js} +33 -33
- package/dist/{chunk-F5QIZOPL.js → chunk-BIBPNVX7.js} +2 -2
- package/dist/{chunk-MYWV64P5.js → chunk-DJ5D3TFP.js} +5 -5
- package/dist/{chunk-4B42QV34.js → chunk-E7ZIEO4Q.js} +2 -2
- package/dist/{chunk-SQWEREGE.js → chunk-ECYPHINS.js} +3 -3
- package/dist/{chunk-EIBNV236.js → chunk-FVRQYK2V.js} +6 -6
- package/dist/{chunk-ZLREFIZB.js → chunk-GWXA2YLS.js} +2 -2
- package/dist/{chunk-52RORO74.js → chunk-HD3N3MIQ.js} +5 -5
- package/dist/{chunk-GMT2GNQY.js → chunk-HK5ESK7S.js} +12 -4
- package/dist/chunk-HK5ESK7S.js.map +7 -0
- package/dist/{chunk-WET4LPLO.js → chunk-HOHQUGVI.js} +2 -2
- package/dist/{chunk-CKDC326M.js → chunk-IVIWWCEK.js} +2 -2
- package/dist/{chunk-42EBECOD.js → chunk-JDKWYNT6.js} +5 -2
- package/dist/chunk-JDKWYNT6.js.map +7 -0
- package/dist/{chunk-X63AAJGT.js → chunk-JZ67QSUN.js} +2 -2
- package/dist/{chunk-FXMHSVBS.js → chunk-KBTMTZ2D.js} +2 -2
- package/dist/{chunk-3TPAIXNL.js → chunk-KRWLIZ6J.js} +4 -4
- package/dist/{chunk-PGBKZ76Y.js → chunk-KW5ZXPIM.js} +2 -2
- package/dist/{chunk-LT5XPBIX.js → chunk-LLFZ4KNO.js} +2 -2
- package/dist/{chunk-67HSIHPP.js → chunk-LOZWCVAY.js} +6 -6
- package/dist/{chunk-YVCTEEVQ.js → chunk-MBZ3D6T6.js} +2 -2
- package/dist/{chunk-7JEKUSEL.js → chunk-MHOVJLLC.js} +3 -3
- package/dist/{chunk-SDACELDR.js → chunk-N4PSYVGO.js} +2 -2
- package/dist/{chunk-JJOLDYSQ.js → chunk-NCQK3W6J.js} +8 -8
- package/dist/{chunk-2Q6PBSPS.js → chunk-OHO2FGMM.js} +7 -7
- package/dist/{chunk-X5X5T3AJ.js → chunk-OHXWVZEI.js} +2 -2
- package/dist/{chunk-IL5QT2FI.js → chunk-PB3POI37.js} +4 -4
- package/dist/{chunk-NKTBR5SK.js → chunk-PGEEP4AH.js} +3 -3
- package/dist/{chunk-KSCJWPTJ.js → chunk-PHE6J6OL.js} +2 -2
- package/dist/{chunk-PQZ3A27I.js → chunk-TRZ35AY6.js} +2 -2
- package/dist/{chunk-647P2I4Q.js → chunk-TVIKEQUO.js} +2 -2
- package/dist/{chunk-PQNVPSQR.js → chunk-VF23ENKB.js} +2 -2
- package/dist/{chunk-BMO6KSVC.js → chunk-VGMVLQDT.js} +3 -3
- package/dist/{chunk-J6GLTYGJ.js → chunk-VUWWQCEK.js} +7 -7
- package/dist/{chunk-4FKWINMK.js → chunk-X3Q6I37T.js} +98 -98
- package/dist/{chunk-DC4KD6FJ.js → chunk-XEMSCL7A.js} +4 -4
- package/dist/{chunk-NVX26LFC.js → chunk-XLDH2NGH.js} +4 -4
- package/dist/{chunk-VIHUKORE.js → chunk-YH4CIFN3.js} +2 -2
- package/dist/{chunk-CYHUNQMS.js → chunk-YKCJPNBV.js} +9 -9
- package/dist/{chunk-ZX2ISBEF.js → chunk-Z3726F4F.js} +3 -3
- package/dist/{chunk-XRAFQKOF.js → chunk-ZSP7AKBN.js} +5 -5
- package/dist/{condition-P2XD32QM.js → condition-GNUPDC6J.js} +3 -3
- package/dist/{controls-FZUTJPKV.js → controls-W5CAUCUU.js} +3 -3
- package/dist/{controls.config-TEFY3NTE.js → controls.config-JQGWNZCZ.js} +3 -3
- package/dist/{correlation-HS2WJFXN.js → correlation-URI2YADE.js} +10 -10
- package/dist/{cuminc-42GBJHD3.js → cuminc-CMJRK7TH.js} +3 -3
- package/dist/{cuminc.integration.spec-BAY4JHVL.js → cuminc.integration.spec-BMEGXFL7.js} +10 -10
- package/dist/{customdata.inputui-IPM5K56K.js → customdata.inputui-YGBEBVS2.js} +3 -3
- package/dist/{dataDownload-D7VCYBDT.js → dataDownload-OTUQZMQ5.js} +3 -3
- package/dist/{dataDownload.integration.spec-SEBY2BIX.js → dataDownload.integration.spec-TF25ODEK.js} +10 -10
- package/dist/{databrowser.ui-5OC5MPZB.js → databrowser.ui-4BNTK45C.js} +10 -10
- package/dist/{dictionary-VVRWVLJX.js → dictionary-MBQY7WLO.js} +3 -3
- package/dist/{geneExpression-SKIU3NEP.js → dnaMethylation-TQ4Q22UM.js} +4 -4
- package/dist/{dnaMethylation.integration.spec-U2LLSDGE.js → dnaMethylation.integration.spec-7IK6AQK3.js} +4 -4
- package/dist/{e2pca-AR6EKEJA.js → e2pca-NZFBO7ZK.js} +3 -3
- package/dist/{ep-JS5UUJQX.js → ep-KBE3SNHO.js} +3 -3
- package/dist/{expclust.gdc.spec-73MGQ7RN.js → expclust.gdc.spec-JWNFEMC6.js} +10 -10
- package/dist/{facet-AR3QKHCY.js → facet-YSULPZW4.js} +3 -3
- package/dist/{forms2-UXEI7MUP.js → forms2-AEMEQPHL.js} +5 -5
- package/dist/{gb-RHDVYU2V.js → gb-JZIBBHO3.js} +10 -10
- package/dist/{geneExpClustering-L6KLCMPH.js → geneExpClustering-NYB4KT5A.js} +5 -5
- package/dist/{dnaMethylation-72IS3FRI.js → geneExpression-MLCFQIN7.js} +4 -4
- package/dist/{geneExpression.unit.spec-CWR6KDVK.js → geneExpression.unit.spec-JUUSSSX6.js} +4 -4
- package/dist/{geneORA-C3TALK5P.js → geneORA-WHLE3ZGH.js} +3 -3
- package/dist/{geneRanking-LLYLDPLV.js → geneRanking-3SKA2UCY.js} +3 -3
- package/dist/{geneVariant-PUSKBHPY.js → geneVariant-EV6HDSXA.js} +3 -3
- package/dist/{geneVariant-YFMU6PHM.js → geneVariant-Z77ISGU7.js} +3 -3
- package/dist/{geneVariant.integration.spec-EJ5V46OQ.js → geneVariant.integration.spec-SEZM6S35.js} +3 -3
- package/dist/{genefusion.ui-XUHSKQKW.js → genefusion.ui-3XZHAONN.js} +3 -3
- package/dist/{geneset-DEL5LXFZ.js → geneset-JHCB2JO3.js} +3 -3
- package/dist/{genomeBrowser.spec-W5TVHOUJ.js → genomeBrowser.spec-D3WNZ2N5.js} +10 -10
- package/dist/{grin2-FXAEGECD.js → grin2-32ZKO7NS.js} +3 -3
- package/dist/{grin2-U2FKULLC.js → grin2-4R3JJOLC.js} +3 -3
- package/dist/{gsea-CNL6SHH5.js → gsea-S7324GB6.js} +4 -4
- package/dist/{hierCluster-7V65PMIW.js → hierCluster-GX5PI6YL.js} +10 -10
- package/dist/{hierCluster-C44GHM4B.js → hierCluster-KQYYIGN5.js} +11 -11
- package/dist/{hierCluster.config-RU5JDPWM.js → hierCluster.config-IIURSVY2.js} +5 -5
- package/dist/{hierCluster.integration.spec-6YH5KE4H.js → hierCluster.integration.spec-FWBF4YBD.js} +12 -12
- package/dist/{hierCluster.interactivity-PK2L7BSW.js → hierCluster.interactivity-KPXSTWRR.js} +4 -4
- package/dist/{imagePlot-5SEDMPBP.js → imagePlot-7A2CIC66.js} +4 -4
- package/dist/importPlot-6YQK3SNT.js +8 -0
- package/dist/{isoformExpression-PPMISWKT.js → isoformExpression-AROVOFMP.js} +4 -4
- package/dist/{isoformExpression.unit.spec-ENHCCQRZ.js → isoformExpression.unit.spec-VSVVZ5XS.js} +4 -4
- package/dist/{launch.adhoc-XAG6H42J.js → launch.adhoc-IGP7JD3M.js} +6 -6
- package/dist/{leftlabel.sample-BSPCI6GR.js → leftlabel.sample-DXTZOSQU.js} +6 -6
- package/dist/{lollipop-IZJ7E3YO.js → lollipop-XWUXPA2R.js} +5 -5
- package/dist/{maf-54XWBQ73.js → maf-JWOTNV3J.js} +3 -3
- package/dist/{maftimeline-3AJKAFS6.js → maftimeline-E2UWXJXB.js} +3 -3
- package/dist/{matrix-AJPMHUXG.js → matrix-22WXRDYA.js} +8 -8
- package/dist/{matrix-ZMXNOESU.js → matrix-DJHK3OWP.js} +8 -8
- package/dist/{matrix.config-4WLSFMTY.js → matrix.config-MXJ4IDSU.js} +4 -4
- package/dist/{matrix.integration.spec-ENRPVB7R.js → matrix.integration.spec-XYRW7NR3.js} +10 -10
- package/dist/{matrix.interactivity-IMWERCZF.js → matrix.interactivity-SVGML6PN.js} +4 -4
- package/dist/{matrix.layout-5DDZWLNX.js → matrix.layout-RE3KGHVF.js} +4 -4
- package/dist/{matrix.renderers-VFQZG5JP.js → matrix.renderers-HFV3XFJV.js} +4 -4
- package/dist/{matrix.sort.unit.spec-ZA5DRNL6.js → matrix.sort.unit.spec-WI6V675V.js} +4 -4
- package/dist/{matrix.sorterUi.unit.spec-7TPOJ46U.js → matrix.sorterUi.unit.spec-BYZ2BMTN.js} +4 -4
- package/dist/{mavb-73BXZ7MO.js → mavb-3H4ZCENB.js} +4 -4
- package/dist/{mds.fimo-L7VVAOXQ.js → mds.fimo-26I6TEZC.js} +3 -3
- package/dist/{mds.samplescatterplot-6P75XEWB.js → mds.samplescatterplot-R6RTZNDF.js} +5 -5
- package/dist/{mds.survivalplot-GCVE7XGO.js → mds.survivalplot-BJBA2ZLI.js} +3 -3
- package/dist/{oncomatrix-BFWV2IC4.js → oncomatrix-WL7ZE5KG.js} +5 -5
- package/dist/{oncomatrix.spec-J6IAY3O6.js → oncomatrix.spec-VHERLEOD.js} +10 -10
- package/dist/{plot.2dvaf-ESJAB2F3.js → plot.2dvaf-ERAUL6M3.js} +3 -3
- package/dist/{plot.app-T7CQMBRV.js → plot.app-X6DXZDVY.js} +5 -5
- package/dist/{plot.barplot-HAWPMPPU.js → plot.barplot-2FBRVNLX.js} +3 -3
- package/dist/{plot.boxplot-4QUORFXY.js → plot.boxplot-JNO63FXZ.js} +3 -3
- package/dist/{plot.brainImaging-HG6I3GJW.js → plot.brainImaging-YBN5YH3H.js} +2 -2
- package/dist/{plot.disco-LPH7F6YW.js → plot.disco-BLNU4I6Q.js} +2 -2
- package/dist/{plot.dzi-DYAY4D4E.js → plot.dzi-FKWY6K5Q.js} +2 -2
- package/dist/{plot.ssgq-CF5VIGYJ.js → plot.ssgq-3GTTOOMK.js} +4 -4
- package/dist/{plot.vaf2cov-7HZCKNK6.js → plot.vaf2cov-UAI64HYN.js} +3 -3
- package/dist/{plot.wsi-MU6AXOWO.js → plot.wsi-QJ52IJXL.js} +2 -2
- package/dist/{polar2-G636L5TB.js → polar2-6S4IHKK4.js} +4 -4
- package/dist/{profileForms-TIT4JUEJ.js → profileForms-WXWHZ56N.js} +4 -4
- package/dist/{profilePlot-QFGRAZQA.js → profilePlot-K7ICCFQ3.js} +4 -4
- package/dist/{proteinView-RZ56F45C.js → proteinView-ALZTEKTC.js} +4 -4
- package/dist/{qualitative-YWP4YUPF.js → qualitative-QMPO7EY6.js} +3 -3
- package/dist/{radar2-TKSHL54E.js → radar2-LDAFJHSI.js} +4 -4
- package/dist/{radarFacility2-FHRFLBLF.js → radarFacility2-3TX3U243.js} +4 -4
- package/dist/{regression-5XG5LXP7.js → regression-DUUCJOFW.js} +11 -11
- package/dist/{regression.inputs-QHXK7ZYY.js → regression.inputs-B6SFFVED.js} +11 -11
- package/dist/{regression.inputs.term-YYO3CR2D.js → regression.inputs.term-P5NHX7ME.js} +11 -11
- package/dist/{regression.inputs.values.table-3I2FCON2.js → regression.inputs.values.table-MVPP5VAK.js} +9 -9
- package/dist/{regression.integration.spec-QVDGCKVT.js → regression.integration.spec-T7VH46WO.js} +10 -10
- package/dist/{regression.results-B7LVT2WG.js → regression.results-QEP4T6JO.js} +4 -4
- package/dist/{regression.spec-ISYKKQOM.js → regression.spec-BTBCBKMF.js} +10 -10
- package/dist/{report-TF6Z3Y44.js → report-WYCH4DJX.js} +3 -3
- package/dist/{sampleScatter.spec-2VW55XIZ.js → sampleScatter.spec-LC6K22FF.js} +10 -10
- package/dist/{sampleView-DNNJRAMU.js → sampleView-V3JYDTRA.js} +4 -4
- package/dist/{samplelst-726II3LN.js → samplelst-JO7UROYA.js} +3 -3
- package/dist/{samplematrix-TBPW4URH.js → samplematrix-6526IJRO.js} +5 -5
- package/dist/{sc-GBYH3W4S.js → sc-EUC7G5OV.js} +5 -5
- package/dist/{scatter-ATUM7AEW.js → scatter-UMK37C4M.js} +9 -9
- package/dist/{scatter.integration.spec-PDM454O3.js → scatter.integration.spec-BTOB6Y4H.js} +10 -10
- package/dist/{selectGenomeWithTklst-RCAYDV6D.js → selectGenomeWithTklst-JNEOHP4V.js} +4 -4
- package/dist/{singleCellCellType-IQYCKUT6.js → singleCellCellType-ZDMKPQ2Q.js} +4 -4
- package/dist/{singleCellCellType.unit.spec-ZEWA2IFI.js → singleCellCellType.unit.spec-BKGRNHYP.js} +4 -4
- package/dist/{singleCellGeneExpression-STLTBXJQ.js → singleCellGeneExpression-J5KFX7TD.js} +4 -4
- package/dist/{singleCellGeneExpression.unit.spec-W6FPS5ZU.js → singleCellGeneExpression.unit.spec-6F5YFV7K.js} +4 -4
- package/dist/{singleCellPlot-7XH7NIL4.js → singleCellPlot-VA6SWR5L.js} +5 -5
- package/dist/{singlecell-JCXR7X5U.js → singlecell-2CWHJR2P.js} +5 -5
- package/dist/{singlecell-IDZB2MXW.js → singlecell-A4OHBVJD.js} +5 -5
- package/dist/{snp-QOKI26PO.js → snp-PJNNPOSF.js} +4 -4
- package/dist/{snp.unit.spec-DTPZAALW.js → snp.unit.spec-JKZCYPNA.js} +4 -4
- package/dist/{snplocus-BKUJYANW.js → snplocus-YY6UIS2R.js} +3 -3
- package/dist/{spliceevent.a53ss.diagram-4O54ORKZ.js → spliceevent.a53ss.diagram-CEFGK2LA.js} +3 -3
- package/dist/{spliceevent.exonskip.diagram-KOIOS6IV.js → spliceevent.exonskip.diagram-A24TZTQ7.js} +4 -4
- package/dist/{spliceevent.noeventdiagram-YGUGQMVE.js → spliceevent.noeventdiagram-USD42ZZB.js} +3 -3
- package/dist/{ssGSEA-UZMBIHVD.js → ssGSEA-A5X56E7U.js} +4 -4
- package/dist/{ssGSEA.unit.spec-4YO4E3T7.js → ssGSEA.unit.spec-6WMGKWNI.js} +4 -4
- package/dist/{summarizeCnvGeneexp-HV3DHIW4.js → summarizeCnvGeneexp-FZJL4Q7O.js} +4 -4
- package/dist/{summarizeGeneexpSurvival-VGPRWYQ5.js → summarizeGeneexpSurvival-LRJZBHRW.js} +5 -5
- package/dist/{summarizeMutationCnv-N3JEB4DJ.js → summarizeMutationCnv-L64CVMHI.js} +4 -4
- package/dist/{summarizeMutationDiagnosis-6U4DBLG5.js → summarizeMutationDiagnosis-S55CKGBO.js} +4 -4
- package/dist/{summarizeMutationSurvival-S7NLAVEI.js → summarizeMutationSurvival-AM7BZVDP.js} +4 -4
- package/dist/{summary-NPR56I4S.js → summary-ANZTET2T.js} +7 -7
- package/dist/{summary.integration.spec-HWNJWLKT.js → summary.integration.spec-TW3CJTDA.js} +10 -10
- package/dist/{summaryInput-DO73NGDQ.js → summaryInput-3JHKZU62.js} +4 -4
- package/dist/{sunburst-MMXSGJSL.js → sunburst-ABDTE22P.js} +3 -3
- package/dist/{survival-7AIKFGV5.js → survival-HROP7OR7.js} +3 -3
- package/dist/{survival-UK332X6L.js → survival-KZDESA36.js} +4 -4
- package/dist/{survival.integration.spec-YMTEKEGB.js → survival.integration.spec-CMZTALBF.js} +10 -10
- package/dist/{svgraph-MLLAYO4A.js → svgraph-TLRXKVWQ.js} +3 -3
- package/dist/{svmr-PYW4PLT3.js → svmr-R4QOXWQW.js} +6 -6
- package/dist/{table-Y3ED2444.js → table-QM3RZQ5R.js} +3 -3
- package/dist/termCollection-B2A3MSCD.js +38 -0
- package/dist/{termCollection-VAB53YGO.js → termCollection-WVYJHPIH.js} +3 -3
- package/dist/{termCollection.unit.spec-DYPWNVEZ.js → termCollection.unit.spec-TCPEEZHW.js} +4 -4
- package/dist/{tk-GUGJYKJ2.js → tk-DGFFDV7C.js} +6 -6
- package/dist/{tp.ui-WGETBYJQ.js → tp.ui-BEESUHHF.js} +11 -11
- package/dist/{tvs.dt-JWF4I3KY.js → tvs.dt-UZW3L4MO.js} +3 -3
- package/dist/{tvs.dtcnv.categorical-72Y5QMPL.js → tvs.dtcnv.categorical-OH5NXCDN.js} +3 -3
- package/dist/{tvs.dtcnv.continuous-73LHWTU5.js → tvs.dtcnv.continuous-VWWTWAX2.js} +3 -3
- package/dist/{tvs.dtfusion-LP6HUMZU.js → tvs.dtfusion-YKYYCDJN.js} +3 -3
- package/dist/{tvs.dtsnvindel-23N2CFZJ.js → tvs.dtsnvindel-Y3WAHLKK.js} +3 -3
- package/dist/{tvs.dtsv-DILQVKYM.js → tvs.dtsv-UFLR2XRY.js} +3 -3
- package/dist/{tvs.samplelst-GV4VSCRF.js → tvs.samplelst-BPWZHD62.js} +3 -3
- package/dist/{tvs.termCollection-KBDNXK7X.js → tvs.termCollection-JLA3JQFX.js} +3 -3
- package/dist/{violin-TYUP7FB5.js → violin-TFNQIETS.js} +6 -6
- package/dist/{violin.integration.spec-ULRFK2A6.js → violin.integration.spec-XKNZQVN7.js} +10 -10
- package/dist/{violin.interactivity-2QZVQWQJ.js → violin.interactivity-R2EYNWI6.js} +4 -4
- package/dist/{violin.renderer-HCDSN62Z.js → violin.renderer-5WA4YLGB.js} +4 -4
- package/dist/{vocabulary-I4CMPN2Z.js → vocabulary-D2XUEKI6.js} +3 -3
- package/package.json +2 -2
- package/dist/AIProjectAdmin-JMN5O6YU.js.map +0 -7
- package/dist/WSIViewer-KITT7I67.js.map +0 -7
- package/dist/chunk-42EBECOD.js.map +0 -7
- package/dist/chunk-GMT2GNQY.js.map +0 -7
- package/dist/chunk-QNMB7LYW.js.map +0 -7
- package/dist/importPlot-M3MKWRON.js +0 -8
- package/dist/termCollection-3XVL75II.js +0 -38
- /package/dist/{2dmaf-V4WJ2LEK.js.map → 2dmaf-AGYGXGUT.js.map} +0 -0
- /package/dist/{AppHeader-Y4SEKCEF.js.map → AppHeader-6HL2GGMM.js.map} +0 -0
- /package/dist/{BoxPlot-ZXQZGCR3.js.map → BoxPlot-KZHJGR2R.js.map} +0 -0
- /package/dist/{CorrelationVolcano-R5IWD6WA.js.map → CorrelationVolcano-ICDRXFUR.js.map} +0 -0
- /package/dist/{DE-ZV6O7B6Y.js.map → DE-XYOBENUC.js.map} +0 -0
- /package/dist/{DEinput-FTOALZKN.js.map → DEinput-Q2TQ2KMY.js.map} +0 -0
- /package/dist/{DifferentialAnalysis-NLCA766A.js.map → DifferentialAnalysis-PLQOZDV6.js.map} +0 -0
- /package/dist/{Disco-Y5Z4A7GN.js.map → Disco-SFLOG7EW.js.map} +0 -0
- /package/dist/{Disco.UI-GSWZYIUT.js.map → Disco.UI-VF6NGHZ3.js.map} +0 -0
- /package/dist/{DmrPlot-FEFUCIGT.js.map → DmrPlot-ZUIQQBCR.js.map} +0 -0
- /package/dist/{GB-AOXF2JJB.js.map → GB-ZQ3RF3TI.js.map} +0 -0
- /package/dist/{GeneExpInput-CXYRKQU7.js.map → GeneExpInput-7QIBZOKQ.js.map} +0 -0
- /package/dist/{HicApp-GLNNZ4H5.js.map → HicApp-RSZ2KEDE.js.map} +0 -0
- /package/dist/{NumBinaryEditor-6ZAL6CCP.js.map → NumBinaryEditor-2W3DAPDZ.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-3VTJLILH.js.map → NumBinaryEditor.unit.spec-M5B6TNSD.js.map} +0 -0
- /package/dist/{NumContEditor-3LOAR676.js.map → NumContEditor-4K5FPKEN.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-WIMYCOVO.js.map → NumContEditor.unit.spec-6G7AP2M2.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-XIOAYWOD.js.map → NumCustomBinEditor-DHLGY3FL.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-N5OV6MKR.js.map → NumCustomBinEditor.unit.spec-FHQ6P4JL.js.map} +0 -0
- /package/dist/{NumDiscreteEditor-AT6FKYGI.js.map → NumDiscreteEditor-XUCSTPY2.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-BDR5GZ46.js.map → NumDiscreteEditor.unit.spec-HMD6VS2S.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-Z4NBS4VZ.js.map → NumRegularBinEditor-3WT42ZBR.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-BRWYNQ55.js.map → NumRegularBinEditor.unit.spec-5F346HKA.js.map} +0 -0
- /package/dist/{NumSplineEditor-B45BAWQ2.js.map → NumSplineEditor-TOAQ5FPH.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-5RDBCZ4N.js.map → NumSplineEditor.unit.spec-27JDSKBE.js.map} +0 -0
- /package/dist/{NumericDensity-L7HIVV7D.js.map → NumericDensity-IP6XHMQF.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-PL3XDJCV.js.map → NumericDensity.unit.spec-KWT77AFV.js.map} +0 -0
- /package/dist/{NumericHandler-KJYZOCCG.js.map → NumericHandler-7ZWXP7GY.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-VC7NPLJW.js.map → NumericHandler.unit.spec-MK2GEPAY.js.map} +0 -0
- /package/dist/{ProteomeInput-A3GRPIAH.js.map → ProteomeInput-IIJOKE46.js.map} +0 -0
- /package/dist/{RunChart2-MSNU3ZNT.js.map → RunChart2-PLRREVZ4.js.map} +0 -0
- /package/dist/{SC-FNKG2FK5.js.map → SC-DC3QBYYA.js.map} +0 -0
- /package/dist/{Volcano-IRJMPHXJ.js.map → Volcano-VD2E62U3.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-G3YZ6SIE.js.map → WsiSamplesPlot-QPIERW3J.js.map} +0 -0
- /package/dist/{adSandbox-GIQTJ4VA.js.map → adSandbox-4AVU36ND.js.map} +0 -0
- /package/dist/{app-MGNEMS2K.js.map → app-E36H76Q7.js.map} +0 -0
- /package/dist/{app-UQTHPQFD.js.map → app-I4D3X3MD.js.map} +0 -0
- /package/dist/{bam-5PROQBRT.js.map → bam-IW44TWN3.js.map} +0 -0
- /package/dist/{barchart-BQYJ73Z4.js.map → barchart-RXVVLBQY.js.map} +0 -0
- /package/dist/{barchart.events-W2CIDD4B.js.map → barchart.events-2WWFMZYY.js.map} +0 -0
- /package/dist/{barchart.integration.spec-JF2IHFQE.js.map → barchart.integration.spec-CYR3XRHD.js.map} +0 -0
- /package/dist/{barchart2-V6W4UAFH.js.map → barchart2-DRRTYOAK.js.map} +0 -0
- /package/dist/{block-5V2FCT7Q.js.map → block-WGOA676W.js.map} +0 -0
- /package/dist/{block.init-43IUNDNB.js.map → block.init-PEK25OMQ.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-LI6MZPBE.js.map → block.mds.expressionrank-N2L46BXD.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-673AIJMJ.js.map → block.mds.geneboxplot-RWQUY72S.js.map} +0 -0
- /package/dist/{block.mds.junction-UWNVNV3X.js.map → block.mds.junction-PTXDDQGZ.js.map} +0 -0
- /package/dist/{block.mds.svcnv-Z5VFCUUE.js.map → block.mds.svcnv-ZQXSEZWZ.js.map} +0 -0
- /package/dist/{block.svg-MGK4GWLL.js.map → block.svg-OVZSRPOX.js.map} +0 -0
- /package/dist/{block.tk.aicheck-OFNDGG7Q.js.map → block.tk.aicheck-X5QHG6LL.js.map} +0 -0
- /package/dist/{block.tk.ase-IDZQY7MW.js.map → block.tk.ase-BPB2PABO.js.map} +0 -0
- /package/dist/{block.tk.bam-K7A2Q5NI.js.map → block.tk.bam-E7JVNL5W.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-PPTKCCPK.js.map → block.tk.bedgraphdot-U76UV2L6.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-PI6EAU43.js.map → block.tk.bigwig.ui-HH3ETZSD.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-EZ2GS2K4.js.map → block.tk.hicstraw-O5MGNX56.js.map} +0 -0
- /package/dist/{block.tk.junction-4WSLQGSQ.js.map → block.tk.junction-TIAW3OKP.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-7EJUSVMB.js.map → block.tk.junction.textmatrixui-NSWBQ7VJ.js.map} +0 -0
- /package/dist/{block.tk.ld-KLVO7M37.js.map → block.tk.ld-NQ2OIWL5.js.map} +0 -0
- /package/dist/{block.tk.menu-KZSL7BAR.js.map → block.tk.menu-JY5CEFKV.js.map} +0 -0
- /package/dist/{block.tk.pgv-NYWGB4VH.js.map → block.tk.pgv-NFUQC4QX.js.map} +0 -0
- /package/dist/{brainImaging-MTIIMJHW.js.map → brainImaging-3OMQ4JBW.js.map} +0 -0
- /package/dist/{chunk-RZY34QRF.js.map → chunk-26NIOETK.js.map} +0 -0
- /package/dist/{chunk-O7NFSCEW.js.map → chunk-3FCUJ5L3.js.map} +0 -0
- /package/dist/{chunk-2NQLAH3L.js.map → chunk-46NCFHG3.js.map} +0 -0
- /package/dist/{chunk-5SXCIKYV.js.map → chunk-4732T6NY.js.map} +0 -0
- /package/dist/{chunk-P4QGOUDH.js.map → chunk-4NCLILLO.js.map} +0 -0
- /package/dist/{chunk-CKA52OEA.js.map → chunk-4RGJAFAC.js.map} +0 -0
- /package/dist/{chunk-2TCCXOAV.js.map → chunk-4VMWYVLU.js.map} +0 -0
- /package/dist/{chunk-6GZJCSA6.js.map → chunk-5YQ2VPEW.js.map} +0 -0
- /package/dist/{chunk-Z3SC67OA.js.map → chunk-6ME3635L.js.map} +0 -0
- /package/dist/{chunk-YNBT4N6T.js.map → chunk-6ML236VW.js.map} +0 -0
- /package/dist/{chunk-YWZCJMHS.js.map → chunk-7E73OOQ4.js.map} +0 -0
- /package/dist/{chunk-UCLROZRF.js.map → chunk-AFZX3KM2.js.map} +0 -0
- /package/dist/{chunk-F6N6JBZR.js.map → chunk-ALZ4PTHT.js.map} +0 -0
- /package/dist/{chunk-L4TUTGTA.js.map → chunk-APO4BA2P.js.map} +0 -0
- /package/dist/{chunk-3D5GZIGG.js.map → chunk-BF5R4XFD.js.map} +0 -0
- /package/dist/{chunk-F5QIZOPL.js.map → chunk-BIBPNVX7.js.map} +0 -0
- /package/dist/{chunk-MYWV64P5.js.map → chunk-DJ5D3TFP.js.map} +0 -0
- /package/dist/{chunk-4B42QV34.js.map → chunk-E7ZIEO4Q.js.map} +0 -0
- /package/dist/{chunk-SQWEREGE.js.map → chunk-ECYPHINS.js.map} +0 -0
- /package/dist/{chunk-EIBNV236.js.map → chunk-FVRQYK2V.js.map} +0 -0
- /package/dist/{chunk-ZLREFIZB.js.map → chunk-GWXA2YLS.js.map} +0 -0
- /package/dist/{chunk-52RORO74.js.map → chunk-HD3N3MIQ.js.map} +0 -0
- /package/dist/{chunk-WET4LPLO.js.map → chunk-HOHQUGVI.js.map} +0 -0
- /package/dist/{chunk-CKDC326M.js.map → chunk-IVIWWCEK.js.map} +0 -0
- /package/dist/{chunk-X63AAJGT.js.map → chunk-JZ67QSUN.js.map} +0 -0
- /package/dist/{chunk-FXMHSVBS.js.map → chunk-KBTMTZ2D.js.map} +0 -0
- /package/dist/{chunk-3TPAIXNL.js.map → chunk-KRWLIZ6J.js.map} +0 -0
- /package/dist/{chunk-PGBKZ76Y.js.map → chunk-KW5ZXPIM.js.map} +0 -0
- /package/dist/{chunk-LT5XPBIX.js.map → chunk-LLFZ4KNO.js.map} +0 -0
- /package/dist/{chunk-67HSIHPP.js.map → chunk-LOZWCVAY.js.map} +0 -0
- /package/dist/{chunk-YVCTEEVQ.js.map → chunk-MBZ3D6T6.js.map} +0 -0
- /package/dist/{chunk-7JEKUSEL.js.map → chunk-MHOVJLLC.js.map} +0 -0
- /package/dist/{chunk-SDACELDR.js.map → chunk-N4PSYVGO.js.map} +0 -0
- /package/dist/{chunk-JJOLDYSQ.js.map → chunk-NCQK3W6J.js.map} +0 -0
- /package/dist/{chunk-2Q6PBSPS.js.map → chunk-OHO2FGMM.js.map} +0 -0
- /package/dist/{chunk-X5X5T3AJ.js.map → chunk-OHXWVZEI.js.map} +0 -0
- /package/dist/{chunk-IL5QT2FI.js.map → chunk-PB3POI37.js.map} +0 -0
- /package/dist/{chunk-NKTBR5SK.js.map → chunk-PGEEP4AH.js.map} +0 -0
- /package/dist/{chunk-KSCJWPTJ.js.map → chunk-PHE6J6OL.js.map} +0 -0
- /package/dist/{chunk-PQZ3A27I.js.map → chunk-TRZ35AY6.js.map} +0 -0
- /package/dist/{chunk-647P2I4Q.js.map → chunk-TVIKEQUO.js.map} +0 -0
- /package/dist/{chunk-PQNVPSQR.js.map → chunk-VF23ENKB.js.map} +0 -0
- /package/dist/{chunk-BMO6KSVC.js.map → chunk-VGMVLQDT.js.map} +0 -0
- /package/dist/{chunk-J6GLTYGJ.js.map → chunk-VUWWQCEK.js.map} +0 -0
- /package/dist/{chunk-4FKWINMK.js.map → chunk-X3Q6I37T.js.map} +0 -0
- /package/dist/{chunk-DC4KD6FJ.js.map → chunk-XEMSCL7A.js.map} +0 -0
- /package/dist/{chunk-NVX26LFC.js.map → chunk-XLDH2NGH.js.map} +0 -0
- /package/dist/{chunk-VIHUKORE.js.map → chunk-YH4CIFN3.js.map} +0 -0
- /package/dist/{chunk-CYHUNQMS.js.map → chunk-YKCJPNBV.js.map} +0 -0
- /package/dist/{chunk-ZX2ISBEF.js.map → chunk-Z3726F4F.js.map} +0 -0
- /package/dist/{chunk-XRAFQKOF.js.map → chunk-ZSP7AKBN.js.map} +0 -0
- /package/dist/{condition-P2XD32QM.js.map → condition-GNUPDC6J.js.map} +0 -0
- /package/dist/{controls-FZUTJPKV.js.map → controls-W5CAUCUU.js.map} +0 -0
- /package/dist/{controls.config-TEFY3NTE.js.map → controls.config-JQGWNZCZ.js.map} +0 -0
- /package/dist/{correlation-HS2WJFXN.js.map → correlation-URI2YADE.js.map} +0 -0
- /package/dist/{cuminc-42GBJHD3.js.map → cuminc-CMJRK7TH.js.map} +0 -0
- /package/dist/{cuminc.integration.spec-BAY4JHVL.js.map → cuminc.integration.spec-BMEGXFL7.js.map} +0 -0
- /package/dist/{customdata.inputui-IPM5K56K.js.map → customdata.inputui-YGBEBVS2.js.map} +0 -0
- /package/dist/{dataDownload-D7VCYBDT.js.map → dataDownload-OTUQZMQ5.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-SEBY2BIX.js.map → dataDownload.integration.spec-TF25ODEK.js.map} +0 -0
- /package/dist/{databrowser.ui-5OC5MPZB.js.map → databrowser.ui-4BNTK45C.js.map} +0 -0
- /package/dist/{dictionary-VVRWVLJX.js.map → dictionary-MBQY7WLO.js.map} +0 -0
- /package/dist/{dnaMethylation-72IS3FRI.js.map → dnaMethylation-TQ4Q22UM.js.map} +0 -0
- /package/dist/{dnaMethylation.integration.spec-U2LLSDGE.js.map → dnaMethylation.integration.spec-7IK6AQK3.js.map} +0 -0
- /package/dist/{e2pca-AR6EKEJA.js.map → e2pca-NZFBO7ZK.js.map} +0 -0
- /package/dist/{ep-JS5UUJQX.js.map → ep-KBE3SNHO.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-73MGQ7RN.js.map → expclust.gdc.spec-JWNFEMC6.js.map} +0 -0
- /package/dist/{facet-AR3QKHCY.js.map → facet-YSULPZW4.js.map} +0 -0
- /package/dist/{forms2-UXEI7MUP.js.map → forms2-AEMEQPHL.js.map} +0 -0
- /package/dist/{gb-RHDVYU2V.js.map → gb-JZIBBHO3.js.map} +0 -0
- /package/dist/{geneExpClustering-L6KLCMPH.js.map → geneExpClustering-NYB4KT5A.js.map} +0 -0
- /package/dist/{geneExpression-SKIU3NEP.js.map → geneExpression-MLCFQIN7.js.map} +0 -0
- /package/dist/{geneExpression.unit.spec-CWR6KDVK.js.map → geneExpression.unit.spec-JUUSSSX6.js.map} +0 -0
- /package/dist/{geneORA-C3TALK5P.js.map → geneORA-WHLE3ZGH.js.map} +0 -0
- /package/dist/{geneRanking-LLYLDPLV.js.map → geneRanking-3SKA2UCY.js.map} +0 -0
- /package/dist/{geneVariant-PUSKBHPY.js.map → geneVariant-EV6HDSXA.js.map} +0 -0
- /package/dist/{geneVariant-YFMU6PHM.js.map → geneVariant-Z77ISGU7.js.map} +0 -0
- /package/dist/{geneVariant.integration.spec-EJ5V46OQ.js.map → geneVariant.integration.spec-SEZM6S35.js.map} +0 -0
- /package/dist/{genefusion.ui-XUHSKQKW.js.map → genefusion.ui-3XZHAONN.js.map} +0 -0
- /package/dist/{geneset-DEL5LXFZ.js.map → geneset-JHCB2JO3.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-W5TVHOUJ.js.map → genomeBrowser.spec-D3WNZ2N5.js.map} +0 -0
- /package/dist/{grin2-FXAEGECD.js.map → grin2-32ZKO7NS.js.map} +0 -0
- /package/dist/{grin2-U2FKULLC.js.map → grin2-4R3JJOLC.js.map} +0 -0
- /package/dist/{gsea-CNL6SHH5.js.map → gsea-S7324GB6.js.map} +0 -0
- /package/dist/{hierCluster-7V65PMIW.js.map → hierCluster-GX5PI6YL.js.map} +0 -0
- /package/dist/{hierCluster-C44GHM4B.js.map → hierCluster-KQYYIGN5.js.map} +0 -0
- /package/dist/{hierCluster.config-RU5JDPWM.js.map → hierCluster.config-IIURSVY2.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-6YH5KE4H.js.map → hierCluster.integration.spec-FWBF4YBD.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-PK2L7BSW.js.map → hierCluster.interactivity-KPXSTWRR.js.map} +0 -0
- /package/dist/{imagePlot-5SEDMPBP.js.map → imagePlot-7A2CIC66.js.map} +0 -0
- /package/dist/{importPlot-M3MKWRON.js.map → importPlot-6YQK3SNT.js.map} +0 -0
- /package/dist/{isoformExpression-PPMISWKT.js.map → isoformExpression-AROVOFMP.js.map} +0 -0
- /package/dist/{isoformExpression.unit.spec-ENHCCQRZ.js.map → isoformExpression.unit.spec-VSVVZ5XS.js.map} +0 -0
- /package/dist/{launch.adhoc-XAG6H42J.js.map → launch.adhoc-IGP7JD3M.js.map} +0 -0
- /package/dist/{leftlabel.sample-BSPCI6GR.js.map → leftlabel.sample-DXTZOSQU.js.map} +0 -0
- /package/dist/{lollipop-IZJ7E3YO.js.map → lollipop-XWUXPA2R.js.map} +0 -0
- /package/dist/{maf-54XWBQ73.js.map → maf-JWOTNV3J.js.map} +0 -0
- /package/dist/{maftimeline-3AJKAFS6.js.map → maftimeline-E2UWXJXB.js.map} +0 -0
- /package/dist/{matrix-AJPMHUXG.js.map → matrix-22WXRDYA.js.map} +0 -0
- /package/dist/{matrix-ZMXNOESU.js.map → matrix-DJHK3OWP.js.map} +0 -0
- /package/dist/{matrix.config-4WLSFMTY.js.map → matrix.config-MXJ4IDSU.js.map} +0 -0
- /package/dist/{matrix.integration.spec-ENRPVB7R.js.map → matrix.integration.spec-XYRW7NR3.js.map} +0 -0
- /package/dist/{matrix.interactivity-IMWERCZF.js.map → matrix.interactivity-SVGML6PN.js.map} +0 -0
- /package/dist/{matrix.layout-5DDZWLNX.js.map → matrix.layout-RE3KGHVF.js.map} +0 -0
- /package/dist/{matrix.renderers-VFQZG5JP.js.map → matrix.renderers-HFV3XFJV.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-ZA5DRNL6.js.map → matrix.sort.unit.spec-WI6V675V.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-7TPOJ46U.js.map → matrix.sorterUi.unit.spec-BYZ2BMTN.js.map} +0 -0
- /package/dist/{mavb-73BXZ7MO.js.map → mavb-3H4ZCENB.js.map} +0 -0
- /package/dist/{mds.fimo-L7VVAOXQ.js.map → mds.fimo-26I6TEZC.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-6P75XEWB.js.map → mds.samplescatterplot-R6RTZNDF.js.map} +0 -0
- /package/dist/{mds.survivalplot-GCVE7XGO.js.map → mds.survivalplot-BJBA2ZLI.js.map} +0 -0
- /package/dist/{oncomatrix-BFWV2IC4.js.map → oncomatrix-WL7ZE5KG.js.map} +0 -0
- /package/dist/{oncomatrix.spec-J6IAY3O6.js.map → oncomatrix.spec-VHERLEOD.js.map} +0 -0
- /package/dist/{plot.2dvaf-ESJAB2F3.js.map → plot.2dvaf-ERAUL6M3.js.map} +0 -0
- /package/dist/{plot.app-T7CQMBRV.js.map → plot.app-X6DXZDVY.js.map} +0 -0
- /package/dist/{plot.barplot-HAWPMPPU.js.map → plot.barplot-2FBRVNLX.js.map} +0 -0
- /package/dist/{plot.boxplot-4QUORFXY.js.map → plot.boxplot-JNO63FXZ.js.map} +0 -0
- /package/dist/{plot.brainImaging-HG6I3GJW.js.map → plot.brainImaging-YBN5YH3H.js.map} +0 -0
- /package/dist/{plot.disco-LPH7F6YW.js.map → plot.disco-BLNU4I6Q.js.map} +0 -0
- /package/dist/{plot.dzi-DYAY4D4E.js.map → plot.dzi-FKWY6K5Q.js.map} +0 -0
- /package/dist/{plot.ssgq-CF5VIGYJ.js.map → plot.ssgq-3GTTOOMK.js.map} +0 -0
- /package/dist/{plot.vaf2cov-7HZCKNK6.js.map → plot.vaf2cov-UAI64HYN.js.map} +0 -0
- /package/dist/{plot.wsi-MU6AXOWO.js.map → plot.wsi-QJ52IJXL.js.map} +0 -0
- /package/dist/{polar2-G636L5TB.js.map → polar2-6S4IHKK4.js.map} +0 -0
- /package/dist/{profileForms-TIT4JUEJ.js.map → profileForms-WXWHZ56N.js.map} +0 -0
- /package/dist/{profilePlot-QFGRAZQA.js.map → profilePlot-K7ICCFQ3.js.map} +0 -0
- /package/dist/{proteinView-RZ56F45C.js.map → proteinView-ALZTEKTC.js.map} +0 -0
- /package/dist/{qualitative-YWP4YUPF.js.map → qualitative-QMPO7EY6.js.map} +0 -0
- /package/dist/{radar2-TKSHL54E.js.map → radar2-LDAFJHSI.js.map} +0 -0
- /package/dist/{radarFacility2-FHRFLBLF.js.map → radarFacility2-3TX3U243.js.map} +0 -0
- /package/dist/{regression-5XG5LXP7.js.map → regression-DUUCJOFW.js.map} +0 -0
- /package/dist/{regression.inputs-QHXK7ZYY.js.map → regression.inputs-B6SFFVED.js.map} +0 -0
- /package/dist/{regression.inputs.term-YYO3CR2D.js.map → regression.inputs.term-P5NHX7ME.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-3I2FCON2.js.map → regression.inputs.values.table-MVPP5VAK.js.map} +0 -0
- /package/dist/{regression.integration.spec-QVDGCKVT.js.map → regression.integration.spec-T7VH46WO.js.map} +0 -0
- /package/dist/{regression.results-B7LVT2WG.js.map → regression.results-QEP4T6JO.js.map} +0 -0
- /package/dist/{regression.spec-ISYKKQOM.js.map → regression.spec-BTBCBKMF.js.map} +0 -0
- /package/dist/{report-TF6Z3Y44.js.map → report-WYCH4DJX.js.map} +0 -0
- /package/dist/{sampleScatter.spec-2VW55XIZ.js.map → sampleScatter.spec-LC6K22FF.js.map} +0 -0
- /package/dist/{sampleView-DNNJRAMU.js.map → sampleView-V3JYDTRA.js.map} +0 -0
- /package/dist/{samplelst-726II3LN.js.map → samplelst-JO7UROYA.js.map} +0 -0
- /package/dist/{samplematrix-TBPW4URH.js.map → samplematrix-6526IJRO.js.map} +0 -0
- /package/dist/{sc-GBYH3W4S.js.map → sc-EUC7G5OV.js.map} +0 -0
- /package/dist/{scatter-ATUM7AEW.js.map → scatter-UMK37C4M.js.map} +0 -0
- /package/dist/{scatter.integration.spec-PDM454O3.js.map → scatter.integration.spec-BTOB6Y4H.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-RCAYDV6D.js.map → selectGenomeWithTklst-JNEOHP4V.js.map} +0 -0
- /package/dist/{singleCellCellType-IQYCKUT6.js.map → singleCellCellType-ZDMKPQ2Q.js.map} +0 -0
- /package/dist/{singleCellCellType.unit.spec-ZEWA2IFI.js.map → singleCellCellType.unit.spec-BKGRNHYP.js.map} +0 -0
- /package/dist/{singleCellGeneExpression-STLTBXJQ.js.map → singleCellGeneExpression-J5KFX7TD.js.map} +0 -0
- /package/dist/{singleCellGeneExpression.unit.spec-W6FPS5ZU.js.map → singleCellGeneExpression.unit.spec-6F5YFV7K.js.map} +0 -0
- /package/dist/{singleCellPlot-7XH7NIL4.js.map → singleCellPlot-VA6SWR5L.js.map} +0 -0
- /package/dist/{singlecell-JCXR7X5U.js.map → singlecell-2CWHJR2P.js.map} +0 -0
- /package/dist/{singlecell-IDZB2MXW.js.map → singlecell-A4OHBVJD.js.map} +0 -0
- /package/dist/{snp-QOKI26PO.js.map → snp-PJNNPOSF.js.map} +0 -0
- /package/dist/{snp.unit.spec-DTPZAALW.js.map → snp.unit.spec-JKZCYPNA.js.map} +0 -0
- /package/dist/{snplocus-BKUJYANW.js.map → snplocus-YY6UIS2R.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-4O54ORKZ.js.map → spliceevent.a53ss.diagram-CEFGK2LA.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-KOIOS6IV.js.map → spliceevent.exonskip.diagram-A24TZTQ7.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-YGUGQMVE.js.map → spliceevent.noeventdiagram-USD42ZZB.js.map} +0 -0
- /package/dist/{ssGSEA-UZMBIHVD.js.map → ssGSEA-A5X56E7U.js.map} +0 -0
- /package/dist/{ssGSEA.unit.spec-4YO4E3T7.js.map → ssGSEA.unit.spec-6WMGKWNI.js.map} +0 -0
- /package/dist/{summarizeCnvGeneexp-HV3DHIW4.js.map → summarizeCnvGeneexp-FZJL4Q7O.js.map} +0 -0
- /package/dist/{summarizeGeneexpSurvival-VGPRWYQ5.js.map → summarizeGeneexpSurvival-LRJZBHRW.js.map} +0 -0
- /package/dist/{summarizeMutationCnv-N3JEB4DJ.js.map → summarizeMutationCnv-L64CVMHI.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-6U4DBLG5.js.map → summarizeMutationDiagnosis-S55CKGBO.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-S7NLAVEI.js.map → summarizeMutationSurvival-AM7BZVDP.js.map} +0 -0
- /package/dist/{summary-NPR56I4S.js.map → summary-ANZTET2T.js.map} +0 -0
- /package/dist/{summary.integration.spec-HWNJWLKT.js.map → summary.integration.spec-TW3CJTDA.js.map} +0 -0
- /package/dist/{summaryInput-DO73NGDQ.js.map → summaryInput-3JHKZU62.js.map} +0 -0
- /package/dist/{sunburst-MMXSGJSL.js.map → sunburst-ABDTE22P.js.map} +0 -0
- /package/dist/{survival-7AIKFGV5.js.map → survival-HROP7OR7.js.map} +0 -0
- /package/dist/{survival-UK332X6L.js.map → survival-KZDESA36.js.map} +0 -0
- /package/dist/{survival.integration.spec-YMTEKEGB.js.map → survival.integration.spec-CMZTALBF.js.map} +0 -0
- /package/dist/{svgraph-MLLAYO4A.js.map → svgraph-TLRXKVWQ.js.map} +0 -0
- /package/dist/{svmr-PYW4PLT3.js.map → svmr-R4QOXWQW.js.map} +0 -0
- /package/dist/{table-Y3ED2444.js.map → table-QM3RZQ5R.js.map} +0 -0
- /package/dist/{termCollection-3XVL75II.js.map → termCollection-B2A3MSCD.js.map} +0 -0
- /package/dist/{termCollection-VAB53YGO.js.map → termCollection-WVYJHPIH.js.map} +0 -0
- /package/dist/{termCollection.unit.spec-DYPWNVEZ.js.map → termCollection.unit.spec-TCPEEZHW.js.map} +0 -0
- /package/dist/{tk-GUGJYKJ2.js.map → tk-DGFFDV7C.js.map} +0 -0
- /package/dist/{tp.ui-WGETBYJQ.js.map → tp.ui-BEESUHHF.js.map} +0 -0
- /package/dist/{tvs.dt-JWF4I3KY.js.map → tvs.dt-UZW3L4MO.js.map} +0 -0
- /package/dist/{tvs.dtcnv.categorical-72Y5QMPL.js.map → tvs.dtcnv.categorical-OH5NXCDN.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-73LHWTU5.js.map → tvs.dtcnv.continuous-VWWTWAX2.js.map} +0 -0
- /package/dist/{tvs.dtfusion-LP6HUMZU.js.map → tvs.dtfusion-YKYYCDJN.js.map} +0 -0
- /package/dist/{tvs.dtsnvindel-23N2CFZJ.js.map → tvs.dtsnvindel-Y3WAHLKK.js.map} +0 -0
- /package/dist/{tvs.dtsv-DILQVKYM.js.map → tvs.dtsv-UFLR2XRY.js.map} +0 -0
- /package/dist/{tvs.samplelst-GV4VSCRF.js.map → tvs.samplelst-BPWZHD62.js.map} +0 -0
- /package/dist/{tvs.termCollection-KBDNXK7X.js.map → tvs.termCollection-JLA3JQFX.js.map} +0 -0
- /package/dist/{violin-TYUP7FB5.js.map → violin-TFNQIETS.js.map} +0 -0
- /package/dist/{violin.integration.spec-ULRFK2A6.js.map → violin.integration.spec-XKNZQVN7.js.map} +0 -0
- /package/dist/{violin.interactivity-2QZVQWQJ.js.map → violin.interactivity-R2EYNWI6.js.map} +0 -0
- /package/dist/{violin.renderer-HCDSN62Z.js.map → violin.renderer-5WA4YLGB.js.map} +0 -0
- /package/dist/{vocabulary-I4CMPN2Z.js.map → vocabulary-D2XUEKI6.js.map} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
appInit
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XLDH2NGH.js";
|
|
4
4
|
import {
|
|
5
5
|
getDefaultViolinSettings
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-XEMSCL7A.js";
|
|
7
7
|
import {
|
|
8
8
|
select_default
|
|
9
9
|
} from "./chunk-I6Y4O3RR.js";
|
|
@@ -219,4 +219,4 @@ function setRenderers(self) {
|
|
|
219
219
|
export {
|
|
220
220
|
InputValuesTable
|
|
221
221
|
};
|
|
222
|
-
//# sourceMappingURL=chunk-
|
|
222
|
+
//# sourceMappingURL=chunk-ECYPHINS.js.map
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
storeInit
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VGMVLQDT.js";
|
|
4
4
|
import {
|
|
5
5
|
summaryInit
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-46NCFHG3.js";
|
|
7
7
|
import {
|
|
8
8
|
navInit
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-HK5ESK7S.js";
|
|
10
10
|
import {
|
|
11
11
|
AppBase,
|
|
12
12
|
downloadSVGsAsPdf,
|
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
newSandboxDiv,
|
|
15
15
|
sayerror,
|
|
16
16
|
vocabInit
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-APO4BA2P.js";
|
|
18
18
|
import {
|
|
19
19
|
importPlot
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-X3Q6I37T.js";
|
|
21
21
|
import {
|
|
22
22
|
Menu
|
|
23
23
|
} from "./chunk-HYOEWQ5P.js";
|
|
@@ -336,4 +336,4 @@ var appInit = AppApi.getInitFxn(MassApp);
|
|
|
336
336
|
export {
|
|
337
337
|
appInit
|
|
338
338
|
};
|
|
339
|
-
//# sourceMappingURL=chunk-
|
|
339
|
+
//# sourceMappingURL=chunk-FVRQYK2V.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
disappear2 as disappear,
|
|
6
6
|
makeNumericAxisConfig,
|
|
7
7
|
rgb2hex
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-APO4BA2P.js";
|
|
9
9
|
import {
|
|
10
10
|
dofetch3
|
|
11
11
|
} from "./chunk-6VKTEMFV.js";
|
|
@@ -299,4 +299,4 @@ export {
|
|
|
299
299
|
bigwigloadsubpanel,
|
|
300
300
|
bigwigconfigpanel
|
|
301
301
|
};
|
|
302
|
-
//# sourceMappingURL=chunk-
|
|
302
|
+
//# sourceMappingURL=chunk-GWXA2YLS.js.map
|
|
@@ -76,22 +76,22 @@ var NumericHandler = class extends HandlerBase {
|
|
|
76
76
|
if (!this.handlerByMode[tabData.mode]) {
|
|
77
77
|
switch (tabData.mode) {
|
|
78
78
|
case "continuous": {
|
|
79
|
-
const { NumContEditor } = await import("./NumContEditor-
|
|
79
|
+
const { NumContEditor } = await import("./NumContEditor-4K5FPKEN.js");
|
|
80
80
|
this.handlerByMode.continuous = new NumContEditor(this.opts, this);
|
|
81
81
|
break;
|
|
82
82
|
}
|
|
83
83
|
case "discrete": {
|
|
84
|
-
const { NumDiscreteEditor } = await import("./NumDiscreteEditor-
|
|
84
|
+
const { NumDiscreteEditor } = await import("./NumDiscreteEditor-XUCSTPY2.js");
|
|
85
85
|
this.handlerByMode.discrete = new NumDiscreteEditor(this.opts, this);
|
|
86
86
|
break;
|
|
87
87
|
}
|
|
88
88
|
case "binary": {
|
|
89
|
-
const { NumBinaryEditor } = await import("./NumBinaryEditor-
|
|
89
|
+
const { NumBinaryEditor } = await import("./NumBinaryEditor-2W3DAPDZ.js");
|
|
90
90
|
this.handlerByMode.binary = new NumBinaryEditor(this.opts, this);
|
|
91
91
|
break;
|
|
92
92
|
}
|
|
93
93
|
case "spline": {
|
|
94
|
-
const { NumSplineEditor } = await import("./NumSplineEditor-
|
|
94
|
+
const { NumSplineEditor } = await import("./NumSplineEditor-TOAQ5FPH.js");
|
|
95
95
|
this.handlerByMode.spline = new NumSplineEditor(this.opts, this);
|
|
96
96
|
break;
|
|
97
97
|
}
|
|
@@ -155,4 +155,4 @@ var NumericHandler = class extends HandlerBase {
|
|
|
155
155
|
export {
|
|
156
156
|
NumericHandler
|
|
157
157
|
};
|
|
158
|
-
//# sourceMappingURL=chunk-
|
|
158
|
+
//# sourceMappingURL=chunk-HD3N3MIQ.js.map
|
|
@@ -13,13 +13,13 @@ import {
|
|
|
13
13
|
renderTable,
|
|
14
14
|
sayerror,
|
|
15
15
|
to_textfile
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-APO4BA2P.js";
|
|
17
17
|
import {
|
|
18
18
|
require_debounce
|
|
19
19
|
} from "./chunk-LSEFWW72.js";
|
|
20
20
|
import {
|
|
21
21
|
importPlot
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-X3Q6I37T.js";
|
|
23
23
|
import {
|
|
24
24
|
Menu
|
|
25
25
|
} from "./chunk-HYOEWQ5P.js";
|
|
@@ -658,7 +658,7 @@ var MassAbout = class _MassAbout {
|
|
|
658
658
|
};
|
|
659
659
|
this.initActiveItems = () => {
|
|
660
660
|
if (!this.aboutOverrides?.activeItems) return;
|
|
661
|
-
const div = this.subheader.append("div").attr("data-testid", "sjpp-custom-about-activeItems").style("padding", "0px 0px
|
|
661
|
+
const div = this.subheader.append("div").attr("data-testid", "sjpp-custom-about-activeItems").style("padding", "0px 0px 10px 20px");
|
|
662
662
|
for (const item of this.aboutOverrides.activeItems.items) {
|
|
663
663
|
div.append("div").style("display", "inline-block").style("margin", "5px").attr("class", "sja_menuoption").attr("data-testid", "sjpp-custom-active-item-btn").html(item.title).on("click", async () => {
|
|
664
664
|
await this.app.dispatch({
|
|
@@ -673,6 +673,13 @@ var MassAbout = class _MassAbout {
|
|
|
673
673
|
});
|
|
674
674
|
}
|
|
675
675
|
};
|
|
676
|
+
this.initDisclaimer = () => {
|
|
677
|
+
const d = this.aboutOverrides?.disclaimer;
|
|
678
|
+
if (!d) return;
|
|
679
|
+
const div = this.subheader.append("div").attr("data-testid", "sjpp-custom-about-disclaimer").style("margin", "10px 0 20px 10px").style("opacity", 0.7).style("padding", "10px").style("background-color", "#f8f9fa").style("border-left", "4px solid #6c757d").style("font-size", "0.8em");
|
|
680
|
+
div.append("div").style("margin-bottom", "8px").style("font-weight", "bold").text("DISCLAIMER");
|
|
681
|
+
div.append("div").text(d.text);
|
|
682
|
+
};
|
|
676
683
|
this.showServerInfo = () => {
|
|
677
684
|
const state = this.app.getState();
|
|
678
685
|
const about = state.termdbConfig.massNav?.tabs?.about;
|
|
@@ -728,6 +735,7 @@ var MassAbout = class _MassAbout {
|
|
|
728
735
|
this.initCohort(appState);
|
|
729
736
|
this.initCustomHtml();
|
|
730
737
|
this.initActiveItems();
|
|
738
|
+
this.initDisclaimer();
|
|
731
739
|
this.showServerInfo();
|
|
732
740
|
}
|
|
733
741
|
async main() {
|
|
@@ -1329,4 +1337,4 @@ export {
|
|
|
1329
1337
|
getId,
|
|
1330
1338
|
navInit
|
|
1331
1339
|
};
|
|
1332
|
-
//# sourceMappingURL=chunk-
|
|
1340
|
+
//# sourceMappingURL=chunk-HK5ESK7S.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../mass/search.js", "../mass/sessionBtn.js", "../mass/about.ts", "../mass/chat.ts", "../mass/nav.js"],
|
|
4
|
+
"sourcesContent": ["import { getCompInit } from '../rx'\nimport { select, selectAll } from 'd3-selection'\nimport { Menu } from '../dom/menu'\nimport { debounce } from 'debounce'\nimport { sayerror } from '../dom/sayerror.ts'\n//import { graphable } from '../../common/termutils'\n\n/*\nsteps:\nuser input at <input> will call doSearch()\ndoSearch() lets app dispatch an action, type: search_\nbut the action will NOT update app state\napp notifies all components with the action\nonly main() of the \"search component\" will responds to the action to perform querying and display result\n\nopts{}\n.holder\n.click_term()\n.disable_terms[]\n\nTODO\nallow to search categories, e.g. hodgkin lymphoma from diaggrp, how to act upon clicking?\n\n */\n\nclass MassSearch {\n\tstatic type = 'search'\n\n\tconstructor(opts) {\n\t\tthis.type = MassSearch.type\n\t\tsetRenderers(this)\n\t\tsetInteractivity(this)\n\t}\n\n\tasync init(appState) {\n\t\tthis.dom = {\n\t\t\tholder: this.opts.holder,\n\t\t\tholderNode: this.opts.holder.node(),\n\t\t\ttip: new Menu({ padding: '5px' })\n\t\t}\n\t\tthis.initUI()\n\t}\n\n\treactsTo(action) {\n\t\treturn action.type.startsWith('search') || action.type.startsWith('cohort')\n\t}\n\n\tgetState(appState) {\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 main() {\n\t\t// show/hide search input from the tree\n\t\tthis.dom.holder.style('display', this.state.search.isVisible ? 'inline-block' : 'none')\n\t}\n\n\tasync doSearch(str) {\n\t\tif (!str) {\n\t\t\tthis.clear({ hide: true })\n\t\t\tthis.bus.emit('postSearch', [])\n\t\t\treturn\n\t\t}\n\t\tconst data = await this.app.vocabApi.findTerm(str, this.state.cohortStr, this.opts.usecase, this.opts.targetType)\n\t\tif (!data.lst || data.lst.length == 0) {\n\t\t\tthis.noResult()\n\t\t} else {\n\t\t\t// found terms\n\t\t\tthis.showTerms(data)\n\t\t}\n\t\tthis.bus.emit('postSearch', data)\n\t}\n}\n\nexport const searchInit = getCompInit(MassSearch)\n\nfunction setRenderers(self) {\n\tself.initUI = () => {\n\t\tself.dom.holder.style('display', self.search && self.search.isVisible == false ? 'none' : 'inline-block')\n\t\tself.dom.input = self.dom.holder\n\t\t\t.style('text-align', 'center')\n\t\t\t.append('input')\n\t\t\t.attr('type', 'search')\n\t\t\t.attr('class', 'tree_search')\n\t\t\t.attr('placeholder', 'Search')\n\t\t\t.style('width', '180px')\n\t\t\t.style('display', 'block')\n\t\t\t.on('input', debounce(self.onInput, 300))\n\n\t\tself.dom.resultDiv = self.dom.tip.d\n\t\t\t.style('border-left', self.opts.resultsHolder ? '' : 'solid 1px rgb(133,182,225)')\n\t\t\t.style('padding-left', '5px')\n\t}\n\tself.noResult = () => {\n\t\tself.clear()\n\t\tself.dom.resultDiv.append('div').text('No match').style('padding', '3px 3px 3px 0px').style('opacity', 0.5)\n\t}\n\tself.showTerms = data => {\n\t\t// add disabled terms to opts.disable_terms\n\t\tif (self.opts.disable_terms)\n\t\t\tdata.lst.forEach(t => {\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\tself.showTerm = function (term) {\n\t\tconst tr = select(this)\n\t\tconst button = tr.append('td').text(term.name)\n\n\t\tif (term.type) {\n\t\t\t// has term type, show button for clicking\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-search-term-${term.id}`)\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tif (self.state.nav?.activeTab == 0) {\n\t\t\t\t\t\t// see notes in about.ts line 340\n\t\t\t\t\t\tawait self.app.dispatch({\n\t\t\t\t\t\t\ttype: 'tab_set',\n\t\t\t\t\t\t\tactiveTab: 1\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tself.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tchartType: term.type == 'survival' ? 'survival' : 'summary',\n\t\t\t\t\t\t\tterm: { term }\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tself.clear({ hide: true })\n\t\t\t\t})\n\t\t} else {\n\t\t\t// no term type, not clickable\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\tself.clear = (opts = {}) => {\n\t\tself.dom.tip.clear()\n\t\tif (opts.hide) self.dom.tip.hide()\n\t\telse self.dom.tip.showunder(self.dom.holderNode)\n\t}\n}\n\nfunction setInteractivity(self) {\n\tself.onInput = async () => {\n\t\tconst str = self.dom.input.property('value')\n\t\t// do not trim space from input so that 'age ' will not match with 'agent'\n\t\ttry {\n\t\t\t//await self.main({ str })\n\t\t\tawait self.doSearch(str)\n\t\t} catch (e) {\n\t\t\tself.clear()\n\t\t\tsayerror(self.dom.resultDiv, 'Error: ' + (e.message || e))\n\t\t\tif (e.stack) console.log(e.stack)\n\t\t}\n\t}\n}\n", "import { getCompInit } from '#rx'\nimport { Menu } from '#dom/menu'\nimport { to_textfile } from '#dom/downloadTextfile'\nimport { dofetch3 } from '#common/dofetch'\nimport { parentCorsMessage } from '#common/embedder-helpers'\nimport { select } from 'd3-selection'\nimport { importPlot } from '#plots/importPlot.js'\n\nclass MassSessionBtn {\n\tstatic type = 'sessionBtn'\n\n\tconstructor() {\n\t\tthis.type = MassSessionBtn.type\n\t\tthis.route = 'termdb'\n\t\tthis.embedderOrigin = window.location.origin\n\t\tthis.hostURL = sessionStorage.getItem('hostURL') || this.embedderOrigin\n\t}\n\n\tasync init(appState) {\n\t\tconst tip = new Menu({ padding: '0px' })\n\t\tconst copytip = new Menu({ padding: '5px' })\n\t\tthis.dom = {\n\t\t\tbutton: this.opts.button,\n\t\t\ttip,\n\t\t\tcopytip\n\t\t}\n\n\t\tthis.dom.button.on('click', event => {\n\t\t\tevent.stopPropagation()\n\t\t\tthis.dom.tip.clear()\n\t\t\tthis.showMenu()\n\t\t})\n\n\t\tthis.dslabel = appState.vocab.dslabel\n\t\tthis.savedSessions = JSON.parse(localStorage.getItem('savedMassSessions') || `{}`)\n\t\tthis.requiredAuth = appState.termdbConfig?.requiredAuth?.find(a => a.route == this.route && a.type == 'jwt')\n\t}\n\n\tasync showMenu() {\n\t\tthis.dom.tip.clear().d.style('padding', 0)\n\t\tthis.dom.tip.d.attr('id', 'sjpp-session-menu')\n\t\tconst gt = `<span style='margin-left: 24px; float: right'>></span>`\n\t\tconst options = [\n\t\t\t{ label: `Open`, title: 'Recover a saved session', callback: this.open },\n\t\t\t{ label: `Save`, title: 'Save the current view', callback: this.save },\n\t\t\t{ label: `Share`, title: 'Share the current view', callback: this.getSessionUrl }\n\t\t]\n\n\t\tif (!this.serverCachedSessions) await this.setServerCachedSessions()\n\t\tif (Object.keys(this.savedSessions).length || Object.keys(this.serverCachedSessions).length) {\n\t\t\toptions.push({ label: `Delete`, title: 'Delete a saved session', callback: this.delete })\n\t\t}\n\n\t\tthis.dom.tip\n\t\t\t.clear()\n\t\t\t.d.selectAll('.sja_menuoption sja_sharp_border')\n\t\t\t.data(options)\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.attr('data-testid', d => `sjpp-session-btn-${d.label.toLowerCase().replace(/\\s/g, '-')}`)\n\t\t\t.attr('aria-label', d => d.title)\n\t\t\t.html(d => d.label)\n\t\t\t.on('click', (event, d) => {\n\t\t\t\tthis.dom.tip.clear().d.style('padding', '10px')\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tthis.showBackBtn()\n\t\t\t\td.callback.call(this)\n\t\t\t})\n\n\t\tthis.dom.tip.showunder(this.dom.button.node())\n\t}\n\n\tasync open() {\n\t\tconst radioName = `sjpp-session-open-radio-` + Math.random().toString().slice(-6)\n\t\t// always open in the current tab for now, to avoid the tricky part of the code\n\t\t// that involves parent-child window messaging\n\t\t// TODO: re-enable when the new tab option works reliably\n\t\tthis.dom.tip.d.append('div').style('display', 'none').style('padding', '3px 9px').html(`\n\t\t\t<b>Open in</b>\n\t\t\t<label>\n\t\t\t\t<input type='radio' name='${radioName}' value='new' style='margin-right: 0; vertical-align: bottom'/>\n\t\t\t\t<span>a new tab</span>\n\t\t\t</label>\n\t\t\t<label style='margin-left: 5px'>\n\t\t\t\t<input type='radio' name='${radioName}' value='current' checked=checked style='margin-right: 0; vertical-align: bottom'/>\n\t\t\t\t<span>current tab</span>\n\t\t\t</label>\n\t\t`)\n\n\t\tconst t = await this.listSessions({\n\t\t\ttrClickHandler: async (event, d) => {\n\t\t\t\tconst { loc, id } = d\n\t\t\t\tif (!id) return\n\t\t\t\tif (loc.includes('browser')) {\n\t\t\t\t\tthis.sessionName = id\n\t\t\t\t\tconst state = structuredClone(this.savedSessions[id])\n\t\t\t\t\tawait preprocessState(state, this.app)\n\t\t\t\t\tconst targetWindow = this.dom.tip.d.node().querySelector(`[name=\"${radioName}\"]:checked`).value\n\t\t\t\t\tif (targetWindow == 'current') {\n\t\t\t\t\t\tthis.app.dispatch({ type: 'app_refresh', state })\n\t\t\t\t\t} else if (window.location.origin == this.hostURL) {\n\t\t\t\t\t\twindow.open(`/?mass-session-id=${id}&src=browser`)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (state.embedder) parentCorsMessage({ state })\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tconst { protocol, host, search, origin, href } = window.location\n\t\t\t\t\t\t\tconst embedder = { protocol, host, search, origin, href }\n\t\t\t\t\t\t\tparentCorsMessage({ state: Object.assign({ embedder }, state) })\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.dom.tip.hide()\n\t\t\t\t} else if (loc == 'server') {\n\t\t\t\t\tconst headers = await this.app.vocabApi.mayGetAuthHeaders(this.route)\n\t\t\t\t\tconst body = { id, route: this.route, dslabel: this.dslabel, embedder: window.location.hostname }\n\t\t\t\t\tconst res = await dofetch3(`/massSession?`, { headers, body })\n\t\t\t\t\tif (!res.state) throw res.error || 'unable to get the cached session from the server'\n\t\t\t\t\tawait preprocessState(res.state, this.app)\n\t\t\t\t\tthis.savedSessions[id] = res.state\n\n\t\t\t\t\tconst targetWindow = this.dom.tip.d.node().querySelector(`[name=\"${radioName}\"]:checked`).value\n\t\t\t\t\tif (targetWindow == 'current') {\n\t\t\t\t\t\tthis.app.dispatch({ type: 'app_refresh', state: res.state })\n\t\t\t\t\t} else if (window.location.origin == this.hostURL) {\n\t\t\t\t\t\twindow.open(`/?mass-session-id=${id}&src=cred&dslabel=${this.dslabel}&route=${this.route}`)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// server-cached sessions should have an state.embedder object, no need to check\n\t\t\t\t\t\tparentCorsMessage(res)\n\t\t\t\t\t}\n\t\t\t\t\tthis.dom.tip.hide()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tt.headtr.select('th').html('Open from')\n\n\t\t// open session from a local file\n\t\tconst tr1 = t.tbody.insert('tr', 'tr')\n\t\ttr1.append('td').style('text-align', 'center').style('padding', '3px 9px').html('Local file')\n\t\tconst label = tr1.append('td').style('text-align', 'left').append('label')\n\t\tlabel\n\t\t\t.append('span')\n\t\t\t.style('padding', '3px 9px')\n\t\t\t.style('text-decoration', 'underline')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html('Choose File')\n\t\tlabel\n\t\t\t.append('input')\n\t\t\t.attr('type', 'file')\n\t\t\t.attr('placeholder', 'file name')\n\t\t\t.style('opacity', 0)\n\t\t\t.style('width', '0.1px')\n\t\t\t.style('height', '0.1px')\n\t\t\t.style('position', 'absolute')\n\t\t\t.on('change', async () => {\n\t\t\t\tconst file = event.target.files.item(0)\n\t\t\t\tconst json = await file.text()\n\t\t\t\tlet sessionName = file.name\n\t\t\t\tif (this.savedSessions[sessionName]) {\n\t\t\t\t\tsessionName = prompt(\n\t\t\t\t\t\t`Leave as-is to overwrite a session with the same name, or enter a different session name.`,\n\t\t\t\t\t\tsessionName\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tthis.sessionName = sessionName\n\t\t\t\tconst state = JSON.parse(json)\n\t\t\t\tawait preprocessState(state, this.app)\n\t\t\t\tthis.savedSessions[sessionName] = state\n\t\t\t\tlocalStorage.setItem('savedMassSessions', JSON.stringify(this.savedSessions))\n\t\t\t\tconst targetWindow = this.dom.tip.d.node().querySelector(`[name=\"${radioName}\"]:checked`).value\n\t\t\t\tif (targetWindow == 'current') {\n\t\t\t\t\tthis.app.dispatch({ type: 'app_refresh', state })\n\t\t\t\t} else if (window.location.origin == this.hostURL) {\n\t\t\t\t\twindow.open(`/?mass-session-id=${sessionName}&src=browser`)\n\t\t\t\t} else {\n\t\t\t\t\tif (state.embedder) parentCorsMessage({ state })\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst { protocol, host, search, origin, href } = window.location\n\t\t\t\t\t\tconst embedder = { protocol, host, search, origin, href }\n\t\t\t\t\t\tparentCorsMessage({ state: Object.assign({ embedder }, state) })\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.dom.tip.hide()\n\t\t\t})\n\t}\n\n\tasync listSessions(opts = {}) {\n\t\tconst table = this.dom.tip.d.append('table').attr('class', 'sjpp-controls-table')\n\n\t\tconst headtr = table.append('thead').append('tr')\n\t\theadtr\n\t\t\t.selectAll('th')\n\t\t\t.data(['Cache Location', 'Session ID'])\n\t\t\t.enter()\n\t\t\t.append('th')\n\t\t\t.style('text-align', (d, i) => (i === 0 ? 'center' : 'left'))\n\t\t\t.style('padding', '3px 9px')\n\t\t\t.html(d => d)\n\n\t\tconst sessionIds = Object.keys(this.savedSessions).map(id => ({ loc: 'browser', id }))\n\t\tif (!this.serverCachedSessions) await this.setServerCachedSessions()\n\t\tsessionIds.push(...this.serverCachedSessions.map(id => ({ loc: 'server', id })))\n\n\t\tconst tbody = table.append('tbody')\n\t\tconst trs = tbody\n\t\t\t.selectAll('tr')\n\t\t\t.data(sessionIds)\n\t\t\t.enter()\n\t\t\t.append('tr')\n\t\t\t.on('click', opts.trClickHandler || null)\n\n\t\ttrs\n\t\t\t.selectAll('td')\n\t\t\t.data(d => [d, d])\n\t\t\t.enter()\n\t\t\t.append('td')\n\t\t\t.style('text-align', (d, i) => (i === 0 ? 'center' : 'left'))\n\t\t\t.style('padding', '3px 9px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html((d, i) => (i === 0 ? d.loc : d.id))\n\n\t\tif (!this.serverCachedSessions.length && this.requiredAuth && !this.app.vocabApi.hasVerifiedToken()) {\n\t\t\tconst tbody2 = table\n\t\t\t\t.append('tbody')\n\t\t\t\t.append('tr')\n\t\t\t\t.selectAll('td')\n\t\t\t\t.data(['server', 'requires sign-in'])\n\t\t\t\t.enter()\n\t\t\t\t.append('td')\n\t\t\t\t.style('text-align', (d, i) => (i === 0 ? 'center' : 'left'))\n\t\t\t\t.style('padding', '3px 9px')\n\t\t\t\t.html(d => d)\n\t\t}\n\t\treturn { table, headtr, tbody, trs }\n\t}\n\n\tasync setServerCachedSessions() {\n\t\tconst state = this.app.getState()\n\t\tthis.requiredAuth = state.termdbConfig?.requiredAuth?.find(a => a.route == this.route && a.type == 'jwt')\n\t\tif (!this.requiredAuth) {\n\t\t\tthis.serverCachedSessions = []\n\t\t\treturn\n\t\t}\n\t\tconst headers = this.app.vocabApi.mayGetAuthHeaders(this.route)\n\t\tconst body = { route: this.route, dslabel: this.dslabel, embedder: window.location.hostname }\n\t\tconst res = await dofetch3('/sessionIds', { headers, body })\n\t\tthis.serverCachedSessions = res.sessionIds || []\n\t}\n\n\tasync save(d) {\n\t\tconst div = this.dom.tip.d\n\t\tconst inputDiv = div.append('div')\n\t\tinputDiv.append('span').html('Save as')\n\t\tconst sessionNames = Object.keys(this.savedSessions)\n\t\tif (!this.serverCachedSessions) await this.setServerCachedSessions()\n\t\tsessionNames.push(...this.serverCachedSessions.filter(d => !sessionNames.includes(d)))\n\t\tconst placeholder = this.sessionName || 'unnamed-session'\n\t\tconst input = inputDiv\n\t\t\t.append('input')\n\t\t\t.attr('type', 'text')\n\t\t\t.attr('placeholder', placeholder)\n\t\t\t.style('width', '220px')\n\t\t\t.on('input', () => {\n\t\t\t\tsearchResultDiv.selectAll('*').remove()\n\t\t\t\tconst value = input.property('value')\n\t\t\t\tconst exactMatch = sessionNames.filter(s => s === value)\n\t\t\t\tconst startsWith = sessionNames.filter(s => s.startsWith(value))\n\t\t\t\tconst includes = sessionNames.filter(s => s.includes(value) && s !== value && !startsWith.includes(s))\n\t\t\t\tsearchResultDiv\n\t\t\t\t\t.selectAll('div')\n\t\t\t\t\t.data([...exactMatch, ...startsWith, ...includes])\n\t\t\t\t\t.enter()\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t.attr('data-testid', `sjpp-save-session-option`)\n\t\t\t\t\t.html(d => d)\n\t\t\t\t\t.on('click', (event, d) => {\n\t\t\t\t\t\tinput.property('value', d)\n\t\t\t\t\t\tsearchResultDiv.selectAll('*').remove()\n\t\t\t\t\t})\n\t\t\t})\n\n\t\tconst searchResultDiv = div.append('div')\n\t\tconst submitDiv = div.append('div')\n\t\tsubmitDiv.append('span').html('Save to ')\n\t\tsubmitDiv\n\t\t\t.append('button')\n\t\t\t.style('min-width', '80px')\n\t\t\t.html('Browser')\n\t\t\t.attr(\n\t\t\t\t'title',\n\t\t\t\t`Save the session in your current browser's cache. The session can be easily recovered, but not shared among your other devices`\n\t\t\t)\n\t\t\t.on('click', () => {\n\t\t\t\tthis.sessionName = input.property('value') || placeholder\n\t\t\t\tthis.savedSessions[this.sessionName] = this.app.getState()\n\t\t\t\tlocalStorage.setItem('savedMassSessions', JSON.stringify(this.savedSessions))\n\t\t\t\tthis.confirmAction(`Cached '<b>${this.sessionName}</b>' in browser`)\n\t\t\t})\n\n\t\tsubmitDiv\n\t\t\t.append('button')\n\t\t\t.style('min-width', '80px')\n\t\t\t.html('File')\n\t\t\t.attr(\n\t\t\t\t'title',\n\t\t\t\t`Save the session into a local file. The session can be easily recoved using the 'Open from local file' option.`\n\t\t\t)\n\t\t\t.on('click', () => {\n\t\t\t\tconst name = input.property('value') || placeholder\n\t\t\t\tthis.savedSessions[name] = this.app.getState()\n\t\t\t\tthis.download(name)\n\t\t\t\tthis.confirmAction(`Downloaded '<b>${name}</b>'`)\n\t\t\t})\n\n\t\t// assume that a jwt-type credential will include the user email in the jwt payload,\n\t\t// which could be trusted for saving sessions under cachedir/termdbSessions/[embedderHostName]/[email]\n\t\tif (this.requiredAuth) {\n\t\t\tconst requiresSignIn = this.app.vocabApi.hasVerifiedToken() ? '' : 'Requires sign-in. '\n\t\t\tsubmitDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('min-width', '80px')\n\t\t\t\t.html('Server')\n\t\t\t\t.attr(\n\t\t\t\t\t'title',\n\t\t\t\t\t`${requiresSignIn}Save the session into a remote server. The session can be easily shared across your different devices and recovered using the 'Open from server' option.`\n\t\t\t\t)\n\t\t\t\t.property('disabled', !this.app.vocabApi.hasVerifiedToken())\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tif (!this.app.vocabApi.hasVerifiedToken()) {\n\t\t\t\t\t\talert('Requires sign-in')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst name = input.property('value') || placeholder\n\t\t\t\t\tthis.savedSessions[name] = this.app.getState()\n\t\t\t\t\tconst res = await this.getSessionUrl(name)\n\t\t\t\t\tif (res.id != name) throw `error saving ${name}`\n\t\t\t\t\t// this.download(name)\n\t\t\t\t\tthis.confirmAction(`Saved '<b>${name}</b>' on the server`)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tdownload(name = '') {\n\t\tconst sessionName = name || this.sessionName\n\t\tconst ext = sessionName?.endsWith('.txt') ? '' : '.txt'\n\t\tconst filename = `${sessionName}${ext}`\n\t\tto_textfile(filename, JSON.stringify(this.savedSessions[sessionName]))\n\t}\n\n\tasync getSessionUrl(filename = '') {\n\t\tconst headers = await this.app.vocabApi.mayGetAuthHeaders('termdb')\n\t\tconst state = structuredClone(this.app.getState())\n\t\tconst { protocol, host, search, origin, href } = window.location\n\t\tstate.embedder = { protocol, host, search, origin, href }\n\t\tif (filename) {\n\t\t\t// a non-empty filename value implies saving by email and having auth session,\n\t\t\t// since it's easy for different users to use the same non-random filename\n\t\t\tstate.__sessionFor__ = {\n\t\t\t\troute: this.route,\n\t\t\t\tfilename,\n\t\t\t\tdslabel: this.dslabel,\n\t\t\t\tembedder: window.location.hostname\n\t\t\t}\n\t\t}\n\t\tconst res = await dofetch3('/massSession', {\n\t\t\theaders,\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(state)\n\t\t})\n\n\t\tif (filename) {\n\t\t\treturn res\n\t\t} else {\n\t\t\tconst url = `${this.hostURL}/?mass-session-id=${res.id}&noheader=1`\n\t\t\tthis.dom.tip.showunder(this.dom.button.node())\n\t\t\tconst linkDiv = this.dom.tip.d.append('div').style('margin', '10px')\n\t\t\tlinkDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'flex')\n\t\t\t\t.style('margin-bottom', '12px')\n\t\t\t\t.html(`Open or copy the session link.`)\n\n\t\t\tconst a = linkDiv.append('a').style('display', 'none').attr('href', url).attr('target', '_blank').html(res.id)\n\n\t\t\t// open button\n\t\t\tlinkDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.text('Open link')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\ta.node().click()\n\t\t\t\t})\n\n\t\t\t// copy button\n\t\t\tlinkDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t.text('Copy link')\n\t\t\t\t.on('click', async event => {\n\t\t\t\t\tawait navigator.clipboard.writeText(url)\n\t\t\t\t\tthis.dom.copytip.clear().showunder(event.target)\n\t\t\t\t\tthis.dom.copytip.d.append('div').html('✓')\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.dom.copytip.hide()\n\t\t\t\t\t}, 1000)\n\t\t\t\t})\n\n\t\t\tif (this.hostURL != window.location.origin) {\n\t\t\t\t// Avoid the multi-window/tab sequence to recover the session:\n\t\t\t\t// intercept the click on the URL link, so that the embedder URL is opened\n\t\t\t\t// instead of the hostURL with mass session id, and this window will post\n\t\t\t\t// a message to the child window with the link data instead\n\t\t\t\t//\n\t\t\t\t// NOTE: the multi-window/tab sequence is only necessary when the URL link\n\t\t\t\t// was not opened by the embedder window\n\t\t\t\t//\n\t\t\t\ta.on('click', event => {\n\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\tparentCorsMessage({ state }, 'noredirect')\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlinkDiv.append('div').html(`\n\t\t\t\t\t<br>\n\t\t\t\t\t<div style=\"max-width: 400px; font-size: 1em; opacity:.6\">\n\t\t\t\t\t<span>NOTES</span>\n\t\t\t\t\t<ul>\n\t\t\t\t\t<li>A recovered session may hide data or views to users that are not authorized to access the saved datasets or features.</li>\n\t\t\t\t\t<li>This session will be saved for ${this.opts.massSessionDuration} days.</li>\n\t\t\t\t\t</ul>\n\t\t\t\t\t</div>`)\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.dom.button.property('disabled', false)\n\t\t\t}, 1000)\n\t\t}\n\t}\n\n\tasync delete() {\n\t\tconst t = await this.listSessions({\n\t\t\ttrClickHandler: function (event) {\n\t\t\t\tconst input = this.lastChild.querySelector('input')\n\t\t\t\tconst checked = event.target == input ? input.checked : !input.checked\n\t\t\t\tselect(this).style('text-decoration', checked ? 'line-through' : '')\n\t\t\t\tif (event.target != input) input.checked = checked\n\t\t\t\tconst checkedRows = t.table.node().querySelectorAll('input:checked')\n\t\t\t\tsubmitBtn.property('disabled', checkedRows.length ? false : true)\n\t\t\t}\n\t\t})\n\n\t\t// add a 3rd column for the checkboxes\n\t\tt.headtr.append('th').html('Delete')\n\t\tt.trs.each(function (d) {\n\t\t\tselect(this)\n\t\t\t\t.append('td')\n\t\t\t\t.style('text-align', 'center')\n\t\t\t\t.append('input')\n\t\t\t\t.attr('type', 'checkbox')\n\t\t\t\t.attr('value', d.id)\n\t\t})\n\n\t\tconst submitBtn = this.dom.tip.d\n\t\t\t.append('div')\n\t\t\t.style('text-align', 'center')\n\t\t\t.append('button')\n\t\t\t.html('Delete selected sessions')\n\t\t\t.property('disabled', true)\n\t\t\t.on('click', async () => {\n\t\t\t\tconst inputs = t.table.node().querySelectorAll('input')\n\t\t\t\tconst sessionIdsDeletedFromServer = []\n\t\t\t\tfor (const input of inputs) {\n\t\t\t\t\tif (select(input).property('checked')) {\n\t\t\t\t\t\tconst d = input.parentNode.parentNode.__data__\n\t\t\t\t\t\tif (d.loc == 'browser') {\n\t\t\t\t\t\t\tdelete this.savedSessions[input.value] //checkedIds.push(input.value)\n\t\t\t\t\t\t} else if (d.loc == 'server') {\n\t\t\t\t\t\t\tdelete this.serverCachedSessions[input.value]\n\t\t\t\t\t\t\tsessionIdsDeletedFromServer.push(input.value)\n\t\t\t\t\t\t} else throw `unknown cache location=${d.loc}`\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlocalStorage.setItem('savedMassSessions', JSON.stringify(this.savedSessions))\n\t\t\t\ttry {\n\t\t\t\t\tconst headers = await this.app.vocabApi.mayGetAuthHeaders('termdb')\n\t\t\t\t\tconst body = {\n\t\t\t\t\t\tids: sessionIdsDeletedFromServer,\n\t\t\t\t\t\troute: this.route,\n\t\t\t\t\t\tdslabel: this.dslabel,\n\t\t\t\t\t\tembedder: window.location.hostname\n\t\t\t\t\t}\n\t\t\t\t\tconst res = dofetch3(`/massSession?`, { method: 'DELETE', headers, body })\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow e\n\t\t\t\t}\n\t\t\t\tthis.dom.tip.hide()\n\t\t\t})\n\t}\n\n\tshowBackBtn() {\n\t\tthis.dom.tip.d\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_clbtext2')\n\t\t\t.style('margin-bottom', '10px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html(`< Session Menu`)\n\t\t\t.on('click', () => this.showMenu())\n\t}\n\n\tconfirmAction(html) {\n\t\tthis.dom.tip.clear().d.append('div').html(html).transition().delay(3000).duration(1000).style('opacity', 0)\n\n\t\tsetTimeout(() => {\n\t\t\tthis.dom.tip.hide()\n\t\t}, 3500)\n\t}\n}\n\n// may need to edit state based on updated expectations,\n// such as new or deprecated plot settings keys/values\nasync function preprocessState(state, app) {\n\tdelete state.termdbConfig\n\tif (state.plots) {\n\t\tconst promises = []\n\t\tfor (const plot of state.plots) {\n\t\t\tpromises.push(\n\t\t\t\t(async () => {\n\t\t\t\t\tconst _ = await importPlot(plot.chartType)\n\t\t\t\t\treturn await _.getPlotConfig(plot, app)\n\t\t\t\t})()\n\t\t\t)\n\t\t}\n\t\ttry {\n\t\t\tawait Promise.all(promises)\n\t\t} catch (e) {\n\t\t\tconsole.log(e)\n\t\t\tapp.printError(e)\n\t\t}\n\t}\n}\n\nexport const sessionBtnInit = getCompInit(MassSessionBtn)\n", "import { getId } from './nav'\nimport { type AppApi, getCompInit } from '#rx'\nimport type { Elem, Div, H2 } from '../types/d3'\nimport type { SelectCohortEntry } from '#types'\nimport { renderTable, type TableRow } from '#dom'\nimport { select } from 'd3-selection'\n\n/* \n\"about\" tab will display following contents inside this.subheader:\n- if ds uses subcohorts:\n\t- <h2> for selectCohort.title\n\t- description\n\t- radio button options\n- custom html via massNav.about.html (todo images and cartoon)\n- active items to launch demo plots\n- server info\n*/\n\nconst cohortTableActiveColor = 'yellow'\n\n// this type is fully defined in MassNav def in dataset.ts but not in a form that can extract \"about\" config to share. thus need to repeat here to avoid tsc err\ntype AboutObj = {\n\thtml: string\n\tactiveItems?: { items: any }\n\tdisclaimer?: any\n}\n\ntype MassAboutOpts = {\n\t/** Optional. Set in the dataset file under .massNav.tabs.about. Otherwise null. */\n\taboutOverrides: AboutObj | null\n\t/** Required. Provided from nav component */\n\tapp: AppApi\n\t/** Required. Provided from nav component */\n\tinstanceNum: number\n\t/** Optional. Set in the dataset file under .termdb.selectCohort. Otherwise null. */\n\tselectCohort: SelectCohortEntry | null\n\t/** Required. .dom.subheader.about in nav component, assigned to this.subheader */\n\tsubheader: Elem\n}\n\ntype MassAboutDom = {\n\t/** Fine print dom shown between the cohort specific content and the server info */\n\tcohortAsterisk?: Div\n\t/** Displays description */\n\tcohortDescription: Div\n\t/** Div for cohort radio buttons */\n\tcohortOpts?: Div\n\t/** Text above radio cohort options */\n\tcohortPrompt?: Div\n\t/** */\n\tcohortTable?: Div\n\t/** Title above the cohort introduction/content */\n\tcohortTitle?: H2\n}\n//TODO: Make a validate opts fn\nexport class MassAbout {\n\tstatic type = 'about'\n\n\taboutOverrides: AboutObj | null\n\tapp: AppApi\n\tdom: MassAboutDom\n\tinstanceNum: number\n\tselectCohort: SelectCohortEntry | null\n\tsubheader: Elem // where all contents are rendered\n\ttype: string\n\topts: MassAboutOpts\n\tstate: any\n\n\tconstructor(opts: MassAboutOpts) {\n\t\tthis.opts = opts\n\t\tthis.type = MassAbout.type\n\t\tthis.app = opts.app\n\t\tthis.subheader = opts.subheader\n\t\tthis.instanceNum = opts.instanceNum\n\t\tthis.aboutOverrides = opts.aboutOverrides\n\t\tthis.selectCohort = opts.selectCohort\n\t\tthis.dom = {\n\t\t\tcohortDescription: this.subheader\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-desc')\n\t\t\t\t.style('margin-left', '10px')\n\t\t}\n\n\t\tif (opts?.selectCohort?.title) {\n\t\t\tthis.dom.cohortTitle = opts.subheader\n\t\t\t\t.append('h2')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-title')\n\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t.text(opts.selectCohort.title)\n\t\t}\n\n\t\tif (opts.selectCohort?.prompt) {\n\t\t\tthis.dom.cohortPrompt = this.subheader\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-prompt')\n\t\t\t\t.style('margin-left', '10px')\n\t\t\t\t.style('padding-top', '30px')\n\t\t\t\t.style('padding-bottom', '10px')\n\t\t\t\t.style('font-weight', 'bold')\n\t\t\t\t.style('font-size', '1.2em')\n\t\t\t\t.text(opts.selectCohort.prompt)\n\t\t}\n\n\t\tif (opts.selectCohort) {\n\t\t\tthis.dom.cohortOpts = this.subheader.append('div').style('margin-bottom', '30px').style('margin-left', '10px')\n\t\t}\n\t}\n\n\t/* render all contents into this.subheader\n\tdo it through init() means that contents are rendered just once on launching mass ui and won't be rerendered or updated\n\tsince there's no reason to update about tab contents while user is interacting with mass ui\n\t*/\n\tinit(appState) {\n\t\t/** If selectCohort available, options in the about html will not show */\n\t\tthis.initCohort(appState)\n\t\tthis.initCustomHtml()\n\t\tthis.initActiveItems()\n\t\tthis.initDisclaimer()\n\t\t//Always show the release version and server launch date at the bottom\n\t\tthis.showServerInfo()\n\t}\n\n\tasync main() {\n\t\t// do not render unless the cohort tab is active\n\t\tif (this.state.nav.activeTab !== 0) return\n\t\tawait this.renderCohortsTable()\n\t\tif (this.opts.selectCohort) {\n\t\t\tif (this.opts.selectCohort.description) {\n\t\t\t\tthis.dom.cohortDescription.html(this.opts.selectCohort.description)\n\t\t\t} else if (this.opts.selectCohort.descriptionByCohort) {\n\t\t\t\tthis.dom.cohortDescription.html(\n\t\t\t\t\tthis.opts.selectCohort.descriptionByCohort[\n\t\t\t\t\t\tthis.state.termdbConfig.selectCohort.values[this.state.activeCohort].keys.join(',')\n\t\t\t\t\t]\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\tinitCohort = appState => {\n\t\tif (this.selectCohort == null) return\n\t\t//Move to validate opts fn\n\t\tif (!this.selectCohort.values) return\n\n\t\tconst instanceNum = this.instanceNum\n\t\tconst activeCohort = appState.activeCohort\n\t\tconst app = this.app\n\n\t\t//TODO: replace with make_radios\n\t\tthis.dom\n\t\t\t.cohortOpts!.append('table')\n\t\t\t.attr('data-testid', 'sjpp-about-cohort-options-table')\n\t\t\t.selectAll('tr')\n\t\t\t.data(this.selectCohort.values)\n\t\t\t.enter()\n\t\t\t.append('tr')\n\t\t\t.each(function (d, i, nodes) {\n\t\t\t\tconst tr = select(nodes[i])\n\t\t\t\tconst td0 = tr.append('td')\n\t\t\t\tconst radioName = 'sja-termdb-cohort-' + instanceNum\n\t\t\t\tconst radioId = radioName + '-' + i\n\t\t\t\ttd0\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.style('scale', '1.2')\n\t\t\t\t\t.attr('type', 'radio')\n\t\t\t\t\t.attr('name', radioName)\n\t\t\t\t\t.attr('id', radioId)\n\t\t\t\t\t.attr('value', i)\n\t\t\t\t\t.property('checked', i === activeCohort)\n\t\t\t\t\t.style('margin-right', '5px')\n\t\t\t\t\t.style('margin-left', '0px')\n\t\t\t\t\t.on('click', async event => {\n\t\t\t\t\t\tconst state = app.getState()\n\t\t\t\t\t\tconst clearOnChange = state.termdbConfig.selectCohort.clearOnChange\n\t\t\t\t\t\tif (clearOnChange) {\n\t\t\t\t\t\t\tconst subactions: any[] = []\n\t\t\t\t\t\t\tconst toBeCleared: string[] = []\n\t\t\t\t\t\t\tconst plots = state.plots\n\t\t\t\t\t\t\tconst filter = state.termfilter.filter.lst.find(f => f.tag == 'filterUiRoot')?.lst\n\t\t\t\t\t\t\tconst groups = state.groups\n\n\t\t\t\t\t\t\tif (clearOnChange.plots && plots?.length) toBeCleared.push('plots')\n\t\t\t\t\t\t\tfor (const plot of plots) {\n\t\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\t\ttype: 'plot_delete',\n\t\t\t\t\t\t\t\t\tid: plot.id\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (clearOnChange.filter && filter?.length) toBeCleared.push('filters')\n\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\ttype: 'filter_replace',\n\t\t\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t\t\ttype: 'tvslst',\n\t\t\t\t\t\t\t\t\tin: true,\n\t\t\t\t\t\t\t\t\tjoin: '',\n\t\t\t\t\t\t\t\t\ttag: 'filterUiRoot',\n\t\t\t\t\t\t\t\t\tlst: []\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (clearOnChange.groups && groups?.length) {\n\t\t\t\t\t\t\t\ttoBeCleared.push('groups')\n\t\t\t\t\t\t\t\tfor (const group of groups) {\n\t\t\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\t\t\ttype: 'delete_group',\n\t\t\t\t\t\t\t\t\t\tname: group.name\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfor (const term of state.customTerms) {\n\t\t\t\t\t\t\t\t\tsubactions.push({\n\t\t\t\t\t\t\t\t\t\ttype: 'delete_customTerm',\n\t\t\t\t\t\t\t\t\t\tname: term.name\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsubactions.push({ type: 'cohort_set', activeCohort: i })\n\t\t\t\t\t\t\tif (toBeCleared.length) {\n\t\t\t\t\t\t\t\tconst confirm = window.confirm(\n\t\t\t\t\t\t\t\t\t`Changing the cohort will clear all ${joinByComma(\n\t\t\t\t\t\t\t\t\t\ttoBeCleared\n\t\t\t\t\t\t\t\t\t)}. To proceed, click \"OK\". To save the session, click \"Cancel\" and then click the \"Session\" button at the top of the page.`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tif (!confirm) {\n\t\t\t\t\t\t\t\t\tevent.preventDefault()\n\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tapp.dispatch({\n\t\t\t\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\t\t\t\tsubactions\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else app.dispatch({ type: 'cohort_set', activeCohort: i })\n\t\t\t\t\t})\n\n\t\t\t\ttd0\n\t\t\t\t\t.append('label')\n\t\t\t\t\t.style('font-size', '1.4em')\n\t\t\t\t\t.attr('for', radioId)\n\t\t\t\t\t.attr('colspan', 2)\n\t\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t\t.html((d: any) => d.label)\n\n\t\t\t\ttr.selectAll('td')\n\t\t\t\t\t.style('max-width', '600px')\n\t\t\t\t\t.style('padding-bottom', '10px')\n\t\t\t\t\t.style('padding-right', '20px')\n\t\t\t\t\t.style('vertical-align', 'top')\n\t\t\t})\n\n\t\tthis.dom.cohortTable = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-about-cohort-table')\n\t\t\t.style('margin-left', '12px')\n\n\t\tif (this.selectCohort.asterisk) {\n\t\t\tthis.dom.cohortAsterisk = this.subheader\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-about-cohort-asterisk')\n\t\t\t\t.style('margin', '10px')\n\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t.text(this.selectCohort.asterisk)\n\t\t}\n\t}\n\n\trenderCohortsTable = async () => {\n\t\tif (!this.dom.cohortTable) return\n\t\tthis.dom.cohortTable.selectAll('*').remove()\n\t\tconst columns = [{ label: 'Feature' }]\n\t\tconst rows: TableRow[] = []\n\t\tconst result = await this.app.vocabApi.getCohortsData()\n\t\tif ('error' in result) throw result.error\n\t\tif (this.selectCohort?.values) {\n\t\t\t// selectCohort.values[] contains ordered set of cohorts\n\t\t\t// ensure cohorts in cohorts table follow this order\n\t\t\tconst values = this.selectCohort.values\n\t\t\tresult.cohorts.sort((a, b) => {\n\t\t\t\tconst aIndex = values.findIndex(v => v.keys.toString() == a.cohort)\n\t\t\t\tconst bIndex = values.findIndex(v => v.keys.toString() == b.cohort)\n\t\t\t\tif (aIndex < bIndex) return -1\n\t\t\t\tif (aIndex > bIndex) return 1\n\t\t\t\treturn 0\n\t\t\t})\n\t\t}\n\t\tif (!result.cfeatures.length) return\n\t\tfor (const feature of result.features) rows.push([{ value: feature.name }])\n\t\tfor (const cohort of result.cohorts) {\n\t\t\tif (cohort.subcohorts?.length) continue\n\t\t\tcolumns.push({ label: cohort.name })\n\t\t\tfor (const [i, feature] of result.features.entries()) {\n\t\t\t\tconst cf = result.cfeatures.find(cf => cf.idfeature === feature.idfeature && cf.cohort === cohort.cohort)\n\t\t\t\tif (cf) rows[i].push({ value: cf.value })\n\t\t\t}\n\t\t}\n\n\t\trenderTable({\n\t\t\trows,\n\t\t\tcolumns,\n\t\t\tdiv: this.dom.cohortTable,\n\t\t\tshowLines: false,\n\t\t\tmaxHeight: '60vh',\n\t\t\theader: { style: { 'font-size': '1.2em', 'font-weight': 'bold' } }\n\t\t})\n\n\t\tthis.dom.cohortTable.select('table').style('border-collapse', 'collapse')\n\t\tthis.dom.cohortTable.selectAll(`tbody > tr > td`).style('background-color', 'transparent').style('padding', '6px')\n\t\tconst state = this.app.getState()\n\t\tconst selectCohort = state.termdbConfig.selectCohort\n\t\tconst activeCohort = state.activeCohort\n\t\tconst keys = selectCohort.values[activeCohort].keys\n\t\tlet selector = `tbody > tr > td:nth-child(${activeCohort + 2})`\n\t\tconst combined = keys.length > 1\n\t\tif (combined) {\n\t\t\tselector = ''\n\t\t\tfor (const key of keys) {\n\t\t\t\tconst i = result.cohorts.map(c => c.cohort).indexOf(key)\n\t\t\t\tif (selector !== '') selector += ','\n\t\t\t\tselector += `tbody > tr > td:nth-child(${i + 2})`\n\t\t\t}\n\t\t}\n\t\tconst activeColumns = this.dom.cohortTable.selectAll(selector)\n\t\tconst color = state.termdbConfig.massNav?.activeColor || cohortTableActiveColor\n\t\tactiveColumns.style('background-color', color)\n\t}\n\n\tinitCustomHtml = () => {\n\t\tif (this.selectCohort != null) return\n\t\tif (!this.aboutOverrides?.html) return\n\t\tthis.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-custom-about-content')\n\t\t\t.style('padding', '10px')\n\t\t\t.html(this.aboutOverrides.html)\n\t}\n\n\tinitActiveItems = () => {\n\t\tif (!this.aboutOverrides?.activeItems) return\n\n\t\t// todo: customize general holder by activeItems.holderStyle{}\n\t\tconst div = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-custom-about-activeItems')\n\t\t\t.style('padding', '0px 0px 10px 20px')\n\n\t\tfor (const item of this.aboutOverrides.activeItems.items) {\n\t\t\t// todo: by item.type, item.divStyle{}\n\t\t\tdiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('margin', '5px')\n\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t.attr('data-testid', 'sjpp-custom-active-item-btn')\n\t\t\t\t.html(item.title)\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\t/* First, set the active tab to toggle to the plots tab and wait for the tab to be set,\n\t\t\t\t\totherwise the plotDiv is hidden when rendering and\n\t\t\t\t\tmay cause issues. A known issue is that getMaxLabelWidth getBBox on a hidden div returns width=0\n\t\t\t\t\tthis affects the legend rendering in plots like the scatter resulting in overlapping texts\n\t\t\t\t\t*/\n\t\t\t\t\tawait this.app.dispatch({\n\t\t\t\t\t\ttype: 'tab_set',\n\t\t\t\t\t\tactiveTab: 1\n\t\t\t\t\t})\n\t\t\t\t\t// after switching tab so plot div is shown, dispatch to create the plot\n\t\t\t\t\tthis.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tid: getId(),\n\t\t\t\t\t\tconfig: structuredClone(item.plot)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t}\n\t}\n\n\tinitDisclaimer = () => {\n\t\tconst d = this.aboutOverrides?.disclaimer\n\t\tif (!d) return\n\t\t// customize styling from d{}\n\t\tconst div = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-custom-about-disclaimer')\n\t\t\t.style('margin', '10px 0 20px 10px')\n\t\t\t.style('opacity', 0.7)\n\t\t\t.style('padding', '10px')\n\t\t\t.style('background-color', '#f8f9fa')\n\t\t\t.style('border-left', '4px solid #6c757d')\n\t\t\t.style('font-size', '0.8em')\n\t\tdiv.append('div').style('margin-bottom', '8px').style('font-weight', 'bold').text('DISCLAIMER')\n\t\tdiv.append('div').text(d.text)\n\t}\n\n\tshowServerInfo = () => {\n\t\tconst state = this.app.getState()\n\t\tconst about = state.termdbConfig.massNav?.tabs?.about\n\t\tif (!about && !this.app.opts.pkgver && !this.app.opts.launchDate) return\n\t\tconst dataRelease = about?.dataRelease\n\t\tconst additionalInfo = about?.additionalInfo\n\t\tconst div = this.subheader\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-about-server-info')\n\t\t\t.style('margin', '10px')\n\t\t\t.style('font-size', '.8em')\n\n\t\tconst htmlArr: string[] = []\n\t\tif (dataRelease) {\n\t\t\thtmlArr.push(`Data Release: <a href=${dataRelease.link} target=_blank>${dataRelease.version}</a>`)\n\t\t}\n\t\tif (this.app.opts.pkgver) {\n\t\t\thtmlArr.push(\n\t\t\t\t`Software Release: <a href=https://github.com/stjude/proteinpaint/pkgs/container/ppfull target=_blank>${this.app.opts.pkgver}</a>`\n\t\t\t)\n\t\t}\n\t\tif (this.app.opts.launchDate) {\n\t\t\thtmlArr.push(`Server Launched: ${this.app.opts.launchDate}`)\n\t\t}\n\t\tif (additionalInfo) {\n\t\t\thtmlArr.push(additionalInfo)\n\t\t}\n\t\tdiv.append('div').html(htmlArr.join('; '))\n\t}\n}\n\nexport const aboutInit = getCompInit(MassAbout)\n\nfunction joinByComma(arr) {\n\tif (!arr.length) return ''\n\telse if (arr.length == 1) return arr[0]\n\telse if (arr.length == 2) return arr.join(' and ')\n\telse return `${arr.slice(0, -1).join(', ')}, and ${arr.slice(-1)}`\n}\n", "import { getCompInit, type RxComponent } from '#rx'\nimport type { MassAppApi } from './types/mass'\nimport { Menu } from '#dom'\nimport { keyupEnter } from '#src/client'\nimport { dofetch3 } from '#common/dofetch'\nimport type { ChatRequest, ChatResponse } from '#types'\nimport { sayerror } from '../dom/sayerror.ts'\nimport { select } from 'd3-selection'\n\nconst MIN_PROMPT_LENGTH_FOR_OMNISEARCH = 3 // Set a minimum prompt length for omnisearch to trigger\nconst MAX_PROMPT_LENGTH_FOR_OMNISEARCH = 15 // Set a maximum prompt length for omnisearch to trigger\nconst MIN_PROMPT_LENGTH_FOR_CHAT = 5 // Set a minimum prompt length for chat submission\n\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\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 ? this.opts.usecase : { target: 'summary', detail: 'term' }\n\t\tthis.opts.targetType = this.opts.targetType ? this.opts.targetType : 'Dictionary Variables'\n\t\tsetRenderers(this) // needed so that this.showTerms, noResult, clear work\n\t}\n\n\tgetState(appState) {\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\tthis.initDom()\n\t}\n\n\t// Search method, adapted from MassSearch.doSearch\n\tasync doSearch(prompt: string) {\n\t\tif (!prompt) {\n\t\t\tthis.clear({ hide: true })\n\t\t\treturn\n\t\t}\n\t\tconst cohortStr = this.getState(this.app.getState()).cohortStr\n\t\tconst data = await this.app.vocabApi.findTerm(prompt, cohortStr, this.opts.usecase, this.opts.targetType)\n\t\tif (!data.lst || data.lst.length == 0) {\n\t\t\t// Show the \"No match...\" message one time at the first miss\n\t\t\tif (!this.dom.noMatchShown) {\n\t\t\t\tthis.dom.noMatchShown = true\n\t\t\t\tthis.noResult()\n\t\t\t}\n\t\t} else {\n\t\t\tthis.dom.noMatchShown = false\n\t\t\tthis.showTerms(data)\n\t\t}\n\t}\n\n\tinitDom() {\n\t\t//const cohortStr = this.getState(appState).cohortStr\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', '200px')\n\t\t\t\t.style('overflow', 'auto')\n\t\t\t\t.style('scroll-behavior', 'smooth')\n\t\t}\n\n\t\tconst inputSel = this.dom.div\n\t\t\t.append('input')\n\t\t\t.attr('type', 'search')\n\t\t\t.style('margin', '15px')\n\t\t\t.style('padding', '17px')\n\t\t\t.style('border-radius', '34px')\n\t\t\t.attr('size', 70)\n\t\t\t.attr('placeholder', 'What are you looking for?')\n\n\t\t// Store the input node so the search result tip can position under it\n\t\tthis.dom.inputNode = inputSel.node()\n\n\t\t// Result panel inside the tip, mirroring MassSearch.initUI\n\t\tthis.dom.resultDiv = this.dom.tip.d\n\t\t\t.style('border-left', 'solid 1px rgb(133,182,225)')\n\t\t\t.style('padding-left', '5px')\n\t\t\t.attr('tabindex', -1)\n\n\t\tinputSel\n\t\t\t.on('keyup.search', async (event: KeyboardEvent) => {\n\t\t\t\tif (keyupEnter(event)) return\n\t\t\t\tconst prompt = (event.target as HTMLInputElement).value.trim()\n\t\t\t\tif (!prompt) {\n\t\t\t\t\tthis.dom.noMatchShown = false\n\t\t\t\t\tthis.clear({ hide: true })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (MIN_PROMPT_LENGTH_FOR_OMNISEARCH <= prompt.length && prompt.length <= MAX_PROMPT_LENGTH_FOR_OMNISEARCH) {\n\t\t\t\t\t//console.log(\n\t\t\t\t\t//\t`User prompt: \"${prompt}\", cohortStr: \"${cohortStr}\", usecase: \"${this.opts.usecase}\", targetType: \"${this.opts.targetType}\"`\n\t\t\t\t\t//)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.doSearch(prompt) // Search as user types\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tif (e.stack) console.log(e.stack)\n\t\t\t\t\t\tsayerror(this.dom.resultDiv, 'Error: ' + (e.message || e))\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.dom.noMatchShown = false\n\t\t\t\t\tthis.clear({ hide: true })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('keyup.submit', async event => {\n\t\t\t\tif (!keyupEnter(event)) return\n\t\t\t\tconst prompt = event.target.value.trim()\n\t\t\t\tif (!prompt) return\n\t\t\t\tthis.addBubble({ msg: prompt, me: 1 })\n\t\t\t\tevent.target.value = ''\n\t\t\t\tconst serverBubble = this.addBubble({ msg: '...' })\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\tthis.app.dispatch({\n\t\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\t\tconfig: result.plot\n\t\t\t\t\t\t})\n\t\t\t\t\t\tserverBubble.text(`${result.msg ? result.msg + '. ' : ''}Please refer to the plot generated below.`)\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\tmain() {\n\t\t/** Comment because main() is required for RxComponent\n\t\t * but chat does not have any main logic for now. May add in the future.*/\n\t}\n}\n\nexport const chatInit = getCompInit(MassAiChatBot)\n\n// Minimal renderers ported from MassSearch\nfunction setRenderers(self) {\n\tself.noResult = () => {\n\t\tself.clear()\n\t\tself.dom.resultDiv\n\t\t\t.append('div')\n\t\t\t.text('No match. Using the chatbot...')\n\t\t\t.style('padding', '3px 3px 3px 0px')\n\t\t\t.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 => {\n\t\tif (self.opts.disable_terms)\n\t\t\tdata.lst.forEach(t => {\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\tself.showTerm = function (term) {\n\t\tconst tr = select(this)\n\t\tconst button = tr.append('td').text(term.name)\n\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\tif (self.state?.nav?.activeTab == 0) {\n\t\t\t\t\t\tawait self.app.dispatch({ type: 'tab_set', activeTab: 1 })\n\t\t\t\t\t}\n\t\t\t\t\tself.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tchartType: term.type == 'survival' ? 'survival' : 'summary',\n\t\t\t\t\t\t\tterm: { term }\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tself.dom.inputNode.value = '' // clear the search box\n\t\t\t\t\tself.clear({ hide: true })\n\t\t\t\t})\n\t\t} else {\n\t\t\tbutton.style('padding', '5px 10px').style('opacity', 0.5)\n\t\t}\n\n\t\ttr.append('td')\n\t\t\t.text((term.__ancestorNames || []).join(' > '))\n\t\t\t.style('opacity', 0.5)\n\t\t\t.style('font-size', '.7em')\n\t}\n\n\tself.clear = (opts: any = {}) => {\n\t\tself.dom.tip.clear()\n\t\tif (opts.hide) self.dom.tip.hide()\n\t\telse self.dom.tip.showunder(self.dom.inputNode)\n\t}\n}\n", "import { getCompInit, multiInit } from '#rx'\nimport { recoverInit } from '../rx/src/recover'\nimport { searchInit } from './search'\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 chatTab = { top: 'CHAT', mid: '', btm: '', subheader: 'chat' }\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\tsearch: searchInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tholder: this.dom.searchDiv,\n\t\t\t\t\tusecase: { target: 'summary', detail: 'term' },\n\t\t\t\t\ttargetType: 'Dictionary Variables'\n\t\t\t\t}),\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/** For now, limit to only datasets with chat enabled.\n\t\t * In the future, may show search instead of chat but use\n\t\t * the same component. */\n\t\tif (appState.termdbConfig?.queries?.chat && !massNav.tabs?.chat?.hide) {\n\t\t\tself.tabs.push(chatTab)\n\t\t\tObject.assign(chatTab, massNav.tabs?.chat)\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 { rowNum: i, key, colNum, label: row[key], subheader: row.subheader }\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('cursor', 'pointer')\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//Reset the activeTab to the current tab if no tab is selected\n\t\tif (self.activeTab == -1) self.activeTab == d.colNum\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", "setRenderers", "prompt", "event", "setInteractivity", "setRenderers", "appState", "event"]
|
|
7
|
+
}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
addGeneSearchbox,
|
|
3
3
|
isoformSelect,
|
|
4
4
|
sayerror
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-APO4BA2P.js";
|
|
6
6
|
import {
|
|
7
7
|
Menu
|
|
8
8
|
} from "./chunk-HYOEWQ5P.js";
|
|
@@ -114,4 +114,4 @@ export {
|
|
|
114
114
|
SearchHandler,
|
|
115
115
|
filterIsoforms
|
|
116
116
|
};
|
|
117
|
-
//# sourceMappingURL=chunk-
|
|
117
|
+
//# sourceMappingURL=chunk-HOHQUGVI.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
addGeneSearchbox,
|
|
3
3
|
getSCGEunit
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-APO4BA2P.js";
|
|
5
5
|
import {
|
|
6
6
|
Menu
|
|
7
7
|
} from "./chunk-HYOEWQ5P.js";
|
|
@@ -47,4 +47,4 @@ var SearchHandler = class {
|
|
|
47
47
|
export {
|
|
48
48
|
SearchHandler
|
|
49
49
|
};
|
|
50
|
-
//# sourceMappingURL=chunk-
|
|
50
|
+
//# sourceMappingURL=chunk-IVIWWCEK.js.map
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
keyupEnter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-APO4BA2P.js";
|
|
4
4
|
import {
|
|
5
5
|
require_debounce
|
|
6
6
|
} from "./chunk-LSEFWW72.js";
|
|
7
|
+
import {
|
|
8
|
+
Menu
|
|
9
|
+
} from "./chunk-HYOEWQ5P.js";
|
|
7
10
|
import {
|
|
8
11
|
dofetch,
|
|
9
12
|
dofetch3
|
|
@@ -92,4 +95,4 @@ export {
|
|
|
92
95
|
gene_searchbox,
|
|
93
96
|
findgenemodel_bysymbol
|
|
94
97
|
};
|
|
95
|
-
//# sourceMappingURL=chunk-
|
|
98
|
+
//# sourceMappingURL=chunk-JDKWYNT6.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/gene.js"],
|
|
4
|
+
"sourcesContent": ["import * as client from './client'\nimport { dofetch3 } from '#common/dofetch'\nimport { debounce } from 'debounce'\n\nlet tip\n\nexport function gene_searchbox(p) {\n\tif (!tip) {\n\t\ttip = new client.Menu({ padding: '' })\n\t\ttip.d.style('z-index', 1000)\n\t}\n\n\t/*\nmake a <input> to search for gene names as you type into it\nmatching genes are shown beneath the input\n\n.div\n.width: 100px\n.genome\n.callback\n.tip (optional)\n.resultdiv (optional)\n\nif .resultdiv is provided, show gene list inside <div>;\nif .tip is provided, show under <input> to show matches;\notherwise to show in tip\n*/\n\t// for auto gene column, show\n\tconst input = p.div\n\t\t.append('input')\n\t\t.attr('placeholder', 'Search gene')\n\t\t.style('width', p.width || '100px')\n\n\tconst printdiv = p.resultdiv || (p.tip ? p.tip.d : tip.d)\n\n\tfunction fold() {\n\t\tif (p.resultdiv) {\n\t\t\tp.resultdiv.selectAll('*').remove()\n\t\t} else if (p.tip) {\n\t\t\tp.tip.hide()\n\t\t} else {\n\t\t\ttip.hide()\n\t\t}\n\t}\n\n\tinput.on('keyup', event => {\n\t\tconst str = event.target.value\n\t\tif (str.length <= 1) {\n\t\t\tfold()\n\t\t\treturn\n\t\t}\n\n\t\tif (client.keyupEnter(event)) {\n\t\t\tconst hitgene = printdiv.select('.sja_menuoption')\n\t\t\tif (hitgene.size() > 0) {\n\t\t\t\tp.callback(hitgene.text())\n\t\t\t\tfold()\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t\tdebouncer()\n\t})\n\tinput.node().focus()\n\n\tfunction genesearch() {\n\t\tclient\n\t\t\t.dofetch('genelookup', { genome: p.genome, input: input.property('value') })\n\t\t\t.then(data => {\n\t\t\t\tif (data.error) throw data.error\n\t\t\t\tif (!data.hits) throw '.hits[] missing'\n\n\t\t\t\tif (p.resultdiv) {\n\t\t\t\t\tp.resultdiv.selectAll('*').remove()\n\t\t\t\t} else if (p.tip) {\n\t\t\t\t\tp.tip.clear().showunder(input.node())\n\t\t\t\t} else {\n\t\t\t\t\ttip.clear().showunder(input.node())\n\t\t\t\t}\n\n\t\t\t\tfor (const name of data.hits) {\n\t\t\t\t\tprintdiv\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t\t.text(name)\n\t\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\t\tp.callback(name)\n\t\t\t\t\t\t\tfold()\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(err => {\n\t\t\t\tprintdiv.append('div').text(err.message || err)\n\t\t\t\tif (err.stack) console.log(err.stack)\n\t\t\t})\n\t}\n\tconst debouncer = debounce(genesearch, 300)\n}\n\nexport function findgenemodel_bysymbol(genome, str) {\n\treturn dofetch3('genelookup', {\n\t\tbody: {\n\t\t\tdeep: 1,\n\t\t\tinput: str,\n\t\t\tgenome: genome\n\t\t}\n\t})\n\t\t.then(data => {\n\t\t\tif (data.error) throw data.error\n\t\t\tif (!data.gmlst || data.gmlst.length == 0) return null\n\t\t\treturn data.gmlst\n\t\t})\n\t\t.catch(e => {\n\t\t\tthrow e\n\t\t})\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAEA,sBAAyB;AAEzB,IAAI;AAEG,SAAS,eAAe,GAAG;AACjC,MAAI,CAAC,KAAK;AACT,UAAM,IAAW,KAAK,EAAE,SAAS,GAAG,CAAC;AACrC,QAAI,EAAE,MAAM,WAAW,GAAI;AAAA,EAC5B;AAkBA,QAAM,QAAQ,EAAE,IACd,OAAO,OAAO,EACd,KAAK,eAAe,aAAa,EACjC,MAAM,SAAS,EAAE,SAAS,OAAO;AAEnC,QAAM,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,IAAI,IAAI;AAEvD,WAAS,OAAO;AACf,QAAI,EAAE,WAAW;AAChB,QAAE,UAAU,UAAU,GAAG,EAAE,OAAO;AAAA,IACnC,WAAW,EAAE,KAAK;AACjB,QAAE,IAAI,KAAK;AAAA,IACZ,OAAO;AACN,UAAI,KAAK;AAAA,IACV;AAAA,EACD;AAEA,QAAM,GAAG,SAAS,WAAS;AAC1B,UAAM,MAAM,MAAM,OAAO;AACzB,QAAI,IAAI,UAAU,GAAG;AACpB,WAAK;AACL;AAAA,IACD;AAEA,QAAW,WAAW,KAAK,GAAG;AAC7B,YAAM,UAAU,SAAS,OAAO,iBAAiB;AACjD,UAAI,QAAQ,KAAK,IAAI,GAAG;AACvB,UAAE,SAAS,QAAQ,KAAK,CAAC;AACzB,aAAK;AAAA,MACN;AACA;AAAA,IACD;AACA,cAAU;AAAA,EACX,CAAC;AACD,QAAM,KAAK,EAAE,MAAM;AAEnB,WAAS,aAAa;AACrB,IACE,QAAQ,cAAc,EAAE,QAAQ,EAAE,QAAQ,OAAO,MAAM,SAAS,OAAO,EAAE,CAAC,EAC1E,KAAK,UAAQ;AACb,UAAI,KAAK,MAAO,OAAM,KAAK;AAC3B,UAAI,CAAC,KAAK,KAAM,OAAM;AAEtB,UAAI,EAAE,WAAW;AAChB,UAAE,UAAU,UAAU,GAAG,EAAE,OAAO;AAAA,MACnC,WAAW,EAAE,KAAK;AACjB,UAAE,IAAI,MAAM,EAAE,UAAU,MAAM,KAAK,CAAC;AAAA,MACrC,OAAO;AACN,YAAI,MAAM,EAAE,UAAU,MAAM,KAAK,CAAC;AAAA,MACnC;AAEA,iBAAW,QAAQ,KAAK,MAAM;AAC7B,iBACE,OAAO,KAAK,EACZ,KAAK,SAAS,gBAAgB,EAC9B,KAAK,IAAI,EACT,GAAG,SAAS,MAAM;AAClB,YAAE,SAAS,IAAI;AACf,eAAK;AAAA,QACN,CAAC;AAAA,MACH;AAAA,IACD,CAAC,EACA,MAAM,SAAO;AACb,eAAS,OAAO,KAAK,EAAE,KAAK,IAAI,WAAW,GAAG;AAC9C,UAAI,IAAI,MAAO,SAAQ,IAAI,IAAI,KAAK;AAAA,IACrC,CAAC;AAAA,EACH;AACA,QAAM,gBAAY,0BAAS,YAAY,GAAG;AAC3C;AAEO,SAAS,uBAAuB,QAAQ,KAAK;AACnD,SAAO,SAAS,cAAc;AAAA,IAC7B,MAAM;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,IACD;AAAA,EACD,CAAC,EACC,KAAK,UAAQ;AACb,QAAI,KAAK,MAAO,OAAM,KAAK;AAC3B,QAAI,CAAC,KAAK,SAAS,KAAK,MAAM,UAAU,EAAG,QAAO;AAClD,WAAO,KAAK;AAAA,EACb,CAAC,EACA,MAAM,OAAK;AACX,UAAM;AAAA,EACP,CAAC;AACH;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
colorDelta,
|
|
3
3
|
getInterpolatedDomainRange,
|
|
4
4
|
removeOutliers
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-APO4BA2P.js";
|
|
6
6
|
import {
|
|
7
7
|
copyMerge
|
|
8
8
|
} from "./chunk-M3J4MINX.js";
|
|
@@ -511,4 +511,4 @@ export {
|
|
|
511
511
|
setLayout,
|
|
512
512
|
matrix_layout_exports
|
|
513
513
|
};
|
|
514
|
-
//# sourceMappingURL=chunk-
|
|
514
|
+
//# sourceMappingURL=chunk-JZ67QSUN.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
addGeneSearchbox
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-APO4BA2P.js";
|
|
4
4
|
import {
|
|
5
5
|
Menu
|
|
6
6
|
} from "./chunk-HYOEWQ5P.js";
|
|
@@ -51,4 +51,4 @@ var SearchHandler = class {
|
|
|
51
51
|
export {
|
|
52
52
|
SearchHandler
|
|
53
53
|
};
|
|
54
|
-
//# sourceMappingURL=chunk-
|
|
54
|
+
//# sourceMappingURL=chunk-KBTMTZ2D.js.map
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
} from "./chunk-CW2Q5EA7.js";
|
|
4
4
|
import {
|
|
5
5
|
hierCluster_interactivity_exports
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TVIKEQUO.js";
|
|
7
7
|
import {
|
|
8
8
|
Matrix
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-OHO2FGMM.js";
|
|
10
10
|
import {
|
|
11
11
|
filterJoin,
|
|
12
12
|
getNormalRoot
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-APO4BA2P.js";
|
|
14
14
|
import {
|
|
15
15
|
clusterMethodLst,
|
|
16
16
|
distanceMethodLst,
|
|
@@ -260,4 +260,4 @@ export {
|
|
|
260
260
|
hierClusterInit,
|
|
261
261
|
componentInit
|
|
262
262
|
};
|
|
263
|
-
//# sourceMappingURL=chunk-
|
|
263
|
+
//# sourceMappingURL=chunk-KRWLIZ6J.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
keyupEnter
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-APO4BA2P.js";
|
|
4
4
|
|
|
5
5
|
// src/block.mds.svcnv.share.js
|
|
6
6
|
function rnabamtk_initparam(c) {
|
|
@@ -126,4 +126,4 @@ export {
|
|
|
126
126
|
rnabamtk_initparam,
|
|
127
127
|
configPanel_rnabam
|
|
128
128
|
};
|
|
129
|
-
//# sourceMappingURL=chunk-
|
|
129
|
+
//# sourceMappingURL=chunk-KW5ZXPIM.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
fillbar,
|
|
3
3
|
make_table_2col
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-APO4BA2P.js";
|
|
5
5
|
|
|
6
6
|
// src/block.mds.expressionstat.js
|
|
7
7
|
var color_noinfo = "#858585";
|
|
@@ -269,4 +269,4 @@ export {
|
|
|
269
269
|
ase_color,
|
|
270
270
|
ui_config
|
|
271
271
|
};
|
|
272
|
-
//# sourceMappingURL=chunk-
|
|
272
|
+
//# sourceMappingURL=chunk-LLFZ4KNO.js.map
|