@sjcrh/proteinpaint-client 2.166.0 → 2.167.1
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-6M6QWXAQ.js +1364 -0
- package/dist/AIProjectAdmin-2NHMC3IV.js +780 -0
- package/dist/AppHeader-CTHEWSZD.js +813 -0
- package/dist/BoxPlot-3U6ZAKKO.js +44 -0
- package/dist/CorrelationVolcano-2ASIR6KY.js +616 -0
- package/dist/DifferentialAnalysis-C3NYGF7U.js +237 -0
- package/dist/Disco-2QLBZ3X5.js +3089 -0
- package/dist/Disco.UI-GPIIPM2P.js +238 -0
- package/dist/DziViewer-OHPZOH72.js +16328 -0
- package/dist/GB-FH6YQGHI.js +1099 -0
- package/dist/HicApp-TI2II3SZ.js +2218 -0
- package/dist/NumBinaryEditor-O42T63EX.js +259 -0
- package/dist/NumBinaryEditor.unit.spec-UMB2PHT5.js +277 -0
- package/dist/NumContEditor-7NOUKPCV.js +98 -0
- package/dist/NumContEditor.unit.spec-JGXJ2HLE.js +160 -0
- package/dist/NumCustomBinEditor-6CHN3KX3.js +29 -0
- package/dist/NumCustomBinEditor.unit.spec-RJPQLE3E.js +275 -0
- package/dist/NumDiscreteEditor-AFTUKU4K.js +145 -0
- package/dist/NumDiscreteEditor.unit.spec-GKR6ZNBQ.js +193 -0
- package/dist/NumRegularBinEditor-UJ5WQPHR.js +29 -0
- package/dist/NumRegularBinEditor.unit.spec-5HGJQEX7.js +220 -0
- package/dist/NumSplineEditor-JANA2DUE.js +181 -0
- package/dist/NumSplineEditor.unit.spec-UYAMAKZD.js +190 -0
- package/dist/NumericDensity-YE5R4CNP.js +29 -0
- package/dist/NumericDensity.unit.spec-SVEB5U2S.js +212 -0
- package/dist/NumericHandler-WW4M7YW2.js +30 -0
- package/dist/NumericHandler.unit.spec-2BWDFO53.js +210 -0
- package/dist/SC-UGJGMBL7.js +714 -0
- package/dist/Volcano-IU76MEIL.js +1018 -0
- package/dist/WSIViewer-3S7N4UDO.js +46959 -0
- package/dist/WsiSamplesPlot-4CAOHWCL.js +153 -0
- package/dist/adSandbox-AEBS3RTL.js +29 -0
- package/dist/alphaGenome-F2PB4SGI.js +170 -0
- package/dist/app-6SKETLMT.js +28 -0
- package/dist/app-GBEF2HBR.js +54 -0
- package/dist/app.js +16 -16
- package/dist/bam-5SE6XQJV.js +842 -0
- package/dist/barchart-AUSOT2XB.js +48 -0
- package/dist/barchart.data-GYCNBRPY.js +30 -0
- package/dist/barchart.events-QTSWNYXO.js +44 -0
- package/dist/barchart.integration.spec-LORJLJVX.js +1600 -0
- package/dist/bars.renderer-4N4QOUNI.js +12 -0
- package/dist/bars.settings-SDU7PZOS.js +10 -0
- package/dist/block-QLSIELXK.js +6291 -0
- package/dist/block.init-OOLEA6ZK.js +29 -0
- package/dist/block.mds.expressionrank-D2KUISXZ.js +350 -0
- package/dist/block.mds.geneboxplot-AMYBWXPS.js +819 -0
- package/dist/block.mds.junction-OG335MBK.js +1536 -0
- package/dist/block.mds.svcnv-WYDBQ6FV.js +6792 -0
- package/dist/block.svg-OH73245R.js +155 -0
- package/dist/block.tk.aicheck-CG5THFW2.js +274 -0
- package/dist/block.tk.ase-G2L3G5MQ.js +356 -0
- package/dist/block.tk.bam-DXWCA6EU.js +1897 -0
- package/dist/block.tk.bedgraphdot-LF3TFPNL.js +375 -0
- package/dist/block.tk.bigwig.ui-JKXZ3VDF.js +202 -0
- package/dist/block.tk.hicstraw-ZK4RKFB6.js +814 -0
- package/dist/block.tk.junction-ZB7Q2NLB.js +2355 -0
- package/dist/block.tk.junction.textmatrixui-ZYNQWKIW.js +190 -0
- package/dist/block.tk.ld-7H64HGER.js +90 -0
- package/dist/block.tk.menu-WFVKAH74.js +1020 -0
- package/dist/block.tk.pgv-632LLSBI.js +935 -0
- package/dist/brainImaging-AEPTHIQF.js +417 -0
- package/dist/chat-3XZCAFDD.js +142 -0
- package/dist/chat-3XZCAFDD.js.map +7 -0
- package/dist/chunk-22O6F463.js +619 -0
- package/dist/chunk-2HJ7OD7H.js +252 -0
- package/dist/chunk-2MN5JLZB.js +2878 -0
- package/dist/chunk-2OVIUIIL.js +1720 -0
- package/dist/chunk-2OVIUIIL.js.map +7 -0
- package/dist/chunk-37CK5IGW.js +480 -0
- package/dist/chunk-3JFEWVHR.js +80 -0
- package/dist/chunk-3MGBC64I.js +133 -0
- package/dist/chunk-3NWLWH4G.js +6364 -0
- package/dist/chunk-46T54RUY.js +1133 -0
- package/dist/chunk-46T54RUY.js.map +7 -0
- package/dist/chunk-4GKQ5PWY.js +142 -0
- package/dist/chunk-4PHD5H4A.js +226 -0
- package/dist/chunk-56IFQMJK.js +413 -0
- package/dist/chunk-5AMBV2JE.js +797 -0
- package/dist/chunk-5AMBV2JE.js.map +7 -0
- package/dist/chunk-5DMFTXUZ.js +158 -0
- package/dist/chunk-5QJDZHRU.js +95 -0
- package/dist/chunk-5WAVKWL6.js +1275 -0
- package/dist/chunk-6ISTNHM6.js +144 -0
- package/dist/chunk-6VQ4C735.js +1536 -0
- package/dist/chunk-74WMSW3E.js +229 -0
- package/dist/chunk-AFU66YOW.js +459 -0
- package/dist/chunk-AUJ2YUXV.js +14 -0
- package/dist/chunk-B65X5UQH.js +518 -0
- package/dist/chunk-B6I64LSV.js +634 -0
- package/dist/chunk-BAJ74DKS.js +419 -0
- package/dist/chunk-BAJ74DKS.js.map +7 -0
- package/dist/chunk-BTYCW3D5.js +85 -0
- package/dist/chunk-CCB5KYFQ.js +1415 -0
- package/dist/chunk-CKLYFA7H.js +467 -0
- package/dist/chunk-CLYRJ466.js +272 -0
- package/dist/chunk-CPHCZZWT.js +82 -0
- package/dist/chunk-CUADOD2T.js +217 -0
- package/dist/chunk-CV6ID6T7.js +422 -0
- package/dist/chunk-CWHBWY3B.js +190 -0
- package/dist/chunk-D53HBTYQ.js +238 -0
- package/dist/chunk-DDOM4XYV.js +1177 -0
- package/dist/chunk-DDOM4XYV.js.map +7 -0
- package/dist/chunk-DKI7YOTJ.js +196 -0
- package/dist/chunk-DNU4IPD2.js +165 -0
- package/dist/chunk-FN5XPUPH.js +83 -0
- package/dist/chunk-FN5XPUPH.js.map +7 -0
- package/dist/chunk-GLSDMBHR.js +55 -0
- package/dist/chunk-GLSDMBHR.js.map +7 -0
- package/dist/chunk-H3BSKMND.js +487 -0
- package/dist/chunk-H3BSKMND.js.map +7 -0
- package/dist/chunk-H6HP4H3U.js +2327 -0
- package/dist/chunk-HPEMEDXB.js +123 -0
- package/dist/chunk-HUDESZGX.js +1151 -0
- package/dist/chunk-ITJ2SXU5.js +467 -0
- package/dist/chunk-ITJ2SXU5.js.map +7 -0
- package/dist/chunk-J7IU77CA.js +166 -0
- package/dist/chunk-JMO7ENSD.js +381 -0
- package/dist/chunk-JTPN3BRG.js +129 -0
- package/dist/chunk-KCAMFDJH.js +323 -0
- package/dist/chunk-LD45BCVM.js +177 -0
- package/dist/chunk-LMELY5Z2.js +1412 -0
- package/dist/chunk-LVQK62CV.js +215 -0
- package/dist/chunk-MCVLRF66.js +157 -0
- package/dist/chunk-MK7RRJTX.js +1968 -0
- package/dist/chunk-MK7RRJTX.js.map +7 -0
- package/dist/chunk-MLD7DW5I.js +613 -0
- package/dist/chunk-NEF7LGNE.js +2789 -0
- package/dist/chunk-O7BAQPP3.js +256 -0
- package/dist/chunk-O7BAQPP3.js.map +7 -0
- package/dist/chunk-OARG7PAV.js +401 -0
- package/dist/chunk-OGCF6E6I.js +4947 -0
- package/dist/chunk-OGCF6E6I.js.map +7 -0
- package/dist/chunk-OGWY4MOB.js +748 -0
- package/dist/chunk-PQD6K5W5.js +2784 -0
- package/dist/chunk-Q4FYGFTQ.js +91 -0
- package/dist/chunk-QX5QVWUP.js +451 -0
- package/dist/chunk-QX5QVWUP.js.map +7 -0
- package/dist/chunk-RA2KI64U.js +303 -0
- package/dist/chunk-RHHLAKYS.js +1088 -0
- package/dist/chunk-RKV3CP4C.js +258 -0
- package/dist/chunk-RL7RU2V7.js +368 -0
- package/dist/chunk-RQ7CE7SK.js +161 -0
- package/dist/chunk-RX552WU6.js +1143 -0
- package/dist/chunk-S7V4SFKB.js +276 -0
- package/dist/chunk-SEL5UNRC.js +142 -0
- package/dist/chunk-SRBO57AD.js +297 -0
- package/dist/chunk-SYGLOTOV.js +1197 -0
- package/dist/chunk-TGZA4ETW.js +311 -0
- package/dist/chunk-TGZA4ETW.js.map +7 -0
- package/dist/chunk-UZ466XO3.js +203 -0
- package/dist/chunk-VDF5W47R.js +149 -0
- package/dist/chunk-W4SEWZF2.js +279 -0
- package/dist/chunk-W4SEWZF2.js.map +7 -0
- package/dist/chunk-W5EG334J.js +15083 -0
- package/dist/chunk-W5EG334J.js.map +7 -0
- package/dist/chunk-WTPVXDJT.js +31 -0
- package/dist/chunk-XRIM2YJZ.js +228 -0
- package/dist/chunk-YSWMQO23.js +55 -0
- package/dist/chunk-ZBZXIWSK.js +402 -0
- package/dist/chunk-ZFFHOEBE.js +117 -0
- package/dist/chunk-ZG63ZUDE.js +102 -0
- package/dist/chunk-ZGQ3BMLW.js +2676 -0
- package/dist/chunk-ZNINQ3FN.js +293 -0
- package/dist/chunk-ZQZWM544.js +4172 -0
- package/dist/condition-4FVKPSQ2.js +323 -0
- package/dist/controls-ZWBN566I.js +35 -0
- package/dist/controls.btns-H4TWTHTW.js +10 -0
- package/dist/controls.config-YU4W3CDL.js +31 -0
- package/dist/correlation-VADB4SQO.js +102 -0
- package/dist/cuminc-4BXE2YS6.js +1143 -0
- package/dist/cuminc.integration.spec-XQREKHVA.js +669 -0
- package/dist/customdata.inputui-VBQWT3M7.js +278 -0
- package/dist/dataDownload-QIZKBKH7.js +320 -0
- package/dist/dataDownload.integration.spec-MLJEHLYD.js +184 -0
- package/dist/databrowser.ui-6UIR4ULJ.js +426 -0
- package/dist/dictionary-FLWIWAC6.js +90 -0
- package/dist/e2pca-NKWSJRXM.js +341 -0
- package/dist/ep-EPN3AR6D.js +1247 -0
- package/dist/expclust.gdc.spec-ZRUH5E6E.js +298 -0
- package/dist/facet-BM7SLACF.js +437 -0
- package/dist/frequencyChart-HBXRIBAW.js +371 -0
- package/dist/frequencyChart.integration.spec-YJUYZWM6.js +301 -0
- package/dist/geneExpClustering-4VD5PAWN.js +242 -0
- package/dist/geneExpression-6OT2Y4P6.js +54 -0
- package/dist/geneExpression-EAMEZXJQ.js +310 -0
- package/dist/geneORA-RI2AG7JT.js +272 -0
- package/dist/geneVariant-FYYEOTWA.js +32 -0
- package/dist/geneVariant-PAKVDVC4.js +29 -0
- package/dist/genefusion.ui-QWC42XWQ.js +242 -0
- package/dist/geneset-XA6IWP3Q.js +186 -0
- package/dist/genomeBrowser.spec-LRKXWXNT.js +272 -0
- package/dist/grin2-O6TETVZ3.js +1044 -0
- package/dist/grin2-O6TETVZ3.js.map +7 -0
- package/dist/grin2-WLB7BY3S.js +1547 -0
- package/dist/gsea-ZM4WOPSQ.js +43 -0
- package/dist/hierCluster-LD43LLRC.js +60 -0
- package/dist/hierCluster-ZGYRS2WV.js +56 -0
- package/dist/hierCluster.config-O5HUOFNH.js +32 -0
- package/dist/hierCluster.integration.spec-37UNKHTH.js +389 -0
- package/dist/hierCluster.interactivity-B27ETKRP.js +45 -0
- package/dist/hierCluster.renderers-GWFH5ZX7.js +21 -0
- package/dist/imagePlot-LJZVGNDJ.js +134 -0
- package/dist/importPlot-RMVENQRD.js +8 -0
- package/dist/launch.adhoc-S3XHRSLN.js +36 -0
- package/dist/leftlabel.sample-J6PCA3UB.js +249 -0
- package/dist/lollipop-OZTV4C7A.js +159 -0
- package/dist/maf-3SRLCKGO.js +435 -0
- package/dist/maf-3SRLCKGO.js.map +7 -0
- package/dist/maftimeline-6F2LQJU6.js +584 -0
- package/dist/matrix-FIXOFAB4.js +60 -0
- package/dist/matrix-O5KPDLM2.js +55 -0
- package/dist/matrix.cells-SCLZA3P4.js +30 -0
- package/dist/matrix.config-WG7HFJL4.js +33 -0
- package/dist/matrix.controls-QQLBUUYP.js +31 -0
- package/dist/matrix.data-6JLF5HVI.js +35 -0
- package/dist/matrix.dom-QO7BXZ27.js +11 -0
- package/dist/matrix.groups-QMZMZ6Q7.js +26 -0
- package/dist/matrix.integration.spec-ZJYWNQ57.js +2936 -0
- package/dist/matrix.interactivity-ZZY5ET4E.js +36 -0
- package/dist/matrix.layout-XKFB4PKY.js +35 -0
- package/dist/matrix.legend-CS6DNC5V.js +22 -0
- package/dist/matrix.renderers-4LST6PBA.js +29 -0
- package/dist/matrix.serieses-3SERD6CV.js +21 -0
- package/dist/matrix.sort-UVS6WHIS.js +27 -0
- package/dist/matrix.sort.unit.spec-CTSUNUWB.js +464 -0
- package/dist/matrix.sorterUi-JDGLTLJM.js +18 -0
- package/dist/matrix.sorterUi.unit.spec-VQFMHIYI.js +335 -0
- package/dist/mavb-ECQ2CQ7F.js +723 -0
- package/dist/mds.fimo-JDYDT5NK.js +509 -0
- package/dist/mds.samplescatterplot-PEJBVSTO.js +1541 -0
- package/dist/mds.survivalplot-GYK6VRQT.js +474 -0
- package/dist/mutationSignature-43SECPTY.js +72 -0
- package/dist/numericDictTermCluster-2ER4FUKO.js +72 -0
- package/dist/oncomatrix-ZXDJMLN3.js +287 -0
- package/dist/oncomatrix.spec-HOPRIG3I.js +439 -0
- package/dist/plot.2dvaf-Y4SZUHLD.js +368 -0
- package/dist/plot.app-W5Z3C7P5.js +35 -0
- package/dist/plot.barplot-B2PRZDKV.js +93 -0
- package/dist/plot.boxplot-J7ET34FY.js +143 -0
- package/dist/plot.brainImaging-ISY4P6RT.js +51 -0
- package/dist/plot.disco-D7AL42PW.js +100 -0
- package/dist/plot.dzi-O32LH65U.js +33 -0
- package/dist/plot.ssgq-WF7262IZ.js +130 -0
- package/dist/plot.vaf2cov-OB6UKSFQ.js +250 -0
- package/dist/plot.wsi-J5S4YYXN.js +36 -0
- package/dist/polar-LIJORXR6.js +179 -0
- package/dist/profile.spec-3KE4CREI.js +71 -0
- package/dist/profileBarchart-UQHOJB5V.js +260 -0
- package/dist/profileForms-WTYVTIUN.js +365 -0
- package/dist/profilePlot-SOXXEUAT.js +50 -0
- package/dist/profileRadar-2OHJ2RIU.js +256 -0
- package/dist/profileRadarFacility-GHLG3QNG.js +256 -0
- package/dist/qualitative-B3OY7A7P.js +34 -0
- package/dist/regression-HO2TO4XT.js +57 -0
- package/dist/regression.inputs-JN3ZMIOP.js +49 -0
- package/dist/regression.inputs.term-67HVMXFZ.js +49 -0
- package/dist/regression.inputs.values.table-JXJK2YZT.js +46 -0
- package/dist/regression.integration.spec-L54ZS5VY.js +777 -0
- package/dist/regression.results-3ZSFKUNN.js +31 -0
- package/dist/regression.spec-SVWCQX2U.js +699 -0
- package/dist/report-IHX7XSOI.js +220 -0
- package/dist/runChart-QLQMK3OE.js +54 -0
- package/dist/runchart.integration.spec-5NVY5GHR.js +362 -0
- package/dist/sampleScatter.spec-4Q5CQQWH.js +193 -0
- package/dist/sampleView-7WHDFHB5.js +42 -0
- package/dist/samplelst-34GJVLVD.js +102 -0
- package/dist/samplematrix-L2HOSLUT.js +2189 -0
- package/dist/scatter-X6AAM2LJ.js +55 -0
- package/dist/scatter.integration.spec-QSH3PLBK.js +1026 -0
- package/dist/selectGenomeWithTklst-AJS2IPPW.js +125 -0
- package/dist/singleCellPlot-7JEWDVSR.js +50 -0
- package/dist/singlecell-IC5KU72L.js +1563 -0
- package/dist/singlecell-NWANPXWM.js +80 -0
- package/dist/snp-PSRNMTL6.js +73 -0
- package/dist/snplocus-QCAVDYLR.js +199 -0
- package/dist/spliceevent.a53ss.diagram-SGDJKUEC.js +142 -0
- package/dist/spliceevent.exonskip.diagram-BUYTHCK5.js +268 -0
- package/dist/spliceevent.noeventdiagram-OJZJUHXP.js +451 -0
- package/dist/ssGSEA-UUZG57MF.js +53 -0
- package/dist/stattable-324FS2HA.js +89 -0
- package/dist/summarizeCnvGeneexp-ZVZYWP43.js +136 -0
- package/dist/summarizeGeneexpSurvival-7XJRMT6M.js +90 -0
- package/dist/summarizeMutationDiagnosis-ZKLXOVY2.js +32 -0
- package/dist/summarizeMutationSurvival-S4YPGLWA.js +92 -0
- package/dist/summary-RVG7JL6Y.js +55 -0
- package/dist/summary.integration.spec-SCD35GO4.js +405 -0
- package/dist/summaryInput-DMN6DTSW.js +170 -0
- package/dist/sunburst-QZXYILRC.js +275 -0
- package/dist/survival-6CWEBRSF.js +41 -0
- package/dist/survival-J657VYLI.js +49 -0
- package/dist/survival.integration.spec-S5WE4V6M.js +601 -0
- package/dist/svgraph-NEKJL24M.js +1378 -0
- package/dist/svmr-5RQ5JQF2.js +3833 -0
- package/dist/table-CG6Z6NCJ.js +193 -0
- package/dist/termCollection-FOQNVXB7.js +80 -0
- package/dist/termInfo-5USFZGDB.js +9 -0
- package/dist/tk-2O7XOVGJ.js +37 -0
- package/dist/tp.ui-S4YUVCZH.js +1450 -0
- package/dist/tvs.dtcnv.continuous-7BPIXZ6C.js +65 -0
- package/dist/tvs.numeric-FCC2EY62.js +355 -0
- package/dist/tvs.samplelst-PKGFTULN.js +95 -0
- package/dist/violin-C7IBRTYP.js +47 -0
- package/dist/violin.integration.spec-WXRD3Z4E.js +1425 -0
- package/dist/violin.interactivity-BMG4TG5L.js +39 -0
- package/dist/violin.renderer-WUNW6ULV.js +31 -0
- package/dist/vocabulary-UUNEEBM3.js +32 -0
- package/package.json +3 -3
- package/dist/2dmaf-E4NOGWWO.js +0 -1364
- package/dist/AIProjectAdmin-3QDXMCOK.js +0 -780
- package/dist/AppHeader-IFZ57DJE.js +0 -813
- package/dist/BoxPlot-GXDTPRA5.js +0 -44
- package/dist/CorrelationVolcano-S4GUYIPT.js +0 -616
- package/dist/DifferentialAnalysis-YLKYWPUT.js +0 -237
- package/dist/Disco-OQMP3HRQ.js +0 -3089
- package/dist/Disco.UI-XB3XQP33.js +0 -238
- package/dist/DziViewer-UIRNTFNS.js +0 -16328
- package/dist/GB-KDPJTOLP.js +0 -1099
- package/dist/HicApp-XJERMLKH.js +0 -2218
- package/dist/NumBinaryEditor-5MWWWNLW.js +0 -259
- package/dist/NumBinaryEditor.unit.spec-ROGT5FOH.js +0 -277
- package/dist/NumContEditor-RRCB4CKG.js +0 -98
- package/dist/NumContEditor.unit.spec-AJTKOF7W.js +0 -160
- package/dist/NumCustomBinEditor-3GJITZ7V.js +0 -29
- package/dist/NumCustomBinEditor.unit.spec-DNBDZSHT.js +0 -275
- package/dist/NumDiscreteEditor-TARWA6CZ.js +0 -145
- package/dist/NumDiscreteEditor.unit.spec-TCSLTQ25.js +0 -193
- package/dist/NumRegularBinEditor-QF5ALVV4.js +0 -29
- package/dist/NumRegularBinEditor.unit.spec-GFNDBWNM.js +0 -220
- package/dist/NumSplineEditor-MOEUXR34.js +0 -181
- package/dist/NumSplineEditor.unit.spec-XPJOOXS4.js +0 -190
- package/dist/NumericDensity-JDE263EQ.js +0 -29
- package/dist/NumericDensity.unit.spec-RX6UGV56.js +0 -212
- package/dist/NumericHandler-XM7LUYHN.js +0 -30
- package/dist/NumericHandler.unit.spec-5EYRMII7.js +0 -210
- package/dist/SC-Z4KBNK7P.js +0 -714
- package/dist/Volcano-WYJLKM4K.js +0 -1018
- package/dist/WSIViewer-3RMG3VOA.js +0 -46959
- package/dist/WsiSamplesPlot-PAWNKI7R.js +0 -153
- package/dist/adSandbox-7H5H46SE.js +0 -29
- package/dist/alphaGenome-PODWDV5T.js +0 -170
- package/dist/app-JPURIGQW.js +0 -28
- package/dist/app-YL7S55T5.js +0 -54
- package/dist/bam-XEO47VYA.js +0 -842
- package/dist/barchart-B5M6SSJH.js +0 -48
- package/dist/barchart.data-6A6WVV4Y.js +0 -30
- package/dist/barchart.events-2GNB5KWY.js +0 -44
- package/dist/barchart.integration.spec-JEOTKIWC.js +0 -1600
- package/dist/bars.renderer-NLUBMQEO.js +0 -12
- package/dist/bars.settings-UQZ63KU4.js +0 -8
- package/dist/block-B7WMYLPO.js +0 -6291
- package/dist/block.init-KCIXEYQC.js +0 -29
- package/dist/block.mds.expressionrank-RYZXAH5Y.js +0 -350
- package/dist/block.mds.geneboxplot-LNWUEI6N.js +0 -819
- package/dist/block.mds.junction-CVIY7QMD.js +0 -1536
- package/dist/block.mds.svcnv-EUGWHSCA.js +0 -6792
- package/dist/block.svg-QBLNIGUF.js +0 -155
- package/dist/block.tk.aicheck-U6NG22FX.js +0 -274
- package/dist/block.tk.ase-U3TRZAOH.js +0 -356
- package/dist/block.tk.bam-6Y6YFVR2.js +0 -1897
- package/dist/block.tk.bedgraphdot-O3VCFX6K.js +0 -375
- package/dist/block.tk.bigwig.ui-DNBJAF72.js +0 -202
- package/dist/block.tk.hicstraw-2EIFJX7E.js +0 -814
- package/dist/block.tk.junction-UXSO5EJP.js +0 -2355
- package/dist/block.tk.junction.textmatrixui-HQ6ZKCHM.js +0 -190
- package/dist/block.tk.ld-NEB4F3UG.js +0 -90
- package/dist/block.tk.menu-BN4JPJSD.js +0 -1020
- package/dist/block.tk.pgv-A4QFVSPF.js +0 -935
- package/dist/brainImaging-ESQGNGZH.js +0 -417
- package/dist/chat-AY7RCQYY.js +0 -145
- package/dist/chat-AY7RCQYY.js.map +0 -7
- package/dist/chunk-236ZRGXA.js +0 -297
- package/dist/chunk-2DZWOGEH.js +0 -272
- package/dist/chunk-2HQJMZNY.js +0 -14
- package/dist/chunk-2MRZFUHZ.js +0 -165
- package/dist/chunk-2ZEORJCF.js +0 -215
- package/dist/chunk-3WA7SJTR.js +0 -82
- package/dist/chunk-47HG7LGD.js +0 -133
- package/dist/chunk-47X254B7.js +0 -91
- package/dist/chunk-4TPDYPGD.js +0 -1098
- package/dist/chunk-4TPDYPGD.js.map +0 -7
- package/dist/chunk-4WA2H5DE.js +0 -75
- package/dist/chunk-4WA2H5DE.js.map +0 -7
- package/dist/chunk-4XDKCFFT.js +0 -613
- package/dist/chunk-5CJJLBUZ.js +0 -229
- package/dist/chunk-5TDKRZN5.js +0 -1931
- package/dist/chunk-5TDKRZN5.js.map +0 -7
- package/dist/chunk-6MSJ3TLQ.js +0 -1151
- package/dist/chunk-7JAFXNAL.js +0 -256
- package/dist/chunk-7JAFXNAL.js.map +0 -7
- package/dist/chunk-7LKSKJCV.js +0 -480
- package/dist/chunk-7P67W6NF.js +0 -190
- package/dist/chunk-7RIC35AF.js +0 -129
- package/dist/chunk-A76B53VT.js +0 -158
- package/dist/chunk-AZ276Z7T.js +0 -2327
- package/dist/chunk-B662XJMJ.js +0 -748
- package/dist/chunk-BK7GIOC5.js +0 -4924
- package/dist/chunk-BK7GIOC5.js.map +0 -7
- package/dist/chunk-BP2F2GRB.js +0 -2676
- package/dist/chunk-BRO4KZSZ.js +0 -417
- package/dist/chunk-BRO4KZSZ.js.map +0 -7
- package/dist/chunk-C5YNONHQ.js +0 -144
- package/dist/chunk-CT3LPTWW.js +0 -1197
- package/dist/chunk-CZTC4MTE.js +0 -161
- package/dist/chunk-DA5VGV5L.js +0 -280
- package/dist/chunk-DA5VGV5L.js.map +0 -7
- package/dist/chunk-DPU66MZ7.js +0 -381
- package/dist/chunk-E6NE5IWR.js +0 -102
- package/dist/chunk-ECKWM4HB.js +0 -1536
- package/dist/chunk-EEX5VPJG.js +0 -467
- package/dist/chunk-EIMEUZP2.js +0 -323
- package/dist/chunk-ETFPL4UP.js +0 -4172
- package/dist/chunk-F3FTQWTA.js +0 -303
- package/dist/chunk-F4APZ34G.js +0 -55
- package/dist/chunk-FOXJTDTH.js +0 -166
- package/dist/chunk-FYTZCTJC.js +0 -1157
- package/dist/chunk-FYTZCTJC.js.map +0 -7
- package/dist/chunk-GBS5I24E.js +0 -1706
- package/dist/chunk-GBS5I24E.js.map +0 -7
- package/dist/chunk-GBWRKJAH.js +0 -413
- package/dist/chunk-GG67VPVD.js +0 -238
- package/dist/chunk-GZ2B634M.js +0 -123
- package/dist/chunk-HEFXMCSF.js +0 -6364
- package/dist/chunk-I26R4NJJ.js +0 -228
- package/dist/chunk-I2GCD26Y.js +0 -55
- package/dist/chunk-I2GCD26Y.js.map +0 -7
- package/dist/chunk-ICNJQHQZ.js +0 -117
- package/dist/chunk-IPAGDFO4.js +0 -80
- package/dist/chunk-J2E4FALN.js +0 -1415
- package/dist/chunk-JXHU2FIA.js +0 -2789
- package/dist/chunk-K7LZ77GD.js +0 -468
- package/dist/chunk-K7LZ77GD.js.map +0 -7
- package/dist/chunk-KACWSU3U.js +0 -487
- package/dist/chunk-KACWSU3U.js.map +0 -7
- package/dist/chunk-KGSCQRQ5.js +0 -203
- package/dist/chunk-KGYPMYQD.js +0 -1143
- package/dist/chunk-L3PMRBTA.js +0 -422
- package/dist/chunk-M7QVMSRW.js +0 -293
- package/dist/chunk-MG6GRQKO.js +0 -459
- package/dist/chunk-N5VBIEH5.js +0 -1412
- package/dist/chunk-NRYOB7WU.js +0 -252
- package/dist/chunk-NXOWHUR4.js +0 -311
- package/dist/chunk-NXOWHUR4.js.map +0 -7
- package/dist/chunk-OFQV6PRB.js +0 -1275
- package/dist/chunk-OMO754MK.js +0 -177
- package/dist/chunk-OQSP66C6.js +0 -226
- package/dist/chunk-OS46MR72.js +0 -368
- package/dist/chunk-PBJFLQGL.js +0 -142
- package/dist/chunk-PMZS3SHH.js +0 -2877
- package/dist/chunk-PPJSDC3Z.js +0 -157
- package/dist/chunk-QIS45Z4Y.js +0 -2784
- package/dist/chunk-RCVZ4L7K.js +0 -402
- package/dist/chunk-ROWCKPNW.js +0 -1088
- package/dist/chunk-RQUXELHE.js +0 -276
- package/dist/chunk-RYRCMHYR.js +0 -196
- package/dist/chunk-S7EKSDVS.js +0 -258
- package/dist/chunk-SN5QKRXO.js +0 -85
- package/dist/chunk-TZRD3FPN.js +0 -634
- package/dist/chunk-U5QRRS7K.js +0 -619
- package/dist/chunk-UOMRXQNW.js +0 -401
- package/dist/chunk-UT6W4ZZL.js +0 -15048
- package/dist/chunk-UT6W4ZZL.js.map +0 -7
- package/dist/chunk-UZV3QI5M.js +0 -518
- package/dist/chunk-VALBVQXS.js +0 -217
- package/dist/chunk-VDR5JXI2.js +0 -444
- package/dist/chunk-VDR5JXI2.js.map +0 -7
- package/dist/chunk-W4D2EYE4.js +0 -95
- package/dist/chunk-XATIKUGU.js +0 -142
- package/dist/chunk-ZHWC5SJP.js +0 -797
- package/dist/chunk-ZHWC5SJP.js.map +0 -7
- package/dist/chunk-ZL4CNBYY.js +0 -149
- package/dist/chunk-ZQ7L66GP.js +0 -31
- package/dist/condition-24HPVH23.js +0 -323
- package/dist/controls-5CSAKANR.js +0 -35
- package/dist/controls.btns-QLLBCT65.js +0 -10
- package/dist/controls.config-H4FMU5LI.js +0 -31
- package/dist/correlation-RB77VSXB.js +0 -102
- package/dist/cuminc-YZSLH5IO.js +0 -1143
- package/dist/cuminc.integration.spec-MZPT3Y5A.js +0 -669
- package/dist/customdata.inputui-CBTZFODT.js +0 -278
- package/dist/dataDownload-ZTGRVI4Q.js +0 -320
- package/dist/dataDownload.integration.spec-Q6GUTUYD.js +0 -184
- package/dist/databrowser.ui-V7E6CLUZ.js +0 -426
- package/dist/dictionary-RPC5OZMM.js +0 -90
- package/dist/e2pca-WDQHMAUM.js +0 -341
- package/dist/ep-NAM34BBI.js +0 -1247
- package/dist/expclust.gdc.spec-QB4GVDJA.js +0 -298
- package/dist/facet-DOXBBIG6.js +0 -437
- package/dist/frequencyChart-GLOIGP3T.js +0 -371
- package/dist/frequencyChart.integration.spec-B7NBBLH2.js +0 -301
- package/dist/geneExpClustering-B4S6GFNT.js +0 -242
- package/dist/geneExpression-DMU4AQP6.js +0 -310
- package/dist/geneExpression-MVVXRNEY.js +0 -54
- package/dist/geneORA-XDAITCQF.js +0 -272
- package/dist/geneVariant-N6IGEIRR.js +0 -29
- package/dist/geneVariant-QYLA2V6J.js +0 -32
- package/dist/genefusion.ui-FRBMNK7V.js +0 -242
- package/dist/geneset-GZYNBG7Y.js +0 -186
- package/dist/genomeBrowser.spec-WFIVQSE7.js +0 -272
- package/dist/grin2-I6GJF35U.js +0 -882
- package/dist/grin2-I6GJF35U.js.map +0 -7
- package/dist/grin2-ZKNNZXON.js +0 -1547
- package/dist/gsea-GFGAEC4K.js +0 -43
- package/dist/hierCluster-MF4TI3E4.js +0 -60
- package/dist/hierCluster-SDJMQLOQ.js +0 -56
- package/dist/hierCluster.config-RMEX3VTC.js +0 -32
- package/dist/hierCluster.integration.spec-3H63OHMU.js +0 -389
- package/dist/hierCluster.interactivity-4DZBRQ6P.js +0 -45
- package/dist/hierCluster.renderers-UOW7BI6N.js +0 -21
- package/dist/imagePlot-P2UHJRSL.js +0 -134
- package/dist/importPlot-PPCMNVOW.js +0 -8
- package/dist/launch.adhoc-RJWUEVRA.js +0 -36
- package/dist/leftlabel.sample-OYP6MICL.js +0 -249
- package/dist/lollipop-BXQOWLGO.js +0 -159
- package/dist/maf-YJJO773K.js +0 -448
- package/dist/maf-YJJO773K.js.map +0 -7
- package/dist/maftimeline-GHKDDWYR.js +0 -584
- package/dist/matrix-FWDLHZYR.js +0 -60
- package/dist/matrix-YMJFP53F.js +0 -55
- package/dist/matrix.cells-JH7FPY3E.js +0 -30
- package/dist/matrix.config-HIHOLDCE.js +0 -33
- package/dist/matrix.controls-EKZ543FY.js +0 -31
- package/dist/matrix.data-NKAZI2BF.js +0 -35
- package/dist/matrix.dom-RGZ52GJ2.js +0 -11
- package/dist/matrix.groups-BO53ZXXV.js +0 -26
- package/dist/matrix.integration.spec-BXTATNAC.js +0 -2936
- package/dist/matrix.interactivity-UGUMKCFN.js +0 -36
- package/dist/matrix.layout-WBIF5QTG.js +0 -35
- package/dist/matrix.legend-P3GFCXXK.js +0 -22
- package/dist/matrix.renderers-I54IHQ3S.js +0 -29
- package/dist/matrix.serieses-R2T57OYI.js +0 -21
- package/dist/matrix.sort-3GCA2GDU.js +0 -27
- package/dist/matrix.sort.unit.spec-AXGPCZZD.js +0 -464
- package/dist/matrix.sorterUi-QWRK6OGE.js +0 -18
- package/dist/matrix.sorterUi.unit.spec-H7GUVWRJ.js +0 -335
- package/dist/mavb-4EECWXYX.js +0 -723
- package/dist/mds.fimo-NHZOY43X.js +0 -509
- package/dist/mds.samplescatterplot-7A5IZ6W7.js +0 -1541
- package/dist/mds.survivalplot-SQDPUFQE.js +0 -474
- package/dist/mutationSignature-QH7PZYKL.js +0 -72
- package/dist/numericDictTermCluster-X5SGSC5K.js +0 -72
- package/dist/oncomatrix-M4C4XPQK.js +0 -287
- package/dist/oncomatrix.spec-3C642O7O.js +0 -439
- package/dist/plot.2dvaf-TILP7J53.js +0 -368
- package/dist/plot.app-DE2UQP2M.js +0 -35
- package/dist/plot.barplot-FJHS765K.js +0 -93
- package/dist/plot.boxplot-YRSHGNYZ.js +0 -143
- package/dist/plot.brainImaging-JV4OUVJY.js +0 -51
- package/dist/plot.disco-DBVPBMLG.js +0 -100
- package/dist/plot.dzi-O2OA4EBK.js +0 -33
- package/dist/plot.ssgq-YFQEZQYK.js +0 -130
- package/dist/plot.vaf2cov-YNFP5LJ4.js +0 -250
- package/dist/plot.wsi-DJB7TDIS.js +0 -36
- package/dist/polar-K5Z5FYKV.js +0 -179
- package/dist/profile.spec-A6EADWEC.js +0 -71
- package/dist/profileBarchart-EFLPJK2P.js +0 -260
- package/dist/profileForms-TG35YNLD.js +0 -365
- package/dist/profilePlot-2EW2XVTK.js +0 -50
- package/dist/profileRadar-AKUYC2O5.js +0 -256
- package/dist/profileRadarFacility-EAT66XTX.js +0 -256
- package/dist/qualitative-PHQU5DXE.js +0 -34
- package/dist/regression-EOMJRRDO.js +0 -57
- package/dist/regression.inputs-LIH5X2JM.js +0 -49
- package/dist/regression.inputs.term-OO4RZ3QB.js +0 -49
- package/dist/regression.inputs.values.table-E7WCTO2L.js +0 -46
- package/dist/regression.integration.spec-62VEQP6X.js +0 -777
- package/dist/regression.results-WAHFJ6NA.js +0 -31
- package/dist/regression.spec-IBIOTZVX.js +0 -699
- package/dist/report-MKDJXHGY.js +0 -220
- package/dist/runChart-ETM2EETF.js +0 -54
- package/dist/runchart.integration.spec-QFA4XBKB.js +0 -362
- package/dist/sampleScatter.spec-N4N7ZGZF.js +0 -193
- package/dist/sampleView-JTY3RV7I.js +0 -42
- package/dist/samplelst-RRUMBVT6.js +0 -102
- package/dist/samplematrix-L37O664Y.js +0 -2189
- package/dist/scatter-E5QHW32W.js +0 -55
- package/dist/scatter.integration.spec-FNVAJSVU.js +0 -1026
- package/dist/selectGenomeWithTklst-J6VXCYGG.js +0 -125
- package/dist/singleCellPlot-S6S6CKYX.js +0 -50
- package/dist/singlecell-4BMIKFY4.js +0 -80
- package/dist/singlecell-B4TNI23F.js +0 -1563
- package/dist/snp-PAUQ24NZ.js +0 -73
- package/dist/snplocus-HVFYZTEE.js +0 -199
- package/dist/spliceevent.a53ss.diagram-GGGHVNBF.js +0 -142
- package/dist/spliceevent.exonskip.diagram-HLMFD6LJ.js +0 -268
- package/dist/spliceevent.noeventdiagram-CKZ3BZ7Y.js +0 -451
- package/dist/ssGSEA-UGT4GH55.js +0 -53
- package/dist/stattable-6JWMALGB.js +0 -89
- package/dist/summarizeCnvGeneexp-BJOQY62E.js +0 -136
- package/dist/summarizeGeneexpSurvival-4HDHL7PE.js +0 -90
- package/dist/summarizeMutationDiagnosis-TDWO5CKU.js +0 -32
- package/dist/summarizeMutationSurvival-CJJFABOX.js +0 -92
- package/dist/summary-WOAXXIHG.js +0 -55
- package/dist/summary.integration.spec-GM73ERMN.js +0 -405
- package/dist/summaryInput-FD4SONTY.js +0 -170
- package/dist/sunburst-3LCJTBRN.js +0 -275
- package/dist/survival-A3A7IVXT.js +0 -41
- package/dist/survival-XF72VMM6.js +0 -49
- package/dist/survival.integration.spec-AU7MCAQV.js +0 -601
- package/dist/svgraph-BEMS4JDJ.js +0 -1378
- package/dist/svmr-CDEMTZPK.js +0 -3833
- package/dist/table-WYF6QCGB.js +0 -193
- package/dist/termCollection-BVQMNVY7.js +0 -80
- package/dist/termInfo-JXLIVCSO.js +0 -9
- package/dist/tk-TGIIJYBO.js +0 -37
- package/dist/tp.ui-USYF67P7.js +0 -1450
- package/dist/tvs.dtcnv.continuous-7SCTSFK3.js +0 -65
- package/dist/tvs.numeric-OLVW6US3.js +0 -355
- package/dist/tvs.samplelst-BHZHCX5V.js +0 -95
- package/dist/violin-OEOWVIZF.js +0 -47
- package/dist/violin.integration.spec-AW2U3RHO.js +0 -1425
- package/dist/violin.interactivity-3O2UDNPQ.js +0 -39
- package/dist/violin.renderer-W26FA6M7.js +0 -31
- package/dist/vocabulary-BIQYDKVY.js +0 -32
- /package/dist/{2dmaf-E4NOGWWO.js.map → 2dmaf-6M6QWXAQ.js.map} +0 -0
- /package/dist/{AIProjectAdmin-3QDXMCOK.js.map → AIProjectAdmin-2NHMC3IV.js.map} +0 -0
- /package/dist/{AppHeader-IFZ57DJE.js.map → AppHeader-CTHEWSZD.js.map} +0 -0
- /package/dist/{BoxPlot-GXDTPRA5.js.map → BoxPlot-3U6ZAKKO.js.map} +0 -0
- /package/dist/{CorrelationVolcano-S4GUYIPT.js.map → CorrelationVolcano-2ASIR6KY.js.map} +0 -0
- /package/dist/{DifferentialAnalysis-YLKYWPUT.js.map → DifferentialAnalysis-C3NYGF7U.js.map} +0 -0
- /package/dist/{Disco-OQMP3HRQ.js.map → Disco-2QLBZ3X5.js.map} +0 -0
- /package/dist/{Disco.UI-XB3XQP33.js.map → Disco.UI-GPIIPM2P.js.map} +0 -0
- /package/dist/{DziViewer-UIRNTFNS.js.map → DziViewer-OHPZOH72.js.map} +0 -0
- /package/dist/{GB-KDPJTOLP.js.map → GB-FH6YQGHI.js.map} +0 -0
- /package/dist/{HicApp-XJERMLKH.js.map → HicApp-TI2II3SZ.js.map} +0 -0
- /package/dist/{NumBinaryEditor-5MWWWNLW.js.map → NumBinaryEditor-O42T63EX.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-ROGT5FOH.js.map → NumBinaryEditor.unit.spec-UMB2PHT5.js.map} +0 -0
- /package/dist/{NumContEditor-RRCB4CKG.js.map → NumContEditor-7NOUKPCV.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-AJTKOF7W.js.map → NumContEditor.unit.spec-JGXJ2HLE.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-3GJITZ7V.js.map → NumCustomBinEditor-6CHN3KX3.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-DNBDZSHT.js.map → NumCustomBinEditor.unit.spec-RJPQLE3E.js.map} +0 -0
- /package/dist/{NumDiscreteEditor-TARWA6CZ.js.map → NumDiscreteEditor-AFTUKU4K.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-TCSLTQ25.js.map → NumDiscreteEditor.unit.spec-GKR6ZNBQ.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-QF5ALVV4.js.map → NumRegularBinEditor-UJ5WQPHR.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-GFNDBWNM.js.map → NumRegularBinEditor.unit.spec-5HGJQEX7.js.map} +0 -0
- /package/dist/{NumSplineEditor-MOEUXR34.js.map → NumSplineEditor-JANA2DUE.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-XPJOOXS4.js.map → NumSplineEditor.unit.spec-UYAMAKZD.js.map} +0 -0
- /package/dist/{NumericDensity-JDE263EQ.js.map → NumericDensity-YE5R4CNP.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-RX6UGV56.js.map → NumericDensity.unit.spec-SVEB5U2S.js.map} +0 -0
- /package/dist/{NumericHandler-XM7LUYHN.js.map → NumericHandler-WW4M7YW2.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-5EYRMII7.js.map → NumericHandler.unit.spec-2BWDFO53.js.map} +0 -0
- /package/dist/{SC-Z4KBNK7P.js.map → SC-UGJGMBL7.js.map} +0 -0
- /package/dist/{Volcano-WYJLKM4K.js.map → Volcano-IU76MEIL.js.map} +0 -0
- /package/dist/{WSIViewer-3RMG3VOA.js.map → WSIViewer-3S7N4UDO.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-PAWNKI7R.js.map → WsiSamplesPlot-4CAOHWCL.js.map} +0 -0
- /package/dist/{adSandbox-7H5H46SE.js.map → adSandbox-AEBS3RTL.js.map} +0 -0
- /package/dist/{alphaGenome-PODWDV5T.js.map → alphaGenome-F2PB4SGI.js.map} +0 -0
- /package/dist/{app-JPURIGQW.js.map → app-6SKETLMT.js.map} +0 -0
- /package/dist/{app-YL7S55T5.js.map → app-GBEF2HBR.js.map} +0 -0
- /package/dist/{bam-XEO47VYA.js.map → bam-5SE6XQJV.js.map} +0 -0
- /package/dist/{barchart-B5M6SSJH.js.map → barchart-AUSOT2XB.js.map} +0 -0
- /package/dist/{barchart.data-6A6WVV4Y.js.map → barchart.data-GYCNBRPY.js.map} +0 -0
- /package/dist/{barchart.events-2GNB5KWY.js.map → barchart.events-QTSWNYXO.js.map} +0 -0
- /package/dist/{barchart.integration.spec-JEOTKIWC.js.map → barchart.integration.spec-LORJLJVX.js.map} +0 -0
- /package/dist/{bars.renderer-NLUBMQEO.js.map → bars.renderer-4N4QOUNI.js.map} +0 -0
- /package/dist/{bars.settings-UQZ63KU4.js.map → bars.settings-SDU7PZOS.js.map} +0 -0
- /package/dist/{block-B7WMYLPO.js.map → block-QLSIELXK.js.map} +0 -0
- /package/dist/{block.init-KCIXEYQC.js.map → block.init-OOLEA6ZK.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-RYZXAH5Y.js.map → block.mds.expressionrank-D2KUISXZ.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-LNWUEI6N.js.map → block.mds.geneboxplot-AMYBWXPS.js.map} +0 -0
- /package/dist/{block.mds.junction-CVIY7QMD.js.map → block.mds.junction-OG335MBK.js.map} +0 -0
- /package/dist/{block.mds.svcnv-EUGWHSCA.js.map → block.mds.svcnv-WYDBQ6FV.js.map} +0 -0
- /package/dist/{block.svg-QBLNIGUF.js.map → block.svg-OH73245R.js.map} +0 -0
- /package/dist/{block.tk.aicheck-U6NG22FX.js.map → block.tk.aicheck-CG5THFW2.js.map} +0 -0
- /package/dist/{block.tk.ase-U3TRZAOH.js.map → block.tk.ase-G2L3G5MQ.js.map} +0 -0
- /package/dist/{block.tk.bam-6Y6YFVR2.js.map → block.tk.bam-DXWCA6EU.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-O3VCFX6K.js.map → block.tk.bedgraphdot-LF3TFPNL.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-DNBJAF72.js.map → block.tk.bigwig.ui-JKXZ3VDF.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-2EIFJX7E.js.map → block.tk.hicstraw-ZK4RKFB6.js.map} +0 -0
- /package/dist/{block.tk.junction-UXSO5EJP.js.map → block.tk.junction-ZB7Q2NLB.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-HQ6ZKCHM.js.map → block.tk.junction.textmatrixui-ZYNQWKIW.js.map} +0 -0
- /package/dist/{block.tk.ld-NEB4F3UG.js.map → block.tk.ld-7H64HGER.js.map} +0 -0
- /package/dist/{block.tk.menu-BN4JPJSD.js.map → block.tk.menu-WFVKAH74.js.map} +0 -0
- /package/dist/{block.tk.pgv-A4QFVSPF.js.map → block.tk.pgv-632LLSBI.js.map} +0 -0
- /package/dist/{brainImaging-ESQGNGZH.js.map → brainImaging-AEPTHIQF.js.map} +0 -0
- /package/dist/{chunk-U5QRRS7K.js.map → chunk-22O6F463.js.map} +0 -0
- /package/dist/{chunk-NRYOB7WU.js.map → chunk-2HJ7OD7H.js.map} +0 -0
- /package/dist/{chunk-PMZS3SHH.js.map → chunk-2MN5JLZB.js.map} +0 -0
- /package/dist/{chunk-7LKSKJCV.js.map → chunk-37CK5IGW.js.map} +0 -0
- /package/dist/{chunk-IPAGDFO4.js.map → chunk-3JFEWVHR.js.map} +0 -0
- /package/dist/{chunk-47HG7LGD.js.map → chunk-3MGBC64I.js.map} +0 -0
- /package/dist/{chunk-HEFXMCSF.js.map → chunk-3NWLWH4G.js.map} +0 -0
- /package/dist/{chunk-XATIKUGU.js.map → chunk-4GKQ5PWY.js.map} +0 -0
- /package/dist/{chunk-OQSP66C6.js.map → chunk-4PHD5H4A.js.map} +0 -0
- /package/dist/{chunk-GBWRKJAH.js.map → chunk-56IFQMJK.js.map} +0 -0
- /package/dist/{chunk-A76B53VT.js.map → chunk-5DMFTXUZ.js.map} +0 -0
- /package/dist/{chunk-W4D2EYE4.js.map → chunk-5QJDZHRU.js.map} +0 -0
- /package/dist/{chunk-OFQV6PRB.js.map → chunk-5WAVKWL6.js.map} +0 -0
- /package/dist/{chunk-C5YNONHQ.js.map → chunk-6ISTNHM6.js.map} +0 -0
- /package/dist/{chunk-ECKWM4HB.js.map → chunk-6VQ4C735.js.map} +0 -0
- /package/dist/{chunk-5CJJLBUZ.js.map → chunk-74WMSW3E.js.map} +0 -0
- /package/dist/{chunk-MG6GRQKO.js.map → chunk-AFU66YOW.js.map} +0 -0
- /package/dist/{chunk-2HQJMZNY.js.map → chunk-AUJ2YUXV.js.map} +0 -0
- /package/dist/{chunk-UZV3QI5M.js.map → chunk-B65X5UQH.js.map} +0 -0
- /package/dist/{chunk-TZRD3FPN.js.map → chunk-B6I64LSV.js.map} +0 -0
- /package/dist/{chunk-SN5QKRXO.js.map → chunk-BTYCW3D5.js.map} +0 -0
- /package/dist/{chunk-J2E4FALN.js.map → chunk-CCB5KYFQ.js.map} +0 -0
- /package/dist/{chunk-EEX5VPJG.js.map → chunk-CKLYFA7H.js.map} +0 -0
- /package/dist/{chunk-2DZWOGEH.js.map → chunk-CLYRJ466.js.map} +0 -0
- /package/dist/{chunk-3WA7SJTR.js.map → chunk-CPHCZZWT.js.map} +0 -0
- /package/dist/{chunk-VALBVQXS.js.map → chunk-CUADOD2T.js.map} +0 -0
- /package/dist/{chunk-L3PMRBTA.js.map → chunk-CV6ID6T7.js.map} +0 -0
- /package/dist/{chunk-7P67W6NF.js.map → chunk-CWHBWY3B.js.map} +0 -0
- /package/dist/{chunk-GG67VPVD.js.map → chunk-D53HBTYQ.js.map} +0 -0
- /package/dist/{chunk-RYRCMHYR.js.map → chunk-DKI7YOTJ.js.map} +0 -0
- /package/dist/{chunk-2MRZFUHZ.js.map → chunk-DNU4IPD2.js.map} +0 -0
- /package/dist/{chunk-AZ276Z7T.js.map → chunk-H6HP4H3U.js.map} +0 -0
- /package/dist/{chunk-GZ2B634M.js.map → chunk-HPEMEDXB.js.map} +0 -0
- /package/dist/{chunk-6MSJ3TLQ.js.map → chunk-HUDESZGX.js.map} +0 -0
- /package/dist/{chunk-FOXJTDTH.js.map → chunk-J7IU77CA.js.map} +0 -0
- /package/dist/{chunk-DPU66MZ7.js.map → chunk-JMO7ENSD.js.map} +0 -0
- /package/dist/{chunk-7RIC35AF.js.map → chunk-JTPN3BRG.js.map} +0 -0
- /package/dist/{chunk-EIMEUZP2.js.map → chunk-KCAMFDJH.js.map} +0 -0
- /package/dist/{chunk-OMO754MK.js.map → chunk-LD45BCVM.js.map} +0 -0
- /package/dist/{chunk-N5VBIEH5.js.map → chunk-LMELY5Z2.js.map} +0 -0
- /package/dist/{chunk-2ZEORJCF.js.map → chunk-LVQK62CV.js.map} +0 -0
- /package/dist/{chunk-PPJSDC3Z.js.map → chunk-MCVLRF66.js.map} +0 -0
- /package/dist/{chunk-4XDKCFFT.js.map → chunk-MLD7DW5I.js.map} +0 -0
- /package/dist/{chunk-JXHU2FIA.js.map → chunk-NEF7LGNE.js.map} +0 -0
- /package/dist/{chunk-UOMRXQNW.js.map → chunk-OARG7PAV.js.map} +0 -0
- /package/dist/{chunk-B662XJMJ.js.map → chunk-OGWY4MOB.js.map} +0 -0
- /package/dist/{chunk-QIS45Z4Y.js.map → chunk-PQD6K5W5.js.map} +0 -0
- /package/dist/{chunk-47X254B7.js.map → chunk-Q4FYGFTQ.js.map} +0 -0
- /package/dist/{chunk-F3FTQWTA.js.map → chunk-RA2KI64U.js.map} +0 -0
- /package/dist/{chunk-ROWCKPNW.js.map → chunk-RHHLAKYS.js.map} +0 -0
- /package/dist/{chunk-S7EKSDVS.js.map → chunk-RKV3CP4C.js.map} +0 -0
- /package/dist/{chunk-OS46MR72.js.map → chunk-RL7RU2V7.js.map} +0 -0
- /package/dist/{chunk-CZTC4MTE.js.map → chunk-RQ7CE7SK.js.map} +0 -0
- /package/dist/{chunk-KGYPMYQD.js.map → chunk-RX552WU6.js.map} +0 -0
- /package/dist/{chunk-RQUXELHE.js.map → chunk-S7V4SFKB.js.map} +0 -0
- /package/dist/{chunk-PBJFLQGL.js.map → chunk-SEL5UNRC.js.map} +0 -0
- /package/dist/{chunk-236ZRGXA.js.map → chunk-SRBO57AD.js.map} +0 -0
- /package/dist/{chunk-CT3LPTWW.js.map → chunk-SYGLOTOV.js.map} +0 -0
- /package/dist/{chunk-KGSCQRQ5.js.map → chunk-UZ466XO3.js.map} +0 -0
- /package/dist/{chunk-ZL4CNBYY.js.map → chunk-VDF5W47R.js.map} +0 -0
- /package/dist/{chunk-ZQ7L66GP.js.map → chunk-WTPVXDJT.js.map} +0 -0
- /package/dist/{chunk-I26R4NJJ.js.map → chunk-XRIM2YJZ.js.map} +0 -0
- /package/dist/{chunk-F4APZ34G.js.map → chunk-YSWMQO23.js.map} +0 -0
- /package/dist/{chunk-RCVZ4L7K.js.map → chunk-ZBZXIWSK.js.map} +0 -0
- /package/dist/{chunk-ICNJQHQZ.js.map → chunk-ZFFHOEBE.js.map} +0 -0
- /package/dist/{chunk-E6NE5IWR.js.map → chunk-ZG63ZUDE.js.map} +0 -0
- /package/dist/{chunk-BP2F2GRB.js.map → chunk-ZGQ3BMLW.js.map} +0 -0
- /package/dist/{chunk-M7QVMSRW.js.map → chunk-ZNINQ3FN.js.map} +0 -0
- /package/dist/{chunk-ETFPL4UP.js.map → chunk-ZQZWM544.js.map} +0 -0
- /package/dist/{condition-24HPVH23.js.map → condition-4FVKPSQ2.js.map} +0 -0
- /package/dist/{controls-5CSAKANR.js.map → controls-ZWBN566I.js.map} +0 -0
- /package/dist/{controls.btns-QLLBCT65.js.map → controls.btns-H4TWTHTW.js.map} +0 -0
- /package/dist/{controls.config-H4FMU5LI.js.map → controls.config-YU4W3CDL.js.map} +0 -0
- /package/dist/{correlation-RB77VSXB.js.map → correlation-VADB4SQO.js.map} +0 -0
- /package/dist/{cuminc-YZSLH5IO.js.map → cuminc-4BXE2YS6.js.map} +0 -0
- /package/dist/{cuminc.integration.spec-MZPT3Y5A.js.map → cuminc.integration.spec-XQREKHVA.js.map} +0 -0
- /package/dist/{customdata.inputui-CBTZFODT.js.map → customdata.inputui-VBQWT3M7.js.map} +0 -0
- /package/dist/{dataDownload-ZTGRVI4Q.js.map → dataDownload-QIZKBKH7.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-Q6GUTUYD.js.map → dataDownload.integration.spec-MLJEHLYD.js.map} +0 -0
- /package/dist/{databrowser.ui-V7E6CLUZ.js.map → databrowser.ui-6UIR4ULJ.js.map} +0 -0
- /package/dist/{dictionary-RPC5OZMM.js.map → dictionary-FLWIWAC6.js.map} +0 -0
- /package/dist/{e2pca-WDQHMAUM.js.map → e2pca-NKWSJRXM.js.map} +0 -0
- /package/dist/{ep-NAM34BBI.js.map → ep-EPN3AR6D.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-QB4GVDJA.js.map → expclust.gdc.spec-ZRUH5E6E.js.map} +0 -0
- /package/dist/{facet-DOXBBIG6.js.map → facet-BM7SLACF.js.map} +0 -0
- /package/dist/{frequencyChart-GLOIGP3T.js.map → frequencyChart-HBXRIBAW.js.map} +0 -0
- /package/dist/{frequencyChart.integration.spec-B7NBBLH2.js.map → frequencyChart.integration.spec-YJUYZWM6.js.map} +0 -0
- /package/dist/{geneExpClustering-B4S6GFNT.js.map → geneExpClustering-4VD5PAWN.js.map} +0 -0
- /package/dist/{geneExpression-MVVXRNEY.js.map → geneExpression-6OT2Y4P6.js.map} +0 -0
- /package/dist/{geneExpression-DMU4AQP6.js.map → geneExpression-EAMEZXJQ.js.map} +0 -0
- /package/dist/{geneORA-XDAITCQF.js.map → geneORA-RI2AG7JT.js.map} +0 -0
- /package/dist/{geneVariant-N6IGEIRR.js.map → geneVariant-FYYEOTWA.js.map} +0 -0
- /package/dist/{geneVariant-QYLA2V6J.js.map → geneVariant-PAKVDVC4.js.map} +0 -0
- /package/dist/{genefusion.ui-FRBMNK7V.js.map → genefusion.ui-QWC42XWQ.js.map} +0 -0
- /package/dist/{geneset-GZYNBG7Y.js.map → geneset-XA6IWP3Q.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-WFIVQSE7.js.map → genomeBrowser.spec-LRKXWXNT.js.map} +0 -0
- /package/dist/{grin2-ZKNNZXON.js.map → grin2-WLB7BY3S.js.map} +0 -0
- /package/dist/{gsea-GFGAEC4K.js.map → gsea-ZM4WOPSQ.js.map} +0 -0
- /package/dist/{hierCluster-MF4TI3E4.js.map → hierCluster-LD43LLRC.js.map} +0 -0
- /package/dist/{hierCluster-SDJMQLOQ.js.map → hierCluster-ZGYRS2WV.js.map} +0 -0
- /package/dist/{hierCluster.config-RMEX3VTC.js.map → hierCluster.config-O5HUOFNH.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-3H63OHMU.js.map → hierCluster.integration.spec-37UNKHTH.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-4DZBRQ6P.js.map → hierCluster.interactivity-B27ETKRP.js.map} +0 -0
- /package/dist/{hierCluster.renderers-UOW7BI6N.js.map → hierCluster.renderers-GWFH5ZX7.js.map} +0 -0
- /package/dist/{imagePlot-P2UHJRSL.js.map → imagePlot-LJZVGNDJ.js.map} +0 -0
- /package/dist/{importPlot-PPCMNVOW.js.map → importPlot-RMVENQRD.js.map} +0 -0
- /package/dist/{launch.adhoc-RJWUEVRA.js.map → launch.adhoc-S3XHRSLN.js.map} +0 -0
- /package/dist/{leftlabel.sample-OYP6MICL.js.map → leftlabel.sample-J6PCA3UB.js.map} +0 -0
- /package/dist/{lollipop-BXQOWLGO.js.map → lollipop-OZTV4C7A.js.map} +0 -0
- /package/dist/{maftimeline-GHKDDWYR.js.map → maftimeline-6F2LQJU6.js.map} +0 -0
- /package/dist/{matrix-FWDLHZYR.js.map → matrix-FIXOFAB4.js.map} +0 -0
- /package/dist/{matrix-YMJFP53F.js.map → matrix-O5KPDLM2.js.map} +0 -0
- /package/dist/{matrix.cells-JH7FPY3E.js.map → matrix.cells-SCLZA3P4.js.map} +0 -0
- /package/dist/{matrix.config-HIHOLDCE.js.map → matrix.config-WG7HFJL4.js.map} +0 -0
- /package/dist/{matrix.controls-EKZ543FY.js.map → matrix.controls-QQLBUUYP.js.map} +0 -0
- /package/dist/{matrix.data-NKAZI2BF.js.map → matrix.data-6JLF5HVI.js.map} +0 -0
- /package/dist/{matrix.dom-RGZ52GJ2.js.map → matrix.dom-QO7BXZ27.js.map} +0 -0
- /package/dist/{matrix.groups-BO53ZXXV.js.map → matrix.groups-QMZMZ6Q7.js.map} +0 -0
- /package/dist/{matrix.integration.spec-BXTATNAC.js.map → matrix.integration.spec-ZJYWNQ57.js.map} +0 -0
- /package/dist/{matrix.interactivity-UGUMKCFN.js.map → matrix.interactivity-ZZY5ET4E.js.map} +0 -0
- /package/dist/{matrix.layout-WBIF5QTG.js.map → matrix.layout-XKFB4PKY.js.map} +0 -0
- /package/dist/{matrix.legend-P3GFCXXK.js.map → matrix.legend-CS6DNC5V.js.map} +0 -0
- /package/dist/{matrix.renderers-I54IHQ3S.js.map → matrix.renderers-4LST6PBA.js.map} +0 -0
- /package/dist/{matrix.serieses-R2T57OYI.js.map → matrix.serieses-3SERD6CV.js.map} +0 -0
- /package/dist/{matrix.sort-3GCA2GDU.js.map → matrix.sort-UVS6WHIS.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-AXGPCZZD.js.map → matrix.sort.unit.spec-CTSUNUWB.js.map} +0 -0
- /package/dist/{matrix.sorterUi-QWRK6OGE.js.map → matrix.sorterUi-JDGLTLJM.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-H7GUVWRJ.js.map → matrix.sorterUi.unit.spec-VQFMHIYI.js.map} +0 -0
- /package/dist/{mavb-4EECWXYX.js.map → mavb-ECQ2CQ7F.js.map} +0 -0
- /package/dist/{mds.fimo-NHZOY43X.js.map → mds.fimo-JDYDT5NK.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-7A5IZ6W7.js.map → mds.samplescatterplot-PEJBVSTO.js.map} +0 -0
- /package/dist/{mds.survivalplot-SQDPUFQE.js.map → mds.survivalplot-GYK6VRQT.js.map} +0 -0
- /package/dist/{mutationSignature-QH7PZYKL.js.map → mutationSignature-43SECPTY.js.map} +0 -0
- /package/dist/{numericDictTermCluster-X5SGSC5K.js.map → numericDictTermCluster-2ER4FUKO.js.map} +0 -0
- /package/dist/{oncomatrix-M4C4XPQK.js.map → oncomatrix-ZXDJMLN3.js.map} +0 -0
- /package/dist/{oncomatrix.spec-3C642O7O.js.map → oncomatrix.spec-HOPRIG3I.js.map} +0 -0
- /package/dist/{plot.2dvaf-TILP7J53.js.map → plot.2dvaf-Y4SZUHLD.js.map} +0 -0
- /package/dist/{plot.app-DE2UQP2M.js.map → plot.app-W5Z3C7P5.js.map} +0 -0
- /package/dist/{plot.barplot-FJHS765K.js.map → plot.barplot-B2PRZDKV.js.map} +0 -0
- /package/dist/{plot.boxplot-YRSHGNYZ.js.map → plot.boxplot-J7ET34FY.js.map} +0 -0
- /package/dist/{plot.brainImaging-JV4OUVJY.js.map → plot.brainImaging-ISY4P6RT.js.map} +0 -0
- /package/dist/{plot.disco-DBVPBMLG.js.map → plot.disco-D7AL42PW.js.map} +0 -0
- /package/dist/{plot.dzi-O2OA4EBK.js.map → plot.dzi-O32LH65U.js.map} +0 -0
- /package/dist/{plot.ssgq-YFQEZQYK.js.map → plot.ssgq-WF7262IZ.js.map} +0 -0
- /package/dist/{plot.vaf2cov-YNFP5LJ4.js.map → plot.vaf2cov-OB6UKSFQ.js.map} +0 -0
- /package/dist/{plot.wsi-DJB7TDIS.js.map → plot.wsi-J5S4YYXN.js.map} +0 -0
- /package/dist/{polar-K5Z5FYKV.js.map → polar-LIJORXR6.js.map} +0 -0
- /package/dist/{profile.spec-A6EADWEC.js.map → profile.spec-3KE4CREI.js.map} +0 -0
- /package/dist/{profileBarchart-EFLPJK2P.js.map → profileBarchart-UQHOJB5V.js.map} +0 -0
- /package/dist/{profileForms-TG35YNLD.js.map → profileForms-WTYVTIUN.js.map} +0 -0
- /package/dist/{profilePlot-2EW2XVTK.js.map → profilePlot-SOXXEUAT.js.map} +0 -0
- /package/dist/{profileRadar-AKUYC2O5.js.map → profileRadar-2OHJ2RIU.js.map} +0 -0
- /package/dist/{profileRadarFacility-EAT66XTX.js.map → profileRadarFacility-GHLG3QNG.js.map} +0 -0
- /package/dist/{qualitative-PHQU5DXE.js.map → qualitative-B3OY7A7P.js.map} +0 -0
- /package/dist/{regression-EOMJRRDO.js.map → regression-HO2TO4XT.js.map} +0 -0
- /package/dist/{regression.inputs-LIH5X2JM.js.map → regression.inputs-JN3ZMIOP.js.map} +0 -0
- /package/dist/{regression.inputs.term-OO4RZ3QB.js.map → regression.inputs.term-67HVMXFZ.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-E7WCTO2L.js.map → regression.inputs.values.table-JXJK2YZT.js.map} +0 -0
- /package/dist/{regression.integration.spec-62VEQP6X.js.map → regression.integration.spec-L54ZS5VY.js.map} +0 -0
- /package/dist/{regression.results-WAHFJ6NA.js.map → regression.results-3ZSFKUNN.js.map} +0 -0
- /package/dist/{regression.spec-IBIOTZVX.js.map → regression.spec-SVWCQX2U.js.map} +0 -0
- /package/dist/{report-MKDJXHGY.js.map → report-IHX7XSOI.js.map} +0 -0
- /package/dist/{runChart-ETM2EETF.js.map → runChart-QLQMK3OE.js.map} +0 -0
- /package/dist/{runchart.integration.spec-QFA4XBKB.js.map → runchart.integration.spec-5NVY5GHR.js.map} +0 -0
- /package/dist/{sampleScatter.spec-N4N7ZGZF.js.map → sampleScatter.spec-4Q5CQQWH.js.map} +0 -0
- /package/dist/{sampleView-JTY3RV7I.js.map → sampleView-7WHDFHB5.js.map} +0 -0
- /package/dist/{samplelst-RRUMBVT6.js.map → samplelst-34GJVLVD.js.map} +0 -0
- /package/dist/{samplematrix-L37O664Y.js.map → samplematrix-L2HOSLUT.js.map} +0 -0
- /package/dist/{scatter-E5QHW32W.js.map → scatter-X6AAM2LJ.js.map} +0 -0
- /package/dist/{scatter.integration.spec-FNVAJSVU.js.map → scatter.integration.spec-QSH3PLBK.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-J6VXCYGG.js.map → selectGenomeWithTklst-AJS2IPPW.js.map} +0 -0
- /package/dist/{singleCellPlot-S6S6CKYX.js.map → singleCellPlot-7JEWDVSR.js.map} +0 -0
- /package/dist/{singlecell-B4TNI23F.js.map → singlecell-IC5KU72L.js.map} +0 -0
- /package/dist/{singlecell-4BMIKFY4.js.map → singlecell-NWANPXWM.js.map} +0 -0
- /package/dist/{snp-PAUQ24NZ.js.map → snp-PSRNMTL6.js.map} +0 -0
- /package/dist/{snplocus-HVFYZTEE.js.map → snplocus-QCAVDYLR.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-GGGHVNBF.js.map → spliceevent.a53ss.diagram-SGDJKUEC.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-HLMFD6LJ.js.map → spliceevent.exonskip.diagram-BUYTHCK5.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-CKZ3BZ7Y.js.map → spliceevent.noeventdiagram-OJZJUHXP.js.map} +0 -0
- /package/dist/{ssGSEA-UGT4GH55.js.map → ssGSEA-UUZG57MF.js.map} +0 -0
- /package/dist/{stattable-6JWMALGB.js.map → stattable-324FS2HA.js.map} +0 -0
- /package/dist/{summarizeCnvGeneexp-BJOQY62E.js.map → summarizeCnvGeneexp-ZVZYWP43.js.map} +0 -0
- /package/dist/{summarizeGeneexpSurvival-4HDHL7PE.js.map → summarizeGeneexpSurvival-7XJRMT6M.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-TDWO5CKU.js.map → summarizeMutationDiagnosis-ZKLXOVY2.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-CJJFABOX.js.map → summarizeMutationSurvival-S4YPGLWA.js.map} +0 -0
- /package/dist/{summary-WOAXXIHG.js.map → summary-RVG7JL6Y.js.map} +0 -0
- /package/dist/{summary.integration.spec-GM73ERMN.js.map → summary.integration.spec-SCD35GO4.js.map} +0 -0
- /package/dist/{summaryInput-FD4SONTY.js.map → summaryInput-DMN6DTSW.js.map} +0 -0
- /package/dist/{sunburst-3LCJTBRN.js.map → sunburst-QZXYILRC.js.map} +0 -0
- /package/dist/{survival-A3A7IVXT.js.map → survival-6CWEBRSF.js.map} +0 -0
- /package/dist/{survival-XF72VMM6.js.map → survival-J657VYLI.js.map} +0 -0
- /package/dist/{survival.integration.spec-AU7MCAQV.js.map → survival.integration.spec-S5WE4V6M.js.map} +0 -0
- /package/dist/{svgraph-BEMS4JDJ.js.map → svgraph-NEKJL24M.js.map} +0 -0
- /package/dist/{svmr-CDEMTZPK.js.map → svmr-5RQ5JQF2.js.map} +0 -0
- /package/dist/{table-WYF6QCGB.js.map → table-CG6Z6NCJ.js.map} +0 -0
- /package/dist/{termCollection-BVQMNVY7.js.map → termCollection-FOQNVXB7.js.map} +0 -0
- /package/dist/{termInfo-JXLIVCSO.js.map → termInfo-5USFZGDB.js.map} +0 -0
- /package/dist/{tk-TGIIJYBO.js.map → tk-2O7XOVGJ.js.map} +0 -0
- /package/dist/{tp.ui-USYF67P7.js.map → tp.ui-S4YUVCZH.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-7SCTSFK3.js.map → tvs.dtcnv.continuous-7BPIXZ6C.js.map} +0 -0
- /package/dist/{tvs.numeric-OLVW6US3.js.map → tvs.numeric-FCC2EY62.js.map} +0 -0
- /package/dist/{tvs.samplelst-BHZHCX5V.js.map → tvs.samplelst-PKGFTULN.js.map} +0 -0
- /package/dist/{violin-OEOWVIZF.js.map → violin-C7IBRTYP.js.map} +0 -0
- /package/dist/{violin.integration.spec-AW2U3RHO.js.map → violin.integration.spec-WXRD3Z4E.js.map} +0 -0
- /package/dist/{violin.interactivity-3O2UDNPQ.js.map → violin.interactivity-BMG4TG5L.js.map} +0 -0
- /package/dist/{violin.renderer-W26FA6M7.js.map → violin.renderer-WUNW6ULV.js.map} +0 -0
- /package/dist/{vocabulary-BIQYDKVY.js.map → vocabulary-UUNEEBM3.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../node_modules/partjson/dist/partjson.umd.js", "../plots/barchart.data.js", "../src/client.js", "../dom/animation.js", "../dom/axisstyle.js", "../dom/boxplot.js", "../dom/checkbox.js", "../dom/ColorScale/ColorScaleMenu.ts", "../dom/ColorScale/ColorScale.ts", "../dom/ColorScale/helpers.ts", "../dom/cnvConfig.ts", "../common/svg.download.js", "../dom/downloadMenu.ts", "../dom/downloadTextfile.js", "../dom/fillbar.js", "../dom/FlyoutMenu.ts", "../dom/GeneExpChartMenu.ts", "../dom/genesearch.ts", "../dom/GeneSetEdit/addButton.ts", "../dom/GeneSetEdit/radioWithContent.ts", "../dom/GeneSetEdit/GenesMenu.ts", "../dom/table.ts", "../filter/tvs.js", "../filter/filter.utils.js", "../filter/filter.renderer.js", "../filter/filter.interactivity.js", "../termdb/Vocab.js", "../dom/sayerror.ts", "../termdb/TermdbVocab.js", "../termdb/FrontendVocab.js", "../termdb/vocabulary.js", "../filter/FilterClass.js", "../filter/FilterStateless.js", "../../node_modules/html-to-image/src/util.ts", "../../node_modules/html-to-image/src/clone-pseudos.ts", "../../node_modules/html-to-image/src/mimes.ts", "../../node_modules/html-to-image/src/dataurl.ts", "../../node_modules/html-to-image/src/clone-node.ts", "../../node_modules/html-to-image/src/embed-resources.ts", "../../node_modules/html-to-image/src/embed-images.ts", "../../node_modules/html-to-image/src/apply-style.ts", "../../node_modules/html-to-image/src/embed-webfonts.ts", "../../node_modules/html-to-image/src/index.ts", "../filter/FilterRxComp.js", "../filter/FilterPrompt.js", "../dom/GeneSetEdit/GeneSetEditUI.ts", "../dom/html.legend.js", "../dom/InvalidDataUI.ts", "../dom/LegendCircleReference.ts", "../dom/maxLabelWidth.ts", "../tw/categorical.ts", "../tw/TwBase.ts", "../tw/geneExpression.ts", "../tw/metaboliteIntensity.ts", "../tw/date.ts", "../tw/ssGSEA.ts", "../tw/numeric.ts", "../tw/snp.ts", "../tw/singleCellCellType.ts", "../tw/qualitative.ts", "../termsetting/handlers/geneVariant.ts", "../tw/geneVariant.ts", "../tw/TwRouter.ts", "../termsetting/utils.ts", "../../node_modules/@isaacs/balanced-match/src/index.ts", "../../node_modules/@isaacs/brace-expansion/src/index.ts", "../node_modules/minimatch/src/assert-valid-pattern.ts", "../node_modules/minimatch/src/brace-expressions.ts", "../node_modules/minimatch/src/unescape.ts", "../node_modules/minimatch/src/ast.ts", "../node_modules/minimatch/src/escape.ts", "../node_modules/minimatch/src/index.ts", "../termsetting/TermSettingView.ts", "../termsetting/TermSettingActions.ts", "../termsetting/TermSetting.ts", "../termsetting/TermSettingApi.ts", "../dom/MultiTermWrapperEditUI.ts", "../dom/numericAxis.js", "../dom/radiobutton.ts", "../dom/sandbox.ts", "../dom/search.ts", "../dom/shapes.js", "../dom/ssmLink.ts", "../dom/svg.legend.js", "../dom/svg.scroll.js", "../dom/table2col.js", "../dom/toggleButtons.ts", "../dom/zoom.js", "../plots/AppBase.ts", "../termdb/tree.js", "../termdb/store.ts", "../termdb/TermTypeSearch.ts", "../termdb/submenu.js", "../termdb/search.js", "../termdb/app.ts", "../dom/select2Terms.js", "../common/1stGenetk.js", "../common/termutils.js"],
|
|
4
|
+
"sourcesContent": ["!function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(t=t||self).Partjson=e()}(this,function(){\"use strict\";class t{constructor(t){this.Pj=t,this.opts=[\"@delimit\",\"@errmode\"],this.contexts=[\"@branch\",\"@parent\",\"@root\",\"@self\",\"@values\",\"@key\"],this.filters=[\"@split()\",\"@before()\",\"@join()\",\"@ignore()\"],this.post=[\"@after()\",\"@dist()\",\"@end()\"],this.terms=[...this.opts,...this.contexts,...this.filters,...this.post]}setFxn(t,e,s,r){this[t]?s[t]=this[t](r,e,s):e.errors.push([\"key\",\"UNRECOGNIZED-RESERVED-\"+t])}trueFxn(){return!0}notDefined(t){return void 0===t}}t.prototype[\"@split\"]=function(t){const e=t.slice(1,-2),s=this.Pj.opts[\"=\"][e];if(!s)throw`missing @split() function ${e}`;this.Pj.split=s},t.prototype[\"@before\"]=function(t,e){const s=t.slice(1,-2),r=this.Pj.opts[\"=\"][s];return r||(e.errors.push([\"val\",\"MISSING-\"+e.term+\"-FXN\",s]),this.trueFxn)},t.prototype[\"@after\"]=t.prototype[\"@before\"],t.prototype[\"@done\"]=t.prototype[\"@before\"],t.prototype[\"@join\"]=function(t,e,s){return(s,r)=>{let o=!0;for(const i in t){const n=t[i].slice(1,-2),l=this.Pj.opts[\"=\"][n];if(l){const t=l(s,r,i);t?this.Pj.joins.set(i,t):o=!1}else e.errors.push([\"val\",\"MISSING-@join-FXN\",n])}return o}},t.prototype[\"@dist\"]=function(t,e){const s=Array.isArray(t)?t:[t],r={};for(const t of s)r[t]=this.Pj.converter.subs[\"@\"](this.Pj,t);return t=>{t[\"@dist\"]=(s=>{for(const o in r){const i=(0,r[o])(null,t);i?Array.isArray(i)?i.includes(s)||i.push(s):t.errors.push([e,\"NON-ARRAY-DIST-TARGET\",o]):t.errors.push([e,\"MISSING-DIST-TARGET\",o])}})}},t.prototype[\"@ignore\"]=function(t,e,s){if(!t[\"@ignore()\"])return e;const r=Array.isArray(t[\"@ignore()\"])||\"string\"==typeof t[\"@ignore()\"]||\"object\"!=typeof t[\"@ignore()\"],o=r?{\"@\":t[\"@ignore()\"]}:t[\"@ignore()\"],i={};for(const t in o){const e=o[t];if(Array.isArray(e))i[t]=(t=>e.includes(t));else if(\"string\"==typeof e&&\"=\"==e[0]){const r=this.Pj.opts[\"=\"][e.slice(1,-2)];r?i[t]=r:(s.errors.push([\"val\",\"MISSING-@ignore()-FXN\",e]),i[t]=this.notDefined)}else s.errors.push([\"val\",\"UNSUPPORTED-@ignore()-VALUE\",e]),i[t]=this.notDefined}return r?i:Object.assign({},e,i)};class e{constructor(t){this.Pj=t,this.allowedKeyTypes=new Set([\"string\",\"number\"])}getFxn(t,e){const[s,r]=this.Pj.converter.default(this.Pj,t,e,t.term);if(s)return this[r.conv](s,t)}getAllowedKeys(t,e,s,r){if(!Array.isArray(t))return r.errors.push([\"key\",\"NON-ARRAY-KEYS\",e]),[];const o=[];for(const i of t)s.ignore(i)||(this.allowedKeyTypes.has(typeof i)?o.push(i):r.errors.push([s,\"INVALID-RESULT-KEY\",e]));return o}}e.prototype[\"\"]=function(t,e){return(s,r)=>this.getAllowedKeys([t(s,r)],s,e,r)},e.prototype[\"()\"]=e.prototype[\"\"],e.prototype[\"[]\"]=function(t,e){return(s,r)=>this.getAllowedKeys(t(s,r),s,e,r)},e.prototype[\"(]\"]=e.prototype[\"[]\"];class s{constructor(t){this.Pj=t}getFxn(t,e){return this[this.getValType(t.templateVal)+\"Filler\"](t,e,t.templateVal)}getValType(t){return\"string\"==typeof t?\"str\":Array.isArray(t)?\"arr\":t&&\"object\"==typeof t?\"obj\":\"default\"}strFiller(t,e,s,r){const[o,i]=this.Pj.converter.default(this.Pj,t,e,s);if(!o)return;const n=(r||i.aggr)+\",\"+i.conv;return n in this?this[n](o,t):void 0}arrFiller(t,e,s){const r=this.getValType(s[0]);return\"str\"==r?this.strFiller(t,e,s[0],\"[]\"):\"arr\"==r?this[\"[[,]]\"](s[0],t):\"obj\"==r?this[\"[{}]\"](s[0],t):this.defaultFiller(t,e,s)}objFiller(t,e,s){return this.Pj.parseTemplate(s,t.inheritedIgnore,t.lineage),(t,e,r)=>{this.Pj.setResultContext(\"{}\",e,r),this.Pj.processRow(t,s,r[e])}}defaultFiller(t,e,s){const r=JSON.stringify(s);return(t,e,s)=>{s[e]=JSON.parse(r)}}getArrSeed(t){const e=t.templateVal&&t.templateVal.length>1?t.templateVal[1]:1;if(\"set\"==e)return(t,e,s)=>{e in t?Array.isArray(t[e])&&(t[e]=new Set(t[e])):t[e]=new Set,t[e].add(s)};if(0==e)return(t,e,s)=>{e in t||(t[e]=[]),t[e].push(s)};if(this.isNumeric(e)){const t=new Map;return(s,r,o)=>{r in s||(s[r]=[]),t.has(s[r])||t.set(s[r],new Map);const i=t.get(s[r]);i.has(o)||i.set(o,0);const n=i.get(o);n<e&&(s[r].push(o),i.set(o,n+1))}}}isNumeric(t){return!isNaN(parseFloat(t))&&isFinite(t)&&\"\"!==t}}s.prototype[\",\"]=function(t,e){return(s,r,o,i)=>{const n=t(s,i);e.ignore(n,r,s)||(o[r]=n)}},s.prototype[\",()\"]=s.prototype[\",\"],s.prototype[\",[]\"]=s.prototype[\",\"],s.prototype[\",(]\"]=s.prototype[\",\"],s.prototype[\"[],\"]=function(t,e){const s=this.getArrSeed(e);if(s)return(r,o,i,n)=>{const l=t(r,n);e.ignore(l,o,r,n)||s(i,o,l)};e.errors.push([\"val\",\"INVALID-[]-OPTION\"])},s.prototype[\"[],()\"]=s.prototype[\"[],\"],s.prototype[\"[],[]\"]=function(t,e){const s=this.getArrSeed(e);return(r,o,i,n)=>{const l=t(r,n);if(Array.isArray(l))for(const t of l)e.ignore(t,o,r,n)||s(i,o,t);else n.errors.push([e,\"NON-ARRAY-VALS\",r])}},s.prototype[\"[],(]\"]=s.prototype[\"[],[]\"],s.prototype[\"[{}]\"]=function(t,e){this.Pj.parseTemplate(t,e.inheritedIgnore,e.lineage);const s=e.templateVal&&e.templateVal.length>1?e.templateVal[1]:\"\";if(!s)return(e,s,r)=>{this.Pj.setResultContext(\"[]\",s,r);const o=this.Pj.setResultContext(\"{}\",r[s].length,r[s]);this.Pj.processRow(e,t,o)};if(\"string\"==typeof s){const[r,o]=this.Pj.converter.default(this.Pj,Object.assign({},{templateVal:s}),e.inheritedIgnore,s);return o.aggr||o.skip||o.timing?void e.errors.push([\"val\",\"INVALID-[{}]-OPTION-TOKEN\"]):(o,i,n,l)=>{const c=this.Pj.setResultContext(\"[]\",i,n,!0),p=this.Pj.contexts.get(c).tracker,h=r(o,l),u=\"]\"==s.slice(-1)?h:[h];if(Array.isArray(u))for(const e of u)if(p.has(e))this.Pj.processRow(o,t,p.get(e));else{const s=this.Pj.setResultContext(\"{}\",c.length,c,!1,e,o,t);s&&(p.set(e,s),this.Pj.processRow(o,t,s))}else l.errors.push([e,\"NON-ARRAY-VALS\",o])}}e.errors.push([\"val\",\"INVALID-[{}]-OPTION\"])},s.prototype[\"[[,]]\"]=function(t,e){const s=[];for(const r of t){const t=Object.assign({},e,{templateVal:r});s.push(this.getFxn(t,e.inheritedIgnore))}return\"map\"!=(e.templateVal[1]?e.templateVal[1]:\"\")?(t,e,r)=>{e in r||(r[e]=[]);const o=[];for(const e in s)s[+e](t,+e,o);r[e].push(o)}:(t,e,r)=>{e in r?r[e]instanceof Map||(r[e]=new Map(r[e])):r[e]=new Map;const o=[];s[0](t,0,o),r[e].has(o[0])&&(o[1]=r[e].get(o[0])),s[1](t,1,o),r[e].set(o[0],o[1])}},s.prototype[\"+,\"]=function(t,e){return(s,r,o,i)=>{r in o||(o[r]=0);const n=t(s,i);e.ignore(n,r,s,i)||(this.isNumeric(n)?o[r]+=+n:i.errors.push([e,\"NON-NUMERIC-INCREMENT\",s]))}},s.prototype[\"+,()\"]=s.prototype[\"+,\"],s.prototype[\"+,[]\"]=function(t,e){return(s,r,o,i)=>{r in o||(o[r]=0);const n=t(s,i);if(Array.isArray(n))for(const t of n)e.ignore(t,r,s,i)||(this.isNumeric(t)?o[r]+=+t:i.errors.push([e,\"NON-NUMERIC-INCREMENT\",s]));else e.errors.push([\"val\",\"NON-ARRAY-VALS\",s])}},s.prototype[\"+,(]\"]=s.prototype[\"+,[]\"],s.prototype[\"-,\"]=function(t,e){return(s,r,o,i)=>{r in o||(o[r]=0);const n=t(s,i);e.ignore(n,r,s,i)||(this.isNumeric(n)?o[r]+=-n:i.errors.push([e,\"NON-NUMERIC-DECREMENT\",s]))}},s.prototype[\"-,()\"]=s.prototype[\"-,\"],s.prototype[\"-,[]\"]=function(t,e){return(s,r,o,i)=>{const n=t(s,i);if(Array.isArray(n)){r in o||(o[r]=0);for(const t of n)e.ignore(t,r,s,i)||(o[r]+=-t)}else e.errors.push([\"val\",\"NON-ARRAY-VALS\",s])}},s.prototype[\"-,(]\"]=s.prototype[\"-,[]\"],s.prototype[\"<,\"]=function(t,e){return(s,r,o,i)=>{const n=t(s,i);if(e.ignore(n,r,s,i))return;const l=+n;this.isNumeric(l)?r in o?o[r]<l&&(o[r]=l):o[r]=l:i.errors.push([e,\"NON-NUMERIC-THAN\",s])}},s.prototype[\"<,()\"]=s.prototype[\"<,\"],s.prototype[\"<,[]\"]=function(t,e){return(s,r,o,i)=>{const n=t(s,i);if(Array.isArray(n))for(const t of n){if(e.ignore(t,r,s,i))return;if(!this.isNumeric(t))return void i.errors.push([e,\"NON-NUMERIC-THAN\",s]);const n=+t;r in o?o[r]<n&&(o[r]=n):o[r]=n}else e.errors.push([\"val\",\"NON-ARRAY-VALS\",s])}},s.prototype[\"<,(]\"]=s.prototype[\"<,[]\"],s.prototype[\">,\"]=function(t,e){return(s,r,o,i)=>{const n=t(s,i);e.ignore(n,r,s,i)||(this.isNumeric(n)?r in o?o[r]>n&&(o[r]=n):o[r]=n:i.errors.push([e,\"NON-NUMERIC-THAN\",s]))}},s.prototype[\">,()\"]=s.prototype[\">,\"],s.prototype[\">,[]\"]=function(t,e){return(s,r,o,i)=>{const n=t(s,i);if(Array.isArray(n))for(const t of n){if(e.ignore(t,r,s,i))return;if(!this.isNumeric(t))return void i.errors.push([e,\"NON-NUMERIC-THAN\",s]);const n=+t;r in o?o[r]>n&&(o[r]=n):o[r]=n}else e.errors.push([\"val\",\"NON-ARRAY-VALS\",s])}},s.prototype[\">,(]\"]=s.prototype[\">,[]\"];class r{constructor(t){this.Pj=t,this.allErrSet=new Set,this.allErrObj=Object.create(null),this.mode={input:\"{}\",result:\"{}-\",root:\"\",console:\"{}\"},this.modeKeys=[\"input\",\"result\",\"root\",\"console\"],this.setMode()}setMode(t={}){Array.isArray(t)?this.modeKeys.forEach((e,s)=>this.mode[e]=t[s]):\"object\"==typeof t&&this.modeKeys.forEach(e=>{e in t&&(this.mode[e]=t[e])})}clear(t={}){this.allErrSet.clear(),this.allErrObj=Object.create(null),this.setMode(t)}markErrors(t,e){if(!e)return;const s=\"[]\"==this.mode.result.slice(0,2)?[]:{};for(const r in e.filler.inputs){const o=e.filler.inputs[r];for(const e of o.errors){const[r,i,n]=e;\"key\"==r?(this.track(s,e,o.lineage.join(this.Pj.delimit)),this.mode.input&&(t[\"{{ \"+i+\" }} \"+o.term]=o.templateVal)):\"val\"==r&&(Array.isArray(o.templateVal)?(this.track(s,e,o.templateVal[0]),this.mode.input&&(t[o.term]=[\"{{ \"+i+\" }} \",...o.templateVal])):\"string\"==typeof o.templateVal?(this.track(s,e,o.templateVal),this.mode.input&&(t[o.term]=\"{{ \"+i+\" }} \"+o.templateVal)):(this.track(s,e,o.templateVal),this.mode.input&&(t[o.term]=\"{{ \"+i+\" }} \")))}}if(e.errors.length){const r={};t[\"@errors\"]=r;for(const t of e.errors){const[e,o,i]=t;if(this.track(s,t,e.term),!this.mode.input)continue;const n=\"{{ \"+o+\" }} \"+e.term;n in r||(r[n]=0),r[n]+=1}}if(e.filler.errors.length)for(const t of e.filler.errors)this.track(s,t,t[2],!1);Object.keys(s).length&&this.mode.result&&(t[\"@errors\"]=s)}track(t,e,s,r=!0){this.allErrSet.add(e),this.trackAsObj(this.allErrObj,e,s),r&&\"-\"==this.mode.result.slice(-1)||(Array.isArray(t)?t.push(e):this.trackAsObj(t,e,s))}trackAsObj(t,e,s){const[r,o,i]=e;o in t||(t[o]=Object.create(null)),s in t[o]||(t[o][s]=i?[]:0),i?t[o][s].includes(i)||t[o][s].push(i):t[o][s]+=1}log(){const t=[...this.allErrSet];if(t.length){if(this.mode.root){const e=this.mode.root;this.Pj.tree[\"@errorsAll\"]=\"[]\"==e?t:this.allErrObj}if(this.mode.console){const e=this.mode.console.slice(0,2);console.log(\"[]\"==e?t:this.allErrObj)}}}}function o(t,e){const s=t.skipSymbols.includes(e[0])?e[0]:\"\",r=e.slice(s.length,s.length+3),o=t.timeSymbols.includes(r)?r:\"\",i=s.length+o.length,n=e[i],l=e.slice(-2),c=t.aggrSymbols.includes(n)&&n!=e?n:\"\",p=t.convSymbols.includes(l)&&l!=e?l:\"\",h=c&&p?e.slice(i+1,-2):c?e.slice(i+1):p?e.slice(i,-2):s||o?e.slice(i):e,u=t.subsSymbols.includes(h[0])?h[0]:\"\",a=c+u+p,f=u?h.slice(1):h;return[h,a,{skip:s,time:o,aggr:c,subs:u,stem:f,conv:p,subterm:h},t.steps.indexOf(o)]}const i={\"#\":function(t,e,s){t.commentedTerms.has(s)||t.commentedTerms.set(s,[]),t.commentedTerms.get(s).push(e)},\"*\":function(t,e,s){t.focusTemplate[s.term.slice(1)]=s.templateVal},\"\":function(t,e,s){return t.valFiller.isNumeric(e)?()=>+e:()=>e},$:function(t,e,s){if(\"$\"==e||e==\"$\"+t.delimit)return t=>t;if(e.includes(t.delimit)){const s=e.slice(1).split(t.delimit);\"\"==s[0]&&s.shift();const r=(t,e)=>t?t[e]:void 0;return t=>s.reduce(r,t)}{const t=e.slice(1);return e=>e[t]}},\"=\":function(t,e,s){const r=e.slice(1).split(t.delimit).reduce((t,e)=>t&&e in t?t[e]:void 0,t.opts[\"=\"]);if(r)return t=>r;s.errors.push([\"val\",\"MISSING-EXTERNAL-SUBS\"])},\"@\":function(t,e,s){if(!t.reserved.opts.includes(e)){if(\"@\"==e||e==\"@\"+t.delimit)return(t,e)=>e.self;if(e.includes(t.delimit)){const r=e.split(t.delimit),o=(r,o)=>{if(\"@\"==o[0]&&o.length>1&&!t.reserved.contexts.includes(o))return s.errors.push([\"val\",\"UNRECOGNIZED-CONTEXT-\"+e,s.lineage.join(\".\")+\".\"+o]),[null,null];const[i,n]=r;return i&&o?\"@\"==o?[n.self,n]:\"@values\"==o?[Object.values(i),n]:\"@\"==o[0]?[n[o.slice(1)],t.contexts.get(n[o.slice(1)])]:[i[o],t.contexts.get(i[o])]:[null,null]};return(t,e)=>r.reduce(o,[e.self,e])[0]}if(t.reserved.contexts.includes(e)){const t=e.slice(1);return(e,s)=>s[t]}s.errors.push([\"val\",\"UNRECOGNIZED-CONTEXT-\"+e])}},\"&\":function(t,e,s){const r=e.slice(1).split(t.delimit),o=r.shift();if(r.length){if(1==r.length){const e=r[0];return()=>{const s=t.joins.get(o);return s?s[e]:null}}{const e=(t,e)=>t?t[e]:null;t.joins.get(o);return s=>r.reduce(e,t.joins.get(o))}}return()=>t.joins.get(o)}},n={\"\":function(t,e,s){return t},\"()\":function(t,e,s){if(\"=\"==s.subs){const r=t();return\"function\"!=typeof r?void e.errors.push([\"val\",\"NOT-A-FUNCTION\",s.subs+s.term+s.conv]):r}return(s,r)=>{const o=t(s,r);if(\"function\"==typeof o)return o(s,r);e.errors.push([\"val\",\"NOT-A-FUNCTION\",s])}}};n[\"[]\"]=n[\"\"],n[\"(]\"]=n[\"()\"];var l=Object.freeze({__proto__:null,default:function(t,e,s,r){const[l,c,p]=o(t,r);if(t.reserved.opts.includes(l))return[];const h=l+p.conv;if(e.ignore=h in s?s[h]:s[\"@\"],p.skip&&\"~\"!=p.skip)return i[p.skip](t,l,e),[];if(p.subs in i){const s=i[p.subs](t,l,e);return s?[n[p.conv](s,e,p),p]:[]}return e.errors.push([\"val\",\"UNSUPPORTED-SYMBOL-\"+p.subs]),[]},parseTerm:o,subs:i,conv:n});class c{constructor(o={}){this.defaultOpts={template:{},seed:\"{}\",\"=\":{}},this.opts=Object.assign(this.defaultOpts,o),this.delimit=\".\",this.subsSymbols=[\"$\",\"=\",\"@\",\"&\"],this.convSymbols=[\"()\",\"[]\",\"(]\"],this.aggrSymbols=[\"+\",\"-\",\"<\",\">\"],this.timePost=[\"_0:\",\"_1:\",\"_2:\",\"_3:\",\"_4:\",\"_5:\",\"_6:\",\"_7:\",\"_8:\",\"_9:\"],this.timeSymbols=[\":__\",\"_:_\",\"__:\",...this.timePost],this.skipSymbols=[\"#\",\"*\",\"~\"],this.steps=[\":__\",\"\",\"_:_\"],this.errors=new r(this),this.reserved=new t(this),this.keyFiller=new e(this),this.valFiller=new s(this),this.commentedTerms=new Map,this.joins=new Map,this.fillers=new Map,this.contexts=new Map,this.temps=new Map,this.refresh()}refresh(t={}){this.times={start:+new Date},Object.assign(this.opts,t),\"string\"!=typeof this.opts.template&&(this.opts.template=JSON.stringify(this.opts.template));const e=JSON.parse(this.opts.template);this.errors.clear(e[\"@errmode\"]),e[\"@delimit\"]&&(this.delimit=e[\"@delimit\"]),this.commentedTerms.clear(),this.joins.clear(),this.fillers.clear(),this.contexts.clear(),this.temps.clear(),delete this.tree,this.tree=this.setResultContext(this.opts.seed),this.focusTemplate=Object.create(null),this.parseTemplate(e,{\"@\":this.reserved.notDefined}),this.times.parse=+new Date-this.times.start,Object.keys(this.focusTemplate).length?(this.parseTemplate(this.focusTemplate,{\"@\":this.reserved.notDefined}),this.template=this.focusTemplate):this.template=e,this.postLoopTerms=Object.create(null),this.done=[],this.opts.data&&this.add(this.opts.data,!1),this.errors.log(this.fillers)}setResultContext(t,e=null,s=null,r=!1,o,i=null,n=null){const l=null!==e&&e in s?s[e]:JSON.parse(t);if(this.contexts.has(l))return l;const c={branch:e,parent:s,context:this.contexts.get(s),self:l,root:this.tree?this.tree:l,joins:this.joins,errors:[],key:o};if(r&&(c.tracker=new Map),i&&n){const t=this.fillers.get(n);if(!t[\"@before\"](i,c))return;if(t[\"@join\"]&&!t[\"@join\"](i,c))return}return this.contexts.set(l,c),null!==e&&(s[e]=l),l}parseTemplate(t,e,s=[]){const r=Object.create(null);r.inputs=Object.create(null),r[\"@before\"]=this.reserved.trueFxn,r[\"@after\"]=this.reserved.trueFxn,r.postTerms={},r.errors=[];const i=this.reserved[\"@ignore\"](t,e,r);r[\"@ignore\"]=i,this.fillers.set(t,r);const n=this.steps.map(t=>[]);for(const e in t){const[l,c,p,h]=o(this,e),u=t[e],a=r.inputs[e]={term:e,subterm:l,symbols:c,keyTokens:p,templateVal:u,lineage:[...s,e],inheritedIgnore:i,errors:[]};\"@()\"==c?this.reserved.setFxn(l,a,r,u):(a.keyFxn=this.keyFiller.getFxn(a,i),a.keyFxn&&(a.valFxn=this.valFiller.getFxn(a,i),\"__:\"==p.time||this.timePost.includes(p.time)?(r.postTerms[p.time]||(r.postTerms[p.time]=[]),r.postTerms[p.time].includes(e)||r.postTerms[p.time].push(e)):n[h].push(e)))}r.steps=n.filter(t=>t.length)}add(t,e=!0){this.times.start||(this.times.start=+new Date),e&&this.errors.clear(),this.joins.clear();for(const e of t)if(this.split)for(const t of this.split(e))this.processRow(t,this.template,this.tree),this.joins.clear();else this.processRow(e,this.template,this.tree),this.joins.clear();this.processResult(this.tree);for(const t of this.timePost)if(this.postLoopTerms[t])for(const e of this.postLoopTerms[t])this.postLoop(e.self,e,t);for(const t of this.done)t.done(t.self,t);for(const[t,e]of this.temps)for(const s of e)delete t[s];this.times.total=+new Date-this.times.start,delete this.times.start,e&&this.errors.log()}processRow(t,e,s){const r=this.contexts.get(s),o=this.fillers.get(e);if(r.filler=o,o[\"@before\"](t,r)&&(!o[\"@join\"]||o[\"@join\"](t,r))){for(const e of o.steps)for(const i of e){const e=o.inputs[i];if(e.keyFxn&&e.valFxn){const o=e.keyFxn(t,r);for(const i of o)e.valFxn(t,i,s,r),\"~\"==e.keyTokens.skip&&(this.temps.has(s)||this.temps.set(s,new Set),this.temps.get(s).add(i))}}o[\"@after\"](t,r),o[\"@dist\"]&&o[\"@dist\"](r),o[\"@done\"]&&!this.done.includes(r)&&(r.done=o[\"@done\"],this.done.push(r));for(const t in o.postTerms)this.postLoopTerms[t]||(this.postLoopTerms[t]=[]),this.postLoopTerms[t].includes(r)||this.postLoopTerms[t].push(r);return!0}}postLoop(t,e,s=\"__:\"){if(e&&e.filler&&e.filler.postTerms[s])for(const r of e.filler.postTerms[s]){const s=e.filler.inputs[r];if(s.keyFxn&&s.valFxn){const r=s.keyFxn(null,e);for(const o of r)s.valFxn(null,o,t,e)}}}processResult(t){const e=this.contexts.get(t);this.postLoop(t,e,\"__:\");for(const e in t){const s=t[e];if(s)if(Array.isArray(s)||s instanceof Set||s instanceof Map)for(const t of s)\"object\"==typeof t&&this.processResult(t);else if(\"object\"==typeof s){const t=this.contexts.get(s);t&&t[\"@dist\"]&&t[\"@dist\"](s),this.processResult(s)}}e&&e.filler&&this.errors.markErrors(t,e)}copyResult(t,e={}){if(arguments.length&&void 0===t)return;const s=arguments.length?t:this.tree;for(const t in s){const r=s[t];if(r instanceof Set||r instanceof Map)e[t]=[...r];else if(Array.isArray(r)){e[t]=[];for(const s of r)if(Array.isArray(s)){const r=[];e[t].push(r),this.copyResult(s,r)}else if(s&&\"object\"==typeof s){const r=Object.create(null);e[t].push(r),this.copyResult(s,r)}else e[t]=JSON.parse(JSON.stringify(r))}else r&&\"object\"==typeof r?(e[t]=Object.create(null),this.copyResult(r,e[t])):e[t]=JSON.parse(JSON.stringify(r))}return e}}return c.prototype.converter=l,c});\n", "import Partjson from 'partjson'\nimport { compute_bins } from '#shared/termdb.bins.js'\nimport { sample_match_termvaluesetting } from '../common/termutils'\nimport { isNumeric } from '#shared/helpers.js'\n\nexport function getBarchartData(_q, data) {\n\t/*\n\t _q: term.q \n\t data: rows of data, each row is unique by sample\n\t*/\n\t// need to not overwrite original term definition data\n\tconst q = JSON.parse(JSON.stringify(_q))\n\n\t// support legacy query parameter names\n\tif (!q.term1) q.term1 = q.term ? q.term : {}\n\tif (!q.term1_q) q.term1_q = {}\n\tif (!q.term0) q.term0 = {}\n\tif (!q.term0_q) q.term0_q = {}\n\tif (!q.term2) q.term2 = {}\n\tif (!q.term2_q) q.term2_q = {}\n\tif (!q.filter) q.filter = { type: 'tvslst', join: '', lst: [] }\n\n\tconst pj = getCharts(q, data)\n\treturn pj.tree.results\n}\n\nfunction getTrackers() {\n\treturn {\n\t\tjoinFxns: { '': () => '' }, // keys are term0, term1, term2 names; ...\n\t\tnumValFxns: { '': () => {} }, // ... if key == empty string then the term is not specified\n\t\torderedLabels: [],\n\t\tbins: []\n\t}\n}\n\n// template for partjson, already stringified so that it does not\n// have to be re-stringified within partjson refresh for every request\nconst templateBar = JSON.stringify({\n\t'@before()': '=prep()',\n\t'@join()': {\n\t\tidVal: '=idVal()'\n\t},\n\tresults: {\n\t\t'_2:maxAcrossCharts': '=maxAcrossCharts()',\n\t\tcharts: [\n\t\t\t{\n\t\t\t\tchartId: '@key',\n\t\t\t\ttotal: '+1',\n\t\t\t\t'_1:maxSeriesTotal': '=maxSeriesTotal()',\n\t\t\t\t'@done()': '=filterEmptySeries()',\n\t\t\t\tserieses: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttotal: '+1',\n\t\t\t\t\t\tseriesId: '@key',\n\t\t\t\t\t\tmax: '<&idVal.dataVal', // needed by client-side boxplot renderer\n\t\t\t\t\t\t'~values': ['&idVal.dataVal', 0],\n\t\t\t\t\t\t'~sum': '+&idVal.dataVal',\n\t\t\t\t\t\t'__:boxplot': '=boxplot()',\n\t\t\t\t\t\t'~samples': ['$sample', 'set'],\n\t\t\t\t\t\t//'__:AF': '=getAF()',\n\t\t\t\t\t\tdata: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdataId: '@key',\n\t\t\t\t\t\t\t\ttotal: '+1'\n\t\t\t\t\t\t\t\t//samples: ['$sample']\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'&idVal.dataId[]'\n\t\t\t\t\t\t]\n\t\t\t\t\t},\n\t\t\t\t\t'&idVal.seriesId[]'\n\t\t\t\t]\n\t\t\t},\n\t\t\t'&idVal.chartId[]'\n\t\t],\n\t\t'~sum': '+&idVal.seriesVal',\n\t\t'~values': ['&idVal.seriesVal', 0],\n\t\t'__:boxplot': '=boxplot()',\n\t\trefs: {\n\t\t\tcols: ['&idVal.seriesId[]'],\n\t\t\tcolgrps: ['-'],\n\t\t\trows: ['&idVal.dataId[]'],\n\t\t\trowgrps: ['-'],\n\t\t\tcol2name: {\n\t\t\t\t'&idVal.seriesId[]': {\n\t\t\t\t\tname: '@branch',\n\t\t\t\t\tgrp: '-'\n\t\t\t\t}\n\t\t\t},\n\t\t\trow2name: {\n\t\t\t\t'&idVal.dataId[]': {\n\t\t\t\t\tname: '@branch',\n\t\t\t\t\tgrp: '-'\n\t\t\t\t}\n\t\t\t},\n\t\t\t'__:useColOrder': '=useColOrder()',\n\t\t\t'__:useRowOrder': '=useRowOrder()',\n\t\t\t'__:bins': '=bins()',\n\t\t\t//'__:q': '=q()',\n\t\t\t'@done()': '=sortColsRows()'\n\t\t},\n\t\t'@done()': '=sortCharts()'\n\t}\n})\n\nfunction getCharts(q, data) {\n\t/*\n q: objectified URL query string\n inReq: request-specific closured functions and variables\n data: rows of annotation data\n */\n\n\t/*\n\t\tA map of functions to get a term's id and value, by its term.type\n\t\tThe function will be used in idVal() below to get the chart/series/data ID and value\n\t\tfor a given data row\n */\n\tconst idValFxns = {\n\t\tcategorical: getCategoricalIdVal,\n\t\tinteger: getNumericIdVal,\n\t\tfloat: getNumericIdVal,\n\t\tundefined: getUndefinedIdVal\n\t\t// NOTE: condition terms are not currently supported for frontend vocab\n\t}\n\n\treturn new Partjson({\n\t\tdata,\n\t\tseed: `{\"values\": []}`, // result seed\n\t\ttemplate: templateBar,\n\t\t'=': {\n\t\t\tidVal(row, context) {\n\t\t\t\tconst [chartId, chartVal] = idValFxns[q.term0.type](row.data, q.term0, q.term0_q, data)\n\t\t\t\tconst [seriesId, seriesVal] = idValFxns[q.term1.type](row.data, q.term1, q.term1_q, data)\n\t\t\t\tconst [dataId, dataVal] = idValFxns[q.term2.type](row.data, q.term2, q.term2_q, data)\n\t\t\t\treturn {\n\t\t\t\t\tchartId,\n\t\t\t\t\tchartVal,\n\t\t\t\t\tseriesId,\n\t\t\t\t\tseriesVal,\n\t\t\t\t\tdataId,\n\t\t\t\t\tdataVal\n\t\t\t\t}\n\t\t\t},\n\t\t\tprep(row) {\n\t\t\t\treturn sample_match_termvaluesetting(row.data, q.filter)\n\t\t\t},\n\t\t\tmaxSeriesTotal(row, context) {\n\t\t\t\tlet maxSeriesTotal = 0\n\t\t\t\tfor (const grp of context.self.serieses) {\n\t\t\t\t\tif (grp && grp.total > maxSeriesTotal) {\n\t\t\t\t\t\tmaxSeriesTotal = grp.total\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn maxSeriesTotal\n\t\t\t},\n\t\t\tmaxAcrossCharts(row, context) {\n\t\t\t\tlet maxAcrossCharts = 0\n\t\t\t\tfor (const chart of context.self.charts) {\n\t\t\t\t\tif (chart.maxSeriesTotal > maxAcrossCharts) {\n\t\t\t\t\t\tmaxAcrossCharts = chart.maxSeriesTotal\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn maxAcrossCharts\n\t\t\t},\n\t\t\tboxplot(row, context) {\n\t\t\t\tif (!context.self.values || !context.self.values.length) return\n\t\t\t\tconst values = context.self.values.filter(d => d !== null && !isNaN(d))\n\t\t\t\tif (!values.length) return\n\t\t\t\tvalues.sort((i, j) => i - j)\n\t\t\t\tconst stat = boxplot_getvalue(\n\t\t\t\t\tvalues.map(v => {\n\t\t\t\t\t\treturn { value: +v }\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\tstat.mean = context.self.sum / values.length\n\t\t\t\tlet s = 0\n\t\t\t\tfor (const v of values) {\n\t\t\t\t\ts += Math.pow(v - stat.mean, 2)\n\t\t\t\t}\n\t\t\t\tstat.sd = Math.sqrt(s / (values.length - 1))\n\t\t\t\tif (isNaN(stat.sd)) stat.sd = null\n\t\t\t\treturn stat\n\t\t\t},\n\t\t\tnumSamples(row, context) {\n\t\t\t\treturn context.self.samples.size\n\t\t\t},\n\t\t\tfilterEmptySeries(result) {\n\t\t\t\tconst nonempty = result.serieses.filter(series => series.total)\n\t\t\t\tresult.serieses.splice(0, result.serieses.length, ...nonempty)\n\t\t\t},\n\t\t\tsortColsRows(result) {\n\t\t\t\tif (q.term1_q.orderedLabels) {\n\t\t\t\t\tconst labels = q.term1_q.orderedLabels\n\t\t\t\t\tresult.cols.sort((a, b) => labels.indexOf(a) - labels.indexOf(b))\n\t\t\t\t}\n\t\t\t\tif (q.term2.orderedLabels) {\n\t\t\t\t\tconst labels = q.term2_q.orderedLabels\n\t\t\t\t\tresult.rows.sort((a, b) => labels.indexOf(a) - labels.indexOf(b))\n\t\t\t\t}\n\t\t\t},\n\t\t\tsortCharts(result) {},\n\t\t\tuseColOrder() {\n\t\t\t\treturn q.term1_q.orderedLabels && q.term1_q.orderedLabels.length > 0\n\t\t\t},\n\t\t\tuseRowOrder() {\n\t\t\t\treturn q.term2_q.orderedLabels && q.term2_q.orderedLabels.length > 0\n\t\t\t},\n\t\t\tbins() {\n\t\t\t\treturn [q.term0_q, q.term1_q, q.term2_q].map(d => d.computed_bins)\n\t\t\t},\n\t\t\tq() {}\n\t\t}\n\t})\n}\n\nfunction setDatasetAnnotations(item) {\n\tif (item.type == 'tvslst') {\n\t\tfor (const subitem of item.lst) {\n\t\t\tsetDatasetAnnotations(subitem)\n\t\t}\n\t} else {\n\t\tif (item.tvs.term.type == 'categorical') {\n\t\t\titem.tvs.valueset = new Set(item.tvs.values.map(i => i.key))\n\t\t}\n\t}\n}\n\n/* \n\tArguments: \n\td: data row, an object with sample ID and the annotation values for one or more terms,\n\t\t but this function is used specifically for annotation terms that are categorical\n\tterm\n\n\tReturns:\n\t[\t\n\t\t[id]: a list of matching chartId, seriesId, or dataId for this data row,\n\t\tvalue: the annotation value for this term\n\t]\n*/\nfunction getCategoricalIdVal(d, term) {\n\tconst id = 'id' in term ? d[term.id] : '-'\n\tconst value = 'id' in term && isNumeric(d[term.id]) ? +d[term.id] : 0\n\treturn [[id], value]\n}\n\n/* \n\tArguments: \n\td: data row, an object with sample ID and the annotation values for one or more terms,\n\t\t but this function is used specifically for annotation terms that are categorical\n\tterm\n\n\tReturns:\n\t[\n\t\t[id]: a list of matching chartId, seriesId, or dataId for this data row,\n\t\tvalue: the annotation value for this term\n\t]\n*/\nfunction getNumericIdVal(d, term, q, rows) {\n\tif (!('id' in term) || !(term.id in d)) return [[], undefined]\n\tif (!q.computed_bins) {\n\t\tconst summary = {}\n\t\trows.map(row => {\n\t\t\tif (!isNumeric(row.data[term.id])) return\n\t\t\tconst v = +row.data[term.id]\n\t\t\tif (!('min' in summary) || summary.min > v) summary.min = v\n\t\t\tif (!('max' in summary) || summary.max < v) summary.max = v\n\t\t})\n\t\tq.computed_bins = compute_bins(q, percentiles => summary)\n\t\tq.orderedLabels = q.computed_bins.map(d => d.label)\n\t}\n\tconst v = d[term.id]\n\tif (term.values && v in term.values && term.values[v].uncomputable) {\n\t\treturn [[term.values[v].label], undefined]\n\t}\n\t// ignore non-numeric values like empty string, \"\"\n\t// which may occur naturally in a csv/tab-delimited input\n\tif (isNumeric(d[term.id])) {\n\t\tconst ids = []\n\t\tfor (const b of q.computed_bins) {\n\t\t\tif (b.startunbounded) {\n\t\t\t\tif (v < b.stop) {\n\t\t\t\t\tids.push(b.label)\n\t\t\t\t} else if (b.stopinclusive && v === b.stop) {\n\t\t\t\t\tids.push(b.label)\n\t\t\t\t}\n\t\t\t} else if (b.stopunbounded) {\n\t\t\t\t// a bin should not be true for both b.startunbounded and b.stopunbounded,\n\t\t\t\t// since that is not a finite bin\n\t\t\t\tif (v > b.start) {\n\t\t\t\t\tids.push(b.label)\n\t\t\t\t} else if (b.stopinclusive && v === b.start) {\n\t\t\t\t\tids.push(b.label)\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\t(v > b.start || (v === b.start && b.startinclusive)) &&\n\t\t\t\t(v < b.stop || (v === b.stop && b.stopinclusive))\n\t\t\t) {\n\t\t\t\tids.push(b.label)\n\t\t\t}\n\t\t\t// for numeric terms, may match the sample annotation to at most one chartId, seriesId, or dataId,\n\t\t\t// so break the loop as soon as a matching id is found for a data row\n\t\t\t// TODO: may allow exceptions later to have more than 1 matching id???\n\t\t\tif (ids.length) break\n\t\t}\n\t\treturn [ids, v]\n\t}\n\treturn [[], undefined]\n}\n\nfunction getUndefinedIdVal() {\n\treturn [['-'], undefined]\n}\n\nfunction boxplot_getvalue(lst) {\n\t/* ascending order\n each element: {value}\n */\n\tconst l = lst.length\n\tif (l < 5) {\n\t\t// less than 5 items, won't make boxplot\n\t\treturn { out: lst }\n\t}\n\tconst p50 = lst[Math.floor(l / 2)].value\n\tconst p25 = lst[Math.floor(l / 4)].value\n\tconst p75 = lst[Math.floor((l * 3) / 4)].value\n\tconst p05 = lst[Math.floor(l * 0.05)].value\n\tconst p95 = lst[Math.floor(l * 0.95)].value\n\tconst p01 = lst[Math.floor(l * 0.01)].value\n\tconst iqr = p75 - p25\n\n\tlet w1, w2\n\tif (iqr == 0) {\n\t\tw1 = 0\n\t\tw2 = 0\n\t} else {\n\t\tconst i = lst.findIndex(i => i.value > p25 - iqr * 1.5)\n\t\tw1 = lst[i == -1 ? 0 : i].value\n\t\tconst j = lst.findIndex(i => i.value > p75 + iqr * 1.5)\n\t\tw2 = lst[j == -1 ? l - 1 : Math.max(0, j - 1)].value\n\t}\n\tconst out = lst.filter(i => i.value < p25 - iqr * 1.5 || i.value > p75 + iqr * 1.5)\n\treturn { w1, w2, p05, p25, p50, p75, p95, iqr, out }\n}\n\nexport function getCategoryData(q, data) {\n\tif (!data || !data.length) {\n\t\t// support custom vocab/adhoc dictionary with no sample annotations\n\t\treturn {\n\t\t\tlst: Object.keys(q.term.values).map(k => {\n\t\t\t\treturn { key: k, label: q.term.values[k].label, value: k }\n\t\t\t})\n\t\t}\n\t}\n\t//\n\tconst pj = new Partjson({\n\t\tdata,\n\t\ttemplate: JSON.stringify({\n\t\t\t'@before()': '=prep()',\n\t\t\t'@join()': {\n\t\t\t\tidVal: '=idVal()'\n\t\t\t},\n\t\t\tresults: {\n\t\t\t\t'&idVal.id': {\n\t\t\t\t\tsamplecount: '+1',\n\t\t\t\t\t':__key': '&idVal.id',\n\t\t\t\t\t':__label': '&idVal.id',\n\t\t\t\t\t':__value': '&idVal.id'\n\t\t\t\t}\n\t\t\t}\n\t\t}),\n\t\t'=': {\n\t\t\tprep(row) {\n\t\t\t\treturn sample_match_termvaluesetting(row.data, q.filter)\n\t\t\t},\n\t\t\tidVal(row, context) {\n\t\t\t\tconst [id, value] = getCategoricalIdVal(row.data, q.term)\n\t\t\t\treturn { id: id[0], value }\n\t\t\t}\n\t\t}\n\t})\n\treturn { lst: Object.values(pj.tree.results) }\n}\n", "///////////////////\n//\n// all client-side stuff, including DOM\n//\n///////////////////\n\nimport { scaleLinear } from 'd3-scale'\nimport { select as d3select, selectAll as d3selectAll } from 'd3-selection'\nimport { rgb as d3rgb } from 'd3-color'\nimport * as common from '#shared/common.js'\nimport { set_base_zindex } from '#common/globals'\nimport { dofetch, dofetch2, dofetch3 } from '../common/dofetch'\n// support client code that import dofetch* from client.js\n// TODO: update affected code to import dofetch* directly from common/dofetch.js\nexport { dofetch, dofetch2, dofetch3 }\nimport { Menu, make_table_2col, fillbar, axisstyle, sayerror } from '#dom'\nexport { Menu, axisstyle, fillbar, make_table_2col, sayerror }\nimport { first_genetrack_tolist } from '../common/1stGenetk'\nexport { first_genetrack_tolist }\n\nexport const font = 'Arial'\nexport const unspecified = 'Unspecified'\nexport const colorinframe = 'green'\nexport const coloroutframe = '#858585'\nexport const colorbgleft = '#FCE3B8'\nexport const colorbgright = '#D2E2FC'\nexport const colorantisense = 'red'\nexport const colorctx = '#DE3336'\nexport const textlensf = 0.6 // to replace n.getBBox().width for detecting filling font size which breaks in chrome\n\nexport let base_zindex = null\n\n// things that used to be in client.js but now have been moved to common\nexport const tkt = common.tkt\nexport const gmmode = common.gmmode\n\nexport function appear(d, display) {\n\td.style('opacity', 0)\n\t\t.style('display', display || 'block')\n\t\t.transition()\n\t\t.style('opacity', 1)\n}\n\nexport function disappear(d, remove) {\n\td.style('opacity', 1)\n\t\t.transition()\n\t\t.style('opacity', 0)\n\t\t.call(() => {\n\t\t\tif (remove) {\n\t\t\t\td.remove()\n\t\t\t} else {\n\t\t\t\td.style('display', 'none').style('opacity', 1)\n\t\t\t}\n\t\t})\n}\n\nexport const tip = new Menu({ padding: '' })\ntip.d.style('z-index', 1000)\n\nexport function newpane(pm) {\n\t/*\n\tparameter\n\n\t.setzindex\n\t\tquick dirty way to set the global variable base_zindex\n\n\t.x\n\t.y\n\t.toshrink\n\t\tbool\n\t.close\n\t\tcallback\n\t.closekeep\n\t\tbool\n\t.headpad\n\t\theader label bar padding\n\n\t*/\n\n\tif (pm.setzindex) {\n\t\t/*\n\t\tdirty fix\n\t\t*/\n\t\tbase_zindex = pm.setzindex\n\t\tset_base_zindex(pm.setzindex)\n\t\treturn\n\t}\n\n\tconst dur = 300\n\tconst pp = {}\n\tconst body = d3select(document.body)\n\tpp.pane = body\n\t\t.append('div')\n\t\t.attr('class', 'sja_pane')\n\t\t.style('left', pm.x + window.pageXOffset + 'px')\n\t\t.style('top', pm.y + window.pageYOffset + 'px')\n\t\t.style('opacity', 0)\n\n\tif (pm.$id) {\n\t\tpp.pane.attr('id', pm.$id)\n\t}\n\n\tif (base_zindex) {\n\t\t// fixed, from embedding instructions\n\t\tpp.pane.style('z-index', base_zindex)\n\t}\n\n\tpp.pane.transition().duration(dur).style('opacity', 1)\n\n\tconst toprow = pp.pane.append('div').on('mousedown', event => {\n\t\tevent.preventDefault()\n\t\tevent.stopPropagation()\n\t\tconst oldx = Number.parseInt(pp.pane.style('left')),\n\t\t\toldy = Number.parseInt(pp.pane.style('top'))\n\t\tconst x0 = event.clientX,\n\t\t\ty0 = event.clientY\n\t\tbody.on('mousemove', event => {\n\t\t\tpp.pane.style('left', oldx + event.clientX - x0 + 'px').style('top', oldy + event.clientY - y0 + 'px')\n\t\t})\n\t\tbody.on('mouseup', function () {\n\t\t\tbody.on('mouseup', null).on('mousemove', null)\n\t\t})\n\t\t// order of precedence, among all panes\n\t\tdocument.body.appendChild(pp.pane.node())\n\t})\n\n\tconst butt = toprow\n\t\t.append('div')\n\t\t.attr('class', 'sja_menuoption')\n\t\t.style('display', 'inline-block')\n\t\t.style('padding', '4px 10px')\n\t\t.style('margin', '0px')\n\t\t.style('border-right', 'solid 1px white')\n\t\t.style('cursor', 'default')\n\t\t.style('font-size', '1.5em')\n\t\t.on('mousedown', event => {\n\t\t\tdocument.body.dispatchEvent(new Event('mousedown'))\n\t\t\tevent.stopPropagation()\n\t\t})\n\n\tif (pm.toshrink) {\n\t\tpp.mini = false\n\t\tbutt.html('━').on('click', () => {\n\t\t\tbutt.html(pp.mini ? '━' : '◽')\n\t\t\tif (pp.mini) {\n\t\t\t\tappear(pp.body)\n\t\t\t} else {\n\t\t\t\tdisappear(pp.body)\n\t\t\t}\n\t\t\tpp.mini = !pp.mini\n\t\t})\n\t} else {\n\t\tbutt.html('×')\n\t\tif (pm.close) {\n\t\t\t// custom callback on close button\n\t\t\tbutt.on('click', pm.close)\n\t\t} else if (pm.closekeep) {\n\t\t\t// hide and keep to bring it on later\n\t\t\tbutt.on('click', () => {\n\t\t\t\tpp.pane\n\t\t\t\t\t.transition()\n\t\t\t\t\t.duration(dur)\n\t\t\t\t\t.style('opacity', 0)\n\t\t\t\t\t.call(() => pp.pane.style('display', 'none'))\n\t\t\t})\n\t\t} else {\n\t\t\t// close and remove pane from page\n\t\t\tbutt.on('click', () => {\n\t\t\t\tpp.pane\n\t\t\t\t\t.transition()\n\t\t\t\t\t.duration(dur)\n\t\t\t\t\t.style('opacity', 0)\n\t\t\t\t\t.call(() => pp.pane.remove())\n\t\t\t})\n\t\t}\n\t}\n\t// where you can write\n\tpp.header = toprow\n\t\t.append('div')\n\t\t.style('display', 'inline-block')\n\t\t.style('font-family', font)\n\t\t.style('padding', pm.headpad || '5px 10px')\n\tpp.body = pp.pane.append('div').style('font-family', font)\n\treturn pp\n}\n\nexport function getdomaintypes(gm) {\n\tif (!gm.pdomains) return []\n\n\tconst types = new Map()\n\t// k: domain.name+domain.description\n\t// v: {} attributes of this type of domain\n\n\tfor (const i of gm.pdomains) {\n\t\tconst key = i.name + i.description\n\t\tif (types.has(key)) {\n\t\t\ttypes.get(key).start = Math.min(types.get(key).start, i.start)\n\t\t} else {\n\t\t\ttypes.set(key, {\n\t\t\t\tname: i.name,\n\t\t\t\tdescription: i.description,\n\t\t\t\tcolor: i.color,\n\t\t\t\tstart: i.start,\n\t\t\t\tiscustom: i.iscustom,\n\t\t\t\turl: i.url,\n\t\t\t\tpmid: i.pmid,\n\t\t\t\tCDD: i.CDD,\n\t\t\t\tPfam: i.Pfam,\n\t\t\t\tSMART: i.SMART,\n\t\t\t\tCOG: i.COG,\n\t\t\t\tPRK: i.PRK,\n\t\t\t\tCurated_at_NCBI: i.Curated_at_NCBI\n\t\t\t})\n\t\t}\n\t}\n\tconst lst = []\n\tfor (const [key, domaintype] of types) {\n\t\tdomaintype.key = key\n\t\tdomaintype.fill = domaintype.color\n\t\tdomaintype.stroke = d3rgb(domaintype.color).darker(1).toString()\n\t\tdelete domaintype.color\n\t\tlst.push(domaintype)\n\t}\n\tlst.sort((a, b) => a.start - b.start)\n\treturn lst\n}\n\nexport function sketchSplicerna(holder, gm, pxwidth, color) {\n\tlet intronpx = 10\n\tif (intronpx * (gm.exon.length - 1) > pxwidth * 0.3) {\n\t\tintronpx = Math.max(2, (pxwidth * 0.3) / (gm.exon.length - 1))\n\t}\n\tlet exonlen = 0\n\tfor (const e of gm.exon) {\n\t\texonlen += e[1] - e[0]\n\t}\n\tconst inw = intronpx * (gm.exon.length - 1)\n\tconst exonsf = (pxwidth - (inw > pxwidth * 0.4 ? 0 : inw)) / exonlen\n\t// reset width\n\tpxwidth = exonsf * exonlen + inw\n\tconst canvas = holder.append('canvas').node()\n\tcanvas.width = pxwidth\n\tconst h = 20\n\tconst pad = 4\n\tcanvas.height = h\n\tconst ctx = canvas.getContext('2d')\n\tctx.strokeStyle = color\n\t//ctx.setLineDash([1,1])\n\tctx.beginPath()\n\tctx.moveTo(0, Math.floor(h / 2) - 0.5)\n\tctx.lineTo(pxwidth, Math.floor(h / 2) - 0.5)\n\tctx.stroke()\n\t// gm.exon is 5 to 3\n\tconst reverse = gm.strand == '-'\n\tlet x = 0\n\tfor (const e of gm.exon) {\n\t\tlet thin1 = null,\n\t\t\tthick = null,\n\t\t\tthin2 = null\n\t\tif (reverse) {\n\t\t\tconst start = e[1],\n\t\t\t\tstop = e[0],\n\t\t\t\tcds5 = gm.codingstop,\n\t\t\t\tcds3 = gm.codingstart\n\t\t\tif (stop >= cds5) {\n\t\t\t\tthin1 = e\n\t\t\t} else if (stop >= cds3) {\n\t\t\t\tif (start >= cds5) {\n\t\t\t\t\tthin1 = [cds5, start]\n\t\t\t\t\tthick = [stop, cds5]\n\t\t\t\t} else {\n\t\t\t\t\tthick = e\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (start >= cds5) {\n\t\t\t\t\t// assumption: 1 single continuous cds\n\t\t\t\t\tthin1 = [cds5, start]\n\t\t\t\t\tthin2 = [stop, cds3]\n\t\t\t\t\tthick = [cds3, cds5]\n\t\t\t\t} else if (start >= cds3) {\n\t\t\t\t\tthin2 = [stop, cds3]\n\t\t\t\t\tthick = [cds3, start]\n\t\t\t\t} else {\n\t\t\t\t\tthin2 = e\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (e[1] <= gm.codingstart) {\n\t\t\t\tthin1 = e\n\t\t\t} else if (e[1] <= gm.codingstop) {\n\t\t\t\tif (e[0] <= gm.codingstart) {\n\t\t\t\t\tthin1 = [e[0], gm.codingstart]\n\t\t\t\t\tthick = [gm.codingstart, e[1]]\n\t\t\t\t} else {\n\t\t\t\t\tthick = e\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (e[0] <= gm.codingstart) {\n\t\t\t\t\t// assumption: 1 single continuous cds\n\t\t\t\t\tthin1 = [e[0], gm.codingstart]\n\t\t\t\t\tthin2 = [gm.codingstop, e[1]]\n\t\t\t\t\tthick = [gm.codingstart, gm.codingstop]\n\t\t\t\t} else if (e[0] < gm.codingstop) {\n\t\t\t\t\tthin2 = [gm.codingstop, e[1]]\n\t\t\t\t\tthick = [e[0], gm.codingstop]\n\t\t\t\t} else {\n\t\t\t\t\tthin2 = e\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (thin1) {\n\t\t\tctx.fillStyle = '#aaa'\n\t\t\tconst exonw = Math.max(1, (thin1[1] - thin1[0]) * exonsf)\n\t\t\tctx.fillRect(x, pad, exonw, h - pad * 2)\n\t\t\tx += exonw\n\t\t}\n\t\tif (thick) {\n\t\t\tctx.fillStyle = color\n\t\t\tconst exonw = Math.max(1, (thick[1] - thick[0]) * exonsf)\n\t\t\tctx.fillRect(x, 0, exonw, h)\n\t\t\tx += exonw\n\t\t}\n\t\tif (thin2) {\n\t\t\tctx.fillStyle = '#aaa'\n\t\t\tconst exonw = Math.max(1, (thin2[1] - thin2[0]) * exonsf)\n\t\t\tctx.fillRect(x, pad, exonw, h - pad * 2)\n\t\t\tx += exonw\n\t\t}\n\t\tx += intronpx\n\t}\n}\n\nexport function sketchGmsum(holder, rglst, gm, exonsf, intronw, pxwidth, h, color) {\n\tconst canvas = holder.append('canvas').node()\n\tcanvas.width = pxwidth\n\tcanvas.height = h\n\tconst pad = Math.ceil(h / 5)\n\tconst ctx = canvas.getContext('2d')\n\tlet start\n\tlet x = 0\n\tfor (const r of rglst) {\n\t\tif (r.chr != gm.chr) {\n\t\t\tx += r.width + intronw\n\t\t\tcontinue\n\t\t}\n\t\tif (gm.start >= r.start && gm.start <= r.stop) {\n\t\t\tstart = x + (r.reverse ? r.stop - gm.start : gm.start - r.start) * exonsf\n\t\t\tbreak\n\t\t}\n\t\tx += r.width + intronw\n\t}\n\tlet stop\n\tx = 0\n\tfor (const r of rglst) {\n\t\tif (r.chr != gm.chr) {\n\t\t\tx += r.width + intronw\n\t\t\tcontinue\n\t\t}\n\t\tif (gm.stop >= r.start && gm.stop <= r.stop) {\n\t\t\tstop = x + (r.reverse ? r.stop - gm.stop : gm.stop - r.start) * exonsf\n\t\t\tbreak\n\t\t}\n\t\tx += r.width + intronw\n\t}\n\tctx.strokeStyle = color\n\tctx.beginPath()\n\tctx.moveTo(start, Math.floor(h / 2) + 0.5)\n\tctx.lineTo(stop, Math.floor(h / 2) + 0.5)\n\tctx.stroke()\n\n\tconst thin = []\n\tif (gm.utr5) thin.push(...gm.utr5)\n\tif (gm.utr3) thin.push(...gm.utr3)\n\tif (!gm.cdslen) thin.push(...gm.exon)\n\tfor (const e of thin) {\n\t\tlet x = 0\n\t\tfor (const r of rglst) {\n\t\t\tif (r.chr != gm.chr) {\n\t\t\t\tx += r.width + intronw\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst start = Math.max(e[0], r.start)\n\t\t\tconst stop = Math.min(e[1], r.stop)\n\t\t\tif (start >= stop) {\n\t\t\t\tx += r.width + intronw\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tctx.fillStyle = '#aaa'\n\t\t\tctx.fillRect(\n\t\t\t\tx + (r.reverse ? (r.stop - stop) * exonsf : (start - r.start) * exonsf),\n\t\t\t\tpad,\n\t\t\t\tMath.max(1, (stop - start) * exonsf),\n\t\t\t\th - pad * 2\n\t\t\t)\n\t\t\tx += r.width + intronw\n\t\t}\n\t}\n\tif (gm.coding) {\n\t\tfor (const e of gm.coding) {\n\t\t\tlet x = 0\n\t\t\tfor (const r of rglst) {\n\t\t\t\tif (r.chr != gm.chr) {\n\t\t\t\t\tx += r.width + intronw\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst start = Math.max(e[0], r.start)\n\t\t\t\tconst stop = Math.min(e[1], r.stop)\n\t\t\t\tif (start >= stop) {\n\t\t\t\t\tx += r.width + intronw\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tctx.fillStyle = color\n\t\t\t\tctx.fillRect(\n\t\t\t\t\tx + (r.reverse ? (r.stop - stop) * exonsf : (start - r.start) * exonsf),\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(1, (stop - start) * exonsf),\n\t\t\t\t\th\n\t\t\t\t)\n\t\t\t\tx += r.width + intronw\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function sketchRna(holder, gm, pxwidth, color) {\n\tconst canvas = holder.append('canvas').node()\n\tcanvas.width = pxwidth\n\tconst h = 20\n\tconst pad = 4\n\tcanvas.height = h\n\tconst ctx = canvas.getContext('2d')\n\tif (!gm.cdslen) {\n\t\tctx.fillStyle = '#aaa'\n\t\tctx.fillRect(0, pad, pxwidth, h - pad * 2)\n\t\treturn\n\t}\n\tconst sf = pxwidth / gm.rnalen\n\tlet x = 0\n\tif (gm.utr5) {\n\t\tlet ulen = 0\n\t\tfor (const e of gm.utr5) ulen += e[1] - e[0]\n\t\tctx.fillStyle = '#aaa'\n\t\tctx.fillRect(0, pad, sf * ulen, h - pad * 2)\n\t\tx = sf * ulen\n\t}\n\tif (gm.pdomains && gm.pdomains.length) {\n\t\tctx.fillStyle = 'white'\n\t\tctx.fillRect(x, 0, gm.cdslen * sf, h)\n\t\tgm.pdomains.sort((a, b) => b.stop - b.start - a.stop + a.start)\n\t\tfor (const domain of gm.pdomains) {\n\t\t\tctx.fillStyle = domain.color\n\t\t\tctx.fillRect(x + domain.start * 3 * sf, 0, (domain.stop - domain.start + 1) * 3 * sf, h)\n\t\t}\n\t\tctx.strokeStyle = 'black'\n\t\tctx.strokeRect(x, 0, gm.cdslen * sf, h)\n\t} else {\n\t\tctx.fillStyle = color\n\t\tctx.fillRect(x, 0, gm.cdslen * sf, h)\n\t}\n\tx += gm.cdslen * sf\n\tif (gm.utr3) {\n\t\tlet ulen = 0\n\t\tfor (const e of gm.utr3) ulen += e[1] - e[0]\n\t\tctx.fillStyle = '#aaa'\n\t\tctx.fillRect(x, pad, sf * ulen, h - pad * 2)\n\t}\n}\nexport function sketchProtein2(holder, gm, pxwidth) {\n\tconst canvas = holder.append('canvas').node()\n\tcanvas.width = pxwidth\n\tconst h = 20\n\tconst pad = 4\n\tcanvas.height = h\n\tconst ctx = canvas.getContext('2d')\n\tconst sf = pxwidth / (gm.cdslen / 3)\n\tgm.pdomains.sort((a, b) => b.stop - b.start - a.stop + a.start)\n\tctx.fillStyle = 'white'\n\tctx.fillRect(0, 0, pxwidth, h)\n\tfor (const domain of gm.pdomains) {\n\t\tctx.fillStyle = domain.color\n\t\tctx.fillRect(domain.start * sf, 0, (domain.stop - domain.start + 1) * sf, h)\n\t}\n\tctx.strokeStyle = 'black'\n\tctx.strokeRect(0, 0, pxwidth, h)\n}\n\nexport function sketchGene(holder, gm, pxwidth, h, bpstart, bpstop, color, nostrand, reverse) {\n\tconst canvas = holder.append('canvas').node()\n\tcanvas.width = pxwidth\n\tcanvas.height = h\n\tconst ctx = canvas.getContext('2d')\n\tconst sf = scaleLinear().range([1, pxwidth])\n\tif (reverse) {\n\t\tsf.domain([bpstop, bpstart])\n\t} else {\n\t\tsf.domain([bpstart, bpstop])\n\t}\n\tctx.strokeStyle = color\n\tctx.fillStyle = color\n\tbpBox(ctx, gm.start, gm.stop, bpstart, bpstop, h / 2, 1)\n\tconst pad = Math.ceil(h / 5)\n\tif (gm.utr3) {\n\t\tfor (const e of gm.utr3) {\n\t\t\tbpBox(ctx, e[0], e[1], bpstart, bpstop, pad + 1, h - pad * 2 - 1)\n\t\t}\n\t}\n\tif (gm.utr5) {\n\t\tfor (const e of gm.utr5) {\n\t\t\tbpBox(ctx, e[0], e[1], bpstart, bpstop, pad + 1, h - pad * 2 - 1)\n\t\t}\n\t}\n\tif (gm.coding) {\n\t\tfor (const e of gm.coding) {\n\t\t\tbpBox(ctx, e[0], e[1], bpstart, bpstop, 1, h)\n\t\t}\n\t}\n\tif (gm.codingstart == gm.codingstop) {\n\t\tfor (const e of gm.exon) {\n\t\t\tbpBox(ctx, e[0], e[1], bpstart, bpstop, pad + 1, h - pad * 2 - 1)\n\t\t}\n\t}\n\tif (!nostrand && gm.strand) {\n\t\tconst ypad = 3 // but not pad\n\t\tif (gm.coding) {\n\t\t\tfor (const e of gm.coding) {\n\t\t\t\tbpStrand(ctx, gm.strand, e[0], e[1], bpstart, bpstop, 1 + ypad, h - ypad * 2 - 1, 'white')\n\t\t\t}\n\t\t}\n\t\tif (gm.intron) {\n\t\t\tfor (const e of gm.intron) {\n\t\t\t\tbpStrand(ctx, gm.strand, e[0], e[1], bpstart, bpstop, 1 + ypad, h - ypad * 2 - 1, color ? color : 'black')\n\t\t\t}\n\t\t}\n\t}\n\tfunction bpBox(ctx, start, stop, borderstart, borderstop, y, h) {\n\t\tconst a = Math.max(start, borderstart)\n\t\tconst b = Math.min(stop, borderstop)\n\t\tif (a >= b) return\n\t\tctx.fillRect(Math.floor(sf(reverse ? b : a)), y, Math.max(1, Math.abs(sf(b) - sf(a))), h)\n\t}\n\tfunction bpStrand(ctx, strand, start, stop, borderstart, borderstop, y, h, color) {\n\t\tconst a = Math.max(start, borderstart)\n\t\tconst b = Math.min(stop, borderstop)\n\t\tif (a >= b) return\n\t\tconst pad = 2,\n\t\t\tspacing = h / 2,\n\t\t\tw = sf(b) - sf(a)\n\t\tif (w <= pad * 2 + h / 2) return\n\t\tctx.strokeStyle = color\n\t\tconst fillcount = Math.floor((w - pad * 2) / (h / 2 + spacing))\n\t\tlet x = Math.floor(sf(a) + (w - fillcount * (h / 2 + spacing)) / 2) + 0.5\n\t\tctx.beginPath()\n\t\tfor (let i = 0; i < fillcount; i++) {\n\t\t\tif (strand == '+') {\n\t\t\t\tctx.moveTo(x, y)\n\t\t\t\tctx.lineTo(x + h / 2, y + h / 2)\n\t\t\t\tctx.lineTo(x, y + h)\n\t\t\t} else {\n\t\t\t\tctx.moveTo(x + h / 2, y)\n\t\t\t\tctx.lineTo(x, y + h / 2)\n\t\t\t\tctx.lineTo(x + h / 2, y + h)\n\t\t\t}\n\t\t\tx += h / 2 + spacing\n\t\t}\n\t\tctx.stroke()\n\t}\n}\n\nexport function sketchProtein(holder, gm, pxwidth) {\n\tlet aalen = -1\n\tif (gm.cdslen) {\n\t\taalen = gm.cdslen / 3\n\t}\n\treturn holder\n\t\t.append('span')\n\t\t.html(\n\t\t\t' ' +\n\t\t\t\t(aalen > 0 ? Math.ceil(aalen) + ' AA' + (Number.isInteger(aalen) ? '' : ' (incomplete CDS)') : 'noncoding')\n\t\t)\n}\n\nexport function newpane3(x, y, genomes) {\n\tconst pane = newpane({ x: x, y: y })\n\tconst inputdiv = pane.body.append('div').style('margin', '40px 20px 20px 20px')\n\tconst p = inputdiv.append('p')\n\tp.append('span').html('Genome ')\n\tconst gselect = p.append('select')\n\tfor (const n in genomes) {\n\t\tgselect.append('option').text(n)\n\t}\n\tconst filediv = inputdiv.append('div').style('margin', '20px 0px')\n\tconst saydiv = pane.body.append('div').style('margin', '10px 20px')\n\tconst visualdiv = pane.body.append('div').style('margin', '20px')\n\treturn [pane, inputdiv, gselect.node(), filediv, saydiv, visualdiv]\n}\n\nexport function to_svg(svg, name, opts = {}) {\n\tif (opts.apply_dom_styles) {\n\t\topts.svgClone = svg.cloneNode(true)\n\t\tconst clone = d3select(opts.svgClone) // make it easier to apply style below\n\n\t\t// TODO: may use opts.excludeSelector instead of harcoded classname?\n\t\tfor (const elem of opts.svgClone.querySelectorAll('.sjpp-exclude-svg-download')) {\n\t\t\telem.remove()\n\t\t}\n\n\t\tconst styles = window.getComputedStyle(svg)\n\t\tfor (const s of styles) {\n\t\t\tclone.style(s, styles.getPropertyValue(s))\n\t\t}\n\t}\n\n\tconst a = document.createElement('a')\n\tdocument.body.appendChild(a)\n\n\ta.addEventListener(\n\t\t'click',\n\t\tfunction () {\n\t\t\tconst serializer = new XMLSerializer()\n\t\t\tconst svg_blob = new Blob([serializer.serializeToString(opts.svgClone ? opts.svgClone : svg)], {\n\t\t\t\ttype: 'image/svg+xml'\n\t\t\t})\n\t\t\ta.download = name + '.svg'\n\t\t\ta.href = URL.createObjectURL(svg_blob)\n\t\t\tdocument.body.removeChild(a)\n\t\t},\n\t\tfalse\n\t)\n\ta.click()\n}\n\nexport function filetypeselect(holder) {\n\tconst s = holder.append('select')\n\ts.append('option').text('SNV and indel') // 0\n\ts.append('option').text('SV (tabular format)') // 1\n\ts.append('option').text('Fusion gene (tabular format)') // 2\n\ts.append('option').text('ITD') // 3\n\ts.append('option').text('Deletion, intragenic') // 4\n\ts.append('option').text('Truncation') // 5\n\ts.append('option').text('CNV, gene-level')\n\t// TODO vcf, new tabular format for fusion\n\treturn s\n}\n\nexport function export_data(title, lst, posx = 1, posy = 1, rows = 10, cols = 100, div = null) {\n\t// lst: {label, text}\n\n\tlet body // holder of ui\n\tif (!div) {\n\t\tconst pane = newpane({\n\t\t\tx: (window.innerWidth / 2 - 200) * posx,\n\t\t\ty: (window.innerHeight / 2 - 150) * posy\n\t\t})\n\t\tpane.header.text(title)\n\t\tbody = pane.body\n\t} else {\n\t\tdiv.append('p').text(title)\n\t\tbody = div.append('div')\n\t}\n\n\tfor (const w of lst) {\n\t\tconst div = body.append('div').style('margin-top', '10px')\n\t\tif (w.label) {\n\t\t\tdiv.append('div').text(w.label).style('margin', '5px')\n\t\t}\n\t\tbody.append('textarea').text(w.text).attr('readonly', 1).attr('rows', rows).attr('cols', cols)\n\t}\n\tbody\n\t\t.append('p')\n\t\t.style('font-size', '.7em')\n\t\t.text('Click on the text box above and press Ctrl-A to select all text for copy-pasting.')\n}\n\nexport function flyindi(from, to) {\n\tconst p1 = from.node().getBoundingClientRect()\n\tconst p2 = to.node().getBoundingClientRect()\n\tconst d = d3select(document.body)\n\t\t.append('div')\n\t\t.style('position', 'absolute')\n\t\t.style('border', 'solid 1px black')\n\t\t.style('left', p1.left + window.pageXOffset + 'px')\n\t\t.style('top', p1.top + window.pageYOffset + 'px')\n\t\t.style('width', p1.width + 'px')\n\t\t.style('height', p1.height + 'px')\n\tif (base_zindex) {\n\t\td.style('z-index', base_zindex + 3)\n\t}\n\td.transition()\n\t\t.duration(500)\n\t\t.style('left', p2.left + window.pageXOffset + 'px')\n\t\t.style('top', p2.top + window.pageYOffset + 'px')\n\t\t.style('width', p2.width + 'px')\n\t\t.style('height', p2.height + 'px')\n\t\t.on('end', () => d.remove())\n}\n\nexport function labelbox(arg) {\n\t/* a box with label overlapping its border\n\t- holder\n\t- label\n\t- color\n\t*/\n\tconst fontsize = 16\n\tif (!arg.color) {\n\t\targ.color = '#ccc'\n\t}\n\tconst d0 = arg.holder\n\t\t.append('div')\n\t\t.style('position', 'relative')\n\t\t.style('padding-top', fontsize / 2 + 'px')\n\tif (arg.margin) {\n\t\td0.style('margin', arg.margin)\n\t}\n\tconst bin = d0\n\t\t.append('div')\n\t\t.style('border', 'solid 1px ' + arg.color)\n\t\t.style('padding', fontsize + 'px')\n\t\t.style('padding-bottom', fontsize / 2 + 'px')\n\td0.append('div')\n\t\t.text(arg.label)\n\t\t.style('position', 'absolute')\n\t\t.style('left', '15px')\n\t\t.style('top', '0px')\n\t\t.style('background-color', 'white')\n\t\t.style('color', arg.color)\n\t\t.style('font-family', font)\n\t\t.style('font-size', fontsize + 'px')\n\t\t.style('padding', '0px 10px')\n\treturn bin\n}\n\nexport function category2legend(categories, holder) {\n\t// bound to tk logic\n\tholder.selectAll('*').remove()\n\tfor (const key in categories) {\n\t\tconst c = categories[key]\n\t\tconst div = holder\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('white-space', 'nowrap')\n\t\t\t.style('padding', '5px 20px 5px 0px')\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('background-color', c.color)\n\t\t\t.style('margin-right', '5px')\n\t\t\t.style('padding', '0px 4px')\n\t\t\t.html(' ')\n\t\tdiv.append('div').style('display', 'inline-block').style('color', c.color).text(c.label)\n\t}\n}\n\nexport function bulk_badline(header, lines) {\n\t// surpress warnings on selected sites\n\tif (window.location.hostname == 'viz.stjude.cloud' || window.location.hostname == 'pecan.stjude.cloud') return\n\tif (window.sessionStorage.getItem('suppressErrors')?.includes(`\"bulk-bad-lines\"`)) return\n\n\tconst np = newpane({ x: 400, y: 60 })\n\tnp.body.style('margin', '20px 10px 10px 10px')\n\tnp.header.text(lines.length + ' line' + (lines.length > 1 ? 's' : '') + ' rejected, click to check')\n\tif (lines.length <= 50) {\n\t\t// small # of lines, show link for each\n\t\tfor (const [number, err, line] of lines) {\n\t\t\tnp.body\n\t\t\t\t.append('div')\n\t\t\t\t.classed('sja_clbtext', true)\n\t\t\t\t.style('margin', '3px')\n\t\t\t\t.text('Line ' + number + ': ' + err)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tconst n2 = newpane({ x: 500, y: 60 })\n\t\t\t\t\tn2.header.text('Line ' + number)\n\t\t\t\t\tn2.body.style('margin', '10px')\n\t\t\t\t\tconst t = n2.body.append('table').style('border-spacing', '1px').style('border-collapse', 'separate')\n\t\t\t\t\tlet fl = true\n\t\t\t\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\t\t\t\tconst tr = t.append('tr')\n\t\t\t\t\t\tif (fl) {\n\t\t\t\t\t\t\ttr.style('background-color', '#ededed')\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfl = !fl\n\t\t\t\t\t\ttr.append('td').text(header[i])\n\t\t\t\t\t\ttr.append('td').text(line[i] == undefined ? '' : line[i])\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\t\treturn\n\t}\n\t// group lines by reasons of reject\n\tconst reason = new Map()\n\tfor (const [number, err, line] of lines) {\n\t\tif (!reason.has(err)) {\n\t\t\treason.set(err, [])\n\t\t}\n\t\treason.get(err).push({ number: number, line: line })\n\t}\n\n\tconst lst = [...reason]\n\n\tlst.sort((a, b) => b[1].length - a[1].length)\n\n\tfor (const [thisreason, linelst] of lst) {\n\t\tconst line1 = linelst[0]\n\t\tnp.body\n\t\t\t.append('div')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('margin', '5px')\n\t\t\t.text(\n\t\t\t\t'Line ' + line1.number + ': ' + thisreason + (linelst.length > 1 ? ' (total ' + linelst.length + ' lines)' : '')\n\t\t\t)\n\t\t\t.on('click', () => {\n\t\t\t\tconst n2 = newpane({ x: 500, y: 60 })\n\t\t\t\tn2.header.text('Line ' + line1.number)\n\t\t\t\tconst t = n2.body.style('margin', '10px').append('table')\n\t\t\t\tlet fl = true\n\t\t\t\tfor (let i = 0; i < header.length; i++) {\n\t\t\t\t\tconst tr = t.append('tr')\n\t\t\t\t\tif (fl) {\n\t\t\t\t\t\ttr.style('background-color', '#ededed')\n\t\t\t\t\t}\n\t\t\t\t\tfl = !fl\n\t\t\t\t\ttr.append('td').text(header[i])\n\t\t\t\t\ttr.append('td').text(line1.line[i] == undefined ? '' : line1.line[i])\n\t\t\t\t}\n\t\t\t})\n\t}\n}\n\nexport function ensureisblock(b) {\n\tif (!b) return 'No Block{} object given'\n\tif (typeof b != 'object') return 'Block is not an object'\n\tif (!b.error) return 'method block.error() missing'\n\tif (!b.genome) return 'block.genome missing'\n\treturn null\n}\n\nexport function mclasscolorchangeui(tip) {\n\ttip.d.append('p').html('<span style=\"color:#858585;font-size:.7em\">EXAMPLE</span> M ; red')\n\tconst input = tip.d\n\t\t.append('textarea')\n\t\t.attr('cols', 25)\n\t\t.attr('rows', 5)\n\t\t.attr('placeholder', 'One class per line, join color and class code by semicolon.')\n\tconst row = tip.d.append('div')\n\trow\n\t\t.append('button')\n\t\t.text('Submit')\n\t\t.on('click', () => {\n\t\t\tconst str = input.property('value').trim()\n\t\t\tif (!str) return\n\t\t\terrdiv.text('')\n\t\t\tconst good = []\n\t\t\tfor (const line of str.split('\\n')) {\n\t\t\t\tconst l = line.split(';')\n\t\t\t\tif (l.length != 2) return errdiv.text('no separator in line: ' + line)\n\t\t\t\tconst c = l[0].trim()\n\t\t\t\tconst color = l[1].trim()\n\t\t\t\tif (!c || !color) return errdiv.text('wrong line: ' + line)\n\t\t\t\tif (!common.mclass[c]) return errdiv.text('wrong class: ' + c)\n\t\t\t\tgood.push([c, color])\n\t\t\t}\n\t\t\tif (good.length) {\n\t\t\t\tfor (const [c, color] of good) {\n\t\t\t\t\tcommon.mclass[c].color = color\n\t\t\t\t}\n\t\t\t\tmclasscolor2table(table)\n\t\t\t\terrdiv.text('New color set!')\n\t\t\t}\n\t\t})\n\trow\n\t\t.append('button')\n\t\t.text('Clear')\n\t\t.on('click', () => {\n\t\t\tinput.property('value', '')\n\t\t\terrdiv.text('')\n\t\t})\n\tconst errdiv = row.append('span').style('margin-left', '10px')\n\n\tconst table = tip.d.append('div').style('margin-top', '5px')\n\tmclasscolor2table(table)\n\n\ttip.d\n\t\t.append('p')\n\t\t.style('font-size', '.8em')\n\t\t.html(\n\t\t\t'<a href=https://en.wikipedia.org/wiki/Web_colors target=_blank>Use color names</a>, or #ff0000 or rgb(255,0,0)'\n\t\t)\n}\n\nexport function mclasscolor2table(table, snvonly) {\n\ttable.style('border-spacing', '3px').selectAll('*').remove()\n\tconst tr = table.append('tr').style('color', '#858585').style('font-size', '.7em')\n\ttr.append('td').text('CLASS')\n\ttr.append('td').attr('colspan', 2).text('LABEL, COLOR')\n\tfor (const k in common.mclass) {\n\t\tconst c = common.mclass[k]\n\t\tif (snvonly && c.dt != common.dtsnvindel) continue\n\n\t\t// Blank class color is white\n\n\t\tconst tr = table.append('tr')\n\t\ttr.append('td').text(k)\n\t\t{\n\t\t\tconst dot = tr\n\t\t\t\t.append('td')\n\t\t\t\t.append('span')\n\t\t\t\t.attr('class', 'sja_mcdot')\n\t\t\t\t.style('background-color', c.color)\n\t\t\t\t.html(' ')\n\t\t\tif (k == 'Blank') dot.style('border', 'solid 1px #eee')\n\t\t}\n\t\ttr.append('td')\n\t\t\t.text(c.label)\n\t\t\t.style('color', k == 'Blank' ? '#ddd' : c.color)\n\t}\n}\n\n// bigwig track\nexport const bwSetting = {\n\theight: 1,\n\tpcolor: 2,\n\tncolor: 3,\n\tpcolor2: 4,\n\tncolor2: 5,\n\tautoscale: 6,\n\tfixedscale: 7,\n\tpercentilescale: 8,\n\tnodotplot: 9,\n\tusedotplot: 10,\n\tusedividefactor: 11,\n\tnodividefactor: 12\n}\n\nexport function tkexists(t, tklst) {\n\t// return the tkobj found in the list\n\tfor (const t0 of tklst) {\n\t\tif (t0.type != t.type) continue\n\t\tswitch (t.type) {\n\t\t\tcase tkt.bigwig:\n\t\t\tcase tkt.bedj:\n\t\t\tcase tkt.junction:\n\t\t\tcase tkt.mdsjunction:\n\t\t\tcase tkt.bampile:\n\t\t\tcase tkt.hicstraw:\n\t\t\tcase tkt.expressionrank:\n\t\t\t\t// single file\n\t\t\t\tif ((t.file && t.file == t0.file) || (t.url && t.url == t0.url)) {\n\t\t\t\t\treturn t0\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tcase tkt.bigwigstranded:\n\t\t\t\tif (t.strand1 && t0.strand1 && t.strand1.file == t0.strand1.file && t.strand1.url == t0.strand1.url) {\n\t\t\t\t\tif (t.strand2 && t0.strand2 && t.strand2.file == t0.strand2.file && t.strand2.url == t0.strand2.url) {\n\t\t\t\t\t\treturn t0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// TODO pgv ds-vcf\n\t\t}\n\t}\n\treturn null\n}\n\nexport function ranksays(v) {\n\tif (v >= 100) return 'HIGHEST'\n\tif (v >= 90) return 'HIGH ' + v + '%'\n\tif (v >= 70) return 'high ' + v + '%'\n\tif (v >= 30) return v + '%'\n\tif (v >= 10) return 'low ' + v + '%'\n\tif (v > 0) return 'LOW ' + v + '%'\n\treturn 'LOWEST'\n}\n\nexport function rgb2hex(rgb) {\n\t// should be replaced by d3-color.rgb(xx).hex()\n\tif (rgb[0] == '#') return rgb\n\tconst r = rgb.match(/^rgba?[\\s+]?\\([\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?,[\\s+]?(\\d+)[\\s+]?/i)\n\treturn r && r.length === 4\n\t\t? '#' +\n\t\t\t\t('0' + parseInt(r[1], 10).toString(16)).slice(-2) +\n\t\t\t\t('0' + parseInt(r[2], 10).toString(16)).slice(-2) +\n\t\t\t\t('0' + parseInt(r[3], 10).toString(16)).slice(-2)\n\t\t: ''\n}\n\nexport function keyupEnter(event) {\n\treturn event.code == 'Enter' || event.code == 'NumpadEnter'\n}\n\nexport function may_findmatchingsnp(chr, poslst, genome, alleleLst) {\n\t/*\nchr: string, required\nposlst[]\n\tint, or {start, stop}\n\trequired\ngenome{ name }, required\nalleleLst[], optional\n*/\n\tif (!genome || !genome.hasSNP) return\n\tconst p = {\n\t\tbyCoord: true,\n\t\tgenome: genome.name,\n\t\tchr: chr,\n\t\tranges: [],\n\t\talleleLst\n\t}\n\tfor (const i of poslst) {\n\t\tif (Number.isFinite(i)) {\n\t\t\tp.ranges.push({ start: i, stop: i + 1 })\n\t\t} else if (i.start && i.stop) {\n\t\t\tp.ranges.push(i)\n\t\t}\n\t}\n\treturn dofetch('snp', p).then(data => {\n\t\tif (data.error) throw data.error\n\t\treturn data.results\n\t})\n}\n\nexport function snp_printhtml(m, d) {\n\t/*\nm{}\n\t.name\n\t.observed\n*/\n\td.append('a')\n\t\t.text(m.name)\n\t\t.attr('href', 'https://www.ncbi.nlm.nih.gov/snp/' + m.name)\n\t\t.attr('target', '_blank')\n\td.append('div').attr('class', 'sja_tinylogo_body').text(m.observed)\n\td.append('div').attr('class', 'sja_tinylogo_head').text('ALLELE')\n}\n\nexport function clinvar_printhtml(m, d) {\n\t/*\nm{}\n\t.id\n\t.value\n\t.bg\n\t.textcolor\n*/\n\td.append('div')\n\t\t.style('display', 'inline-block')\n\t\t.style('background', m.bg)\n\t\t.style('padding', '3px')\n\t\t.append('a')\n\t\t.attr('href', 'https://www.ncbi.nlm.nih.gov/clinvar/variation/' + m.id)\n\t\t.attr('target', '_blank')\n\t\t.style('color', m.textcolor)\n\t\t.text(m.value)\n\t\t.style('font-size', '.9em')\n\t\t.style('text-decoration', 'none')\n}\n\nexport function gmlst2loci(gmlst) {\n\t// gmlst as is returned by genelookup:deep\n\tconst locs = []\n\tfor (const f of gmlst) {\n\t\tlet nooverlap = true\n\t\tfor (const r of locs) {\n\t\t\tif (f.chr == r.chr && Math.max(f.start, r.start) < Math.min(f.stop, r.stop)) {\n\t\t\t\tr.start = Math.min(r.start, f.start)\n\t\t\t\tr.stop = Math.max(r.stop, f.stop)\n\t\t\t\tnooverlap = false\n\t\t\t}\n\t\t}\n\t\tif (nooverlap) {\n\t\t\tlocs.push({\n\t\t\t\tname: f.isoform,\n\t\t\t\tchr: f.chr,\n\t\t\t\tstart: f.start,\n\t\t\t\tstop: f.stop\n\t\t\t})\n\t\t}\n\t}\n\treturn locs\n}\n\nexport function tab2box(holder, tabs, runall, tabheader) {\n\t/*\ntabs[ tab{} ]\n\t.label:\n\t\trequired\n\t.callback()\n\t\trequired\n\nthis function attaches .box (d3 dom) to each tab of tabs[]\n\n*/\n\tconst tr = holder.append('table').style('border-spacing', '0px').style('border-collapse', 'separate').append('tr')\n\tconst tdleft = tr.append('td').style('vertical-align', 'top').style('padding', '10px 0px 10px 10px')\n\tconst tdright = tr\n\t\t.append('td')\n\t\t.style('vertical-align', 'top')\n\t\t.style('border-left', 'solid 1px #aaa')\n\t\t.style('padding', '10px')\n\tconst has_acitve_tab = tabs.findIndex(t => t.active) == -1 ? false : true\n\n\tif (tabheader) {\n\t\tconst tHeader = tdleft\n\t\t\t.append('div')\n\t\t\t.style('padding', '5px 10px')\n\t\t\t.style('margin', '5px 5px 10px 5px')\n\t\t\t.style('font-weight', '550')\n\t\t\t.text(tabheader)\n\t}\n\n\tfor (let i = 0; i < tabs.length; i++) {\n\t\tconst tab = tabs[i]\n\n\t\ttab.tab = tdleft\n\t\t\t.append('div')\n\t\t\t.style('padding', '5px 10px')\n\t\t\t.style('margin', '0px')\n\t\t\t.style('border-top', 'solid 1px #ddd')\n\t\t\t.style('border-radius', '0px')\n\t\t\t.classed('sja_menuoption', !has_acitve_tab && i != 0)\n\t\t\t.html(tab.label)\n\n\t\ttab.box = tdright\n\t\t\t.append('div')\n\t\t\t.style('padding', '3px')\n\t\t\t.style('display', (!has_acitve_tab && i == 0) || tab.active ? 'block' : 'none')\n\n\t\tif ((runall && tab.callback) || (!has_acitve_tab && i == 0 && tab.callback) || tab.active) {\n\t\t\ttab.callback(tab.box)\n\t\t\tdelete tab.callback\n\t\t}\n\t\tif (has_acitve_tab) tab.tab.classed('sja_menuoption', !tab.active)\n\n\t\ttab.tab.on('click', () => {\n\t\t\tif (tab.box.style('display') != 'none') {\n\t\t\t\ttab.tab.classed('sja_menuoption', true)\n\t\t\t\ttab.box.style('display', 'none')\n\t\t\t} else {\n\t\t\t\ttab.tab.classed('sja_menuoption', false)\n\t\t\t\tappear(tab.box)\n\t\t\t\tfor (let j = 0; j < tabs.length; j++) {\n\t\t\t\t\tif (i != j) {\n\t\t\t\t\t\ttabs[j].tab.classed('sja_menuoption', true)\n\t\t\t\t\t\ttabs[j].box.style('display', 'none')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (tab.callback) {\n\t\t\t\ttab.callback(tab.box)\n\t\t\t\tdelete tab.callback\n\t\t\t}\n\t\t})\n\t}\n}\n\nexport function tab_wait(d) {\n\treturn d.append('div').style('margin', '30px').text('Loading...')\n}\n", "export function appear(d, display) {\n\td.style('opacity', 0)\n\t\t.style('display', display || 'block')\n\t\t.transition()\n\t\t.style('opacity', 1)\n}\n\nexport function disappear(d, remove) {\n\td.style('opacity', 1)\n\t\t.transition()\n\t\t.style('opacity', 0)\n\t\t.call(() => {\n\t\t\tif (remove) {\n\t\t\t\td.remove()\n\t\t\t} else {\n\t\t\t\td.style('display', 'none').style('opacity', 1)\n\t\t\t}\n\t\t})\n}\n", "export function axisstyle(p) {\n\tif (!p || !p.axis) return\n\tif (!p.color) {\n\t\tp.color = '#545454'\n\t}\n\tp.axis.selectAll('line').attr('stroke', p.color).attr('shape-rendering', 'crispEdges')\n\tp.axis\n\t\t.selectAll('path')\n\t\t.attr('fill', 'none')\n\t\t.attr('stroke', p.showline ? p.color : 'none')\n\t\t.attr('stroke-width', p.showline ? 1 : 0)\n\t\t.attr('shape-rendering', 'crispEdges')\n\tp.axis\n\t\t.selectAll('text')\n\t\t.style('cursor', 'default')\n\t\t.attr('font-size', p.fontsize ? p.fontsize + 'px' : '12px')\n\t\t.attr('fill', p.color)\n}\n", "/*\nadapted from block.mds.geneboxplot.js, but can be hard to reuse over there\n\narguments:\n\nbp: {}\n\tgenerated by server side boxplot_getvalue()\n\tbp.label:str\n\t------- Options not returned in server response ------- \n\toptional; if present, prints the label to the left of the row\n\toptional: if present, set the radius of the outlier circles\ng:\n\tsvg <g> in which a horizontal boxplot is rendered from left to right\ncolor:\n\tline/text color\nscale:\n\tcallback, v=>{return fxn(v)}\nrowheight:\n\tint\nlabpad:\n\tint, horizontal space between label <text> and boxplot <g>\nlabColor: \n\tstr, label text color. Default is color arg\nrectFill:\n\tstr, fill color of the box. Default is white\n*/\nexport function drawBoxplot({ bp, g, color, scale, rowheight, labpad, labColor = color }) {\n\tif (bp.label) {\n\t\tbp.labelG = g\n\t\t\t.append('text')\n\t\t\t.attr('font-family', 'Arial')\n\t\t\t.attr('text-anchor', 'end')\n\t\t\t.attr('dominant-baseline', 'central')\n\t\t\t.attr('fill', labColor)\n\t\t\t.attr('x', -labpad)\n\t\t\t.attr('y', rowheight / 2)\n\t\t\t.attr('font-size', Math.min(15, rowheight))\n\t\t\t.text(bp.label)\n\t}\n\n\tif (bp.w1 != undefined || bp.w2 != undefined) {\n\t\t// Undefined when there is no distribution\n\t\t// has valid values for boxplot, could be missing\n\t\tconst w1 = scale(bp.w1)\n\t\tconst w2 = scale(bp.w2)\n\t\tconst p25 = scale(bp.p25)\n\t\tconst p50 = scale(bp.p50)\n\t\tconst p75 = scale(bp.p75)\n\t\tbp.hline = g\n\t\t\t.append('line')\n\t\t\t.attr('stroke', color)\n\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\t.attr('x1', w1)\n\t\t\t.attr('x2', w2)\n\t\t\t.attr('y1', rowheight / 2)\n\t\t\t.attr('y2', rowheight / 2)\n\t\tbp.linew1 = g\n\t\t\t.append('line')\n\t\t\t.attr('stroke', color)\n\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\t.attr('x1', w1)\n\t\t\t.attr('x2', w1)\n\t\t\t.attr('y1', 0)\n\t\t\t.attr('y2', rowheight)\n\t\tbp.linew2 = g\n\t\t\t.append('line')\n\t\t\t.attr('stroke', color)\n\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\t.attr('x1', w2)\n\t\t\t.attr('x2', w2)\n\t\t\t.attr('y1', 0)\n\t\t\t.attr('y2', rowheight)\n\t\tbp.box = g\n\t\t\t.append('rect')\n\t\t\t.attr('fill', bp?.rectFill || 'white')\n\t\t\t.attr('stroke', color)\n\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\t.attr('x', p25)\n\t\t\t.attr('y', 0)\n\t\t\t.attr('width', p75 - p25)\n\t\t\t.attr('height', rowheight)\n\t\tbp.linep50 = g\n\t\t\t.append('line')\n\t\t\t.attr('stroke', color)\n\t\t\t.attr('shape-rendering', 'crispEdges')\n\t\t\t.attr('x1', p50)\n\t\t\t.attr('x2', p50)\n\t\t\t.attr('y1', 0)\n\t\t\t.attr('y2', rowheight)\n\t}\n\t// outliers\n\tfor (const d of bp.out) {\n\t\tg.append('circle')\n\t\t\t.attr('stroke', color)\n\t\t\t.attr('fill', 'white')\n\t\t\t.attr('fill-opacity', 0)\n\t\t\t.attr('cx', scale(d.value))\n\t\t\t.attr('cy', rowheight / 2)\n\t\t\t.attr('r', bp?.radius || rowheight / 3)\n\t\t/*\n\t\t\t.on('mouseover', () => {\n\t\t\t})\n\t\t\t.on('mouseout', () => {\n\t\t\t})\n\t\t\t*/\n\n\t\t/*\n\t\tif (plot.clicksample) {\n\t\t\td.circle.on('click', () => {\n\t\t\t})\n\t\t}\n\t\t*/\n\t}\n}\n", "/* on/off switch\n\n******* required\n.holder\n.callback()\n\tasync\n\tone boolean argument corresponding to whether the box is checked or not\n******* optional\n.divstyle{}\n.labeltext\n.title\n.checked\n\tif set to true, box is checked by default\n.id\n.testid\n sets input data-testid=\"\", for testing\n*/\nexport function make_one_checkbox(arg) {\n\tconst { holder, labeltext, title, callback, checked, divstyle, id, testid } = arg\n\n\tconst div = holder.append('div')\n\tif (divstyle) {\n\t\tfor (const k in divstyle) div.style(k, divstyle[k])\n\t}\n\tconst label = div.append('label').on('mousedown', event => {\n\t\t// this fix allows clicking on a checkbox of a secondary menu not to hide the primary menu, e.g. in geneset edit ui \"top mutated\" submenu options\n\t\tevent.stopPropagation()\n\t})\n\tconst input = label\n\t\t.append('input')\n\t\t.attr('type', 'checkbox')\n\t\t.property('checked', checked)\n\t\t.on('input', async () => {\n\t\t\tinput.property('disabled', true)\n\t\t\tawait callback(input.property('checked'))\n\t\t\tinput.property('disabled', false)\n\t\t})\n\tif (title) input.attr('title', title)\n\tif (id) input.attr('id', id)\n\tif (testid) input.attr('data-testid', testid)\n\tif (labeltext) label.append('span').html(' ' + labeltext)\n\treturn input\n}\n", "import type { SvgG, SvgSvg, Td } from '../../types/d3'\nimport type { ColorScaleMenuOpts, CutoffMode } from '../types/colorScale'\nimport { Menu } from '#dom'\nimport { rgb } from 'd3-color'\n\nexport class ColorScaleMenu {\n\tdomain: number[]\n\tcolors: string[] = ['white', 'red']\n\tdefault?: { min: number; max: number; percentile?: number }\n\tcutoffMode?: CutoffMode\n\tpercentile?: number\n\tsetColorsCallback?: (val: string, idx: number) => void\n\tnumInputCallback?: (f?: { cutoffMode: CutoffMode; min?: number; max?: number; percentile?: number }) => void\n\tprivate tip = new Menu({ padding: '2px' })\n\tconstructor(opts: ColorScaleMenuOpts) {\n\t\tthis.domain = opts.domain\n\t\tthis.colors = opts.colors\n\n\t\tif (opts.setNumbersCallback) {\n\t\t\tthis.numInputCallback = opts.setNumbersCallback\n\t\t\tthis.cutoffMode = opts.cutoffMode\n\t\t\tthis.default = {\n\t\t\t\tmin: opts.domain[0],\n\t\t\t\tmax: opts.domain[opts.domain.length - 1]\n\t\t\t}\n\t\t\tif (opts.percentile) {\n\t\t\t\tthis.default.percentile = opts.percentile\n\t\t\t\tthis.percentile = opts.percentile\n\t\t\t}\n\t\t}\n\t\tif (opts.setColorsCallback) this.setColorsCallback = opts.setColorsCallback\n\n\t\tthis.renderMenu(opts.scaleSvg, opts.barG)\n\t}\n\n\trenderMenu(scaleSvg: SvgSvg, barG: SvgG) {\n\t\tlet showTooltip = true\n\t\tscaleSvg\n\t\t\t.on('click', () => {\n\t\t\t\tthis.tip.clear().showunder(barG.node())\n\t\t\t\tconst selectDiv = this.tip.d.append('div').style('padding', '2px')\n\t\t\t\tconst table = this.tip.d.append('table').style('margin', 'auto')\n\n\t\t\t\tconst submitPromptCell = table\n\t\t\t\t\t.append('tr')\n\t\t\t\t\t.append('td')\n\t\t\t\t\t.attr('colspan', '2')\n\t\t\t\t\t.style('opacity', 0.65)\n\t\t\t\t\t.style('font-size', '0.7em')\n\t\t\t\t\t.text('Press ENTER to submit')\n\t\t\t\t\t.style('display', 'none')\n\n\t\t\t\tconst percentRow = table\n\t\t\t\t\t.append('tr')\n\t\t\t\t\t.style('padding', '5px')\n\t\t\t\t\t.append('td')\n\t\t\t\t\t.attr('colspan', '2')\n\t\t\t\t\t.style('display', this.cutoffMode == 'percentile' ? '' : 'none')\n\n\t\t\t\tconst minMaxPromptRow = table\n\t\t\t\t\t.append('tr')\n\t\t\t\t\t.style('text-align', 'center')\n\t\t\t\t\t.style('display', this.setColorsCallback ? 'table-row' : 'none')\n\t\t\t\tminMaxPromptRow.append('td').text('Min').style('padding-left', '5px').style('text-align', 'left')\n\t\t\t\tminMaxPromptRow.append('td').style('padding-left', '5px').style('text-align', 'left').text('Max')\n\n\t\t\t\tif (this.numInputCallback) {\n\t\t\t\t\tconst options = [\n\t\t\t\t\t\t{ label: 'Automatic', value: 'auto', selected: this.cutoffMode == 'auto' },\n\t\t\t\t\t\t{ label: 'Fixed', value: 'fixed', selected: this.cutoffMode == 'fixed' }\n\t\t\t\t\t]\n\t\t\t\t\tif (this.default?.percentile) {\n\t\t\t\t\t\toptions.push({\n\t\t\t\t\t\t\tlabel: 'Percentile',\n\t\t\t\t\t\t\tvalue: 'percentile',\n\t\t\t\t\t\t\tselected: this.cutoffMode == 'percentile'\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tconst select = selectDiv.append('select')\n\n\t\t\t\t\tselect\n\t\t\t\t\t\t.selectAll('option')\n\t\t\t\t\t\t.data(options)\n\t\t\t\t\t\t.enter()\n\t\t\t\t\t\t.append('option')\n\t\t\t\t\t\t.text(d => d.label)\n\t\t\t\t\t\t.property('value', d => d.value)\n\t\t\t\t\t\t.property('selected', d => d.selected)\n\n\t\t\t\t\t//Do not allow users to put in negative or > 100 values\n\t\t\t\t\tconst percentInput = this.appendValueInput(percentRow, this.percentile || null, 0, 100)\n\n\t\t\t\t\tconst minMaxInputRow = table.append('tr').style('display', this.cutoffMode == 'fixed' ? 'table-row' : 'none')\n\t\t\t\t\tconst minInput = this.appendValueInput(minMaxInputRow.append('td'), 0)\n\t\t\t\t\tthis.appendValueInput(minMaxInputRow.append('td'), this.domain.length - 1)\n\n\t\t\t\t\tselect.on('change', async () => {\n\t\t\t\t\t\tthis.cutoffMode = select.node()!.value as CutoffMode\n\t\t\t\t\t\tif (!this.default) throw new Error('Auto values not set for #dom/ColorScale.')\n\t\t\t\t\t\tif (this.cutoffMode == 'auto') {\n\t\t\t\t\t\t\tminMaxPromptRow.style('display', this.setColorsCallback ? 'table-row' : 'none')\n\t\t\t\t\t\t\tthis.domain[0] = this.default.min\n\t\t\t\t\t\t\tthis.domain[this.domain.length - 1] = this.default.max\n\t\t\t\t\t\t\tthis.percentile = this.default.percentile\n\t\t\t\t\t\t\tawait this.numInputCallback!({\n\t\t\t\t\t\t\t\tcutoffMode: this.cutoffMode,\n\t\t\t\t\t\t\t\tmin: this.default.min,\n\t\t\t\t\t\t\t\tmax: this.default.max\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tthis.tip.hide()\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//Show min/max prompts for fixed mode and if user may change colors\n\t\t\t\t\t\tminMaxPromptRow.style(\n\t\t\t\t\t\t\t'display',\n\t\t\t\t\t\t\tthis.setColorsCallback || this.cutoffMode == 'fixed' ? 'table-row' : 'none'\n\t\t\t\t\t\t)\n\t\t\t\t\t\t//Show submit prompt for fixed and percentile mode\n\t\t\t\t\t\tsubmitPromptCell.style('display', this.cutoffMode != 'auto' ? '' : 'none')\n\t\t\t\t\t\t//Show min/max inputs for fixed mode and focus on the min input\n\t\t\t\t\t\tminMaxInputRow.style('display', this.cutoffMode == 'fixed' ? 'table-row' : 'none')\n\t\t\t\t\t\tif (this.cutoffMode == 'fixed') minInput.node().focus()\n\t\t\t\t\t\t//Show and focus on the percentile input when mode is percentile\n\t\t\t\t\t\tpercentRow.style('display', this.cutoffMode == 'percentile' ? '' : 'none')\n\t\t\t\t\t\tif (this.cutoffMode == 'percentile') percentInput.node().focus()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (this.setColorsCallback) {\n\t\t\t\t\tconst colorRow = table.append('tr').style('text-align', 'center')\n\t\t\t\t\tthis.appendColorInput(colorRow.append('td').style('padding-right', '10px'), 0)\n\t\t\t\t\tthis.appendColorInput(colorRow.append('td'), this.colors.length - 1)\n\t\t\t\t}\n\t\t\t\tshowTooltip = false\n\t\t\t})\n\t\t\t.on('mouseenter', () => {\n\t\t\t\t//Prevent showing the tooltip after user interacts with the color picker\n\t\t\t\tif (showTooltip == false) return\n\t\t\t\tthis.tip.clear().showunder(barG.node())\n\t\t\t\tconst text = `Click to customize ${this.setColorsCallback ? 'colors' : ''} ${\n\t\t\t\t\tthis.numInputCallback && this.setColorsCallback ? ' and ' : ''\n\t\t\t\t}${this.numInputCallback ? 'values' : ''}`\n\t\t\t\tthis.tip.d.append('div').style('padding', '2px').text(text)\n\t\t\t})\n\t\t\t.on('mouseleave', () => {\n\t\t\t\tif (showTooltip) this.tip.hide()\n\t\t\t})\n\t}\n\n\tappendColorInput = (td: Td, idx: number) => {\n\t\tconst colorInput = td\n\t\t\t.append('input')\n\t\t\t.style('width', '60px')\n\t\t\t.attr('type', 'color')\n\t\t\t//Rm default color input styles\n\t\t\t.style('padding', '0px')\n\t\t\t.style('border', 'none')\n\t\t\t.style('margin', '0px')\n\t\t\t.attr('value', rgb(this.colors[idx]).formatHex())\n\t\t\t.on('change', async () => {\n\t\t\t\tconst color = colorInput.node()!.value\n\t\t\t\tthis.colors[idx] = color\n\t\t\t\tawait this.setColorsCallback!(color, idx)\n\t\t\t\tthis.tip.hide()\n\t\t\t})\n\t}\n\n\tappendValueInput = (elem: any, elemValue: number | null, min?: number, max?: number) => {\n\t\tif (elemValue == null) return\n\t\tconst valueInput = elem\n\t\t\t.append('input')\n\t\t\t.attr('type', 'number')\n\t\t\t.style('width', '60px')\n\t\t\t.attr('value', this.domain[elemValue] || elemValue)\n\t\t\t.style('padding', '3px')\n\n\t\t//Limit input if necessary\n\t\tif (min) valueInput.attr('min', min)\n\t\tif (max) valueInput.attr('max', max)\n\n\t\tvalueInput.on('keyup', async (event: KeyboardEvent) => {\n\t\t\tif (event.code != 'Enter') return\n\t\t\tconst valueNode = valueInput.node()\n\t\t\tif (!valueNode) return\n\t\t\tconst value: number = parseFloat(valueNode.value)\n\t\t\tconst opts: any = {\n\t\t\t\tcutoffMode: this.cutoffMode\n\t\t\t}\n\t\t\tif (this.cutoffMode == 'fixed') {\n\t\t\t\tthis.domain[elemValue] = value\n\t\t\t\topts.min = this.domain[0]\n\t\t\t\topts.max = this.domain[this.domain.length - 1]\n\t\t\t} else if (this.cutoffMode == 'percentile') {\n\t\t\t\tthis.percentile = value\n\t\t\t\topts.percentile = value\n\t\t\t}\n\t\t\tawait this.numInputCallback!(opts)\n\t\t\tthis.tip.hide()\n\t\t})\n\t\treturn valueInput\n\t}\n}\n", "import type { SvgSvg, SvgG } from '../../types/d3'\nimport type {\n\tColorScaleDom,\n\tColorScaleOpts,\n\tGradientElem,\n\tColorScaleMenuOpts,\n\tNumericInputs\n} from '../types/colorScale'\nimport { scaleLinear } from 'd3-scale'\nimport { axisBottom, axisTop } from 'd3-axis'\nimport { font } from '../../src/client'\nimport { axisstyle, niceNumLabels } from '#dom'\nimport { ColorScaleMenu } from './ColorScaleMenu'\n// import { format } from 'd3-format'\n// import { interpolateRgb } from 'd3-interpolate'\n// import { decimalPlacesUntilFirstNonZero } from '#shared/roundValue.js'\n\nexport class ColorScale {\n\tdom: ColorScaleDom\n\tbarheight: number\n\tbarwidth: number\n\tcolors: string[]\n\tdomain: number[]\n\tfontSize: number\n\tnumericInputs?: NumericInputs\n\tmarkedValue?: number | null\n\tmenu?: ColorScaleMenu\n\t/** Purely for testing. Not used in the class but can be\n\t * called independently of user click, if needed */\n\tsetColorsCallback?: (val: string, idx: number) => void\n\tticks: number\n\ttickSize: number\n\ttickValues: number[]\n\ttopTicks: boolean\n\n\tconstructor(opts: ColorScaleOpts) {\n\t\tthis.barheight = opts.barheight || 14\n\t\tthis.barwidth = opts.barwidth || 100\n\t\tthis.colors = opts?.colors?.length ? opts.colors : ['white', 'red']\n\t\tthis.domain = opts.domain\n\t\tthis.fontSize = opts.fontSize || 10\n\t\tthis.markedValue = opts.markedValue && opts.markedValue > 0.001 ? opts.markedValue : null\n\t\tthis.ticks = opts.ticks || 5\n\t\tthis.tickSize = opts.tickSize || 1\n\t\tthis.topTicks = opts.topTicks || false\n\n\t\tthis.validateOpts(opts)\n\n\t\tthis.tickValues = niceNumLabels(opts.domain)\n\n\t\tlet scaleSvg: SvgSvg //\n\t\tif (opts.width || opts.height) {\n\t\t\tscaleSvg = opts.holder\n\t\t\t\t.append('svg')\n\t\t\t\t.attr('width', opts.width || 100)\n\t\t\t\t.attr('height', opts.height || 30)\n\t\t} else scaleSvg = opts.holder\n\t\tscaleSvg.attr('data-testid', 'sjpp-color-scale')\n\t\tlet barG\n\t\tconst position = opts.position || '0,0'\n\t\tif (opts.labels) {\n\t\t\tbarG = this.renderLabels(scaleSvg, opts.labels, position)\n\t\t} else barG = scaleSvg.append('g').attr('transform', `translate(${position})`)\n\t\tconst id = opts.id || Math.random().toString()\n\n\t\tconst defs = barG.append('defs')\n\t\tconst gradient = defs.append('linearGradient').attr('data-testid', 'sjpp-color-scale-bar').attr('id', id)\n\n\t\tif (this.topTicks === true) {\n\t\t\tconst { scale, scaleAxis } = this.makeAxis(barG, id)\n\t\t\tthis.makeColorBar(gradient)\n\t\t\tthis.dom = { gradient, scale, scaleAxis, barG }\n\t\t} else {\n\t\t\tthis.makeColorBar(gradient)\n\t\t\tconst { scale, scaleAxis } = this.makeAxis(barG, id)\n\t\t\tthis.dom = { gradient, scale, scaleAxis, barG }\n\t\t\tthis.markedValueInColorBar()\n\t\t}\n\t\tthis.render()\n\n\t\tif (opts.setColorsCallback || opts.numericInputs) {\n\t\t\t// Menu appearing on color bar click if callbacks are provided\n\t\t\tthis.menu = this.renderMenu(opts, scaleSvg, barG)\n\t\t}\n\t}\n\n\tvalidateOpts(opts: ColorScaleOpts) {\n\t\tif (!opts.holder) throw new Error('No holder provided for #dom/ColorScale.')\n\t\tif (!opts.domain || !opts.domain.length) throw new Error('No data provided for #dom/ColorScale.')\n\t\tif (opts.domain.length != this.colors.length)\n\t\t\tthrow new Error('Data and color arrays for #dom/ColorScale must be the same length')\n\t\tif (opts.labels && (!opts.labels.left || !opts.labels.right))\n\t\t\tthrow new Error('Missing a label for #dom/ColorScale.')\n\t}\n\n\trenderLabels(scaleSvg: SvgSvg, labels: { left: string; right: string }, position: string) {\n\t\tconst addLabel = (text: string, x: number, y: number) => {\n\t\t\treturn scaleSvg\n\t\t\t\t.append('text')\n\t\t\t\t.text(text)\n\t\t\t\t.attr('font-size', '.8em')\n\t\t\t\t.attr('opacity', 0.6)\n\t\t\t\t.attr('text-anchor', 'end')\n\t\t\t\t.attr('transform', `translate(${x}, ${y})`)\n\t\t}\n\n\t\tconst [posX, posY] = position.split(',').map(Number)\n\n\t\tconst leftLabel = addLabel(labels.left, posX, posY + 10)\n\t\tconst leftBBox = leftLabel.node()!.getBBox()\n\n\t\tconst startXPos = posX + leftBBox.x + leftBBox.width + 20\n\t\tconst barGPos = `${startXPos}, ${posY}`\n\t\tconst rightLabelX = startXPos + this.barwidth + 40\n\t\tconst rightLabelY = posY + 10\n\t\tconst barG = scaleSvg.append('g').attr('transform', `translate(${barGPos})`)\n\t\taddLabel(labels.right, rightLabelX, rightLabelY)\n\t\tconst totalWidth = scaleSvg.node()!.getBBox().width + leftBBox.width\n\t\tscaleSvg.attr('width', totalWidth)\n\n\t\treturn barG\n\t}\n\n\tgetRange() {\n\t\treturn this.tickValues.map((_, i) => {\n\t\t\treturn this.barwidth * (i / (this.tickValues.length - 1))\n\t\t})\n\t}\n\n\tmakeColorBar(gradient?: GradientElem) {\n\t\tconst gradElem = gradient || this.dom.gradient\n\t\tfor (const [idx, c] of this.colors.entries()) {\n\t\t\tconst offset = (idx / (this.colors.length - 1)) * 100\n\t\t\tgradElem.append('stop').attr('offset', `${offset}%`).attr('stop-color', `${c}`)\n\t\t}\n\t}\n\n\tmakeAxis(div: SvgG, id: string) {\n\t\tdiv\n\t\t\t.append('rect')\n\t\t\t.attr('height', this.barheight)\n\t\t\t.attr('width', this.barwidth)\n\t\t\t.attr('fill', 'url(#' + id + ')')\n\n\t\tconst scaleAxis = div.append('g').attr('data-testid', 'sjpp-color-scale-axis')\n\t\tif (this.topTicks === false) scaleAxis.attr('transform', `translate(0, ${this.barheight})`)\n\t\tconst scale = scaleLinear().domain(this.tickValues).range(this.getRange())\n\n\t\treturn { scale, scaleAxis }\n\t}\n\n\tmarkedValueInColorBar() {\n\t\tif (this.markedValue == null || this.topTicks === true) return\n\n\t\tthis.dom.line = this.dom.barG\n\t\t\t.append('line')\n\t\t\t.classed('sjpp-color-scale-marked', true)\n\t\t\t.attr('data-testid', 'sjpp-color-scale-marked-tick')\n\t\t\t.attr('y1', this.barheight - 2)\n\t\t\t.attr('y2', this.barheight + 1)\n\t\t\t.attr('stroke', 'black')\n\n\t\tthis.dom.label = this.dom.barG\n\t\t\t.append('text')\n\t\t\t.classed('sjpp-color-scale-marked', true)\n\t\t\t.attr('data-testid', 'sjpp-color-scale-marked-label')\n\t\t\t.attr('text-anchor', 'middle')\n\t\t\t.attr('font-family', font)\n\t\t\t.attr('font-size', `${this.fontSize + 2}px`)\n\t\t\t.attr('y', this.barheight - 3)\n\t\t\t// Text easier to see on dark backgrounds\n\t\t\t.attr('fill', 'white')\n\t\t\t.attr('stroke', 'black')\n\t\t\t.attr('stroke-width', 0.3)\n\n\t\tthis.updateValueInColorBar()\n\t}\n\n\trender() {\n\t\tconst axis = this.getAxis()\n\n\t\taxisstyle({\n\t\t\taxis: this.dom.scaleAxis.call(axis),\n\t\t\tshowline: false,\n\t\t\tfontsize: this.fontSize\n\t\t})\n\t}\n\n\trenderMenu(opts: ColorScaleOpts, scaleSvg: SvgSvg, barG: SvgG) {\n\t\tconst _opts: ColorScaleMenuOpts = {\n\t\t\tscaleSvg,\n\t\t\tbarG,\n\t\t\tdomain: this.domain,\n\t\t\tcolors: this.colors\n\t\t}\n\t\tif (opts.setColorsCallback)\n\t\t\t_opts.setColorsCallback = async (val, idx) => {\n\t\t\t\tif (!val || !isFinite(idx)) return\n\t\t\t\tawait opts.setColorsCallback!(val, idx)\n\t\t\t\tthis.updateColors()\n\t\t\t}\n\t\tif (opts.numericInputs) {\n\t\t\t_opts.cutoffMode = opts.numericInputs.cutoffMode || 'auto'\n\t\t\tif (opts.numericInputs.defaultPercentile) _opts.percentile = opts.numericInputs?.defaultPercentile\n\t\t\t_opts.setNumbersCallback = async obj => {\n\t\t\t\tif (!obj) return\n\t\t\t\tawait opts.numericInputs!.callback(obj)\n\t\t\t\tthis.updateAxis()\n\t\t\t}\n\t\t}\n\t\tconst menu = new ColorScaleMenu(_opts)\n\t\treturn menu\n\t}\n\n\tgetAxis() {\n\t\tconst axis = this.topTicks === true ? axisTop(this.dom.scale) : axisBottom(this.dom.scale)\n\t\taxis.ticks(this.ticks).tickSize(this.tickSize)\n\t\treturn axis\n\t}\n\n\tupdateColors() {\n\t\tthis.dom.gradient.selectAll('stop').remove()\n\t\tthis.makeColorBar()\n\t}\n\n\tupdateAxis() {\n\t\tthis.dom.scaleAxis.selectAll('*').remove()\n\n\t\tthis.tickValues = niceNumLabels(this.domain)\n\t\tthis.dom.scale = scaleLinear().domain(this.tickValues).range(this.getRange())\n\n\t\tthis.dom.scaleAxis\n\t\t\t.transition()\n\t\t\t.duration(400)\n\t\t\t.call(this.getAxis())\n\t\t\t//Transition sometimes removes the font size\n\t\t\t.selectAll('text')\n\t\t\t.attr('font-size', `${this.fontSize}px`)\n\n\t\t//The stroke may inherit 'currentColor' from opts.holder\n\t\t//This is a workaround to prevent the black line from appearing\n\t\tconst pathElem = this.dom.scaleAxis.select('path').node()\n\t\tif (pathElem instanceof SVGPathElement) pathElem.style.stroke = 'none'\n\t}\n\n\tupdateValueInColorBar() {\n\t\tif (this.markedValue == null || this.topTicks === true) return\n\t\tif (!this.dom.line || !this.dom.label) {\n\t\t\t/** Allow the line to be made if the init value was < 0.001 */\n\t\t\tthis.markedValueInColorBar()\n\t\t}\n\t\tconst x = Math.min(this.barwidth, this.dom.scale(this.markedValue))\n\t\tthis.dom.line!.attr('x1', x).attr('x2', x)\n\t\tthis.dom.label!.attr('x', x).text(Math.floor(this.markedValue))\n\n\t\t// /**Determine if the text should be white or black based on the\n\t\t// * background color.\n\t\t// *\n\t\t// * Code below passes npm run tsc, but fails on commit. Linters\n\t\t// * contradict each other on how to resolve. */\n\t\t// //eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t// const colorInt = interpolateRgb.apply(null, this.colors)\n\t\t// const color = colorInt(x)\n\t\t// if (color) {\n\t\t// \tconst colorMap = color.match(/\\d+/g)?.map(Number)\n\t\t// \tconst [r, g, b] = colorMap.map(v => v / 255)\n\t\t// \tconst contrast = 0.2126 * r + 0.7152 * g + 0.0722 * b\n\t\t// \tif (contrast < 0.5) this.dom.label.attr('fill', 'white').attr('stroke', 'black').attr('stroke-width', 0.3)\n\t\t// \telse this.dom.label.attr('fill', 'black').attr('stroke', 'none')\n\t\t// }\n\t}\n\n\tupdateMenu() {\n\t\tif (!this.menu) return\n\t\tthis.menu.colors = this.colors\n\t\tthis.menu.domain = this.domain\n\t}\n\n\tupdateScale() {\n\t\tif (this.domain.length != this.colors.length)\n\t\t\tthrow new Error('Data and color arrays for #dom/ColorScale must be the same length')\n\t\tthis.updateColors()\n\t\tthis.updateAxis()\n\t\tthis.updateValueInColorBar()\n\t\tthis.updateMenu()\n\t}\n}\n", "import type { GetInterpolatedArg, InterpolatedDomainRange } from '../types/colorScale'\n\n/** Generate an interpolated color scale based on the domain and range.\n * @param absMin - the absolute magnitude of the interpolation domain minimum value\n * @param absMax - the absolute magnitude of the interpolation domain minimum value\n * @param negInterpolator - function to convert number to css color\n * @param posInterpolator - function to convert number to css color\n * @param middleColor - Optional color to insert between two interpolated color ranges,\n * @numSteps - the target number of increments within the interpolation domain and range\n * @returns the domain and range for the interpolated color scale\n */\nexport function getInterpolatedDomainRange({\n\tabsMin,\n\tabsMax,\n\tnegInterpolator,\n\tposInterpolator,\n\tmiddleColor = 'white',\n\tnumSteps = 100\n}: GetInterpolatedArg) {\n\tconst stepSize = (absMax - absMin) / numSteps\n\tconst neg: InterpolatedDomainRange = { values: [], colors: [] }\n\tconst pos: InterpolatedDomainRange = { values: [], colors: [] }\n\tlet n = -absMax\n\tfor (let p = 0; p < absMax; p += stepSize) {\n\t\tif (negInterpolator) {\n\t\t\tn += stepSize\n\t\t\tconst vn = n / absMax\n\t\t\tneg.values.push(vn)\n\t\t\tneg.colors.push(negInterpolator(-vn))\n\t\t}\n\t\tif (posInterpolator) {\n\t\t\tconst vp = p / absMax\n\t\t\tpos.values.push(vp)\n\t\t\tpos.colors.push(posInterpolator(vp))\n\t\t}\n\t}\n\n\tif (negInterpolator && posInterpolator) {\n\t\treturn {\n\t\t\tdomain: [-absMax, ...neg.values, 0, ...pos.values, absMax],\n\t\t\trange: [negInterpolator(1), ...neg.colors, middleColor, ...pos.colors, posInterpolator(1)]\n\t\t}\n\t} else if (negInterpolator) {\n\t\treturn {\n\t\t\tdomain: [-absMax, ...neg.values, 0],\n\t\t\trange: [negInterpolator(0), ...neg.colors, negInterpolator(1)]\n\t\t}\n\t} else if (posInterpolator) {\n\t\treturn {\n\t\t\tdomain: [0, ...pos.values, absMax],\n\t\t\trange: [posInterpolator(0), ...pos.colors, posInterpolator(1)]\n\t\t}\n\t} else {\n\t\tthrow `missing both negInterpolator and posInterpolator in getInterpolatedDomainRange()`\n\t}\n}\n\n/** Calculate the color difference between two colors.\n * @param rgb1 - first color in rgb format\n * @param rgb2 - second color in rgb format\n * @returns the max difference between the two colors\n */\nexport function colorDelta(rgb1, rgb2) {\n\t// TODO: use ciede2000 when the installed d3-color version has it\n\t// lab = CIELAB, approximate human-perceived color simiilarity\n\t// const color1 = lab(rgb1);\n\t// const color2 = lab(rgb2);\n\t// return ciede2000(color1, color2)\n\n\t// for now, simply compute the max diff across rgb components between the 2 colors\n\tconst a = rgb1.split('(')[1].slice(0, -1).split(',').slice(0, 3)\n\tconst b = rgb2.split('(')[1].slice(0, -1).split(',').slice(0, 3)\n\tlet maxDiff = 0\n\tfor (const [i, v] of a.entries()) {\n\t\tconst d = v - b[i]\n\t\tif (maxDiff < d) maxDiff = d\n\t}\n\treturn maxDiff\n}\n\n/** Remove outliers from the domain array by removing the top and bottom 1% of values.\n * Prevents outlier ticks from appearing in the color scale.\n * Logic specifc to cnv data where the min and max value maybe zero.\n * @param domain - number array to remove outliers from\n * @returns the cleaned up domain array\n */\nexport function removeOutliers(domain: number[], firstPercent = 0.01, lastPercent = 0.99) {\n\tconst sorted = domain.sort((a, b) => a - b)\n\tconst first = sorted[0] == 0 ? 0 : sorted[Math.floor(sorted.length * firstPercent)]\n\tconst last = sorted[sorted.length - 1] == 0 ? 0 : sorted[Math.floor(sorted.length * lastPercent)]\n\treturn sorted.filter(d => d >= first && d <= last)\n}\n\n/** Removes outlier values from the interpolated domain/range object.\n * @param domainRange domain and range object returned from getInterpolatedDomainRange\n * @param firstPercent Optional percentage to calculate the min percentile cutoff\n * @param lastPercent Optional percentage to calculate the max percentile cutoff\n * @returns\n */\nexport function removeInterpolatedOutliers(\n\tdomainRange: { domain: number[]; range: string[] },\n\tfirstPercent = 0.01,\n\tlastPercent = 0.99\n) {\n\tconst domain = removeOutliers(domainRange.domain, firstPercent, lastPercent)\n\tconst range = domain.map(d => domainRange.range[domainRange.domain.indexOf(d)])\n\treturn { domain, range }\n}\n", "import { Menu, make_radios } from '#dom'\n\n/*\nRenderer for CNV config UI\n\t- radio buttons for toggling altered vs. wildtype\n\t- inputs for CNV gain cutoff, loss cutoff, and max length\n\t- resulting CNV config is provided through callback function\n*/\n\ntype Arg = {\n\tholder: any // D3 holder where UI is rendered\n\tcnvGainCutoff?: number // minimum positive value (log2 ratio) for CNV gain\n\tcnvLossCutoff?: number // maximum negative value (log2 ratio) for CNV loss\n\tcnvMaxLength?: number | null // max segment bp length; null = no length limit (UI shows -1)\n\tcallback: (config: {\n\t\tcnvGainCutoff?: number\n\t\tcnvLossCutoff?: number\n\t\tcnvMaxLength?: number | null\n\t\tcnvWT?: boolean\n\t}) => void // called upon clicking apply\n\tcnvWT?: boolean // wildtype for CNV specified by cutoffs\n\tgenotypeToggle?: boolean // display altered vs. wildtype genotype toggle\n}\n\nexport function renderCnvConfig(arg: Arg) {\n\tconst { cnvGainCutoff, cnvLossCutoff } = arg\n\tconst cnvMaxLength = arg.cnvMaxLength === null ? -1 : arg.cnvMaxLength\n\n\tif (!Number.isFinite(cnvGainCutoff) && !Number.isFinite(cnvLossCutoff) && !Number.isFinite(cnvMaxLength)) {\n\t\t// no cutoffs defined, do not render config UI\n\t\treturn\n\t}\n\n\tconst div = arg.holder\n\tdiv.style('margin', '10px')\n\tconst tip = new Menu({ padding: '5px' })\n\n\tconst genotypeDiv = div.append('div').style('margin-bottom', '10px')\n\n\t// CNV genotype radio buttons\n\tlet genotypeRadio\n\tif (arg.genotypeToggle) {\n\t\tconst cnvWT = arg.cnvWT || false\n\t\tgenotypeDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin-right', '5px')\n\t\t\t.style('opacity', 0.7)\n\t\t\t.text('CNV genotype')\n\t\tgenotypeRadio = make_radios({\n\t\t\tholder: genotypeDiv,\n\t\t\tstyles: { display: 'inline-block' },\n\t\t\toptions: [\n\t\t\t\t{ label: 'Altered', value: 'altered', checked: !cnvWT },\n\t\t\t\t{ label: 'Wildtype', value: 'wildtype', checked: cnvWT }\n\t\t\t],\n\t\t\tcallback: () => {}\n\t\t})\n\t}\n\n\tconst cutoffsDiv = div.append('div')\n\tcutoffsDiv.append('div').style('opacity', 0.7).style('margin-bottom', '10px').text('CNV cutoffs:')\n\tconst inputsDiv = cutoffsDiv.append('div').style('margin-left', '10px')\n\n\t// CNV gain input\n\tlet cnvGainInput\n\tif (Number.isFinite(cnvGainCutoff)) {\n\t\tconst cnvGainDiv = inputsDiv.append('div').style('margin-bottom', '5px')\n\t\tcnvGainDiv.append('span').style('opacity', 0.7).text('Minimum CNV Gain (log2 ratio)') // TODO: verify that this will always be log2 ratio\n\t\tcnvGainInput = cnvGainDiv\n\t\t\t.append('input')\n\t\t\t.attr('data-testid', 'sjpp-cnv-gain-input')\n\t\t\t.attr('type', 'number')\n\t\t\t.property('value', cnvGainCutoff)\n\t\t\t.style('width', '100px')\n\t\t\t.style('margin-left', '15px')\n\t\t\t.on('change', event => {\n\t\t\t\tconst value = event.target.value\n\t\t\t\tif (!isValidNumber(value)) {\n\t\t\t\t\twindow.alert('Please enter a numeric value.')\n\t\t\t\t\tevent.target.value = cnvGainCutoff\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (Number(value) < 0) {\n\t\t\t\t\twindow.alert('Value must be a positive value.')\n\t\t\t\t\tevent.target.value = cnvGainCutoff\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\t// CNV loss input\n\tlet cnvLossInput\n\tif (Number.isFinite(cnvLossCutoff)) {\n\t\tconst cnvLossDiv = inputsDiv.append('div').style('margin-bottom', '5px')\n\t\tcnvLossDiv.append('span').style('opacity', 0.7).text('Maximum CNV Loss (log2 ratio)') // TODO: verify that this will always be log2 ratio\n\t\tcnvLossInput = cnvLossDiv\n\t\t\t.append('input')\n\t\t\t.attr('data-testid', 'sjpp-cnv-loss-input')\n\t\t\t.attr('type', 'number')\n\t\t\t.property('value', cnvLossCutoff)\n\t\t\t.style('width', '100px')\n\t\t\t.style('margin-left', '15px')\n\t\t\t.on('change', event => {\n\t\t\t\tconst value = event.target.value\n\t\t\t\tif (!isValidNumber(value)) {\n\t\t\t\t\twindow.alert('Please enter a numeric value.')\n\t\t\t\t\tevent.target.value = cnvLossCutoff\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (Number(value) > 0) {\n\t\t\t\t\twindow.alert('Value must be a negative value.')\n\t\t\t\t\tevent.target.value = cnvLossCutoff\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\t// CNV max length input\n\tlet cnvLengthInput\n\tif (Number.isFinite(cnvMaxLength)) {\n\t\tconst cnvLengthDiv = inputsDiv.append('div').style('margin-bottom', '5px')\n\t\tcnvLengthDiv.append('span').style('opacity', 0.7).text('CNV Max Length')\n\t\tcnvLengthInput = cnvLengthDiv\n\t\t\t.append('input')\n\t\t\t.attr('data-testid', 'sjpp-cnv-length-input')\n\t\t\t.attr('type', 'number')\n\t\t\t.property('value', cnvMaxLength)\n\t\t\t.style('width', '100px')\n\t\t\t.style('margin-left', '15px')\n\t\t\t.on('change', event => {\n\t\t\t\tconst value = event.target.value\n\t\t\t\tif (!isValidNumber(value)) {\n\t\t\t\t\twindow.alert('Please enter a numeric value.')\n\t\t\t\t\tevent.target.value = cnvMaxLength\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('mouseover', event => {\n\t\t\t\ttip.clear()\n\t\t\t\ttip.d.append('div').text('Please enter a positive value. To include all CNV segments, enter -1.')\n\t\t\t\ttip.showunder(event.target)\n\t\t\t})\n\t\t\t.on('mouseout', () => {\n\t\t\t\ttip.hide()\n\t\t\t})\n\t}\n\n\t// Apply button\n\tdiv\n\t\t.append('div')\n\t\t.append('button')\n\t\t.attr('class', 'sja_filter_tag_btn sjpp_apply_btn')\n\t\t.style('border-radius', '13px')\n\t\t.style('margin-top', '15px')\n\t\t.style('font-size', '.8em')\n\t\t.text('APPLY')\n\t\t.on('click', () => {\n\t\t\tconst config: any = {}\n\t\t\tif (cnvGainInput) config.cnvGainCutoff = Number(cnvGainInput.property('value'))\n\t\t\tif (cnvLossInput) config.cnvLossCutoff = Number(cnvLossInput.property('value'))\n\t\t\tif (cnvLengthInput) {\n\t\t\t\tconst tempCnvMaxLength = Number(cnvLengthInput.property('value'))\n\t\t\t\t// no max length if value == -1\n\t\t\t\tconfig.cnvMaxLength = tempCnvMaxLength == -1 ? null : tempCnvMaxLength\n\t\t\t}\n\t\t\tif (genotypeRadio) {\n\t\t\t\tconst radios = genotypeRadio.inputs.nodes()\n\t\t\t\tconst selected = radios.find(r => r.checked)\n\t\t\t\tif (!selected) throw 'no selected radio found'\n\t\t\t\tconfig.cnvWT = selected.value == 'wildtype'\n\t\t\t}\n\t\t\targ.callback(config)\n\t\t})\n}\n\nfunction isValidNumber(s: string) {\n\tif (s === '') return false\n\tconst n = Number(s)\n\treturn Number.isFinite(n)\n}\n", "import { select } from 'd3-selection'\nimport { to_svg } from '../src/client'\n\nexport function downloadSingleSVG(svg, filename, parent, name = '') {\n\tconst svgParent = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\n\tif (parent) {\n\t\tconst svgStyles = window.getComputedStyle(parent)\n\t\tfor (const [prop, value] of Object.entries(svgStyles)) {\n\t\t\tif (prop.startsWith('font')) svgParent.style[prop] = value\n\t\t}\n\t}\n\tconst svgNode = svg.node().cloneNode(true)\n\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\tif (name) {\n\t\tg.setAttribute('transform', `translate(0, ${50})`)\n\t\tconst title = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\t\ttitle.textContent = name\n\t\tg.appendChild(title)\n\t\tsvgNode.setAttribute('transform', `translate(${0}, ${80})`)\n\t}\n\tg.appendChild(svgNode)\n\tsvgParent.appendChild(g)\n\n\tconst link = document.createElement('a')\n\t// If you don't know the name or want to use\n\t// the webserver default set name = ''\n\tlink.setAttribute('download', filename)\n\tdocument.body.appendChild(link)\n\tlink.click()\n\tlink.remove()\n\tconst serializer = new XMLSerializer()\n\tconst svg_blob = new Blob([serializer.serializeToString(svgParent)], {\n\t\ttype: 'image/svg+xml'\n\t})\n\tlink.href = URL.createObjectURL(svg_blob)\n\tlink.click()\n\tlink.remove()\n}\n\n/*\n\tmainGsel a d3 selection of root g element(s) of svg(s), expected to contain all\n\t\t the rendered plot elements that can be copied into one svg\n\t\n\tsvgName the filename to use for the downloaded svg file\n\n\tstyleParent optional, the div or svg element to use for computing styles to apply to\n\t the svg, so that the standlone image file would preseve the browser-displayed\n\t svg look/appearance\n*/\nexport function downloadChart(mainGsel, svgName, styleParent = null) {\n\t// has to be able to handle multichart view\n\tconst mainGs = []\n\tconst translate = { x: undefined, y: undefined }\n\tconst titles = []\n\tlet maxw = 0,\n\t\tmaxh = 0,\n\t\ttboxh = 0\n\tlet prevY = 0,\n\t\tnumChartsPerRow = 0\n\n\tmainGsel.each(function () {\n\t\tmainGs.push(this)\n\t\tconst bbox = this.getBBox()\n\t\tif (bbox.width > maxw) maxw = bbox.width\n\t\tif (bbox.height > maxh) maxh = bbox.height\n\t\tconst divY = Math.round(this.parentNode.parentNode.getBoundingClientRect().y)\n\t\tif (!numChartsPerRow) {\n\t\t\tprevY = divY\n\t\t\tnumChartsPerRow++\n\t\t} else if (Math.abs(divY - prevY) < 5) {\n\t\t\tnumChartsPerRow++\n\t\t}\n\t\tconst xy = select(this)\n\t\t\t.attr('transform')\n\t\t\t.split('translate(')[1]\n\t\t\t.split(')')[0]\n\t\t\t.split(',')\n\t\t\t.map(d => +d.trim())\n\n\t\tif (translate.x === undefined || xy[0] > translate.x) translate.x = +xy[0]\n\t\tif (translate.y === undefined || xy[1] > translate.y) translate.y = +xy[1]\n\n\t\tconst title = this.parentNode.parentNode.firstChild\n\t\tconst tbox = title.getBoundingClientRect()\n\t\tif (tbox.width > maxw) maxw = tbox.width\n\t\tif (tbox.height > tboxh) tboxh = tbox.height\n\t\ttitles.push({ text: title.innerText, styles: window.getComputedStyle(title), tbox })\n\t})\n\n\t// add padding between charts\n\tmaxw += 80\n\tmaxh += 80\n\n\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\n\tconst svgSel = select(svg)\n\t\t.style('display', 'block')\n\t\t.style('opacity', 1)\n\t\t.attr('width', numChartsPerRow * maxw)\n\t\t.attr('height', Math.floor(mainGs.length / numChartsPerRow) * maxh)\n\n\tif (styleParent) {\n\t\tconst svgStyles = window.getComputedStyle(styleParent)\n\t\tfor (const prop of svgStyles) {\n\t\t\tif (prop.startsWith('font')) svgSel.style(prop, svgStyles.getPropertyValue(prop))\n\t\t}\n\t}\n\n\tmainGs.forEach((g, i) => {\n\t\tconst mainG = g.cloneNode(true)\n\t\tconst colNum = i % numChartsPerRow\n\t\tconst rowNum = Math.floor(i / numChartsPerRow)\n\t\tconst corner = { x: colNum * maxw + translate.x + 80, y: rowNum * maxh + translate.y }\n\t\tconst title = select(svg)\n\t\t\t.append('text')\n\t\t\t.attr('transform', 'translate(' + (corner.x + titles[i].tbox.width / 2 - 100) + ',' + corner.y + ')')\n\t\t\t.text(titles[i].text)\n\t\tfor (const prop of titles[i].styles) {\n\t\t\tif (prop.startsWith('font')) title.style(prop, titles[i].styles.getPropertyValue(prop))\n\t\t}\n\n\t\tselect(mainG).attr('transform', 'translate(' + corner.x + ',' + (corner.y + tboxh) + ')')\n\t\tsvg.appendChild(mainG)\n\t})\n\n\tto_svg(svg, svgName, { apply_dom_styles: true })\n}\n\nexport function downloadAggregatedSVG(chartImages, svgName) {\n\tconst x = 50\n\tconst svgParent = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\tconst styles = []\n\n\tlet y = 20\n\tfor (const chart of chartImages) {\n\t\tconst parent = chart.parent || chart.svg.node()\n\t\tconst svg = chart.svg.clone(true)\n\t\tconst g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n\t\tg.setAttribute('transform', `translate(${x}, ${y})`)\n\t\tconst svgStyles = window.getComputedStyle(parent)\n\t\tfor (const [prop, value] of Object.entries(svgStyles)) {\n\t\t\tif (prop.startsWith('font')) g.style[prop] = value\n\t\t}\n\t\tconst title = document.createElementNS('http://www.w3.org/2000/svg', 'text')\n\t\ttitle.textContent = chart.name\n\t\tg.appendChild(title)\n\n\t\tconst svgNode = svg.node()\n\t\tconst bbox = svgNode.getBoundingClientRect()\n\t\tsvgNode.setAttribute('transform', `translate(${x}, ${50})`)\n\n\t\tg.appendChild(svgNode)\n\t\tsvgParent.appendChild(g)\n\t\ty += bbox.height + 70 //30 from the shift for the label, 40 to add space for new plot\n\t}\n\tsvgParent.setAttribute('height', `${y + 20}`)\n\n\tto_svg(svgParent, svgName, { apply_dom_styles: true })\n}\n", "import { Menu } from '#dom/menu'\nimport { downloadSingleSVG, downloadAggregatedSVG } from '../common/svg.download.js'\n\nexport class DownloadMenu {\n\tmenu: Menu\n\tchartImages: any[]\n\tholder: any\n\tmultipleSVGs: boolean\n\tfilename: string\n\n\tconstructor(chartImages, filename = 'charts') {\n\t\tthis.menu = new Menu({ padding: '0px' })\n\t\tthis.chartImages = chartImages\n\t\tthis.multipleSVGs = chartImages.length > 1\n\t\tthis.filename = filename.replace(/\\s/g, '_')\n\t}\n\n\tshow(x, y) {\n\t\tthis.menu.clear()\n\t\tconst menuDiv = this.menu.d.append('div')\n\t\tmenuDiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text('PDF Portrait')\n\t\t\t.on('click', () => {\n\t\t\t\tdownloadSVGsAsPdf(this.chartImages, this.filename, 'portrait')\n\t\t\t\tthis.menu.hide()\n\t\t\t})\n\t\tmenuDiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text('PDF Landscape')\n\t\t\t.on('click', () => {\n\t\t\t\tdownloadSVGsAsPdf(this.chartImages, this.filename, 'landscape')\n\t\t\t\tthis.menu.hide()\n\t\t\t})\n\t\tmenuDiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text('SVG')\n\t\t\t.on('click', () => {\n\t\t\t\tdownloadAggregatedSVG(this.chartImages, this.filename)\n\t\t\t\tthis.menu.hide()\n\t\t\t})\n\n\t\tif (this.multipleSVGs)\n\t\t\tmenuDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.text('Multiple SVG')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tfor (const chart of this.chartImages)\n\t\t\t\t\t\tdownloadSingleSVG(chart.svg, chart.name.replace(/[^a-zA-Z0-9]/g, '_'), chart.svg.node(), chart.name)\n\t\t\t\t\tthis.menu.hide()\n\t\t\t\t})\n\t\tthis.menu.show(x - 20, y - 10)\n\t}\n}\n\nexport async function downloadSVGsAsPdf(chartImages, filename, orientation, filterImgs: any[] = []) {\n\tconst JSPDF = await import('jspdf')\n\tconst { jsPDF } = JSPDF\n\t/*\n\tWhen imported, the svg2pdf.js module modifies or extends the jsPDF library (which we already imported).\n\tThe code inside svg2pdf.js adds a new method (.svg()) to the jsPDF object prototype, making that functionality available on all jsPDF instances.\n\tTherefore, a simple import 'svg2pdf.js' without curly braces is all that is needed to apply its functionality. \n\t */\n\tawait import('svg2pdf.js') // This import extends jsPDF with SVG functionality\n\tconst doc = new jsPDF(orientation, 'pt', 'a4') // p for portrait, l for landscape, points, A4 size\n\tdoc.setFontSize(12)\n\tconst pageWidth = doc.internal.pageSize.getWidth()\n\tconst pageHeight = doc.internal.pageSize.getHeight()\n\n\tlet y = 50\n\tconst x = 0.05 * pageWidth\n\n\tfor (const filterImgUrl of filterImgs) {\n\t\tdoc.addImage(filterImgUrl, 'PNG', x, y, 0, 30)\n\t\ty += 30\n\t}\n\tif (filterImgs.length > 0) y += 50\n\n\tfor (const chartImage of chartImages) {\n\t\tconst name = chartImage.name\n\t\tconst svg = chartImage.svg.node().cloneNode(true) //clone to avoid modifying the original\n\t\tconst parent = chartImage.parent || chartImage.svg.node()\n\n\t\tconst svgStyles = window.getComputedStyle(parent)\n\t\tfor (const [prop, value] of Object.entries(svgStyles)) {\n\t\t\tif (prop.startsWith('font')) svg.style[prop] = value\n\t\t}\n\t\tparent.appendChild(svg) //Added otherwise does not print, will remove later\n\t\tconst svgWidth = svg.getAttribute('width')\n\t\tconst svgHeight = svg.getAttribute('height')\n\t\tconst scale = getPdfScale(pageWidth, pageHeight, svgWidth, svgHeight)\n\t\tconst width = svgWidth * scale //convert to pt and fit to page size\n\t\tconst height = svgHeight * scale //convert to pt and fit to page size\n\n\t\tif (y != 50 && y + height > pageHeight - 20) {\n\t\t\tdoc.addPage()\n\t\t\ty = 50\n\t\t}\n\t\tif (name.trim()) doc.text(name.length > 90 ? name.slice(0, 90) + '...' : name, x + 10, y - 20)\n\t\telse y -= 20\n\t\tsvg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`)\n\n\t\tawait doc.svg(svg, { x, y, width, height })\n\t\ty = y + height + 50\n\n\t\tparent.removeChild(svg)\n\t}\n\tdoc.save(filename + '.pdf')\n}\n\nexport function getPdfScale(pageWidth, pageHeight, svgWidth, svgHeight) {\n\tconst ratio = 72 / 96 //convert px to pt\n\tconst width = svgWidth * ratio //convert to pt\n\tconst height = svgHeight * ratio //convert to pt\n\tlet scaleWidth = 1,\n\t\tscaleHeight = 1\n\tif (width > pageWidth) {\n\t\tscaleWidth = pageWidth / width\n\t}\n\tif (height > pageHeight) {\n\t\tscaleHeight = pageHeight / height\n\t}\n\tconst scale = Math.min(scaleWidth, scaleHeight) * 0.9 //leave padding\n\treturn scale * ratio\n}\n", "export function to_textfile(filename, text) {\n\tconst a = document.createElement('a')\n\ta.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text))\n\ta.setAttribute('download', filename)\n\ta.style.display = 'none'\n\tdocument.body.appendChild(a)\n\ta.click()\n\tdocument.body.removeChild(a)\n}\n", "import { select } from 'd3-selection'\n/*\ndraw a horizontal bar with bg and fg to show percentage\n\ntd: holder\n\toptional, if missing, will return svg html\nv: \n\t.f fraction\n\t.v1 numerator, optional\n\t.v2 denominator\nat:\n\toptional\n\t.width\n\t.height\n\t.fillbg\n\t.fill\n\t.readcountcredible\n*/\n\nexport function fillbar(td, v, at) {\n\tif (!at) at = {}\n\tconst w = at.width || 40\n\tconst h = at.height || 12\n\n\tlet g\n\n\tif (td) {\n\t\ttd.attr('aria-label', (v.f * 100).toFixed(0) + '%' + (v.v1 != undefined ? ' (' + v.v1 + '/' + v.v2 + ')' : ''))\n\t\tg = td.append('svg').attr('width', w).attr('height', h)\n\t} else {\n\t\tg = select(document.body).append('svg')\n\t}\n\n\tlet y = 0\n\t// fill bg\n\tg.append('rect')\n\t\t.attr('y', y)\n\t\t.attr('width', w)\n\t\t.attr('height', h)\n\t\t.attr('fill', at.fillbg || '#CBE2F5')\n\t// fill fg\n\tg.append('rect')\n\t\t.attr('y', y)\n\t\t.attr('width', w * v.f)\n\t\t.attr('height', h)\n\t\t.attr('fill', at.fill || '#69A1D1')\n\n\tif (at.readcountcredible && v.v2 < at.readcountcredible) {\n\t\t// wash with gray\n\t\tconst smudge = '#545454'\n\t\tconst smudge2 = 0.3\n\t\tg.append('rect').attr('y', y).attr('width', w).attr('height', h).attr('fill', smudge).attr('fill-opacity', smudge2)\n\t}\n\n\tif (td) return g\n\n\tg.remove()\n\treturn '<svg width=' + w + ' height=' + h + '>' + g.node().innerHTML + '</svg>'\n}\n", "import { Menu } from '#dom'\nimport type { Div } from '../types/d3'\n\n/** Tentative implementation of a reusable flyout menu\n * Intended to support nested flyouts, e.g., for submenus.\n *\n ******** USAGE ********:\n * Multiple ways to code up the menu options.\n * - use .text to add opaque text (e.g. section header, small note)\n * - use .html to add custom html content (e.g. list groups with color span)\n * - use .label and .callback to add a clickable menu option. This\n * is the base menu item. Allows for the flyout menu to include menu\n * options with and without flyout submenus.\n * - use .isSubmenu to add a flyout submenu. If .options[] is provided,\n * a new flyout submenu will be created with those options. Otherwise,\n * provide a callback(holder) to populate the flyout div dynamically.\n *\n * ******* the final callback() is responsible for closing the\n * active menus. Include flyout.closeMenus() in the callback(s). *******\n *\n ******** NOTES ********:\n * - a flyout is the div itself\n * - the submenu is a nested menu within the flyout div\n *\n * - .options is nested for easier implementation of submenus.\n * All the options for one submenu can be separated into a nested\n * list or const instead of one, difficult to maintain, flat list.\n *\n * - Not all scenarios are tested. Prototype implementation.\n */\n\ntype FlyoutMenuOptions = {\n\t/** Either provide an existing Menu or one will be created on init.\n\t * ** Recommended ** to create one or reuse an existing menu and show\n\t * before calling the FlyoutMenu constructor.*/\n\ttip?: Menu\n\t/** Opaque header above the menu options */\n\theader?: string\n\toptions: FlyoutMenuOption[]\n}\n\nexport type FlyoutMenuOption = {\n\t/** Menu item text */\n\tlabel?: string\n\t/** Click event callback */\n\tcallback?: (...args: any[]) => void\n\t/** Set to enable a flyout div for populating either custom\n\t * html content set in the callback or a submenu from .options[] */\n\tisSubmenu?: boolean\n\toptions?: FlyoutMenuOption[]\n\t/** Shows slightly opaque text.\n\t * Best for section headings.*/\n\ttext?: string\n\t/** Allows for custom HTML content. */\n\thtml?: string\n}\n\ntype MenuPosition = {\n\trect: DOMRect\n\t/** If the center of the menu is less than half the viewport width,\n\t * it's considered left. */\n\tside: 'left' | 'right'\n\tspaceOnRight: boolean\n\tspaceOnLeft: boolean\n}\n\ntype MenuLevel = {\n\tmenu: Menu\n\tposition?: MenuPosition\n}\n\nexport class FlyoutMenu {\n\t/** Root parent menu */\n\tmainTip: Menu\n\t/** Map of active menus by their depth level with position info */\n\tprivate menuLevels: Map<number, MenuLevel>\n\t/** Current menu depth level */\n\tlevel: number\n\t/** Pixel offset for positioning menus */\n\t#offset = 10\n\n\tconstructor(opts: FlyoutMenuOptions) {\n\t\tthis.validateOpts(opts)\n\t\tthis.mainTip = opts?.tip || new Menu({ padding: '0px' })\n\t\tthis.level = 0\n\t\tthis.menuLevels = new Map([[this.level, { menu: this.mainTip }]])\n\n\t\tif (opts.header) {\n\t\t\tthis.addText(this.mainTip.d, opts.header)\n\t\t}\n\t\tif (this.mainTip.d.style('display') === 'none') {\n\t\t\tthis.mainTip.show()\n\t\t}\n\t\tthis.renderMenu(this.mainTip, opts.options)\n\t}\n\n\tprivate validateOpts(opts: FlyoutMenuOptions): FlyoutMenuOptions {\n\t\tif (!opts.options || !opts?.options?.length) {\n\t\t\tthrow new Error('FlyoutMenu requires at least one option.')\n\t\t}\n\t\tfor (const opt of opts.options) {\n\t\t\tif ((opt.label && !opt.callback && !opt.isSubmenu) || (!opt.label && opt.callback)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'If .label for a non-submenu or .callback() is provided in FlyoutMenuOption, both must be provided.'\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (opt.isSubmenu && !opt.callback && !opt.options) {\n\t\t\t\tthrow new Error('FlyoutMenuOption with isSubmenu=true must provide either a callback or options array.')\n\t\t\t}\n\t\t\tif (opt.isSubmenu && opt.callback && opt.options) {\n\t\t\t\tthrow new Error('FlyoutMenuOption with isSubmenu=true cannot have both callback and options properties.')\n\t\t\t}\n\t\t\tif (opt.text && opt.html) {\n\t\t\t\tthrow new Error('FlyoutMenuOption cannot have both text and html properties.')\n\t\t\t}\n\t\t\tif ((opt.text || opt.html) && (opt.isSubmenu || opt.options)) {\n\t\t\t\tthrow new Error('FlyoutMenuOption with text or html cannot have submenu properties.')\n\t\t\t}\n\t\t}\n\t\treturn opts\n\t}\n\n\t/** Centralize styling for header and text options */\n\tprivate addText(div: Div, text: string): void {\n\t\tdiv.append('div').style('padding', '5px').style('opacity', '0.75').text(text)\n\t}\n\n\t/** Starting with the root parent menu, will recursively render\n\t * all menu options and submenus in tandem with addMenuItem(). */\n\tprivate renderMenu(tip: Menu, options: FlyoutMenuOption[]): { div: any; opt: FlyoutMenuOption }[] {\n\t\tlet currentMenu = this.menuLevels.get(this.level)\n\t\tif (!currentMenu) {\n\t\t\tcurrentMenu = { menu: tip }\n\t\t}\n\t\t// Pass the position info to all menu items for consistent styling\n\t\tconst renderedOpts: { div: any; opt: FlyoutMenuOption }[] = []\n\t\tfor (const opt of options) {\n\t\t\tif (opt.text) this.addText(tip.d, opt.text)\n\t\t\telse if (opt.html) tip.d.append('div').html(opt.html)\n\t\t\telse {\n\t\t\t\tconst optDiv = this.addMenuItem(opt, tip, this.level)\n\t\t\t\trenderedOpts.push({ div: optDiv, opt })\n\t\t\t}\n\t\t}\n\t\t//Allow all the elements to render then analyze position once\n\t\tif (!currentMenu.position) {\n\t\t\tcurrentMenu.position = this.analyzeMenuPosition(tip.dnode!)\n\t\t\tthis.menuLevels.set(this.level, currentMenu)\n\t\t}\n\t\tfor (const { div, opt } of renderedOpts) {\n\t\t\tthis.updateMenuText(div, opt, currentMenu.position)\n\t\t}\n\t\treturn renderedOpts\n\t}\n\n\tprivate addMenuItem(opt: FlyoutMenuOption, tip: Menu, level: number): Div {\n\t\tconst optionCallback = () => {\n\t\t\tif (opt?.options?.length || opt.isSubmenu) {\n\t\t\t\tthis.level = level + 1\n\t\t\t\tconst flyoutTip = this.getFlyout(optDiv, tip)\n\t\t\t\tif (opt?.options) {\n\t\t\t\t\tconst renderedOpts = this.renderMenu(flyoutTip, opt.options)\n\t\t\t\t\t/** Always focus on the first option.\n\t\t\t\t\t * This circumvents the user tabbing through other\n\t\t\t\t\t * menu options before focusing on the newly\n\t\t\t\t\t * opened submenu. */\n\t\t\t\t\tif (renderedOpts.length > 0) {\n\t\t\t\t\t\trenderedOpts[0].div.node().focus()\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\topt.callback!(flyoutTip.d, this.closeMenus.bind(this))!\n\t\t\t\treturn\n\t\t\t}\n\t\t\t/** For now, supplying closeMenu method to callback for greater\n\t\t\t * caller control. For example if the menus should close\n\t\t\t * before an app.dispatch, the caller can control that sequence (e.g\n\t\t\t * the user see the loading message, changes, etc. unimpeded by\n\t\t\t * the menu divs)\n\t\t\t * May add in an immediate close option or flag to immediately\n\t\t\t * close later. */\n\t\t\topt.callback!(this.closeMenus.bind(this))\n\t\t\treturn\n\t\t}\n\t\tconst optDiv = tip.d\n\t\t\t.append('div')\n\t\t\t.text(opt.label!)\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.attr('tabindex', 0)\n\t\t\t.attr('role', 'button')\n\t\t\t.on('click', event => {\n\t\t\t\tevent.stopPropagation()\n\t\t\t\toptionCallback()\n\t\t\t})\n\t\t\t/** Allows users tabbing through menu options to\n\t\t\t * activate the callback with either Enter or Space keys.*/\n\t\t\t.on('keydown', event => {\n\t\t\t\tif (event.key !== 'Enter' && event.key !== ' ') return\n\t\t\t\tevent.preventDefault()\n\t\t\t\toptionCallback()\n\t\t\t})\n\n\t\treturn optDiv\n\t}\n\n\tprivate updateMenuText(div: Div, opt: FlyoutMenuOption, position: MenuPosition) {\n\t\tconst side = position.side\n\t\tdiv.style('text-align', side)\n\n\t\tif (opt.isSubmenu) {\n\t\t\tdiv\n\t\t\t\t.insert('div')\n\t\t\t\t.html(side === 'left' ? '\u203A' : '\u2039')\n\t\t\t\t.style('float', side === 'left' ? 'right' : 'left')\n\t\t}\n\t}\n\n\t/** If the menu appears less than half the viewport width, it's considered left.\n\t * The available space is calculated for both sides. Nested submenus will\n\t * take advantage of the available space when possible. */\n\tprivate analyzeMenuPosition(menuElement: HTMLElement): MenuPosition {\n\t\tconst rect = menuElement.getBoundingClientRect()\n\t\tconst vpWidth = window.innerWidth\n\n\t\tconst centerX = rect.left + rect.width / 2\n\t\tconst isLeft = centerX < vpWidth / 2\n\n\t\tconst spaceRight = vpWidth - (rect.left + rect.width)\n\t\tconst spaceLeft = rect.left\n\n\t\t// Minimum space needed for a submenu (estimate)\n\t\t// May adjust later based on actual submenu width\n\t\tconst minSubmenuWidth = 200\n\t\tconst hasSpaceRight = spaceRight >= minSubmenuWidth\n\t\tconst hasSpaceLeft = spaceLeft >= minSubmenuWidth\n\n\t\treturn {\n\t\t\trect,\n\t\t\tside: isLeft ? 'left' : 'right',\n\t\t\tspaceOnRight: hasSpaceRight,\n\t\t\tspaceOnLeft: hasSpaceLeft\n\t\t}\n\t}\n\n\tprivate calculateFlyoutPosition(\n\t\ttriggerElem: HTMLElement, //The element that triggered the flyout on click\n\t\tparentMenu: Menu //The entire parent menu containing the trigger\n\t): { x: number; y: number; side: 'left' | 'right' } {\n\t\t//Both of these are estimates for calculation purposes\n\t\t//May calculate more precisely later\n\t\tconst flyoutWth = 250\n\t\tconst flyoutHth = 300\n\n\t\tconst triggerRect = triggerElem.getBoundingClientRect()\n\n\t\tconst parentMenuLevel = this.menuLevels.get(this.level - 1)\n\t\tif (!parentMenuLevel) {\n\t\t\tthrow new Error(`Parent menu level ${this.level - 1} not found`)\n\t\t}\n\t\t// Get or calculate parent position\n\t\tif (!parentMenuLevel.position) {\n\t\t\tif (!parentMenu.dnode) throw new Error('Parent menu DOM node is not available.')\n\t\t\tparentMenuLevel.position = this.analyzeMenuPosition(parentMenu.dnode)\n\t\t}\n\n\t\tconst parentPos = parentMenuLevel.position\n\t\tconst vpWidth = window.innerWidth\n\n\t\tlet side: 'left' | 'right'\n\n\t\tif (this.level === 1) {\n\t\t\t// First level submenu - base decision on root menu position\n\t\t\tif (parentPos.side === 'left' && parentPos.spaceOnRight) {\n\t\t\t\tside = 'right'\n\t\t\t} else if (parentPos.side === 'right' && parentPos.spaceOnLeft) {\n\t\t\t\tside = 'left'\n\t\t\t} else {\n\t\t\t\t// Fallback: choose side with more space\n\t\t\t\tconst spaceRight = vpWidth - parentPos.rect.right\n\t\t\t\tconst spaceLeft = parentPos.rect.left\n\t\t\t\tside = spaceRight > spaceLeft ? 'right' : 'left'\n\t\t\t}\n\t\t} else {\n\t\t\t/** Nested submenus continue in the opposite direction\n\t\t\t * until space runs out. When space runs out, switch to the other side.\n\t\t\t */\n\t\t\tconst parentSide = parentPos.side\n\t\t\tconst spaceRight = vpWidth - parentPos.rect.right\n\t\t\tconst spaceLeft = parentPos.rect.left\n\n\t\t\tif (parentSide === 'right' && spaceLeft >= flyoutWth) {\n\t\t\t\tside = 'left'\n\t\t\t} else if (parentSide === 'left' && spaceRight >= flyoutWth) {\n\t\t\t\tside = 'right'\n\t\t\t} else {\n\t\t\t\tside = spaceRight > spaceLeft ? 'right' : 'left'\n\t\t\t}\n\t\t}\n\n\t\tlet x: number, y: number\n\n\t\tif (side === 'right') x = parentPos.rect.right + this.#offset\n\t\telse x = parentPos.rect.left - flyoutWth - 2\n\t\ty = triggerRect.top + this.#offset\n\n\t\t// Adjust x and y to keep within viewport\n\t\tconst maxY = window.innerHeight - flyoutHth\n\t\tif (y > maxY) y = maxY\n\t\tif (y < 0) y = 0\n\n\t\tif (x < 0) x = this.#offset\n\t\telse if (x + flyoutWth > vpWidth) {\n\t\t\tx = vpWidth - flyoutWth - this.#offset\n\t\t}\n\n\t\treturn { x, y, side }\n\t}\n\n\t/** When possible, reuse existing flyout */\n\tprivate getFlyout(div: any, tip: Menu): Menu {\n\t\tlet flyoutTip: Menu\n\n\t\t/** Purpose is to find an existing menu instance at this level\n\t\t * from a different menu option, clear it, and later reposition. */\n\t\tconst existingLevel = this.menuLevels.get(this.level)\n\t\tif (existingLevel) {\n\t\t\tflyoutTip = existingLevel.menu\n\t\t\tflyoutTip.clear()\n\t\t\t//Clear the position to recalculate in calculateFlyoutPosition()\n\t\t\texistingLevel.position = undefined\n\t\t} else {\n\t\t\tflyoutTip = new Menu({\n\t\t\t\tpadding: '0px',\n\t\t\t\tparent_menu: tip.d.node(),\n\t\t\t\tancestor_menus: Array.from(this.menuLevels.values()).map(level => level.menu.dnode)\n\t\t\t})\n\t\t\tthis.menuLevels.set(this.level, { menu: flyoutTip })\n\t\t}\n\t\tconst position = this.calculateFlyoutPosition(div.node(), tip)\n\t\tflyoutTip.show(position.x, position.y, false, true, false, div.node())\n\n\t\t// setTimeout(() => {\n\t\t// if (!flyoutTip.dnode) throw new Error('FlyoutTip DOM node is not available.')\n\t\t// const position = this.analyzeMenuPosition(flyoutTip.dnode)\n\t\t// const menuLevel = this.menuLevels.get(this.level)\n\t\t// if (menuLevel) {\n\t\t// menuLevel.position = position\n\t\t// }\n\t\t// }, 0)\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (!flyoutTip.dnode) throw new Error('FlyoutTip DOM node is not available.')\n\t\t\tconst position = this.analyzeMenuPosition(flyoutTip.dnode)\n\t\t\tconst menuLevel = this.menuLevels.get(this.level)\n\t\t\tif (menuLevel) {\n\t\t\t\tmenuLevel.position = position\n\t\t\t}\n\t\t})\n\n\t\treturn flyoutTip\n\t}\n\n\t/** Close all active menus\n\t * This method should be called within the final callback\n\t * in .options[] */\n\tpublic closeMenus(): void {\n\t\tfor (const [level, menuLevel] of this.menuLevels) {\n\t\t\tif (level > 0) {\n\t\t\t\t//Destroy all child menus\n\t\t\t\tmenuLevel.menu.d.remove()\n\t\t\t}\n\t\t\tmenuLevel.menu.hide()\n\t\t}\n\t\t// Clear all except main menu\n\t\tthis.menuLevels.clear()\n\t\tthis.menuLevels.set(0, { menu: this.mainTip })\n\t\tthis.level = 0\n\t}\n}\n", "import type { ClientGenome } from '../types/clientGenome'\nimport type { AppApi } from 'rx/src/AppApi'\nimport { addGeneSearchbox, FlyoutMenu, type FlyoutMenuOption, GeneSetEditUI, Menu, sayerror } from '#dom'\nimport { TermTypes } from '#shared/terms.js'\n\n/****** For mass plots only *******\n * Reuseable menu for gene expression chart buttons\n * Shows the use options before launching the appropriate\n * selection menu.\n *\n * Used in charts.js and SC app\n *\n * Should clear and show tip before calling this menu instance.\n * See .clickTo() implementation in charts.js */\n\ntype GeneExpressionTerm = {\n\tgene?: string\n\tname?: string\n\ttype: string\n}\n\nexport class GeneExpChartMenu {\n\tapp: AppApi\n\tgenome: ClientGenome\n\ttip: Menu\n\tunit: string\n\tmessage?: string\n\tflyout?: FlyoutMenu\n\t//Supports adding menu options for special use cases\n\tadditionalOptions: FlyoutMenuOption[]\n\n\tconstructor(app: AppApi, tip: Menu, options: FlyoutMenuOption[] = []) {\n\t\tthis.app = app\n\t\tthis.genome = app.opts.genome\n\t\tthis.tip = tip\n\t\tthis.unit = this.app.vocabApi.termdbConfig.queries?.geneExpression?.unit || 'Gene Expression'\n\t\tthis.additionalOptions = options\n\n\t\tthis.renderMenu()\n\t}\n\n\trenderMenu() {\n\t\tconst _options = [\n\t\t\t{\n\t\t\t\tlabel: 'Single gene summary',\n\t\t\t\tisSubmenu: true,\n\t\t\t\tcallback: (holder, closeMenus) => {\n\t\t\t\t\tthis.renderGeneSelect(holder, closeMenus)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Two gene comparison',\n\t\t\t\tisSubmenu: true,\n\t\t\t\tcallback: (holder, closeMenus) => {\n\t\t\t\t\tthis.renderTwoGeneSelect(holder, closeMenus)\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'Multiple genes for hierarchical clustering ',\n\t\t\t\tisSubmenu: true,\n\t\t\t\tcallback: (holder, closeMenus) => {\n\t\t\t\t\tthis.renderGeneMultiSelect(holder, closeMenus)\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\n\t\tthis.flyout = new FlyoutMenu({\n\t\t\ttip: this.tip,\n\t\t\theader: `Choose ${this.unit != 'Gene Expression' ? this.unit : ''} gene expression:`,\n\t\t\toptions: [..._options, ...this.additionalOptions]\n\t\t})\n\n\t\tif (this.message) {\n\t\t\tthis.tip.d.append('div').style('padding-top', '10px').style('opacity', '0.7').html(this.message)\n\t\t}\n\t}\n\n\t/** Launch summary plot for gene expression data\n\t * for one gene. */\n\trenderGeneSelect(holder, closeMenus) {\n\t\tconst tip = holder\n\t\tconst row = tip.append('div').style('padding', '5px')\n\t\trow.append('span').style('font-weight', 'bold').text('Select a gene:')\n\n\t\tconst geneSearch = addGeneSearchbox({\n\t\t\trow,\n\t\t\tgenome: this.genome,\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\tsearchOnly: 'gene',\n\t\t\tcallback: async () => {\n\t\t\t\tconst tw = {\n\t\t\t\t\tterm: {\n\t\t\t\t\t\tgene: geneSearch.geneSymbol,\n\t\t\t\t\t\tname: `${geneSearch.geneSymbol} ${this.unit}`,\n\t\t\t\t\t\ttype: TermTypes.GENE_EXPRESSION\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcloseMenus()\n\t\t\t\tthis.app.dispatch({\n\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tchartType: 'summary',\n\t\t\t\t\t\tterm: tw\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\t/** Guide the user to select the first gene then\n\t * a second to launch the summary plot on submit.*/\n\trenderTwoGeneSelect(holder, closeMenus) {\n\t\tconst term: GeneExpressionTerm = { type: TermTypes.GENE_EXPRESSION }\n\t\tconst term2: GeneExpressionTerm = { type: TermTypes.GENE_EXPRESSION }\n\n\t\tconst gene1row = holder.append('div').style('padding', '5px')\n\t\tconst gene2row = holder.append('div').style('padding', '5px').style('display', 'none')\n\n\t\tgene1row.append('span').style('font-weight', 'bold').text('Select 1st gene:')\n\t\tconst geneSearch1 = addGeneSearchbox({\n\t\t\trow: gene1row,\n\t\t\tgenome: this.genome,\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\tsearchOnly: 'gene',\n\t\t\tcallback: async () => {\n\t\t\t\tgene2row.style('display', 'block')\n\t\t\t\tif (!geneSearch1.geneSymbol) throw new Error('First gene result is required')\n\t\t\t\tterm.gene = geneSearch1.geneSymbol\n\t\t\t\tterm.name = `${geneSearch1.geneSymbol} ${this.unit}`\n\t\t\t}\n\t\t})\n\n\t\tgene2row.append('span').style('font-weight', 'bold').text('Select 2nd gene:')\n\t\tconst geneSearch2 = addGeneSearchbox({\n\t\t\trow: gene2row,\n\t\t\tgenome: this.genome,\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\tsearchOnly: 'gene',\n\t\t\tcallback: async () => {\n\t\t\t\tif (!geneSearch2.geneSymbol) throw new Error('Second gene result is required')\n\t\t\t\tterm2.gene = geneSearch2.geneSymbol\n\t\t\t\tterm2.name = `${geneSearch2.geneSymbol} ${this.unit}`\n\t\t\t}\n\t\t})\n\n\t\t//Submit button\n\t\tholder\n\t\t\t.append('button')\n\t\t\t.text('Submit')\n\t\t\t.style('margin', '5px')\n\t\t\t.on('click', () => {\n\t\t\t\tif (!term.name || !term.gene) {\n\t\t\t\t\tsayerror(holder, 'Missing first gene. Please provide a valid gene.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (!term2.name || !term2.gene) {\n\t\t\t\t\tsayerror(holder, 'Missing second gene. Please provide a valid gene.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tcloseMenus()\n\t\t\t\tthis.app.dispatch({\n\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tchartType: 'summary',\n\t\t\t\t\t\tterm: { term: term },\n\t\t\t\t\t\tterm2: { term: term2 }\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\t/** Render the GeneSetEdit UI for selection and then\n\t * launch the hierarchical clustering on submit.*/\n\trenderGeneMultiSelect(holder, closeMenus) {\n\t\tconst grpWrapper = holder.append('div').style('padding', '5px')\n\t\tgrpWrapper.append('span').style('font-weight', 'bold').text('Group name:')\n\n\t\tlet customName: string = 'New custom group'\n\t\tconst input = grpWrapper\n\t\t\t.append('input')\n\t\t\t.style('margin', '2px 5px')\n\t\t\t.style('width', '210px')\n\t\t\t.attr('placeholder', 'Group Name')\n\t\t\t.on('input', () => {\n\t\t\t\tcustomName = input.property('value')\n\t\t\t})\n\n\t\tnew GeneSetEditUI({\n\t\t\tholder: holder.append('div'),\n\t\t\t/** running hier clustering and the editing group\n\t\t\t * is the group used for clustering pass this mode\n\t\t\t * value to inform ui to support the optional button\n\t\t\t * \"top variably exp gene\" this is hardcoded for\n\t\t\t * the purpose of gene expression and should be improved. */\n\t\t\tgenome: this.genome,\n\t\t\tmode: 'geneExpression',\n\t\t\tvocabApi: this.app.vocabApi,\n\t\t\tcallback: async ({ geneList, name }) => {\n\t\t\t\tif (geneList.length <= 2) {\n\t\t\t\t\treturn alert('At least three genes are required for hierarchical clustering. Please select more genes.')\n\t\t\t\t}\n\n\t\t\t\tconst group: { name: string; lst: { [index: string]: any }[]; type: string } = {\n\t\t\t\t\tname: name || customName,\n\t\t\t\t\tlst: [],\n\t\t\t\t\ttype: 'hierCluster'\n\t\t\t\t}\n\t\t\t\t/** Unclear why group.lst logic from the initialized const\n\t\t\t\t * above was originally implemented. Logic copied several\n\t\t\t\t * times from matrix -> hierClust -> charts -> this file\n\t\t\t\t * without changes.\n\t\t\t\t * Leave for now until the reason becomes apparent or\n\t\t\t\t * delete at a later date. */\n\t\t\t\t// const lst = group.lst.filter((tw: { [index: string]: any }) => tw.term.type != 'geneVariant')\n\t\t\t\tconst tws = await Promise.all(\n\t\t\t\t\tgeneList.map(async (d: any) => {\n\t\t\t\t\t\tconst gene: string = d.symbol || d.gene\n\t\t\t\t\t\tconst name = `${gene} ${this.unit}`\n\t\t\t\t\t\tconst term = { gene, name, type: TermTypes.GENE_EXPRESSION }\n\t\t\t\t\t\t//if it was present use the previous term, genomic range terms require chr, start and stop fields, found in the original term\n\t\t\t\t\t\t// let tw: any = group.lst.find((tw: any) => tw.term.name == name)\n\t\t\t\t\t\t// if (!tw) tw = { term, q: {} }\n\t\t\t\t\t\treturn { term, q: {} }\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t\tgroup.lst = [...tws]\n\t\t\t\t/** Hold over code from previous implementation in charts.js\n\t\t\t\t * If group.lst is empty, do not remove any genes from tws. */\n\t\t\t\t// group.lst = [...lst, ...tws]\n\t\t\t\t// if (!group.lst.length) {\n\t\t\t\t// \tconst selectedGroup = {\n\t\t\t\t// \t\tindex: 0,\n\t\t\t\t// \t\tname,\n\t\t\t\t// \t\tlabel: name,\n\t\t\t\t// \t\tlst: [],\n\t\t\t\t// \t\tstatus: 'new'\n\t\t\t\t// \t}\n\t\t\t\t// \ttg.splice(selectedGroup.index, 1)\n\t\t\t\t// }\n\n\t\t\t\tcloseMenus()\n\t\t\t\tthis.app.dispatch({\n\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tchartType: 'hierCluster',\n\t\t\t\t\t\ttermgroups: [group],\n\t\t\t\t\t\tdataType: TermTypes.GENE_EXPRESSION\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n}\n", "import { keyupEnter, gmlst2loci } from '#src/client'\nimport { debounce } from 'debounce'\nimport { dofetch3 } from '#common/dofetch'\nimport { invalidcoord, string2pos } from '#src/coord'\nimport type { ClientGenome } from '../types/clientGenome'\n//import type {Menu} from '#dom'\n//import type { Div } from '../types/d3'\n\n/*\nexports:\n\naddGeneSearchbox()\nstring2variant()\n\ntypical usage:\n\n\tconst arg={\n\t\tgenome: <>,\n\t\trow: <>,\n\t\tcallback: async ()=>{\n\t\t\tdoAction(result)\n\t\t}\n\t}\n\tconst result=addGeneSearchbox(arg)\n\n\n\nTODO\n-- allow to hide searchStat dom\n-- dedup code with block.js\n-- dedup code with app header\n-- unify help message from gdc bam slicing ui and termsetting.snplst\n*/\n\ntype GeneSearchBoxArg = {\n\t/** menu instance to show list of matching genes */\n\ttip: any // applying Menu & Div types here gives many tsc err\n\t/** d3 element in which <input> is created */\n\trow: any\n\t/** Optional. The default is 'Gene, position' */\n\tplaceholder?: string\n\t/** \n\tif 'gene':\n\t\tinput can be symbol or alias\n\t\tresult is {geneSymbol:str}, will not map to coord\n\t\tcannot map isoform to gene name!\n\t\t(later may need geneOrIsoform flag to query both) \n\tif 'snp':\n\t\tuser must select a single snp\n\t\tinput can be dbSNP id, position, or variant format (chr.pos.ref.alt)\n\t\tallow to enter chr.pos.ref.alt or hgvs (see next section)\n\t\totherwise, only allow chr:start-stop\n\t*/\n\tsearchOnly?: 'gene' | 'snp'\n\t/** If true, user must click on search box and enter instead of automatically \n focusing on search box. Use to render d3 animations smoothly. */\n\tfocusOff?: boolean\n\t/**\n\tif no callback():\n\t\tany match is silently written to RESULT\n\t\twith repeated search the latest match is written to RESULT\n\t\tcommon pattern is that user will press a button to launch some logic that will check RESULT\n\t\tit's up to the calling code to decide when to access RESULT (e.g. pressing some button in caller's ui)\n\t\tusecase: block.tk.bam.gdc.js\n\tif has callback():\n\t\tupon a match, RESULT is updated and callback is triggered\n\t\tas a way to notify caller to do subsequent steps\n\t\tusecase: geneSearch4GDCmds3.js\n\t\tno parameter is supplied\n\t*/\n\tcallback?: () => void\n\t/** optional\n triggered when the <input> is emptied. allows an app to de-select a gene in this way */\n\temptyInputCallback?: () => void\n\t/** if true, hide the text msg on the right of <input> */\n\thideHelp?: boolean\n\t/** optional\n read-only; this script should not try to modify it\n if allowVariant is false, value can only be {chr, start, stop}\n if allowVariant is true, value can also be {chr, pos, ref, alt, isVariant:true}\n set to {chr, start, stop} to fill default position into <input>\n when missing, just show placeholder */\n\tdefaultCoord?: ResultArg\n\t/** required. client-side genome obj */\n\tgenome: ClientGenome\n\t/** default gene name to fill into search box */\n\tgeneSymbol?: string\n\t/** option to automatically trigger a search when a geneSymbol is specified */\n\ttriggerSearch?: boolean\n\t/** option to hide the search input after search results are generated */\n\thideInputBeforeCallback?: boolean\n\t/** option to disable the input, useful in demo mode */\n\tdisableInput?: boolean\n\t/** if true, allow user to type in a sequence mutation\n\tpartial support of hgvs https://varnomen.hgvs.org/recommendations/DNA/\n\tlimited to substitution/insertion/deletion on \"g.\"\n\tother references (o. m. c. n.) are not supported\n\n\tentered positions are 1-based, parse to 0-based (TODO: this needs to be verified)\n\n\tsnv\n\t\tgiven chr14:g.104780214C>T\n\t\tparse to chr14.104780214.C.T\n\n\tmnv\n\t\tgiven chr2:g.119955155_119955159delinsTTTTT\n\t\tparse to chr2.119955155.AGCTG.TTTTT\n\t\tmust query ref allele\n\n\tdeletion\n\t\tchr17:g.7673802delCGCACCTCAAAGCTGTTC\n\t\tparse to chr17.7673802.CGCACCTCAAAGCTGTTC.-\n\n\t\tchr?:g.33344591del\n\t\tparse to chr?.33344591.A.-\n\t\tmust query ref allele\n\n\t\tif allele is present after \"del\", will use the allele\n\t\totherwise decide by position/range\n\t\thttps://varnomen.hgvs.org/recommendations/DNA/variant/deletion/\n\n\tinsertion\n\t\tchr5:g.171410539_171410540insTCTG\n\t\tparse to chr5.171410539.-.TCTG\n\t*/\n\tallowVariant?: boolean\n}\n\n/** \"start/stop\" are included when entered a coordinate or the coord is mapped from a gene/snp */\ntype GeneOrSNPResult = { start: number; stop: number; ref?: string; alt?: string[] | string }\n/** \"pos/ref/alt\" are included when entered a variant */\ntype VariantResult = { pos: number; ref: string; alt: string; isVariant: boolean }\ntype ResultArg = (GeneOrSNPResult | VariantResult) & {\n\t/** is always included */\n\tchr: string\n}\n\ntype Result = Partial<GeneOrSNPResult> &\n\tPartial<VariantResult> & { geneSymbol?: string; fromWhat?: string; chr?: string; searchbox?: any }\n\nexport const debounceDelay = 500\n\n/*************************************\nby calling addGeneSearchbox(), it redirectly returns a RESULT object detailed below without await\n*/\nexport function addGeneSearchbox(arg: GeneSearchBoxArg) {\n\tconst tip = arg.tip,\n\t\trow = arg.row\n\tconst result: Result = {}\n\n\tif (arg?.searchOnly == 'snp' && !arg.genome.hasSNP) {\n\t\trow.append('span').text('Cannot support .searchOnly = \"snp\". Genome lacks SNP')\n\t\treturn result\n\t}\n\n\tlet placeholder: string,\n\t\twidth = 150\n\n\tif ('placeholder' in arg) {\n\t\tplaceholder = arg.placeholder!\n\t} else if (arg?.searchOnly == 'gene') {\n\t\tplaceholder = 'Gene'\n\t\twidth = 100 // use shorter width for inputting only one gene name\n\t} else {\n\t\tplaceholder = arg?.searchOnly == 'snp' ? 'Position' : 'Gene, position'\n\t\tif (arg.genome.hasSNP) {\n\t\t\tplaceholder += ', dbSNP'\n\t\t\twidth += 40\n\t\t}\n\t\tif (arg.allowVariant) {\n\t\t\tplaceholder += ', variant'\n\t\t\twidth += 40\n\t\t}\n\t}\n\n\tconst searchbox = row\n\t\t.append('input')\n\t\t.attr('type', 'text')\n\t\t.attr('placeholder', placeholder)\n\t\t.attr('aria-label', 'Gene symbol, position, or alias')\n\t\t.property('disabled', arg.disableInput || false)\n\t\t.attr('class', 'sja_genesearchinput')\n\t\t.style('width', width + 'px')\n\n\tresult.searchbox = searchbox\n\n\tsearchbox\n\t\t.on('focus', event => {\n\t\t\tevent.target.select()\n\t\t})\n\t\t.on('keyup', async event => {\n\t\t\tconst input = event.target\n\t\t\tconst v = input.value.trim()\n\n\t\t\tif (arg.emptyInputCallback && v.length == 0 && keyupEnter(event)) {\n\t\t\t\t// has such callback, should be triggered when <input> is emptied and hitting enter\n\t\t\t\ttip.hide()\n\t\t\t\targ.emptyInputCallback()\n\t\t\t\tsearchStat.word.text('')\n\t\t\t\tsearchStat.mark.html('')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (v.length <= 1) return tip.hide()\n\n\t\t\t// typed 2 or more chars, prompt user to press enter to search\n\t\t\tsearchStat.mark.html('')\n\t\t\tsearchStat.word.style('font-size', '0.7em')\n\t\t\tif (arg.hideHelp) {\n\t\t\t\t// won't show prompt. must clear any old contents in word\n\t\t\t\tsearchStat.word.text('')\n\t\t\t} else {\n\t\t\t\t// will show prompt and old contents are cleared\n\t\t\t\tsearchStat.word.text('Press ENTER to search, ESC to cancel')\n\t\t\t}\n\n\t\t\tif (keyupEnter(event)) {\n\t\t\t\t// pressed enter\n\n\t\t\t\t// this call may repeat the last debounced checkInput using debouncer(),\n\t\t\t\t// but it's safer to call it again in case the Enter key was pressed after the debounceDelay\n\t\t\t\t// to ensure that the applicable /genelookup has finished before detecting/displaying errors.\n\t\t\t\t// In contrast, the previous Promise + setInterval + resolve detection is not reliable,\n\t\t\t\t// because there might not be a pending checkInput() call to reset the emptied currLookupValue.\n\t\t\t\tawait checkInput()\n\n\t\t\t\t// try to parse as gene\n\t\t\t\t// get first gene match from menu\n\t\t\t\tif (arg?.searchOnly != 'snp') {\n\t\t\t\t\tconst hitgene = tip.d.select(\".sja_menuoption[isgene='1']\")\n\t\t\t\t\tif (hitgene.size()) {\n\t\t\t\t\t\t// gene match\n\t\t\t\t\t\tconst geneSymbol = hitgene.datum()\n\t\t\t\t\t\tif (arg.searchOnly == 'gene') {\n\t\t\t\t\t\t\tgetResult({ geneSymbol }, geneSymbol)\n\t\t\t\t\t\t\t// hit is found. hide gene tip and blur input\n\t\t\t\t\t\t\ttip.hide()\n\t\t\t\t\t\t\tinput.blur()\n\t\t\t\t\t\t\t// cancel debouncer to prevent repeating gene search and tip from showing up again\n\t\t\t\t\t\t\tdebouncer.clear()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tawait geneCoordSearch(geneSymbol)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// must not clear tip, genes on multiple loci will show as further options\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (arg?.searchOnly == 'gene') {\n\t\t\t\t\tgetResult(null, 'Gene not found')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// try to parse as variant format (chr.pos.ref.alt)\n\t\t\t\tif (arg.allowVariant) {\n\t\t\t\t\tconst variant = await string2variant(v, arg.genome)\n\t\t\t\t\tif (variant) {\n\t\t\t\t\t\tgetResult(variant, v)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// try to parse as snp (i.e., dbsnp entry)\n\t\t\t\t// get first snp match from menu\n\t\t\t\tconst hitsnp = tip.d.select(\".sja_menuoption[issnp='1']\")\n\t\t\t\tif (hitsnp.size()) {\n\t\t\t\t\t// snp match\n\t\t\t\t\tconst hit = hitsnp.datum()\n\t\t\t\t\tgetResult(\n\t\t\t\t\t\t{ chr: hit.chrom, start: hit.chromStart, stop: hit.chromEnd, ref: hit.ref, alt: hit.alt },\n\t\t\t\t\t\thit.name || v\n\t\t\t\t\t)\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (arg?.searchOnly == 'snp') {\n\t\t\t\t\tgetResult(null, 'Variant not found')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// try to parse as coord\n\t\t\t\tconst pos = string2pos(v, arg.genome)\n\t\t\t\tif (pos) {\n\t\t\t\t\tgetResult(pos, 'Valid coordinate')\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// no match\n\t\t\t\tgetResult(null, 'No match')\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (event.code == 'Escape') {\n\t\t\t\t// abandon changes to <input>\n\t\t\t\ttip.hide()\n\t\t\t\tif (result.chr) {\n\t\t\t\t\tgetResult(result, result.fromWhat!)\n\t\t\t\t} else if (arg.defaultCoord) {\n\t\t\t\t\tconst d = arg.defaultCoord as Result\n\t\t\t\t\tinput.value = d.chr + (d.isVariant ? '.' + d.pos + '.' + d.ref + '.' + d.alt : ':' + d.start + '-' + d.stop)\n\t\t\t\t}\n\t\t\t\tinput.blur()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (event.key == 'ArrowDown') {\n\t\t\t\ttip.d\n\t\t\t\t\t.selectAll('.sja_menuoption')\n\t\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t\t.on('keyup', event => {\n\t\t\t\t\t\tif (event.key == 'Enter') {\n\t\t\t\t\t\t\tevent.target.click()\n\t\t\t\t\t\t} else if (event.key == 'ArrowDown') {\n\t\t\t\t\t\t\tif (event.target.nextSibling) event.target.nextSibling.focus()\n\t\t\t\t\t\t} else if (event.key == 'ArrowUp') {\n\t\t\t\t\t\t\tif (event.target.previousSibling) event.target.previousSibling.focus()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\ttip.d.select('.sja_menuoption').node().focus()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tdebouncer()\n\t\t})\n\n\t// focusOff fix for jerky (unsmooth) app drawer sliding.\n\t// App drawer slide animation very jerky when .focus() is applied to any\n\t// input box. Set focusOff: true to smoothly execute animations.\n\tif (!arg.focusOff) searchbox.node().focus()\n\tconst searchStat = {\n\t\tmark: row.append('span').style('margin-left', '5px'),\n\t\tword: row.append('span').style('margin-left', '5px').style('font-size', '.8em').style('opacity', 0.6)\n\t}\n\n\tasync function checkInput() {\n\t\t// checking input format\n\t\tconst v = searchbox.property('value').trim()\n\t\tif (!v) return\n\t\ttip.showunder(searchbox.node()).clear()\n\n\t\t// see if input is gene\n\t\tif (arg?.searchOnly != 'snp') {\n\t\t\tconst gene = await dofetch3('genelookup', { body: { genome: arg.genome.name, input: v } })\n\t\t\tif (gene.error) {\n\t\t\t\ttip.d.append('div').style('margin', '5px').text(gene.error)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (gene.hits?.length) {\n\t\t\t\ttip.d\n\t\t\t\t\t.selectAll('div')\n\t\t\t\t\t.data(gene.hits)\n\t\t\t\t\t.join('div')\n\t\t\t\t\t.text(d => d)\n\t\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t\t.style('border-radius', '0px')\n\t\t\t\t\t.attr('isgene', 1)\n\t\t\t\t\t.on('click', async (event, d) => {\n\t\t\t\t\t\tif (arg?.searchOnly == 'gene') {\n\t\t\t\t\t\t\t// finding gene only, got result\n\t\t\t\t\t\t\tgetResult({ geneSymbol: d }, d)\n\t\t\t\t\t\t\ttip.hide()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// convert gene symbol to coord\n\t\t\t\t\t\t\tawait geneCoordSearch(d)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif (arg?.searchOnly == 'gene') return\n\n\t\t// see if input is in variant format (chr.pos.ref.alt)\n\t\tif (arg.allowVariant) {\n\t\t\tconst variant = await string2variant(v, arg.genome)\n\t\t\tif (variant) return\n\t\t}\n\n\t\t// see if input is dbsnp id\n\t\tconst dbsnp = await dofetch3('snp', { body: { byName: true, genome: arg.genome.name, lst: [v] } })\n\t\tif (dbsnp.error) throw dbsnp.error\n\t\tif (dbsnp.results.length) {\n\t\t\t// display hits in menu\n\t\t\tdisplayVariantHits(tip, dbsnp.results)\n\t\t\treturn\n\t\t}\n\n\t\t// see if input is coord\n\t\tconst pos = string2pos(v, arg.genome, true)\n\t\tif (pos) {\n\t\t\tif (arg?.searchOnly == 'snp') {\n\t\t\t\t// only search for snps\n\t\t\t\t// query dbsnp for snps with matching positions\n\t\t\t\t// TODO: querying a position query where start=stop (e.g.,\n\t\t\t\t// chr1:3-3) is currently not supported, but it should be.\n\t\t\t\t// This should be supported when string2pos() is changed\n\t\t\t\t// to always output 0-based position/coordinate (see the\n\t\t\t\t// TODO below)\n\t\t\t\tif (!pos.actualposition?.len) return\n\t\t\t\tconst chr = pos.chr\n\t\t\t\tconst start = pos.actualposition.position - 1 // convert to 0-based // TODO: should change string2pos() to always output 0-based position/coordinate\n\t\t\t\tconst stop = start + pos.actualposition.len\n\t\t\t\tconst ranges = [{ start, stop }]\n\t\t\t\tconst dbsnp = await dofetch3('snp', { body: { byCoord: true, genome: arg.genome.name, chr, ranges } })\n\t\t\t\tif (dbsnp.error) throw dbsnp.error\n\t\t\t\tif (dbsnp.results.length) {\n\t\t\t\t\t/* dbsnp hits found\n\t\t\t\t\t- hits will include variants whose coordinates overlap\n\t\t\t\t\twith, but may not match the query coordinates (e.g.,\n\t\t\t\t\tan indel will overlap with query coordinates, but its start coordinate may not match query start coordinate)\n\t\t\t\t\t- if query is for multiple bases (e.g., chr1:1-5), then\n\t\t\t\t\tdisplay all hits\n\t\t\t\t\t- if query is for a single base (e.g., chr1:3 or\n\t\t\t\t\tchr1:3-4), then display hits whose start coordinate matches the query start coordinate*/\n\t\t\t\t\tconst variants =\n\t\t\t\t\t\tpos.actualposition.len == 1 ? dbsnp.results.filter(hit => hit.chromStart == start) : dbsnp.results\n\t\t\t\t\t// display variants in menu\n\t\t\t\t\tdisplayVariantHits(tip, variants)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn\n\t\t}\n\t}\n\tconst debouncer = debounce(checkInput, debounceDelay)\n\n\tfunction displayVariantHits(tip, data) {\n\t\ttip.d\n\t\t\t.selectAll('div')\n\t\t\t.data(data)\n\t\t\t.join('div')\n\t\t\t.text(d => {\n\t\t\t\tconst pos = `${d.chrom}:${d.chromStart + 1}`\n\t\t\t\tconst alleles = `${d.ref}>${d.alt.join(',')}`\n\t\t\t\treturn `${d.name} (${pos} ${alleles})`\n\t\t\t})\n\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t.style('border-radius', '0px')\n\t\t\t.attr('issnp', 1)\n\t\t\t.on('click', (event, d) => {\n\t\t\t\tgetResult({ chr: d.chrom, start: d.chromStart, stop: d.chromEnd, ref: d.ref, alt: d.alt }, d.name)\n\t\t\t\ttip.hide()\n\t\t\t})\n\t}\n\n\tasync function geneCoordSearch(geneSymbol: string) {\n\t\t// geneSymbol is a valid gene symbol\n\t\t// retrieve its coordinates\n\t\ttip.hide()\n\t\tconst data = await dofetch3('genelookup', { body: { genome: arg.genome.name, input: geneSymbol, deep: 1 } })\n\t\tif (data.error) throw data.error\n\t\tif (!data.gmlst?.length) throw 'cannot retrieve gene coordinates'\n\t\tconst loci = gmlst2loci(data.gmlst)\n\t\tif (loci.length == 1) {\n\t\t\t// all isoforms are at the same locus\n\t\t\tgetResult(loci[0], geneSymbol, geneSymbol)\n\t\t\treturn\n\t\t}\n\t\t// isoforms are spread across multiple discontinuous loci\n\t\ttip.showunder(searchbox.node()).clear()\n\t\ttip.d\n\t\t\t.selectAll('div')\n\t\t\t.data(loci)\n\t\t\t.join('div')\n\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t.style('border-radius', '0px')\n\t\t\t.text(d => d.name + ' ' + d.chr + ':' + d.start + '-' + d.stop)\n\t\t\t.on('click', (event, d) => {\n\t\t\t\ttip.hide()\n\t\t\t\tgetResult(d, geneSymbol + ', ' + d.name, d.name)\n\t\t\t})\n\t}\n\n\tif (arg.defaultCoord) {\n\t\tconst d = arg.defaultCoord as Result\n\t\tif (d.isVariant) {\n\t\t\tsearchbox.property('value', d.chr + '.' + d.pos + '.' + d.ref + '.' + d.alt)\n\t\t\tresult.pos = d.pos\n\t\t\tresult.ref = d.ref\n\t\t\tresult.alt = d.alt\n\t\t} else {\n\t\t\tsearchbox.property('value', d.chr + ':' + d.start + '-' + d.stop)\n\t\t\tresult.start = d.start\n\t\t\tresult.stop = d.stop\n\t\t}\n\t\tresult.chr = d.chr\n\t}\n\n\t/* call to show a valid result, or error\n if result is valid, provide r: {chr,start,stop} to show coord in <input>, also show ✓\n if result is invalid, r is null, show ✗\n fromWhat is optional gene or snp name to show in search stat\n */\n\tasync function getResult(r: Partial<Result> | null, fromWhat: string, geneSymbol?: string) {\n\t\tif (r) {\n\t\t\t// got hit (coord or variant), clear result{}\n\t\t\tfor (const k in result) delete result[k]\n\t\t\tif (r.isVariant) {\n\t\t\t\t// do not update searchbox\n\t\t\t\tresult.chr = r.chr\n\t\t\t\tresult.pos = r.pos\n\t\t\t\tresult.ref = r.ref\n\t\t\t\tresult.alt = r.alt\n\t\t\t} else if (r.chr) {\n\t\t\t\t// is coord\n\t\t\t\tsearchbox.property('value', r.chr + ':' + r.start + '-' + r.stop)\n\t\t\t\tresult.chr = r.chr\n\t\t\t\tresult.start = r.start\n\t\t\t\tresult.stop = r.stop\n\t\t\t\tif (r.ref) result.ref = r.ref\n\t\t\t\tif (r.alt) result.alt = r.alt\n\t\t\t} else if (r.geneSymbol) {\n\t\t\t\t// is only a gene symbol\n\t\t\t\tsearchbox.property('value', r.geneSymbol)\n\t\t\t\tresult.geneSymbol = r.geneSymbol\n\t\t\t}\n\n\t\t\tsearchStat.mark.style('color', 'green').html('✓')\n\n\t\t\tif (geneSymbol) {\n\t\t\t\t// tell caller they found a gene\n\t\t\t\tresult.geneSymbol = geneSymbol\n\t\t\t}\n\t\t} else {\n\t\t\t// no hit\n\t\t\tsearchStat.mark.style('color', 'red').html('✗')\n\t\t}\n\t\tsearchStat.word.text(fromWhat || '')\n\n\t\t// fromWhat is the original search string. pass it to caller as extra piece of info\n\t\t// useful when user enters isoform accession and matches to genesymbol,\n\t\t// and wants to be able to refer back to which isoform was entered\n\t\tresult.fromWhat = fromWhat\n\n\t\tif (r && arg.callback) {\n\t\t\tif (arg.hideInputBeforeCallback) {\n\t\t\t\t// hide this search box after getting the results\n\t\t\t\tsearchbox.style('display', 'none') // hide input\n\t\t\t\targ.row.selectAll(':scope>span').style('display', 'none') // hide input label, checkbox\n\t\t\t}\n\t\t\t// has valid result, trigger callback (no need to await?)\n\t\t\tawait arg.callback()\n\t\t}\n\t}\n\n\t// need to capture arg.geneSymbol into another variable,\n\t// to pass type check and to have it is a \"static\" value when the timeout callback is called,\n\t// since using arg.geneSymbol directly is not guaranteed to have the same value after the timeout\n\tconst geneSymbol = arg.geneSymbol || ''\n\tif (geneSymbol) {\n\t\tsearchbox.property('value', geneSymbol)\n\t\tif (arg.triggerSearch)\n\t\t\tsearchbox.node().dispatchEvent(\n\t\t\t\tnew KeyboardEvent('keyup', {\n\t\t\t\t\tkey: 'Enter',\n\t\t\t\t\tcode: 'Enter',\n\t\t\t\t\tkeyCode: 13, // deprecated but still widely used\n\t\t\t\t\twhich: 13, // deprecated but still widely used\n\t\t\t\t\tbubbles: true, // important to allow the event to bubble up\n\t\t\t\t\tcancelable: true\n\t\t\t\t})\n\t\t\t)\n\t\telse setTimeout(() => getResult({ geneSymbol: arg.geneSymbol }, geneSymbol), 10)\n\t}\n\n\treturn result //searchbox\n}\n\nexport async function string2variant(v: string, genome: ClientGenome) {\n\t// try to parse as simple variant\n\tconst variant = string2simpleVariant(v, genome)\n\tif (variant) {\n\t\t// is a simple variant, return\n\t\treturn variant\n\t}\n\t// try to parse hgvs; if successful, return variant; otherwise return null as not a variant\n\treturn await string2hgvs(v, genome)\n}\n\nfunction string2simpleVariant(v: string, genome: ClientGenome) {\n\t// format: chr.pos.ref.alt\n\t// this format has conflict with hgvs e.g. NG_012232.1(NM_004006.2):c.93+1G>T\n\t// which is in fact not currently supported by this code\n\t// if it fails, return false and parse as hgvs next\n\tconst tmp = v.split('.')\n\tif (tmp.length != 4) return\n\tconst chr = tmp[0]\n\tconst pos = Number(tmp[1])\n\tconst e = invalidcoord(genome, chr, pos, pos)\n\tif (e) return\n\treturn {\n\t\tisVariant: true,\n\t\tchr,\n\t\tpos,\n\t\tref: tmp[2],\n\t\talt: tmp[3]\n\t}\n}\n\nasync function string2hgvs(v: string, genome: ClientGenome) {\n\tconst tmp = v.split(':g.')\n\tif (tmp.length != 2) {\n\t\t// only supports \"g.\" linear genomic reference. other ref types are not supported for now\n\t\treturn\n\t}\n\tconst chr = tmp[0]\n\n\t// if 'delins' is present, it can only be parsed as mnv (substitution)\n\tif (tmp[1].includes('delins')) {\n\t\treturn await hgvs_delins(chr, tmp[1], genome)\n\t}\n\t// if 'delins' is absent but 'del' is found, can only be parsed as deletion\n\tif (tmp[1].includes('del')) {\n\t\treturn await hgvs_del(chr, tmp[1], genome)\n\t}\n\t// if 'delins, del' are absent and 'ins' is found, can only be parsed as insertion\n\tif (tmp[1].includes('ins')) {\n\t\treturn hgvs_ins(chr, tmp[1])\n\t}\n\t// 'delins, del, ins' are all absent. can only be parsed as snv\n\treturn hgvs_snv(chr, tmp[1])\n}\n\nfunction hgvs_snv(chr: string, v: string) {\n\t// v: 104780214C>T\n\tconst tmp = v.match(/^(\\d+)([ATCG])>([ATCG])$/)\n\tif (!tmp || tmp.length != 4) {\n\t\t// not matching the required snv pattern\n\t\treturn\n\t}\n\t// tmp: ['104780214C>T', '104780214', 'C', 'T']\n\tconst pos = Number(tmp[1])\n\tif (!Number.isInteger(pos)) return\n\treturn {\n\t\tisVariant: true,\n\t\tchr,\n\t\tpos,\n\t\tref: tmp[2],\n\t\talt: tmp[3]\n\t}\n}\n\nfunction hgvs_ins(chr: string, v: string) {\n\t// chr5:g.171410539_171410540insTCTG\n\tconst [tmppos, altAllele] = v.split('ins')\n\tif (!altAllele) return\n\tconst pos = Number(tmppos.split('_')[0])\n\tif (!Number.isInteger(pos)) return\n\treturn {\n\t\tisVariant: true,\n\t\tchr,\n\t\tpos: pos + 1, // \"pos1_pos2\" from hgvs string means insertion between the two nucleotides\n\t\t// should use pos2 when ref allele is missing\n\t\tref: '-',\n\t\talt: altAllele\n\t}\n}\n\nasync function hgvs_del(chr: string, v: string, genome: ClientGenome) {\n\t//chr17:g.7673802delCGCACCTCAAAGCTGTTC\n\tconst [tmppos, refAllele] = v.split('del')\n\tif (refAllele) {\n\t\t// deleted ref nt is given, simply parse position and done\n\t\tconst pos = Number(tmppos.split('_')[0])\n\t\tif (!Number.isInteger(pos)) return\n\t\treturn {\n\t\t\tisVariant: true,\n\t\t\tchr,\n\t\t\tpos,\n\t\t\tref: refAllele,\n\t\t\talt: '-'\n\t\t}\n\t}\n\t// deleted ref nt is not given. this info is coded in tmppos, either \"333\" or \"333_334\"\n\t//e.g. chr2:g.119955155_119955159del\n\tconst [t1, t2] = tmppos.split('_')\n\tconst start = Number(t1)\n\tconst stop = t2 ? Number(t2) : start + 1\n\tif (!Number.isInteger(start) || !Number.isInteger(stop)) return\n\tconst refAllele2 = await getRefAllele(chr, start, stop, genome)\n\treturn {\n\t\tisVariant: true,\n\t\tchr,\n\t\t// pos, No variable to access??\n\t\tref: refAllele2,\n\t\talt: '-'\n\t}\n}\n\nasync function hgvs_delins(chr: string, v: string, genome: ClientGenome) {\n\t// chr2:g.119955155_119955159delinsTTTTT\n\tconst tmp = v.match(/^(\\d+)_(\\d+)delins([ATCG]+)$/)\n\tif (!tmp || tmp.length != 4) {\n\t\t// does not match with expected format\n\t\treturn\n\t}\n\tconst p1 = Number(tmp[1]),\n\t\tp2 = Number(tmp[2]),\n\t\taltAllele = tmp[3]\n\tif (!Number.isInteger(p1) || !Number.isInteger(p2)) return\n\tconst refAllele = await getRefAllele(chr, p1, p2, genome)\n\treturn {\n\t\tisVariant: true,\n\t\tchr,\n\t\tpos: p1,\n\t\tref: refAllele,\n\t\talt: altAllele\n\t}\n}\n\nasync function getRefAllele(chr: string, start: number, stop: number, genome: ClientGenome) {\n\tconst body = {\n\t\tcoord: chr + ':' + start + '-' + stop,\n\t\tgenome: genome.name\n\t}\n\tconst d = await dofetch3('ntseq', { body })\n\treturn d.seq\n}\n", "import type { Button, Div } from '../../types/d3'\n\ntype AddBtnOpts = {\n\t/** div to append the button */\n\tdiv: Div\n\t/** text to display on button */\n\ttext: string\n\t/** callback on click */\n\tcallback: () => void\n\t/** Optional: default is false */\n\tdisabled?: boolean\n\t/** Change button display based on caller logic */\n\tgetDisplayStyle?: () => string\n}\n/**\n * Creates a button uniform in style for the entire UI\n */\nexport function addButton(opts: AddBtnOpts): Button {\n\tif (!opts.div || !opts.text || !opts.callback) throw new Error('Missing required parameters')\n\treturn opts.div\n\t\t.append('button')\n\t\t.property('disabled', opts.disabled || false)\n\t\t.style('display', opts.getDisplayStyle ? opts.getDisplayStyle() : '')\n\t\t.style('border', 'none')\n\t\t.style('border-radius', '20px')\n\t\t.style('padding', '10px 15px')\n\t\t.text(opts.text)\n\t\t.on('click', () => {\n\t\t\topts.callback()\n\t\t})\n}\n", "import { select as d3select } from 'd3-selection'\nimport type { Elem } from '../../types/d3'\n\nexport function makeRadiosWithContentDivs(options: any, div: Elem) {\n\tconst divs = div\n\t\t.selectAll()\n\t\t.data(options, (d: any) => d.value)\n\t\t.enter()\n\t\t.append('div')\n\t\t.style('margin', '5px')\n\n\tconst labels = divs.append('label').on('mousedown', (event: Event) => {\n\t\tevent.stopPropagation()\n\t})\n\n\tconst inputs = labels\n\t\t.append('input')\n\t\t.attr('type', 'radio')\n\t\t.attr('name', (d: any) => d.label)\n\t\t.attr('value', (d: any) => d.value)\n\t\t.property('checked', (d: any) => d.checked)\n\t\t.on('input', async function (this: any, event: Event, d: any) {\n\t\t\tevent.stopPropagation()\n\t\t\tinputs.property('disabled', true)\n\t\t\tinputs.property('checked', false)\n\t\t\tdiv.selectAll('.contentDiv').style('display', 'none')\n\n\t\t\tconst contentDiv = d3select(this.parentNode)\n\t\t\t\t.append('div')\n\t\t\t\t.classed('contentDiv', true)\n\t\t\t\t.style('padding-left', '25px')\n\t\t\t\t.style('display', 'block')\n\n\t\t\tawait d.callback(contentDiv)\n\t\t\td3select(this).property('checked', true)\n\t\t\tinputs.property('disabled', false)\n\t\t})\n\n\tinputs.filter((d: any) => d.checked).property('checked', true)\n\n\tlabels.append('span').html((d: any) => ' ' + d.label)\n\n\t// Using an if statement to add the sublabel here\n\t// causes the linter to fuss\n\tlabels\n\t\t.append('span')\n\t\t.style('display', 'block')\n\t\t.style('padding-left', '25px')\n\t\t.style('font-size', '0.75em')\n\t\t.html((d: any) => d.sublabel || '')\n}\n", "import type { Menu } from '#dom'\nimport type { Div, Elem } from '../../types/d3'\nimport type { GeneArgumentEntry } from '#types'\nimport { addButton } from './addButton.ts'\nimport { make_one_checkbox } from '../checkbox.js'\nimport { makeRadiosWithContentDivs } from './radioWithContent.ts'\nimport { debounce } from 'debounce'\nimport type { ClientGenome } from '../../types/clientGenome'\n\ntype GenesMenuArgs = {\n\t/** tip holder for displaying the Menu */\n\ttip: Menu\n\tgenome: ClientGenome\n\t/** object sent from the view model\n\t * .param is the defined arg from the dataset\n\t * .input is the element created in addParameter and returned\n\t * to the view model\n\t */\n\tparams: { param: GeneArgumentEntry; input?: Elem }[]\n\t/** Called when 'Calculate genes' is clicked */\n\tcallback: (f?: number) => void\n\t/** Adds nested .options: [] for parameters back to opts\n\t * after rendering to avoid duplicate elements\n\t */\n\taddOptionalParams: ({ param, input }) => void\n}\n\nexport class GenesMenu {\n\ttip: Menu\n\tgenome: ClientGenome\n\tparams: { param: GeneArgumentEntry; input?: Elem }[]\n\tcallback: (f?: number) => void\n\taddOptionalParams: ({ param, input }) => void\n\t/** Collects nested param .options:[] for submenus. See 'boolean' type. */\n\treadonly params2Add: { param: GeneArgumentEntry; input: Elem }[] = []\n\n\tconstructor(opts: GenesMenuArgs) {\n\t\tthis.tip = opts.tip\n\t\tthis.genome = opts.genome\n\t\tthis.params = opts.params\n\t\tthis.callback = opts.callback\n\t\tthis.addOptionalParams = opts.addOptionalParams\n\n\t\tthis.tip.d.style('padding', '15px')\n\t\tthis.render()\n\n\t\tfor (const param of this.params2Add) this.addOptionalParams(param)\n\t}\n\n\trender() {\n\t\tfor (const param of this.params) {\n\t\t\tconst input = this.addParameter(param.param, this.tip.d.append('div'))\n\t\t\tparam.input = input\n\t\t}\n\t\t/** Prevents the gene set edit ui disappearing when clicking \n\t\twithin this menu. User can still click the gene set edit ui\n\t\tto close this menu. */\n\t\tthis.tip.d.on('mousedown', (event: Event) => {\n\t\t\tevent.stopPropagation()\n\t\t})\n\t\t//Submits all the inputs from the menu to the callback\n\t\tconst calGenesBtn = addButton({\n\t\t\tdiv: this.tip.d.append('div').style('padding', '20px').style('display', 'inline-block'),\n\t\t\ttext: 'Calculate genes',\n\t\t\tcallback: async () => {\n\t\t\t\tcalGenesBtn.property('disabled', true).text('Loading...')\n\t\t\t\tawait this.callback()\n\t\t\t\tthis.tip.hide()\n\t\t\t}\n\t\t})\n\t}\n\n\taddParameter(param, div: Div) {\n\t\tlet input\n\t\tif (param.type == 'boolean') {\n\t\t\tif (param?.options?.length) {\n\t\t\t\t/* ** Submenu ** \n\t\t\t\tUse checkbox to expand div for additional options when checked. */\n\t\t\t\tconst holder = div.append('div').attr('data-testid', 'sjpp-submenu-checkbox').style('padding', '2px')\n\t\t\t\tconst contentDiv = div.append('div').style('padding-left', '20px')\n\t\t\t\tinput = make_one_checkbox({\n\t\t\t\t\tholder: holder,\n\t\t\t\t\tid: param.id,\n\t\t\t\t\tchecked: param.checked,\n\t\t\t\t\tlabeltext: param.label,\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tcontentDiv.style('display', input.property('checked') ? 'block' : 'none')\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tinput.on('mousedown', (event: Event) => {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t})\n\t\t\t\tfor (const option of param.options) {\n\t\t\t\t\tconst optionInput = this.addParameter(option, contentDiv.append('div'))\n\t\t\t\t\toption.parentId = param.id\n\t\t\t\t\tthis.params2Add.push({ param: option, input: optionInput })\n\t\t\t\t}\n\t\t\t\tcontentDiv.style('display', input.property('checked') ? 'block' : 'none')\n\t\t\t} else {\n\t\t\t\tinput = div.append('input').style('padding', '2px').attr('type', 'checkbox').attr('id', param.id)\n\t\t\t\tif (param.value) input.property('checked', param.value)\n\t\t\t\tthis.addLabels(div, 'label', param)\n\t\t\t}\n\t\t}\n\t\t//The parameter value will be used as the input value if the option is checked\n\t\telse if (param.type == 'string' && param.value) {\n\t\t\tinput = make_one_checkbox({\n\t\t\t\tholder: div,\n\t\t\t\tid: param.id,\n\t\t\t\tchecked: true,\n\t\t\t\tlabeltext: param.label,\n\t\t\t\tcallback: event => {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t}\n\t\t\t})\n\t\t} else if (param.type == 'number') {\n\t\t\tinput = div\n\t\t\t\t.append('input')\n\t\t\t\t.attr('type', 'number')\n\t\t\t\t.style('width', '50px')\n\t\t\t\t.style('padding', '5px')\n\t\t\t\t.attr('id', param.id)\n\t\t\tif (param.value) input.attr('value', param.value)\n\t\t\tthis.addLabels(div, 'span', param)\n\t\t} else if (param.type == 'radio') {\n\t\t\tconst hasChecked = param.options.find((d: any) => d.checked)\n\t\t\tif (!hasChecked) param.options[0].checked = true\n\t\t\tinput = div.append('div').attr('id', param.id)\n\t\t\tinput.append('p').style('font-size', '0.8em').style('opacity', 0.75).text(param.label)\n\t\t\tthis.addRadioValue(param)\n\t\t\tthis.addRadioCallbacks(param, this.genome)\n\t\t\tmakeRadiosWithContentDivs(param.options, input as any)\n\t\t}\n\t\treturn input\n\t}\n\n\taddLabels(div: Div, elem: string, param: GeneArgumentEntry) {\n\t\tif (!param.sublabel) div.append(elem).html(param.label!).attr('for', param.id)\n\t\telse {\n\t\t\tconst labelDiv = div.append('div').style('display', 'inline-block').style('vertical-align', 'middle')\n\t\t\tlabelDiv\n\t\t\t\t.append(elem)\n\t\t\t\t.style('display', 'block')\n\t\t\t\t.style('padding-top', '3px')\n\t\t\t\t.html(param.label!)\n\t\t\t\t.attr('for', param.id)\n\t\t\tlabelDiv.append('span').style('display', 'block').style('font-size', '0.75em').html(param.sublabel)\n\t\t}\n\t}\n\n\taddRadioValue(param) {\n\t\tif (param.value) return\n\t\tconst checked = param.options.find((d: any) => d.checked)\n\t\tif (checked) {\n\t\t\tparam.value = {\n\t\t\t\ttype: checked.value,\n\t\t\t\tgeneList: null\n\t\t\t}\n\t\t}\n\t}\n\n\taddRadioCallbacks(param, genome) {\n\t\tfor (const opt of param.options) {\n\t\t\tif (!opt.type) opt.type = 'boolean'\n\t\t\tif (opt.type == 'tree') {\n\t\t\t\topt.callback = async (holder: Elem) => {\n\t\t\t\t\tconst termdb = await import('../../termdb/app.js')\n\t\t\t\t\tconst treeDiv = holder.append('div')\n\t\t\t\t\tawait termdb.appInit({\n\t\t\t\t\t\tholder: treeDiv,\n\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\tdslabel: opt.value,\n\t\t\t\t\t\t\tgenome: genome.name,\n\t\t\t\t\t\t\tnav: {\n\t\t\t\t\t\t\t\theader_mode: 'search_only'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttree: {\n\t\t\t\t\t\t\tclick_term: (term: any) => {\n\t\t\t\t\t\t\t\tholder\n\t\t\t\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t\t\t\t.classed('ts_pill sja_filter_tag_btn sja_tree_click_term termlabel', true)\n\t\t\t\t\t\t\t\t\t.style('margin', '5px')\n\t\t\t\t\t\t\t\t\t.text(`${term.id}`)\n\t\t\t\t\t\t\t\tparam.value = {\n\t\t\t\t\t\t\t\t\ttype: opt.value,\n\t\t\t\t\t\t\t\t\tgeneList: term._geneset.map((t: any) => t.symbol)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ttreeDiv.selectAll('*').remove()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (opt.type == 'text') {\n\t\t\t\topt.callback = async (holder: Elem) => {\n\t\t\t\t\tholder\n\t\t\t\t\t\t.append('span')\n\t\t\t\t\t\t.style('display', 'block')\n\t\t\t\t\t\t.style('font-size', '0.8em')\n\t\t\t\t\t\t.style('opacity', 0.75)\n\t\t\t\t\t\t.text('Enter genes separated by spaces or commas')\n\t\t\t\t\tholder\n\t\t\t\t\t\t.append('textarea')\n\t\t\t\t\t\t.style('display', 'block')\n\t\t\t\t\t\t.on(\n\t\t\t\t\t\t\t'keyup',\n\t\t\t\t\t\t\tdebounce(function (this: any) {\n\t\t\t\t\t\t\t\tconst geneList = this.value\n\t\t\t\t\t\t\t\t\t.split(/[\\s,]+/)\n\t\t\t\t\t\t\t\t\t.map((t: string) => t.trim())\n\t\t\t\t\t\t\t\t\t.filter((t: string) => t !== '')\n\t\t\t\t\t\t\t\tparam.value = {\n\t\t\t\t\t\t\t\t\ttype: opt.value,\n\t\t\t\t\t\t\t\t\tgeneList\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t500\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (opt.type == 'boolean') {\n\t\t\t\topt.callback = () => {\n\t\t\t\t\tparam.value = {\n\t\t\t\t\t\ttype: opt.value,\n\t\t\t\t\t\tgeneList: null\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n", "import { select } from 'd3-selection'\nimport { icons, axisstyle, make_one_checkbox } from '#dom'\nimport { axisTop } from 'd3-axis'\nimport { format as d3format } from 'd3-format'\nimport { scaleLinear } from 'd3-scale'\nimport type { Th } from '../types/d3'\nimport type { AxisDomain } from 'd3-axis'\nimport type { TableArgs, TableBarplot, TableCell, TableColumn } from './types/table'\n\n/** incremented input ID will guarantee no collision from using getUniqueNameOrId()*/\nlet idIncr = 0\n/** random suffix will minimize the chance of collission of other code that\nhappen to use the same prefix/beginning substring for element ID */\nconst randomSuffix = Math.random()\n/** generate unique input name or id string */\nfunction getUniqueNameOrId(str = 'elem') {\n\treturn `sjpp-${str}-${idIncr++}-${randomSuffix}`\n}\n\n/*\nPrints an html table, using the specified columns and rows\nSee the paramters in TableArgs; function has no return\n*/\nexport function renderTable({\n\tcolumns,\n\trows,\n\tdiv,\n\tcolumnButtons,\n\tbuttons,\n\tbuttonsToLeft,\n\tnoButtonCallback,\n\tsingleMode = false,\n\tnoRadioBtn = false,\n\tshowLines = true,\n\tstriped = true,\n\tshowHeader = true,\n\theader = {},\n\tmaxWidth = '90vw',\n\tmaxHeight = '40vh',\n\tselectedRows = [],\n\tselectAll = false,\n\tresize = false,\n\tselectedRowStyle = {},\n\tinputName = null,\n\tdataTestId = null,\n\tdownload = undefined,\n\tnoAutoScroll = false,\n\thoverEffects\n}: TableArgs) {\n\tvalidateInput()\n\tlet _selectedRowStyle = selectedRowStyle\n\n\t/** make a shallow copy of the rows[] array to preserve the original index for the rows, not affected by sorting\n\ttable may allow to sort rows by a column. in such case, table still needs to report original index of selected rows\n\tto a callback, so that the downstream code can correctly access data for the selected rows after sorting\n\t*/\n\tconst rowsCopy = rows.map(i => i)\n\n\tfunction validateInput() {\n\t\tif (!columns || columns?.length == 0) throw `Missing columns data`\n\t\tif (!rows) throw `Missing rows data`\n\t\tif (!div) throw `Missing div argument`\n\t\tconst lineNumsWithDataProbs: number[] = []\n\t\tfor (const [i, row] of rows.entries()) {\n\t\t\tif (row.length != columns.length) lineNumsWithDataProbs.push(i + 1)\n\t\t}\n\t\tif (lineNumsWithDataProbs.length > 0)\n\t\t\tthrow `Num of row objects != num of cols. Line num(s) = ${lineNumsWithDataProbs}`\n\t\tif (buttons) {\n\t\t\tfor (const [i, btn] of buttons.entries()) {\n\t\t\t\tif (!btn.text) throw `Missing button.text in buttons, line #${i + 1}`\n\t\t\t\tif (!btn.callback) throw `Missing button.callback in buttons, line #${i + 1}`\n\t\t\t}\n\t\t}\n\n\t\t// this check is disabled for now as it breaks gdc bam slicing ui\n\t\t//if (singleMode == true && (!buttons || !noButtonCallback)) throw `Missing buttons array and noButtonCallback but singleMode = true`\n\t}\n\n\tconst uniqueInputName = inputName || getUniqueNameOrId('input')\n\tconst parentDiv = div.append('div').style('background-color', 'white').style('display', 'inline-block')\n\tif (download) {\n\t\tconst downloadDiv = div\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('padding', '5px')\n\t\t\t.style('vertical-align', 'top')\n\n\t\ticons['download'](downloadDiv, {\n\t\t\twidth: 15,\n\t\t\theight: 15,\n\t\t\ttitle: 'Download table',\n\t\t\thandler: () => {\n\t\t\t\tdownloadTable(rows, columns, download.fileName || 'table.tsv')\n\t\t\t}\n\t\t})\n\t}\n\n\tif (resize) {\n\t\tif (rows.length > 15) parentDiv.style('height', maxHeight)\n\t\tparentDiv.style('max-width', maxWidth)\n\t\tparentDiv.style('resize', 'both')\n\t} else {\n\t\tparentDiv.style('max-height', maxHeight).style('max-width', maxWidth)\n\t\tif (columns.length > 2) parentDiv.style('resize', 'horizontal')\n\t}\n\tparentDiv.attr('class', 'sjpp_show_scrollbar')\n\n\tconst table = parentDiv.append('table').style('width', '100%')\n\n\tif (dataTestId) {\n\t\ttable.attr('data-testid', dataTestId)\n\t}\n\t// should not use \"fixed\", it does not make sense to force equal width of all columns. also sample name column is a bit longer than most fields but we do want it to be entirely visible\n\t//.style('table-layout', 'fixed')\n\n\t// header div\n\tconst thead = table\n\t\t.append('thead')\n\t\t.style('position', 'sticky')\n\t\t.style('top', '0')\n\t\t.style('background-color', 'white')\n\t\t.style('padding', '5px')\n\n\tconst theadRow = thead.append('tr')\n\tif (showLines) theadRow.append('td').style('width', '1vw')\n\n\tif (buttons || noButtonCallback) {\n\t\t// rows are clickable\n\t\tif (noRadioBtn) {\n\t\t\t// should be in singleMode and do not want to show radio buttons\n\t\t} else {\n\t\t\t// create column for radio button\n\t\t\tconst cell = theadRow.append('td').attr('class', 'sjpp_table_header').style('width', '1.5vw')\n\t\t\tif (!singleMode) {\n\t\t\t\tmake_one_checkbox({\n\t\t\t\t\tholder: cell,\n\t\t\t\t\tchecked: selectAll,\n\t\t\t\t\ttestid: 'sjpp-table-checkall',\n\t\t\t\t\tcallback: checked => {\n\t\t\t\t\t\tconst nodes = tbody.selectAll('input[type=checkbox]').nodes() // must restrict to type=checkbox and avoid selecting color button <input>\n\t\t\t\t\t\ttbody.selectAll('input').property('checked', checked)\n\t\t\t\t\t\tif (buttons) updateButtons()\n\t\t\t\t\t\tif (noButtonCallback) for (const [i, node] of nodes.entries()) noButtonCallback(i, node)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tif (!showHeader)\n\t\t\t\t\ttheadRow.append('th').text('Check/Uncheck All').attr('class', 'sjpp_table_header sjpp_table_item')\n\t\t\t}\n\t\t}\n\t}\n\n\tif (columnButtons && columnButtons.length > 0) {\n\t\tconst th = theadRow.append('th').text('Actions').attr('class', 'sjpp_table_item sjpp_table_header')\n\t\tif (header?.style) {\n\t\t\tfor (const k in header.style) th.style(k, header.style[k])\n\t\t}\n\t}\n\n\tif (showHeader) {\n\t\tfor (const [i, c] of columns.entries()) {\n\t\t\tconst th = theadRow.append('th').text(c.label).attr('class', 'sjpp_table_item sjpp_table_header')\n\t\t\tif (c.width) th.style('width', c.width)\n\t\t\tif (c.tooltip) th.attr('title', c.tooltip)\n\t\t\tif (header?.allowSort) {\n\t\t\t\t//Only create sort button for columns with data\n\t\t\t\t//(i.e. not html columns)\n\t\t\t\tif (c.sortable) addSort(th, i)\n\t\t\t}\n\t\t\tif (header?.style) {\n\t\t\t\tfor (const k in header.style) th.style(k, header.style[k])\n\t\t\t}\n\t\t\tif (c.barplot) {\n\t\t\t\t// barplot column\n\t\t\t\tth.text('') // quick fix; th.text() has been assigned above in order that sort button can show. here clear the text to render axis svg instead\n\t\t\t\tprepareBarPlot(c.barplot, i, rows)\n\t\t\t\tdrawBarplotAxis(c, th)\n\t\t\t\tif (c.sortable) addSort(th, i) //Add the sort after the scale and title is created\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n\n\tconst tbody = table.append('tbody')\n\tfunction updateRows() {\n\t\ttbody.selectAll('tr').remove()\n\t\tfor (const [rowIdx, row] of rows.entries()) {\n\t\t\tlet checkbox\n\t\t\tconst tr = tbody.append('tr').attr('class', 'sjpp_row_wrapper').attr('tabindex', 0)\n\t\t\tif (striped && rowIdx % 2 == 1) tr.style('background-color', 'rgb(245,245,245)')\n\n\t\t\t// for Section 508 compliance: always create an aria-labelledby attribute on an input\n\t\t\t// NOTE: a title attribute, wrapping with a label element, or other solutions are possible,\n\t\t\t// but using aria-labelled by is less likely to conflict with existing elem attributes or layout\n\t\t\tconst ariaLabelledBy = row.ariaLabelledBy || row[0]?.elemId || getUniqueNameOrId('td')\n\t\t\t// by default, assume that the first data cell should be used to label the input to its left,\n\t\t\t// and should create an element id on it as needed\n\t\t\tif (!row.ariaLabelledBy && row[0] && !row[0].elemId) row[0].elemId = ariaLabelledBy\n\n\t\t\tif (buttons || noButtonCallback) {\n\t\t\t\tconst clickHandler = (e: any) => {\n\t\t\t\t\t// fix for clicking on <a> check/unchecking box to the left\n\t\t\t\t\tif (e.target.tagName == 'A' || e.target.tagName == 'BUTTON') {\n\t\t\t\t\t\te.stopPropagation()\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (e.target !== checkbox.node()) {\n\t\t\t\t\t\tif (singleMode)\n\t\t\t\t\t\t\t//not a checkbox\n\t\t\t\t\t\t\tcheckbox.node().checked = true\n\t\t\t\t\t\telse checkbox.node().checked = !checkbox.node().checked\n\t\t\t\t\t\tcheckbox.dispatch('change')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttr.on('click', clickHandler)\n\t\t\t\ttr.on('keydown', event => {\n\t\t\t\t\t// ignore this event if it bubbled up from a descendant element\n\t\t\t\t\tif (event.target.tagName != 'TR') return\n\t\t\t\t\tif (event.key == 'Enter') clickHandler(event)\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (showLines) {\n\t\t\t\ttr.append('td')\n\t\t\t\t\t.text(rowIdx + 1)\n\t\t\t\t\t.style('text-align', 'center')\n\t\t\t\t\t.style('width', '1vw')\n\t\t\t\t\t.style('font-size', '0.8rem')\n\t\t\t}\n\n\t\t\tif (buttons || noButtonCallback) {\n\t\t\t\tconst td = tr.append('td').style('width', '1.5vw').style('float', 'center')\n\t\t\t\tif (noRadioBtn) {\n\t\t\t\t\t// should be in singleMode and do not want to show radio buttons for cleaner look. <input> elements are still rendered since \"checkbox\" element is required for selection. thus simply hide <td>.\n\t\t\t\t\ttd.style('display', 'none')\n\t\t\t\t}\n\t\t\t\tconst checkboxValue = rowsCopy.findIndex(r => row == r)\n\t\t\t\tcheckbox = td\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.attr('type', singleMode ? 'radio' : 'checkbox')\n\t\t\t\t\t.attr('name', uniqueInputName)\n\t\t\t\t\t.attr('value', checkboxValue)\n\t\t\t\t\t.attr('aria-labelledby', ariaLabelledBy)\n\t\t\t\t\t.property('checked', selectAll || selectedRows.includes(rowIdx))\n\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\tif (buttons) updateButtons()\n\t\t\t\t\t\telse noButtonCallback!(rowIdx, checkbox.node())\n\n\t\t\t\t\t\tconst checked = checkbox.property('checked')\n\t\t\t\t\t\tfor (const key in _selectedRowStyle) {\n\t\t\t\t\t\t\ttr.style(key, checked ? _selectedRowStyle[key] : '')\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\tif (noAutoScroll) {\n\t\t\t\t\t// this setting prevents auto scrolling. this is needed due to an unresolved defect that on showing a small table e.g. categorical tvs, the page scrolls undesirably\n\t\t\t\t\t// Edgar's comment: so the fix should just be to take the table height/table cell screen position into account. Somehow, scrollIntoView() is not accurate for the embedded table row\n\t\t\t\t} else {\n\t\t\t\t\t// table is allowed to auto scroll to selected rows. this is desirable to auto-show selected rows from a large table\n\t\t\t\t\t//Do not scroll when all rows are selected. Problem appears when sorting.\n\t\t\t\t\tif (selectedRows.length != rows.length && rowIdx === selectedRows[0] && tr.node()) {\n\t\t\t\t\t\t// if there is at least one selected row (but not all rows are selected),\n\t\t\t\t\t\t// scroll to the table row,so that it's visible and obvious to the user\n\t\t\t\t\t\t// which rows are pre-selected\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\ttr.node()?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n\t\t\t\t\t\t}, 500)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst checked = checkbox.property('checked')\n\t\t\t\tfor (const key in selectedRowStyle) {\n\t\t\t\t\ttr.style(key, checked ? selectedRowStyle[key] : '')\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (columnButtons && columnButtons.length > 0) {\n\t\t\t\tconst td = tr.append('td').attr('class', 'sjpp_table_item')\n\t\t\t\t// Assuming x is your variable\n\t\t\t\tfor (const button of columnButtons) {\n\t\t\t\t\tbutton.button = td\n\t\t\t\t\t\t.append('button')\n\t\t\t\t\t\t.style('white-space', 'normal')\n\t\t\t\t\t\t.text(button.text)\n\t\t\t\t\t\t.on('click', event => button.callback(event, rowIdx))\n\t\t\t\t\tif (button.dataTestId) {\n\t\t\t\t\t\tbutton.button.attr('data-testid', button.dataTestId)\n\t\t\t\t\t}\n\t\t\t\t\tif (button.class) button.button.attr('class', button.class)\n\t\t\t\t\tif ('disabled' in button) button.button.node().disabled = button.disabled!(rowIdx)\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const [colIdx, cell] of row.entries()) {\n\t\t\t\tconst td = tr\n\t\t\t\t\t.append('td')\n\t\t\t\t\t.attr('id', cell.elemId || null)\n\t\t\t\t\t.attr('class', 'sjpp_table_item')\n\n\t\t\t\t// attach <td> for external code to modify\n\t\t\t\tcell.__td = td\n\n\t\t\t\tconst column = columns[colIdx]\n\n\t\t\t\tif (column.barplot) {\n\t\t\t\t\tif (typeof cell.value === 'number') {\n\t\t\t\t\t\tdrawBarplotInCell(cell.value, td, column.barplot)\n\t\t\t\t\t}\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// column is not barplot\n\t\t\t\tif (column.editCallback && cell.value) {\n\t\t\t\t\ttd.on('click', (event: MouseEvent) => {\n\t\t\t\t\t\tevent.stopImmediatePropagation()\n\t\t\t\t\t\tconst isEdit = td.select('input').empty()\n\t\t\t\t\t\tif (!isEdit) return\n\t\t\t\t\t\ttd.html('')\n\t\t\t\t\t\tconst input = td\n\t\t\t\t\t\t\t.append('input')\n\t\t\t\t\t\t\t.attr('value', cell.value)\n\t\t\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\t\t\tconst value = input.node().value\n\t\t\t\t\t\t\t\tcell.value = value\n\t\t\t\t\t\t\t\ttd.text(cell.value)\n\t\t\t\t\t\t\t\tcolumn.editCallback!(rowIdx, cell)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tinput.node().focus()\n\t\t\t\t\t\tinput.node().select()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tif (column.width) td.style('width', column.width)\n\t\t\t\tif (column.align) td.style('text-align', column.align)\n\n\t\t\t\tif (column.nowrap) td.style('white-space', 'nowrap')\n\t\t\t\tif (cell.url) {\n\t\t\t\t\ttd.append('a')\n\t\t\t\t\t\t.text(cell.value || cell.value == 0 ? cell.value : cell.url) //Fix for if .value missing, url does not display\n\t\t\t\t\t\t.attr('href', cell.url)\n\t\t\t\t\t\t.attr('target', '_blank')\n\t\t\t\t} else if (cell.html) {\n\t\t\t\t\ttd.html(cell.html)\n\t\t\t\t} else if ('value' in cell) {\n\t\t\t\t\ttd.text(cell.value)\n\t\t\t\t\tif (cell.color) td.style('color', cell.color)\n\t\t\t\t} else if (cell.color) {\n\t\t\t\t\tif (cell.disabled) {\n\t\t\t\t\t\ttd.style('background-color', cell.color)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst input = td\n\t\t\t\t\t\t\t.append('input')\n\t\t\t\t\t\t\t.attr('type', 'color')\n\t\t\t\t\t\t\t.attr('value', cell.color)\n\t\t\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\t\t\tconst color = input.node().value\n\t\t\t\t\t\t\t\tcell.color = color\n\t\t\t\t\t\t\t\tif (column.editCallback) column.editCallback(rowIdx, cell)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t} else if (column.fillCell) {\n\t\t\t\t\tcolumn.fillCell(td, rowIdx)\n\t\t\t\t}\n\t\t\t}\n\t\t\t//Table code may update when the caller code does not (e.g. sorting)\n\t\t\t//Added event listeners in caller code will be lost when the rows update.\n\t\t\t//Allows for hover effects to remain consistent when the rows are updated.\n\t\t\tif (hoverEffects) hoverEffects(tr, row)\n\t\t}\n\t}\n\n\tupdateRows()\n\n\tif (buttons) {\n\t\tconst footerDiv = div\n\t\t\t.append('div')\n\t\t\t.insert('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('float', buttonsToLeft ? 'left' : 'right')\n\t\t\t.style('padding-bottom', '5px')\n\n\t\tfor (const bCfg of buttons) {\n\t\t\tbCfg.button = footerDiv\n\t\t\t\t.append('button')\n\t\t\t\t.text(bCfg.text)\n\t\t\t\t.style('margin', '10px 10px 0 0')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tbCfg.callback(getCheckedRowIndex(), bCfg.button.node())\n\t\t\t\t})\n\t\t\tif (bCfg.class) bCfg.button.attr('class', bCfg.class)\n\t\t\t//else button.button.attr('class', 'sjpp_apply_btn')\n\t\t\tbCfg.button.node().disabled = selectedRows.length == 0 && !selectAll\n\t\t}\n\n\t\t// call function to update buttons with .onChange(), so their text can reflect default checkbox selection\n\t\tupdateButtons()\n\t}\n\n\tfunction updateButtons() {\n\t\tif (!buttons) return\n\t\tconst idxlst = getCheckedRowIndex()\n\t\tfor (const b of buttons) {\n\t\t\tb.button.node().disabled = idxlst.length == 0\n\t\t\tif (b.onChange) b.onChange(idxlst, b.button.node())\n\t\t}\n\t}\n\n\t/** Returns the index from the original input array\n\t * (captured in rowsCopy) not the current array index. */\n\tfunction getCheckedRowIndex() {\n\t\tconst checkboxes = tbody.selectAll('input:checked')\n\t\tconst idxlst: number[] = []\n\t\tif (!checkboxes.empty()) {\n\t\t\tcheckboxes.each((d, i, nodes) => {\n\t\t\t\tconst node = nodes[i]\n\t\t\t\tidxlst.push(Number.parseInt(node.value))\n\t\t\t})\n\t\t}\n\t\treturn idxlst\n\t}\n\n\tfunction addSort(th: Th, i: number) {\n\t\tconst callback = (isAscending: boolean) => sortTableCallBack(i, rows, isAscending)\n\t\tconst updateTable = (newRows: TableCell[][]) => {\n\t\t\tconst checked = getCheckedRowIndex()\n\t\t\tconst idxMap = new Map(rowsCopy.map((val, idx) => [val, idx]))\n\t\t\tselectedRows = checked.map(i => newRows.findIndex((v: TableCell[]) => idxMap.get(v) === i))\n\n\t\t\t/** Must override caller setting once user selects row(s) */\n\t\t\tif (selectedRows.length) selectAll = false\n\n\t\t\trows = newRows\n\t\t\tupdateRows()\n\t\t}\n\t\tcreateSortButton(th, callback, updateTable)\n\t}\n\n\tconst api = {\n\t\tupdate(opts) {\n\t\t\tif (opts.selectedRowStyle) {\n\t\t\t\t_selectedRowStyle = opts.selectedRowStyle\n\t\t\t\tconst trs = tbody.selectAll('tr')\n\t\t\t\tfor (const key in _selectedRowStyle) {\n\t\t\t\t\ttrs.style(key, function (this: any) {\n\t\t\t\t\t\treturn select(this).select('td input').property('checked') ? _selectedRowStyle[key] : ''\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn api\n}\n\n/**\n * Downloads table data as a TSV (Tab-Separated Values) file.\n *\n * @param {Array<Array<Cell>>} rows - Array of rows, where each row is an array of cell objects.\n * Each cell object can have one of the following properties:\n * - value: The primary content to display (can be string, number, including 0)\n * - url: A URL to be used if value is not present\n * - color: A color value to be used if neither value nor url is present\n * @param {Array<TableColumn>} cols - Array of column definition objects.\n * Each column object must have:\n * - label: string - The header text for the column\n * @param {string} [filename='table.tsv'] - Optional custom filename for the downloaded file\n *\n * @example\n * // Basic usage\n * const rows = [\n * [{ value: \"John\" }, { value: 25 }, { value: \"New York\" }],\n * [{ value: \"Jane\" }, { value: 0 }, { value: \"Boston\" }]\n * ];\n * const cols = [\n * { label: \"Name\" },\n * { label: \"Age\" },\n * { label: \"City\" }\n * ];\n * await downloadTable(rows, cols, \"users.tsv\");\n *\n * @example\n * // Using different cell property types\n * const rows = [\n * [{ value: \"Doc\" }, { url: \"https://example.com\" }, { color: \"#FF0000\" }]\n * ];\n * const cols = [\n * { label: \"Name\" },\n * { label: \"Link\" },\n * { label: \"Color\" }\n * ];\n * await downloadTable(rows, cols);\n *\n * @returns {Promise<void>} - The function creates and triggers a download in the browser\n */\nexport async function downloadTable(rows, cols, filename = 'table.tsv') {\n\tlet lines = ''\n\n\t// Add header row with column labels\n\tfor (const column of cols) {\n\t\tlines += `${column.label}\\t`\n\t}\n\tlines += '\\n'\n\n\t// Add data rows\n\tfor (const row of rows) {\n\t\tfor (const cell of row) {\n\t\t\tlet value = ''\n\t\t\t// Check for cell.value existence to properly handle zero values\n\t\t\tif ('value' in cell) value = cell.value\n\t\t\telse if (cell.url) value = cell.url\n\t\t\telse if (cell.color) value = cell.color\n\t\t\tlines += `${value}\\t`\n\t\t}\n\t\tlines += '\\n'\n\t}\n\n\t// Create and trigger download\n\tconst dataStr = 'data:text/tsv;charset=utf-8,' + encodeURIComponent(lines)\n\tconst link = document.createElement('a')\n\tlink.setAttribute('href', dataStr)\n\t// If you don't know the name or want to use\n\t// the webserver default set name = ''\n\tlink.setAttribute('download', filename)\n\tdocument.body.appendChild(link)\n\tlink.click()\n\tlink.remove()\n}\n\n/** Toggles between ascending and descending sort */\nfunction createSortButton(th: Th, callback, updateTable) {\n\tlet isAscending = false\n\tconst sortDiv = th.append('div').style('display', 'inline-block').attr('class', 'sjpp-table-sort-button')\n\ticons['updown'](sortDiv, {\n\t\thandler: () => {\n\t\t\tisAscending = !isAscending\n\t\t\tconst newRows = callback(isAscending)\n\t\t\tupdateTable(newRows)\n\t\t}\n\t})\n}\n\n/** Detects the type of values in a column and sorts accordingly */\nexport function sortTableCallBack(i: number, rows: any, isAscending: boolean) {\n\t/** Some values always returned as strings may be numeric values\n\t * (e.g. file names used as either alphanumeric or numeric ids).\n\t * In the latter case, sorting fails.\n\t * Detect such columns and sort the value as numbers */\n\tlet allNumStrs = true\n\tfor (let r = 0; r < rows.length; r++) {\n\t\tconst v = rows[r][i].value\n\t\tif (typeof v !== 'string' || !Number.isFinite(+v)) {\n\t\t\tallNumStrs = false\n\t\t\tbreak\n\t\t}\n\t}\n\tconst newRows = rows.sort((a: TableCell, b: TableCell) => {\n\t\tconst aVal = a[i].value\n\t\tconst bVal = b[i].value\n\n\t\tif ((aVal == null && aVal !== 0) || (bVal == null && bVal !== 0)) return 0\n\t\t// numbers\n\t\tif (typeof aVal === 'number' && typeof bVal === 'number') {\n\t\t\treturn isAscending ? aVal - bVal : bVal - aVal\n\t\t}\n\t\t// numeric strings, detected above\n\t\tif (allNumStrs) {\n\t\t\tconst aNum = +aVal\n\t\t\tconst bNum = +bVal\n\t\t\treturn isAscending ? aNum - bNum : bNum - aNum\n\t\t}\n\t\t// regular strings\n\t\tif (typeof aVal === 'string' && typeof bVal === 'string') {\n\t\t\treturn isAscending ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal)\n\t\t}\n\t\treturn 0\n\t})\n\treturn newRows\n}\n\nfunction prepareBarPlot(cb: TableBarplot, i: number, rows: any) {\n\tif (!cb.axisWidth) cb.axisWidth = 130\n\tif (!cb.colorPositive) cb.colorPositive = '#d49353'\n\tif (!cb.colorNegative) cb.colorNegative = '#5256d1'\n\tif (!cb.xpadding) cb.xpadding = 5\n\tlet min: number | null = null,\n\t\tmax: number | null = null\n\tfor (const r of rows) {\n\t\tconst v = r[i].value\n\t\tif (!Number.isFinite(v)) continue // ignore invalid value\n\t\tif (min == null) {\n\t\t\tmin = v\n\t\t\tmax = v\n\t\t} else {\n\t\t\tmin = Math.min(min as number, v)\n\t\t\tmax = Math.max(max as number, v)\n\t\t}\n\t}\n\tif (min !== null && max !== null && min < 0 && max > 0) {\n\t\t// force equal span on both sides\n\t\tconst a = Math.max(-min, max)\n\t\tmin = -a\n\t\tmax = a\n\t}\n\tcb.scale = scaleLinear()\n\t\t.domain([min ?? 0, max ?? 0])\n\t\t.range([0, cb.axisWidth])\n}\n\nfunction drawBarplotAxis(c: TableColumn, th: any) {\n\tconst cb = c.barplot! // assert it is truthy\n\tconst labfontsize = 14\n\tconst ypad = 5 // padding between axis label and axis\n\tconst tickfontsize = 12\n\tconst ticksize = 4 // where is ticksize applied in axis?\n\tconst svg = th\n\t\t.append('svg')\n\t\t.attr('width', 2 * (cb.xpadding || 0) + (cb.axisWidth || 0))\n\t\t.attr('height', labfontsize + ypad + tickfontsize + ticksize + 1) // plus 1 so axis bottom line can fully show\n\tconst axis = axisTop(cb.scale).ticks(cb.tickCount || 4)\n\tif (cb.tickFormat) axis.tickFormat(d3format(cb.tickFormat) as (domainValue: AxisDomain, index: number) => string)\n\n\taxisstyle({\n\t\taxis: svg\n\t\t\t.append('g')\n\t\t\t.attr('transform', `translate(0,${labfontsize + ypad + tickfontsize + ticksize})`)\n\t\t\t.call(axis),\n\t\tcolor: 'black',\n\t\tshowline: true\n\t})\n\tsvg\n\t\t.append('text')\n\t\t.attr('fill', 'black')\n\t\t.attr('font-size', labfontsize)\n\t\t.attr('text-anchor', 'middle')\n\t\t.text(c.label)\n\t\t.attr('x', (cb.xpadding || 0) + (cb.axisWidth || 0) / 2)\n\t\t.attr('y', labfontsize)\n}\n\nfunction drawBarplotInCell(value: number, td: any, c: TableBarplot) {\n\tif (!Number.isFinite(value)) return\n\tconst [min, max] = c.scale.domain()\n\tlet x1, x2, color\n\tif (min >= 0) {\n\t\t// all positive values\n\t\tx1 = 0 // bar starts at left and extends to right\n\t\tx2 = c.scale(value)\n\t\tcolor = c.colorPositive\n\t} else if (max <= 0) {\n\t\t// all neg values\n\t\tx2 = c.axisWidth //bar starts at right and extends to left\n\t\tx1 = c.scale(value)\n\t\tcolor = c.colorNegative\n\t} else {\n\t\tconst x0 = c.scale(0)\n\t\tconst xv = c.scale(value)\n\t\tx1 = Math.min(x0, xv)\n\t\tx2 = Math.max(x0, xv)\n\t\tcolor = value > 0 ? c.colorPositive : c.colorNegative\n\t}\n\tconst height = 14\n\ttd.append('svg')\n\t\t.style('margin-top', '4px') // poor fix for the svg to appear in middle of <td> vertically\n\t\t.attr('width', 2 * (c.xpadding ?? 0) + (c.axisWidth ?? 0))\n\t\t.attr('height', height)\n\t\t.append('rect')\n\t\t.attr('data-testid', 'sjpp-table-barplot-item')\n\t\t.attr('x', x1)\n\t\t.attr('y', 0)\n\t\t.attr('width', Math.max(1, x2 - x1)) // avoid bar width of fraction of pixel\n\t\t.attr('height', height)\n\t\t.attr('fill', color)\n}\n", "import * as rx from '../rx'\nimport { select } from 'd3-selection'\nimport { Menu } from '../dom/menu'\nimport { renderTable } from '../dom/table'\nimport { isNumericTerm, isCategoricalTerm, dtTermTypes } from '#shared/terms.js'\n\n/*\n********************** EXPORTED\nTVSInit()\nshowTvsMenu()\n********************** INTERNAL\nsetRenderers(self)\n\tupdateUI()\n\tenterPill()\n\tupdatePill()\n\texitPill()\n\tshowMenu()\n\tmakeValueTable()\n\tremoveValueBtn()\nsetInteractivity()\naddExcludeCheckbox()\n*/\n\nclass TVS {\n\tconstructor(opts) {\n\t\tthis.opts = this.validateOpts(opts)\n\t\tthis.dom = { holder: opts.holder, tip: new Menu({ padding: '5px' }) }\n\t\tthis.durations = { exit: 0 }\n\n\t\tsetInteractivity(this)\n\t\tsetRenderers(this)\n\t\tthis.categoryData = {}\n\t\tthis.handlerByType = {}\n\t\tthis.api = {\n\t\t\tmain: this.main.bind(this),\n\t\t\tshowMenu: this.showMenu\n\t\t}\n\t}\n\n\tvalidateOpts(o) {\n\t\tif (!o.holder) throw '.holder missing'\n\t\tif (!o.vocabApi) throw '.vocabApi missing'\n\t\tif (typeof o.callback != 'function') throw '.callback() is not a function'\n\t\treturn o\n\t}\n\n\tasync main(data = {}) {\n\t\tthis.tvs = data.tvs\n\t\tthis.filter = data.filter\n\t\tawait this.setHandler()\n\t\tawait this.updateUI()\n\t\t// when there are filters to be removed, must account for the delayed\n\t\t// removal after opacity transition, as btn count will decrease only\n\t\t// after the transition and remove() is done\n\t\t//\n\t\t// !!! TODO: how to pass bus.emit('postRender') delay to rx.component.api.update()\n\t\t// this.bus.emit('postRender', null, filters.exit().size() ? this.durations.exit + 100 : 0)\n\t}\n\n\tasync setHandler() {\n\t\tif (!this.tvs || !this.tvs.term) return\n\t\tconst term = this.tvs.term\n\t\tconst type = isNumericTerm(term)\n\t\t\t? 'numeric'\n\t\t\t: isCategoricalTerm(term)\n\t\t\t? 'categorical'\n\t\t\t: term.type == 'dtcnv'\n\t\t\t? this.getDtCnvType(term)\n\t\t\t: term.type\n\t\tif (!this.handlerByType[type]) {\n\t\t\ttry {\n\t\t\t\tconst _ = await import(`./tvs.${type}.js`)\n\t\t\t\tconst handler = _.handler\n\t\t\t\tthis.handlerByType[type] = handler\n\t\t\t} catch (e) {\n\t\t\t\tthrow `error with handler='./tvs.${type}.js': ${e}`\n\t\t\t}\n\t\t}\n\t\tthis.handler = this.handlerByType[type]\n\t}\n\n\tgetDtCnvType(term) {\n\t\t// determine dtcnv type by whether cnv data is continuous or categorical\n\t\tif (term.type != 'dtcnv') return\n\t\tconst termdbConfig = this.opts.vocabApi.termdbConfig || this.opts.vocabApi.parent_termdbConfig\n\t\tconst cnv = termdbConfig.queries?.cnv\n\t\tif (!cnv) throw 'cnv query is missing'\n\t\tconst keys = Object.keys(cnv)\n\t\tconst mode = keys.includes('cnvGainCutoff') || keys.includes('cnvLossCutoff') ? 'continuous' : 'categorical'\n\t\treturn term.type + '.' + mode\n\t}\n}\n\nexport const TVSInit = rx.getInitFxn(TVS)\n\nfunction setRenderers(self) {\n\tself.updateUI = function () {\n\t\tconst terms_div = self.dom.holder\n\t\t/*\n\t\t\tCurrently, only a single pill per tvs is rendered, so using the \n\t\t\tarray [self.tvs] may seem unnecessary. However, using the\n\t\t\tenter/update/exit pattern helps with coding consistency across components,\n\t\t\tand more clearly indicates whether the whole pill is replaced\n\t\t\tor if only its values are updated.\n\t\t*/\n\t\tconst filters = terms_div.selectAll('.tvs_pill').data([self.tvs], tvs => tvs?.term.id)\n\t\tfilters.exit().each(self.exitPill)\n\t\tfilters.each(self.updatePill)\n\t\tfilters\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('class', 'tvs_pill')\n\t\t\t.style('white-space', 'nowrap')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.transition()\n\t\t\t.duration(200)\n\t\t\t.each(self.enterPill)\n\t}\n\n\tself.enterPill = async function () {\n\t\tconst one_term_div = select(this).style('font-size', '.9em')\n\n\t\t//term name div\n\t\tone_term_div\n\t\t\t.append('div')\n\t\t\t.attr('class', 'term_name_btn sja_filter_tag_btn')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('border-radius', '6px 0 0 6px')\n\t\t\t.style('padding', '6px 6px 3px 6px')\n\t\t\t.html(self.handler.term_name_gen)\n\t\t\t.style('text-transform', 'uppercase')\n\n\t\t// negate button\n\t\tone_term_div\n\t\t\t.append('div')\n\t\t\t.attr('class', 'negate_btn')\n\t\t\t.style('cursor', 'default')\n\t\t\t//.style('display', 'inline-block' : 'none')\n\t\t\t.style('padding', '6px 6px 3px 6px')\n\t\t\t.style('background', self.tvs.isnot ? '#f4cccc' : '#a2c4c9')\n\t\t\t.html(\n\t\t\t\tself.handler.getNegateText?.(self) || (self.tvs.isnot && self.tvs.term.type !== 'geneVariant' ? 'NOT' : 'IS')\n\t\t\t)\n\n\t\tself.updatePill.call(this)\n\t}\n\n\t// optional _holder, for example when called by filter.js\n\tself.showMenu = _holder => {\n\t\tconst holder = _holder ? _holder : self.dom.tip\n\t\tif (self.tvs.term.type != 'geneVariant' && !(self.tvs.term.type == 'dtcnv' && self.tvs.continuousCnv)) {\n\t\t\taddExcludeCheckbox(holder, self.tvs, self)\n\t\t}\n\t\tself.handler.fillMenu(self, holder, self.tvs)\n\t}\n\n\tself.updatePill = async function () {\n\t\tconst one_term_div = select(this)\n\t\tconst tvs = one_term_div.datum()\n\t\tconst lstlen =\n\t\t\t(self.tvs.values && self.tvs.values.length) ||\n\t\t\t(self.tvs.ranges && self.tvs.ranges.length) ||\n\t\t\tself.tvs.term.type == 'samplelst' ||\n\t\t\tdtTermTypes.has(self.tvs.term.type)\n\n\t\t// update the main label\n\t\tone_term_div.select('.term_name_btn').html(self.handler.term_name_gen)\n\t\t// negate button\n\t\tone_term_div\n\t\t\t.select('.negate_btn')\n\t\t\t.style('display', lstlen ? 'inline-block' : 'none')\n\t\t\t.style('background', self.tvs.isnot ? '#f4cccc' : '#a2c4c9')\n\t\t\t.html(self.handler.getNegateText?.(self) || (tvs.isnot && tvs.term.type !== 'geneVariant' ? 'NOT' : 'IS'))\n\n\t\tconst label = self.handler.get_pill_label(tvs)\n\t\tif (!('grade_type' in label)) label.grade_type = ''\n\n\t\tconst value_btns = one_term_div.selectAll('.value_btn').data(label ? [label] : [], d => d.txt + d.grade_type)\n\n\t\tvalue_btns.exit().each(self.removeValueBtn)\n\n\t\tvalue_btns\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('class', 'value_btn sja_filter_tag_btn')\n\t\t\t.style('display', lstlen ? 'inline-block' : 'none')\n\t\t\t.style('padding', '6px 6px 3px 6px')\n\t\t\t.style('border-radius', '0 6px 6px 0')\n\t\t\t.style('font-style', 'italic')\n\t\t\t.html(d => d.txt)\n\t\t\t.append('div')\n\t\t\t.attr('class', 'grade_type_btn')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin', '0 5px')\n\t\t\t.style('font-size', '.6em')\n\t\t\t.style('text-transform', 'uppercase')\n\t\t\t.html(d => d.grade_type)\n\t\t\t.style('opacity', 0)\n\t\t\t.transition()\n\t\t\t.duration(200)\n\t\t\t.style('opacity', 1)\n\t}\n\n\tself.exitPill = async function (term) {\n\t\tselect(this).style('opacity', 1).transition().duration(self.durations.exit).style('opacity', 0).remove()\n\t}\n\n\tself.makeValueTable = function (div, tvs, values, callback) {\n\t\tif (values?.length == 0) return div\n\t\tconst containerDiv = div.append('div').style('font-size', '0.8rem')\n\n\t\tconst tableDiv = containerDiv.append('div')\n\t\t// add barchart bar_width for values\n\t\tconst maxCount = Math.max(...values.map(v => v.samplecount), 0)\n\t\tvalues.forEach(v => (v.bar_width_frac = Number((1 - (maxCount - v.samplecount) / maxCount).toFixed(4))))\n\n\t\tconst maxBarWidth = 100\n\t\tconst rows = []\n\t\tconst selectedIdxs = []\n\t\tfor (const [i, value] of values.entries()) {\n\t\t\tlet label = value.label || value.key\n\t\t\tif (value.samplecount) label += ' (n=' + value.samplecount + ')'\n\t\t\tconst barWidth = maxBarWidth * value.bar_width_frac\n\t\t\tconst bar_td = `<div style='margin:1px 10px;width:${barWidth}px;height:15px;background-color:#ddd'>`\n\t\t\trows.push([{ value: label }, { html: bar_td }])\n\t\t\tlet checked = false\n\t\t\tif (tvs.term.type == 'categorical' || tvs.term.type == 'survival' || dtTermTypes.has(tvs.term.type))\n\t\t\t\tchecked = tvs.values.find(a => a.key === value.key)\n\t\t\telse if (tvs.term.type == 'float' || tvs.term.type == 'integer')\n\t\t\t\tchecked = tvs.ranges.find(a => String(a.value) === value.value.toString())\n\t\t\telse if (tvs.term.type == 'condition') checked = tvs.values.find(a => String(a.key) === String(value.key))\n\t\t\tif (checked) selectedIdxs.push(i)\n\t\t}\n\t\tconst columns = [{ label: 'tvs' }, { label: 'bar' }]\n\t\tconst applybt = {\n\t\t\ttext: 'APPLY',\n\t\t\tclass: 'sjpp_apply_btn sja_filter_tag_btn',\n\t\t\tcallback: indexes => {\n\t\t\t\tif (callback) callback(indexes)\n\t\t\t}\n\t\t}\n\n\t\tself.tableApi = renderTable({\n\t\t\trows,\n\t\t\tcolumns,\n\t\t\tdiv: tableDiv,\n\t\t\tmaxWidth: '40vw',\n\t\t\tmaxHeight: '40vh',\n\t\t\tbuttons: [applybt],\n\t\t\tshowHeader: false,\n\t\t\tstriped: false,\n\t\t\tshowLines: false,\n\t\t\tselectedRows: selectedIdxs,\n\t\t\tnoAutoScroll: true,\n\t\t\tselectedRowStyle: {\n\t\t\t\t'text-decoration': tvs.isnot ? 'line-through' : ''\n\t\t\t}\n\t\t})\n\n\t\treturn tableDiv\n\t}\n\n\tself.removeValueBtn = function (d, j) {\n\t\tconst one_term_div = select(this.parentNode)\n\t\tconst tvs = one_term_div.datum()\n\t\tconst select_remove_pos = self.handler.getSelectRemovePos(j, tvs)\n\n\t\tselect(one_term_div.selectAll('.value_select')._groups[0][select_remove_pos]).remove()\n\t\tselect(one_term_div.selectAll('.or_btn')._groups[0][j]).remove()\n\t\tselect(this).style('opacity', 1).transition().duration(self.durations.exit).style('opacity', 0).remove()\n\t}\n}\n\nfunction setInteractivity(self) {\n\t// optional event handlers\n}\n\n// opts is the same argument for the TVS constructor()\nexport async function showTvsMenu(opts) {\n\tconst self = new TVS(opts)\n\tself.tvs = {\n\t\tterm: opts.term\n\t}\n\tself.filter = opts.filter\n\t//addExcludeCheckbox(opts.holder, self.tvs)\n\n\tconst loadingDiv = opts.holder.append('div').style('padding', '10px').text('Loading ...')\n\n\ttry {\n\t\tawait self.setHandler()\n\t\tif (self.handler.setTvsDefaults) self.handler.setTvsDefaults(self.tvs)\n\t\tawait self.handler.fillMenu(self, opts.holder, self.tvs)\n\t\tloadingDiv.remove()\n\t} catch (e) {\n\t\tloadingDiv.text('Error: ' + (e.message || e))\n\t\tif (e.stack) console.log(e)\n\t}\n}\n\nfunction addExcludeCheckbox(holder, tvs, self) {\n\tconst isNotLabels = holder\n\t\t.selectAll('label')\n\t\t.data([{ label: 'Exclude', value: 'false', checked: tvs.isnot !== undefined ? tvs.isnot : false }])\n\t\t.enter()\n\t\t.append('label')\n\t\t.style('margin', '0 5px')\n\tconst isNotInput = isNotLabels\n\t\t.append('input')\n\t\t.attr('type', 'checkbox')\n\t\t.attr('name', 'sja_filter_isnot_input')\n\t\t.attr('value', d => d.value)\n\t\t.property('checked', d => d.checked)\n\t\t.style('vertical-align', 'top')\n\t\t.style('margin-right', '3px')\n\t\t.on('change', () => {\n\t\t\ttvs.isnot = isNotInput.node().checked\n\n\t\t\tif (self.tableApi) {\n\t\t\t\tself.tableApi.update({\n\t\t\t\t\tselectedRowStyle: {\n\t\t\t\t\t\t'text-decoration': tvs.isnot ? 'line-through' : ''\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\tisNotLabels\n\t\t.append('span')\n\t\t.style('margin-right', '5px')\n\t\t.style('vertical-align', 'top')\n\t\t.html(d => d.label)\n}\n", "/***********************\n Utilities\n*************************/\n\nimport { getWrappedTvslst } from '#shared/filter.js'\nexport { getWrappedTvslst } from '#shared/filter.js'\n\n// find the first filter item that has a matching term.id\nexport function findItemByTermId(item, id) {\n\tif (item.type === 'tvs' && item.tvs.term.id === id) return item\n\tif (item.type !== 'tvslst') return\n\tfor (const subitem of item.lst) {\n\t\tconst matchingItem = findItemByTermId(subitem, id)\n\t\tif (matchingItem) return matchingItem\n\t}\n}\n\n// find filter item by the sequential $id\n// assigned at the time of adding a filter entry\nexport function findItem(item, $id) {\n\tif (item.$id === $id) return item\n\tif (item.type !== 'tvslst') return\n\tfor (const subitem of item.lst) {\n\t\tconst matchingItem = findItem(subitem, $id)\n\t\tif (matchingItem) return matchingItem\n\t}\n}\n\nexport function findParent(parent, $id) {\n\tif (parent.$id === $id) return parent\n\tif (!parent.lst) return\n\tfor (const item of parent.lst) {\n\t\tif (item.$id === $id) return parent\n\t\telse if (item.type == 'tvslst') {\n\t\t\tconst matchingParent = findParent(item, $id)\n\t\t\tif (matchingParent) return matchingParent\n\t\t}\n\t}\n}\n\nexport function getFilterItemByTag(item, tag) {\n\tif (item?.tag === tag) return item\n\tif (item?.type !== 'tvslst') return\n\tfor (const subitem of item.lst) {\n\t\tconst matchingItem = getFilterItemByTag(subitem, tag)\n\t\tif (matchingItem) return matchingItem\n\t}\n}\n\nexport function excludeFilterByTag(filter, tag) {\n\tif (!filter) return getNormalRoot(filter)\n\tif (!filter?.lst) return filter\n\tfor (const [i, f] of filter.lst.entries()) {\n\t\tif (f.tag === tag) {\n\t\t\tfilter.lst.splice(i, 1)\n\t\t\tbreak\n\t\t} else if (f.lst) {\n\t\t\texcludeFilterByTag(f, tag)\n\t\t}\n\t}\n\treturn getNormalRoot(filter)\n}\n\n/*\n\tget valid filter data to be used for server requests\n\twill use normalizeFilter recursively as needed\n\n\t.filter{} the raw filter root\n*/\nexport function getNormalRoot(rawFilter) {\n\tif (!rawFilter) return getWrappedTvslst([])\n\t// create a copy, as needed, to not modify the original\n\tconst encoded = typeof rawFilter == 'string' ? rawFilter : JSON.stringify(rawFilter)\n\tconst filter = JSON.parse(encoded)\n\tconst processedFilter = normalizeFilter(filter)\n\treturn processedFilter.type == 'tvslst' ? processedFilter : getWrappedTvslst([processedFilter])\n}\n\n/* \n\tPotentially\n\t- restructure the filter data in a shape \n\tallowed by the server, such as by\n removing an empty tvslst or converting a \n\tsingle-entry tvslst into a tvs\n\t- also will remove unnecessary filter properties\n\tvia normalizeProps()\n\n\t.filter{} the raw filter root or a subnested filter\n*/\nfunction normalizeFilter(filter) {\n\tif (typeof filter != 'object') throw `filter must be an object`\n\tdelete filter.$id\n\tdelete filter.tag\n\tif (filter.tyoe == 'tvs') return filter\n\tif (filter.type != 'tvslst') throw `filter.type must be either 'tvslst' or 'tvs'`\n\n\tconst lst = filter.lst\n\t\t// keep non-tvslst entries or tvslst with non-empty lst.length\n\t\t.filter(f => f.type !== 'tvslst' || f.lst.length > 0)\n\t\t// do not reformat an entry unless it is a tvslst with only one entry,\n\t\t// in which case just return that filter's first lst entry and negated as needed,\n\t\t// instead of returning the filter itself\n\t\t.map(f => {\n\t\t\tif (f.type !== 'tvslst' || f.lst.length > 1) return f\n\t\t\t// f.in defaults to true if missing, negation requires a strict boolean false\n\t\t\tif (f.in !== false) return f.lst[0]\n\t\t\tif (f.lst[0].type !== 'tvs') throw `unable to handle filter entry type='${f.lst[0].type}'`\n\t\t\tif (!f.lst[0].tvs) throw `missing filter entry tvs`\n\t\t\t// handle a single-entry tvslst where filter.in != true, which is not created from the filter UI,\n\t\t\t// but may be created internally by non-UI code, so need to support under the hood\n\t\t\tf.lst[0].tvs.isnot = !f.lst[0].tvs.isnot\n\t\t\t// return the single entry after applying the tvslst negation to the tvs itself\n\t\t\treturn f.lst[0]\n\t\t})\n\n\tlst.forEach(normalizeProps)\n\n\tif (!lst.length) {\n\t\t// return a default empty filter = {type: 'tvslst', lst:[], ...}\n\t\treturn getWrappedTvslst([], '', filter.$id)\n\t} else if (lst.length == 1) {\n\t\t// return the only lst entry after normalizing\n\t\tif (lst[0].type === 'tvslst') {\n\t\t\treturn normalizeFilter(lst[0])\n\t\t} else {\n\t\t\treturn normalizeProps(lst[0])\n\t\t}\n\t} else {\n\t\t// reset and fill-in filter.lst with normalized entries\n\t\tfilter.lst = []\n\t\tfor (const item of lst) {\n\t\t\tif (item.type === 'tvslst') {\n\t\t\t\tconst normalItem = normalizeFilter(item)\n\t\t\t\tif (normalItem.type !== 'tvslst' || normalItem.join != filter.join || normalItem.in != filter.in) {\n\t\t\t\t\tfilter.lst.push(normalItem)\n\t\t\t\t} else if (normalItem.lst.length) {\n\t\t\t\t\t// can flatten and level up the subnested filter.lst items with matching join, in\n\t\t\t\t\tfilter.lst.push(...normalItem.lst)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfilter.lst.push(item)\n\t\t\t}\n\t\t}\n\t\treturn filter\n\t}\n}\n\n/*\n\twill remove unnecessary filter properties\n\tthat are not expected in a server request\n\n\t.filter{} the raw filter root or a subnested filter\n*/\nexport function normalizeProps(filter, callback = null) {\n\tdelete filter.$id\n\tif (typeof callback == 'function') callback(filter)\n\tif (filter.type == 'tvslst') {\n\t\tfor (const item of filter.lst) {\n\t\t\tnormalizeProps(item, callback)\n\t\t}\n\t}\n\treturn filter\n}\n\n/* join a list of filters into the first filter with \"and\", return joined filter\nto be used by caller app to join hidden filters into a visible filter\n\nlst:[]\n a list of filters\n the function returns a (modified) copy of the first filter, and will not modify it\n rest of the array will be joined to the first one under \"and\"\n*/\nexport function filterJoin(lst) {\n\tif (!Array.isArray(lst)) throw 'filterJoin() arg is not array'\n\tif (!lst[0]) return\n\tlet f = JSON.parse(JSON.stringify(lst[0]))\n\tif (lst.length == 1) return getNormalRoot(f) // TODO: are there cases where non-normalize shape is needed from filterJoin()?\n\t// more than 1 item, will join\n\tif (f.lst.length < 2) {\n\t\tif (f.join !== '') throw 'filter.join must be an empty string \"\" when filter.lst.length < 2'\n\t\tf.join = 'and'\n\t} else if (f.join == 'or') {\n\t\t// f is \"or\", wrap it with another root layer of \"and\"\n\t\tf = {\n\t\t\ttype: 'tvslst',\n\t\t\tjoin: 'and',\n\t\t\tin: true,\n\t\t\tlst: [f]\n\t\t}\n\t} else if (f.join != 'and') {\n\t\tthrow 'filter.join must be either \"and\" or \"or\" when .lst length > 1'\n\t}\n\t// now, f.join should be \"and\"\n\t// if the argument lst[0].join == \"and\",\n\t// then the f.in boolean value is reused\n\tfor (let i = 1; i < lst.length; i++) {\n\t\tconst f2 = JSON.parse(JSON.stringify(lst[i]))\n\t\tif (f2.join == 'or') f.lst.push(f2)\n\t\telse f.lst.push(...f2.lst)\n\t}\n\t// if f ends up single-tvs item (from joining single tvs to empty filter), need to set join to '' per filter spec\n\tif (f.lst.length == 1 && f.lst[0].type == 'tvs') {\n\t\tf.join = ''\n\t}\n\treturn getNormalRoot(f) // TODO: are there cases where non-normalize shape is needed from filterJoin()?\n}\n\n/* make copy of input filter, return negated copy\nif tag=filterUiRoot is found, negate that;\nelse, assume is tvslst of single tvs an negate at tvs level\n\nallow other tags for future use\n*/\nexport function negateFilter(f0, tag = 'filterUiRoot') {\n\tconst f = structuredClone(f0)\n\tconst fui = getFilterItemByTag(f, tag)\n\tif (fui) {\n\t\tif (typeof fui.in != 'boolean') throw 'filterUiRoot f.in is not boolean'\n\t\tfui.in = !fui.in\n\t\treturn f\n\t}\n\t// tag not found, try root\n\n\tif (f.lst?.length == 1 && f.lst[0].type == 'tvs' && typeof f.lst[0].tvs == 'object') {\n\t\t// is a tvslst containing a single tvs. negate at tvs level\n\t\tf.lst[0].tvs.isnot = !f.lst[0].tvs.isnot\n\t\treturn f\n\t}\n\tif (f.lst?.length > 1 && typeof f.in == 'boolean') {\n\t\t// is a tvslst with multiple tvs. maybe from a subfilter nested somewhere\n\t\tf.in = !f.in\n\t\treturn f\n\t}\n\tthrow 'cannot negate filter'\n}\n\nexport function getCombinedTermFilter(appState, filter) {\n\tif (!filter) return appState.termfilter\n\tlet _filter = filter\n\tif (appState.termfilter.filter) _filter = filterJoin([appState.termfilter.filter, filter])\n\treturn { filter: _filter, filter0: appState.termfilter.filter0 }\n}\n\n/*\nThis function is used where ever you need to build a group of categorical filters related.\n It builds the filter needed to retrieve a term values after filtering out samples according to the other filters provided.\n The profile filters, for example, use this function to get the filters needed to call filterTermValues, that populate the dropdowns in the controls.\n If no tw is provided it returns a filter that is the combination of all the categorical filters provided in the filterTWs array.\n Input:\n - filterTWs: list of term wrappers (tw) that are used to filter the samples\n - values: an object with term ids as keys and the values to filter by\n - excludedTw: The term wrapper for which the filter is being built. If provided, it will be excluded from the filter.\n Output:\n - a filter object that can be used to filter term values based on the provided term wrappers and values.\n\nNOTE: Consumer code should submit the global filter in the request payload, so that the server code\n can combine it with each of the generated filter here.\n*/\nexport function getCategoricalTermFilter(filterTWs, values, excludedTw) {\n\tconst lst = []\n\tfor (const tw of filterTWs) {\n\t\tif (excludedTw && tw.id === excludedTw.id) continue\n\t\tprocessTW(tw, values, lst)\n\t}\n\t// returning null to represent empty filter value since\n\t// - tvslst filter bloats the payload and clutters the server log\n\t// - undefined value would be left out during JSON-encoding of an object-as-data\n\treturn {\n\t\ttype: 'tvslst',\n\t\tin: true,\n\t\tjoin: lst.length > 1 ? 'and' : '',\n\t\tlst\n\t}\n}\n\nfunction processTW(tw, values, lst) {\n\tconst value = values[tw.term.id]\n\tif (value) {\n\t\tif (Array.isArray(value)) {\n\t\t\tconst tvs = {\n\t\t\t\ttype: 'tvs',\n\t\t\t\ttvs: {\n\t\t\t\t\tterm: tw.term,\n\t\t\t\t\tvalues: []\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (const item of value) if (item) tvs.tvs.values.push({ key: item })\n\t\t\tif (tvs.tvs.values.length) lst.push(tvs)\n\t\t} else\n\t\t\tlst.push({\n\t\t\t\ttype: 'tvs',\n\t\t\t\ttvs: {\n\t\t\t\t\tterm: tw.term,\n\t\t\t\t\tvalues: [{ key: value }]\n\t\t\t\t}\n\t\t\t})\n\t}\n}\n", "import { select } from 'd3-selection'\nimport { TVSInit } from './tvs'\nimport { findItem } from './filter.utils'\n\n// will assign an incremented index to each filter UI instance\n// to help namespace the body.on('click') event handler;\n// other click handlers are specific to the rendered\n// elements within instance.dom.holder, so no need for this index\nlet filterIndex = 0\n\nexport function setRenderers(self) {\n\tself.initUI = async function () {\n\t\tif (self.opts.newBtn) {\n\t\t\tself.opts.newBtn.on('click.filter', self.displayTreeNew)\n\t\t} else {\n\t\t\tself.dom.newBtn = self.dom.holder\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_new_filter_btn sja_menuoption')\n\t\t\t\t.html(self.opts.emptyLabel)\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.on('click', self.displayTreeNew)\n\t\t}\n\n\t\tself.dom.filterContainer = self.dom.holder.append('div').attr('class', 'sja_filter_container')\n\n\t\tself.dom.holder\n\t\t\t.selectAll('.sja_filter_add_transformer')\n\t\t\t.data(self.opts.joinWith)\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_filter_add_transformer')\n\t\t\t.style('display', d => (self.filter && self.filter.join != d ? 'inline-block' : 'none'))\n\t\t\t.style('margin-left', '10px')\n\t\t\t.style('padding', '5px')\n\t\t\t.style('border-radius', '5px')\n\t\t\t//.style('background-color', '#ececec')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html(d => '+' + d.toUpperCase())\n\t\t\t.on('click', self.displayTreeNew)\n\n\t\tself.dom.table = self.dom.controlsTip.clear().d.append('table').style('border-collapse', 'collapse')\n\n\t\tconst menuOptions = [\n\t\t\t{ action: 'edit', html: ['', 'Edit', '›'], handler: self.editTerm },\n\t\t\t{ action: 'join', html: ['✚', '', '›'], handler: self.displayTreeMenu },\n\t\t\t{ action: 'switch', html: ['', 'Switch to', ''], handler: self.switchJoin },\n\t\t\t{ action: 'negate', html: ['', 'Negate', ''], handler: self.negateClause },\n\t\t\t{ action: 'remove', html: ['✖', 'Remove', ''], handler: self.removeTransform }\n\t\t]\n\n\t\t// option to add a Replace option in the second row\n\t\tif (self.opts.vocab) {\n\t\t\tmenuOptions.splice(1, 0, {\n\t\t\t\taction: 'replace',\n\t\t\t\thtml: ['', 'Replace', '›'],\n\t\t\t\thandler: self.displayTreeMenu\n\t\t\t})\n\t\t}\n\n\t\tself.dom.table\n\t\t\t.selectAll('tr')\n\t\t\t.data(menuOptions)\n\t\t\t.enter()\n\t\t\t.append('tr')\n\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t.on('click', self.handleMenuOptionClick)\n\t\t\t.selectAll('td')\n\t\t\t.data(d => d.html)\n\t\t\t.enter()\n\t\t\t.append('td')\n\t\t\t.style('padding', '5px')\n\t\t\t.style('border-top', 'solid 1px white')\n\t\t\t.style('color', (d, i) => (d == '✖' ? '#a00' : i === 0 ? '#0a0' : '#111'))\n\t\t\t.style('opacity', (d, i) => (i === 0 ? 0.8 : 1))\n\t\t\t.html(d => d)\n\n\t\tself.dom.treeHead = self.dom.treeTip.d.append('div').attr('class', 'sja_tree_tip_head').style('padding', '3px')\n\t\tself.dom.termSrcDiv = self.dom.treeTip.d.append('div').attr('class', 'sja_term_src_body')\n\n\t\tself.dom.treeHeadTitle = self.dom.treeHead.append('div')\n\n\t\tselect('body').on('mousedown.sja_filter_' + filterIndex++, event => {\n\t\t\tif (\n\t\t\t\t[\n\t\t\t\t\t'sja_filter_join_label',\n\t\t\t\t\t'sja_filter_clause_negate',\n\t\t\t\t\t'sja_filter_paren_open',\n\t\t\t\t\t'sja_filter_paren_close'\n\t\t\t\t].includes(event.target.className)\n\t\t\t)\n\t\t\t\treturn\n\t\t\tself.dom.filterContainer?.selectAll('.sja_filter_grp').style('background-color', 'transparent')\n\t\t\tself.removeBlankPill()\n\t\t\tthis.dom.holder?.selectAll('.sja_filter_add_transformer').style('display', this.getAddTransformerBtnDisplay)\n\t\t})\n\t}\n\n\tself.updateUI = async function (container, filter) {\n\t\tcontainer.datum(filter).style('display', !filter.lst || !filter.lst.length ? 'none' : 'inline-block')\n\t\tconst pills = container\n\t\t\t.selectAll(':scope > .sja_filter_grp')\n\t\t\t.style('background-color', 'transparent')\n\t\t\t.data([filter], self.getId)\n\n\t\tpills.exit().each(self.removeGrp)\n\t\tpills.each(self.updateGrp)\n\t\tpills.enter().append('div').attr('class', 'sja_filter_grp').style('margin', '5px').each(self.addGrp)\n\n\t\tself.updatePromise(0)\n\t}\n\n\tself.addGrp = function (item, i) {\n\t\tconst filter = this.parentNode.__data__\n\n\t\tselect(this).style('display', 'inline-block')\n\n\t\tselect(this)\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_filter_clause_negate')\n\t\t\t.style('display', filter.in ? 'none' : 'inline-block')\n\t\t\t.style('color', 'rgb(102,0,0)')\n\t\t\t.style('font-weight', 500)\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html('NOT')\n\t\t\t.on('click', self.displayControlsMenu)\n\n\t\tselect(this)\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_filter_paren_open')\n\t\t\t.html('(')\n\t\t\t.style('display', 'none')\n\t\t\t.style('padding', '0 5px')\n\t\t\t.style('font-weight', 500)\n\t\t\t.style('font-size', '24px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.on('click', self.displayControlsMenu)\n\n\t\tconst data = item.type == 'tvslst' ? item.lst : [item]\n\t\tconst pills = select(this).selectAll(':scope > .sja_filter_item').data(data, self.getId)\n\t\tpills.enter().append('div').attr('class', 'sja_filter_item').each(self.addItem)\n\n\t\tif (self.opts.joinWith.length == 1) {\n\t\t\tself.dom.last_join_div = select(this)\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_filter_last_join')\n\t\t\t\t.style('display', 'inline')\n\t\t\tself.dom.last_join_label = self.dom.last_join_div\n\t\t\t\t.append('div')\n\t\t\t\t.datum({ action: 'join', html: ['✚', '', '›'], handler: self.displayTreeMenu })\n\t\t\t\t.attr('class', 'sja_filter_last_join_label')\n\t\t\t\t.style('padding', '0 5px')\n\t\t\t\t.style('display', filter.lst.length ? 'inline' : 'none')\n\t\t\t\t.style('font-weight', 500)\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.html('+' + self.opts.joinWith[0].toUpperCase())\n\t\t\t\t.on('click', self.showLastJoinBlank)\n\n\t\t\tselect('body').on('mousedown.sja_filter_last_join', () => {\n\t\t\t\tself.dom.last_join_label.style('display', 'inline')\n\t\t\t})\n\t\t}\n\t\tselect(this)\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_filter_paren_close')\n\t\t\t.style('padding', '0 5px')\n\t\t\t.html(')')\n\t\t\t.style('display', 'none')\n\t\t\t.style('font-weight', 500)\n\t\t\t.style('font-size', '24px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.on('click', self.displayControlsMenu)\n\n\t\tselect(this)\n\t\t\t.selectAll(':scope > .sja_filter_paren_open, :scope > .sja_filter_paren_close')\n\t\t\t.style(\n\t\t\t\t'display',\n\t\t\t\tself.opts.joinWith.length < 2 || data.length < 2\n\t\t\t\t\t? 'none'\n\t\t\t\t\t: !filter.in || (data.length > 1 && filter.tag != 'filterUiRoot')\n\t\t\t\t\t? 'inline-block'\n\t\t\t\t\t: 'none'\n\t\t\t)\n\t}\n\n\tself.updateGrp = function (item, i) {\n\t\tconst filter = this.parentNode.__data__\n\n\t\tselect(this)\n\t\t\t.select(':scope > .sja_filter_clause_negate')\n\t\t\t.style('display', filter.in ? 'none' : 'inline-block')\n\n\t\tconst data = item.type == 'tvslst' ? item.lst : [item]\n\n\t\tselect(this)\n\t\t\t.selectAll(':scope > .sja_filter_paren_open, :scope > .sja_filter_paren_close')\n\t\t\t.style(\n\t\t\t\t'display',\n\t\t\t\tself.opts.joinWith.length < 2 || data.length < 2\n\t\t\t\t\t? 'none'\n\t\t\t\t\t: !filter.in || (data.length > 1 && filter.tag != 'filterUiRoot')\n\t\t\t\t\t? 'inline-block'\n\t\t\t\t\t: 'none'\n\t\t\t)\n\n\t\tconst pills = select(this).selectAll(':scope > .sja_filter_item').data(data, self.getId)\n\n\t\tpills.exit().each(self.removeItem)\n\t\tpills.each(self.updateItem)\n\t\tpills.enter().insert('div', ':scope > .sja_filter_paren_close').attr('class', 'sja_filter_item').each(self.addItem)\n\n\t\tselect(this)\n\t\t\t.selectAll(':scope > .sja_filter_item')\n\t\t\t.sort((a, b) => data.indexOf(a) - data.indexOf(b))\n\n\t\tif (self.dom.last_join_label) {\n\t\t\tself.dom.last_join_div.datum(filter)\n\t\t\tthis.insertBefore(self.dom.last_join_div.node(), select(this).select(':scope > .sja_filter_paren_close').node())\n\t\t\tself.dom.last_join_label.style('display', 'inline')\n\t\t}\n\t}\n\n\tself.removeGrp = function (item) {\n\t\tself.numExpectedItems += 1\n\t\tif (item.type == 'tvslst') {\n\t\t\tfor (const subitem of item.lst) {\n\t\t\t\tif (subitem.lst) self.removeGrp(subitem)\n\t\t\t\telse {\n\t\t\t\t\tdelete self.pills[subitem.$id]\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tdelete self.pills[item.$id]\n\t\t}\n\t\tif (this instanceof Node) {\n\t\t\tselect(this).selectAll('*').on('click', null)\n\t\t\tselect(this).on('click', null).remove()\n\t\t}\n\t\tself.updatePromise()\n\t}\n\n\tself.addItem = async function (item, i) {\n\t\tconst filter = this.parentNode.__data__\n\n\t\tif (item.type == 'tvslst') {\n\t\t\tself.updateUI(select(this), item)\n\t\t\tself.addJoinLabel(this, filter, item)\n\t\t\treturn\n\t\t}\n\n\t\tself.numExpectedItems += 1\n\n\t\t// holder for blue pill\n\t\tconst holder = select(this)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('position', 'relative')\n\t\t\t.style('white-space', 'nowrap')\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_pill_wrapper')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin', self.opts.joinWith.length > 1 ? '' : '2px')\n\t\t\t.on('click', item.renderAs === 'htmlSelect' ? null : self.displayControlsMenu)\n\n\t\tself.addJoinLabel(this, filter, item)\n\t\tif (item.renderAs == 'htmlSelect') {\n\t\t\tconst values = getValuesForHtmlSelect(self, item)\n\t\t\tconst selectElem = holder.append('select').on('change', function () {\n\t\t\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\t\t\tconst filterCopy = findItem(filterUiRoot, filter.$id)\n\t\t\t\tconst i = filter.lst.indexOf(item)\n\t\t\t\tif (i == -1) return\n\t\t\t\tconst index = +this.value\n\t\t\t\tconst itemCopy = JSON.parse(JSON.stringify(item))\n\t\t\t\tconst keys = 'keys' in values[index] ? values[index].keys : [values[index].key]\n\t\t\t\titemCopy.tvs.values = keys.map(key => {\n\t\t\t\t\treturn { key, label: key } //may be missing list if term type is samplelst\n\t\t\t\t})\n\t\t\t\tfilterCopy.lst[i] = itemCopy\n\t\t\t\tself.refresh(filterUiRoot)\n\t\t\t})\n\n\t\t\tconst defaultVal = getDefaultValueForHtmlSelect(self, item)\n\t\t\tselectElem\n\t\t\t\t.selectAll('option')\n\t\t\t\t.data(values)\n\t\t\t\t.enter()\n\t\t\t\t.append('option')\n\t\t\t\t.property('value', (d, i) => i)\n\t\t\t\t.property('selected', (d, i) => i == defaultVal)\n\t\t\t\t.html(d => (d.shortLabel ? d.shortLabel : d.label ? d.label : d.key))\n\t\t} else {\n\t\t\tconst pill = await TVSInit({\n\t\t\t\tvocabApi: self.vocabApi,\n\t\t\t\tholder,\n\t\t\t\tdebug: self.opts.debug,\n\t\t\t\tgetCategoriesArguments: self.opts.getCategoriesArguments,\n\t\t\t\tcallback: tvs => {\n\t\t\t\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\t\t\t\tconst filterCopy = findItem(filterUiRoot, filter.$id)\n\t\t\t\t\tconst i = filter.lst.indexOf(item)\n\t\t\t\t\tif (i == -1) return\n\t\t\t\t\t// if tvs already present in the filterCopy just replace it rather than adding new one\n\t\t\t\t\tconst item_i = filterCopy.lst.findIndex(t => t.$id == item.$id)\n\t\t\t\t\tif (item_i == -1) filterCopy.lst[i] = { $id: item.$id, type: 'tvs', tvs }\n\t\t\t\t\telse filterCopy.lst[item_i].tvs = tvs\n\t\t\t\t\tself.refresh(filterUiRoot)\n\t\t\t\t}\n\t\t\t})\n\t\t\tself.pills[item.$id] = pill\n\t\t\tawait pill.main({ tvs: item.tvs, filter: self.getFilterExcludingPill(item.$id) })\n\t\t}\n\t\tself.updatePromise()\n\t}\n\n\tself.updateItem = async function (item, i) {\n\t\tconst filter = this.parentNode.__data__\n\t\tselect(this)\n\t\t\t.select(':scope > .sja_filter_join_label')\n\t\t\t.style(\n\t\t\t\t'display',\n\t\t\t\tself.opts.joinWith.length > 1 && filter.lst.indexOf(item) < filter.lst.length - 1 ? 'inline-block' : 'none'\n\t\t\t)\n\t\t\t.style('margin', self.opts.joinWith.length > 1 ? '' : '2px')\n\t\t\t.html(filter.join == 'and' ? 'AND' : 'OR')\n\n\t\tif (item.type == 'tvslst') {\n\t\t\tself.updateUI(select(this), item)\n\t\t} else if (item.renderAs === 'htmlSelect') {\n\t\t\tself.numExpectedItems += 1\n\t\t\tselect(this)\n\t\t\t\t.select('select')\n\t\t\t\t.property('value', '' + getDefaultValueForHtmlSelect(self, item))\n\t\t} else {\n\t\t\tif (!self.pills[item.$id]) return\n\t\t\tself.numExpectedItems += 1\n\t\t\tawait self.pills[item.$id].main({ tvs: item.tvs, filter: self.getFilterExcludingPill(item.$id) })\n\t\t}\n\t\tself.updatePromise()\n\t}\n\n\tself.removeItem = function (item) {\n\t\tdelete self.pills[item.$id]\n\t\tselect(this).on('click', null).remove()\n\t}\n\n\tself.addJoinLabel = function (elem, filter, item) {\n\t\tconst i = filter.lst.findIndex(d => d.$id === item.$id)\n\t\tselect(elem)\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_filter_join_label')\n\t\t\t.style(\n\t\t\t\t'display',\n\t\t\t\tself.opts.joinWith.length > 1 && filter.lst.length > 1 && item && i != -1 && i < filter.lst.length - 1\n\t\t\t\t\t? 'inline-block'\n\t\t\t\t\t: 'none'\n\t\t\t)\n\t\t\t.style('width', '50px')\n\t\t\t.style('padding', '5px')\n\t\t\t.style('border', 'none')\n\t\t\t.style('border-radius', '5px')\n\t\t\t.style('text-align', 'center')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.html(filter.lst.length < 2 ? '' : filter.join == 'and' ? 'AND' : 'OR')\n\t\t\t.on('click', self.displayControlsMenu)\n\t}\n\n\tself.updateJoinLabel = function (item) {\n\t\tconst filter = this.parentNode.parentNode.parentNode.__data__\n\t\tconst i = filter.lst.findIndex(d => d.$id === item.$id)\n\t\tselect(this).style(\n\t\t\t'display',\n\t\t\tself.opts.joinWith.length > 1 && filter.lst.length > 1 && item && i != -1 && i < filter.lst.length - 1\n\t\t\t\t? 'inline-block'\n\t\t\t\t: 'none'\n\t\t)\n\t}\n\n\tself.getAddTransformerBtnDisplay = function (d) {\n\t\tif (self.opts.joinWith.length < 2) {\n\t\t\treturn 'none'\n\t\t} else if (self.filter && self.filter.lst.find(f => f.tag === 'cohortFilter')) {\n\t\t\t// assume that a cohortFilter is always joined via intersection with other filters\n\t\t\treturn self.filter.lst.length == 1 && d == 'and' ? 'inline-block' : 'none'\n\t\t} else {\n\t\t\treturn self.filter && self.filter.lst.length > 0 && (self.filter.join !== d || !self.filter.in)\n\t\t\t\t? 'inline-block'\n\t\t\t\t: 'none'\n\t\t}\n\t}\n}\n\nfunction getValuesForHtmlSelect(self, item) {\n\treturn item.selectOptionsFrom == 'selectCohort'\n\t\t? self.opts.termdbConfig.selectCohort.values\n\t\t: Array.isArray(item.tvs.term.values)\n\t\t? item.tvs.term.values\n\t\t: Object.values(item.tvs.term.values)\n}\n\nfunction getDefaultValueForHtmlSelect(self, item) {\n\tconst values = getValuesForHtmlSelect(self, item)\n\tconst defaultKey = JSON.stringify(item.tvs.values.map(o => o.key).sort())\n\tconst i = values.findIndex(d => (d.keys ? defaultKey === JSON.stringify(d.keys.sort()) : d.key === defaultKey))\n\treturn i\n}\n", "import { select } from 'd3-selection'\nimport { findItem, findParent, getWrappedTvslst } from './filter.utils'\n\nconst MENU_OPTION_HIGHLIGHT_COLOR = '#fff'\n\nexport function setInteractivity(self) {\n\tself.displayControlsMenu = function (event) {\n\t\tevent.stopPropagation() // in mass/group ui, to prevent pill-clicking to check/uncheck table rows\n\n\t\tif (!self.activeData) return\n\t\tconst item = this.parentNode.__data__\n\t\tconst filter = findParent(self.filter, item.$id)\n\t\tself.activeData = { item, filter, elem: this }\n\t\tself.removeBlankPill()\n\t\tself.resetGrpHighlights(this, filter)\n\n\t\t// disabled for now as it breaks CI\n\t\tif (item.noEdit)\n\t\t\tself.dom.table\n\t\t\t\t.selectAll('tr')\n\t\t\t\t.filter(d => d.action == 'edit')\n\t\t\t\t.style('display', 'none')\n\n\t\tself.dom.controlsTip.showunder(this)\n\t}\n\n\tself.resetGrpHighlights = function (elem, filter) {\n\t\tconst cls = elem.className\n\t\tconst grpAction = cls.includes('join') || cls.includes('negate') || cls.includes('paren')\n\t\tconst menuRows = self.dom.controlsTip.d.selectAll('tr').style('background-color', '')\n\t\tmenuRows.filter(d => d.action == 'edit' || d.action == 'replace').style('display', grpAction ? 'none' : 'table-row')\n\t\tmenuRows\n\t\t\t.filter(d => /*d.action == 'negate' ||*/ d.action == 'remove')\n\t\t\t.style('display', cls.includes('_join_') && filter.lst.find(d => d.tag == 'cohortFilter') ? 'none' : 'table-row')\n\n\t\tmenuRows\n\t\t\t.filter(d => d.action == 'join')\n\t\t\t.style(\n\t\t\t\t'display',\n\t\t\t\tself.opts.joinWith.length < 2 ||\n\t\t\t\t\t(filter.$id == self.filter.$id && filter.lst.length == 1) ||\n\t\t\t\t\tcls.includes('negate') ||\n\t\t\t\t\tcls.includes('paren')\n\t\t\t\t\t? 'none'\n\t\t\t\t\t: 'table-row'\n\t\t\t)\n\t\t\t.select('td:nth-child(2)')\n\t\t\t.html(grpAction ? filter.join.toUpperCase() : filter.join == 'and' ? 'OR' : 'AND')\n\n\t\tmenuRows\n\t\t\t.filter(d => d.action == 'switch')\n\t\t\t.style(\n\t\t\t\t'display',\n\t\t\t\tself.opts.joinWith.length < 2 ||\n\t\t\t\t\t(filter.$id == self.filter.$id && filter.lst.length == 1) ||\n\t\t\t\t\t!cls.includes('_join_')\n\t\t\t\t\t? 'none'\n\t\t\t\t\t: 'table-row'\n\t\t\t)\n\t\t\t.select('td:nth-child(2)')\n\t\t\t.html(d => (filter.join == 'and' ? 'Switch to OR' : 'Switch to AND'))\n\n\t\tself.dom.filterContainer.selectAll('.sja_filter_grp').style('background-color', 'transparent')\n\t\tif (grpAction) {\n\t\t\tif (cls.includes('join')) elem.parentNode.parentNode.style.backgroundColor = '#ee5'\n\t\t\telse elem.parentNode.style.backgroundColor = '#ee5'\n\t\t}\n\t}\n\n\tself.handleMenuOptionClick = async function (event, d) {\n\t\tevent.stopPropagation()\n\t\tif (d == self.activeData.menuOpt) return\n\t\tself.activeData.menuOpt = d\n\t\tif (self.activeData.elem.className.includes('join') && d.action !== 'join' && d.action != 'switch') {\n\t\t\tself.activeData.item = self.activeData.filter\n\t\t\tself.activeData.filter = findParent(self.filter, self.activeData.item)\n\t\t}\n\t\tself.resetBlankPill(d.action)\n\t\tself.dom.controlsTip.d.selectAll('tr').style('background-color', '')\n\t\tawait d.handler(this, d)\n\t}\n\n\tself.resetBlankPill = function (action) {\n\t\t// clear any currently highlighted blank pill/parenthesis\n\t\tself.removeBlankPill()\n\t\tself.dom.filterContainer.selectAll('.sja_filter_grp').style('background-color', 'transparent')\n\t\tif (action != 'join') return\n\t\tconst elem = self.dom.last_join_div\n\t\t\t? self.dom.last_join_div.node()\n\t\t\t: self.activeData.elem.className.includes('join_label')\n\t\t\t? self.activeData.elem.parentNode.parentNode\n\t\t\t: self.activeData.item.type == 'tvs' || self.activeData.filter === self.filter\n\t\t\t? self.activeData.elem\n\t\t\t: self.activeData.elem.parentNode.parentNode\n\t\tconst joiner =\n\t\t\tself.opts.joinWith.length === 1\n\t\t\t\t? self.opts.joinWith[0].toUpperCase()\n\t\t\t\t: self.activeData.elem.className.includes('join_label')\n\t\t\t\t? self.activeData.filter.join.toUpperCase()\n\t\t\t\t: self.activeData.btn && typeof self.activeData.btn.__data__ === 'string'\n\t\t\t\t? self.activeData.btn.__data__.toUpperCase()\n\t\t\t\t: self.activeData.item.type == 'tvslst'\n\t\t\t\t? self.activeData.filter.join.toUpperCase()\n\t\t\t\t: self.activeData.filter.join == 'or'\n\t\t\t\t? 'AND'\n\t\t\t\t: 'OR'\n\n\t\tif (\n\t\t\tself.activeData.item.type == 'tvs' &&\n\t\t\t//&& self.activeData.filter != self.filter\n\t\t\t!self.activeData.elem.className.includes('join_label')\n\t\t) {\n\t\t\tselect(elem)\n\t\t\t\t.insert('div', 'div')\n\t\t\t\t.attr('class', 'sja_filter_paren_open')\n\t\t\t\t.style('display', self.opts.joinWith.length > 1 ? 'inline-block' : 'none')\n\t\t\t\t.style('padding', '0 5px')\n\t\t\t\t.style('font-weight', 500)\n\t\t\t\t.style('font-size', '24px')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.html('(')\n\t\t}\n\n\t\tconst blank = select(elem)\n\t\t\t.insert('div', ':scope > .sja_filter_paren_close')\n\t\t\t.attr('class', 'sja_filter_blank_pill')\n\t\t\t.style('display', 'inline-block')\n\t\t\t//.style('width', '120px')\n\t\t\t.style('height', '20px')\n\t\t\t//.style('margin-right', '20px')\n\t\t\t.style('overflow', 'visible')\n\n\t\tblank\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('width', '50px')\n\t\t\t.style('text-align', 'center')\n\t\t\t.html(joiner)\n\n\t\tblank\n\t\t\t.append('div')\n\t\t\t.style('position', 'relative')\n\t\t\t.style('top', '-7px')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('width', '80px')\n\t\t\t.style('height', '22px')\n\t\t\t.style('margin-right', '5px')\n\t\t\t.style('border', '3px dashed #b8d3ea')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.style('background-color', '#ee5')\n\n\t\tif (\n\t\t\tself.activeData.item.type == 'tvs' &&\n\t\t\t//&& self.activeData.filter != self.filter\n\t\t\t!self.activeData.elem.className.includes('join_label')\n\t\t) {\n\t\t\tselect(elem)\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_filter_paren_close')\n\t\t\t\t.style('display', self.opts.joinWith.length > 1 ? 'inline-block' : 'none')\n\t\t\t\t.style('padding', '0 5px')\n\t\t\t\t.style('font-weight', 500)\n\t\t\t\t.style('font-size', '24px')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.html(')')\n\t\t}\n\n\t\tif (elem == self.dom.filterContainer.node()) {\n\t\t\tself.dom.filterContainer\n\t\t\t\t.selectAll(\n\t\t\t\t\t':scope > .sja_filter_grp > .sja_filter_paren_open, :scope > .sja_filter_grp > .sja_filter_paren_close'\n\t\t\t\t)\n\t\t\t\t.style('display', self.opts.joinWith.length > 1 && self.filter.lst.length > 1 ? 'inline-block' : 'none')\n\t\t}\n\t}\n\n\tself.removeBlankPill = function () {\n\t\tself.dom.holder\n\t\t\t?.selectAll(\n\t\t\t\t'.sja_filter_blank_pill, .sja_pill_wrapper > .sja_filter_paren_open, .sja_pill_wrapper > .sja_filter_paren_close'\n\t\t\t)\n\t\t\t.remove()\n\n\t\t// in case of potentially root filter subnesting, may have to\n\t\t// revert the visibility of root filter group parentheses\n\t\t// that subnest existing pill + blank pill\n\t\tif (self.filter.in && self.filter.lst.filter(f => f.type === 'tvslst').length < 1) {\n\t\t\tself.dom.filterContainer\n\t\t\t\t?.selectAll(\n\t\t\t\t\t':scope > .sja_filter_grp > .sja_filter_paren_open, :scope > .sja_filter_grp > .sja_filter_paren_close'\n\t\t\t\t)\n\t\t\t\t.style('display', 'none')\n\t\t}\n\t}\n\n\t// menu to add a new term\n\tself.displayTreeNew = async function (event, d) {\n\t\tevent.stopPropagation() // in mass/group ui, to prevent pill-clicking to check/uncheck table rows\n\n\t\tif (self.opts.newBtn && this.className !== 'sja_filter_add_transformer' && self.filter.lst.length) return\n\t\tself.dom.filterContainer.selectAll('.sja_filter_grp').style('background-color', 'transparent')\n\t\tif (self.filter.lst.length > 0) {\n\t\t\tself.activeData = {\n\t\t\t\titem: self.filter,\n\t\t\t\tfilter: self.filter,\n\t\t\t\telem: self.dom.filterContainer.node(), //.select(':scope > .sja_filter_grp').node()\n\t\t\t\tbtn: this\n\t\t\t}\n\t\t}\n\t\tif (self.filter.lst.length) self.resetBlankPill('join')\n\t\tconst blankPill = self.dom.filterContainer.select('.sja_filter_blank_pill').node()\n\t\tif (blankPill) {\n\t\t\tself.dom.holder.selectAll('.sja_filter_add_transformer').style('display', 'none')\n\t\t\tself.dom.treeTip.clear().showunder(blankPill)\n\t\t} else {\n\t\t\tself.dom.treeTip.clear().showunder(this)\n\t\t}\n\n\t\tconst rootFilterCopy = self.activeData\n\t\t\t? self.getAdjustedRoot(self.activeData.filter.$id, d)\n\t\t\t: JSON.parse(self.rawCopy)\n\n\t\tconst termdb = await import('../termdb/app')\n\t\ttermdb.appInit({\n\t\t\tvocabApi: self.vocabApi,\n\t\t\tholder: self.dom.termSrcDiv,\n\t\t\tgetCategoriesArguments: self.opts.getCategoriesArguments,\n\t\t\tstate: {\n\t\t\t\tactiveCohort: self.activeCohort,\n\t\t\t\ttermfilter: { filter: rootFilterCopy },\n\t\t\t\ttree: { usecase: { target: 'filter' } }\n\t\t\t},\n\t\t\ttree: {\n\t\t\t\tdisable_terms:\n\t\t\t\t\tself.activeData && self.activeData.filter && self.activeData.filter.lst && d == 'and'\n\t\t\t\t\t\t? self.activeData.filter.lst\n\t\t\t\t\t\t\t\t.filter(d => d.type === 'tvs' && d.tvs.term.type !== 'condition')\n\t\t\t\t\t\t\t\t.map(d => d.tvs.term)\n\t\t\t\t\t\t: [],\n\n\t\t\t\tclick_term2select_tvs(tvs) {\n\t\t\t\t\tself.editFilterRoot(d, [{ type: 'tvs', tvs }])\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t/*\n\t\tArguments: \n\t\td: the data bound to a button element like +New, AND, OR\n\t\ttvslst\n\t*/\n\tself.editFilterRoot = (d, tvslst) => {\n\t\t// NOTE: default to 'tvs' argument once bar_click_override is unsupported\n\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\n\t\tif (!filterUiRoot.lst.length) {\n\t\t\tif (tvslst.length > 1) filterUiRoot.join = 'and'\n\t\t\tfilterUiRoot.lst.push(...tvslst)\n\t\t\tself.refresh(filterUiRoot)\n\t\t} else if (d != 'or' && d != 'and') {\n\t\t\tthrow 'unhandled new term(s): invalid appender join value'\n\t\t} else {\n\t\t\tif (!filterUiRoot.join) filterUiRoot.join = d // 'and' || 'or'\n\n\t\t\tif (filterUiRoot.join == d && filterUiRoot.in) {\n\t\t\t\tif (tvslst.length < 2 || filterUiRoot.join == 'and') {\n\t\t\t\t\tfilterUiRoot.lst.push(...tvslst)\n\t\t\t\t} else {\n\t\t\t\t\tfilterUiRoot.push({\n\t\t\t\t\t\ttype: 'tvslst',\n\t\t\t\t\t\tin: true,\n\t\t\t\t\t\tjoin: 'and',\n\t\t\t\t\t\tlst: tvslst\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tself.refresh(filterUiRoot)\n\t\t\t} else if (d == 'and' || tvslst.length < 2) {\n\t\t\t\tdelete filterUiRoot.tag\n\t\t\t\tself.refresh({\n\t\t\t\t\ttag: 'filterUiRoot',\n\t\t\t\t\ttype: 'tvslst',\n\t\t\t\t\tin: true,\n\t\t\t\t\tjoin: d,\n\t\t\t\t\tlst: [filterUiRoot, ...tvslst]\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tdelete filterUiRoot.tag\n\t\t\t\tself.refresh({\n\t\t\t\t\ttag: 'filterUiRoot',\n\t\t\t\t\ttype: 'tvslst',\n\t\t\t\t\tin: true,\n\t\t\t\t\tjoin: 'or',\n\t\t\t\t\tlst: [\n\t\t\t\t\t\tfilterUiRoot,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: 'tvslst',\n\t\t\t\t\t\t\tin: true,\n\t\t\t\t\t\t\tjoin: 'and',\n\t\t\t\t\t\t\tlst: tvslst\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t}\n\n\t// menu to replace a term or add a subnested filter\n\t// elem: the clicked menu row option\n\t// d: elem.__data__\n\tself.displayTreeMenu = async function (elem, d) {\n\t\tselect(elem).style('background-color', MENU_OPTION_HIGHLIGHT_COLOR)\n\t\tself.dom.holder.selectAll('.sja_filter_add_transformer').style('display', 'none')\n\t\tconst blankPill = self.dom.filterContainer.select('.sja_filter_blank_pill').node()\n\t\tif (blankPill) {\n\t\t\tself.dom.controlsTip.hide()\n\t\t\tself.dom.treeTip.clear().showunder(blankPill)\n\t\t} else if (elem.lastChild instanceof HTMLElement) {\n\t\t\tself.dom.treeTip.clear().showunderoffset(elem.lastChild)\n\t\t} else {\n\t\t\tself.dom.treeTip.clear().showunder(elem)\n\t\t}\n\t\tconst filter = self.activeData.filter\n\n\t\tconst termdb = await import('../termdb/app')\n\t\ttermdb.appInit({\n\t\t\tvocabApi: self.vocabApi,\n\t\t\tholder: self.dom.termSrcDiv,\n\t\t\tgetCategoriesArguments: self.opts.getCategoriesArguments,\n\t\t\tstate: {\n\t\t\t\tactiveCohort: self.activeCohort,\n\t\t\t\theader_mode: 'search_only',\n\t\t\t\ttermfilter: { filter: self.getAdjustedRoot(filter.$id, filter.join) },\n\t\t\t\ttree: { usecase: { target: 'filter' } }\n\t\t\t},\n\t\t\ttree: {\n\t\t\t\tdisable_terms:\n\t\t\t\t\tfilter && filter.lst && filter.join == 'and'\n\t\t\t\t\t\t? filter.lst.filter(d => d.type === 'tvs' && d.tvs.term.type !== 'condition').map(d => d.tvs.term)\n\t\t\t\t\t\t: !self.activeData.item\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: self.activeData.item.type == 'tvs'\n\t\t\t\t\t\t? [self.activeData.item.tvs.term]\n\t\t\t\t\t\t: self.activeData.item.lst\n\t\t\t\t\t\t? self.activeData.item.lst.filter(f => f.type == 'tvs').map(f => f.tvs.term)\n\t\t\t\t\t\t: [],\n\n\t\t\t\tclick_term2select_tvs:\n\t\t\t\t\td.action == 'replace'\n\t\t\t\t\t\t? self.replaceTerm\n\t\t\t\t\t\t: !filter.join ||\n\t\t\t\t\t\t !filter.lst.length ||\n\t\t\t\t\t\t (self.activeData.elem && self.activeData.elem.className.includes('join'))\n\t\t\t\t\t\t? self.appendTerm\n\t\t\t\t\t\t: self.subnestFilter\n\t\t\t}\n\t\t})\n\t}\n\n\tself.editTerm = function (elem) {\n\t\tselect(elem.parentNode).selectAll('tr').style('background-color', self.highlightEditRow)\n\t\tconst holder = self.dom.termSrcDiv\n\t\tconst item = self.activeData.item\n\t\tself.dom.treeTip.clear()\n\t\tself.pills[item.$id].showMenu(holder)\n\t\tself.dom.treeTip.showunderoffset(elem.lastChild)\n\t}\n\n\tself.highlightEditRow = function (d) {\n\t\treturn d.action == 'edit' ? MENU_OPTION_HIGHLIGHT_COLOR : ''\n\t}\n\n\tself.handleNotLabelClick = function (event, d) {\n\t\tself.activeData = {\n\t\t\titem: this.__data__\n\t\t}\n\t\tself.negateClause()\n\t}\n\n\tself.negateClause = function () {\n\t\t//const filter = self.activeData.filter\n\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\tconst item = findItem(filterUiRoot, self.activeData.item.$id)\n\t\tif (item.type == 'tvslst') item.in = !item.in\n\t\telse if (item.type == 'tvs' && item.tvs?.term?.type == 'geneVariant') {\n\t\t\tconst modifiedGrp = item.tvs.values.filter(v => v.mclassExcludeLst.length > 0)[0]\n\t\t\tconst tmp = modifiedGrp.mclassLst\n\t\t\tmodifiedGrp.mclassLst = modifiedGrp.mclassExcludeLst\n\t\t\tmodifiedGrp.mclassExcludeLst = tmp\n\t\t\titem.tvs.isnot = !item.tvs.isnot\n\t\t} else item.tvs.isnot = !item.tvs.isnot\n\t\tself.refresh(filterUiRoot)\n\t}\n\n\tself.replaceTerm = _tvs_ => {\n\t\t// NOTE: default to type: 'tvs' argument once bar_click_override is unsupported\n\t\tconst tvslst = Array.isArray(_tvs_) ? _tvs_ : [{ type: 'tvs', tvs: _tvs_ }]\n\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\tconst filterCopy = findItem(filterUiRoot, self.activeData.filter.$id)\n\t\tconst i = filterCopy.lst.findIndex(t => t.$id === self.activeData.item.$id)\n\t\t// FIXME: will replace with just one tvs, once bar_click_override is unsupported\n\t\tif (tvslst.length < 2 || filterCopy.join == 'and') {\n\t\t\tfilterCopy.lst.splice(i, 1, ...tvslst)\n\t\t} else {\n\t\t\tfilterCopy.lst[i] = {\n\t\t\t\t// transform from tvs to tvslst\n\t\t\t\tin: !_tvs_.isnot,\n\t\t\t\ttype: 'tvslst',\n\t\t\t\tjoin: 'and',\n\t\t\t\tlst: tvslst\n\t\t\t}\n\t\t}\n\t\tself.refresh(filterUiRoot)\n\t}\n\n\tself.appendTerm = _tvs_ => {\n\t\t// FIXME: default to type: 'tvs' argument once bar_click_override is unsupported\n\t\tconst tvslst = Array.isArray(_tvs_) ? _tvs_ : [{ type: 'tvs', tvs: _tvs_ }]\n\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\tconst filterCopy = findItem(filterUiRoot, self.activeData.filter.$id)\n\t\t// FIXME: will just push one tvs, once bar_click_override is unsupported\n\t\tif (tvslst.length < 2 || filterCopy.join == 'and') {\n\t\t\tfilterCopy.lst.push(...tvslst)\n\t\t\tif (filterCopy.join == '' && self.opts.joinWith.length === 1) filterCopy.join = self.opts.joinWith[0]\n\t\t} else {\n\t\t\tfilterCopy.lst.push({\n\t\t\t\t// transform from tvs to tvslst\n\t\t\t\tin: true,\n\t\t\t\ttype: 'tvslst',\n\t\t\t\tjoin: 'and',\n\t\t\t\tlst: tvslst\n\t\t\t})\n\t\t}\n\t\tself.refresh(filterUiRoot)\n\t}\n\n\tself.subnestFilter = t => {\n\t\tlet tvslst\n\t\tif (Array.isArray(t)) {\n\t\t\ttvslst = t\n\t\t} else {\n\t\t\ttvslst = [{ type: 'tvs', tvs: t }]\n\t\t}\n\n\t\tconst item = self.activeData.item\n\t\tconst filter = self.activeData.filter\n\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\tconst filterCopy = findItem(filterUiRoot, filter.$id)\n\t\tconst i = filterCopy.lst.findIndex(t => t.$id === item.$id)\n\t\t// transform from tvs to tvslst\n\t\tfilterCopy.lst[i] = {\n\t\t\tin: true,\n\t\t\ttype: 'tvslst',\n\t\t\tjoin: filter.join == 'or' ? 'and' : 'or',\n\t\t\tlst: [item, ...tvslst]\n\t\t}\n\t\tself.refresh(filterUiRoot)\n\t}\n\n\tself.removeTransform = function (elem, t) {\n\t\tconst item = t.action || typeof t !== 'object' ? self.activeData.item : findItem(self.filter, t.$id)\n\t\tconst filter = findParent(self.filter, item.$id) //self.activeData.filter\n\t\tif (item == filter) {\n\t\t\tself.refresh(getWrappedTvslst([], '', item.$id))\n\t\t\treturn\n\t\t}\n\t\tconst i = filter.lst.findIndex(t => t.$id === item.$id)\n\t\tif (i == -1) return\n\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\tconst filterCopy = findItem(filterUiRoot, filter.$id)\n\t\tfilterCopy.lst.splice(i, 1)\n\t\tif (filterCopy.lst.length === 1) {\n\t\t\tconst parent = findParent(filterUiRoot, filterCopy.$id)\n\t\t\tif (filterCopy.lst[0].type == 'tvslst') {\n\t\t\t\tif (parent == filterUiRoot) {\n\t\t\t\t\tfilterCopy.lst[0].tag = 'filterUiRoot'\n\t\t\t\t\tself.refresh(filterCopy.lst[0])\n\t\t\t\t} else {\n\t\t\t\t\tconst j = parent.lst.findIndex(t => t.$id == filterCopy.$id)\n\t\t\t\t\tif (filterCopy.lst[0].join == parent.join) {\n\t\t\t\t\t\tparent.lst.splice(j, 1, ...filterCopy.lst[0].lst)\n\t\t\t\t\t\tself.refresh(filterUiRoot)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tparent.lst[j] = filterCopy.lst[0]\n\t\t\t\t\t\tself.refresh(filterUiRoot)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfilterCopy.join = ''\n\t\t\t\tconst j = parent.lst.findIndex(t => t.$id === filterCopy.$id)\n\t\t\t\tparent.lst[j] = filterCopy.lst[0]\n\t\t\t\tif (!filterCopy.in) {\n\t\t\t\t\tparent.lst[j].tvs.isnot = !parent.lst[j].tvs.isnot\n\t\t\t\t\tif (parent == filterUiRoot) parent.in = true\n\t\t\t\t}\n\t\t\t\tself.refresh(filterUiRoot)\n\t\t\t}\n\t\t} else {\n\t\t\tself.refresh(filterUiRoot)\n\t\t}\n\t}\n\n\tself.showLastJoinBlank = function (event, d) {\n\t\tevent.stopPropagation()\n\t\tconst elem = self.dom.last_join_div.node()\n\t\tself.dom.last_join_label.style('display', 'none')\n\t\tconst filter = this.parentNode.__data__\n\t\tself.activeData = { item: filter, filter, elem }\n\t\tself.resetBlankPill(d.action)\n\t\tself.displayTreeMenu(elem, d)\n\t}\n\n\tself.switchJoin = function (event, d) {\n\t\tconst filterUiRoot = JSON.parse(JSON.stringify(self.filter))\n\t\tconst filterCopy = findItem(filterUiRoot, self.activeData.filter.$id)\n\t\tif (filterCopy.join < 2) return\n\t\tfilterCopy.join = filterCopy.join == 'and' ? 'or' : 'and'\n\t\tself.refresh(filterUiRoot)\n\t}\n}\n", "import { dofetch3, isInSession, getRequiredAuth, getSavedToken, setTokenByDsRoute } from '#common/dofetch'\nimport { isDictionaryType } from '#shared/terms.js'\n\nexport class Vocab {\n\tconstructor(opts) {\n\t\tthis.app = opts.app\n\t\tthis.opts = opts\n\t\tthis.state = opts.state\n\t\tthis.vocab = opts.state.vocab\n\t\tthis.currAnnoData = { samples: {}, refs: { byTermId: {} }, lastTerms: [], lastFilter: {} }\n\t\t/*\n some categorical terms may not have an initial term.values object,\n but is expected to be filled from data requests such as nestedChartSeriesData()\n TODO: \n - add values-filling logic to other data requests besides nestedChartSeriesData()\n - instead of this workaround, should query all available values in getterm()\n \t*/\n\t\tthis.missingCatValsByTermId = {}\n\t\tconst dslabel = this.vocab?.dslabel || this.state?.dslabel\n\t}\n\n\tasync main(stateOverride = null) {\n\t\tif (stateOverride) Object.assign(this.state, stateOverride)\n\t\telse this.state = structuredClone(this.app?.getState?.() || this.opts.state)\n\n\t\t// frontend vocab may replace the vocab object reference\n\t\tif (this.state.vocab) this.vocab = this.state.vocab\n\t\t// may or may not need a verified token for a dslabel, based on genome response.dsAuth\n\t\tconst dslabel = this.state.dslabel || this.state.vocab.dslabel\n\t\tthis.verifiedToken = !this.state.termdbConfig?.requiredAuth?.length || isInSession(dslabel, 'termdb')\n\t\t// secured plots need to confirm that a verified token exists\n\t\tif (dslabel) await this.maySetVerifiedToken(dslabel)\n\t}\n\n\tasync maySetVerifiedToken(dslabel) {\n\t\t// strict true boolean value means no auth required\n\t\tif (this.verifiedToken === true) return this.verifiedToken\n\t\tconst protectedRoute = 'termdb'\n\t\tconst auth =\n\t\t\tthis.state.termdbConfig?.requiredAuth.find(a => a.route == protectedRoute) ||\n\t\t\tgetRequiredAuth(dslabel, protectedRoute)\n\n\t\tif (!auth) {\n\t\t\tthis.verifiedToken = true\n\t\t\treturn\n\t\t}\n\n\t\tconst token = (await this.opts.getDatasetAccessToken?.(protectedRoute)) || getSavedToken(dslabel, protectedRoute)\n\t\tif (this.verifedToken && token === this.verifiedToken) return this.verifiedToken\n\n\t\ttry {\n\t\t\tif (!token && auth.type == 'jwt') {\n\t\t\t\tdelete this.verifiedToken\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// NOTE: if there is a saved token for a dataset/route, and the auth.type is not 'jwt',\n\t\t\t// then assume that the saved jwt was generated by the PP server after a password (basic) login,\n\t\t\t// so that the saved, stateless jwt can be reused across different PP server instances\n\t\t\t// with a clear expiration date\n\t\t\tif (auth.type == 'jwt' || (auth.type == 'basic' && !this.verifedToken && token)) {\n\t\t\t\tconst headers = {\n\t\t\t\t\t[auth.headerKey]: token\n\t\t\t\t}\n\t\t\t\t// TODO: do not hardcode 'termdb' here, assume that Vocab is only called within a termdb or mass app\n\t\t\t\tconst route = auth.route || 'termdb'\n\t\t\t\tif (!headers.authorization && token) headers.authorization = `Bearer ${btoa(token)}`\n\t\t\t\tconst data = await dofetch3('/jwt-status', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders,\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tdslabel,\n\t\t\t\t\t\troute,\n\t\t\t\t\t\tembedder: location.hostname\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\t// TODO: later may check against expiration time in response if included\n\t\t\t\tthis.verifiedToken = data.status === 'ok' //&& token\n\t\t\t\tif (data.error) {\n\t\t\t\t\tthis.tokenVerificationPayload = data\n\t\t\t\t\tthrow data.error\n\t\t\t\t} else {\n\t\t\t\t\t// TODO: remove the need for legacy support of hardcoded session names\n\t\t\t\t\tthis.sessionId =\n\t\t\t\t\t\t(auth.headerKey && data[auth.headerKey]) || data['x-sjppds-sessionid'] || data['x-ds-access-token']\n\t\t\t\t\tdelete this.tokenVerificationMessage\n\t\t\t\t\tdelete this.tokenVerificationPayload\n\t\t\t\t\tif (data.jwt) {\n\t\t\t\t\t\t// NOTE:\n\t\t\t\t\t\t// - must save token in localStorage, so that mayAddJwtToRequest()\n\t\t\t\t\t\t// in dofetch can add it as header.authorization: Bearer token,\n\t\t\t\t\t\t// which addresses unshared login/session state in a multi-server farm\n\t\t\t\t\t\t//\n\t\t\t\t\t\t// - data.jwt is a more persistent, session-like token that\n\t\t\t\t\t\t// \"replaces\" the embedder's jwt, which may have a much more limited\n\t\t\t\t\t\t// expiration date or other concerns that prevents effective/performant\n\t\t\t\t\t\t// reuse, for example, we don't want a user to login every 5 minutes\n\t\t\t\t\t\t// if an embedder's jwt expires quickly\n\t\t\t\t\t\tsetTokenByDsRoute(dslabel, data.route, data.jwt)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (auth.route != '/**') {\n\t\t\t\t// for termdb routes, assume only jwt login is supported for\n\t\t\t\t// pre-specified routes, since mass app is public for most termdb routes,\n\t\t\t\t// whereas basic/password login has been coded to protect all routes\n\t\t\t\t// (nothing is shown except login form in landing page)\n\t\t\t\tthrow `unsupported requiredAuth='${auth.type}'`\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.tokenVerificationMessage = e.message || e.reason || e\n\t\t\t// may uncomment below to help troubleshoot auth errors\n\t\t\t// console.log(e)\n\t\t}\n\t}\n\n\thasVerifiedToken() {\n\t\t// should not return the string token value, only a boolean\n\t\treturn this.verifiedToken && true\n\t}\n\n\tasync mayGetAuthHeaders(route = '') {\n\t\tconst dslabel = this.state.vocab.dslabel\n\t\tconst auth = this.state.termdbConfig?.requiredAuth?.find(a => a.route == route) || getRequiredAuth(dslabel, route)\n\n\t\tif (!auth) return {}\n\t\tif (!this.verifiedToken) {\n\t\t\tif (isInSession(dslabel, 'termdb')) {\n\t\t\t\tconst jwt = getSavedToken(this.state.vocab.dslabel, route)\n\t\t\t\tif (jwt) this.verifiedToken = jwt\n\t\t\t} else {\n\t\t\t\tthis.tokenVerificationMessage = `requires login for this data`\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tconst headers = {}\n\t\t// TODO: may remove custom header later, after extensive testing that nothing would break in prod\n\t\tif (auth.headerKey && typeof this.verifiedToken == 'string') headers[auth.headerKey] = this.verifiedToken\n\t\t// in cases where CORS prevents an http-domain based session cookie from being passed to the PP server,\n\t\t// then this header will be used by the PP server\n\t\tif (this.sessionId) headers['x-sjppds-sessionid'] = this.sessionId\n\t\t// may use a saved jwt to verify against a random server process in a farm;\n\t\t// at this point, should prefer to use a saved PP-server generated jwt instead of reusing an\n\t\t// embedder's jwt callback, because a PP-issued jwt would already have a tracked session id\n\t\t// so it's easier to verify\n\t\tconst jwt = getSavedToken(dslabel, route) || (await this.opts.getDatasetAccessToken?.(route))\n\t\tif (jwt) headers.authorization = `Bearer ${btoa(jwt)}`\n\t\treturn headers\n\t}\n\n\tgetClientAuthResult() {\n\t\treturn this.state.termdbConfig?.clientAuthResult\n\t}\n\n\tasync trackDsAction({ action, details }) {\n\t\tconst headers = { 'x-sjppds-sessionid': this.sessionId }\n\t\t// NOTE: do not hardcode the .termdb route here, there may be more tracked actions later\n\t\tconst jwt = await this.opts.getDatasetAccessToken?.('termdb')\n\t\tif (jwt) headers.authorization = 'Bearer ' + btoa(jwt)\n\t\tawait dofetch3('/authorizedActions', {\n\t\t\tmethod: 'POST',\n\t\t\tcredentials: 'include',\n\t\t\theaders,\n\t\t\tbody: Object.assign({\n\t\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t\taction,\n\t\t\t\tdetails,\n\t\t\t\t'x-sjppds-sessionid': this.sessionId\n\t\t\t})\n\t\t})\n\t}\n\n\t// get a minimum copy of tw\n\t// for better GET caching by the browser\n\tgetTwMinCopy(tw) {\n\t\tif (!tw) return\n\t\tconst copy = { term: {}, q: tw.q }\n\t\tdelete copy.q.isAtomic\n\t\tif (tw.$id) copy.$id = tw.$id\n\t\tif (tw.term) {\n\t\t\tif (isDictionaryType(tw.term.type)) {\n\t\t\t\t// dictionary term\n\t\t\t\tif (tw.term.id) copy.term.id = tw.term.id\n\t\t\t\tif (tw.term.name) copy.term.name = tw.term.name\n\t\t\t\tif (tw.term.type) copy.term.type = tw.term.type\n\t\t\t\tif (tw.term.values) copy.term.values = tw.term.values\n\t\t\t\tif (tw.term.groupsetting) copy.term.groupsetting = tw.term.groupsetting\n\t\t\t\tif (tw.term.termlst) copy.term.termlst = tw.term.termlst\n\t\t\t} else {\n\t\t\t\t// non-dictionary term\n\t\t\t\t// pass entire tw.term because non-dictionary terms\n\t\t\t\t// cannot get rehydrated on server-side\n\t\t\t\tcopy.term = structuredClone(tw.term)\n\t\t\t}\n\t\t}\n\t\treturn copy\n\t}\n\n\tcacheTermQ(term, q) {\n\t\t// only save q with a user or automatically assigned name\n\t\tif (!q.reuseId) throw `missing term q.reuseId for term.id='${term.id}'`\n\t\tthis.app.dispatch({\n\t\t\ttype: 'cache_termq',\n\t\t\ttermId: term.id,\n\t\t\tq\n\t\t})\n\t}\n\n\tasync uncacheTermQ(term, q) {\n\t\tawait this.app.dispatch({\n\t\t\ttype: 'uncache_termq',\n\t\t\tterm,\n\t\t\tq\n\t\t})\n\t}\n\n\tgetCustomTermQLst(term) {\n\t\tif (term.id) {\n\t\t\tconst cache = this.state.reuse.customTermQ.byId[term.id] || {}\n\t\t\tconst qlst = Object.values(cache).map(q => JSON.parse(JSON.stringify(q)))\n\t\t\t// find a non-conflicting reuseId for saving a new term.q\n\t\t\tfor (let i = qlst.length + 1; i < 1000; i++) {\n\t\t\t\tconst nextReuseId = `Setting #${i}`\n\t\t\t\tif (!qlst.find(q => q.reuseId === nextReuseId)) {\n\t\t\t\t\tqlst.nextReuseId = nextReuseId\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\t// last resort to use a random reuseId that is harder to read\n\t\t\tif (!qlst.nextReuseId) {\n\t\t\t\tqlst.nextReuseId = btoa((+new Date()).toString()).slice(10, -3)\n\t\t\t}\n\t\t\treturn qlst\n\t\t} else return []\n\t}\n\n\tasync addCustomTerm(obj) {\n\t\t// save one custom term\n\t\t// obj = { name:str, term:{} }\n\t\tawait this.app.dispatch({\n\t\t\ttype: 'add_customTerm',\n\t\t\tobj\n\t\t})\n\t}\n\tasync deleteCustomTerm(name) {\n\t\t// delete by name\n\t\tawait this.app.dispatch({\n\t\t\ttype: 'delete_customTerm',\n\t\t\tname\n\t\t})\n\t}\n\n\tasync getCustomTerms() {\n\t\tif (!Array.isArray(this.state.customTerms)) return [] // only mass state has this, here this instance is missing it. do not crash\n\t\t// return list of term{}; do not return whole object\n\t\treturn this.state.customTerms.map(i => i.tw)\n\t}\n\n\tasync addGroup(obj) {\n\t\tawait this.app.dispatch({\n\t\t\ttype: 'add_group',\n\t\t\tobj\n\t\t})\n\t}\n\n\tasync deleteGroup(name) {\n\t\tawait this.app.dispatch({\n\t\t\ttype: 'delete_group',\n\t\t\tname\n\t\t})\n\t}\n\n\tasync getGroups() {\n\t\tif (!Array.isArray(this.state.groups)) return [] // only mass state has this, here this instance is missing it. do not crash\n\t\t// return list of term{}; do not return whole object\n\t\treturn this.state.groups\n\t}\n}\n", "import { disappear } from './animation'\n\n/*\n---------Exported---------\nsayerror()\n\t- Displays error message in new, closable, red div OR error message.\n\nthrowMsgWithFilePathAndFnName()\n\t- Generic throw message that includes the file and function name in this format: `Message [fileName functionName()]\n\nshowErrorWithCounter\n\t- Displays the error message with a counter in a red div. \n*/\n\nexport function sayerror(holder: any, o: any) {\n\t// 2nd argument is a string or an Error object\n\tlet msg: any // string message for display\n\tif (typeof o == 'string') {\n\t\tmsg = o\n\t} else {\n\t\tmsg = o.message || o.error\n\t\tif (o.stack) console.log(o.stack) // print out stack\n\t}\n\tholder.style('padding-left', '10px') //to align with sandbox padding\n\tconst div = holder.append('div').attr('class', 'sja_errorbar').style('border-radius', '5px')\n\tdiv\n\t\t.append('div')\n\t\t.style('padding-right', '8px')\n\t\t.html('✕')\n\t\t.style('display', 'inline-block')\n\t\t.on('click', () => {\n\t\t\tdisappear(div, true)\n\t\t})\n\t// msg can contain injected XSS, so never do .html(msg)\n\tdiv.append('div').style('display', 'inline-block').text(msg)\n}\n\nexport function throwMsgWithFilePathAndFnName(message: string) {\n\ttry {\n\t\tthrow new Error()\n\t} catch (error: any) {\n\t\tconst stackLines = error.stack.split('\\n')\n\t\tconst callerLine = stackLines[2].trim()\n\n\t\t// Extract the file name and function name\n\t\tconst regex = /\\s*at\\s+(.*)\\s+\\((.*).proteinpaint.js:(\\d+):(\\d+)\\)/\n\t\tconst match = callerLine.match(regex)\n\n\t\tif (match) {\n\t\t\tconst functionName = match[1]\n\t\t\tconst fileName = match[2]\n\t\t\t\t.replace(/^.*\\/bin\\//, '') //remove window.origin\n\t\t\t\t.replace(/_([^_]+)$/, '.$1') //readable file extension\n\t\t\t\t.replaceAll(/_/g, '/') //readable file path pattern\n\t\t\tconst errorMsg = `${message} [${fileName} ${functionName}()]`\n\t\t\tthrow new Error(errorMsg)\n\t\t} else {\n\t\t\tthrow new Error(message)\n\t\t}\n\t}\n}\n\nexport function showErrorsWithCounter(errs: string | string[], holder: any) {\n\tif (typeof errs == 'string') return sayerror(holder, errs)\n\tif (errs.length === 0) return\n\tif (errs.length === 1) return sayerror(holder, errs[0])\n\n\tlet showErrors = false\n\t//Anywhere on the error bar is clickable to show/hide the error messages\n\tconst wrapper = holder\n\t\t.append('div')\n\t\t.attr('class', 'sja_errorbar')\n\t\t.on('click', () => {\n\t\t\tshowErrors = !showErrors\n\t\t\terrorsDiv.style('display', showErrors ? 'block' : 'none')\n\t\t})\n\n\t// Close button\n\twrapper\n\t\t.append('div')\n\t\t.style('padding-right', '8px')\n\t\t.style('display', 'inline-block')\n\t\t.html('✕')\n\t\t.on('click', () => {\n\t\t\tdisappear(wrapper, true)\n\t\t})\n\n\t// Counter\n\tconst counterTextDiv = wrapper.append('div').style('display', 'inline-block')\n\n\tcounterTextDiv\n\t\t.append('div')\n\t\t.style('display', 'inline-block')\n\t\t.style('color', 'white')\n\t\t.style('background-color', 'red')\n\t\t.style('border-radius', '100px')\n\t\t.style('padding', '1px 4px')\n\t\t.text(errs.length)\n\n\t// Text\n\tcounterTextDiv.append('div').text('errors found.').style('padding', '3px').style('display', 'inline-block')\n\n\t//Error messages\n\tconst errorsDiv = wrapper.append('div').style('display', 'none').style('margin-left', '10px')\n\n\tfor (const err of errs) {\n\t\terrorsDiv.append('div').text(err)\n\t}\n}\n", "import { Vocab } from './Vocab'\nimport { dofetch3 } from '../common/dofetch'\nimport { getNormalRoot } from '#filter'\nimport { isUsableTerm } from '#shared/termdb.usecase.js'\nimport { throwMsgWithFilePathAndFnName } from '../dom/sayerror'\nimport { isDictionaryType, dtTermTypes } from '#shared/terms.js'\nimport { getCategoryData } from '../plots/barchart.data'\n\nexport class TermdbVocab extends Vocab {\n\t// migrated from termdb/store\n\tasync getTermdbConfig() {\n\t\tif (this.opts.getDatasetAccessToken) {\n\t\t\t// mass app init may need clientAuthResult, so need to trigger\n\t\t\t// login so termdb/config response would match the user log-in status\n\n\t\t\ttry {\n\t\t\t\t// sets this.app.vocabApi.verifiedToken to false if the token was not valid. nav.js checks this value and throws an error\n\t\t\t\t// when the token is not valid no error is thrown but a response with an error message is sent\n\t\t\t\tawait this.maySetVerifiedToken(this.state.vocab.dslabel)\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(e)\n\t\t\t}\n\t\t}\n\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\t\tconst data = await dofetch3('termdb/config', {\n\t\t\theaders,\n\t\t\tbody: {\n\t\t\t\tgenome: this.vocab.genome,\n\t\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t\tembedder: window.location.hostname\n\t\t\t}\n\t\t})\n\n\t\tif (data.error) throw data.error\n\n\t\t// note: in case of error such as missing dataset, supply empty object\n\t\tthis.termdbConfig = data.termdbConfig || {}\n\t\treturn this.termdbConfig\n\t}\n\n\tasync getTermChildren(term, cohortValuelst, filter) {\n\t\tlet data\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tfilter: getNormalRoot(filter)\n\t\t}\n\t\tif (cohortValuelst) {\n\t\t\tbody.cohortValues = cohortValuelst.slice().sort().join(',')\n\t\t}\n\t\tif (this.state.treeFilter) {\n\t\t\tbody.treeFilter = this.state.treeFilter\n\t\t}\n\t\tif (term.__tree_isroot) {\n\t\t\tbody.default_rootterm = 1\n\t\t\tdata = await dofetch3('termdb/rootterm', { body }, this.opts.fetchOpts)\n\t\t} else {\n\t\t\tbody.get_children = 1\n\t\t\tbody.tid = term.id\n\t\t\tdata = await dofetch3('termdb/termchildren', { body }, this.opts.fetchOpts)\n\t\t}\n\t\tif (data.error) throw data.error\n\t\tfor (const term of data.lst) {\n\t\t\tif (term.type == 'integer' || term.type == 'float') {\n\t\t\t\tif (term.bins?.rounding) term.bins.default.rounding = term.bins.rounding\n\t\t\t\tif (term.bins?.label_offset && !term.bins?.default?.label_offset)\n\t\t\t\t\tterm.bins.default.label_offset = term.bins.label_offset\n\t\t\t}\n\t\t}\n\t\treturn data\n\t}\n\n\t/* from termdb/plot\n Input:\n opts{}\n .term={}\n .id=str\n .term={}\n .q={}\n .term2={}\n id/term/q\n .term0={}\n id/term/q\n .filter={}\n Output:\n a structure from the termdb/barsql route\n */\n\tasync getNestedChartSeriesData(opts, signal = undefined) {\n\t\tconst [route, body] = this.getTdbDataUrl(opts)\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\t\tconst initOpts = { headers, body }\n\t\tinitOpts.signal = signal\n\t\tconst data = await dofetch3(route, initOpts, this.opts.fetchOpts)\n\t\tif (data.error) throw data.error\n\n\t\tconst valuesByTermId = {}\n\n\t\t// TODO: instead of this workaround to fill in missing categorical term.values,\n\t\t// should query all available values in getterm()\n\t\tif (data.charts) {\n\t\t\tfor (const chart of data.charts) {\n\t\t\t\tthis.mayFillInMissingCatValues(opts.term0, chart.chartId, chart.total)\n\n\t\t\t\tfor (const series of chart.serieses) {\n\t\t\t\t\tthis.mayFillInMissingCatValues(opts.term, series.seriesId, series.total)\n\n\t\t\t\t\tfor (const data of series.data) {\n\t\t\t\t\t\tthis.mayFillInMissingCatValues(opts.term2, data.dataId, data.total)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.mayFillCategories(opts, data.categories)\n\n\t\treturn data\n\t}\n\n\tmayFillInMissingCatValues(term, key, total) {\n\t\tif (!key) return\n\t\tif (!(term?.id in this.missingCatValsByTermId)) return\n\t\tconst t = this.missingCatValsByTermId[term.id]\n\t\tif (!(key in t.values)) {\n\t\t\t// TODO: assign color here so that the same color is used for a value even as the chart gets updated or reused\n\t\t\tt.values[key] = { key, label: key /*color: */ }\n\t\t\tt.samplecount[key] = { samplecount: 0, key, label: key }\n\t\t}\n\t\t// !!! NOTE: assumes a sample may only have at most one value by term\n\t\t// and so can add samplecount totals for an overlay term across charts and serieses\n\t\tt.samplecount[key].samplecount += total\n\t}\n\n\t// fill in term.categories with\n\t// categories computed from the data\n\tmayFillCategories(opts, categories) {\n\t\tif (!categories) return\n\t\tif (!Array.isArray(categories)) throw 'categories is not array'\n\t\tfor (const [i, k] of ['term0', 'term', 'term2'].entries()) {\n\t\t\tconst tw = opts[k]\n\t\t\tif (!tw) continue\n\t\t\tconst c = categories[i]\n\t\t\tif (!Object.keys(c).length) continue\n\t\t\ttw.term.categories = c\n\t\t}\n\t}\n\n\t/*\n Create URL parameters for charts that use the \n `/termdb*` server route, which expects the \n term0, term, term2 variable naming convention\n\n Arguments:\n opts\n - chart configuration object with termwrappers of\n term (required), term0 (optional) and term2 (optional)\n \t\n .term \n required, {term, q}\n .term2\n optional overlay term, {term, q}\n .term0\n optional divide-by term, {term, q}\n .filter\n optional filter object \n .filter0\n optional gdc filter\n */\n\tgetTdbDataUrl(opts) {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tembedder: window.location.hostname\n\t\t}\n\t\tif (opts.chartType == 'cuminc') body.getcuminc = 1\n\t\tif (opts.chartType == 'survival') body.getsurvival = 1\n\n\t\tfor (const _key of ['term0', 'term', 'term2']) {\n\t\t\t// \"term\" on client is \"term1\" at backend\n\t\t\tconst tw = this.getTwMinCopy(opts[_key])\n\t\t\tif (!tw) continue\n\t\t\tconst key = _key == 'term' ? 'term1' : _key\n\t\t\tbody[key + '_$id'] = tw.$id\n\t\t\t// will need to generalize to also consider type=geneExpression\n\t\t\tif ('id' in tw.term && (!tw.term?.type || isDictionaryType(tw.term.type))) {\n\t\t\t\tbody[key + '_id'] = tw.term.id\n\t\t\t} else {\n\t\t\t\tbody[key] = tw.term\n\t\t\t}\n\t\t\tif (!tw.q) throw 'plot.' + _key + '.q{} missing: ' + tw.term.id\n\t\t\tbody[key + '_q'] = tw.q //q_to_param(tw.q) ????\n\t\t}\n\n\t\tif (opts.filter) {\n\t\t\tconst filter = getNormalRoot(opts.filter)\n\t\t\tif (filter.lst.length) {\n\t\t\t\tbody.filter = filter\n\t\t\t}\n\t\t}\n\t\tif (opts.filter0) body.filter0 = opts.filter0\n\n\t\tif ('grade' in opts) body.grade = opts.grade\n\t\tif ('minSampleSize' in opts) body.minSampleSize = opts.minSampleSize\n\n\t\tif (opts.term2) {\n\t\t\t//send the hidden group labels to server to ignore them when computing association test pvalues\n\t\t\tconst hiddenValues = {\n\t\t\t\tterm1: opts.term.q.hiddenValues\n\t\t\t\t\t? Object.keys(opts.term.q.hiddenValues).map(h => opts.term.term.values?.[h]?.label || h)\n\t\t\t\t\t: [],\n\t\t\t\tterm2: opts.term2.q.hiddenValues\n\t\t\t\t\t? Object.keys(opts.term2.q.hiddenValues).map(h => opts.term2.term.values?.[h]?.label || h)\n\t\t\t\t\t: []\n\t\t\t}\n\t\t\tbody.hiddenValues = hiddenValues\n\t\t}\n\n\t\t// start of mds3 parameters for variant2sample query\n\t\tif (opts.get) body.get = opts.get\n\t\t// end of mds3 parameters\n\n\t\treturn [opts.chartType ? 'termdb' : 'termdb/barsql', body]\n\t}\n\n\t/*\n May override certain term-related configuration (like bins),\n from the server response data to the corresponding term's \n current state.\n\n Arguments\n config\n - chart configuration object with termwrappers of\n term (required), term0 (optional) and term2 (optional)\n\n - data\n server response data in the format of \n {\n charts: [{\n chartId: '...',\n serieses: [{\n seriesId: '...',\n data: [{\n dataId: '...',\n total: *samplecount*\n }, ...],\n total: *samplecount*\n }, ...],\n total: *samplecount*\n }, ...],\n\n refs: {...}\n }\n */\n\tsyncTermData(config, data, prevConfig = {}) {\n\t\tif (!data || !data.refs) return\n\t\t// must maintain the order of term* string values in the looped array,\n\t\t// so that the entry index must matches the data.refs.bins[], q[] order\n\t\tfor (const [i, key] of ['term0', 'term', 'term2'].entries()) {\n\t\t\tconst term = config[key]\n\t\t\tconst persistTerm = !prevConfig[key] || prevConfig[key].term?.id === term?.term?.id\n\t\t\tif (term == 'genotype') continue\n\t\t\tif (!term) {\n\t\t\t\tif (key == 'term') throw `missing plot.term{}`\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (data.refs.bins) {\n\t\t\t\tterm.bins = data.refs.bins[i]\n\t\t\t\tif (data.refs.q && data.refs.q[i]) {\n\t\t\t\t\tif (!term.q) term.q = {}\n\t\t\t\t\tconst q = data.refs.q[i]\n\t\t\t\t\t// FIGURE OUT: when will q equal term.q?\n\t\t\t\t\tif (q !== term.q || !persistTerm) {\n\t\t\t\t\t\tif (q.type != term.q.type || q.mode != term.q.mode) {\n\t\t\t\t\t\t\tfor (const key in term.q) {\n\t\t\t\t\t\t\t\t// persist hiddenValues if it exists, but may be overridden by the server data's q\n\t\t\t\t\t\t\t\tif (key != 'hiddenValues' || !persistTerm) delete term.q[key]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tObject.assign(term.q, q)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!term.q) term.q = {}\n\t\t}\n\t}\n\n\t/* \n Generate regression analysis results\n config{}\n .regressionType: 'linear' | 'logistic'\n .outcome {id, term, q, refGrp}\n .independent[ {id, term, q, refGrp}, ... ]\n */\n\tasync getRegressionData(opts) {\n\t\tif (!isDictionaryType(opts.outcome.term.type)) throw 'outcome must be dictionary term'\n\t\tconst outcome = this.getTwMinCopy(opts.outcome)\n\t\toutcome.id = outcome.term.id\n\t\toutcome.q = JSON.parse(JSON.stringify(opts.outcome.q))\n\t\toutcome.type = outcome.term.type // TODO: refactor backend to not require outcome.type (similar issue with independent variables, see below)\n\t\tif (!outcome.q.mode && opts.regressionType == 'linear') outcome.q.mode = 'continuous'\n\t\tconst contQkeys = ['mode', 'scale']\n\t\toutcome.refGrp = outcome.q.mode == 'continuous' ? 'NA' : opts.outcome.refGrp\n\t\tif (opts.outcome.nonRefGrp) outcome.nonRefGrp = opts.outcome.nonRefGrp\n\n\t\tif (outcome.q.mode == 'continuous') {\n\t\t\t// remove unneeded parameters from q\n\t\t\tfor (const key in outcome.q) {\n\t\t\t\tif (!contQkeys.includes(key)) delete outcome.q[key]\n\t\t\t}\n\t\t}\n\n\t\tconst body = {\n\t\t\tgetregression: 1,\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tregressionType: opts.regressionType,\n\t\t\toutcome,\n\t\t\tindependent: opts.independent.map(tw => {\n\t\t\t\tconst t = this.getTwMinCopy(tw)\n\t\t\t\tt.refGrp = tw.refGrp\n\t\t\t\tt.interactions = tw.interactions\n\t\t\t\tconst q = JSON.parse(JSON.stringify(t.q))\n\t\t\t\tdelete q.values\n\t\t\t\tdelete q.totalCount\n\t\t\t\tif (t.q.mode == 'continuous') {\n\t\t\t\t\t// remove unneeded parameters from q\n\t\t\t\t\tfor (const key in q) {\n\t\t\t\t\t\tif (!contQkeys.includes(key)) delete q[key]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t// TODO: refactor backend code to not have to pass\n\t\t\t\t\t// term.id, term.type, and term.values separately\n\t\t\t\t\t$id: tw.$id,\n\t\t\t\t\tid: t.term.id,\n\t\t\t\t\tq,\n\t\t\t\t\tterm: t.term,\n\t\t\t\t\ttype: t.term.type,\n\t\t\t\t\trefGrp: t.q.mode == 'continuous' ? 'NA' : t.refGrp,\n\t\t\t\t\tinteractions: t.interactions || [],\n\t\t\t\t\tvalues: t.term.values\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tconst filterData = getNormalRoot(opts.filter)\n\t\tif (filterData.lst.length) body.filter = filterData\n\t\tif (opts.includeUnivariate) body.includeUnivariate = opts.includeUnivariate\n\t\tconst data = await dofetch3('termdb', { body }, this.opts.fetchOpts)\n\t\tif (data.error) throw data.error\n\t\treturn data\n\t}\n\n\t/*\n\tstr: search phrase\n\tcohorStr\n\tusecase\n\ttargetType\n\t\tsnp = find if str matches with dbsnp\n\t\tcategory = match with catgory of a term (not implemented yet)\n\t\tblank string for default behavior of matching with dict term or gene names\n\t*/\n\tasync findTerm(str, cohortStr = '', usecase = null, targetType = '') {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tfindterm: encodeURIComponent(str),\n\t\t\tcohortStr\n\t\t}\n\t\tif (usecase) body.usecase = usecase\n\t\tif (this.state.treeFilter) body.treeFilter = this.state.treeFilter\n\t\tif (targetType) body.targetType = targetType\n\t\tconst data = await dofetch3('termdb', { body })\n\t\tif (data.error) throw data.error\n\t\t// sort results\n\t\tconst n = str.toUpperCase()\n\t\tconst r = { equals: [], startsWith: [], startsWord: [], includes: [] }\n\t\tfor (const i of data.lst) {\n\t\t\tconst name = i.name.toUpperCase()\n\t\t\tif (name === n) r.equals.push(i)\n\t\t\telse if (name.startsWith(n)) r.startsWith.push(i)\n\t\t\telse if (name.includes(' ' + n)) r.startsWord.push(i)\n\t\t\telse r.includes.push(i)\n\t\t}\n\t\tdata.lst = [...r.equals, ...r.startsWith, ...r.startsWord, ...r.includes]\n\t\treturn data\n\t}\n\n\t// from termdb/terminfo\n\tasync getTermInfo(id) {\n\t\tif (!id) throw '.getTermInfo: Missing term id' //If missing doesn't throw as expected in later calls\n\t\tconst args = ['genome=' + this.vocab.genome + '&dslabel=' + this.vocab.dslabel + '&getterminfo=1&tid=' + id]\n\t\tconst data = await dofetch3('/termdb?' + args.join('&'), {}, this.opts.fetchOpts)\n\t\tif (data.error) throw data.error\n\t\treturn data\n\t}\n\n\tasync getCohortSampleCount(cohort) {\n\t\t// if dataset does not use subchort, cohortName=null and total number of samples is returned\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tcohort\n\t\t}\n\t\tconst data = await dofetch3('termdb/cohort/summary', { body }, this.opts.fetchOpts)\n\t\tif (!data) throw 'missing data'\n\t\tif (data.error) throw data.error\n\t\treturn data.count\n\t}\n\n\t/** opts: \n\t \tfilterJSON: JSON || string, required\n\t\treturns sample list in array of [{id, name}....]\n\t */\n\tasync getFilteredSampleList(filterJSON) {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tgetsamplelist: 1,\n\t\t\tfilter: typeof filterJSON == 'string' ? filterJSON : getNormalRoot(filterJSON)\n\t\t}\n\t\tconst data = await dofetch3('termdb', { body }, this.opts.fetchOpts)\n\t\tif (!data) throw `missing data`\n\t\tif (data.error) throw data.error\n\t\tif (!Array.isArray(data)) throw 'data is not array'\n\t\treturn data\n\t}\n\t/** opts: \n\t \tfilterJSON: JSON || string, required\n\t\treturns sample count per type\n\t */\n\tasync getFilteredSampleCount(filterJSON) {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tgetsamplecount: 1,\n\t\t\tfilter: getNormalRoot(filterJSON)\n\t\t}\n\t\tconst data = await dofetch3('termdb', { body }, this.opts.fetchOpts)\n\t\tif (!data) throw `missing data`\n\t\tif (data.error) throw data.error\n\t\treturn data.count\n\t}\n\n\tasync getViolinPlotData(arg, _body = {}, signal = undefined) {\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\t\targ.tw = this.getTwMinCopy(arg.tw)\n\t\tif (arg.overlayTw) arg.overlayTw = this.getTwMinCopy(arg.overlayTw)\n\t\tif (arg.divideTw) arg.divideTw = this.getTwMinCopy(arg.divideTw)\n\t\tconst body = Object.assign(\n\t\t\t{\n\t\t\t\tgenome: this.vocab.genome,\n\t\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t\tfilter: arg.filter || this.state.termfilter?.filter, // mds3 tk filterObj state lacks termfilter!!\n\t\t\t\tfilter0: this.state.termfilter?.filter0,\n\t\t\t\tembedder: window.location.hostname,\n\t\t\t\tdevicePixelRatio: window.devicePixelRatio,\n\t\t\t\tisKDE: 'isKDE' in arg ? arg.isKDE : true,\n\t\t\t\tticks: arg.ticks,\n\t\t\t\tdatasymbol: arg.datasymbol || 'rug',\n\t\t\t\torientation: arg.orientation || 'horizontal',\n\t\t\t\tradius: arg.radius || 8,\n\t\t\t\tsvgw: arg.svgw || 200,\n\t\t\t\tunit: arg.unit || 'abs'\n\t\t\t},\n\t\t\targ,\n\t\t\t_body\n\t\t)\n\t\tif (body.filter) body.filter = getNormalRoot(body.filter)\n\t\tconst init = { headers, body, signal }\n\t\tconst data = await dofetch3('termdb/violin', init)\n\t\treturn data\n\t}\n\n\tasync getBoxPlotData(arg, signal = undefined) {\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\t\targ.tw = this.getTwMinCopy(arg.tw)\n\n\t\tif (arg.overlayTw) arg.overlayTw = this.getTwMinCopy(arg.overlayTw)\n\t\tif (arg.divideTw) arg.divideTw = this.getTwMinCopy(arg.divideTw)\n\t\tconst body = Object.assign(\n\t\t\t{\n\t\t\t\tgenome: this.vocab.genome,\n\t\t\t\tdslabel: this.vocab.dslabel\n\t\t\t},\n\t\t\targ\n\t\t)\n\t\tif (body.filter) body.filter = getNormalRoot(body.filter)\n\t\tconst d = await dofetch3('termdb/boxplot', { headers, body, signal })\n\t\treturn d\n\t}\n\n\tasync getPercentile(term, percentile_lst, termfilter) {\n\t\t// for a numeric term, convert a percentile to an actual value, with respect to a given filter\n\t\tif (percentile_lst.find(p => !Number.isInteger(p))) throw 'non-integer percentiles found'\n\t\tif (Math.max(...percentile_lst) > 99 || Math.min(...percentile_lst) < 1) throw 'percentiles must be between 1-99'\n\t\tconst body = {\n\t\t\tgetpercentile: percentile_lst,\n\t\t\tterm,\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel\n\t\t}\n\t\tif (termfilter) {\n\t\t\tif (termfilter.filter) body.filter = getNormalRoot(termfilter.filter)\n\t\t\tif (termfilter.filter0) body.filter0 = termfilter.filter0\n\t\t}\n\t\treturn await dofetch3('termdb/getpercentile', { body })\n\t}\n\n\tasync getDescrStats(tw, termfilter, logScale) {\n\t\t// for a numeric term, get descriptive statistics e.g mean, median, standard deviation, min, max\n\t\t// logScale is boolean\n\t\tconst body = {\n\t\t\ttw,\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel\n\t\t}\n\t\tif (logScale) body.logScale = true\n\t\tif (termfilter) {\n\t\t\tif (termfilter.filter) body.filter = getNormalRoot(termfilter.filter)\n\t\t\tif (termfilter.filter0) body.filter0 = termfilter.filter0\n\t\t}\n\t\treturn await dofetch3('/termdb/descrstats', { body })\n\t}\n\n\t/**\n\t * Retrieve terms by ids from the term database.\n\t * @param {Array} ids - The array of term ids to retrieve\n\t * @param {string} [_dslabel=null] - The dataset label (optional)\n\t * @param {string} [_genome=null] - The genome identifier (optional)\n\t * @return {Object} The terms data retrieved based on the provided ids\n\t */\n\tasync getTerms(ids, _dslabel = null, _genome = null) {\n\t\tif (!ids) throw 'getTerms: ids missing'\n\t\tif (!Array.isArray(ids)) throw `invalid ids` // should use typescript\n\t\tconst dslabel = _dslabel || this.state.vocab?.dslabel // this.vocab is guaranteed to exist?\n\t\tconst genome = _genome || this.state.vocab?.genome // this.vocab is guaranteed to exist?\n\t\tif (!dslabel) throw 'getTerms: dslabel missing'\n\t\tif (!genome) throw 'getTerms: genome missing'\n\n\t\tconst body = {\n\t\t\tgenome,\n\t\t\tdslabel,\n\t\t\tids,\n\t\t\tembedder: window.location.hostname\n\t\t}\n\n\t\tconst data = await dofetch3(`termdb/termsbyids`, { body })\n\t\tif (data.error) throw 'getTerm: ' + data.error\n\t\tfor (const id in data.terms) {\n\t\t\tconst term = data.terms[id]\n\t\t\tif (term.type == 'categorical' && !term.values) this.missingCatValsByTermId[term.id] = term\n\t\t}\n\t\treturn data.terms\n\t}\n\n\tasync getterm(termid, dslabel = null, genome = null) {\n\t\tif (!termid) throw 'getterm: termid missing'\n\n\t\tconst result = await this.getTerms([termid], dslabel, genome)\n\t\tconst term = result[termid]\n\t\tif (!term) throw 'no term found for ' + termid\n\n\t\treturn term\n\t}\n\n\tgraphable(term) {\n\t\tif (!term) throw 'graphable: term is missing'\n\t\treturn isUsableTerm(term).has('plot')\n\t}\n\n\t/*\n\taccepts one term of any type, including categorical, non-categorical, and non-dictionary\n\treturn number of samples per category/bin/grade/group etc\n\toptionally, caller can supply a {term1_q: {...}} key-object value in _body to customize categories\n\t*/\n\tasync getCategories(term, filter, _body = {}) {\n\t\tconst headers = await this.mayGetAuthHeaders()\n\t\tif (term.type == 'snplst' || term.type == 'snplocus') {\n\t\t\tconst body = Object.assign(\n\t\t\t\t{\n\t\t\t\t\tvalidateSnps: 1,\n\t\t\t\t\tsumSamples: 1,\n\t\t\t\t\tgenome: this.state.vocab.genome,\n\t\t\t\t\tdslabel: this.state.vocab.dslabel\n\t\t\t\t},\n\t\t\t\t_body\n\t\t\t)\n\n\t\t\tif (filter) {\n\t\t\t\tbody.filter = getNormalRoot(filter)\n\t\t\t}\n\t\t\treturn await dofetch3('/termdb', { headers, body })\n\t\t}\n\n\t\tif (dtTermTypes.has(term.type)) {\n\t\t\t// dt term, grab categories directly from term\n\t\t\tconst data = getCategoryData({ term })\n\t\t\treturn data\n\t\t}\n\n\t\tif (term.category2samplecount) {\n\t\t\t// grab directly from term and not the server\n\t\t\t// { categoryKey: count }\n\t\t\tconst l2 = []\n\t\t\tfor (const key in term.category2samplecount) {\n\t\t\t\tl2.push({\n\t\t\t\t\tkey,\n\t\t\t\t\tlabel: term?.values?.[key]?.label || key,\n\t\t\t\t\tsamplecount: term.category2samplecount[key]\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn { lst: l2 }\n\t\t}\n\n\t\tif (_body.categories) {\n\t\t\t// grab directly from body and not server\n\t\t\treturn _body.categories\n\t\t}\n\n\t\tif (_body.skip_categories) {\n\t\t\t// do not query server\n\t\t\treturn { lst: [] }\n\t\t}\n\n\t\t// no need to supply tw.$id: 1) this method is one term only and no need to distinguish multiple terms 2) backend will auto fill $id before retrieving data\n\t\tconst tw = { term, q: _body.term1_q || {} }\n\t\tdelete _body.term1_q // is now tw.q, so no longer needed\n\t\tconst body = {\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\ttw: this.getTwMinCopy(tw),\n\t\t\t..._body\n\t\t}\n\n\t\tif (filter) {\n\t\t\tbody.filter = getNormalRoot(filter)\n\t\t}\n\t\t// when calling getCategories(), external code does not supply filter0. to avoid much code changes, use this step to detect filter0 from this.state and supply to request\n\t\t// TODO if this filter0 can be properly updated when api.update() is called from pp launcher on GFF cohort change\n\t\tif (this.state.termfilter?.filter0) body.filter0 = this.state.termfilter.filter0\n\n\t\ttry {\n\t\t\tconst data = await dofetch3('termdb/categories', { headers, body })\n\t\t\tif (data.error) throwMsgWithFilePathAndFnName(data.error)\n\t\t\treturn data\n\t\t} catch (e) {\n\t\t\t// TODO: should handle this error more gracefully, maybe show only in the termsetting pill;\n\t\t\t// right now, this alert pops up even when this data or related pill is not visible\n\t\t\twindow.alert(e.message || e)\n\t\t}\n\t}\n\n\tasync getNumericUncomputableCategories(term, filter) {\n\t\t// for numeric term\n\t\t// return number of samples per uncomputable categories\n\t\tconst body = {\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\ttid: term.id\n\t\t}\n\t\tif (filter) {\n\t\t\tbody.filter = getNormalRoot(filter)\n\t\t}\n\t\ttry {\n\t\t\tconst data = await dofetch3('/termdb/numericcategories', { body })\n\t\t\tif (data.error) throw data.error\n\t\t\treturn data\n\t\t} catch (e) {\n\t\t\twindow.alert(e.message || e)\n\t\t}\n\t}\n\n\t/* when arg.text is true, arg should only be {text} from a snplst term;\n else, it should be the q{} of snplocus term: {chr,start,stop,variant_filter}\n to generate snp-sample gt matrix cache file and return file name\n */\n\tasync validateSnps(arg) {\n\t\tconst lst = ['validateSnps=1', 'genome=' + this.state.vocab.genome, 'dslabel=' + this.state.vocab.dslabel]\n\t\tif (arg.text) {\n\t\t\tlst.push('snptext=' + encodeURIComponent(arg.text))\n\t\t} else if (arg.chr) {\n\t\t\tlst.push('chr=' + arg.chr)\n\t\t\tlst.push('start=' + arg.start)\n\t\t\tlst.push('stop=' + arg.stop)\n\t\t\tif (arg.variant_filter) lst.push('variant_filter=' + encodeURIComponent(JSON.stringify(arg.variant_filter)))\n\t\t}\n\t\treturn await dofetch3('/termdb?' + lst.join('&'))\n\t}\n\n\tasync get_variantFilter() {\n\t\t// used for snplocus term type\n\t\treturn await dofetch3('termdb', {\n\t\t\tbody: { getvariantfilter: 1, genome: this.state.vocab.genome, dslabel: this.state.vocab.dslabel }\n\t\t})\n\t}\n\n\t/*\n The server data sample annotations and refs are both indexed \n by term id, but will be remapped to be annotated instead with \n tw.$id. This will prevent conflicts when the same term.id is used\n multiple times in the terms[] argument, such as for the matrix plot.\n\n Arguments:\n\n opts{}\n .filter a filter object\n .filter0 read-only json object, only used for gdc dataset to store the cohort filter obj built by CohortBuilder\n .terms[{}] an array of termWrapper objects\n tw.$id id to disambugate when multiple terms\n with the same ID are in terms[], such as in matrix plot\n .termsPerRequest optional, a number greater than 1;\n\t when provided, a request includes the number of terms specified, improving the response times\n Returns \n {\n lst: [{\n sample, \n term1: {key, value}, \n term2: {key, values}, \n ...\n }],\n refs: {\n byTermId: {termIdorName1: {term, q}},\n bySampleId: {...}\n }\n }\n\t\n\t\n Expected server-data response\n {}\n .samples{}\n [sample]{}\n sample: the sample ID\n [$id]: {} // $id is tw id, not term id\n\t\t\t\tkey, value, // only used for dict term\n\t\t\t\tvalues:[]\n\t\t\t\t\t// used for non-dict term e.g. gene mutation\n\t\t\t\t\t{sample, ...mutation properties...}\n\t\n .refs{}\n .byTermId{}\n [$id]: {bins, etc} metadata for processed terms, useful\n for specifying value order, colors, etc.\n\t\t.bySampleId{}\n\t\t\t[sample]: {\n\t\t\t\tlabel:str, // required, the display name of this sample\n\t\t\t\totherLabels:[ {map to sjcloud}, {link to pbtp},] // optional, to define later\n\t\t\t}\n\t\t\tavailable sample name(s) mapped to each sample, for display only\n\n !!! NOTE !!!\n May fill in following attributes on term object if missing or met conditions:\n (the modifications are on term object and not tracked in state)\n\n tw.term.category2samplecount = {}\n tw.term.values={}\n */\n\tasync getAnnotatedSampleData(opts, _refs = {}) {\n\t\t// may check against required auth credentials for the server route\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\t\t// unlike scatter and violin, the matrix plot will NOT display anything\n\t\t// if sample names are not allowed to be displayed\n\t\t// TODO: may allow a request to proceed, but not display sampleNames???\n\t\t// Answer: showing multiple term values aligned for a sample can be considered identifying.\n\t\t// thus simply disable matrix plot if sample name is now allowed to show\n\t\tif (!headers) return\n\t\tconst filter = getNormalRoot(opts.filter)\n\t\tconst samples = {}\n\t\tconst refs = { byTermId: _refs.byTermId || {}, bySampleId: _refs.bySampleId || {} }\n\t\tconst promises = []\n\t\tconst samplesToShow = new Set()\n\n\t\t/************** tricky\n need list of gene names of current geneVariant terms from opts.terms[]\n\t\tassumption is that if this array is not empty,\n request for a dictionary term also from opts.terms[] will only retrieve samples mutated on this gene list, rather than whole cohort\n\t\tif currentGeneNames[] is empty, then dict term data return will not be restricted\n\t\t(even when this is needed, this is a poor fix as flat list of gene names does not allow restricting mclass or use genomic region)\n\n\t\t*************** and trickier\n\t\tdo not supply gene list if opts.isHierCluster is set!!! (doing hierarchical clustering)\n\t\tin such case, samples requested for dictionary term are based on those with data for hierCluster,\n\t\tbut not by mutation status of gene list\n */\n\t\tconst currentGeneNames =\n\t\t\topts.isHierCluster || opts.isSummary\n\t\t\t\t? null\n\t\t\t\t: opts.terms\n\t\t\t\t\t\t.filter(tw => tw.term.type === 'geneVariant')\n\t\t\t\t\t\t.map(tw => (tw.term.chr ? `${tw.term.chr}:${tw.term.start}-${tw.term.stop}` : tw.term.name))\n\t\t\t\t\t\t.sort() // sort the gene names by the default alphanumeric order to improve cache reuse even when terms are resorted\n\t\tconst allTerms2update = opts.terms.slice().sort((a, b) => (a.term.name < b.term.name ? -1 : 1)) // make copy of array as it will be truncated to empty. do not modify original\n\t\t// TODO: do not hardcode, detect from termdbConfig, if this approach is preferred\n\t\tconst maxNumTerms = opts.terms.length // this.vocab.dslabel === 'GDC' ? opts.terms.length : 1 // revert back to 1 to revert to previous behavior\n\t\tlet numResponses = 0\n\t\tif (opts.loadingDiv) opts.loadingDiv.html('Updating data ...')\n\n\t\twhile (true) {\n\t\t\tconst copies = getTerms2update(allTerms2update, maxNumTerms) // list of unique terms to update in this round\n\t\t\tif (copies.length == 0) break // at the end of list, break loop\n\t\t\tconst init = {\n\t\t\t\theaders,\n\t\t\t\tcredentials: 'include',\n\t\t\t\tbody: {\n\t\t\t\t\tfor: 'matrix',\n\t\t\t\t\tgenome: this.vocab.genome,\n\t\t\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t\t\t// one request per term\n\t\t\t\t\tterms: copies.map(this.getTwMinCopy),\n\t\t\t\t\tfilter,\n\t\t\t\t\tembedder: window.location.hostname\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (opts.signal) init.signal = opts.signal\n\n\t\t\tif (opts.filter0) init.body.filter0 = opts.filter0 // avoid adding \"undefined\" value\n\t\t\tif (opts.isHierCluster) init.body.isHierCluster = true // special arg from matrix, just pass along\n\t\t\tif (\n\t\t\t\tthis.vocab.dslabel == 'GDC' &&\n\t\t\t\tcopies.find(tw => tw.term.id && (!tw.term?.type || isDictionaryType(tw.term.type))) &&\n\t\t\t\tcurrentGeneNames?.length\n\t\t\t) {\n\t\t\t\t//term is dictionary term and there are gene terms,\n\t\t\t\t//add this to limit to mutated cases\n\t\t\t\tinit.body.currentGeneNames = currentGeneNames\n\t\t\t}\n\t\t\tpromises.push(\n\t\t\t\tdofetch3('termdb', init, { cacheAs: 'decoded' }).then(data => {\n\t\t\t\t\tif (data.error) throw data.error\n\t\t\t\t\tif (!data.refs.bySampleId) data.refs.bySampleId = {}\n\t\t\t\t\tfor (const tw of copies) {\n\t\t\t\t\t\tfor (const sampleId in data.samples) {\n\t\t\t\t\t\t\tconst sample = data.samples[sampleId]\n\t\t\t\t\t\t\t// ignore sample objects that are not annotated by other keys besides 'sample'\n\t\t\t\t\t\t\tif (!Object.keys(sample).filter(k => k != 'sample').length) continue\n\t\t\t\t\t\t\tsamplesToShow.add(sampleId)\n\t\t\t\t\t\t\tif (!(sampleId in samples)) {\n\t\t\t\t\t\t\t\t// normalize the expected data shape\n\t\t\t\t\t\t\t\tif (!data.refs.bySampleId[sampleId]) data.refs.bySampleId[sampleId] = {}\n\t\t\t\t\t\t\t\tif (typeof data.refs.bySampleId[sampleId] == 'string')\n\t\t\t\t\t\t\t\t\tdata.refs.bySampleId[sampleId] = { label: data.refs.bySampleId[sampleId] }\n\n\t\t\t\t\t\t\t\tconst _ref_ = data.refs.bySampleId[sampleId]\n\t\t\t\t\t\t\t\t// assign default sample ref values here\n\t\t\t\t\t\t\t\t// TODO: may assign an empty string value if not allowed to display sample IDs or names ???\n\t\t\t\t\t\t\t\tif (!_ref_.label) _ref_.label = sampleId\n\t\t\t\t\t\t\t\tconst s = {\n\t\t\t\t\t\t\t\t\tsample: sampleId,\n\t\t\t\t\t\t\t\t\t// must reserve _ref -> should not be used as a term.id or tw.$id\n\t\t\t\t\t\t\t\t\t_ref_\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsamples[sampleId] = s\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (tw.$id in sample) {\n\t\t\t\t\t\t\t\tif (tw.type == 'termCollection') {\n\t\t\t\t\t\t\t\t\tconst termsValue = JSON.parse(sample[tw.$id].value)\n\t\t\t\t\t\t\t\t\tconst sum = termsValue.reduce((a, o) => a + Object.values(o)[0], 0)\n\n\t\t\t\t\t\t\t\t\tlet pre_val_sum = 0\n\t\t\t\t\t\t\t\t\tconst values = []\n\t\t\t\t\t\t\t\t\tfor (const termV of termsValue) {\n\t\t\t\t\t\t\t\t\t\tconst label = Object.keys(termV)[0]\n\t\t\t\t\t\t\t\t\t\tconst value = (Object.values(termV)[0] / sum) * 100\n\t\t\t\t\t\t\t\t\t\tconst color = tw.term.termlst.find(t => t.name == label).color\n\t\t\t\t\t\t\t\t\t\tvalues.push({\n\t\t\t\t\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\t\t\t\tpre_val_sum,\n\t\t\t\t\t\t\t\t\t\t\tcolor\n\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\tpre_val_sum += value\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tsample[tw.$id].values = values\n\t\t\t\t\t\t\t\t\tdelete sample[tw.$id].value\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsamples[sampleId][tw.$id] = sample[tw.$id]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor (const sampleId in data.refs.bySampleId) {\n\t\t\t\t\t\t\trefs.bySampleId[sampleId] = data.refs.bySampleId[sampleId]\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trefs.byTermId[tw.$id] = tw\n\t\t\t\t\t\tif (tw.$id in data.refs.byTermId) {\n\t\t\t\t\t\t\trefs.byTermId[tw.$id] = Object.assign({}, refs.byTermId[tw.$id], data.refs.byTermId[tw.$id])\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tnumResponses++\n\t\t\t\t\tif (opts.loadingDiv) opts.loadingDiv.html(`Updating data (${numResponses}/${promises.length}) ...`)\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\t\ttry {\n\t\t\tif (opts.loadingDiv) opts.loadingDiv.html(`Updating data (0/${promises.length})`)\n\t\t\tawait Promise.all(promises)\n\t\t\tif (opts.loadingDiv) opts.loadingDiv.html('')\n\t\t} catch (e) {\n\t\t\tif (typeof e == 'string') {\n\t\t\t\tconst _e = e.toLowerCase()\n\t\t\t\t// TODO: standardize the auth error message across all SJ viz tools/portals,\n\t\t\t\t// which may be difficult since embedders can specify custom auth error messages,\n\t\t\t\t// or use an error object with separate code and string message\n\t\t\t\tif (\n\t\t\t\t\te.includes('token') ||\n\t\t\t\t\te.includes('jwt') ||\n\t\t\t\t\te.includes('login') ||\n\t\t\t\t\te.includes('sign') ||\n\t\t\t\t\te.includes('auth') ||\n\t\t\t\t\te.includes('credential')\n\t\t\t\t) {\n\t\t\t\t\t//\n\t\t\t\t\t// do not track non-auth related errors as a tokenVerificationMessage\n\t\t\t\t\t// only applies in SJ-portals where password or JWT auth tokens are used by embedders\n\t\t\t\t\t//\n\t\t\t\t\t// - app/viz must use vocabApi.hasVerifiedToken() method to verify access to tool features,\n\t\t\t\t\t// instead of relying on an empty string value for tokenVerificationMessage\n\t\t\t\t\t//\n\t\t\t\t\t// - !!! not used in the GDC portal, where auth is handled in the tool react wrapper + domain-based cookie session !!!\n\t\t\t\t\t//\n\t\t\t\t\tthis.tokenVerificationMessage = e\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow e\n\t\t}\n\t\ttry {\n\t\t\tif (opts.loadingDiv) opts.loadingDiv.html(`Processing data ...`)\n\t\t\tconst dictTerm$ids = opts.terms.filter(tw => isDictionaryType(tw.term.type)).map(tw => tw.$id)\n\t\t\t// const lst = Object.values(samples)\n\n\t\t\t// NOTE: Reactivated so that filtering works as expectd for pnet, mbmeta, etc\n\t\t\t// verified to work with two GDC matrix examples\n\t\t\t// TODO: verify with other GDC examples???\n\t\t\tconst lst = []\n\t\t\tif (!dictTerm$ids.length) {\n\t\t\t\t// If there are no dictionary terms, okay to show any samples with geneVariants\n\t\t\t\tlst.push(...Object.values(samples))\n\t\t\t} else {\n\t\t\t\t// If there are dictionary terms, only show samples that have been annotated\n\t\t\t\t// for at least one dictionary term, otherwise do NOT show samples that\n\t\t\t\t// are only annotated for non-dictionary terms like gene variants\n\t\t\t\t// NOTE: there is an exception when using matrix?.settings?.displayDictRowWithNoValues\n\t\t\t\tfor (const sampleId in samples) {\n\t\t\t\t\tconst row = samples[sampleId]\n\t\t\t\t\tfor (const $id in row) {\n\t\t\t\t\t\tif (dictTerm$ids.includes($id)) {\n\t\t\t\t\t\t\tlst.push(row)\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (!lst.length && this.termdbConfig?.matrix?.settings?.displayDictRowWithNoValues) {\n\t\t\t\t\t// this prevents the display of 'no matching sample data for the current gene list',\n\t\t\t\t\t// which may be confusing if there is data for genes but not for dictionary terms\n\t\t\t\t\tlst.push(...Object.values(samples))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst sampleFilter = new RegExp(opts.sampleNameFilter || '.*')\n\t\t\tconst data = {\n\t\t\t\tlst: lst.filter(row => samplesToShow.has(row.sample) && sampleFilter.test(row.sample)),\n\t\t\t\trefs\n\t\t\t}\n\t\t\tdata.samples = data.lst.reduce((obj, row) => {\n\t\t\t\tobj[row.sample] = row\n\t\t\t\treturn obj\n\t\t\t}, {})\n\n\t\t\tfor (const tw of opts.terms) {\n\t\t\t\tmayFillInCategory2samplecount4term(tw, data.lst, this.termdbConfig)\n\t\t\t}\n\t\t\treturn data\n\t\t} catch (e) {\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t// ids: [str], where str are string term IDS or names\n\tasync getTermTypes(ids) {\n\t\tconst init = {\n\t\t\tbody: {\n\t\t\t\tfor: 'termTypes',\n\t\t\t\tgenome: this.vocab.genome,\n\t\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t\tids: JSON.stringify(ids)\n\t\t\t}\n\t\t}\n\t\tconst data = await dofetch3('termdb', init, this.opts.fetchOpts)\n\t\tif (data.error) throw data.error\n\t\treturn data\n\t}\n\n\tasync getLDdata(tkname, m) {\n\t\tconst body = {\n\t\t\tgetLDdata: 1,\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tldtkname: tkname,\n\t\t\tm: { chr: m.chr, pos: m.pos, ref: m.ref, alt: m.alt }\n\t\t}\n\t\treturn await dofetch3('termdb', { body })\n\t}\n\n\tasync getScatterData(opts, signal = undefined) {\n\t\t// the scatter plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\t\t// dofetch* mayAdjustRequest() will automatically\n\t\t// convert to GET query params or POST body, as needed\n\t\tconst body = {\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tplotName: opts.name,\n\t\t\tcoordTWs: opts.coordTWs?.map(tw => this.getTwMinCopy(tw)),\n\t\t\tfilter: getNormalRoot(opts.filter),\n\t\t\tfilter0: opts.filter0,\n\t\t\tembedder: window.location.hostname,\n\t\t\tsingleCellPlot: opts.singleCellPlot,\n\t\t\tchartType: opts.chartType\n\t\t}\n\t\tif (opts.colorColumn) body.colorColumn = opts.colorColumn\n\t\tif (opts.colorTW) body.colorTW = this.getTwMinCopy(opts.colorTW)\n\t\tif (opts.shapeTW) body.shapeTW = this.getTwMinCopy(opts.shapeTW)\n\t\tif (opts.divideByTW) body.divideByTW = this.getTwMinCopy(opts.divideByTW)\n\t\tif (opts.scaleDotTW) body.scaleDotTW = this.getTwMinCopy(opts.scaleDotTW)\n\t\tbody.excludeOutliers = opts.excludeOutliers\n\t\tconst data = await dofetch3('termdb/sampleScatter', { headers, body, signal })\n\t\treturn data\n\t}\n\n\tasync getDefaultBins(opts) {\n\t\t// the scatter plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\t\tconst body = {\n\t\t\tfor: 'getDefaultBins',\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\ttw: opts.tw,\n\t\t\tembedder: window.location.hostname\n\t\t}\n\t\tconst tf = this.opts?.state?.termfilter\n\t\tif (tf) {\n\t\t\tif (tf.filter) body.filter = getNormalRoot(tf.filter)\n\t\t\tif (tf.filter0) body.filter0 = tf.filter0\n\t\t}\n\t\treturn await dofetch3('termdb', { headers, body })\n\t}\n\n\t// it's safer to separately treat term and q as persisted objects but not tw,\n\t// since tw may have been constructed only as an argument for this function\n\t// and not as a persisted object elsewhere\n\tasync setTermBins({ $id, term, q }) {\n\t\t//TODO use the PresetNumericBins type for presetBins\n\t\tconst presetBins = await this.getDefaultBins({ tw: { $id, term, q } })\n\t\tif ('error' in presetBins) throw presetBins.error\n\t\t// NOTE: if term is frozen, creating an unfrozen copy here will\n\t\t// not propagate changes to the original term\n\t\tterm.bins = presetBins\n\t\tif (q.mode == 'discrete' && !q.type) {\n\t\t\t// only fill-in q if missing values are detected\n\t\t\tconst currMode = q.mode // record current mode before q{} is overriden\n\t\t\tfor (const key in q) {\n\t\t\t\tif (key != 'isAtomic') delete q[key]\n\t\t\t}\n\t\t\tObject.assign(q, term.bins.default)\n\t\t\tq.mode = currMode\n\t\t}\n\t}\n\n\tasync getSingleSampleData(opts) {\n\t\t// the scatter plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\n\t\t// dofetch* mayAdjustRequest() will automatically\n\t\t// convert to GET query params or POST body, as needed\n\t\tconst body = {\n\t\t\tfor: 'singleSampleData',\n\t\t\tsampleId: opts.sampleId,\n\t\t\tterm_ids: opts.term_ids,\n\t\t\tfilter: getNormalRoot(opts.filter),\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tembedder: window.location.hostname\n\t\t}\n\t\tconst data = await dofetch3('termdb', { headers, body })\n\t\tconst byTermId = {}\n\t\tif ('error' in data) return data\n\t\tfor (const row of data) {\n\t\t\tconst term = JSON.parse(row.jsondata)\n\t\t\tbyTermId[row.term_id] = { value: row.value, term }\n\t\t}\n\t\treturn byTermId\n\t}\n\n\tasync getAllSamples() {\n\t\t// the scatter plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\n\t\t// dofetch* mayAdjustRequest() will automatically\n\t\t// convert to GET query params or POST body, as needed\n\t\tconst body = {\n\t\t\tfor: 'getAllSamples',\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tembedder: window.location.hostname\n\t\t}\n\t\tconst data = await dofetch3('termdb', { headers, body })\n\t\treturn data\n\t}\n\n\tasync getSamplesByName(opts) {\n\t\t// the scatter plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\n\t\t// dofetch* mayAdjustRequest() will automatically\n\t\t// convert to GET query params or POST body, as needed\n\t\tconst body = {\n\t\t\tfor: 'getSamplesByName',\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tembedder: window.location.hostname\n\t\t}\n\t\tif (opts?.filter) body.filter = getNormalRoot(opts.filter)\n\t\tconst data = await dofetch3('termdb', { headers, body })\n\t\treturn data\n\t}\n\n\tasync getProfileFacilities() {\n\t\t// the scatter plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = await this.mayGetAuthHeaders('termb')\n\n\t\t// dofetch* mayAdjustRequest() will automatically\n\t\t// convert to GET query params or POST body, as needed\n\t\tconst body = {\n\t\t\tfor: 'getProfileFacilities',\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tembedder: window.location.hostname\n\t\t}\n\t\tconst data = await dofetch3('termdb', { headers, body })\n\t\tconst result = []\n\t\tfor (const row of data) result.push(row.name)\n\t\treturn result\n\t}\n\n\tasync getLowessCurve(opts) {\n\t\t// the scatter plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = await this.mayGetAuthHeaders('termb')\n\n\t\t// dofetch* mayAdjustRequest() will automatically\n\t\t// convert to GET query params or POST body, as needed\n\t\tconst body = {\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tgetLowessCurve: 1,\n\t\t\tcoords: opts.coords\n\t\t}\n\n\t\treturn await dofetch3('termdb', { headers, body })\n\t}\n\n\tasync getMultivalueTWs(opts) {\n\t\tconst headers = await this.mayGetAuthHeaders('termb')\n\n\t\t// dofetch* mayAdjustRequest() will automatically\n\t\t// convert to GET query params or POST body, as needed\n\t\tconst body = {\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\tfor: 'getMultivalueTWs',\n\t\t\tparent_id: opts.parent_id\n\t\t}\n\t\treturn await dofetch3('termdb', { headers, body })\n\t}\n\n\tasync getCohortsData(opts) {\n\t\tconst body = {\n\t\t\tgenome: this.state.vocab.genome,\n\t\t\tdslabel: this.state.vocab.dslabel\n\t\t}\n\t\treturn await dofetch3('termdb/cohorts', { body })\n\t}\n\n\tasync getMatrixByName(name) {\n\t\t// find a pre-built matrix by name from this dataset\n\t\treturn await dofetch3('termdb', {\n\t\t\tbody: {\n\t\t\t\tfor: 'matrix',\n\t\t\t\tgetPlotDataByName: name,\n\t\t\t\tgenome: this.state.vocab.genome,\n\t\t\t\tdslabel: this.state.vocab.dslabel\n\t\t\t}\n\t\t})\n\t}\n\n\tasync getNumericDictTermClusterByName(name) {\n\t\t// find a pre-built numericDictTermCluster by name from this dataset\n\t\treturn await dofetch3('termdb', {\n\t\t\tbody: {\n\t\t\t\tfor: 'numericDictTermCluster',\n\t\t\t\tgetPlotDataByName: name,\n\t\t\t\tgenome: this.state.vocab.genome,\n\t\t\t\tdslabel: this.state.vocab.dslabel\n\t\t\t}\n\t\t})\n\t}\n\n\tasync getMutationSignatureByName(name) {\n\t\t// find a pre-built numericDictTermCluster by name from this dataset\n\t\treturn await dofetch3('termdb', {\n\t\t\tbody: {\n\t\t\t\tfor: 'mutationSignature',\n\t\t\t\tgetPlotDataByName: name,\n\t\t\t\tgenome: this.state.vocab.genome,\n\t\t\t\tdslabel: this.state.vocab.dslabel\n\t\t\t}\n\t\t})\n\t}\n\tasync getTopVariablyExpressedGenes(arg) {\n\t\treturn await dofetch3('termdb/topVariablyExpressedGenes', { method: 'GET', body: arg })\n\t}\n\n\tasync getTopTermsByType(args) {\n\t\targs.genome = this.state.vocab.genome\n\t\targs.dslabel = this.state.vocab.dslabel\n\t\tif (args.filter) args.filter = getNormalRoot(args.filter)\n\t\treturn await dofetch3('termdb/getTopTermsByType', { method: 'GET', body: args })\n\t}\n\n\tasync getSampleImages(sampleId) {\n\t\tconst args = {}\n\t\targs.genome = this.state.vocab.genome\n\t\targs.dslabel = this.state.vocab.dslabel\n\t\targs.sampleId = sampleId\n\t\treturn await dofetch3('termdb/getSampleImages', { method: 'GET', body: args })\n\t}\n\n\t/* \n\t\tsamples[]\t\t\t\t\t!!! CRITICAL: the samples data must not be modified !!!\n\t\t\tsample{} \t\t\t the source sample object, will not be changed directly\n\t\t\t\t[attr.from] any collection of keys from the attributes[] argument\n\n\t\tattributes[]\n\t\t\t.attr{}\n\t\t\t\t.from string, the object to map from, required\n\t\t\t\t.to string, the object to map to, optional\n\t\t\t\t.convert optional step, somehow the caller must know this is needed?\n\t*/\n\tasync convertSampleId(samples, attributes) {\n\t\t// first pass of attributes[] and perform id conversion\n\t\tconst byAttr = new Map()\n\t\tconst bySample = []\n\t\t// !!! do NOT modify the sample object or samples array\n\t\tfor (const sample of samples) {\n\t\t\tconst obj = {}\n\t\t\tbySample.push(obj)\n\t\t\tfor (const attr of attributes) {\n\t\t\t\tif (!('to' in attr)) attr.to = attr.from\n\t\t\t\tif (!attr.convert) {\n\t\t\t\t\t// can be filled-in without a server request\n\t\t\t\t\tobj[attr.to] = sample[attr.from]\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\t// this attr requires conversion;\n\t\t\t\t// collect all values from all samples and later call server for each attribute? //once to convert\n\t\t\t\tif (!byAttr.has(attr)) byAttr.set(attr, {})\n\t\t\t\tconst fromValMap = byAttr.get(attr)\n\t\t\t\tconst v = sample[attr.from]\n\t\t\t\tif (!fromValMap[v]) fromValMap[v] = []\n\t\t\t\tfromValMap[v].push({ obj, sample })\n\t\t\t}\n\t\t}\n\n\t\t// perform the required conversion of sample attributes\n\t\tconst promises = []\n\t\tfor (const [attr, fromValMap] of byAttr) {\n\t\t\tconst inputs = Object.keys(fromValMap)\n\t\t\tpromises.push(\n\t\t\t\tawait dofetch3('termdb', {\n\t\t\t\t\tbody: {\n\t\t\t\t\t\tfor: 'convertSampleId',\n\t\t\t\t\t\tinputs,\n\t\t\t\t\t\tgenome: this.state.vocab.genome,\n\t\t\t\t\t\tdslabel: this.state.vocab.dslabel\n\t\t\t\t\t}\n\t\t\t\t}).then(r => {\n\t\t\t\t\tfor (const v of inputs) {\n\t\t\t\t\t\tfor (const { sample, obj } of fromValMap[v]) {\n\t\t\t\t\t\t\tobj[attr.to] = r.mapping[v]\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\n\t\tawait Promise.all(promises)\n\t\treturn bySample\n\t}\n\n\tasync getCorrelationVolcanoData(arg, _body = {}) {\n\t\t// Is this auth needed for this plot??\n\t\tconst headers = await this.mayGetAuthHeaders('termdb')\n\n\t\t//Add more args here (e.g. filter, etc. )\n\t\targ.featureTw = this.getTwMinCopy(arg.featureTw)\n\t\tfor (const tw of arg.variableTwLst) {\n\t\t\tthis.getTwMinCopy(tw)\n\t\t}\n\n\t\tconst body = Object.assign(\n\t\t\t{\n\t\t\t\tgenome: this.vocab.genome,\n\t\t\t\tdslabel: this.vocab.dslabel\n\t\t\t},\n\t\t\targ,\n\t\t\t_body\n\t\t)\n\n\t\tif (body.filter) body.filter = getNormalRoot(body.filter)\n\t\tconst d = await dofetch3('termdb/correlationVolcano', { headers, body })\n\n\t\treturn d\n\t}\n\n\tasync filterTermValues(args) {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t...args\n\t\t}\n\t\tif (body.filter) body.filter = getNormalRoot(body.filter)\n\t\tif (body.terms) {\n\t\t\tbody.terms = structuredClone(body.terms)\n\t\t\tfor (const tw of body.terms) {\n\t\t\t\tthis.mayStripTwProps(tw)\n\t\t\t}\n\t\t}\n\t\tif (body.facilityTW) this.mayStripTwProps(body.facilityTW)\n\t\treturn await dofetch3('termdb/filterTermValues', { body })\n\t}\n\n\tasync getProfileScores(args) {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t...args\n\t\t}\n\t\tif (body.filter) body.filter = getNormalRoot(body.filter)\n\t\tbody.facilityTW = structuredClone(body.facilityTW)\n\t\tthis.mayStripTwProps(body.facilityTW)\n\t\tif (body.scoreTerms) {\n\t\t\t// replace with a mutable copy\n\t\t\tbody.scoreTerms = structuredClone(body.scoreTerms)\n\t\t\tfor (const t of body.scoreTerms) {\n\t\t\t\tif (typeof t.maxScore != 'number') this.mayStripTwProps(t.maxScore)\n\t\t\t\tthis.mayStripTwProps(t.score)\n\t\t\t}\n\t\t}\n\t\treturn await dofetch3('termdb/profileScores', { body })\n\t}\n\n\tasync getProfileFormScores(args) {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t...args\n\t\t}\n\t\tif (body.filter) body.filter = getNormalRoot(body.filter)\n\t\tif (body.terms) {\n\t\t\tfor (const t of body.terms) {\n\t\t\t\tif (t.term.id) t.term = { id: t.term.id }\n\t\t\t}\n\t\t}\n\t\treturn await dofetch3('termdb/profileFormScores', { body })\n\t}\n\n\t// strip some tw properties that\n\t// - are not used in the server (relevant to only client-side code),\n\t// - may recovered on the server side such as for dictionary terms\n\tmayStripTwProps(tw) {\n\t\tif (!tw) return\n\t\tdelete tw.type // TODO: may keep this if needed by the backend code\n\t\tdelete tw.isAtomic\n\t\tdelete tw.hiddenValues\n\t\tdelete tw.q.isAtomic\n\t\tdelete tw.q.hiddenValues\n\t\t// the full term object may be sql-queried on the server side,\n\t\t// no need to include the full body in the request payload\n\t\tif (tw.term.id && (!tw.term.type || isDictionaryType(tw.term.type))) tw.term = { id: tw.term.id }\n\t}\n\n\tasync buildAdHocDictionary() {\n\t\tconst body = {\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\tgenome: this.vocab.genome,\n\t\t\tfor: 'buildAdHocDictionary'\n\t\t}\n\t\treturn await dofetch3('termdb', { method: 'GET', body })\n\t}\n\n\tasync getFilteredAiImages(project, filter) {\n\t\tconst body = {\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel,\n\t\t\t// make a copy of the project object\n\t\t\tproject: Object.assign({}, project, { filter: getNormalRoot(filter) }),\n\t\t\tfor: 'filterImages'\n\t\t}\n\n\t\treturn await dofetch3('aiProjectAdmin', { body })\n\t}\n}\n\n/*\nInput:\n tw {\n $id\n term { type }\n }\n lst[]\n each element is annotation object for a sample\n sample: samplename\n [$termid] : {}\n .key\n category key for this category?\n .value\n category label for this category?\n .filteredValues[]\nOutput:\n none\n\nif a term is eligible, modify term object as below:\n- create tw.term.category2samplecount = {categoryKey: count}\n- fill in tw.term.values{}, see below\n*/\nfunction mayFillInCategory2samplecount4term(tw, lst, termdbConfig) {\n\t// define conditions when not to do it\n\tif (tw.term.type != 'categorical') {\n\t\t// for now only do it for categorical term\n\t\treturn\n\t}\n\tif (!('$id' in tw)) {\n\t\t// tw.$id not found\n\t\treturn\n\t}\n\tconst k2c = {} // key: category key, value: sample count annotated to this category\n\tconst k2label = {} // key: category key, value: category label\n\tfor (const s of lst) {\n\t\tif (!s[tw.$id]) continue // sample is not annotated by this term\n\t\tconst categoryKey = s[tw.$id].key\n\t\tk2c[categoryKey] = 1 + (k2c[categoryKey] || 0)\n\t\tk2label[categoryKey] = { key: categoryKey, label: categoryKey }\n\t}\n\ttw.term.category2samplecount = k2c\n\n\t/* one of three conditions on whether to fill tw.term.values{}\n\t- with the flag from termdbConfig, e.g. all gdc categorical terms are with blank \"values{}\" and should be refilled everytime\n\t refilling everytime data is loaded helps with groupsetting changes, when a refill is needed to flush out old settings\n\t e.g. canceling groupsetting\n\t- missing term.values{}\n\t- blank term.values{}\n\t*/\n\tif (termdbConfig.alwaysRefillCategoricalTermValues || !tw.term.values || Object.keys(tw.term.values).length == 0) {\n\t\ttw.term.values = k2label\n\t}\n}\n\n/*\nfrom input list of termwrappers, get up to \"count\" number of unique tw and return in new list; original lst will be truncated\ncopies cannot contain multiple tw of same term, e.g. matrix can have same age term in two rows as continuous and discrete, having 2 age tw will confuse downstream code of getAnnotatedSampleData()\nduplicating tw will be pushed to the end of lst and are returned one at a time\n*/\nfunction getTerms2update(lst, count) {\n\tconst copies = []\n\tlet i = 0,\n\t\tn = lst.length\n\twhile (i < n) {\n\t\ti++\n\t\tconst tw = lst.shift() // first of lst[]\n\t\tif (\n\t\t\tcopies.find(\n\t\t\t\tc =>\n\t\t\t\t\tc.term.type === tw.term.type &&\n\t\t\t\t\t((('id' in c.term || 'id' in tw.term) && c.term.id === tw.term.id) || c.term.name === tw.term.name)\n\t\t\t)\n\t\t) {\n\t\t\t// tw already exists in copies[], do not put into copies[], put it at the end of lst to be processed later\n\t\t\tlst.push(tw)\n\t\t} else {\n\t\t\t// tw is not in copies[], which should only contain up to \"count\" of unique terms\n\t\t\tcopies.push(tw)\n\t\t}\n\t\tif (copies.length >= count) break\n\t}\n\treturn copies\n}\n", "import { getBarchartData, getCategoryData } from '../plots/barchart.data'\nimport { scaleLinear } from 'd3-scale'\nimport { sample_match_termvaluesetting } from '#common/termutils'\nimport { isUsableTerm } from '#shared/termdb.usecase.js'\nimport { isNumeric } from '#shared/helpers.js'\nimport computePercentile from '#shared/compute.percentile.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { Vocab } from './Vocab'\n\nexport class FrontendVocab extends Vocab {\n\tconstructor(opts) {\n\t\tsuper(opts)\n\t\tthis.datarows = []\n\t\tif (opts.state.vocab.sampleannotation) {\n\t\t\tconst anno = opts.state.vocab.sampleannotation\n\t\t\tObject.keys(anno).forEach(sample => this.datarows.push({ sample, data: anno[sample] }))\n\t\t}\n\t}\n\n\tgetTermdbConfig() {\n\t\treturn { selectCohort: this.vocab.selectCohort, supportedChartTypes: [] }\n\t}\n\n\tgetTermChildren(term, cohortValuelst) {\n\t\tconst cohortValuestr = (cohortValuelst || []).slice().sort().join(',')\n\t\t// TODO: handle treeFilter\n\t\tconst parent_id = term.__tree_isroot ? null : term.id\n\t\treturn {\n\t\t\tlst: this.vocab.terms.filter(\n\t\t\t\tt =>\n\t\t\t\t\tt.parent_id === parent_id &&\n\t\t\t\t\t(!cohortValuestr.length || cohortValuestr === t.cohortValues.slice().sort.join(','))\n\t\t\t)\n\t\t}\n\t}\n\n\t// from termdb/plot\n\tasync getNestedChartSeriesData(opts) {\n\t\tconst q = {\n\t\t\tterm1: opts.term ? opts.term.term : {},\n\t\t\tterm1_q: opts.term ? opts.term.q : undefined,\n\t\t\tterm0: opts.term0 ? opts.term0.term : undefined,\n\t\t\tterm0_q: opts.term0 ? opts.term0.q : undefined,\n\t\t\tterm2: opts.term2 ? opts.term2.term : undefined,\n\t\t\tterm2_q: opts.term2 ? opts.term2.q : undefined,\n\t\t\tfilter: this.state.termfilter && this.state.termfilter.filter\n\t\t}\n\t\treturn getBarchartData(q, this.datarows)\n\t}\n\n\t/*\n May override certain term-related configuration (like bins),\n from the server response data to the corresponding term's \n current state.\n\n Arguments\n config\n - chart configuration object with termwrappers of\n term (required), term0 (optional) and term2 (optional)\n\n - data\n server response data in the format of \n {\n charts: [{\n chartId: '...',\n serieses: [{\n seriesId: '...',\n data: [{\n dataId: '...',\n total: *samplecount*\n }, ...],\n total: *samplecount*\n }, ...],\n total: *samplecount*\n }, ...],\n\n refs: {...}\n }\n */\n\tsyncTermData(config, data, prevConfig = {}) {\n\t\tif (!data || !data.refs) return\n\t\tfor (const [i, key] of ['term0', 'term', 'term2'].entries()) {\n\t\t\tconst term = config[key]\n\t\t\tif (term == 'genotype') return\n\t\t\tif (!term) {\n\t\t\t\tif (key == 'term') throw `missing plot.term{}`\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (data.refs.bins) {\n\t\t\t\tterm.bins = data.refs.bins[i]\n\t\t\t\tif (data.refs.q && data.refs.q[i]) {\n\t\t\t\t\tif (!term.q) term.q = {}\n\t\t\t\t\tconst q = data.refs.q[i]\n\t\t\t\t\tif (q !== term.q) {\n\t\t\t\t\t\tfor (const key in term.q) delete term.q[key]\n\t\t\t\t\t\tObject.assign(term.q, q)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!term.q) term.q = {}\n\t\t}\n\t}\n\n\t// from termdb/search\n\tasync findTerm(str, cohortStr, usecase = null) {\n\t\treturn {\n\t\t\tlst: this.vocab.terms.filter(\n\t\t\t\tt => t.name.includes(str) && (!cohortStr || cohortStr === t.cohortValues.slice().sort.join(','))\n\t\t\t)\n\t\t}\n\t}\n\n\t// from termdb/terminfo\n\tasync getTermInfo(id) {\n\t\tconst term = this.vocab.find(t => t.id === id)\n\t\tif (!term) return undefined\n\t\treturn { terminfo: t.info }\n\t}\n\n\t// from termdb/nav\n\tasync getCohortSampleCount(cohortName) {\n\t\tif (!cohortName) return\n\t\tconst term = this.vocab.find(t => t.id === id)\n\t\tif (!term || !term.cohortValues.includes(cohortName)) return\n\t\tif (!term.samplecount) term.samplecount = {}\n\t\tif (!(cohortName in term.samplecount)) {\n\t\t\tterm.samplecount[cohortName] = Object.keys(this.vocab.sampleannotation).length\n\t\t}\n\t\treturn { samplecount: term.samplecount[cohortName] }\n\t}\n\n\t/*** To-Do ***/\n\n\tasync getCohortsData(opts) {\n\t\treturn null\n\t}\n\n\tasync getFilteredSampleCount(filterJSON) {\n\t\t/*\n\t\tif (!cohortName) return\n\t\tconst term = this.vocab.find(t => t.id === id)\n\t\tif (!term || !term.cohortValues.includes(cohortName)) return\n\t\tif (!term.samplecount) term.samplecount = {}\n\t\tif (!(cohortName in term.samplecount)) {\n\t\t\tterm.samplecount[cohortName] = Object.keys(this.vocab.sampleannotation).length\n\t\t}\n\t\t*/\n\t\treturn 'TBD'\n\t}\n\n\tasync getDensityPlotData(term_id, num_obj, filter) {\n\t\tif (!this.datarows || !this.datarows.length) {\n\t\t\t// support adhoc dictionary or vocab terms without sample annotations\n\t\t\tconst term = this.vocab.terms.find(t => t.id === term_id)\n\t\t\tconst minvalue = term.range && term.range\n\t\t\treturn {\n\t\t\t\tminvalue: term.range && term.range.start,\n\t\t\t\tmaxvalue: term.range && term.range.stop\n\t\t\t}\n\t\t}\n\n\t\tconst values = []\n\t\tconst distinctValues = new Set()\n\t\tlet minvalue,\n\t\t\tmaxvalue,\n\t\t\tsamplecount = 0\n\t\tlet samples = {}\n\t\tfor (const anno of this.datarows) {\n\t\t\tif (samples[anno.sample]) continue\n\t\t\tconst data = anno.s || anno.data\n\t\t\tif (data && sample_match_termvaluesetting(data, filter)) {\n\t\t\t\tsamples[anno.sample] = this.vocab.sampleannotation[anno.sample]\n\t\t\t}\n\t\t}\n\n\t\tfor (const sample in samples) {\n\t\t\tif (!(term_id in this.vocab.sampleannotation[sample])) continue\n\t\t\tconst _v = this.vocab.sampleannotation[sample][term_id]\n\t\t\tif (isNumeric(_v)) {\n\t\t\t\tconst v = +_v\n\t\t\t\tsamplecount += 1\n\t\t\t\tif (minvalue === undefined || v < minvalue) minvalue = v\n\t\t\t\tif (maxvalue === undefined || v > maxvalue) maxvalue = v\n\t\t\t\tvalues.push(v)\n\t\t\t\tdistinctValues.add(v)\n\t\t\t}\n\t\t}\n\n\t\tconst term = this.vocab.terms.find(t => t.id == term_id)\n\t\tconst default_ticks_n = 40\n\t\tconst ticks_n =\n\t\t\tterm.type == 'integer' && maxvalue - minvalue < default_ticks_n\n\t\t\t\t? maxvalue - minvalue\n\t\t\t\t: term.type == 'float' && distinctValues.size < default_ticks_n\n\t\t\t\t? distinctValues\n\t\t\t\t: default_ticks_n\n\t\tconst xscale = scaleLinear()\n\t\t\t.domain([minvalue, maxvalue])\n\t\t\t.range([num_obj.plot_size.xpad, num_obj.plot_size.width - num_obj.plot_size.xpad])\n\t\tconst density = get_histogram(xscale.ticks(ticks_n))(values)\n\n\t\treturn {\n\t\t\tdensity,\n\t\t\tdensitymax: density.reduce((maxv, v, i) => (i === 0 || v[1] > maxv ? v[1] : maxv), 0),\n\t\t\tminvalue,\n\t\t\tmaxvalue,\n\t\t\tsamplecount\n\t\t}\n\t}\n\n\tasync getPercentile(term, percentile_lst, filter) {\n\t\t// for a numeric term, convert a percentile to an actual value, with respect to a given filter\n\t\tif (percentile_lst.find(p => !Number.isInteger(p))) throw 'non-integer percentiles found'\n\t\tif (Math.max(...percentile_lst) > 99 || Math.min(...percentile_lst) < 1) throw 'percentiles must be between 1-99'\n\t\tconst perc_values = []\n\t\tconst values = []\n\t\tconst samples = {}\n\t\tfor (const anno of this.datarows) {\n\t\t\tif (samples[anno.sample]) continue\n\t\t\tconst data = anno.s || anno.data\n\t\t\tif (data && sample_match_termvaluesetting(data, filter)) {\n\t\t\t\tsamples[anno.sample] = this.vocab.sampleannotation[anno.sample]\n\t\t\t}\n\t\t}\n\t\tfor (const sample in samples) {\n\t\t\tif (!(term.id in this.vocab.sampleannotation[sample])) continue\n\t\t\tconst _v = Number(this.vocab.sampleannotation[sample][term.id])\n\t\t\tif (!Number.isFinite(_v)) throw 'non-numeric value'\n\t\t\tvalues.push(_v)\n\t\t}\n\n\t\tvalues.sort((a, b) => a - b)\n\t\tfor (const percentile of percentile_lst) {\n\t\t\tconst perc_value = computePercentile(values, percentile, true)\n\t\t\tperc_values.push(perc_value)\n\t\t}\n\n\t\treturn { values: perc_values }\n\t}\n\n\tasync getDescrStats(term_id, filter, settings) {\n\t\t//TODO add in case for settings?\n\t\t// for a numeric term, get descriptive statistics\n\t\t// mean, median, standard deviation, min, max\n\n\t\tconst values = []\n\t\tconst samples = {}\n\n\t\tfor (const anno of this.datarows) {\n\t\t\tif (samples[anno.sample]) continue\n\t\t\tconst data = anno.s || anno.data\n\t\t\tif (data && sample_match_termvaluesetting(data, filter)) {\n\t\t\t\tsamples[anno.sample] = this.vocab.sampleannotation[anno.sample]\n\t\t\t}\n\t\t}\n\n\t\tfor (const sample in samples) {\n\t\t\tif (!(term_id in this.vocab.sampleannotation[sample])) continue\n\t\t\tconst _v = Number(this.vocab.sampleannotation[sample][term_id])\n\t\t\tif (!Number.isFinite(_v)) throw 'non-numeric value'\n\t\t\tvalues.push(_v)\n\t\t}\n\n\t\treturn computeDescrStats(values)\n\t}\n\n\tasync getTerms(ids, _dslabel = null, _genome = null) {\n\t\tif (!ids) throw 'getTerms: ids missing'\n\t\tif (!Array.isArray(ids)) throw `invalid ids` // should use typescript\n\t\tconst terms = {}\n\t\tfor (const id of ids) {\n\t\t\tconst term = this.vocab.terms.find(t => t.id === id)\n\t\t\tif (term) terms[id] = term\n\t\t}\n\t\treturn terms\n\t}\n\n\tasync getterm(termid) {\n\t\tif (!termid) throw 'getterm: termid missing'\n\t\treturn this.vocab.terms.find(d => d.id == termid)\n\t}\n\n\tasync getCategories(term, filter, lst = null) {\n\t\tconst q = { term, filter }\n\t\tconst data = getCategoryData(q, this.datarows)\n\t\treturn data\n\t}\n\tgetNumericUncomputableCategories(term, filter) {\n\t\tthrow 'to be implemented!! getNumericUncomputableCategories'\n\t}\n\n\tgraphable(term) {\n\t\tif (!term) throw 'graphable: term is missing'\n\t\treturn isUsableTerm(term).has('plot')\n\t}\n\n\tq_to_param(q) {\n\t\t// exclude certain attributes of q from dataName\n\t\tconst q2 = JSON.parse(JSON.stringify(q))\n\t\tdelete q2.hiddenValues\n\t\treturn encodeURIComponent(JSON.stringify(q2))\n\t}\n}\n\nfunction get_histogram(ticks) {\n\treturn values => {\n\t\t// array of {value}\n\t\tconst bins = []\n\t\tfor (let i = 0; i < ticks.length; i++) bins.push([ticks[i], 0])\n\t\tfor (const v of values) {\n\t\t\tfor (let i = 1; i < ticks.length; i++) {\n\t\t\t\tif (v <= ticks[i]) {\n\t\t\t\t\tbins[i - 1][1]++\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn bins\n\t}\n}\n\n// function to compute descriptive statistics for an\n// array of numeric values\nfunction computeDescrStats(values, showOutlierRange = false) {\n\tif (!values.length) {\n\t\t// no values, do not get stats as it breaks code\n\t\t// set result to blank obj to avoid \"missing response.header['content-type']\" err on client\n\t\treturn {}\n\t}\n\n\tif (values.some(v => !Number.isFinite(v))) throw new Error('non-numeric values found')\n\n\t//compute total\n\tconst sorted_arr = values.sort((a, b) => a - b)\n\tconst n = sorted_arr.length\n\n\t//compute median\n\tconst median = computePercentile(sorted_arr, 50, true)\n\t//compute mean\n\tconst mean = getMean(sorted_arr)\n\t// compute variance\n\tconst variance = getVariance(sorted_arr)\n\t// compute standard deviation\n\tconst stdDev = Math.sqrt(variance)\n\n\t//compute percentile ranges\n\tconst p25 = computePercentile(sorted_arr, 25, true)\n\tconst p75 = computePercentile(sorted_arr, 75, true)\n\n\t//compute IQR\n\tconst IQR = p75 - p25\n\tconst min = sorted_arr[0]\n\tconst max = sorted_arr[sorted_arr.length - 1]\n\n\t// Calculate outlier boundaries\n\tconst outlierMin = p25 - 1.5 * IQR //p25 is same as q1\n\tconst outlierMax = p75 + 1.5 * IQR //p75 is same as q3\n\n\tconst stats = {\n\t\ttotal: { label: 'Total', value: n },\n\t\tmin: { label: 'Minimum', value: min },\n\t\tp25: { label: '1st quartile', value: p25 },\n\t\tmedian: { label: 'Median', value: median },\n\t\tp75: { label: '3rd quartile', value: p75 },\n\t\tmax: { label: 'Maximum', value: max },\n\t\tmean: { label: 'Mean', value: mean },\n\t\tstdDev: { label: 'Standard deviation', value: stdDev }\n\t\t//variance: { label: 'Variance', value: variance }, // not necessary to report, as it is just stdDev^2\n\t\t//iqr: { label: 'Inter-quartile range', value: IQR } // not necessary to report, as it is just p75-p25\n\t}\n\n\tif (showOutlierRange) {\n\t\tstats.outlierMin = { label: 'Outlier minimum', value: outlierMin }\n\t\tstats.outlierMax = { label: 'Outlier maximum', value: outlierMax }\n\t}\n\n\tfor (const v of Object.values(stats)) {\n\t\tconst rounded = roundValueAuto(v.value)\n\t\tv.value = rounded\n\t}\n\n\treturn stats\n}\n\nfunction getMean(data) {\n\treturn data.reduce((sum, value) => sum + value, 0) / data.length\n}\n\nfunction getVariance(data) {\n\tconst meanValue = getMean(data)\n\tconst squaredDifferences = data.map(value => Math.pow(value - meanValue, 2))\n\t//Using n\u22121 compensates for the fact that we're basing variance on a sample mean,\n\t// which tends to underestimate true variability. The correction is especially important with small sample sizes,\n\t// where dividing by n would significantly distort the variance estimate.\n\t// For more details see https://en.wikipedia.org/wiki/Bessel%27s_correction\n\treturn squaredDifferences.reduce((sum, value) => sum + value, 0) / (data.length - 1)\n}\n", "import initBinConfig from '#shared/termdb.initbinconfig.js'\nimport { TermdbVocab } from './TermdbVocab'\nimport { FrontendVocab } from './FrontendVocab'\nimport { isNumeric } from '#shared/helpers.js'\nimport { TermTypes } from '#shared/terms.js'\n\nexport function vocabInit(opts) {\n\t/*** start legacy support for state.genome, .dslabel ***/\n\tif (opts.vocab && !opts.state) {\n\t\topts.state = { vocab: opts.vocab }\n\t}\n\tif (!opts.state) throw 'missing opts.state'\n\tif (!opts.state.vocab) {\n\t\topts.state.vocab = opts.vocab ? opts.vocab : {}\n\t}\n\tconst vocab = opts.state.vocab\n\tif (opts.state.genome) {\n\t\tvocab.genome = opts.state.genome\n\t\tdelete opts.state.genome\n\t}\n\tif (opts.state.dslabel) {\n\t\tvocab.dslabel = opts.state.dslabel\n\t\tdelete opts.state.dslabel\n\t}\n\t/*** end legacy support ***/\n\n\tif (vocab.dslabel) {\n\t\t//const { TermdbVocab } = await import('./TermdbVocab')\n\t\treturn new TermdbVocab(opts)\n\t} else if (vocab.terms) {\n\t\t//const { FrontendVocab } = await import('./FrontendVocab')\n\t\tconst vocabApi = new FrontendVocab(opts)\n\t\tif (vocab.parent_termdbConfig) {\n\t\t\t// parent termdbConfig is provided to track termdbConfig\n\t\t\t// from parent dataset (e.g. geneVariant term generates\n\t\t\t// a frontend vocab of dt terms, but this frontend vocab\n\t\t\t// still needs to track termdbConfig properties from the\n\t\t\t// parent dataset, see setVocabApi() in client/filter/tvs.dt.js)\n\t\t\tvocabApi.parent_termdbConfig = vocab.parent_termdbConfig\n\t\t}\n\t\treturn vocabApi\n\t} else {\n\t\tthrow `unable to initialize vocabApi`\n\t}\n}\n\nexport function q_to_param(q) {\n\t// exclude certain attributes of q from dataName\n\tconst q2 = JSON.parse(JSON.stringify(q))\n\tdelete q2.hiddenValues\n\treturn encodeURIComponent(JSON.stringify(q2))\n}\n\n// to-do\n// class Mds3Vocab {}\n\nexport function getVocabFromSamplesArray({ samples, sample_attributes }) {\n\tconst terms = {\n\t\t__root: {\n\t\t\tid: 'root',\n\t\t\tname: 'root',\n\t\t\t__tree_isroot: true\n\t\t}\n\t}\n\tconst sanno = {}\n\tfor (const a of samples) {\n\t\tconst s = a.sample\n\t\tif (!sanno[s]) sanno[s] = {}\n\t\t// in case a sample has more than one annotation object in the array\n\t\tObject.assign(sanno[s], a.s)\n\n\t\t// generate term definitions from\n\t\tfor (const key in a.s) {\n\t\t\tif (!terms[key]) {\n\t\t\t\tconst name = sample_attributes[key] && sample_attributes[key].label ? sample_attributes[key].label : key\n\t\t\t\tterms[key] = {\n\t\t\t\t\tid: key,\n\t\t\t\t\tname,\n\t\t\t\t\tparent_id: null,\n\t\t\t\t\ttype:\n\t\t\t\t\t\tsample_attributes[key].type == 'float'\n\t\t\t\t\t\t\t? 'float'\n\t\t\t\t\t\t\t: sample_attributes[key].type == 'integer'\n\t\t\t\t\t\t\t? 'integer'\n\t\t\t\t\t\t\t: // need to work with the cloud/PROPEL team to define type for legacy scatterplot usage\n\t\t\t\t\t\t\t 'categorical',\n\t\t\t\t\tvalues: {},\n\t\t\t\t\tisleaf: true\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst t = terms[key]\n\t\t\tif (!('id' in t)) t.id = key\n\t\t\tif (!('parent_id' in t)) t.parent_id = null\n\t\t\tif (!('values' in t)) t.values = {}\n\t\t\tif (!('isleaf' in t)) t.isleaf = true\n\t\t\tif (!t.computableVals && (t.type == 'float' || t.type == 'integer')) {\n\t\t\t\tt.computableVals = [] // will be used to initialize binconfig for numeric terms\n\t\t\t}\n\n\t\t\tconst value = a.s[key]\n\t\t\tif (t.type == 'categorical') {\n\t\t\t\tt.groupsetting = { disabled: true }\n\t\t\t\tif (!(value in t.values)) {\n\t\t\t\t\tt.values[value] = { key: value, label: value }\n\t\t\t\t}\n\t\t\t} else if (t.type == 'integer' || t.type == 'float') {\n\t\t\t\t// may need to auto-detect more string values that\n\t\t\t\t// can be assumed to be non-numeric here, like \"N/A\"\n\t\t\t\tif (value === 'Not Available' && !(value in t.values)) {\n\t\t\t\t\tt.values[value] = { label: value, uncomputable: true }\n\t\t\t\t}\n\t\t\t\tif (!(value in t.values)) {\n\t\t\t\t\tif (!isNumeric(a.s[key])) throw `non-numeric term value='${value}' for term='${key}'`\n\t\t\t\t\ta.s[key] = Number(a.s[key])\n\t\t\t\t\tconst val = a.s[key]\n\t\t\t\t\tt.computableVals.push(val)\n\t\t\t\t}\n\t\t\t} else if (t.type == 'condition') {\n\t\t\t\t//TODO: add logic for conditional terms\n\t\t\t} else if (t.type == TermTypes.SINGLECELL_GENE_EXPRESSION) {\n\t\t\t\t//TODO: add logic for conditional terms\n\t\t\t} else {\n\t\t\t\tthrow 'Term type not supported:' + t.type\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const key in terms) {\n\t\tconst t = terms[key]\n\t\tif ((t.type == 'integer' || t.type == 'float') && !t.bins) {\n\t\t\tt.bins = {\n\t\t\t\tdefault: initBinConfig(t.computableVals)\n\t\t\t}\n\t\t\tdelete t.computableVals\n\t\t}\n\t}\n\n\treturn {\n\t\tsampleannotation: sanno,\n\t\tterms: Object.values(terms)\n\t}\n}\n", "import { setRenderers } from './filter.renderer'\nimport { setInteractivity } from './filter.interactivity'\nimport { findItem, findParent, getFilterItemByTag, getNormalRoot, filterJoin } from './filter.utils'\nimport { vocabInit } from '#termdb/vocabulary'\nimport { Menu } from '#dom/menu'\n\nconst defaults = {\n\tjoinWith: ['and', 'or']\n}\n\n/*\n\topts{}\n\t.holder\n\t\n\t.callback()\n\t\tWhen a filter change (add, edit, remove) is made,\n\t\tthe callback will receive the updated visible filter\n\t\tas argument\n\t\n\t.emptyLabel \"+NEW\"\n\t\toptions to use a different label for the\n\t\tbutton or prompt to add the \n\t\tfirst user-configurable filter item\n\n\n\tCoding convenience:\n\t- use $id for data binding to match \n\t existing DOM elements with the corresponding\n\t data update\n\t- use ':scope > .cls' to limit a selection\n\t\tto immediate children -- important since the data\n\t\tat the current nesting level must not be bound to \n\t\tnon-child elements with the same classnames\n*/\n\nexport class Filter {\n\tconstructor(opts) {\n\t\tthis.opts = this.validateOpts(opts)\n\n\t\tconst parent_menu = this.opts.holder.node()?.closest('.sja_menu_div')\n\n\t\tconst controlsTip = new Menu({\n\t\t\tpadding: '0px',\n\t\t\tparent_menu\n\t\t})\n\n\t\tthis.dom = {\n\t\t\tholder: opts.holder,\n\t\t\tcontrolsTip,\n\t\t\ttreeTip: new Menu({\n\t\t\t\tpadding: '5px',\n\t\t\t\toffsetX: 20,\n\t\t\t\toffsetY: -34,\n\t\t\t\tclearSelector: '.sja_term_src_body',\n\t\t\t\tparent_menu: controlsTip.d.node(),\n\t\t\t\tancestor_menus: [parent_menu]\n\t\t\t})\n\t\t}\n\t\tthis.durations = { exit: 500 }\n\t\tthis.lastId = 0\n\t\tthis.categoryData = {}\n\t\tthis.pills = {}\n\t\tsetInteractivity(this)\n\t\tsetRenderers(this)\n\t\tthis.initUI()\n\n\t\t// default empty filter, in case this.api.main() is not called\n\t\t// in app-less initialization\n\t\tthis.filter = {\n\t\t\ttype: 'tvslst',\n\t\t\ttag: 'filterUiRoot',\n\t\t\tjoin: 'and',\n\t\t\tin: true,\n\t\t\tlst: []\n\t\t}\n\t\tthis.promises = {}\n\t}\n\n\tvalidateOpts(opts) {\n\t\tconst o = Object.assign({}, defaults, opts)\n\t\tif (!o.holder) throw '.holder missing'\n\n\t\tif (o.vocabApi) {\n\t\t\tthis.vocabApi = o.vocabApi\n\t\t} else {\n\t\t\tif (!o.vocab) throw '.vocab missing'\n\n\t\t\tif (o.vocab.dslabel) {\n\t\t\t\tif (!o.vocab.genome) throw 'vocab.genome missing'\n\t\t\t} else {\n\t\t\t\tif (!o.vocab.terms) throw 'vocab.terms missing'\n\t\t\t}\n\t\t}\n\n\t\tif (typeof o.callback != 'function') throw '.callback() is not a function'\n\t\tif (o.getVisibleRoot && typeof o.getVisibleRoot != 'function')\n\t\t\tthrow '.getVisibleRoot() must be a function if set as an option'\n\t\tif (!o.emptyLabel) o.emptyLabel = '+NEW'\n\t\t// o.getCategoriesArguments is not validated and simply passed to tree UI then tvs\n\t\treturn o\n\t}\n\n\t/*\n\t\trawCopy'' JSON-stringified rawFilter object\n\t\topts{}\n\t\t.activeCohort\n\t*/\n\tasync main(rawCopy, opts = {}) {\n\t\t// replace the postRender promise ASAP to ensure that listeners\n\t\t// will not get a stale promise from a previous render\n\t\t// TODO: can move setting a postRender promise to rx?\n\t\tthis.promises.postRender = new Promise((resolve, reject) => {\n\t\t\tthis.mainResolve = resolve\n\t\t\tthis.mainReject = reject\n\t\t})\n\t\tthis.numProcessedItems = 0\n\t\tthis.numExpectedItems = 0\n\n\t\tthis.opts = Object.assign({}, this.opts, opts)\n\t\tthis.activeCohort = this.opts.activeCohort\n\t\tthis.rawCopy = rawCopy\n\t\tthis.rawFilter = JSON.parse(this.rawCopy)\n\t\tthis.validateFilter(this.rawFilter)\n\t\tthis.filter = getFilterItemByTag(this.rawFilter, 'filterUiRoot')\n\t\tif (!this.filter) {\n\t\t\tthis.filter = this.rawFilter\n\t\t\tthis.filter.tag = 'filterUiRoot'\n\t\t}\n\t\tawait this.resetActiveData(this.filter)\n\n\t\t// reset interaction-related styling\n\t\tthis.removeBlankPill()\n\t\tthis.dom.newBtn.style('display', this.opts.newBtn ? '' : this.filter.lst.length == 0 ? 'inline-block' : 'none')\n\t\tthis.dom.holder.selectAll('.sja_filter_add_transformer').style('display', this.getAddTransformerBtnDisplay)\n\t\t//this.dom.filterContainer.selectAll('.sja_filter_grp').style('background-color', 'transparent')\n\t\tthis.setVocabApi()\n\t\tthis.updateUI(this.dom.filterContainer, this.filter)\n\t\treturn this.promises.postRender\n\t}\n\n\tvalidateFilter(item) {\n\t\t// for reliably binding data to DOM elements\n\t\t// and associating updated data copy to\n\t\t// the currently bound data\n\t\tif (!('$id' in item)) item.$id = this.lastId++\n\t\telse if (this.lastId <= item.$id) this.lastId = item.$id + 1\n\n\t\tif (!('type' in item)) throw 'missing filter.type'\n\t\tif (item.type != 'tvs' && item.type != 'tvslst') throw 'invalid filter.type'\n\t\t//if (!('visibility' in item)) item.visibility = 'default'\n\t\t//if (!['default', 'collapsed', 'hidden'].includes(item.visibility)) throw 'invalid filter.visibility value'\n\n\t\tif (item.type != 'tvslst') return\n\t\tif (!Array.isArray(item.lst)) throw 'invalid or missing filter.lst[]'\n\t\tif (item.lst.length > 1) {\n\t\t\tif (item.join != 'and' && item.join != 'or') throw 'invalid filter.join value for lst.length > 1'\n\t\t} else if (item.join !== '') {\n\t\t\tthrow 'filter.join must be an empty string when lst.length < 2'\n\t\t}\n\t\tif (!item.lst.length) item.in = true\n\t\tfor (const [i, subitem] of item.lst.entries()) {\n\t\t\tthis.validateFilter(subitem)\n\t\t}\n\t}\n\tresetActiveData(filter) {\n\t\t// clear menu click\n\t\tif (this.dom.controlsTip.d.style('display') == 'none') {\n\t\t\tthis.activeData = { item: {}, filter: {} }\n\t\t} else {\n\t\t\tthis.activeData = {\n\t\t\t\titem: findItem(filter, this.activeData.item.$id),\n\t\t\t\tfilter: findItem(filter, this.activeData.filter.$id),\n\t\t\t\tmenuOpt: this.activeData.menuOpt\n\t\t\t}\n\t\t}\n\t}\n\trefresh(filterUiRoot) {\n\t\tthis.dom.controlsTip.hide()\n\t\tthis.dom.treeTip.hide()\n\t\tconst rootCopy = JSON.parse(JSON.stringify(this.rawFilter))\n\t\tdelete rootCopy.tag\n\t\tfilterUiRoot.tag = 'filterUiRoot'\n\t\tconst rawParent = findParent(rootCopy, this.filter.$id)\n\t\tif (!rawParent || this.rawFilter.$id === this.filter.$id) {\n\t\t\tthis.api.main(filterUiRoot)\n\t\t\tthis.opts.callback(filterUiRoot)\n\t\t} else {\n\t\t\tconst i = rawParent.lst.findIndex(f => f.$id == this.filter.$id)\n\t\t\trawParent.lst[i] = filterUiRoot\n\t\t\tthis.api.main(rootCopy)\n\t\t\tthis.opts.callback(filterUiRoot)\n\t\t}\n\t}\n\tgetId(item) {\n\t\treturn item.$id\n\t}\n\t// The method below is used to get correct categories + sample counts in the pill edit menu,\n\t// so that all values of the pill term, including filtered-out values, will still show up\n\t// as checkbox inputs/range option. The other filter data entries will still be applied.\n\tgetFilterExcludingPill($id) {\n\t\tconst rootCopy = JSON.parse(JSON.stringify(this.rawFilter))\n\t\tconst parentCopy = findParent(rootCopy, $id)\n\t\tconst i = parentCopy.lst.findIndex(f => f.$id === $id)\n\t\tif (i == -1) return null\n\t\tparentCopy.lst.splice(i, 1)\n\t\tif (parentCopy.lst.length < 2) parentCopy.join = ''\n\t\tconst globalFilter = this.app?.getState().termfilter?.filter\n\t\treturn getNormalRoot(!globalFilter ? rootCopy : filterJoin([rootCopy, globalFilter]))\n\t\t/*\n\t\t!!! \n\t\t\tThe logic below incorectly assumes that there are at most 2 root tvslst.lst entries,\n\t\t\ta cohortFilter, ONE OTHER, or both\n\t\t\t- this is mostly true for a global filter\n\t\t\t- however, a local chart filter may have 3+ entries in its root tvslst: \n\t\t\t a cohortFilter tvs, aterm filter tvslst, AND the local filter tvslst\n\t\t!!!\n\t\tconst cohortFilter = getFilterItemByTag(rootCopy, 'cohortFilter')\n\t\tif (cohortFilter && !parentCopy.lst.find(d => d === cohortFilter)) {\n\t\t\treturn getNormalRoot({\n\t\t\t\ttype: 'tvslst',\n\t\t\t\tjoin: 'and',\n\t\t\t\tlst: [cohortFilter, parentCopy]\n\t\t\t})\n\t\t} else {\n\t\t\treturn getNormalRoot(parentCopy)\n\t\t}\n\t\t*/\n\t}\n\n\tgetAdjustedRoot($id, join) {\n\t\tconst rootCopy = JSON.parse(JSON.stringify(this.rawFilter))\n\n\t\tif (join == 'and') return rootCopy\n\n\t\t// join should be \"or\"\n\n\t\t// first find the optional cohortFilter, as it's used at multiple placed below\n\t\tconst cohortFilter = getFilterItemByTag(rootCopy, 'cohortFilter')\n\n\t\tconst parentCopy = findParent(rootCopy, $id)\n\t\tif (!parentCopy) {\n\t\t\t// if cohortFilter is present, must return it; otherwise return blank filter\n\t\t\treturn { type: 'tvslst', in: true, join: 'and', lst: cohortFilter ? [cohortFilter] : [] }\n\t\t}\n\n\t\tconst i = parentCopy.lst.findIndex(f => f.$id === parentCopy.$id)\n\t\tif (i == -1) return { type: 'tvslst', in: true, join: 'and', lst: cohortFilter ? [cohortFilter] : [] }\n\n\t\tparentCopy.lst.splice(i, 1)\n\t\tif (cohortFilter && !parentCopy.lst.find(d => d === cohortFilter)) {\n\t\t\treturn getNormalRoot({\n\t\t\t\ttype: 'tvslst',\n\t\t\t\tjoin: 'and',\n\t\t\t\tlst: [cohortFilter, parentCopy]\n\t\t\t})\n\t\t}\n\n\t\treturn getNormalRoot(parentCopy)\n\t}\n\n\tsetVocabApi() {\n\t\tif (!this.vocabApi) {\n\t\t\tconst app = {\n\t\t\t\tgetState: () => {\n\t\t\t\t\tconst filter = JSON.parse(this.rawCopy)\n\t\t\t\t\tconst cohortFilter = getFilterItemByTag(filter, 'cohortFilter')\n\t\t\t\t\tif (cohortFilter && this.opts.termdbConfig) {\n\t\t\t\t\t\tcohortFilter.tvs.values =\n\t\t\t\t\t\t\tthis.activeCohort == -1 || this.activeCohort === undefined\n\t\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t\t: this.opts.termdbConfig.selectCohort.values[this.activeCohort].keys.map(key => {\n\t\t\t\t\t\t\t\t\t\treturn { key, label: key }\n\t\t\t\t\t\t\t\t })\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvocab: this.opts.vocab,\n\t\t\t\t\t\ttermfilter: { filter },\n\t\t\t\t\t\ttree: { plots: {} }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst state = app.getState()\n\t\t\tconst vocab = state.vocab || {\n\t\t\t\tgenome: state.genome,\n\t\t\t\tdslabel: state.dslabel\n\t\t\t}\n\t\t\tif (!this.vocabApi) {\n\t\t\t\tthis.vocabApi = vocabInit({\n\t\t\t\t\tapp,\n\t\t\t\t\tstate: { vocab }\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tthis.vocabApi.main()\n\t}\n\tupdatePromise = function (incr = 1) {\n\t\tif (!this.mainResolve) return\n\t\tthis.numProcessedItems += incr\n\t\tif (this.numExpectedItems == this.numProcessedItems) {\n\t\t\tthis.mainResolve()\n\t\t\tif (this.bus) this.bus.emit('postRender')\n\t\t\tdelete this.mainResolve\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tthis.dom.holder.remove()\n\t\tthis.dom.controlsTip.destroy()\n\t\tthis.dom.treeTip.destroy()\n\t}\n}\n", "import { getInitFxn, Bus } from '#rx'\nimport { Filter } from './FilterClass'\nimport { getNormalRoot } from './filter.utils'\n\n// use this in a non-rx-based apps,\n// and for simple filter data shapes where there are no tags like filterUiRoot\nclass FilterStateless extends Filter {\n\tconstructor(opts) {\n\t\tsuper(opts)\n\t\tthis.api = {\n\t\t\t// make sure to bind the 'this' context to the filter instance\n\t\t\t// instead of to the this.api object\n\t\t\tmain: this.main.bind(this),\n\t\t\t/*\n\t\t\t\tWARNING!!!\n\t\t\t\tWhen using this filter.api.getNormalRoot(),\n\t\t\t\tmake sure this instance has been updated before the caller,\n\t\t\t\totherwise the normalized root will be stale\n\n\t\t\t\tor for reliability, import getNormalRoot() directly \n\t\t\t\tfrom the common/filter.js component and supply the \n\t\t\t\tcaller's known raw filter state\n\t\t\t*/\n\t\t\tgetNormalRoot: () => getNormalRoot(this.rawFilter),\n\t\t\tgetPromise: name => this.promises[name],\n\t\t\tdestroy: () => this.destroy()\n\t\t}\n\n\t\tif (opts.callbacks) {\n\t\t\tthis.events = ['postInit', 'postRender', 'firstRender']\n\t\t\tthis.bus = new Bus(this.api, this.events, opts.callbacks)\n\t\t}\n\t}\n\n\tasync main(rawFilter, opts = {}) {\n\t\tthis.dom.controlsTip.hide()\n\t\tthis.dom.treeTip.hide()\n\t\tconst activeCohort = 'activeCohort' in opts ? opts.activeCohort : this.activeCohort\n\t\tconst rawCopy = JSON.stringify(rawFilter)\n\t\t// if the filter data and active cohort has not changed, do not trigger a re-render\n\t\tif (this.rawCopy == rawCopy && JSON.stringify(this.activeCohort) == JSON.stringify(activeCohort)) return\n\t\tawait super.main(rawCopy, opts)\n\t}\n}\n\nexport const filterInit = getInitFxn(FilterStateless)\n", "import type { Options } from './types'\n\nexport function resolveUrl(url: string, baseUrl: string | null): string {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url\n }\n\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url\n }\n\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url\n }\n\n const doc = document.implementation.createHTMLDocument()\n const base = doc.createElement('base')\n const a = doc.createElement('a')\n\n doc.head.appendChild(base)\n doc.body.appendChild(a)\n\n if (baseUrl) {\n base.href = baseUrl\n }\n\n a.href = url\n\n return a.href\n}\n\nexport const uuid = (() => {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n let counter = 0\n\n // ref: http://stackoverflow.com/a/6248722/2519373\n const random = () =>\n // eslint-disable-next-line no-bitwise\n `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4)\n\n return () => {\n counter += 1\n return `u${random()}${counter}`\n }\n})()\n\nexport function delay<T>(ms: number) {\n return (args: T) =>\n new Promise<T>((resolve) => {\n setTimeout(() => resolve(args), ms)\n })\n}\n\nexport function toArray<T>(arrayLike: any): T[] {\n const arr: T[] = []\n\n for (let i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i])\n }\n\n return arr\n}\n\nlet styleProps: string[] | null = null\nexport function getStyleProperties(options: Options = {}): string[] {\n if (styleProps) {\n return styleProps\n }\n\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties\n return styleProps\n }\n\n styleProps = toArray(window.getComputedStyle(document.documentElement))\n\n return styleProps\n}\n\nfunction px(node: HTMLElement, styleProperty: string) {\n const win = node.ownerDocument.defaultView || window\n const val = win.getComputedStyle(node).getPropertyValue(styleProperty)\n return val ? parseFloat(val.replace('px', '')) : 0\n}\n\nfunction getNodeWidth(node: HTMLElement) {\n const leftBorder = px(node, 'border-left-width')\n const rightBorder = px(node, 'border-right-width')\n return node.clientWidth + leftBorder + rightBorder\n}\n\nfunction getNodeHeight(node: HTMLElement) {\n const topBorder = px(node, 'border-top-width')\n const bottomBorder = px(node, 'border-bottom-width')\n return node.clientHeight + topBorder + bottomBorder\n}\n\nexport function getImageSize(targetNode: HTMLElement, options: Options = {}) {\n const width = options.width || getNodeWidth(targetNode)\n const height = options.height || getNodeHeight(targetNode)\n\n return { width, height }\n}\n\nexport function getPixelRatio() {\n let ratio\n\n let FINAL_PROCESS\n try {\n FINAL_PROCESS = process\n } catch (e) {\n // pass\n }\n\n const val =\n FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null\n if (val) {\n ratio = parseInt(val, 10)\n if (Number.isNaN(ratio)) {\n ratio = 1\n }\n }\n return ratio || window.devicePixelRatio || 1\n}\n\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384\n\nexport function checkCanvasDimensions(canvas: HTMLCanvasElement) {\n if (\n canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit\n ) {\n if (\n canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit\n ) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width\n canvas.width = canvasDimensionLimit\n } else {\n canvas.width *= canvasDimensionLimit / canvas.height\n canvas.height = canvasDimensionLimit\n }\n } else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width\n canvas.width = canvasDimensionLimit\n } else {\n canvas.width *= canvasDimensionLimit / canvas.height\n canvas.height = canvasDimensionLimit\n }\n }\n}\n\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n options: Options = {},\n): Promise<Blob | null> {\n if (canvas.toBlob) {\n return new Promise((resolve) => {\n canvas.toBlob(\n resolve,\n options.type ? options.type : 'image/png',\n options.quality ? options.quality : 1,\n )\n })\n }\n\n return new Promise((resolve) => {\n const binaryString = window.atob(\n canvas\n .toDataURL(\n options.type ? options.type : undefined,\n options.quality ? options.quality : undefined,\n )\n .split(',')[1],\n )\n const len = binaryString.length\n const binaryArray = new Uint8Array(len)\n\n for (let i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i)\n }\n\n resolve(\n new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }),\n )\n })\n}\n\nexport function createImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => {\n img.decode().then(() => {\n requestAnimationFrame(() => resolve(img))\n })\n }\n img.onerror = reject\n img.crossOrigin = 'anonymous'\n img.decoding = 'async'\n img.src = url\n })\n}\n\nexport async function svgToDataURL(svg: SVGElement): Promise<string> {\n return Promise.resolve()\n .then(() => new XMLSerializer().serializeToString(svg))\n .then(encodeURIComponent)\n .then((html) => `data:image/svg+xml;charset=utf-8,${html}`)\n}\n\nexport async function nodeToDataURL(\n node: HTMLElement,\n width: number,\n height: number,\n): Promise<string> {\n const xmlns = 'http://www.w3.org/2000/svg'\n const svg = document.createElementNS(xmlns, 'svg')\n const foreignObject = document.createElementNS(xmlns, 'foreignObject')\n\n svg.setAttribute('width', `${width}`)\n svg.setAttribute('height', `${height}`)\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`)\n\n foreignObject.setAttribute('width', '100%')\n foreignObject.setAttribute('height', '100%')\n foreignObject.setAttribute('x', '0')\n foreignObject.setAttribute('y', '0')\n foreignObject.setAttribute('externalResourcesRequired', 'true')\n\n svg.appendChild(foreignObject)\n foreignObject.appendChild(node)\n return svgToDataURL(svg)\n}\n\nexport const isInstanceOfElement = <\n T extends typeof Element | typeof HTMLElement | typeof SVGImageElement,\n>(\n node: Element | HTMLElement | SVGImageElement,\n instance: T,\n): node is T['prototype'] => {\n if (node instanceof instance) return true\n\n const nodePrototype = Object.getPrototypeOf(node)\n\n if (nodePrototype === null) return false\n\n return (\n nodePrototype.constructor.name === instance.name ||\n isInstanceOfElement(nodePrototype, instance)\n )\n}\n", "import type { Options } from './types'\nimport { uuid, getStyleProperties } from './util'\n\ntype Pseudo = ':before' | ':after'\n\nfunction formatCSSText(style: CSSStyleDeclaration) {\n const content = style.getPropertyValue('content')\n return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`\n}\n\nfunction formatCSSProperties(style: CSSStyleDeclaration, options: Options) {\n return getStyleProperties(options)\n .map((name) => {\n const value = style.getPropertyValue(name)\n const priority = style.getPropertyPriority(name)\n\n return `${name}: ${value}${priority ? ' !important' : ''};`\n })\n .join(' ')\n}\n\nfunction getPseudoElementStyle(\n className: string,\n pseudo: Pseudo,\n style: CSSStyleDeclaration,\n options: Options,\n): Text {\n const selector = `.${className}:${pseudo}`\n const cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options)\n\n return document.createTextNode(`${selector}{${cssText}}`)\n}\n\nfunction clonePseudoElement<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n pseudo: Pseudo,\n options: Options,\n) {\n const style = window.getComputedStyle(nativeNode, pseudo)\n const content = style.getPropertyValue('content')\n if (content === '' || content === 'none') {\n return\n }\n\n const className = uuid()\n try {\n clonedNode.className = `${clonedNode.className} ${className}`\n } catch (err) {\n return\n }\n\n const styleElement = document.createElement('style')\n styleElement.appendChild(\n getPseudoElementStyle(className, pseudo, style, options),\n )\n clonedNode.appendChild(styleElement)\n}\n\nexport function clonePseudoElements<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options)\n clonePseudoElement(nativeNode, clonedNode, ':after', options)\n}\n", "const WOFF = 'application/font-woff'\nconst JPEG = 'image/jpeg'\nconst mimes: { [key: string]: string } = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n}\n\nfunction getExtension(url: string): string {\n const match = /\\.([^./]*?)$/g.exec(url)\n return match ? match[1] : ''\n}\n\nexport function getMimeType(url: string): string {\n const extension = getExtension(url).toLowerCase()\n return mimes[extension] || ''\n}\n", "import { Options } from './types'\n\nfunction getContentFromDataUrl(dataURL: string) {\n return dataURL.split(/,/)[1]\n}\n\nexport function isDataUrl(url: string) {\n return url.search(/^(data:)/) !== -1\n}\n\nexport function makeDataUrl(content: string, mimeType: string) {\n return `data:${mimeType};base64,${content}`\n}\n\nexport async function fetchAsDataURL<T>(\n url: string,\n init: RequestInit | undefined,\n process: (data: { result: string; res: Response }) => T,\n): Promise<T> {\n const res = await fetch(url, init)\n if (res.status === 404) {\n throw new Error(`Resource \"${res.url}\" not found`)\n }\n const blob = await res.blob()\n return new Promise<T>((resolve, reject) => {\n const reader = new FileReader()\n reader.onerror = reject\n reader.onloadend = () => {\n try {\n resolve(process({ res, result: reader.result as string }))\n } catch (error) {\n reject(error)\n }\n }\n\n reader.readAsDataURL(blob)\n })\n}\n\nconst cache: { [url: string]: string } = {}\n\nfunction getCacheKey(\n url: string,\n contentType: string | undefined,\n includeQueryParams: boolean | undefined,\n) {\n let key = url.replace(/\\?.*/, '')\n\n if (includeQueryParams) {\n key = url\n }\n\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '')\n }\n\n return contentType ? `[${contentType}]${key}` : key\n}\n\nexport async function resourceToDataURL(\n resourceUrl: string,\n contentType: string | undefined,\n options: Options,\n) {\n const cacheKey = getCacheKey(\n resourceUrl,\n contentType,\n options.includeQueryParams,\n )\n\n if (cache[cacheKey] != null) {\n return cache[cacheKey]\n }\n\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime()\n }\n\n let dataURL: string\n try {\n const content = await fetchAsDataURL(\n resourceUrl,\n options.fetchRequestInit,\n ({ res, result }) => {\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || ''\n }\n return getContentFromDataUrl(result)\n },\n )\n dataURL = makeDataUrl(content, contentType!)\n } catch (error) {\n dataURL = options.imagePlaceholder || ''\n\n let msg = `Failed to fetch resource: ${resourceUrl}`\n if (error) {\n msg = typeof error === 'string' ? error : error.message\n }\n\n if (msg) {\n console.warn(msg)\n }\n }\n\n cache[cacheKey] = dataURL\n return dataURL\n}\n", "import type { Options } from './types'\nimport { clonePseudoElements } from './clone-pseudos'\nimport {\n createImage,\n toArray,\n isInstanceOfElement,\n getStyleProperties,\n} from './util'\nimport { getMimeType } from './mimes'\nimport { resourceToDataURL } from './dataurl'\n\nasync function cloneCanvasElement(canvas: HTMLCanvasElement) {\n const dataURL = canvas.toDataURL()\n if (dataURL === 'data:,') {\n return canvas.cloneNode(false) as HTMLCanvasElement\n }\n return createImage(dataURL)\n}\n\nasync function cloneVideoElement(video: HTMLVideoElement, options: Options) {\n if (video.currentSrc) {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n canvas.width = video.clientWidth\n canvas.height = video.clientHeight\n ctx?.drawImage(video, 0, 0, canvas.width, canvas.height)\n const dataURL = canvas.toDataURL()\n return createImage(dataURL)\n }\n\n const poster = video.poster\n const contentType = getMimeType(poster)\n const dataURL = await resourceToDataURL(poster, contentType, options)\n return createImage(dataURL)\n}\n\nasync function cloneIFrameElement(iframe: HTMLIFrameElement, options: Options) {\n try {\n if (iframe?.contentDocument?.body) {\n return (await cloneNode(\n iframe.contentDocument.body,\n options,\n true,\n )) as HTMLBodyElement\n }\n } catch {\n // Failed to clone iframe\n }\n\n return iframe.cloneNode(false) as HTMLIFrameElement\n}\n\nasync function cloneSingleNode<T extends HTMLElement>(\n node: T,\n options: Options,\n): Promise<HTMLElement> {\n if (isInstanceOfElement(node, HTMLCanvasElement)) {\n return cloneCanvasElement(node)\n }\n\n if (isInstanceOfElement(node, HTMLVideoElement)) {\n return cloneVideoElement(node, options)\n }\n\n if (isInstanceOfElement(node, HTMLIFrameElement)) {\n return cloneIFrameElement(node, options)\n }\n\n return node.cloneNode(isSVGElement(node)) as T\n}\n\nconst isSlotElement = (node: HTMLElement): node is HTMLSlotElement =>\n node.tagName != null && node.tagName.toUpperCase() === 'SLOT'\n\nconst isSVGElement = (node: HTMLElement): node is HTMLSlotElement =>\n node.tagName != null && node.tagName.toUpperCase() === 'SVG'\n\nasync function cloneChildren<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n): Promise<T> {\n if (isSVGElement(clonedNode)) {\n return clonedNode\n }\n\n let children: T[] = []\n\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = toArray<T>(nativeNode.assignedNodes())\n } else if (\n isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n nativeNode.contentDocument?.body\n ) {\n children = toArray<T>(nativeNode.contentDocument.body.childNodes)\n } else {\n children = toArray<T>((nativeNode.shadowRoot ?? nativeNode).childNodes)\n }\n\n if (\n children.length === 0 ||\n isInstanceOfElement(nativeNode, HTMLVideoElement)\n ) {\n return clonedNode\n }\n\n await children.reduce(\n (deferred, child) =>\n deferred\n .then(() => cloneNode(child, options))\n .then((clonedChild: HTMLElement | null) => {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild)\n }\n }),\n Promise.resolve(),\n )\n\n return clonedNode\n}\n\nfunction cloneCSSStyle<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n) {\n const targetStyle = clonedNode.style\n if (!targetStyle) {\n return\n }\n\n const sourceStyle = window.getComputedStyle(nativeNode)\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText\n targetStyle.transformOrigin = sourceStyle.transformOrigin\n } else {\n getStyleProperties(options).forEach((name) => {\n let value = sourceStyle.getPropertyValue(name)\n if (name === 'font-size' && value.endsWith('px')) {\n const reducedFont =\n Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1\n value = `${reducedFont}px`\n }\n\n if (\n isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline'\n ) {\n value = 'block'\n }\n\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = `path(${clonedNode.getAttribute('d')})`\n }\n\n targetStyle.setProperty(\n name,\n value,\n sourceStyle.getPropertyPriority(name),\n )\n })\n }\n}\n\nfunction cloneInputValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value\n }\n\n if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value)\n }\n}\n\nfunction cloneSelectValue<T extends HTMLElement>(nativeNode: T, clonedNode: T) {\n if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n const clonedSelect = clonedNode as any as HTMLSelectElement\n const selectedOption = Array.from(clonedSelect.children).find(\n (child) => nativeNode.value === child.getAttribute('value'),\n )\n\n if (selectedOption) {\n selectedOption.setAttribute('selected', '')\n }\n }\n}\n\nfunction decorate<T extends HTMLElement>(\n nativeNode: T,\n clonedNode: T,\n options: Options,\n): T {\n if (isInstanceOfElement(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options)\n clonePseudoElements(nativeNode, clonedNode, options)\n cloneInputValue(nativeNode, clonedNode)\n cloneSelectValue(nativeNode, clonedNode)\n }\n\n return clonedNode\n}\n\nasync function ensureSVGSymbols<T extends HTMLElement>(\n clone: T,\n options: Options,\n) {\n const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : []\n if (uses.length === 0) {\n return clone\n }\n\n const processedDefs: { [key: string]: HTMLElement } = {}\n for (let i = 0; i < uses.length; i++) {\n const use = uses[i]\n const id = use.getAttribute('xlink:href')\n if (id) {\n const exist = clone.querySelector(id)\n const definition = document.querySelector(id) as HTMLElement\n if (!exist && definition && !processedDefs[id]) {\n // eslint-disable-next-line no-await-in-loop\n processedDefs[id] = (await cloneNode(definition, options, true))!\n }\n }\n }\n\n const nodes = Object.values(processedDefs)\n if (nodes.length) {\n const ns = 'http://www.w3.org/1999/xhtml'\n const svg = document.createElementNS(ns, 'svg')\n svg.setAttribute('xmlns', ns)\n svg.style.position = 'absolute'\n svg.style.width = '0'\n svg.style.height = '0'\n svg.style.overflow = 'hidden'\n svg.style.display = 'none'\n\n const defs = document.createElementNS(ns, 'defs')\n svg.appendChild(defs)\n\n for (let i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i])\n }\n\n clone.appendChild(svg)\n }\n\n return clone\n}\n\nexport async function cloneNode<T extends HTMLElement>(\n node: T,\n options: Options,\n isRoot?: boolean,\n): Promise<T | null> {\n if (!isRoot && options.filter && !options.filter(node)) {\n return null\n }\n\n return Promise.resolve(node)\n .then((clonedNode) => cloneSingleNode(clonedNode, options) as Promise<T>)\n .then((clonedNode) => cloneChildren(node, clonedNode, options))\n .then((clonedNode) => decorate(node, clonedNode, options))\n .then((clonedNode) => ensureSVGSymbols(clonedNode, options))\n}\n", "import { Options } from './types'\nimport { resolveUrl } from './util'\nimport { getMimeType } from './mimes'\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl'\n\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g\n\nfunction toRegex(url: string): RegExp {\n // eslint-disable-next-line no-useless-escape\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1')\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g')\n}\n\nexport function parseURLs(cssText: string): string[] {\n const urls: string[] = []\n\n cssText.replace(URL_REGEX, (raw, quotation, url) => {\n urls.push(url)\n return raw\n })\n\n return urls.filter((url) => !isDataUrl(url))\n}\n\nexport async function embed(\n cssText: string,\n resourceURL: string,\n baseURL: string | null,\n options: Options,\n getContentFromUrl?: (url: string) => Promise<string>,\n): Promise<string> {\n try {\n const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL\n const contentType = getMimeType(resourceURL)\n let dataURL: string\n if (getContentFromUrl) {\n const content = await getContentFromUrl(resolvedURL)\n dataURL = makeDataUrl(content, contentType)\n } else {\n dataURL = await resourceToDataURL(resolvedURL, contentType, options)\n }\n return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`)\n } catch (error) {\n // pass\n }\n return cssText\n}\n\nfunction filterPreferredFontFormat(\n str: string,\n { preferredFontFormat }: Options,\n): string {\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, (match: string) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || []\n if (!format) {\n return ''\n }\n\n if (format === preferredFontFormat) {\n return `src: ${src};`\n }\n }\n })\n}\n\nexport function shouldEmbed(url: string): boolean {\n return url.search(URL_REGEX) !== -1\n}\n\nexport async function embedResources(\n cssText: string,\n baseUrl: string | null,\n options: Options,\n): Promise<string> {\n if (!shouldEmbed(cssText)) {\n return cssText\n }\n\n const filteredCSSText = filterPreferredFontFormat(cssText, options)\n const urls = parseURLs(filteredCSSText)\n return urls.reduce(\n (deferred, url) =>\n deferred.then((css) => embed(css, url, baseUrl, options)),\n Promise.resolve(filteredCSSText),\n )\n}\n", "import { Options } from './types'\nimport { embedResources } from './embed-resources'\nimport { toArray, isInstanceOfElement } from './util'\nimport { isDataUrl, resourceToDataURL } from './dataurl'\nimport { getMimeType } from './mimes'\n\nasync function embedProp(\n propName: string,\n node: HTMLElement,\n options: Options,\n) {\n const propValue = node.style?.getPropertyValue(propName)\n if (propValue) {\n const cssString = await embedResources(propValue, null, options)\n node.style.setProperty(\n propName,\n cssString,\n node.style.getPropertyPriority(propName),\n )\n return true\n }\n return false\n}\n\nasync function embedBackground<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n ;(await embedProp('background', clonedNode, options)) ||\n (await embedProp('background-image', clonedNode, options))\n ;(await embedProp('mask', clonedNode, options)) ||\n (await embedProp('-webkit-mask', clonedNode, options)) ||\n (await embedProp('mask-image', clonedNode, options)) ||\n (await embedProp('-webkit-mask-image', clonedNode, options))\n}\n\nasync function embedImageNode<T extends HTMLElement | SVGImageElement>(\n clonedNode: T,\n options: Options,\n) {\n const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement)\n\n if (\n !(isImageElement && !isDataUrl(clonedNode.src)) &&\n !(\n isInstanceOfElement(clonedNode, SVGImageElement) &&\n !isDataUrl(clonedNode.href.baseVal)\n )\n ) {\n return\n }\n\n const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal\n\n const dataURL = await resourceToDataURL(url, getMimeType(url), options)\n await new Promise((resolve, reject) => {\n clonedNode.onload = resolve\n clonedNode.onerror = options.onImageErrorHandler\n ? (...attributes) => {\n try {\n resolve(options.onImageErrorHandler!(...attributes))\n } catch (error) {\n reject(error)\n }\n }\n : reject\n\n const image = clonedNode as HTMLImageElement\n if (image.decode) {\n image.decode = resolve as any\n }\n\n if (image.loading === 'lazy') {\n image.loading = 'eager'\n }\n\n if (isImageElement) {\n clonedNode.srcset = ''\n clonedNode.src = dataURL\n } else {\n clonedNode.href.baseVal = dataURL\n }\n })\n}\n\nasync function embedChildren<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n const children = toArray<HTMLElement>(clonedNode.childNodes)\n const deferreds = children.map((child) => embedImages(child, options))\n await Promise.all(deferreds).then(() => clonedNode)\n}\n\nexport async function embedImages<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n if (isInstanceOfElement(clonedNode, Element)) {\n await embedBackground(clonedNode, options)\n await embedImageNode(clonedNode, options)\n await embedChildren(clonedNode, options)\n }\n}\n", "import type { Options } from './types'\n\nexport function applyStyle<T extends HTMLElement>(\n node: T,\n options: Options,\n): T {\n const { style } = node\n\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor\n }\n\n if (options.width) {\n style.width = `${options.width}px`\n }\n\n if (options.height) {\n style.height = `${options.height}px`\n }\n\n const manual = options.style\n if (manual != null) {\n Object.keys(manual).forEach((key: any) => {\n style[key] = manual[key] as string\n })\n }\n\n return node\n}\n", "import type { Options } from './types'\nimport { toArray } from './util'\nimport { fetchAsDataURL } from './dataurl'\nimport { shouldEmbed, embedResources } from './embed-resources'\n\ninterface Metadata {\n url: string\n cssText: string\n}\n\nconst cssFetchCache: { [href: string]: Metadata } = {}\n\nasync function fetchCSS(url: string) {\n let cache = cssFetchCache[url]\n if (cache != null) {\n return cache\n }\n\n const res = await fetch(url)\n const cssText = await res.text()\n cache = { url, cssText }\n\n cssFetchCache[url] = cache\n\n return cache\n}\n\nasync function embedFonts(data: Metadata, options: Options): Promise<string> {\n let cssText = data.cssText\n const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g\n const fontLocs = cssText.match(/url\\([^)]+\\)/g) || []\n const loadFonts = fontLocs.map(async (loc: string) => {\n let url = loc.replace(regexUrl, '$1')\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href\n }\n\n return fetchAsDataURL<[string, string]>(\n url,\n options.fetchRequestInit,\n ({ result }) => {\n cssText = cssText.replace(loc, `url(${result})`)\n return [loc, result]\n },\n )\n })\n\n return Promise.all(loadFonts).then(() => cssText)\n}\n\nfunction parseCSS(source: string) {\n if (source == null) {\n return []\n }\n\n const result: string[] = []\n const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi\n // strip out comments\n let cssText = source.replace(commentsRegex, '')\n\n // eslint-disable-next-line prefer-regex-literals\n const keyframesRegex = new RegExp(\n '((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})',\n 'gi',\n )\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const matches = keyframesRegex.exec(cssText)\n if (matches === null) {\n break\n }\n result.push(matches[0])\n }\n cssText = cssText.replace(keyframesRegex, '')\n\n const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi\n // to match css & media queries together\n const combinedCSSRegex =\n '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})'\n // unified regex\n const unifiedRegex = new RegExp(combinedCSSRegex, 'gi')\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let matches = importRegex.exec(cssText)\n if (matches === null) {\n matches = unifiedRegex.exec(cssText)\n if (matches === null) {\n break\n } else {\n importRegex.lastIndex = unifiedRegex.lastIndex\n }\n } else {\n unifiedRegex.lastIndex = importRegex.lastIndex\n }\n result.push(matches[0])\n }\n\n return result\n}\n\nasync function getCSSRules(\n styleSheets: CSSStyleSheet[],\n options: Options,\n): Promise<CSSStyleRule[]> {\n const ret: CSSStyleRule[] = []\n const deferreds: Promise<number | void>[] = []\n\n // First loop inlines imports\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray<CSSRule>(sheet.cssRules || []).forEach((item, index) => {\n if (item.type === CSSRule.IMPORT_RULE) {\n let importIndex = index + 1\n const url = (item as CSSImportRule).href\n const deferred = fetchCSS(url)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) =>\n parseCSS(cssText).forEach((rule) => {\n try {\n sheet.insertRule(\n rule,\n rule.startsWith('@import')\n ? (importIndex += 1)\n : sheet.cssRules.length,\n )\n } catch (error) {\n console.error('Error inserting rule from remote css', {\n rule,\n error,\n })\n }\n }),\n )\n .catch((e) => {\n console.error('Error loading remote css', e.toString())\n })\n\n deferreds.push(deferred)\n }\n })\n } catch (e) {\n const inline =\n styleSheets.find((a) => a.href == null) || document.styleSheets[0]\n if (sheet.href != null) {\n deferreds.push(\n fetchCSS(sheet.href)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) =>\n parseCSS(cssText).forEach((rule) => {\n inline.insertRule(rule, inline.cssRules.length)\n }),\n )\n .catch((err: unknown) => {\n console.error('Error loading remote stylesheet', err)\n }),\n )\n }\n console.error('Error inlining remote css file', e)\n }\n }\n })\n\n return Promise.all(deferreds).then(() => {\n // Second loop parses rules\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray<CSSStyleRule>(sheet.cssRules || []).forEach((item) => {\n ret.push(item)\n })\n } catch (e) {\n console.error(`Error while reading CSS rules from ${sheet.href}`, e)\n }\n }\n })\n\n return ret\n })\n}\n\nfunction getWebFontRules(cssRules: CSSStyleRule[]): CSSStyleRule[] {\n return cssRules\n .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')))\n}\n\nasync function parseWebFontRules<T extends HTMLElement>(\n node: T,\n options: Options,\n) {\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document')\n }\n\n const styleSheets = toArray<CSSStyleSheet>(node.ownerDocument.styleSheets)\n const cssRules = await getCSSRules(styleSheets, options)\n\n return getWebFontRules(cssRules)\n}\n\nfunction normalizeFontFamily(font: string) {\n return font.trim().replace(/[\"']/g, '')\n}\n\nfunction getUsedFonts(node: HTMLElement) {\n const fonts = new Set<string>()\n function traverse(node: HTMLElement) {\n const fontFamily =\n node.style.fontFamily || getComputedStyle(node).fontFamily\n fontFamily.split(',').forEach((font) => {\n fonts.add(normalizeFontFamily(font))\n })\n\n Array.from(node.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n traverse(child)\n }\n })\n }\n traverse(node)\n return fonts\n}\n\nexport async function getWebFontCSS<T extends HTMLElement>(\n node: T,\n options: Options,\n): Promise<string> {\n const rules = await parseWebFontRules(node, options)\n const usedFonts = getUsedFonts(node)\n const cssTexts = await Promise.all(\n rules\n .filter((rule) =>\n usedFonts.has(normalizeFontFamily(rule.style.fontFamily)),\n )\n .map((rule) => {\n const baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null\n return embedResources(rule.cssText, baseUrl, options)\n }),\n )\n\n return cssTexts.join('\\n')\n}\n\nexport async function embedWebFonts<T extends HTMLElement>(\n clonedNode: T,\n options: Options,\n) {\n const cssText =\n options.fontEmbedCSS != null\n ? options.fontEmbedCSS\n : options.skipFonts\n ? null\n : await getWebFontCSS(clonedNode, options)\n\n if (cssText) {\n const styleNode = document.createElement('style')\n const sytleContent = document.createTextNode(cssText)\n\n styleNode.appendChild(sytleContent)\n\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild)\n } else {\n clonedNode.appendChild(styleNode)\n }\n }\n}\n", "import { Options } from './types'\nimport { cloneNode } from './clone-node'\nimport { embedImages } from './embed-images'\nimport { applyStyle } from './apply-style'\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts'\nimport {\n getImageSize,\n getPixelRatio,\n createImage,\n canvasToBlob,\n nodeToDataURL,\n checkCanvasDimensions,\n} from './util'\n\nexport async function toSvg<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n const { width, height } = getImageSize(node, options)\n const clonedNode = (await cloneNode(node, options, true)) as HTMLElement\n await embedWebFonts(clonedNode, options)\n await embedImages(clonedNode, options)\n applyStyle(clonedNode, options)\n const datauri = await nodeToDataURL(clonedNode, width, height)\n return datauri\n}\n\nexport async function toCanvas<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<HTMLCanvasElement> {\n const { width, height } = getImageSize(node, options)\n const svg = await toSvg(node, options)\n const img = await createImage(svg)\n\n const canvas = document.createElement('canvas')\n const context = canvas.getContext('2d')!\n const ratio = options.pixelRatio || getPixelRatio()\n const canvasWidth = options.canvasWidth || width\n const canvasHeight = options.canvasHeight || height\n\n canvas.width = canvasWidth * ratio\n canvas.height = canvasHeight * ratio\n\n if (!options.skipAutoScale) {\n checkCanvasDimensions(canvas)\n }\n canvas.style.width = `${canvasWidth}`\n canvas.style.height = `${canvasHeight}`\n\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor\n context.fillRect(0, 0, canvas.width, canvas.height)\n }\n\n context.drawImage(img, 0, 0, canvas.width, canvas.height)\n\n return canvas\n}\n\nexport async function toPixelData<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<Uint8ClampedArray> {\n const { width, height } = getImageSize(node, options)\n const canvas = await toCanvas(node, options)\n const ctx = canvas.getContext('2d')!\n return ctx.getImageData(0, 0, width, height).data\n}\n\nexport async function toPng<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n const canvas = await toCanvas(node, options)\n return canvas.toDataURL()\n}\n\nexport async function toJpeg<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n const canvas = await toCanvas(node, options)\n return canvas.toDataURL('image/jpeg', options.quality || 1)\n}\n\nexport async function toBlob<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<Blob | null> {\n const canvas = await toCanvas(node, options)\n const blob = await canvasToBlob(canvas)\n return blob\n}\n\nexport async function getFontEmbedCSS<T extends HTMLElement>(\n node: T,\n options: Options = {},\n): Promise<string> {\n return getWebFontCSS(node, options)\n}\n", "import { getCompInit } from '#rx'\nimport { Filter } from './FilterClass'\nimport { getNormalRoot } from './filter.utils'\nimport * as htmlToImage from 'html-to-image'\n\n// use this in rx-based apps\nclass FilterRxComp extends Filter {\n\tconstructor(opts) {\n\t\tsuper(opts)\n\t\tthis.type = 'filter'\n\t\tthis.parentId = opts.parentId\n\t\tthis.initHolder()\n\t\t// rx.getCompInit() will create this.opts, this.api\n\t}\n\n\tasync preApiFreeze(api) {\n\t\tapi.main = this.main.bind(this)\n\t\tapi.getNormalRoot = () => getNormalRoot(this.rawFilter)\n\t\tapi.getFilterImage = async () => {\n\t\t\t//clone node and append to body temporarily to ensure that the node is rendered properly. Otherwise if the filter is not visible on screen, the image will be blank.\n\t\t\tconst node = this.dom.filterContainer.node().cloneNode(true)\n\t\t\tdocument.body.appendChild(node)\n\n\t\t\tconst dataUrl = await htmlToImage.toPng(node, {\n\t\t\t\tquality: 0.95,\n\t\t\t\tstyle: {\n\t\t\t\t\tbackground: 'white'\n\t\t\t\t}\n\t\t\t})\n\t\t\tdocument.body.removeChild(node)\n\t\t\tif (dataUrl === 'data:,')\n\t\t\t\t//empty filter\n\t\t\t\treturn null\n\t\t\treturn dataUrl\n\t\t}\n\t}\n\n\tgetState(appState) {\n\t\tconst parentConfig = this.parentId && appState.plots.find(p => p.id === this.parentId)\n\t\tconst defaultFilter = { type: 'tvslst', join: '', lst: [] }\n\t\treturn {\n\t\t\t// if there is parentConfig, assume this is UI for a local filter,\n\t\t\t// otherwise this UI is for global app filter\n\t\t\ttermfilter: parentConfig ? { filter: parentConfig.filter || defaultFilter } : appState.termfilter,\n\t\t\tactiveCohort: appState.activeCohort\n\t\t}\n\t}\n\n\tasync main(rawFilter = null) {\n\t\tthis.dom.controlsTip.hide()\n\t\tthis.dom.treeTip.hide()\n\t\tconst f = this.state && this.state.termfilter\n\t\tif (!f) {\n\t\t\tthis.dom.holder.style('display', 'none')\n\t\t\treturn\n\t\t}\n\t\tthis.dom.holder.style('display', 'inline-block')\n\t\tconst filter = structuredClone(rawFilter || f?.filter)\n\t\tif (filter.lst.length < 2) filter.join = ''\n\t\tthis.rawCopy = JSON.stringify(filter)\n\t\tsuper.main(this.rawCopy, { activeCohort: this.state.activeCohort })\n\t}\n\n\tinitHolder() {\n\t\tconst div = this.dom.holder\n\t\t\t.attr('class', 'filter_div')\n\t\t\t.style('position', 'relative')\n\t\t\t.style('width', 'fit-content')\n\t\t\t.style('margin', '10px')\n\t\t\t.style('margin-top', '5px')\n\t\t\t.style('display', 'table')\n\t\t\t.style('border', this.opts.hideLabel ? 'none' : 'solid 1px #ddd')\n\n\t\tif (this.opts.hideLabel) {\n\t\t\tthis.dom.filterDiv = div.style('display', 'inline-block').style('padding', '5px 10px')\n\t\t} else {\n\t\t\tdiv.append('span').text('Filter').style('padding', '0 10px')\n\n\t\t\tthis.dom.filterDiv = div.append('div').style('display', 'inline-block').style('padding', '5px 10px')\n\t\t}\n\t}\n}\n\nexport const filterRxCompInit = getCompInit(FilterRxComp)\n", "import { getInitFxn, Bus } from '#rx'\nimport { Filter } from './FilterClass'\nimport { getNormalRoot, getFilterItemByTag, findParent } from './filter.utils'\n\n// use this as a non-rx, stateless component\n// BUT where there a filterUiRoot tag is used and would need to be handled\n// correctly when refreshing the filter data and UI\nclass FilterPrompt extends Filter {\n\tconstructor(opts) {\n\t\tsuper(opts)\n\t\tthis.api = {\n\t\t\t// make sure to bind the 'this' context to the filter instance\n\t\t\t// instead of to the this.api object\n\t\t\tmain: this.main.bind(this),\n\t\t\t/*\n\t\t\t\tWARNING!!!\n\t\t\t\tWhen using this filter.api.getNormalRoot(),\n\t\t\t\tmake sure this instance has been updated before the caller,\n\t\t\t\totherwise the normalized root will be stale\n\n\t\t\t\tor for reliability, import getNormalRoot() directly \n\t\t\t\tfrom the common/filter.js component and supply the \n\t\t\t\tcaller's known raw filter state\n\t\t\t*/\n\t\t\tgetNormalRoot: () => getNormalRoot(this.rawFilter),\n\t\t\tgetPromise: name => this.promises[name],\n\t\t\tdestroy: () => this.destroy()\n\t\t}\n\n\t\tif (opts.debug) this.api.Inner = this\n\t}\n\n\tasync main(rawFilter, opts = {}) {\n\t\tthis.dom.controlsTip.hide()\n\t\tthis.dom.treeTip.hide()\n\t\tconst activeCohort = 'activeCohort' in opts ? opts.activeCohort : this.activeCohort\n\t\tconst filterUiRoot = getFilterItemByTag(rawFilter, 'filterUiRoot')\n\t\t// always replace the filterUiRoot with a tvslst object that has an empty lst,\n\t\t// so that the prompt will always be displayed\n\t\tif (filterUiRoot) delete filterUiRoot.tag\n\t\trawFilter.lst.push({\n\t\t\ttag: 'filterUiRoot',\n\t\t\ttype: 'tvslst',\n\t\t\tjoin: '',\n\t\t\tlst: []\n\t\t})\n\t\trawFilter.join = rawFilter.lst.length > 1 ? 'and' : ''\n\t\tconst rawCopy = JSON.stringify(rawFilter)\n\t\t// if the filter data and active cohort has not changed, do not trigger a re-render\n\t\tif (this.rawCopy == rawCopy && JSON.stringify(this.activeCohort) == JSON.stringify(activeCohort)) return\n\t\t// call the parent's main() method\n\t\tawait super.main(rawCopy, opts)\n\t}\n\n\trefresh(filterUiRoot) {\n\t\tthis.dom.controlsTip.hide()\n\t\tthis.dom.treeTip.hide()\n\t\tconst rootCopy = JSON.parse(JSON.stringify(this.rawFilter))\n\t\tconst rawParent = findParent(rootCopy, this.filter.$id)\n\t\tif (!rawParent || this.rawFilter.$id === this.filter.$id) {\n\t\t\tthis.opts.callback(rootCopy)\n\t\t} else {\n\t\t\tconst i = rawParent.lst.findIndex(f => f.$id == this.filter.$id)\n\t\t\trawParent.lst[i] = filterUiRoot\n\t\t\tthis.opts.callback(rootCopy)\n\t\t}\n\t\t// remove the filled-in filterUiRoot from this filter prompt,\n\t\t// so that the selected filter data does not get carried over\n\t\t// to future selections from this prompt\n\t\tconst i = rootCopy.lst.findIndex(f => f.$id === filterUiRoot.$id)\n\t\trootCopy.lst.splice(i, 1)\n\t\tthis.main(rootCopy)\n\t}\n}\n\nexport const filterPromptInit = getInitFxn(FilterPrompt)\n", "import { addGeneSearchbox } from '../genesearch.ts'\nimport { Menu } from '#dom'\nimport { select } from 'd3-selection'\nimport { mclass, dt2color, dt2label } from '#shared/common.js'\nimport { TermTypes } from '#shared/terms.js'\nimport type { Button, Div, Elem } from '../../types/d3'\nimport type { ClientGenome } from '../../types/clientGenome'\nimport type { GeneArgumentEntry } from '#types'\nimport { GenesMenu } from './GenesMenu'\nimport { addButton } from './addButton.ts'\nimport { dofetch3 } from '#common/dofetch'\nimport { getNormalRoot } from '#filter/filter'\n\ntype API = {\n\tdom: {\n\t\tholder: Div\n\t\t/** text links above the gene holding div\n\t\t * Opens a menu to select genes from different datasets\n\t\t */\n\t\ttextControlDiv: Div\n\t\t/** on click clears the gene holding div */\n\t\tclearBtn: Button\n\t\t/** on click populates the geneHoldingDiv with original gene list */\n\t\trestoreBtn: Button | null\n\t\t/** gene holding area, shows bunch of gene buttons pending submission */\n\t\tgeneHoldingDiv: Div\n\t\t/** legend area, to show available stats legend on genes */\n\t\tstatLegendDiv: Div\n\t\t/** Submit button */\n\t\tsubmitBtn: Button\n\t}\n\t/** originally .params and split into two\n\t * Derived from termdbConfig.queries.topMutatedGenes.arguments\n\t * input for the param is add in the gene set menu\n\t */\n\ttopMutatedGenesParams: { param: GeneArgumentEntry; input?: any }[]\n\t/** Derived from termdbConfig.queries.topVariablyExpressedGenes.arguments\n\t * input for the param is add in the gene set menu\n\t */\n\ttopVariablyExpressedGenesParams: { param: GeneArgumentEntry; input?: any }[]\n\t/** while rendering each gene button, if gene stat is available,\n\t * it records color and labels for each color,\n\t * to be shown in statLegendDiv */\n\tstatColor2label: Map<string, any>\n\t/** destory the original menu (i.e. tip == opts.holder) */\n\tdestroy: () => void\n}\n\ntype Gene = {\n\tgene: string\n\tmutationStat?: { class: string; count: number; dt?: number }[]\n}\n\nexport type CallbackArg = {\n\tgeneList: Gene[]\n\t/** optional, gene set name */\n\tname?: string\n}\n\n/** optional instruction to add new button(s) and pull in gene sets by custom-designed means.\n * used by gdc oncomatrix react wrapper to call the GFF gene set modal */\ntype CustomInputs = {\n\t/** button name */\n\tlabel: string\n\t/** Change button display based on caller logic */\n\tgetDisplayStyle?: () => void\n\t/** callback to trigger upon clicking this button. should show some ui to collect\n\t * gene names and bring them into holding box */\n\tshowInput: (arg: any) => void\n}[]\n\nexport type GeneSetEditArg = {\n\tholder: Elem\n\tgenome: ClientGenome\n\t/** Optional: If provided, allow to load top variably mutated ('geneVariant') or\n\t * expressed genes ('geneExpression'). If not provided, only allow to add genes manually\n\t * later can be union of multiple mode strings */\n\tmode?: 'geneVariant' | 'geneExpression'\n\t/** Minimum number of genes to return in the callback */\n\tminNumGenes?: number\n\t/** Maxiumum number of genes allowed in gene set */\n\tmaxNumGenes?: number\n\t/** What to do with the genes returned */\n\tcallback: (arg: CallbackArg) => void\n\t/** passed termdb instance */\n\tvocabApi: any\n\t/** List of genes returned by the callback */\n\tgeneList?: Gene[]\n\t/** Title appearing above the UI */\n\ttitleText?: string\n\tcustomInputs?: CustomInputs\n\t/** Pass the genes available to be used by the caller. When not in the limited\n\t * list, genes will appear with a strikethrough */\n\tlimitedGenesList?: string[]\n\t/** show the terms in the order of input*/\n\ttermsAsListed?: boolean\n\t/** show input for geneset name */\n\tnameInput?: boolean\n}\n\ntype MenuListEntry = {\n\t/** Label shown, either on the button or link */\n\tlabel: string\n\t/** For buttons, set display per condition(s) */\n\tgetDisplayStyle?: () => string\n\tcallback: (f?: any) => void\n\t/** Element tagname. If button, uses addButton to create elem */\n\ttagName?: string\n}\n\nexport class GeneSetEditUI {\n\tholder: Elem\n\tgenome: ClientGenome\n\tcallback: (arg: CallbackArg) => void\n\t/** termdb */\n\tvocabApi: any\n\ttip2: Menu\n\torigLst: Gene[]\n\torigNames: string\n\tapi: API\n\tgeneSearch: any //cheating\n\t/** Objects detailing the menus to create above the api.dom.geneHoldingDiv as clickable links */\n\tmenuList: MenuListEntry[]\n\tmode?: 'geneVariant' | 'geneExpression'\n\tminNumGenes?: number\n\tmaxNumGenes?: number\n\tupdateName: boolean // whether to update gene set name upon user input\n\tnameInput?: any\n\tgeneList: Gene[]\n\ttitleText?: string\n\tcustomInputs?: CustomInputs\n\tlimitedGenesList?: string[]\n\ttermsAsListed?: boolean\n\n\tconstructor(opts: GeneSetEditArg) {\n\t\tthis.holder = opts.holder\n\t\tthis.genome = opts.genome\n\t\tthis.callback = opts.callback\n\t\tthis.vocabApi = opts.vocabApi\n\t\tthis.termsAsListed = opts.termsAsListed\n\t\tthis.customInputs = opts.customInputs\n\t\tthis.geneList = structuredClone(opts.geneList || [])\n\t\tthis.tip2 = new Menu({ padding: '0px', parent_menu: opts.holder.node(), test: 'test' })\n\t\tthis.updateName = true\n\t\tthis.minNumGenes = opts.minNumGenes || 0\n\t\tif ('maxNumGenes' in opts) this.maxNumGenes = opts.maxNumGenes\n\t\tif ('mode' in opts) this.mode = opts.mode\n\t\tif ('titleText' in opts) this.titleText = opts.titleText\n\t\tthis.origLst = structuredClone(this.geneList)\n\t\tthis.origNames = opts.termsAsListed\n\t\t\t? JSON.stringify(this.geneList.map(t => t.gene))\n\t\t\t: JSON.stringify(this.geneList.map(t => t.gene).sort())\n\n\t\tthis.holder.selectAll('*').remove()\n\t\tconst div = this.holder.append('div').attr('class', 'sja_genesetinput').style('padding', '5px')\n\n\t\tif (this.titleText) {\n\t\t\tdiv.append('div').style('margin-bottom', '10px').html(this.titleText)\n\t\t}\n\t\tif (opts.limitedGenesList) {\n\t\t\tthis.limitedGenesList = opts.limitedGenesList\n\t\t}\n\n\t\tconst headerDiv = div.append('div')\n\n\t\tconst label = headerDiv.append('label')\n\t\tlabel.append('span').html('Search')\n\t\tconst row = label\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-flex')\n\t\t\t.style('align-items', 'center')\n\t\t\t.style('margin', '8px 0px -5px 0px')\n\n\t\t// a holder to render optional buttons\n\t\tconst controlDiv = headerDiv\n\t\t\t.append('div')\n\t\t\t.style('display', 'inline-flex')\n\t\t\t.style('align-items', 'center')\n\t\t\t.style('float', 'right')\n\t\t\t.style('gap', '5px')\n\n\t\tconst addGene = this.addGene.bind(this)\n\t\tthis.geneSearch = addGeneSearchbox({\n\t\t\ttip: this.tip2,\n\t\t\tgenome: this.genome,\n\t\t\trow,\n\t\t\tsearchOnly: 'gene',\n\t\t\tcallback: addGene,\n\t\t\thideHelp: true,\n\t\t\tfocusOff: true\n\t\t})\n\n\t\tif (opts.nameInput) {\n\t\t\t// display input for geneset name\n\t\t\tconst nameDiv = row.append('div').style('margin-left', '10px')\n\t\t\tnameDiv.append('span').text('Name')\n\t\t\tthis.nameInput = nameDiv\n\t\t\t\t.append('input')\n\t\t\t\t.attr('data-testid', 'sja_genesetinput_name')\n\t\t\t\t.attr('type', 'text')\n\t\t\t\t.style('width', '150px')\n\t\t}\n\n\t\tthis.menuList = []\n\n\t\tthis.api = {\n\t\t\tdom: {\n\t\t\t\tholder: div,\n\t\t\t\ttextControlDiv: controlDiv.append('div'),\n\t\t\t\tclearBtn: addButton({\n\t\t\t\t\tdiv: controlDiv,\n\t\t\t\t\ttext: 'Clear',\n\t\t\t\t\tdisabled: !this.geneList?.length,\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tthis.geneList = []\n\t\t\t\t\t\tthis.updateName = true\n\t\t\t\t\t\tthis.renderGenes()\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\trestoreBtn: this.geneList?.length\n\t\t\t\t\t? addButton({\n\t\t\t\t\t\t\tdiv: controlDiv,\n\t\t\t\t\t\t\tdisabled: true,\n\t\t\t\t\t\t\ttext: 'Restore',\n\t\t\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\t\t\tthis.geneList = this.origLst\n\t\t\t\t\t\t\t\tthis.renderGenes()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t })\n\t\t\t\t\t: null,\n\t\t\t\tgeneHoldingDiv: this.renderGeneHoldingDiv(div),\n\t\t\t\tstatLegendDiv: div.append('div'),\n\t\t\t\tsubmitBtn: addButton({\n\t\t\t\t\tdiv: div.append('div').style('margin-top', '10px'),\n\t\t\t\t\ttext: 'Submit',\n\t\t\t\t\tdisabled: !this.geneList?.length,\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tif (this.maxNumGenes && this.geneList.length > this.maxNumGenes) {\n\t\t\t\t\t\t\twindow.alert(\n\t\t\t\t\t\t\t\t`Gene set size (${this.geneList.length} genes) exceeds the allowed limit (${this.maxNumGenes} genes).`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.api.dom.submitBtn.property('disabled', true).text('Loading...') // to prevent repeated clicking and triggering callback. when this ui is used in geneVariant tw edit, it can keep showing a while after user clicks btn thus this fix is needed\n\t\t\t\t\t\tconst result: CallbackArg = { geneList: this.geneList }\n\t\t\t\t\t\tif (this.nameInput) result.name = this.nameInput.property('value')\n\t\t\t\t\t\tthis.callback(result)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t\ttopMutatedGenesParams: [],\n\t\t\ttopVariablyExpressedGenesParams: [],\n\t\t\tstatColor2label: new Map(),\n\t\t\tdestroy() {\n\t\t\t\topts.holder.remove()\n\t\t\t}\n\t\t}\n\t\tthis.getParams()\n\t\tthis.createMenuList()\n\t\tthis.renderTextControls(this.api.dom.textControlDiv)\n\t\tthis.renderGenes()\n\t}\n\n\tgetParams() {\n\t\tif (this.mode == TermTypes.GENE_VARIANT && this.vocabApi.termdbConfig?.queries?.topMutatedGenes) {\n\t\t\tif (this.vocabApi.termdbConfig.queries.topMutatedGenes.arguments) {\n\t\t\t\tfor (const param of this.vocabApi.termdbConfig.queries.topMutatedGenes.arguments)\n\t\t\t\t\tthis.api.topMutatedGenesParams.push({ param })\n\t\t\t}\n\t\t}\n\t\tif (this.mode == TermTypes.GENE_EXPRESSION && this.vocabApi.termdbConfig?.queries?.topVariablyExpressedGenes) {\n\t\t\tif (this.vocabApi.termdbConfig.queries.topVariablyExpressedGenes.arguments) {\n\t\t\t\tfor (const param of this.vocabApi.termdbConfig.queries.topVariablyExpressedGenes.arguments) {\n\t\t\t\t\tif (param.type == 'radio' && (!param.options || param.options.length == 0))\n\t\t\t\t\t\tthrow 'Radio button must have options'\n\t\t\t\t\tthis.api.topVariablyExpressedGenesParams.push({ param })\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tbaseGeneMenuArgs(arr) {\n\t\tarr = this.removeDuplicates(arr)\n\t\treturn {\n\t\t\ttip: this.tip2,\n\t\t\tgenome: this.genome,\n\t\t\tparams: arr,\n\t\t\taddOptionalParams: ({ param, input }) => {\n\t\t\t\tarr.push({ param, input })\n\t\t\t}\n\t\t}\n\t}\n\n\tremoveDuplicates(arr) {\n\t\tfor (const param of arr) {\n\t\t\tif (param.param?.options) {\n\t\t\t\tparam.param.options.forEach(opt => {\n\t\t\t\t\tif (!opt.id) return\n\t\t\t\t\tconst i = arr.findIndex(i => i.param.id == opt.id)\n\t\t\t\t\tif (i != -1) arr.splice(i, 1)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn arr\n\t}\n\n\tcreateMenuList() {\n\t\tif (this.api?.topMutatedGenesParams.length > 0) {\n\t\t\tthis.menuList.push({\n\t\t\t\tlabel: 'Top mutated genes',\n\t\t\t\tcallback: async (event: Event) => {\n\t\t\t\t\tthis.tip2.clear().showunder(event.target)\n\t\t\t\t\tconst callback = async () => {\n\t\t\t\t\t\tconst args = {\n\t\t\t\t\t\t\tgenome: this.vocabApi.vocab.genome,\n\t\t\t\t\t\t\tdslabel: this.vocabApi.vocab.dslabel,\n\t\t\t\t\t\t\tfilter: this.vocabApi.state.termfilter.filter,\n\t\t\t\t\t\t\tfilter0: this.vocabApi.state.termfilter.filter0\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.getInputs(this.api.topMutatedGenesParams, args)\n\t\t\t\t\t\tconst result = await dofetch3('termdb/topMutatedGenes', { method: 'GET', body: args })\n\n\t\t\t\t\t\tthis.geneList = []\n\t\t\t\t\t\tthis.geneList.push(...result.genes)\n\t\t\t\t\t\tthis.renderGenes()\n\t\t\t\t\t}\n\t\t\t\t\tconst menuArgs = Object.assign(this.baseGeneMenuArgs(this.api.topMutatedGenesParams), { callback })\n\t\t\t\t\tnew GenesMenu(menuArgs)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (this.api?.topVariablyExpressedGenesParams.length > 0) {\n\t\t\tthis.menuList.push({\n\t\t\t\tlabel: 'Top variably expressed genes',\n\t\t\t\tcallback: (event: Event) => {\n\t\t\t\t\tthis.api.topVariablyExpressedGenesParams\n\t\t\t\t\t\t.filter(p => p.param.type == 'radio' && p.param?.options)\n\t\t\t\t\t\t.forEach(p => {\n\t\t\t\t\t\t\t//Sets the default value of the radio button to the first option\n\t\t\t\t\t\t\t//for top VE args, it will always be a string\n\t\t\t\t\t\t\tif (typeof p.param.options![0].value === 'string') {\n\t\t\t\t\t\t\t\tp.param.value = { type: p.param.options![0].value, value: null }\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconsole.error(`Unexpected radio button value type: ${typeof p.param.options![0].value}`)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\tthis.tip2.clear().showunder(event.target)\n\t\t\t\t\tconst callback = async () => {\n\t\t\t\t\t\tconst args: any = {\n\t\t\t\t\t\t\tgenome: this.vocabApi.state.vocab.genome,\n\t\t\t\t\t\t\tdslabel: this.vocabApi.state.vocab.dslabel\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// supply filters from app state\n\t\t\t\t\t\tif (this.vocabApi.state.termfilter) {\n\t\t\t\t\t\t\tif (this.vocabApi.state.termfilter.filter)\n\t\t\t\t\t\t\t\targs.filter = getNormalRoot(this.vocabApi.state.termfilter.filter) // pp filter\n\t\t\t\t\t\t\tif (this.vocabApi.state.termfilter.filter0) args.filter0 = this.vocabApi.state.termfilter.filter0 // gdc filter\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.getInputs(this.api.topVariablyExpressedGenesParams, args)\n\t\t\t\t\t\tconst result = await this.vocabApi.getTopVariablyExpressedGenes(args)\n\n\t\t\t\t\t\tthis.geneList = []\n\t\t\t\t\t\tif (result.genes) {\n\t\t\t\t\t\t\tfor (const gene of result.genes) this.geneList.push({ gene })\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.renderGenes()\n\t\t\t\t\t}\n\n\t\t\t\t\tconst menuArgs = Object.assign(this.baseGeneMenuArgs(this.api.topVariablyExpressedGenesParams), { callback })\n\t\t\t\t\tnew GenesMenu(menuArgs)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (this.genome?.termdbs?.msigdb) {\n\t\t\tfor (const key in this.genome.termdbs) {\n\t\t\t\tconst tdb = this.genome.termdbs[key]\n\t\t\t\tthis.menuList.push({\n\t\t\t\t\tlabel: `${tdb.label} gene set`,\n\t\t\t\t\tcallback: async () => {\n\t\t\t\t\t\tthis.tip2.clear().showunder(this.api.dom.textControlDiv.node()!)\n\t\t\t\t\t\tconst termdb = await import('../../termdb/app.js')\n\t\t\t\t\t\ttermdb.appInit({\n\t\t\t\t\t\t\tholder: this.tip2.d,\n\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\tdslabel: key,\n\t\t\t\t\t\t\t\tgenome: this.genome.name,\n\t\t\t\t\t\t\t\tnav: {\n\t\t\t\t\t\t\t\t\theader_mode: 'search_only'\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttree: {\n\t\t\t\t\t\t\t\tclick_term: term => {\n\t\t\t\t\t\t\t\t\tthis.geneList = []\n\t\t\t\t\t\t\t\t\tconst geneset = term._geneset\n\t\t\t\t\t\t\t\t\tif (geneset) {\n\t\t\t\t\t\t\t\t\t\tfor (const gene of geneset) this.geneList.push({ gene: gene.symbol })\n\t\t\t\t\t\t\t\t\t\tthis.renderGenes(term.name)\n\t\t\t\t\t\t\t\t\t\t// disable name update to retain msigdb gene set name\n\t\t\t\t\t\t\t\t\t\t// when user modifies gene set\n\t\t\t\t\t\t\t\t\t\tthis.updateName = false\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.tip2.hide()\n\t\t\t\t\t\t\t\t\tthis.api.dom.submitBtn.node()!.focus()\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (this.customInputs) {\n\t\t\tfor (const btn of this.customInputs) {\n\t\t\t\tconst opts = {\n\t\t\t\t\tlabel: btn.label,\n\t\t\t\t\tcallback: () => {\n\t\t\t\t\t\tbtn.showInput({\n\t\t\t\t\t\t\tcallback: ({ geneList }) => {\n\t\t\t\t\t\t\t\tthis.geneList = geneList\n\t\t\t\t\t\t\t\tthis.renderGenes()\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\ttagName: 'button'\n\t\t\t\t} as any\n\t\t\t\tif (btn.getDisplayStyle) opts.getDisplayStyle = btn.getDisplayStyle\n\t\t\t\tthis.menuList.push(opts)\n\t\t\t}\n\t\t}\n\t}\n\n\trenderTextControls(div: Div) {\n\t\tfor (const menu of this.menuList) {\n\t\t\tif (menu.tagName == 'button')\n\t\t\t\taddButton({\n\t\t\t\t\tdiv,\n\t\t\t\t\ttext: menu.label,\n\t\t\t\t\tgetDisplayStyle: menu.getDisplayStyle || (() => ''),\n\t\t\t\t\tcallback: menu.callback\n\t\t\t\t})\n\t\t\telse\n\t\t\t\tdiv\n\t\t\t\t\t.append('a')\n\t\t\t\t\t.style('text-decoration', 'underline')\n\t\t\t\t\t.style('padding', '0px 10px')\n\t\t\t\t\t.style('color', 'black')\n\t\t\t\t\t.html(`${menu.label} ▼`)\n\t\t\t\t\t.on('click', async (event: Event) => {\n\t\t\t\t\t\tawait menu.callback(event)\n\t\t\t\t\t})\n\t\t}\n\t}\n\n\tgetInputs(arr, args) {\n\t\tfor (const { param, input } of arr) {\n\t\t\tif (param.parentId) {\n\t\t\t\tconst parent = arr.find(i => i.param.id == param.parentId)\n\t\t\t\t//Parents are always checkboxes/boolean\n\t\t\t\t//Do not include submenu inputs in the request if not checked\n\t\t\t\tif (!parent || !parent.input.node().checked) return\n\t\t\t}\n\t\t\tconst id = input.attr('id')\n\t\t\targs[id] = this.getInputValue({ param, input })\n\t\t}\n\t}\n\n\tgetInputValue({ param, input }) {\n\t\tif (param.type == 'radio') return param.value\n\t\tconst value = input.node().value\n\t\tif (input.attr('type') == 'number') return Number(value)\n\t\tif (input.attr('type') == 'checkbox') {\n\t\t\tif (param.type == 'string') return input.node().checked ? param.value : ''\n\t\t\tif (param.type == 'boolean') return input.node().checked ? 1 : 0\n\t\t}\n\t}\n\n\trenderGeneHoldingDiv(div: Div) {\n\t\treturn div\n\t\t\t.append('div')\n\t\t\t.append('div')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('flex-wrap', 'wrap')\n\t\t\t.style('gap', '5px')\n\t\t\t.style('min-height', '20px')\n\t\t\t.style('border', 'solid 1px #aaa')\n\t\t\t.style('margin', '15px 0px')\n\t\t\t.style('padding', '6px 2px')\n\t\t\t.style('min-height', '30px')\n\t}\n\n\trenderStatLegend() {\n\t\tif (!this.api.statColor2label || this.api.statColor2label.size == 0) {\n\t\t\t// no legend to display\n\t\t\tthis.api.dom.statLegendDiv.style('display', 'none')\n\t\t\treturn\n\t\t}\n\t\tthis.api.dom.statLegendDiv.style('display', 'block').selectAll('*').remove()\n\t\tfor (const [c, n] of this.api.statColor2label) {\n\t\t\tthis.api.dom.statLegendDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('width', '12px')\n\t\t\t\t.style('height', '12px')\n\t\t\t\t.style('background-color', c)\n\t\t\tthis.api.dom.statLegendDiv.append('span').html(` ${n} `)\n\t\t}\n\t\treturn this.api.dom.statLegendDiv\n\t}\n\n\t/** Functions supporting adding/removing genes from the geneHoldingDiv */\n\taddGene() {\n\t\tconst gene = this.geneSearch.geneSymbol\n\t\tfor (const item of this.geneList) {\n\t\t\tif (item.gene == gene) {\n\t\t\t\twindow.alert(`The gene ${gene} has already been added`)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tif (gene) this.geneList.push({ gene })\n\t\tthis.renderGenes()\n\t}\n\n\trenderGenes(geneSetName?: string) {\n\t\tthis.api.dom.geneHoldingDiv.selectAll('*').remove()\n\n\t\tconst renderGene = this.renderGene.bind(this)\n\t\tconst deleteGene = this.deleteGene.bind(this)\n\n\t\tthis.api.dom.geneHoldingDiv\n\t\t\t.selectAll('div')\n\t\t\t.data(this.geneList || [])\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('aria-label', 'Click to delete')\n\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t.attr('tabindex', 0)\n\t\t\t.style('position', 'relative')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('padding', '5px 16px 5px 9px')\n\t\t\t.style('margin-left', '5px')\n\t\t\t.each(function (this: any, gene) {\n\t\t\t\tconst div = select(this).style('border-radius', '5px')\n\t\t\t\trenderGene(div, gene)\n\t\t\t\tdiv.on('click', () => deleteGene(gene))\n\t\t\t})\n\t\t\t// .on('click', deleteGene)\n\t\t\t.on('mouseover', function (event) {\n\t\t\t\tconst div = select(event.target)\n\t\t\t\tdiv\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('margin-left', '4px')\n\t\t\t\t\t.classed('sjpp_deletebt', true)\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.style('position', 'absolute')\n\t\t\t\t\t.style('right', '0px')\n\t\t\t\t\t.style('top', '0px')\n\n\t\t\t\t\t.style('transform', 'scale(0.6)')\n\t\t\t\t\t.style('pointer-events', 'none')\n\t\t\t\t\t.html(\n\t\t\t\t\t\t`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#000\" class=\"bi bi-x-lg\" viewBox=\"0 0 16 16\">\n <path stroke='#f00' d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n </svg>`\n\t\t\t\t\t)\n\t\t\t})\n\t\t\t.on('mouseout', function (event) {\n\t\t\t\tselect(event.target).select('.sjpp_deletebt').remove()\n\t\t\t})\n\t\t\t.on('focus', event => {\n\t\t\t\tevent.target.dispatchEvent(new PointerEvent('mouseover'))\n\t\t\t})\n\t\t\t.on('blur', event => {\n\t\t\t\tevent.target.dispatchEvent(new PointerEvent('mouseout'))\n\t\t\t})\n\t\t\t.on('keyup', event => {\n\t\t\t\tif (event.key == 'Enter') event.target.click()\n\t\t\t})\n\n\t\tthis.renderStatLegend() // api.statColor2label has been accumulated if available\n\n\t\tif (this.nameInput && this.updateName) {\n\t\t\tthis.nameInput.property('value', geneSetName || this.geneList.map(g => g.gene).join(', '))\n\t\t}\n\n\t\tthis.api.dom.clearBtn.property('disabled', !this.geneList?.length)\n\t\tconst hasChanged =\n\t\t\tthis.origNames !==\n\t\t\t(this.termsAsListed\n\t\t\t\t? JSON.stringify(this.geneList.map(t => t.gene))\n\t\t\t\t: JSON.stringify(this.geneList.map(t => t.gene).sort()))\n\t\tthis.api.dom.restoreBtn?.property('disabled', !hasChanged)\n\t\t// disable submit button when gene list not changed or is empty in expression mode\n\t\tthis.api.dom.submitBtn.property(\n\t\t\t'disabled',\n\t\t\t!hasChanged || (this.minNumGenes && this.geneList?.length < this.minNumGenes) || !this.geneList?.length\n\t\t)\n\t\tif (hasChanged) this.api.dom.submitBtn!.node()!.focus()\n\t}\n\n\trenderGene(div: Div, gene: Gene) {\n\t\tlet notInList = false\n\t\t//Check if list is present, then run check\n\t\tif (this.limitedGenesList && !this.limitedGenesList?.includes(gene.gene)) {\n\t\t\tnotInList = true\n\t\t}\n\t\tif (gene.mutationStat) {\n\t\t\tdiv.style('text-decoration', notInList ? 'line-through' : '').html(`${gene.gene} `)\n\t\t\tfor (const m of gene.mutationStat) {\n\t\t\t\t// m is {class,count} or {dt,count}; if class is given, bgcolor is determined by class; otherwise by dt and logicis a bit shaky now (may\n\t\t\t\tlet bgcolor: string\n\t\t\t\t/** bg and text color of gene button\n\t\t\t\t * default is black\n\t\t\t\t */\n\t\t\t\tlet textcolor = 'black'\n\t\t\t\tif ('class' in m) {\n\t\t\t\t\tif (!mclass[m.class]) throw 'invalid stat class'\n\t\t\t\t\tbgcolor = mclass[m.class].color\n\t\t\t\t\tthis.api.statColor2label.set(bgcolor, mclass[m.class].label)\n\t\t\t\t} else if ('dt' in m) {\n\t\t\t\t\tif (!dt2color[m['dt']]) throw 'invalid stat dt'\n\t\t\t\t\tbgcolor = dt2color[m['dt']]\n\t\t\t\t\ttextcolor = 'white' // hardcode it for now\n\t\t\t\t\tthis.api.statColor2label.set(bgcolor, dt2label[m['dt']])\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'stat missing dt/class'\n\t\t\t\t}\n\t\t\t\tdiv\n\t\t\t\t\t.insert('span')\n\t\t\t\t\t.style('font-size', '.7em')\n\t\t\t\t\t.style('background-color', bgcolor)\n\t\t\t\t\t.style('padding', '1px 2px')\n\t\t\t\t\t.style('color', textcolor)\n\t\t\t\t\t.text(m.count)\n\t\t\t}\n\t\t\t/* enable different types of gene stats this way\n\t\t} else if(gene.expStat) {\n\t\t*/\n\t\t} else {\n\t\t\tdiv\n\t\t\t\t.insert('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('text-decoration', notInList ? 'line-through' : '')\n\t\t\t\t.html(gene.gene)\n\t\t}\n\t}\n\n\tdeleteGene(d: Gene) {\n\t\tconst i = this.geneList.findIndex(g => g.gene === d.gene)\n\t\tif (i != -1) {\n\t\t\tthis.geneList.splice(i, 1)\n\t\t\tthis.renderGenes()\n\t\t}\n\t}\n}\n", "import { select } from 'd3-selection'\nimport { rgb } from 'd3-color'\n\nexport default function htmlLegend(legendDiv, viz = { settings: {}, handlers: {} }, barDiv) {\n\tconst isHidden = {}\n\n\t// TODO: cleanup, reorgananize, and document all these options\n\tfunction render(data, opts = {}) {\n\t\tconst s = viz.settings\n\t\tif (!opts.div) legendDiv.selectAll('*').remove()\n\n\t\t// TODO: Instead of doing the loop here, the caller should\n\t\t// call legendRenderer instancce multipler times with different data/divs\n\t\tif (data.every(d => Array.isArray(d))) {\n\t\t\tfor (let i = 0; i < data.length; i++) {\n\t\t\t\t// TODO: should not hardcode selectors here, this logic should be in the caller/viz code?\n\t\t\t\tconst barDivChild = barDiv.select(`.pp-sbar-div:nth-child(${i + 1})`)\n\t\t\t\tgenerateLegend(data[i], s, barDivChild)\n\t\t\t}\n\t\t} else if (data.every(d => typeof d == 'object')) {\n\t\t\tgenerateLegend(data, s, opts.div || legendDiv)\n\t\t} else {\n\t\t\tthrow 'render() only takes an array of objects or an array of arrays'\n\t\t}\n\t}\n\n\tfunction generateLegend(data, s, oneLegendDiv) {\n\t\toneLegendDiv.selectAll('.pp-sbar-div-oneLegend').remove()\n\n\t\toneLegendDiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'pp-sbar-div-oneLegend')\n\t\t\t.attr('data-testid', 'pp-sbar-div-oneLegend')\n\t\t\t.style('width', s.mainWidth || '')\n\t\t\t.style(\n\t\t\t\t'text-align',\n\t\t\t\tdata.legendTextAlign || s.legendTextAlign || (s.legendOrientation == 'vertical' ? 'left' : 'center')\n\t\t\t)\n\t\t\t.style('display', s.legendOrientation == 'grid' ? 'grid' : '')\n\t\t\t//.style('grid-template-cols', s.legendOrientation == 'grid' ? 'auto auto' : '')\n\t\t\t.style('grid-template-rows', s.legendOrientation == 'grid' ? 'auto auto' : '')\n\t\t\t.style('gap', s.legendOrientation == 'grid' ? '10px' : '')\n\t\t\t.selectAll('div')\n\t\t\t.data(data)\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.each(addLegendRow)\n\n\t\tif (s.legendChartSide == 'right') {\n\t\t\tsetTimeout(() => {\n\t\t\t\tconst pbox = viz.dom.container.node().parentNode.getBoundingClientRect()\n\t\t\t\tconst mbox = viz.dom.container.node().getBoundingClientRect()\n\t\t\t\tconst lbox = viz.dom.legendDiv.node().getBoundingClientRect()\n\t\t\t\tconst currPadTop = parseFloat(viz.dom.legendDiv.style('padding-top'))\n\t\t\t\tconst padTop = pbox.height - mbox.height + (mbox.height - lbox.height + currPadTop) / 2\n\t\t\t\tif (Math.abs(currPadTop - padTop) < 20) return\n\t\t\t\t//console.log(padTop, pbox.height, mbox.height, lbox.height)\n\t\t\t\tviz.dom.legendDiv\n\t\t\t\t\t.transition()\n\t\t\t\t\t.duration(100)\n\t\t\t\t\t.style('padding-top', padTop < 0 ? 0 : padTop + 'px')\n\t\t\t}, 1200)\n\t\t}\n\t}\n\n\tfunction addLegendRow(d) {\n\t\tconst s = viz.settings\n\t\tconst div = select(this).style(\n\t\t\t'display',\n\t\t\ts.legendOrientation == 'vertical' || s.legendOrientation == 'grid' ? 'block' : 'inline-block'\n\t\t)\n\n\t\tif (d.name) {\n\t\t\tif (s.legendChartSide == 'right') {\n\t\t\t\tdiv.style('text-align', 'left')\n\n\t\t\t\tdiv.append('div').style('font-size', s.legendFontSize).style('font-weight', 600).html(d.name)\n\n\t\t\t\tdiv\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.selectAll('div')\n\t\t\t\t\t.data(d.items)\n\t\t\t\t\t.enter()\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('display', s.legendOrientation == 'vertical' ? 'block' : 'inline-block')\n\t\t\t\t\t.style('margin-right', '5px')\n\t\t\t\t\t.each(addLegendItem)\n\t\t\t} else {\n\t\t\t\tdiv.style('white-space', 'nowrap').style('width', s.legendOrientation == 'vertical' ? 'fit-content' : null)\n\n\t\t\t\tdiv\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style(\n\t\t\t\t\t\t'display',\n\t\t\t\t\t\ts.legendOrientation == 'grid' || s.legendOrientation == 'vertical' ? 'block' : 'inline-block'\n\t\t\t\t\t)\n\t\t\t\t\t.style('width', d.rowLabelHangLeft ? d.rowLabelHangLeft + 'px' : null)\n\t\t\t\t\t.style('margin-left', s.legendOrientation == 'vertical' ? '15px' : null)\n\t\t\t\t\t.style('text-align', d.rowLabelHangLeft ? 'right' : null)\n\t\t\t\t\t.style('font-weight', 600)\n\t\t\t\t\t.style('vertical-align', 'top')\n\t\t\t\t\t.html(d.name)\n\n\t\t\t\tdiv\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style(\n\t\t\t\t\t\t'display',\n\t\t\t\t\t\ts.legendOrientation == 'grid' || s.legendOrientation == 'vertical' ? 'block' : 'inline-block'\n\t\t\t\t\t)\n\t\t\t\t\t.style('max-width', 1.2 * d.rowLabelHangLeft + 'px')\n\t\t\t\t\t.style('white-space', 'normal')\n\t\t\t\t\t.style('vertical-align', 'top')\n\t\t\t\t\t.selectAll('div')\n\t\t\t\t\t.data(d.items)\n\t\t\t\t\t.enter()\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.style('margin-left', '15px')\n\t\t\t\t\t.each(addLegendItem)\n\t\t\t}\n\t\t} else {\n\t\t\tdiv\n\t\t\t\t.selectAll('div')\n\t\t\t\t.data(d.items)\n\t\t\t\t.enter()\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', s.legendOrientation == 'vertical' ? 'block' : 'inline-block')\n\t\t\t\t.style('margin-left', '15px')\n\t\t\t\t.each(addLegendItem)\n\t\t}\n\t}\n\n\tfunction addLegendItem(d) {\n\t\tconst s = viz.settings\n\t\tconst div = select(this)\n\t\tconst color = d.fill ? d.fill : d.stroke ? d.stroke : d.color\n\t\tdiv\n\t\t\t//.style('opacity', !d.isHidden ? 1 : d.hiddenOpacity ? d.hiddenOpacity : 0.3)\n\t\t\t.attr('class', 'legend-row')\n\t\t\t.classed('sjpp-hidden-legend-item', d.isHidden ? true : false)\n\t\t\t.style('display', s.legendOrientation == 'vertical' ? 'block' : 'inline-block')\n\t\t\t.style('width', s.legendOrientation == 'vertical' ? 'fit-content' : null)\n\n\t\tif (d.svg) {\n\t\t\tdiv\n\t\t\t\t.append('svg')\n\t\t\t\t.attr('width', d.svgw)\n\t\t\t\t.attr('height', d.svgh)\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('vertical-align', 'top')\n\t\t\t\t.style('border', d.border)\n\t\t\t\t.html(d => d.svg)\n\t\t} else if (!d.noIcon) {\n\t\t\tconst stroke = d.noEditColor ? color : rgb(color).darker()\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('position', 'relative')\n\t\t\t\t.style('min-width', '12px')\n\t\t\t\t.style('height', '12px')\n\t\t\t\t.style('top', '1px')\n\t\t\t\t.style('border', d.border ? d.border : '1px solid ' + stroke)\n\t\t\t\t.style('border-radius', d.shape == 'circle' ? '6px' : '')\n\t\t\t\t.style('background-color', d.shape == 'circle' ? '' : color)\n\t\t\t\t.style('cursor', 'isHidden' in d ? 'pointer' : 'default')\n\t\t\t\t.style('color', d.textColor ? d.textColor : '#fff')\n\t\t\t\t.style('font-size', '10px')\n\t\t\t\t.style('vertical-align', d.inset ? 'top' : '')\n\t\t\t\t.style('padding', d.inset ? '0 3px' : '')\n\t\t\t\t.text(d.inset)\n\t\t\t\t.on('click', viz.handlers.legend?.onColorClick)\n\t\t}\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.classed('sjpp-htmlLegend', true)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin-left', d.svg ? '1px' : '3px')\n\t\t\t.style('cursor', handleCursor(d))\n\t\t\t.style('font-size', s.legendFontSize)\n\t\t\t.style('line-height', s.legendFontSize)\n\t\t\t.style('vertical-align', d.svg ? 'top' : null)\n\t\t\t.style('text-decoration', d.isHidden ? 'line-through' : 'none')\n\t\t\t.html(d.text)\n\t\t\t.on('click', viz.handlers.legend?.click)\n\n\t\tif (Object.keys(viz.handlers).length) {\n\t\t\tdiv.on('mouseover', viz.handlers.legend.mouseover).on('mouseout', viz.handlers.legend.mouseout)\n\t\t}\n\t}\n\n\treturn render\n}\n\n/** In some instances a legend item maybe hidden but not clickable\n * (e.g. uncomputable items in violin plot). In such cases, isHidden = true\n * for styling and isClickable = false to prevent cursor change, thus\n * avoiding user confusion.\n */\nfunction handleCursor(d) {\n\tif ('isClickable' in d) {\n\t\treturn d.isClickable ? 'pointer' : 'default'\n\t}\n\treturn 'isHidden' in d ? 'pointer' : 'default'\n}\n", "import { renderTable } from '#dom'\nimport { select } from 'd3-selection'\nimport type { Elem } from '../types/d3'\n\nexport type InvalidDataInfo = {\n\tentries: { dataType: string; reason: string }[]\n\terrorMsg?: string\n}\n\nexport class InvalidDataUI {\n\tstatic defaults = {\n\t\tbackgroundColor: '#f8f9fa',\n\t\tborderColor: '#dee2e6',\n\t\tborderRadius: '4px',\n\t\tcolor: '#dc3545', //punch red\n\t\tfontSize: 12, //use px, adjusted\n\t\tpadding: 8, // use px, adjusted\n\t\tmargin: '12px'\n\t}\n\n\tstatic render(container: Elem, invalidInfo: InvalidDataInfo) {\n\t\tconst expandableContainer = container\n\t\t\t.append('div')\n\t\t\t.style('margin-top', InvalidDataUI.defaults.margin)\n\t\t\t.attr('id', 'sjpp-invalid-data-ui')\n\n\t\tconst expandableHeader = expandableContainer\n\t\t\t.append('div')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('align-items', 'center')\n\t\t\t.style('gap', '8px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.style('padding', `${InvalidDataUI.defaults.padding}px`)\n\t\t\t.style('border-radius', InvalidDataUI.defaults.borderRadius)\n\t\t\t.style('transition', 'background-color 0.2s')\n\t\t\t.style('background-color', 'rgba(220, 53, 69, 0.1)')\n\t\t\t.style('border', '1px solid rgba(220, 53, 69, 0.2)')\n\t\t\t.on('mouseenter', function (this: HTMLElement) {\n\t\t\t\tselect(this).style('background-color', 'rgba(220, 53, 69, 0.15)')\n\t\t\t})\n\t\t\t.on('mouseleave', function (this: HTMLElement) {\n\t\t\t\tselect(this).style('background-color', 'rgba(220, 53, 69, 0.1)')\n\t\t\t})\n\n\t\tconst expandIcon = expandableHeader\n\t\t\t.append('span')\n\t\t\t.style('font-size', `${InvalidDataUI.defaults.fontSize}px`)\n\t\t\t.style('color', InvalidDataUI.defaults.color)\n\t\t\t.style('transition', 'transform 0.2s')\n\t\t\t.text('\u25B6')\n\n\t\texpandableHeader\n\t\t\t.append('span')\n\t\t\t.style('color', InvalidDataUI.defaults.color)\n\t\t\t.style('text-decoration', 'underline')\n\t\t\t.style('font-size', `${InvalidDataUI.defaults.fontSize + 1}px`)\n\t\t\t.style('font-weight', '500')\n\t\t\t.text(`View ${invalidInfo.entries.length} invalid entries`)\n\n\t\tconst expandableContent = expandableContainer\n\t\t\t.append('div')\n\t\t\t.style('display', 'none')\n\t\t\t.style('margin-top', InvalidDataUI.defaults.margin)\n\t\t\t.style('padding', `${InvalidDataUI.defaults.padding + 4}px`)\n\t\t\t.style('background-color', '#fff')\n\t\t\t.style('border', '1px solid #f5c6cb')\n\t\t\t.style('border-radius', `${InvalidDataUI.defaults.borderRadius}`)\n\t\t\t.style('box-shadow', 'inset 0 1px 3px rgba(0, 0, 0, 0.1)')\n\n\t\tconst tableContainer = expandableContent\n\t\t\t.append('div')\n\t\t\t.style('max-height', '300px')\n\t\t\t.style('overflow-y', 'auto')\n\t\t\t.style('border', `1px solid ${InvalidDataUI.defaults.borderColor}`)\n\t\t\t.style('border-radius', InvalidDataUI.defaults.borderRadius)\n\n\t\trenderTable({\n\t\t\tdiv: tableContainer,\n\t\t\tcolumns: [\n\t\t\t\t{ label: 'Data Type', sortable: true },\n\t\t\t\t{ label: 'Reason', sortable: true }\n\t\t\t],\n\t\t\trows: invalidInfo.entries.map(e => [{ value: e.dataType }, { value: e.reason }]),\n\t\t\tshowLines: true,\n\t\t\tstriped: true,\n\t\t\tshowHeader: true,\n\t\t\tmaxHeight: '280px',\n\t\t\tresize: false,\n\t\t\theader: {\n\t\t\t\tallowSort: true,\n\t\t\t\tstyle: {\n\t\t\t\t\t'background-color': InvalidDataUI.defaults.backgroundColor,\n\t\t\t\t\t'font-weight': 'bold',\n\t\t\t\t\t'border-bottom': `2px solid ${InvalidDataUI.defaults.borderColor}`\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\texpandableContent\n\t\t\t.append('div')\n\t\t\t.style('margin-top', InvalidDataUI.defaults.margin)\n\t\t\t.style('padding', `${InvalidDataUI.defaults.padding}px`)\n\t\t\t.style('background-color', InvalidDataUI.defaults.backgroundColor)\n\t\t\t.style('border-radius', InvalidDataUI.defaults.borderRadius)\n\t\t\t.style('font-size', `${InvalidDataUI.defaults.fontSize}px`)\n\t\t\t.style('color', '#495057')\n\t\t\t.style('line-height', '1.4')\n\t\t\t.text(invalidInfo.errorMsg || 'Please address the issues above before proceeding.')\n\n\t\tlet isExpanded = false\n\t\texpandableHeader.on('click', function () {\n\t\t\tisExpanded = !isExpanded\n\t\t\tif (isExpanded) {\n\t\t\t\texpandableContent.style('display', 'block')\n\t\t\t\texpandIcon.style('transform', 'rotate(90deg)').text('\u25BC')\n\t\t\t} else {\n\t\t\t\texpandableContent.style('display', 'none')\n\t\t\t\texpandIcon.style('transform', 'rotate(0deg)').text('\u25B6')\n\t\t\t}\n\t\t})\n\t}\n}\n", "import type { LegendCircleReferenceOpts } from './types/LegendCircleReference'\nimport type { Div, SvgG } from '../types/d3'\nimport { Menu, make_radios } from '#dom'\n\n/** Creates a visual reference of the circle elements used\n * in a plot by rendering the smallest to largest circles\n * in scale.\n *\n * Also includes the option to set the min to max radius and\n * whether the scale is ascending or descending by clicking\n * on the holder.\n */\n\nexport class LegendCircleReference {\n\tg: SvgG\n\tinputMax: number\n\tinputMin: number\n\tisAscending: boolean\n\tmaxLabel: number\n\tmaxRadius: number\n\tminLabel: number\n\tminRadius: number\n\tmenu?: {\n\t\tminMaxLabel?: string\n\t\tshowOrder?: boolean\n\t\tcallback: (obj: { min: number; max: number; isAscending: boolean }) => void\n\t}\n\ttitle?: string\n\treadonly color = '#aaa'\n\treadonly shift = 20\n\treadonly width = 70\n\treadonly tip = new Menu({ padding: '5px' })\n\treadonly x = 40\n\treadonly y = 40\n\tconstructor(opts: LegendCircleReferenceOpts) {\n\t\tthis.validateOpts(opts)\n\t\tthis.g = opts.g\n\t\tthis.inputMax = opts.inputMax\n\t\tthis.inputMin = opts.inputMin\n\t\tthis.isAscending = opts.isAscending ?? true\n\t\tthis.maxLabel = opts.maxLabel ?? opts.maxRadius\n\t\tthis.maxRadius = opts.maxRadius\n\t\tthis.minLabel = opts.minLabel ?? opts.minRadius\n\t\tthis.minRadius = opts.minRadius\n\n\t\tif (opts.menu) this.menu = opts.menu\n\t\tif (opts.title) this.title = opts.title\n\n\t\tthis.renderLegendComponent()\n\t}\n\n\tvalidateOpts(opts: LegendCircleReferenceOpts) {\n\t\tif (!opts.g) throw `Missing g in LegendCircleReference`\n\t\tif (opts.maxRadius > opts.inputMax) throw `Max radius must be less than inputMax`\n\t\tif (opts.minRadius < opts.inputMin) throw `Min radius must be greater than inputMin`\n\t}\n\n\trenderLegendComponent() {\n\t\tthis.g.selectAll('*').remove()\n\n\t\tif (this.title) this.g.append('text').style('font-weight', 'bold').style('font-size', '0.8em').text(this.title)\n\n\t\tconst minG = this.g.append('g').attr('transform', `translate(${this.x},${this.y})`)\n\t\tconst maxG = this.g.append('g').attr('transform', `translate(${this.x + this.width},${this.y})`)\n\n\t\t//Starting text and circle element\n\t\tconst startRadius = this.isAscending ? this.minRadius : this.maxRadius\n\t\tthis.renderLabel(minG, -startRadius - this.shift, this.minLabel)\n\t\tthis.renderReferenceCircle(minG, startRadius)\n\n\t\t//Ending text and circle element\n\t\tconst endRadius = this.isAscending ? this.maxRadius : this.minRadius\n\t\tthis.renderReferenceCircle(maxG, endRadius)\n\t\tthis.renderLabel(maxG, endRadius + this.shift, this.maxLabel)\n\n\t\t//Lines connecting the top and bottom of the circles\n\t\tthis.renderScalingLine(minG, this.minRadius, this.maxRadius)\n\t\tthis.renderScalingLine(minG, -this.minRadius, -this.maxRadius)\n\n\t\tconst minBBox = minG.node()!.getBBox()\n\t\tconst maxBBox = maxG.node()!.getBBox()\n\n\t\tif (this.menu) {\n\t\t\tthis.g\n\t\t\t\t.append('rect')\n\t\t\t\t.attr('width', minBBox.width + maxBBox.width)\n\t\t\t\t.attr('height', (this.isAscending ? maxBBox.height : minBBox.height) + 20)\n\t\t\t\t.attr('fill', 'transparent')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tthis.renderMenu()\n\t\t\t\t})\n\t\t}\n\t}\n\n\trenderReferenceCircle(g: SvgG, radius: number) {\n\t\tg.append('circle')\n\t\t\t.style('fill', this.color)\n\t\t\t.style('stroke', this.color)\n\t\t\t.attr('cx', 0)\n\t\t\t.attr('cy', 0)\n\t\t\t.attr('r', radius)\n\t}\n\n\trenderLabel(g: SvgG, x: number, text: number) {\n\t\tg.append('text').attr('x', x).attr('y', 5).style('font-size', '.8em').text(text)\n\t}\n\n\trenderScalingLine(g: SvgG, minRadius: number, maxRadius: number) {\n\t\tg.append('line')\n\t\t\t.attr('x1', 0)\n\t\t\t.attr('y1', this.isAscending ? minRadius : maxRadius)\n\t\t\t.attr('x2', this.width)\n\t\t\t.attr('y2', this.isAscending ? maxRadius : minRadius)\n\t\t\t.style('stroke', this.color)\n\t}\n\n\trenderMenu() {\n\t\tif (!this.menu) return\n\t\tthis.tip.clear().showunder(this.g.node())\n\t\tconst div = this.tip.d.append('div')\n\t\tconst minMaxRow = div.append('div')\n\t\tif (this.menu?.minMaxLabel)\n\t\t\tminMaxRow\n\t\t\t\t.append('span')\n\t\t\t\t.style('padding-right', '10px')\n\t\t\t\t.style('opacity', 0.7)\n\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t.text(`${this.menu.minMaxLabel.toUpperCase()}`)\n\n\t\tthis.addInput(minMaxRow, 'Min', this.minRadius)\n\t\tthis.addInput(minMaxRow, 'Max', this.maxRadius)\n\n\t\tif (this.menu.showOrder) {\n\t\t\tconst orderRow = div.append('div')\n\t\t\tmake_radios({\n\t\t\t\tholder: orderRow,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tchecked: this.isAscending,\n\t\t\t\t\t\tlabel: 'Ascending',\n\t\t\t\t\t\ttitle: 'Show in ascending order',\n\t\t\t\t\t\tvalue: true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tchecked: !this.isAscending,\n\t\t\t\t\t\tlabel: 'Descending',\n\t\t\t\t\t\ttitle: 'Show in descending order',\n\t\t\t\t\t\tvalue: false\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tcallback: value => {\n\t\t\t\t\tif (!this.menu) return //so TS doesn't complain\n\t\t\t\t\tthis.isAscending = value\n\t\t\t\t\tthis.menu.callback({ min: this.minRadius, max: this.maxRadius, isAscending: this.isAscending })\n\t\t\t\t\tthis.renderLegendComponent()\n\t\t\t\t\tthis.tip.hide()\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\taddInput(div: Div, label: string, value: number) {\n\t\tdiv.append('label').text(label)\n\t\tconst input = div\n\t\t\t.append('input')\n\t\t\t.style('width', '50px')\n\t\t\t.attr('type', 'number')\n\t\t\t.attr('min', this.inputMin)\n\t\t\t.attr('max', this.inputMax)\n\t\t\t.attr('value', value)\n\t\t\t.on('change', () => {\n\t\t\t\tif (!this.menu) return //so TS doesn't complain\n\t\t\t\tconst value = input.property('value')\n\t\t\t\tthis[`${label.toLowerCase()}Radius`] = Number(value)\n\t\t\t\tthis.menu.callback({ min: this.minRadius, max: this.maxRadius, isAscending: this.isAscending })\n\t\t\t\tthis.renderLegendComponent()\n\t\t\t\tthis.tip.hide()\n\t\t\t})\n\t}\n}\n", "import type { Svg, SvgG } from '../types/d3'\n/**\n * Label Width Calculator for Data Visualizations\n *\n * This utility function calculates the maximum width needed to display text labels\n * in SVG-based data visualizations. It works by temporarily rendering each label\n * to measure its exact width, accounting for font characteristics and actual text content.\n *\n * The function is designed to work with different visualization types (like box plots\n * and violin plots) by providing flexible ways to extract label text from data:\n *\n * 1. Custom Function: You can provide your own function to extract label text\n * 2. Standard Formats: Without a custom function, it automatically handles:\n * - Box plot data: Uses item.boxplot.label\n * - Violin plot data: Combines item.label with item.plotValueCount as \"label, n=count\"\n * - Simple data: Uses item.label directly\n * Be aware that if the svg is hidden this function will return 0 as getBBox will return 0\n *\n * Example Usage:\n *\n * // With box plot data:\n * const width2 = getMaxLabelWidth(svg, boxPlotData);\n * // Automatically uses boxPlotData[i].boxplot.label\n *\n * // With violin plot data:\n * const width3 = getMaxLabelWidth(svg, violinData);\n * // Automatically formats as \"label, n=count\"\n *\n * Implementation Details:\n * - Creates a temporary text element for each measurement\n * - Uses the browser's rendering engine for precise width calculation\n * - Removes the temporary element after measurement\n * - Maintains the maximum width seen across all labels\n *\n * @param svg - D3 selection of an SVG element where temporary text elements will be added\n * for measurement. These elements are immediately removed after measuring.\n *\n * @param items - Array of strings containing label information.\n * @param size - Font size multiplier for labels. Default is 1.\n * @returns The width in pixels of the widest label in the provided items array\n */\nexport function getMaxLabelWidth(svg: Svg | SvgG, items: string[], size = 1): number {\n\tlet maxLabelLgth = 0\n\tfor (const item of items) {\n\t\t// Create temporary text element for measurement\n\t\tconst label = svg.append('text').text(item).style('font-size', `${size}em`)\n\n\t\t// Update maximum width if current label is wider\n\t\t//If the svg is hidden getBBox will return 0 !!!!\n\t\tmaxLabelLgth = Math.max(maxLabelLgth, label.node()!.getBBox().width)\n\n\t\t// Clean up: remove temporary element\n\t\tlabel.remove()\n\t}\n\treturn maxLabelLgth\n}\n", "import type { RawCategoricalTerm, TermGroupSetting, TermValues } from '#types'\n\nconst termType = 'categorical'\n\nexport class CategoricalBase {\n\tid: string\n\tname: string\n\tgroupsetting: TermGroupSetting\n\tvalues: TermValues\n\n\t// option to fill-in/mutate the input raw term object in-place\n\t// - does not have to construct, but may require forced type casting in consumer code\n\tstatic fill(term: RawCategoricalTerm) {\n\t\tif (term instanceof CategoricalBase) return\n\t\tCategoricalBase.validate(term)\n\t\tif (!term.name) term.name = term.id\n\t\tif (!term.groupsetting) term.groupsetting = { disabled: false }\n\t\tif (!term.values) term.values = {}\n\t}\n\n\tstatic validate(term: RawCategoricalTerm) {\n\t\tif (typeof term !== 'object') throw 'term is not an object'\n\t\tif (term.type != termType) throw `incorrect term.type='${term?.type}', expecting '${termType}'`\n\t}\n\n\t// option to construct an object instance and not mutate the input raw term\n\t// - will be used instead of tw.term literal object\n\tconstructor(term: RawCategoricalTerm) {\n\t\tCategoricalBase.validate(term)\n\t\tthis.id = term.id\n\t\tthis.name = term.name || term.id\n\t\tthis.groupsetting = term.groupsetting || { disabled: false }\n\t\tthis.values = term.values || {}\n\t}\n}\n", "import type { Term, TermWrapper, Q } from '#types'\nimport type { SetCellPropsSignature } from '../plots/matrix/matrix.xtw.ts'\nimport { type UseCase } from '#termsetting'\nimport { isDictionaryType } from '#shared'\n\nexport type TwOpts = {\n\tvocabApi?: any // TODO\n\tdefaultQ?: any // TODO\n\tdefaultQByTsHandler?: any // TODO\n\taddons?: {\n\t\t[TwTypeName: string]: {\n\t\t\t[methodName: string]: {\n\t\t\t\tvalue: (a: any) => any // required nested shape for native Object.defineProperties()\n\t\t\t}\n\t\t\t// | ((a: any) => any) // for convenience, not supported yet\n\t\t}\n\t}\n\t//usecase?: any // TODO\n}\n\nexport class TwBase {\n\ttype: string\n\t$id?: string\n\tisAtomic = true\n\t#tw: TermWrapper\n\n\t// define addons below, to be set using Object.defineProperties(this)\n\t// by defining allowed method names here, subclasses that inherit from\n\t// TwBase will be type checked\n\tsetCellProps!: SetCellPropsSignature\n\n\t// TODO: may need to track these matrix specific tw props elsewhere\n\tsortSamples?: any\n\tminNumSamples?: number\n\tvalueFilter?: any\n\n\tconstructor(tw: TermWrapper, opts: TwOpts) {\n\t\tthis.#tw = tw\n\t\tthis.type = tw.type\n\t\tthis.isAtomic = true\n\t\tif (tw.$id) this.$id = tw.$id\n\t\tif (tw.sortSamples) this.sortSamples = tw.sortSamples\n\t\tif (tw.minNumSamples) this.minNumSamples = tw.minNumSamples\n\t\tif (tw.valueFilter) this.valueFilter = tw.valueFilter\n\n\t\t// By using Object.defineProperties(), addon methods are not enumerable\n\t\t// and makes the xtw instance compatible with structuredClone(),\n\t\t// in contrast to using Object.assign()\n\t\tif (opts.addons?.[this.type]) {\n\t\t\tObject.defineProperties(this, opts.addons[this.type])\n\t\t}\n\t}\n\n\tstatic setHiddenValues(q: Q, term: Term) {\n\t\tif (q.hiddenValues) return\n\t\tq.hiddenValues = {}\n\t\t// by default, fill-in with uncomputable values\n\t\tif (term.values) {\n\t\t\tfor (const k in term.values) {\n\t\t\t\tif (term.values[k].uncomputable) q.hiddenValues[k] = 1\n\t\t\t}\n\t\t}\n\t}\n\n\trender(a: any): any {\n\t\tconsole.log(a)\n\t\tthrow `should implement this method in subclass code, as needed`\n\t}\n\n\tgetStatus(_?: UseCase, __?: any) {\n\t\t//if (_) {}\n\t\treturn { text: '' }\n\t}\n\n\tgetMinCopy() {\n\t\tconst tw = this.#tw\n\t\tconst copy: any = { term: {}, q: tw.q }\n\t\tif (tw.$id) copy.$id = tw.$id\n\t\tif (tw.term) {\n\t\t\tif (isDictionaryType(tw.term.type)) {\n\t\t\t\t// dictionary term\n\t\t\t\tif (tw.term.id) copy.term.id = tw.term.id\n\t\t\t\tif (tw.term.name) copy.term.name = tw.term.name\n\t\t\t\tif (tw.term.type) copy.term.type = tw.term.type\n\t\t\t\tif (tw.term.values) copy.term.values = tw.term.values\n\t\t\t\tif ((tw.term as any).groupsetting) copy.term.groupsetting = (tw.term as any).groupsetting\n\t\t\t} else {\n\t\t\t\t// non-dictionary term\n\t\t\t\t// pass entire tw.term because non-dictionary terms\n\t\t\t\t// cannot get rehydrated on server-side\n\t\t\t\tcopy.term = structuredClone(tw.term)\n\t\t\t}\n\t\t}\n\t\treturn copy\n\t}\n}\n", "import { type TwOpts } from './TwBase.ts'\nimport type { RawGeneExpTerm } from '#types'\n\nconst termType = 'geneExpression'\n\nexport class GeneExpBase {\n\tgene: string\n\tname: string\n\tunit: string\n\n\t// option to fill-in/mutate the input raw term object in-place\n\t// - does not have to construct, but may require forced type casting in consumer code\n\tstatic async fill(term: RawGeneExpTerm, opts: TwOpts) {\n\t\tGeneExpBase.validate(term)\n\t\tif (!term.name) {\n\t\t\tterm.unit = opts.vocabApi.termdbConfig.queries.geneExpression?.unit || 'Gene Expression'\n\t\t\tconst name = `${term.gene} ${term.unit}`\n\t\t\tterm.name = name\n\t\t}\n\t}\n\n\tstatic validate(term: RawGeneExpTerm) {\n\t\tif (typeof term !== 'object') throw 'term is not an object'\n\t\tif (term.type != termType) throw `incorrect term.type='${term?.type}', expecting '${termType}'`\n\t\tif (term.type != 'geneExpression') throw 'unexpected term.type'\n\t\tif (typeof term !== 'object') throw 'term is not an object'\n\t\tif (!term.gene && !term.name) throw 'no gene or name present'\n\t\tif (!term.gene || typeof term.gene != 'string') throw 'geneExpression term.gene must be non-empty string'\n\t}\n\n\t// option to construct an object instance and not mutate the input raw term\n\t// - will be used instead of term literal object\n\tconstructor(term: RawGeneExpTerm, opts: TwOpts) {\n\t\tGeneExpBase.validate(term)\n\t\tthis.gene = term.gene || term.name\n\t\tthis.unit = term.unit || opts.vocabApi.termdbConfig.queries.geneExpression?.unit || 'Gene Expression'\n\t\tthis.name = term.name || `${term.gene} ${this.unit}`\n\t}\n}\n", "import type { RawMetaboliteIntensityTerm, PresetNumericBins } from '#types'\n\nconst termType = 'metaboliteIntensity'\n\nexport class MetaboliteIntensityBase {\n\ttype = termType\n\tmetabolite: string\n\tname: string\n\tunit: string\n\tbins?: PresetNumericBins\n\n\t// option to fill-in/mutate the input raw term object in-place\n\t// - does not have to construct, but may require forced type casting in consumer code\n\tstatic async fill(term: RawMetaboliteIntensityTerm) {\n\t\tMetaboliteIntensityBase.validate(term)\n\t\tif (!term.metabolite) term.metabolite = term.name\n\t\telse if (!term.name) term.name = term.metabolite\n\t}\n\n\tstatic validate(term: RawMetaboliteIntensityTerm) {\n\t\tif (term.type != 'metaboliteIntensity') throw 'unexpected term.type'\n\t\tif (typeof term !== 'object') throw 'term is not an object'\n\t\tif (!term.name && !term.metabolite) throw `missing both term.name and metabolite`\n\t}\n\n\t// option to construct an object instance and not mutate the input raw term\n\t// - will be used instead of term literal object\n\tconstructor(term: RawMetaboliteIntensityTerm) {\n\t\tMetaboliteIntensityBase.validate(term)\n\t\tthis.metabolite = term.metabolite || term.name\n\t\tthis.name = term.name || term.metabolite\n\t\tthis.unit = term.unit || ''\n\t\tif (term.bins) this.bins = term.bins\n\t}\n}\n", "import type { RawDateTerm } from '#types'\n\nconst termType = 'date'\n\nexport class DateBase {\n\ttype = termType\n\n\t// option to fill-in/mutate the input raw term object in-place\n\t// - does not have to construct, but may require forced type casting in consumer code\n\tstatic async fill(term: RawDateTerm) {\n\t\tthis.validate(term)\n\t}\n\n\tstatic validate(term: RawDateTerm) {\n\t\tif (term.type != 'date') throw 'unexpected term.type'\n\t\tif (typeof term !== 'object') throw 'term is not an object'\n\t\tif (!term.name || typeof term.name != 'string') throw 'invalid date term.name'\n\t}\n\n\t// option to construct an object instance and not mutate the input raw term\n\t// - will be used instead of term literal object\n\tconstructor(term: RawDateTerm) {\n\t\tDateBase.validate(term)\n\t}\n}\n", "import type { RawSsGSEATerm, PresetNumericBins } from '#types'\n\nconst termType = 'ssGSEA'\n\nexport class SsGSEABase {\n\ttype = termType\n\tid: string\n\tname: string\n\tbins?: PresetNumericBins\n\tunit?: string\n\n\t// option to fill-in/mutate the input raw term object in-place\n\t// - does not have to construct, but may require forced type casting in consumer code\n\tstatic async fill(term: RawSsGSEATerm) {\n\t\tSsGSEABase.validate(term)\n\t\tif (!term.name) term.name = term.id // only apply to native; lack way to auto retrieve\n\t}\n\n\tstatic validate(term: RawSsGSEATerm) {\n\t\tif (term.type != 'ssGSEA') throw `unexpected term.type='$term.type', should be '${termType}'`\n\t\tif (typeof term !== 'object') throw 'term is not an object'\n\t\tif (!term.id) throw 'term.id missing'\n\t}\n\n\t// option to construct an object instance and not mutate the input raw term\n\t// - will be used instead of term literal object\n\tconstructor(term: RawSsGSEATerm) {\n\t\tSsGSEABase.validate(term)\n\t\tthis.id = term.id\n\t\tthis.name = term.name || term.id\n\t\tthis.bins = term.bins\n\t\tthis.unit = term.unit\n\t}\n}\n", "import type {\n\tNumericTerm,\n\tNumericQ,\n\tNumTW,\n\tNumTWRegularBin,\n\tNumTWCustomBin,\n\tNumTWCont,\n\tNumTWSpline,\n\tRawNumTW,\n\tRawNumTWRegularBin,\n\tRawNumTWCustomBin,\n\tRawNumTWCont,\n\tRawNumTWSpline,\n\tContinuousNumericQ,\n\tSplineNumericQ,\n\tStartUnboundedBin,\n\tStopUnboundedBin,\n\tRegularNumericBinConfig,\n\tCustomNumericBinConfig\n} from '#types'\nimport { TwBase, type TwOpts } from './TwBase.ts'\nimport { isNumeric } from '#shared/helpers.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { copyMerge } from '#rx'\nimport { GeneExpBase } from './geneExpression.ts'\nimport { MetaboliteIntensityBase } from './metaboliteIntensity.ts'\nimport { DateBase } from './date.ts'\nimport { SsGSEABase } from './ssGSEA.ts'\n\nexport class NumericBase extends TwBase {\n\t// type is set by TwBase constructor\n\tterm: NumericTerm\n\ttype: 'NumTWRegularBin' | 'NumTWCustomBin' | 'NumTWCont' | 'NumTWBinary' | 'NumTWSpline'\n\tstatic termTypes = new Set([\n\t\t'integer',\n\t\t'float',\n\t\t'date',\n\t\t'geneExpression',\n\t\t'metaboliteIntensity',\n\t\t'ssGSEA',\n\t\t'singleCellGeneExpression'\n\t])\n\n\tconstructor(tw: NumTW, opts: TwOpts) {\n\t\tsuper(tw, opts)\n\t\tthis.type = tw.type\n\t\tthis.term = tw.term\n\t}\n\n\tstatic async fill(tw: RawNumTW, opts: TwOpts = {}): Promise<NumTW> {\n\t\tif (!tw.term) throw `missing tw.term, must already be filled in`\n\t\tif (!NumericBase.termTypes.has(tw.term.type)) throw `non-numeric term.type='${tw.term.type}'`\n\n\t\tswitch (tw.term.type) {\n\t\t\tcase 'integer':\n\t\t\tcase 'float':\n\t\t\t\tif (!tw.q.mode) tw.q.mode = 'discrete'\n\t\t\t\tbreak\n\n\t\t\tcase 'geneExpression':\n\t\t\t\tGeneExpBase.fill(tw.term, opts)\n\t\t\t\tif (!tw.q.mode) tw.q.mode = 'continuous'\n\t\t\t\tbreak\n\n\t\t\tcase 'metaboliteIntensity':\n\t\t\t\tMetaboliteIntensityBase.fill(tw.term)\n\t\t\t\tif (!tw.q.mode) tw.q.mode = 'continuous'\n\t\t\t\tbreak\n\n\t\t\tcase 'date':\n\t\t\t\tDateBase.fill(tw.term)\n\t\t\t\tif (!tw.q.mode) tw.q.mode = 'continuous'\n\t\t\t\tbreak\n\n\t\t\tcase 'ssGSEA':\n\t\t\t\tSsGSEABase.fill(tw.term)\n\t\t\t\tif (!tw.q.mode) tw.q.mode = 'continuous'\n\t\t\t\tbreak\n\n\t\t\t// default:\n\t\t\t// \t// should never be reached if TwRouter.fill() routes correctly\n\t\t\t// \tthrow `unexpected numeric term.type='${tw.term.type}'`\n\t\t}\n\n\t\tif (opts.defaultQ) {\n\t\t\topts.defaultQ.isAtomic = true\n\t\t\ttw.q.isAtomic = true\n\t\t\tif (opts.defaultQ.preferredBins == 'median') {\n\t\t\t\tif (!opts.defaultQ.type) opts.defaultQ.type = 'custom-bin'\n\t\t\t\telse if (opts.defaultQ.type != 'custom-bin') throw '.type must be custom-bin when .preferredBins=median'\n\t\t\t}\n\t\t\t// merge defaultQ into tw.q\n\t\t\tcopyMerge(tw.q, opts.defaultQ)\n\t\t}\n\n\t\t// set q.type based on q.mode\n\t\tswitch (tw.q.mode) {\n\t\t\tcase 'discrete':\n\t\t\t\tif (tw.q.type != 'regular-bin') {\n\t\t\t\t\t// support malformed tw.q that combines properties from different modes, such as continuous and discrete\n\t\t\t\t\tif (Array.isArray((tw as RawNumTWCustomBin).q.lst)) tw.q.type = 'custom-bin'\n\t\t\t\t}\n\t\t\t\tif (!tw.q.type) {\n\t\t\t\t\tif (tw.term.bins) mayFillQWithPresetBins(tw)\n\t\t\t\t\telse tw.q.type = 'regular-bin'\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tcase 'binary':\n\t\t\t\ttw.q.type = 'custom-bin'\n\t\t\t\tbreak\n\n\t\t\tcase 'continuous':\n\t\t\tcase 'spline':\n\t\t\t\tdelete tw.q.type\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\tthrow 'tw.q.mode not supported'\n\t\t}\n\n\t\t/* \n\t\t\tPre-fill the tw.type, since it's required for ROUTING to the\n\t\t\tcorrect fill() function. Tsc will be able to use tw.type as a \n\t\t\tdiscriminant property for the RawNumTW union type, enabling \n\t\t\tstatic type checks on the input raw tw.\n\n\t\t\tNOTE: tw.type is NOT required when calling a specialized fill() \n\t\t\tfunction directly, outside of TwRouter.fill(). The input tw.type\n\t\t\tdoes not have to be discriminated in that case.\n\t\t*/\n\t\ttw.type =\n\t\t\ttw.q.type == 'regular-bin'\n\t\t\t\t? 'NumTWRegularBin'\n\t\t\t\t: tw.q.type == 'custom-bin' || tw.q.mode == 'binary'\n\t\t\t\t? 'NumTWCustomBin'\n\t\t\t\t: tw.q.mode == 'continuous'\n\t\t\t\t? 'NumTWCont'\n\t\t\t\t: tw.q.mode == 'spline'\n\t\t\t\t? 'NumTWSpline'\n\t\t\t\t: tw.type\n\t\t/*\n\t\t\tFor each of fill() functions below:\n\t\t\t1. The `tw` argument must already have a tw.type string value, \n\t\t\t which corresponds to the RawNumTW* equivalent of the full NumTW* type \n\n\t\t\t2. The fill() function must fill-in any expected missing values,\n\t\t\t validate the tw.q shape at runtime, and throw on any error or mismatched expectation.\n\t\t\t Runtime validation is required because the input raw tw can come from anywhere,\n\t\t\t like term.bins.default, which is a runtime variable that is not possible to statically check.\n\n\t\t\t3. The filled-in tw, when returned, must be **coerced** to the full NumTW* type, \n\t\t\t in order to match the function signature's return type.\n\t\t*/\n\t\tswitch (tw.type) {\n\t\t\tcase 'NumTWRegularBin':\n\t\t\t\treturn await NumRegularBin.fill(tw, opts)\n\n\t\t\tcase 'NumTWCustomBin':\n\t\t\t\treturn await NumCustomBins.fill(tw, opts)\n\n\t\t\tcase 'NumTWCont':\n\t\t\t\treturn await NumCont.fill(tw)\n\n\t\t\tcase 'NumTWSpline':\n\t\t\t\treturn await NumSpline.fill(tw)\n\n\t\t\tdefault:\n\t\t\t\tthrow `tw.type='${tw.type} (q.mode:q.type=${tw.q.mode}:${tw.q.type}' is not supported by NumericBase.fill()`\n\t\t}\n\t}\n\n\tgetTitleText() {\n\t\treturn this.term.name\n\t}\n}\n\nexport class NumRegularBin extends NumericBase {\n\t// type, isAtomic, $id are set in ancestor base classes\n\tq: RegularNumericBinConfig\n\t#tw: NumTWRegularBin\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: NumTWRegularBin, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t//this.term = tw.term // already set by base constructor\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\tgetStatus() {\n\t\treturn { text: 'bin size=' + this.q.bin_size }\n\t}\n\n\t// See the relevant comments in the NumericBase.fill() function above\n\tstatic async fill(tw: RawNumTWRegularBin, opts: TwOpts = {}): Promise<NumTWRegularBin> {\n\t\tif (!tw.type) tw.type = 'NumTWRegularBin'\n\t\telse if (tw.type != 'NumTWRegularBin') throw `expecting tw.type='NumTWRegularBin', got '${tw.type}'`\n\n\t\tif (!tw.q.mode) tw.q.mode = 'discrete'\n\t\telse if (tw.q.mode != 'discrete' && tw.q.mode != 'binary' && tw.q.mode != 'continuous')\n\t\t\tthrow `expecting tw.q.mode='discrete'|'binary'|'continous', got '${tw.q.mode}'`\n\n\t\tif (tw.q.type && tw.q.type != 'regular-bin') throw `expecting tw.q.type='regular-bin', got '${tw.q.type}'`\n\n\t\tif (!tw.term.bins) {\n\t\t\t/* non-dictionary term (e.g. gene term) may be missing bin definition, this is expected as it's not valid to apply same bin to genes with vastly different exp range,\n\t\t\tand not worth it to precompute each gene's default bin with its actual exp data as cohort filter can not be predicted\n\t\t\there make a request to determine default bin for this term based on its data\n\n\t\t\tdo not do this when tw.q.mode is continuous:\n\t\t\t1. it will add significant delay to gene exp clustering, esp for gdc. bins are useless for hiercluster and the request will lock up server\n\t\t\t2. the way setTermBins works, tw.q.type won't be filled and errors out\n\t\t\t*/\n\t\t\tawait opts.vocabApi.setTermBins(tw)\n\t\t}\n\n\t\tif (!tw.q.first_bin || !isNumeric(tw.q.bin_size)) mayFillQWithPresetBins(tw)\n\n\t\tif (!isNumeric(tw.q.bin_size)) throw `tw.q.bin_size=${tw.q.bin_size} is not numeric`\n\t\tif (!tw.q.first_bin) throw `missing tw.q.first_bin`\n\t\tif (!isNumeric(tw.q.first_bin?.stop)) throw `tw.q.first_bin.stop is not numeric`\n\n\t\tTwBase.setHiddenValues(tw.q as NumericQ, tw.term)\n\t\treturn tw as NumTWRegularBin\n\t}\n}\n\nexport class NumCustomBins extends NumericBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: CustomNumericBinConfig\n\t#tw: NumTWCustomBin\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: NumTWCustomBin, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t//this.term = tw.term // already set by base constructor\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\tgetStatus(opts?: any, data?: any) {\n\t\tif (this.q.mode == 'binary') {\n\t\t\tconst regressionStatus =\n\t\t\t\topts.usecase?.target == 'regression' && this.q.lst.find(x => x.label != data.refGrp)?.label\n\t\t\treturn { text: regressionStatus || 'binary' }\n\t\t}\n\t\treturn { text: this.q.lst.length + ' bins' }\n\t}\n\n\t// See the relevant comments in the NumericBase.fill() function above\n\tstatic async fill(tw: RawNumTWCustomBin, opts: TwOpts = {}): Promise<NumTWCustomBin> {\n\t\tif (!tw.type) tw.type = 'NumTWCustomBin'\n\t\telse if (tw.type != 'NumTWCustomBin') throw `expecting tw.type='NumTWCustomBin', got '${tw.type}'`\n\n\t\tif (!tw.q.mode) tw.q.mode = 'discrete'\n\t\telse if (tw.q.mode != 'discrete' && tw.q.mode != 'binary' && tw.q.mode != 'continuous')\n\t\t\tthrow `expecting tw.q.mode='discrete'|binary|continuous', got '${tw.q.mode}'`\n\n\t\tif (tw.q.mode == 'binary' && !tw.q.preferredBins) tw.q.preferredBins = 'median'\n\n\t\tif (!tw.term.bins) {\n\t\t\t/* non-dictionary term (e.g. gene term) may be missing bin definition, this is expected as it's not valid to apply same bin to genes with vastly different exp range,\n\t\t\tand not worth it to precompute each gene's default bin with its actual exp data as cohort filter can not be predicted\n\t\t\there make a request to determine default bin for this term based on its data\n\n\t\t\tdo not do this when tw.q.mode is continuous:\n\t\t\t1. it will add significant delay to gene exp clustering, esp for gdc. bins are useless for hiercluster and the request will lock up server\n\t\t\t2. the way setTermBins works, tw.q.type won't be filled and errors out\n\t\t\t*/\n\t\t\tawait opts.vocabApi.setTermBins(tw)\n\t\t}\n\n\t\tif (tw.q.preferredBins == 'median' && !tw.q.lst?.length) await fillQWithMedianBin(tw, opts.vocabApi)\n\t\telse if (tw.q.type != 'custom-bin') throw `expecting tw.q.type='custom-bin', got '${tw.q.type}'`\n\n\t\tif (!Array.isArray(tw.q.lst)) mayFillQWithPresetBins(tw)\n\n\t\tif (!tw.q.lst || !tw.q.lst.length) throw `missing or empty q.lst[] for custom-bin`\n\t\tif (tw.q.mode == 'binary' && tw.q.lst.length != 2) throw `numeric q.mode='binary' requires exactly 2 bins`\n\n\t\tTwBase.setHiddenValues(tw.q as NumericQ, tw.term)\n\t\ttw.type = 'NumTWCustomBin'\n\t\treturn tw as NumTWCustomBin\n\t}\n}\n\nexport class NumCont extends NumericBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: ContinuousNumericQ\n\t#tw: NumTWCont\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: NumTWCont, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t//this.term = tw.term // already set by base constructor\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\tgetStatus() {\n\t\treturn { text: this.q.scale ? `scale=${this.q.scale}` : 'continuous' } // FIXME not effective\n\t}\n\n\t// See the relevant comments in the NumericBase.fill() function above\n\tstatic async fill(tw: RawNumTWCont): Promise<NumTWCont> {\n\t\tif (!tw.type) tw.type = 'NumTWCont'\n\t\telse if (tw.type != 'NumTWCont') throw `expecting tw.type='NumTWCont', got '${tw.type}'`\n\n\t\tif (tw.q.mode != 'continuous') throw `tw.q.mode='${tw.q.mode}', expecting 'continuous'`\n\n\t\tTwBase.setHiddenValues(tw.q as NumericQ, tw.term)\n\t\ttw.type = 'NumTWCont'\n\t\treturn tw as NumTWCont\n\t}\n}\n\nexport class NumSpline extends NumericBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: SplineNumericQ\n\t#tw: NumTWSpline\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: NumTWSpline, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t//this.term = tw.term // already set by base constructor\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetStatus() {\n\t\treturn { text: 'cubic spline' }\n\t}\n\n\tstatic async fill(tw: RawNumTWSpline): Promise<NumTWSpline> {\n\t\tif (!tw.type) tw.type = 'NumTWSpline'\n\t\telse if (tw.type != 'NumTWSpline') throw `expecting tw.type='NumTWSpline', got '${tw.type}'`\n\n\t\tif (tw.q.mode != 'spline') throw `tw.q.mode='${tw.q.mode}', expecting 'spline'`\n\t\tif (!tw.q.knots) throw `missing tw.q.knots`\n\t\tif (!tw.q.knots.length) throw `empty tw.q.knots[]`\n\n\t\tTwBase.setHiddenValues(tw.q as NumericQ, tw.term)\n\t\ttw.type = 'NumTWSpline'\n\t\treturn tw as NumTWSpline\n\t}\n}\n\nexport async function fillQWithMedianBin(tw, vocabApi) {\n\tconst result = await vocabApi.getPercentile(tw.term, [50], vocabApi.state.termfilter)\n\tif (!result.values) throw '.values[] missing from vocab.getPercentile()'\n\tconst median = roundValueAuto(result.values[0])\n\n\t/* do not check if median is numeric here because median will be null\n\tif term has no data in dataset, so instead of throwing error, should\n\tproceed to plot code, which will report to user that no data is available */\n\t//if (!isNumeric(median)) throw 'median value not a number'\n\n\ttw.q.type = 'custom-bin'\n\ttw.q.lst = [\n\t\t{\n\t\t\tstartunbounded: true,\n\t\t\tstop: median,\n\t\t\tstopinclusive: false,\n\t\t\tlabel: '<' + median // if label is missing, cuminc will break with \"unexpected seriesId\", cuminc.js:367\n\t\t} as StartUnboundedBin,\n\t\t{\n\t\t\tstart: median,\n\t\t\tstartinclusive: true,\n\t\t\tstopunbounded: true,\n\t\t\tlabel: '\u2265' + median\n\t\t} as StopUnboundedBin\n\t]\n\tdelete tw.q.preferredBins\n}\n\nconst validPreferredBins = new Set(['default', 'less', 'median'])\n\nfunction mayFillQWithPresetBins(tw) {\n\tif (!tw.term.bins) throw `missing tw.term.bins`\n\t// preprocessing the preferredBins to make sure that q.type is set\n\t// and can be used to route the raw tw to the correct subclass fill() function\n\tconst preferredBins = tw.q.preferredBins || 'default'\n\tif (!validPreferredBins.has(preferredBins)) throw `invalid preferredBins='${preferredBins}'`\n\tif (preferredBins != 'median') {\n\t\tif (!Object.keys(tw.term.bins).includes(preferredBins))\n\t\t\tthrow `term.bins does not have a preset '${preferredBins}' key`\n\t\tconst bins = tw.term.bins[preferredBins]\n\t\tif (tw.q.type && tw.q.type != bins.type) throw `mismatched tw.q.type and term.bins[preferredBins].type`\n\t\tconst qkeys = Object.keys(tw.q)\n\t\tfor (const [k, v] of Object.entries(bins)) {\n\t\t\t// only override tw.q values that don't already exist in tw.q;\n\t\t\t// NOTES:\n\t\t\t// - Object.hasOwn(tw.q, k) will work with lib: [\"es2022\"], but that causes other tsc errors\n\t\t\t// - using tw.q.hasOwnProperty(k) causes an eslint error, no-prototype-builtins\n\t\t\tif (!qkeys.includes(k)) tw.q[k] = v\n\t\t}\n\t\tdelete tw.q.preferredBins\n\t}\n}\n", "import type { RawSnpTerm, SnpTerm, TermGroupSetting, TermValues } from '#types'\n\nconst termType = 'snp'\n\nexport class SnpBase {\n\ttype = termType\n\tid: string\n\tname: string\n\tchr: string\n\tstart: number\n\tstop: number\n\tref: string\n\talt: string[]\n\tgroupsetting: TermGroupSetting\n\tvalues: TermValues\n\n\t// option to fill-in/mutate the input raw term object in-place\n\t// - does not have to construct, but may require forced type casting in consumer code\n\tstatic fill(term: RawSnpTerm) {\n\t\tif (term instanceof SnpBase) return\n\t\tSnpBase.validate(term)\n\t\tif (!term.groupsetting) term.groupsetting = { disabled: false }\n\t\tif (!term.values) term.values = {}\n\t}\n\n\tstatic validate(term: RawSnpTerm) {\n\t\tif (typeof term !== 'object') throw 'term is not an object'\n\t\tif (term.type != termType) throw `incorrect term.type='${term?.type}', expecting '${termType}'`\n\t\tif (!term.id || !term.name) throw 'missing snp id/name'\n\t\tif (!term.chr || !Number.isInteger(term.start) || !Number.isInteger(term.stop))\n\t\t\tthrow 'incomplete position information'\n\t\tif (!term.ref || !term.alt) throw 'missing allele information'\n\t}\n\n\t// option to construct an object instance and not mutate the input raw term\n\t// - will be used instead of tw.term literal object\n\tconstructor(term: RawSnpTerm | SnpTerm) {\n\t\tSnpBase.validate(term)\n\t\tthis.id = term.id\n\t\tthis.name = term.name\n\t\tthis.chr = term.chr\n\t\tthis.start = term.start\n\t\tthis.stop = term.stop\n\t\tthis.ref = term.ref\n\t\tthis.alt = term.alt\n\t\tthis.groupsetting = term.groupsetting || { disabled: false }\n\t\tthis.values = term.values || {}\n\t}\n}\n", "import type { RawSingleCellCellTypeTerm, SingleCellCellTypeTerm, TermGroupSetting, TermValues } from '#types'\n\nconst termType = 'singleCellCellType'\n\nexport class SingleCellCellTypeBase {\n\ttype = termType\n\tsample: string\n\tplot: string\n\tgroupsetting: TermGroupSetting\n\tvalues: TermValues\n\n\t// option to fill-in/mutate the input raw term object in-place\n\t// - does not have to construct, but may require forced type casting in consumer code\n\tstatic fill(term: RawSingleCellCellTypeTerm) {\n\t\tif (term instanceof SingleCellCellTypeBase) return\n\t\tSingleCellCellTypeBase.validate(term)\n\t\tif (!term.groupsetting) term.groupsetting = { disabled: false }\n\t\tif (!term.values) term.values = {}\n\t}\n\n\tstatic validate(term: RawSingleCellCellTypeTerm) {\n\t\tif (typeof term !== 'object') throw new Error('term is not an object')\n\t\tif (term.type != termType) throw new Error(`incorrect term.type='${term?.type}', expecting '${termType}'`)\n\t\tif (!term?.sample) throw new Error('missing term.sample')\n\t\tif (!term?.plot) throw new Error('missing term.plot')\n\t}\n\n\t// option to construct an object instance and not mutate the input raw term\n\t// - will be used instead of tw.term literal object\n\tconstructor(term: RawSingleCellCellTypeTerm | SingleCellCellTypeTerm) {\n\t\tSingleCellCellTypeBase.validate(term)\n\t\tthis.sample = term.sample\n\t\tthis.plot = term.plot\n\t\tthis.groupsetting = term.groupsetting || { disabled: false }\n\t\tthis.values = term.values || {}\n\t}\n}\n", "import type {\n\tTerm,\n\tQualTerm,\n\tQualQ,\n\tGroupEntry,\n\tValuesQ,\n\tPredefinedGroupSettingQ,\n\tCustomGroupSettingQ,\n\tBaseGroupSet,\n\tQualTW,\n\tQualTWValues,\n\tQualTWPredefinedGS,\n\tQualTWCustomGS,\n\tRawQualTW,\n\tRawQualTWValues,\n\tRawQualTWPredefinedGS,\n\tRawQualTWCustomGS\n} from '#types'\nimport { CategoricalBase } from './categorical.ts'\nimport { SnpBase } from './snp.ts'\nimport { SingleCellCellTypeBase } from './singleCellCellType.ts'\nimport type { TwOpts } from './TwBase.ts'\nimport { TwBase } from './TwBase.ts'\nimport { copyMerge } from '#rx'\nimport { set_hiddenvalues, type UseCase } from '#termsetting'\nimport { throwMsgWithFilePathAndFnName } from '#dom/sayerror'\n\nexport type QualInstance = QualValues | QualPredefinedGS | QualCustomGS\nexport type QualTypes = typeof QualValues | typeof QualPredefinedGS | typeof QualCustomGS\n\nexport class QualitativeBase extends TwBase {\n\t// type, isAtomic, $id are set in ancestor base classes\n\tterm: QualTerm\n\tq: QualQ\n\tstatic termTypes = new Set(['categorical', 'snp', 'singleCellCellType'])\n\n\tconstructor(tw: QualTW, opts: TwOpts) {\n\t\tsuper(tw, opts)\n\t\tthis.term = tw.term\n\t\tthis.q = tw.q\n\t}\n\n\t/** tw.term must already be filled-in at this point */\n\tstatic async fill(tw: RawQualTW, opts: TwOpts = {}): Promise<QualTW> {\n\t\tif (!tw.term) throw `missing tw.term`\n\t\tif (typeof tw.term != 'object') throw `tw.term is not an object`\n\t\tif (!QualitativeBase.termTypes.has(tw.term.type)) throw `non-qualitative term.type='${tw.term.type}'`\n\n\t\tswitch (tw.term.type) {\n\t\t\tcase 'categorical':\n\t\t\t\tCategoricalBase.fill(tw.term)\n\t\t\t\tbreak\n\n\t\t\tcase 'snp':\n\t\t\t\tSnpBase.fill(tw.term)\n\t\t\t\tbreak\n\n\t\t\tcase 'singleCellCellType':\n\t\t\t\tSingleCellCellTypeBase.fill(tw.term)\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\t// should never be reached if TwRouter.fill() routes correctly\n\t\t\t\tthrow `unexpected qualitative term.type'` //='${tw.term.type}'`\n\t\t}\n\n\t\t// GDC or other dataset may allow missing or empty term.values\n\t\t//if (!tw.term.values || !Object.keys(tw.term.values).length) throw `missing or empty tw.term.values`\n\n\t\tif (opts.defaultQ != null) {\n\t\t\topts.defaultQ.isAtomic = true\n\t\t\t// merge defaultQ into tw.q\n\t\t\tcopyMerge(tw.q, opts.defaultQ)\n\t\t}\n\t\t// set a default q.mode for clarity, otherwise `mode?: 'binary'` may seem like the only option\n\t\t// NOTE: many code that process categorical tw already assume discrete mode, without checking q.mode,\n\t\t// except for applications that allow or require q.mode='binary'\n\t\tif (!tw.q.mode) tw.q.mode = 'discrete'\n\n\t\t// set q.type based on q.mode\n\t\tswitch (tw.q.mode) {\n\t\t\tcase 'discrete':\n\t\t\t\tif (!tw.q.type) tw.q.type = 'values'\n\t\t\t\tbreak\n\n\t\t\tcase 'binary':\n\t\t\t\tif (tw.term.values && Object.keys(tw.term.values).length == 2) {\n\t\t\t\t\t// term only has 2 values, should not allow groupset\n\t\t\t\t\ttw.q.type = 'values'\n\t\t\t\t} else {\n\t\t\t\t\ttw.q.type = 'custom-groupset'\n\t\t\t\t}\n\t\t\t\tbreak\n\n\t\t\tdefault:\n\t\t\t\tthrow 'tw.q.mode not supported'\n\t\t}\n\n\t\t/* \n\t\t\tPre-fill the tw.type, since it's required for ROUTING to the\n\t\t\tcorrect fill() function. Tsc will be able to use tw.type as a \n\t\t\tdiscriminant property for the RawQualTW union type, enabling \n\t\t\tstatic type checks on the input raw tw.\n\n\t\t\tNOTE: tw.type is NOT required when calling a specialized fill() \n\t\t\tfunction directly, outside of TwRouter.fill(). The input tw.type\n\t\t\tdoes not have to be discriminated in that case.\n\t\t*/\n\t\ttw.type =\n\t\t\t!tw.q.type || tw.q.type == 'values'\n\t\t\t\t? 'QualTWValues'\n\t\t\t\t: tw.q.type == 'predefined-groupset'\n\t\t\t\t? 'QualTWPredefinedGS'\n\t\t\t\t: tw.q.type == 'custom-groupset'\n\t\t\t\t? 'QualTWCustomGS'\n\t\t\t\t: tw.type\n\n\t\t/*\n\t\t\tFor each of fill() functions below:\n\t\t\t1. The `tw` argument must already have a tw.type string value, \n\t\t\t which corresponds to the RawQualTW* equivalent of the full QualTW* type \n\n\t\t\t2. The fill() function must fill-in any expected missing values,\n\t\t\t validate the tw.q shape at runtime, and throw on any error or mismatched expectation.\n\t\t\t Runtime validation is required because the input raw tw can come from anywhere,\n\t\t\t like term.bins.default, which is a runtime variable that is not possible to statically check.\n\n\t\t\t3. The filled-in tw, when returned, must be **coerced** to the full QualTW* type, \n\t\t\t in order to match the function signature's return type.\n\t\t*/\n\t\tswitch (tw.type) {\n\t\t\tcase 'QualTWValues':\n\t\t\t\treturn await QualValues.fill(tw)\n\n\t\t\tcase 'QualTWPredefinedGS':\n\t\t\t\treturn await QualPredefinedGS.fill(tw)\n\n\t\t\tcase 'QualTWCustomGS':\n\t\t\t\treturn await QualCustomGS.fill(tw, opts)\n\n\t\t\tdefault:\n\t\t\t\tthrow `tw.type='${tw.type} (q.mode:q.type=${tw.q.mode}:${tw.q.type}' is not supported by QualitativeBase.fill()`\n\t\t}\n\t}\n\n\tgetTitleText() {\n\t\treturn this.term.name\n\t}\n\n\tgetStatus(_?: UseCase) {\n\t\treturn { text: '' }\n\t}\n}\n\nexport class QualValues extends QualitativeBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: ValuesQ\n\t#tw: QualTWValues\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: QualTWValues, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t//this.term = tw.term // already set in base class\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\t// See the relevant comments in the QualitativeBase.fill() function above\n\tstatic async fill(tw: RawQualTWValues): Promise<QualTWValues> {\n\t\tif (!tw.type) tw.type = 'QualTWValues'\n\t\telse if (tw.type != 'QualTWValues') throw `expecting tw.type='QualTWValues', got '${tw.type}'`\n\n\t\tconst { term, q } = tw\n\t\tif (!q.type) q.type = 'values'\n\t\telse if (q.type != 'values') throw `expecting tw.q.type='values', got ${tw.q.type}`\n\n\t\t// GDC or other dataset may allow missing term.values\n\t\tif (!term.values) term.values = {}\n\n\t\tif (q.mode == 'binary') {\n\t\t\t// a tw with q.type = 'values' can only have mode='binary' if it has exactly 2 values\n\t\t\tif (Object.keys(term.values).length != 2) throw 'term.values must have two keys'\n\t\t}\n\n\t\tset_hiddenvalues(q, term as Term) // TODO: do not force type\n\t\t// TODO: figure out not having to force the returned type\n\t\treturn tw as QualTWValues\n\t}\n\n\tgetStatus(usecase?: UseCase) {\n\t\tif (usecase?.target == 'regression') {\n\t\t\treturn this.q.mode == 'binary' ? { text: 'binary' } : { text: 'categorical' }\n\t\t}\n\t\treturn { text: '' }\n\t}\n\n\tgetGroups(category2samplecount: any[], maxGrpNum: number = 3) {\n\t\tconst values: any[] = []\n\t\tconst groups: any[] = []\n\t\tconst grpIdxes: Set<number> = new Set([0, 1, 2])\n\t\tfor (const v of category2samplecount) {\n\t\t\tif (v.uncomputable) return //Still necessary? Possibly taken care of termdb route... somewhere\n\t\t\tif (v?.group > maxGrpNum)\n\t\t\t\tthrowMsgWithFilePathAndFnName(\n\t\t\t\t\t`The maximum number of groups is ${maxGrpNum}. The group index for value = ${v.label} is ${v.group}`\n\t\t\t\t)\n\t\t\tconst value = {\n\t\t\t\tkey: v.key,\n\t\t\t\tlabel: v.label,\n\t\t\t\tgroup: v.group || 1,\n\t\t\t\tsamplecount: v.samplecount\n\t\t\t}\n\t\t\tvalues.push(value)\n\t\t}\n\n\t\tfor (const g of Array.from(grpIdxes)) {\n\t\t\t//add any required groups, specifically Excluded Categories and Group 2\n\t\t\tgroups.push({\n\t\t\t\tcurrentIdx: g,\n\t\t\t\ttype: this.type,\n\t\t\t\tname: g === 0 ? `Excluded categories` : `Group ${g.toString()}`,\n\t\t\t\tuncomputable: g === 0\n\t\t\t})\n\t\t}\n\n\t\treturn { groups, values }\n\t}\n}\n\nexport class QualPredefinedGS extends QualitativeBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: PredefinedGroupSettingQ\n\t// set by Object.defineProperty() so that the property is not\n\t// enumerable, will not show up in JSON.stringify() and structuredClone(),\n\t// but can still be accessed by addon methods, unlike #private props\n\tgroupset!: BaseGroupSet\n\t#tw: QualTWPredefinedGS\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: QualTWPredefinedGS, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t// this.term = tw.term // already set in base class\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tObject.defineProperty(this, 'groupset', {\n\t\t\tvalue: this.#tw.term.groupsetting[this.#tw.q.predefined_groupset_idx]\n\t\t})\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\tstatic async fill(tw: RawQualTWPredefinedGS): Promise<QualTWPredefinedGS> {\n\t\tif (!tw.type) tw.type = 'QualTWPredefinedGS'\n\t\telse if (tw.type != 'QualTWPredefinedGS') throw `expecting tw.type='QualTWPredefinedGS', got '${tw.type}'`\n\n\t\tif (tw.q.type != 'predefined-groupset') throw `expecting tw.q.type='predefined-groupset', got '${tw.q.type}'`\n\n\t\tconst { term, q } = tw\n\t\tconst i = q.predefined_groupset_idx\n\t\tif (i !== undefined && !Number.isInteger(i)) throw `missing or invalid tw.q.predefined_groupset_idx='${i}'`\n\t\tq.predefined_groupset_idx = i || 0\n\t\tconst gs = tw.term.groupsetting\n\t\tif (!gs) throw 'no term.groupsetting'\n\t\tif (!gs.lst?.length) throw 'term.groupsetting.lst is empty'\n\t\tconst groupset = gs.lst?.[q.predefined_groupset_idx]\n\t\tif (!groupset) throw `no groupset entry for groupsetting.lst?.[predefined_groupset_idx=${i}]`\n\n\t\tif (q.mode == 'binary') {\n\t\t\t//\n\t\t\tif (groupset.groups.length != 2) throw 'there must be exactly two groups'\n\t\t}\n\t\tset_hiddenvalues(q, term as Term) // TODO: do not force type\n\t\t// TODO: figure out not having to force the returned type\n\t\treturn tw as QualTWPredefinedGS\n\t}\n\n\tgetStatus(usecase?: UseCase) {\n\t\tif (usecase?.target == 'regression') {\n\t\t\treturn this.q.mode == 'binary' ? { text: 'binary' } : { text: 'categorical' }\n\t\t}\n\t\t// fill() should have already validated q\n\t\treturn { text: this.term.groupsetting.lst?.[this.q.predefined_groupset_idx].name || 'predefined groups' }\n\t}\n\n\tgetGroups() {\n\t\tthrow `q.type='predefined-groupset' not supported in groupsetting menu`\n\t}\n}\n\nexport class QualCustomGS extends QualitativeBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: CustomGroupSettingQ\n\tgroupset!: BaseGroupSet\n\t#tw: QualTWCustomGS\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: QualTWCustomGS, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t// this.term = tw.term // already set in base class\n\t\tthis.q = tw.q\n\t\tObject.defineProperty(this, 'groupset', { value: this.q.customset })\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\t// See the relevant comments in the QualitativeBase.fill() function above\n\tstatic async fill(tw: RawQualTWCustomGS, opts: TwOpts): Promise<QualTWCustomGS> {\n\t\tif (!tw.type) tw.type = 'QualTWCustomGS'\n\t\telse if (tw.type != 'QualTWCustomGS') throw `expecting tw.type='QualTWCustomGS', got '${tw.type}'`\n\n\t\tif (tw.q.type != 'custom-groupset') throw `expecting tw.q.type='custom-groupset', got '${tw.q.type}'`\n\n\t\tconst { term, q } = tw\n\t\tif (!q.customset) await mayFillCustomSet(q, term, opts.vocabApi)\n\t\tif (q.mode == 'binary') {\n\t\t\tif (q.customset.groups.filter((g: any) => !g.uncomputable).length != 2) throw 'there must be exactly two groups'\n\t\t}\n\t\tset_hiddenvalues(q, term as Term) // TODO: do not force type\n\t\t// TODO: figure out not having to force the returned type\n\t\treturn tw as QualTWCustomGS\n\t}\n\n\tgetStatus(usecase?: UseCase) {\n\t\tif (usecase?.target == 'regression') {\n\t\t\treturn this.q.mode == 'binary' ? { text: 'binary' } : { text: 'categorical' }\n\t\t}\n\t\t// TODO: move this validation to the fill() function above?\n\t\tconst n = this.q.customset.groups.filter(group => {\n\t\t\tif (group.type != 'values') throw `group.type must be 'values'`\n\t\t\tif (!group.uncomputable) return true\n\t\t}).length\n\t\treturn { text: 'Divided into ' + n + ' groups' }\n\t}\n\n\tgetGroups(category2samplecount) {\n\t\tconst values: any = []\n\t\tconst groups: any[] = []\n\t\tconst grpIdxes = new Set([0, 1, 2])\n\t\tconst q = this.q\n\t\tfor (const [i, g] of q.customset.groups.entries()) {\n\t\t\tconst group = g as any // TODO: improve typing\n\t\t\tconst uncomputable = Object.keys(group).includes('uncomputable') ? group.uncomputable : i === 0\n\t\t\tgroups.push({\n\t\t\t\tcurrentIdx: i,\n\t\t\t\ttype: group.type,\n\t\t\t\tname: group.name,\n\t\t\t\tuncomputable\n\t\t\t})\n\t\t\tgrpIdxes.delete(i)\n\t\t\tif (group.type != 'values') throw `group.type should equal 'values'`\n\t\t\tfor (const value of group.values) {\n\t\t\t\t/** label may not be provided in groupsetting.customset.\n\t\t\t\t * If missing, find the label from category2samplecout or\n\t\t\t\t * use the last ditch effort to use the key.\n\t\t\t\t */\n\t\t\t\tconst c2s = category2samplecount?.find(\n\t\t\t\t\t(d: { key: string; label?: string; samplecount: number }) => d.key == value.key\n\t\t\t\t)\n\t\t\t\tconst label = value.label || c2s?.label || value.key\n\t\t\t\tvalues.push({\n\t\t\t\t\tkey: value.key,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\tgroup: i,\n\t\t\t\t\tsamplecount: value.samplecount || c2s.samplecount\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\treturn { groups, values }\n\t}\n}\n\nasync function mayFillCustomSet(q, term, vocabApi) {\n\tif (q.mode == 'binary') {\n\t\t// binary mode, divide categories evenly into two groups\n\t\tconst data = await vocabApi.getCategories(term, vocabApi.state.termfilter.filter)\n\t\tconst sorted = [...data.lst].sort((a, b) => b.samplecount - a.samplecount)\n\t\tconst group1: GroupEntry = { name: 'Group 1', type: 'values', values: [] }\n\t\tconst group2: GroupEntry = { name: 'Group 2', type: 'values', values: [] }\n\t\tlet sum1 = 0\n\t\tlet sum2 = 0\n\t\tfor (const item of sorted) {\n\t\t\tif (sum1 <= sum2) {\n\t\t\t\tgroup1.values.push({ key: item.key, label: item.label })\n\t\t\t\tsum1 += item.samplecount\n\t\t\t} else {\n\t\t\t\tgroup2.values.push({ key: item.key, label: item.label })\n\t\t\t\tsum2 += item.samplecount\n\t\t\t}\n\t\t}\n\n\t\tif (sum1 == 0 || sum2 == 0) throw 'both groups must have non-zero sample counts'\n\n\t\tconst customset: BaseGroupSet = {\n\t\t\t// creating 3 groups instead of 2 groups since current groupset UI expects first group to be excluded group\n\t\t\t// TODO: refactor client/termsetting/handlers/qualitative.ts to not consider the first group (i.e. group.currentIdx === 0) as the excluded group, but rather to consider group.excluded=true as the excluded group\n\t\t\tgroups: [\n\t\t\t\t{\n\t\t\t\t\tname: 'Excluded categories',\n\t\t\t\t\ttype: 'values',\n\t\t\t\t\tvalues: [],\n\t\t\t\t\tuncomputable: true\n\t\t\t\t},\n\t\t\t\tgroup1,\n\t\t\t\tgroup2\n\t\t\t]\n\t\t}\n\t\tq.customset = customset\n\t} else {\n\t\t// discrete mode, should already have custom set\n\t\tthrow 'tw.q.customset is required for q.mode=discrete'\n\t}\n}\n", "import { getPillNameDefault } from '../utils.ts'\nimport type { RawGvTerm, VocabApi } from '#types'\nimport type { PillData } from '../types'\nimport { make_radios, renderTable } from '#dom'\nimport { dtTerms, getColors, dtcnv, mclass } from '#shared/common.js'\nimport { filterInit, filterPromptInit, getNormalRoot, excludeFilterByTag } from '#filter/filter'\nimport { rgb } from 'd3-color'\nimport { getWrappedTvslst } from '#filter/filter'\nimport type { TermSetting } from '../TermSetting.ts'\n\nlet colorScale = getColors(3)\n\n// self is the termsetting instance\nexport function getHandler(self: TermSetting) {\n\treturn {\n\t\tgetPillName(d: PillData) {\n\t\t\treturn getPillNameDefault(self, d)\n\t\t},\n\n\t\tgetPillStatus() {\n\t\t\tlet text\n\t\t\tconst q = self.q as any // TODO: migrate this handler to use client/tw code\n\t\t\tif (q.type == 'predefined-groupset') {\n\t\t\t\tconst groupsetting = self.term.groupsetting\n\t\t\t\tif (!groupsetting.lst?.length) throw 'no predefined groupsets found'\n\t\t\t\tconst groupset = groupsetting.lst[q.predefined_groupset_idx]\n\t\t\t\ttext = groupset.name\n\t\t\t} else if (q.type == 'custom-groupset') {\n\t\t\t\tconst n = q.customset.groups.length\n\t\t\t\ttext = `Divided into ${n} groups`\n\t\t\t} else {\n\t\t\t\ttext = 'any variant class'\n\t\t\t}\n\t\t\treturn { text }\n\t\t},\n\n\t\tasync showEditMenu(div: Element) {\n\t\t\tawait makeEditMenu(self, div)\n\t\t}\n\t}\n}\n\nasync function makeEditMenu(self: TermSetting, _div: any) {\n\t/* TODO: instead of directly modifying self.q here, should create a separate property on the handler to store pending user\n\tconfigurations (similar to numeric continuous/discrete switching)\n\tconst handler = self.handlerByType.geneVariant */\n\tconst div = _div.append('div').style('margin', '10px')\n\tdiv.append('div').style('font-size', '1.2rem').text(self.term.name)\n\tconst optsDiv = div.append('div').style('margin-top', '10px').style('margin-bottom', '1px')\n\tconst groupsDiv = div.append('div').style('display', 'none').style('margin', '10px').style('vertical-align', 'top')\n\t// radio buttons for whether or not to group samples\n\toptsDiv.append('div').style('font-weight', 'bold').text('Group samples')\n\tconst q = self.q as any // TODO: migrate this handler to use client/tw code\n\tconst isGroupset = q.type == 'predefined-groupset' || q.type == 'custom-groupset'\n\tmake_radios({\n\t\tholder: optsDiv,\n\t\toptions: [\n\t\t\t{ label: 'No sample grouping', value: 'noGroup', checked: !isGroupset },\n\t\t\t{ label: 'Assign samples to groups', value: 'group', checked: isGroupset }\n\t\t],\n\t\tcallback: async v => {\n\t\t\tif (v == 'group') {\n\t\t\t\tif (q.type == 'values') Object.assign(q, { type: 'custom-groupset', customset: { groups: [] } })\n\t\t\t\tawait makeGroupUI(self, groupsDiv)\n\t\t\t} else {\n\t\t\t\tclearGroupset(self)\n\t\t\t\tgroupsDiv.style('display', 'none')\n\t\t\t}\n\t\t}\n\t})\n\tif (isGroupset) await makeGroupUI(self, groupsDiv)\n\n\tif (\n\t\t(self.usecase?.detail && ['term', 'term0', 'term2'].includes(self.usecase.detail)) ||\n\t\tself.opts.geneVariantEditMenuOnlyGrp\n\t) {\n\t\t// only groupsetting is allowed\n\t\t// hide option for turning off groupsetting\n\t\toptsDiv.style('display', 'none')\n\t\tgroupsDiv.style('margin', '0px')\n\t}\n\n\t// apply button\n\tdiv\n\t\t.append('div')\n\t\t.style('margin-top', '25px')\n\t\t.append('button')\n\t\t.text('Apply')\n\t\t.on('click', () => {\n\t\t\tconst q = self.q as any // TODO: migrate this handler to use client/tw code\n\t\t\tif (q.type == 'predefined-groupset' || q.type == 'custom-groupset') {\n\t\t\t\t// groupsetting\n\t\t\t\tif (!self.groups?.length) {\n\t\t\t\t\t// no groups created\n\t\t\t\t\twindow.alert('Samples must be assigned to at least one group.')\n\t\t\t\t\treturn\n\t\t\t\t} else {\n\t\t\t\t\t// groups created, assign to custom groupset\n\t\t\t\t\tObject.assign(q, { type: 'custom-groupset', customset: { groups: self.groups } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// no groupsetting\n\t\t\t\tif (q.type != 'values') throw `q.type must be 'values'`\n\t\t\t}\n\t\t\tself.api.runCallback()\n\t\t})\n}\n\n// make UI for grouping variants\nasync function makeGroupUI(self: TermSetting, div) {\n\tdiv.style('display', 'block')\n\tdiv.selectAll('*').remove()\n\n\t// message\n\tdiv\n\t\t.append('div')\n\t\t.style('margin', '15px 0px')\n\t\t.text(\n\t\t\t'Group samples by mutation status. Samples are assigned to first possible group. Only tested samples are considered.'\n\t\t)\n\n\t// filter table\n\tconst filterTableDiv = div.append('div')\n\t// add new group button\n\tconst addNewGroupBtnHolder = div.append('div')\n\n\tconst q = self.q as any // TODO: migrate this handler to use client/tw code\n\t// get groups\n\tif (q.type != 'predefined-groupset' && q.type != 'custom-groupset') throw 'unexpected q.type'\n\tif (!self.groups) {\n\t\tlet groupset\n\t\tif (q.type == 'predefined-groupset') {\n\t\t\tconst groupsetting = self.term.groupsetting\n\t\t\tif (!groupsetting.lst?.length) throw 'no predefined groupsets found'\n\t\t\tgroupset = groupsetting.lst[q.predefined_groupset_idx]\n\t\t} else {\n\t\t\tgroupset = q.customset\n\t\t}\n\t\tif (!groupset) throw 'groupset is missing'\n\t\tif (!Array.isArray(groupset.groups)) throw 'groupset.groups is not array'\n\t\tself.groups = structuredClone(groupset.groups)\n\t}\n\n\t// prompt button is an instance to a blank filter, can only make the button after state is filled\n\t// but not in instance.init()\n\t// create \"Add new group\" button as needed\n\tconst filterPrompt = await filterPromptInit({\n\t\tholder: addNewGroupBtnHolder,\n\t\tvocab: {\n\t\t\tterms: self.term.childTerms,\n\t\t\tparent_termdbConfig: self.vocabApi.termdbConfig\n\t\t},\n\t\temptyLabel: 'Add group',\n\t\t//termdbConfig: self.vocabApi.termdbConfig,\n\t\tcallback: f => {\n\t\t\tconst filter = getNormalRoot(f)\n\t\t\taddNewGroup(filter, self.groups)\n\t\t\tmakeGroupUI(self, div)\n\t\t},\n\t\tdebug: self.opts.debug\n\t})\n\n\t// filterPrompt.main() always empties the filterUiRoot data\n\tconst filter = structuredClone(self.filter)\n\tfilterPrompt.main(excludeFilterByTag(filter, 'cohortFilter')) // provide mass filter to limit the term tree\n\n\tif (!self.groups.length) {\n\t\t// no groups, hide table\n\t\tfilterTableDiv.style('display', 'none')\n\t\treturn\n\t}\n\n\t// clear table and populate rows\n\tfilterTableDiv.style('display', '').selectAll('*').remove()\n\tconst tableArg: any = {\n\t\tdiv: filterTableDiv,\n\t\tcolumns: [\n\t\t\t{}, // blank column to add delete buttons\n\t\t\t{\n\t\t\t\tlabel: 'NAME',\n\t\t\t\teditCallback: async (i, cell) => {\n\t\t\t\t\tconst newName = cell.value\n\t\t\t\t\tconst index = self.groups.findIndex(group => group.name == newName)\n\t\t\t\t\tif (index != -1) {\n\t\t\t\t\t\talert(`Group named ${newName} already exists`)\n\t\t\t\t\t\tmakeGroupUI(self, div)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.groups[i].name = newName\n\t\t\t\t\t\tmakeGroupUI(self, div)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: 'COLOR',\n\t\t\t\teditCallback: async (i, cell) => {\n\t\t\t\t\tself.groups[i].color = cell.color\n\t\t\t\t\tmakeGroupUI(self, div)\n\t\t\t\t}\n\t\t\t},\n\t\t\t//{ label: '#SAMPLE' }, // will re-enable when filtered sample count can be supported for gdc\n\t\t\t{ label: 'FILTER' }\n\t\t],\n\t\trows: [],\n\t\tstriped: false, // no alternating row bg color so delete button appears more visible\n\t\tshowLines: false\n\t}\n\n\tfor (const g of self.groups) {\n\t\ttableArg.rows.push([\n\t\t\t{}, // blank cell to add delete button\n\t\t\t{ value: g.name }, // to allow click to show <input>\n\t\t\t{ color: g.color },\n\t\t\t// { value: 'n=' + (await self.vocabApi.getFilteredSampleCount(g.filter)) }, // will re-enable when filtered sample count can be supported for gdc\n\t\t\t{} // blank cell to show filter ui\n\t\t])\n\t}\n\n\trenderTable(tableArg)\n\n\t// after rendering table, iterate over rows again to fill cells with control elements\n\tfor (const [i, row] of tableArg.rows.entries()) {\n\t\t// add delete button in 1st cell\n\t\trow[0].__td\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t.style('padding', '1px 6px')\n\t\t\t.html('×')\n\t\t\t.on('click', () => {\n\t\t\t\tself.groups.splice(i, 1)\n\t\t\t\tmakeGroupUI(self, div)\n\t\t\t})\n\n\t\t// create filter ui in its cell\n\t\tconst group = self.groups[i]\n\t\tfilterInit({\n\t\t\tholder: row[3].__td,\n\t\t\tvocab: {\n\t\t\t\tterms: self.term.childTerms,\n\t\t\t\tparent_termdbConfig: self.vocabApi.termdbConfig\n\t\t\t},\n\t\t\t//termdbConfig: self.vocabApi.termdbConfig,\n\t\t\tcallback: f => {\n\t\t\t\tif (!f || f.lst.length == 0) {\n\t\t\t\t\t// blank filter (user removed last tvs from this filter), delete this element from groups[]\n\t\t\t\t\tconst i = self.groups.findIndex(g => g.name == group.name)\n\t\t\t\t\tself.groups.splice(i, 1)\n\t\t\t\t} else {\n\t\t\t\t\t// update filter\n\t\t\t\t\tf.lst.forEach(item => (item.tvs.excludeGeneName = true)) // no need to show gene name in filter pill\n\t\t\t\t\tgroup.filter = f\n\t\t\t\t}\n\t\t\t\tmakeGroupUI(self, div)\n\t\t\t}\n\t\t}).main(group.filter)\n\t}\n}\n\nfunction addNewGroup(filter, groups, name?: string) {\n\tif (!groups) throw 'groups is missing'\n\tif (!name) {\n\t\tconst base = 'New group'\n\t\tname = base\n\t\tfor (let i = 0; ; i++) {\n\t\t\tname = base + (i === 0 ? '' : ' ' + i)\n\t\t\tif (!groups.find(g => g.name === name)) break\n\t\t}\n\t}\n\tfilter.lst.forEach(item => (item.tvs.excludeGeneName = true)) // no need to show gene name in filter pill\n\tconst newGroup = {\n\t\tname,\n\t\ttype: 'filter',\n\t\tfilter,\n\t\tcolor: '#000000'\n\t}\n\tgroups.push(newGroup)\n}\n\nexport async function getPredefinedGroupsets(term: RawGvTerm, vocabApi: VocabApi) {\n\tif (!term.childTerms?.length) throw 'term.childTerms[] is missing'\n\t// build predefined groupsets based on child dt terms\n\tterm.groupsetting = {\n\t\tdisabled: false,\n\t\tlst: term.childTerms.map(dtTerm => {\n\t\t\tconst groupset: any = { name: dtTerm.name, dt: dtTerm.dt }\n\t\t\tif (dtTerm.origin) groupset.origin = dtTerm.origin\n\t\t\tif (dtTerm.dt == dtcnv) getCnvGroupset(groupset, dtTerm, term.name, vocabApi)\n\t\t\telse getNonCnvGroupset(groupset, dtTerm, term.name)\n\t\t\treturn groupset\n\t\t})\n\t}\n\n\t// function to get cnv groupset\n\t// will route to appropriate function depending on mode of cnv data\n\tfunction getCnvGroupset(groupset, dtTerm, geneName, vocabApi) {\n\t\tconst cnv = vocabApi.termdbConfig.queries?.cnv\n\t\tif (!cnv) throw 'cnv query is missing'\n\t\tconst keys = Object.keys(cnv)\n\t\tconst isContinuous = keys.includes('cnvGainCutoff') || keys.includes('cnvLossCutoff')\n\t\tif (isContinuous) getContCnvGroupset(groupset, dtTerm, geneName, cnv)\n\t\telse getCatCnvGroupset(groupset, dtTerm, geneName)\n\t}\n\n\t// function to get cnv groupset for continuous cnv data\n\t// will compare gain/loss/neutral\n\tfunction getContCnvGroupset(groupset, dtTerm, geneName, cnv) {\n\t\tconst cnvDefault = cnv.cnvCutoffsByGene?.[dtTerm.parentTerm.name] || {\n\t\t\tcnvMaxLength: cnv.cnvMaxLength,\n\t\t\tcnvGainCutoff: cnv.cnvGainCutoff,\n\t\t\tcnvLossCutoff: cnv.cnvLossCutoff\n\t\t}\n\t\t// gain group\n\t\tconst gainGroup = {\n\t\t\tname: `${geneName} ${dtTerm.name_noOrigin} ${dtTerm.origin ? `Gain (${dtTerm.origin})` : 'Gain'}`,\n\t\t\ttype: 'filter',\n\t\t\tfilter: getWrappedTvslst([\n\t\t\t\t{\n\t\t\t\t\ttype: 'tvs',\n\t\t\t\t\ttvs: {\n\t\t\t\t\t\tterm: dtTerm,\n\t\t\t\t\t\tvalues: [],\n\t\t\t\t\t\tcontinuousCnv: true,\n\t\t\t\t\t\tcnvGainCutoff: cnvDefault.cnvGainCutoff,\n\t\t\t\t\t\tcnvLossCutoff: -99, // set to very low number to get samples with gain events\n\t\t\t\t\t\tcnvMaxLength: cnvDefault.cnvMaxLength,\n\t\t\t\t\t\texcludeGeneName: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t])\n\t\t}\n\t\t// loss group\n\t\tconst lossGroup = {\n\t\t\tname: `${geneName} ${dtTerm.name_noOrigin} ${dtTerm.origin ? `Loss (${dtTerm.origin})` : 'Loss'}`,\n\t\t\ttype: 'filter',\n\t\t\tfilter: getWrappedTvslst([\n\t\t\t\t{\n\t\t\t\t\ttype: 'tvs',\n\t\t\t\t\ttvs: {\n\t\t\t\t\t\tterm: dtTerm,\n\t\t\t\t\t\tvalues: [],\n\t\t\t\t\t\tcontinuousCnv: true,\n\t\t\t\t\t\tcnvGainCutoff: 99, // set to very high number to get samples with loss events\n\t\t\t\t\t\tcnvLossCutoff: cnvDefault.cnvLossCutoff,\n\t\t\t\t\t\tcnvMaxLength: cnvDefault.cnvMaxLength,\n\t\t\t\t\t\texcludeGeneName: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t])\n\t\t}\n\t\t// neutral group\n\t\tconst wtGroup = {\n\t\t\tname: `${geneName} ${dtTerm.name_noOrigin} ${dtTerm.origin ? `Neutral (${dtTerm.origin})` : 'Neutral'}`,\n\t\t\ttype: 'filter',\n\t\t\tfilter: getWrappedTvslst([\n\t\t\t\t{\n\t\t\t\t\ttype: 'tvs',\n\t\t\t\t\ttvs: {\n\t\t\t\t\t\tterm: dtTerm,\n\t\t\t\t\t\tvalues: [],\n\t\t\t\t\t\tcontinuousCnv: true,\n\t\t\t\t\t\tcnvWT: true,\n\t\t\t\t\t\tcnvGainCutoff: cnvDefault.cnvGainCutoff,\n\t\t\t\t\t\tcnvLossCutoff: cnvDefault.cnvLossCutoff,\n\t\t\t\t\t\tcnvMaxLength: cnvDefault.cnvMaxLength,\n\t\t\t\t\t\texcludeGeneName: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t])\n\t\t}\n\t\tgroupset.groups = [gainGroup, lossGroup, wtGroup]\n\t\t// set color scale based on number of groups\n\t\tcolorScale = getColors(groupset.groups.length)\n\t\t// assign colors to each group\n\t\tfor (const group of groupset.groups) {\n\t\t\tgroup.color = rgb(colorScale(group.name)).formatHex()\n\t\t}\n\t}\n\n\t// function to get cnv groupset for categorical cnv data\n\t// will compare cnv categories present in the data\n\tfunction getCatCnvGroupset(groupset, dtTerm, geneName) {\n\t\tgroupset.groups = []\n\t\tfor (const key of Object.keys(dtTerm.values)) {\n\t\t\tconst label = dtTerm.values[key].label\n\t\t\tconst value = { key, label, value: key }\n\t\t\tconst filter = getWrappedTvslst([\n\t\t\t\t{\n\t\t\t\t\ttype: 'tvs',\n\t\t\t\t\ttvs: {\n\t\t\t\t\t\tterm: dtTerm,\n\t\t\t\t\t\tvalues: [value],\n\t\t\t\t\t\texcludeGeneName: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t])\n\t\t\tconst name = `${geneName} ${dtTerm.name_noOrigin} ${dtTerm.origin ? `${label} (${dtTerm.origin})` : label}`\n\t\t\tconst color = mclass[key].color\n\t\t\tgroupset.groups.push({ name, type: 'filter', filter, color })\n\t\t}\n\t}\n\n\t// function to get non-cnv (e.g. snv/indel, fusion, etc.) groupset\n\t// will compare mutant vs. wildtype\n\tfunction getNonCnvGroupset(groupset, dtTerm, geneName) {\n\t\tcolorScale = getColors(2)\n\t\tgroupset.groups = []\n\t\t// group 1: mutant\n\t\tconst grp1Name = `${geneName} ${dtTerm.name_noOrigin} ${dtTerm.origin ? `Mutated (${dtTerm.origin})` : 'Mutated'}`\n\t\tconst grp1Filter = getWrappedTvslst([\n\t\t\t{\n\t\t\t\ttype: 'tvs',\n\t\t\t\ttvs: {\n\t\t\t\t\tterm: dtTerm,\n\t\t\t\t\tvalues: [{ key: 'WT', label: 'Wildtype', value: 'WT' }],\n\t\t\t\t\tisnot: true,\n\t\t\t\t\texcludeGeneName: true\n\t\t\t\t}\n\t\t\t}\n\t\t])\n\t\tgroupset.groups.push({\n\t\t\tname: grp1Name,\n\t\t\ttype: 'filter',\n\t\t\tfilter: grp1Filter,\n\t\t\tcolor: rgb(colorScale(grp1Name)).formatHex()\n\t\t})\n\t\t// group 2: wildtype\n\t\tconst grp2Name = `${geneName} ${dtTerm.name_noOrigin} ${dtTerm.origin ? `Wildtype (${dtTerm.origin})` : 'Wildtype'}`\n\t\tconst grp2Filter = getWrappedTvslst([\n\t\t\t{\n\t\t\t\ttype: 'tvs',\n\t\t\t\ttvs: { term: dtTerm, values: [{ key: 'WT', label: 'Wildtype', value: 'WT' }], excludeGeneName: true }\n\t\t\t}\n\t\t])\n\t\tgroupset.groups.push({\n\t\t\tname: grp2Name,\n\t\t\ttype: 'filter',\n\t\t\tfilter: grp2Filter,\n\t\t\tcolor: rgb(colorScale(grp2Name)).formatHex()\n\t\t})\n\t}\n}\n\nfunction clearGroupset(self) {\n\tself.q.type = 'values'\n\tdelete self.q.predefined_groupset_idx\n\tdelete self.q.customset\n}\n\n// function to get child dt terms\n// filterClasses is a boolean for whether to filter mutation classes\n// filtering requires a getCategories() request, which can be expensive,\n// so will use this boolean to toggle the request\nexport async function getChildTerms(term, vocabApi: VocabApi, filterClasses = true) {\n\tif (!vocabApi.termdbConfig?.queries) throw 'termdbConfig.queries is missing'\n\tconst termdbmclass = vocabApi.termdbConfig.mclass // custom mclass labels from dataset\n\t// fill child terms with dt terms present in dataset\n\tterm.childTerms = []\n\tfor (const _t of dtTerms) {\n\t\tconst t = structuredClone(_t)\n\t\tif (!Object.keys(vocabApi.termdbConfig.queries).includes(t.query)) continue // dt is not in dataset\n\t\tconst byOrigin = vocabApi.termdbConfig.assayAvailability?.byDt[t.dt]?.byOrigin\n\t\tif (byOrigin) {\n\t\t\t// dt has origins in dataset\n\t\t\tif (!t.origin) continue // dt term does not have origin, so skip\n\t\t\tif (!Object.keys(byOrigin).includes(t.origin)) throw 'unexpected origin of dt term'\n\t\t} else {\n\t\t\t// dt does not have origins in dataset\n\t\t\tif (t.origin) continue // dt term has origin, so skip\n\t\t}\n\t\t// add custom mclass labels from dataset\n\t\tfor (const k of Object.keys(t.values)) {\n\t\t\tconst v = t.values[k]\n\t\t\tif (termdbmclass && Object.keys(termdbmclass).includes(k)) v.label = termdbmclass[k].label\n\t\t}\n\t\tterm.childTerms.push(t)\n\t}\n\tif (filterClasses) {\n\t\t// filter mutation classes of dt terms for those present in data\n\t\tif (!term.childTerms?.length) throw 'term.childTerms[] is empty'\n\t\tconst filter = vocabApi.state?.termfilter?.filter\n\t\tconst filter0 = vocabApi.state?.termfilter?.filter0\n\t\tconst body: any = {}\n\t\tif (filter0) {\n\t\t\t// TODO: currently adding filter0 to body{}, but should\n\t\t\t// refactor the input of getCategories() to be a single opts{}\n\t\t\t// object, which can include .term, .filter, .filter0, and\n\t\t\t// any other properties\n\t\t\tbody.filter0 = filter0\n\t\t}\n\t\t// passing term to getCategories() will get categories across all genes in gene set\n\t\tconst categories = await vocabApi.getCategories(term, filter, body)\n\t\tfor (const t of term.childTerms) {\n\t\t\tconst data = categories.lst.find(x => x.dt == t.dt)\n\t\t\tif (!data) continue\n\t\t\tconst byOrigin = vocabApi.termdbConfig.assayAvailability?.byDt[t.dt]?.byOrigin\n\t\t\tconst classes = byOrigin ? data.classes.byOrigin[t.origin] : data.classes\n\t\t\t// filter for only those mutation classes that are in the dataset\n\t\t\tconst values = Object.fromEntries(Object.entries(t.values).filter(([k, _v]) => Object.keys(classes).includes(k)))\n\t\t\tt.values = values\n\t\t\tt.parentTerm = structuredClone(term)\n\t\t\tdelete t.parentTerm.childTerms // remove any nested child terms\n\t\t\tdelete t.parentTerm.groupsetting // remove nested term groupsetting\n\t\t}\n\t}\n}\n", "import type {\n\tGvTerm,\n\tBaseGroupSet,\n\tGvValuesQ,\n\tGvCustomGsQ,\n\tGvPredefinedGsQ,\n\tRawGvValuesTW,\n\tGvValuesTW,\n\tRawGvCustomGsTW,\n\tGvCustomGsTW,\n\tRawGvPredefinedGsTW,\n\tGvPredefinedGsTW,\n\tRawGvTW,\n\tGvTW\n} from '#types'\nimport { TwBase, type TwOpts } from './TwBase.ts'\nimport { copyMerge } from '#rx'\nimport { set_hiddenvalues } from '#termsetting'\nimport { getChildTerms, getPredefinedGroupsets } from '../termsetting/handlers/geneVariant'\n\nexport class GvBase extends TwBase {\n\t// type, isAtomic, $id are set in ancestor base classes\n\tterm: GvTerm\n\n\tconstructor(tw: GvTW, opts: TwOpts) {\n\t\tsuper(tw, opts)\n\t\tthis.term = tw.term\n\t}\n\n\t/** tw.term must already be filled-in at this point */\n\tstatic async fill(tw: RawGvTW, opts: TwOpts = {}): Promise<GvTW> {\n\t\tif (!tw.term) throw `missing tw.term, must already be filled in`\n\t\tif (tw.term.type != 'geneVariant') throw `incorrect term.type='${tw.term?.type}', expecting 'geneVariant'`\n\n\t\tif (opts.defaultQ != null) {\n\t\t\topts.defaultQ.isAtomic = true\n\t\t\t// merge defaultQ into tw.q\n\t\t\tcopyMerge(tw.q, opts.defaultQ)\n\t\t}\n\n\t\tif (!tw.term.genes?.length) {\n\t\t\t// support legacy term structure that lacks term.genes[]\n\t\t\tconst gene = structuredClone(tw.term)\n\t\t\ttw.term.genes = [gene]\n\t\t}\n\n\t\tfor (const gene of tw.term.genes) {\n\t\t\tif (!gene.kind) {\n\t\t\t\t// support saved states that don't have term.kind, applied when rehydrating at runtime\n\t\t\t\tconst term: any = gene\n\t\t\t\tif (term.gene || (term.name && !term.chr)) term.kind = 'gene'\n\t\t\t\telse if (term.chr) term.kind = 'coord'\n\t\t\t\telse throw 'unable to assign geneVariant term.kind'\n\t\t\t}\n\n\t\t\tif (gene.kind == 'gene') {\n\t\t\t\tif (!gene.gene) gene.gene = gene.name\n\t\t\t\tif (!gene.name) gene.name = gene.gene\n\t\t\t\tif (!gene.gene || !gene.name) throw 'missing gene/name'\n\t\t\t} else if (gene.kind == 'coord') {\n\t\t\t\tif (!gene.chr || !Number.isInteger(gene.start) || !Number.isInteger(gene.stop)) throw 'no position specified'\n\t\t\t\tif (!gene.name) {\n\t\t\t\t\tgene.name = `${gene.chr}:${gene.start + 1}-${gene.stop}`\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow 'cannot recognize gene.kind'\n\t\t\t}\n\n\t\t\tif (!gene.id) gene.id = gene.name\n\t\t}\n\n\t\tif (!tw.term.name) tw.term.name = tw.term.genes.map(gene => gene.name).join(', ')\n\n\t\tif (!Object.keys(tw.q).includes('type')) tw.q.type = 'values'\n\n\t\t// fill term.groupsetting\n\t\tif (!tw.term.groupsetting) tw.term.groupsetting = { disabled: false }\n\n\t\t// fill child dt terms\n\t\tif (!tw.term.childTerms) await getChildTerms(tw.term, opts.vocabApi)\n\n\t\t{\n\t\t\t// apply optional ds-level configs for this specific term\n\t\t\tconst c = opts.vocabApi.termdbConfig.queries.cnv\n\t\t\tif (c && tw.term.name) {\n\t\t\t\t//if (c) valid js code but `&& tw.term.name` required to avoid type error\n\t\t\t\t// order of overide: 1) do not override existing settings in tw.q{} 2) c.cnvCutoffsByGene[thisGene] 3) default cutoffs in c\n\t\t\t\tconst { cnvMaxLength, cnvGainCutoff, cnvLossCutoff } = c\n\t\t\t\tconst defaultCnvCutoff =\n\t\t\t\t\tcnvMaxLength || cnvGainCutoff || cnvLossCutoff ? { cnvMaxLength, cnvGainCutoff, cnvLossCutoff } : {}\n\t\t\t\tObject.assign(tw.q, defaultCnvCutoff, c.cnvCutoffsByGene?.[tw.term.name] || {}, tw.q)\n\t\t\t}\n\t\t}\n\t\t/* \n\t\t\tPre-fill the tw.type, since it's required for ROUTING to the\n\t\t\tcorrect fill() function. Tsc will be able to use tw.type as a \n\t\t\tdiscriminant property for the RawGvTW union type, enabling \n\t\t\tstatic type checks on the input raw tw.\n\n\t\t\tNOTE: tw.type is NOT required when calling a specialized fill() \n\t\t\tfunction directly, outside of TwRouter.fill(). The input tw.type\n\t\t\tdoes not have to be discriminated in that case.\n\t\t*/\n\t\ttw.type =\n\t\t\t!tw.q.type || tw.q.type == 'values'\n\t\t\t\t? 'GvValuesTW'\n\t\t\t\t: tw.q.type == 'predefined-groupset'\n\t\t\t\t? 'GvPredefinedGsTW'\n\t\t\t\t: tw.q.type == 'custom-groupset'\n\t\t\t\t? 'GvCustomGsTW'\n\t\t\t\t: tw.type\n\n\t\t/*\n\t\t\tFor each of fill() functions below:\n\t\t\t1. The `tw` argument must already have a tw.type string value, \n\t\t\t which corresponds to the RawGvTW* equivalent of the full GvTW* type \n\n\t\t\t2. The fill() function must fill-in any expected missing values,\n\t\t\t validate the tw.q shape at runtime, and throw on any error or mismatched expectation.\n\t\t\t Runtime validation is required because the input raw tw can come from anywhere,\n\t\t\t like term.bins.default, which is a runtime variable that is not possible to statically check.\n\n\t\t\t3. The filled-in tw, when returned, must be **coerced** to the full GvTW* type, \n\t\t\t in order to match the function signature's return type.\n\t\t*/\n\t\tswitch (tw.type) {\n\t\t\tcase 'GvValuesTW':\n\t\t\t\treturn await GvValues.fill(tw)\n\n\t\t\tcase 'GvPredefinedGsTW':\n\t\t\t\treturn await GvPredefinedGS.fill(tw, opts)\n\n\t\t\tcase 'GvCustomGsTW':\n\t\t\t\treturn await GvCustomGS.fill(tw)\n\n\t\t\tdefault:\n\t\t\t\tthrow `tw.type='${tw.type}' is not supported by GvBase.fill()`\n\t\t}\n\t}\n}\n\nexport class GvValues extends GvBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: GvValuesQ\n\t#tw: GvValuesTW\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: GvValuesTW, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t//this.term = tw.term // already set in base class\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\t// See the relevant comments in the GvBase.fill() function above\n\tstatic async fill(tw: RawGvValuesTW): Promise<GvValuesTW> {\n\t\tif (!tw.type) tw.type = 'GvValuesTW'\n\t\telse if (tw.type != 'GvValuesTW') throw `expecting tw.type='GvValuesTW', got '${tw.type}'`\n\t\tif (tw.term.type != 'geneVariant') throw `expecting tw.term.type='geneVariant', got '${tw.term.type}'`\n\t\tconst { term, q } = tw\n\t\tif (!q.type) q.type = 'values'\n\t\telse if (q.type != 'values') throw `expecting tw.q.type='values', got ${tw.q.type}`\n\t\tset_hiddenvalues(q, term)\n\t\treturn tw as GvValuesTW\n\t}\n}\n\nexport class GvPredefinedGS extends GvBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: GvPredefinedGsQ\n\tgroupset!: BaseGroupSet\n\t#tw: GvPredefinedGsTW\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: GvPredefinedGsTW, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t// this.term = tw.term // already set in base class\n\t\tthis.q = tw.q\n\t\tthis.#tw = tw\n\t\tObject.defineProperty(this, 'groupset', { value: this.#tw.term.groupsetting[this.#tw.q.predefined_groupset_idx] })\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\t// See the relevant comments in the GvBase.fill() function above\n\tstatic async fill(tw: RawGvPredefinedGsTW, opts: TwOpts = {}): Promise<GvPredefinedGsTW> {\n\t\tif (!tw.type) tw.type = 'GvPredefinedGsTW'\n\t\telse if (tw.type != 'GvPredefinedGsTW') throw `expecting tw.type='GvPredefinedGsTW', got '${tw.type}'`\n\n\t\tif (tw.term.type != 'geneVariant') throw `expecting tw.term.type='geneVariant', got '${tw.term.type}'`\n\t\tif (tw.q.type != 'predefined-groupset') throw `expecting tw.q.type='predefined-groupset', got '${tw.q.type}'`\n\t\tif (!tw.q.predefined_groupset_idx) tw.q.predefined_groupset_idx = 0\n\n\t\t// get predefined groupsets\n\t\tawait getPredefinedGroupsets(tw.term, opts.vocabApi)\n\n\t\tconst { term, q } = tw\n\t\tif (!term.groupsetting?.lst?.length) throw 'term.groupsetting.lst[] is empty'\n\t\tset_hiddenvalues(q, term)\n\t\treturn tw as GvPredefinedGsTW\n\t}\n\n\tgetTitleText() {\n\t\tconst gsname = this.term?.groupsetting?.lst?.[this.q.predefined_groupset_idx].name || ''\n\t\treturn `${this.term.name} ${gsname}`\n\t}\n}\n\nexport class GvCustomGS extends GvBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: GvCustomGsQ\n\tgroupset!: BaseGroupSet\n\t#tw: GvCustomGsTW\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: GvCustomGsTW, opts: TwOpts = {}) {\n\t\tsuper(tw, opts)\n\t\t// this.term = tw.term // already set in base class\n\t\tthis.q = tw.q\n\t\tObject.defineProperty(this, 'groupset', { value: this.q.customset })\n\t\tthis.#tw = tw\n\t\tthis.#opts = opts\n\t}\n\n\tgetTw() {\n\t\treturn this.#tw\n\t}\n\n\t// See the relevant comments in the GvBase.fill() function above\n\tstatic async fill(tw: RawGvCustomGsTW): Promise<GvCustomGsTW> {\n\t\tif (!tw.type) tw.type = 'GvCustomGsTW'\n\t\telse if (tw.type != 'GvCustomGsTW') throw `expecting tw.type='GvCustomGsTW', got '${tw.type}'`\n\n\t\tif (tw.term.type != 'geneVariant') throw `expecting tw.term.type='geneVariant', got '${tw.term.type}'`\n\t\tif (tw.q.type != 'custom-groupset') throw `expecting tw.q.type='custom-groupset', got '${tw.q.type}'`\n\n\t\tconst { term, q } = tw\n\t\tif (!q.customset) throw 'missing tw.q.customset'\n\t\tif (!q.customset.groups.length) throw 'customset.groups[] is empty'\n\t\tset_hiddenvalues(q, term)\n\t\treturn tw as GvCustomGsTW\n\t}\n\n\tgetTitleText() {\n\t\treturn `${this.term.name} Custom Groups`\n\t}\n}\n", "import type { TermWrapper } from '#types'\nimport type { TwOpts, TwBase } from './TwBase'\nimport { mayHydrateDictTwLst, get$id } from '#termsetting'\n// TODO: may convert these to dynamic imports\nimport { QualValues, QualPredefinedGS, QualCustomGS } from './qualitative.ts'\nimport { GvBase, GvValues, GvPredefinedGS, GvCustomGS } from './geneVariant.ts'\nimport { NumericBase, NumRegularBin, NumCustomBins, NumCont, NumSpline } from './numeric.ts'\n\nexport const routedTermTypes = new Set([\n\t'categorical',\n\t'integer',\n\t'float',\n\t'geneVariant',\n\t'geneExpression',\n\t'date',\n\t'metaboliteIntensity',\n\t'ssGSEA',\n\t'snp',\n\t'singleCellGeneExpression',\n\t'singleCellCellType'\n])\n\nexport type UseCase = {\n\ttarget: string\n\tdetail: string\n}\n\nexport type TwInitOpts = {\n\tuseCase?: UseCase\n}\n\nexport class TwRouter {\n\topts: any\n\n\tconstructor(opts) {\n\t\tthis.opts = opts\n\t}\n\n\tstatic init(tw: TermWrapper, opts: TwOpts = {}): TwBase {\n\t\tswitch (tw.type) {\n\t\t\tcase 'NumTWRegularBin':\n\t\t\t\treturn new NumRegularBin(tw, opts)\n\t\t\tcase 'NumTWCustomBin':\n\t\t\t\treturn new NumCustomBins(tw, opts)\n\t\t\tcase 'NumTWCont':\n\t\t\t\treturn new NumCont(tw, opts)\n\t\t\tcase 'NumTWSpline':\n\t\t\t\treturn new NumSpline(tw, opts)\n\n\t\t\tcase 'GvValuesTW':\n\t\t\t\treturn new GvValues(tw, opts)\n\t\t\tcase 'GvPredefinedGsTW':\n\t\t\t\treturn new GvPredefinedGS(tw, opts)\n\t\t\tcase 'GvCustomGsTW':\n\t\t\t\treturn new GvCustomGS(tw, opts)\n\n\t\t\tcase 'QualTWValues':\n\t\t\t\treturn new QualValues(tw, opts)\n\t\t\tcase 'QualTWPredefinedGS':\n\t\t\t\treturn new QualPredefinedGS(tw, opts)\n\t\t\tcase 'QualTWCustomGS':\n\t\t\t\treturn new QualCustomGS(tw, opts)\n\n\t\t\tdefault:\n\t\t\t\tthrow `unable to init(tw)`\n\t\t}\n\t}\n\n\tstatic async initRaw(rawTw /*: RawTW*/, opts: TwOpts = {}): Promise<TwBase> {\n\t\tconst tw = await TwRouter.fill(rawTw, opts)\n\t\tconst xtw = TwRouter.init(tw, opts)\n\t\tif (!xtw.$id) xtw.$id = await get$id(xtw.getMinCopy())\n\t\treturn xtw\n\t}\n\n\tstatic async fill(tw /*: RawTW*/, opts: TwOpts = {}): Promise<TermWrapper> {\n\t\tawait TwRouter.preprocess(tw, opts?.vocabApi)\n\t\tconst type = tw.term.type == 'float' || tw.term.type == 'integer' ? 'numeric' : tw.term.type\n\t\topts.defaultQ = opts.defaultQByTsHandler?.[type] || null\n\n\t\tswitch (tw.term.type) {\n\t\t\tcase 'categorical':\n\t\t\tcase 'singleCellCellType':\n\t\t\tcase 'snp': {\n\t\t\t\tconst { QualitativeBase } = await import('./qualitative')\n\t\t\t\treturn await QualitativeBase.fill(tw, opts)\n\t\t\t}\n\n\t\t\tcase 'integer':\n\t\t\tcase 'float':\n\t\t\tcase 'geneExpression':\n\t\t\tcase 'metaboliteIntensity':\n\t\t\tcase 'date':\n\t\t\tcase 'ssGSEA':\n\t\t\tcase 'singleCellGeneExpression':\n\t\t\t\treturn await NumericBase.fill(tw, opts)\n\n\t\t\t// case 'condition':\n\t\t\t// \treturn\n\n\t\t\t// case 'survival':\n\t\t\t// \treturn\n\n\t\t\tcase 'geneVariant':\n\t\t\t\treturn await GvBase.fill(tw, opts)\n\n\t\t\tdefault:\n\t\t\t\tthrow `unrecognized tw.term?.type='${tw.term?.type}'`\n\t\t}\n\t}\n\n\t// can reuse this function to generate valid preprocessed tw\n\t// for term-type specific unit tests\n\tstatic async preprocess(tw /*: RawTW*/, vocabApi?: any) {\n\t\tconst keys = Object.keys(tw)\n\t\tif (!keys.length) throw `empty tw object`\n\t\tif (tw.id && !tw.term) {\n\t\t\t// for dev work, testing, and URLs, it's convenient to only specify tw.id for a dictionary tw,\n\t\t\t// must support creating a hydrated tw.term from a minimal dict tw\n\t\t\tawait mayHydrateDictTwLst([tw], vocabApi)\n\t\t\tdelete tw.id\n\t\t}\n\n\t\tif (!tw.q) tw.q = {}\n\t\ttw.q.isAtomic = true\n\t\tTwRouter.reshapeLegacyTw(tw)\n\t}\n\n\t// check for legacy tw structure that could be\n\t// present in old saved sessions\n\tstatic reshapeLegacyTw(tw) {\n\t\t// check for legacy q.groupsetting{}\n\t\tif (Object.keys(tw.q).includes('groupsetting')) {\n\t\t\tif (!tw.q.groupsetting.inuse) {\n\t\t\t\ttw.q.type = 'values'\n\t\t\t} else if (tw.q.type == 'predefined-groupset') {\n\t\t\t\ttw.q.predefined_groupset_idx = tw.q.groupsetting.predefined_groupset_idx\n\t\t\t} else if (tw.q.type == 'custom-groupset') {\n\t\t\t\ttw.q.customset = tw.q.groupsetting.customset\n\t\t\t} else {\n\t\t\t\tthrow 'invalid q.type'\n\t\t\t}\n\t\t\tdelete tw.q['groupsetting']\n\t\t}\n\t}\n}\n", "import type { QualQ, Q, RawValuesQ, RawGvQ, TermWrapper, TwLst, NumericQ, SnpsQ, Term } from '#types'\nimport type { VocabApi } from './types'\nimport { TwRouter, routedTermTypes, type TwBase } from '#tw'\n\n/*\n********************* EXPORTED\nfillTermWrapper()\n\tcall_fillTW\n\tmayValidateQmode\nset_hiddenvalues()\n*/\n\n// append the common ID substring,\n// so that the first characters of $id is more indexable\nconst idSuffix = `_ts_${(+new Date()).toString().slice(-8)}`\nlet $id = 0\n\nexport async function get$id(minTwCopy) {\n\tif (!minTwCopy) return <string>`${$id++}${idSuffix}`\n\tdelete minTwCopy.$id\n\tconst i = window.location.pathname == '/testrun.html' || window.location.pathname == '/puppet.html' ? '' : $id++\n\t// TODO: may need to distinguish between unique tw $id and id for caching server response\n\t// for now, just append unique $id++ to ensure unique $id\n\treturn await digestMessage(JSON.stringify(minTwCopy) + i)\n}\n\nconst encoder = new TextEncoder()\n\n// may replace with hash() helper from shared/utils\nexport async function digestMessage(message) {\n\tconst msgUint8 = encoder.encode(message) // encode as (utf-8) Uint8Array\n\tconst hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8) // hash the message\n\tconst hashArray = Array.from(new Uint8Array(hashBuffer)) // convert buffer to byte array\n\tconst hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('') // convert bytes to hex string\n\treturn hexToBase64(hashHex).replace('=', '-') // shorten from 40 to 28 chars\n}\n\nfunction hexToBase64(hexStr) {\n\treturn btoa(\n\t\t[...hexStr].reduce(\n\t\t\t(acc, _, i) => (acc += !((i - 1) & 1) ? String.fromCharCode(parseInt(hexStr.substring(i - 1, i + 1), 16)) : ''),\n\t\t\t''\n\t\t)\n\t)\n}\n\nexport function getPillNameDefault(self, d: any) {\n\tif (!self.opts.abbrCutoff) return d.name\n\treturn d.name.length <= self.opts.abbrCutoff + 2\n\t\t? d.name\n\t\t: '<label title=\"' + d.name + '\">' + d.name.substring(0, self.opts.abbrCutoff) + '...' + '</label>'\n}\n\n/* For some plots that can have multiple terms of the same ID,\nbut with different q{}, we can assign and use $id to\ndisambiguate which tw data to update and associate with\na rendered element such as a pill or a matrix row\n\ntw: termWrapper = {id, term{}, q{}}\nvocabApi\ndefaultQByTsHandler{}\n\tsupply the optional default q{}\n\tvalue is { condition: {mode:'binary'}, ... }\n\twith term types as keys\n*/\n\ntype DefaultQByTsHandler = {\n\tcategorical?: QualQ\n\tnumeric?: NumericQ\n\tsnplst?: SnpsQ\n}\n\nexport async function fillTwLst(\n\ttwlst: TwLst,\n\tvocabApi: VocabApi,\n\tdefaultQByTsHandler?: DefaultQByTsHandler\n): Promise<void> {\n\tawait mayHydrateDictTwLst(twlst, vocabApi)\n\tconst promises: Promise<TermWrapper | TwBase>[] = []\n\tfor (const tw of twlst) {\n\t\tpromises.push(fillTermWrapper(tw, vocabApi, defaultQByTsHandler))\n\t}\n\tawait Promise.all(promises)\n}\n\n// fill in tw.term{} from a dehydrated state\n// a dictionary tw can be simply expressed as {id:str} and this function will fill in the term object.\n// a non-dict term will always have a term object, so this function will not be applied to non-dict term\nexport async function mayHydrateDictTwLst(twlst: TwLst, vocabApi: VocabApi) {\n\tconst ids: string[] = []\n\tfor (const tw of twlst) {\n\t\tif (tw.term) continue\n\t\tif (tw.id === undefined || tw.id === '') throw '.id is required'\n\t\tids.push(tw.id)\n\t}\n\tconst terms = ids.length ? await vocabApi.getTerms(ids) : {}\n\tfor (const id of ids) {\n\t\tif (!terms[id]) throw `missing dictionary term for id=${id}`\n\t\tfor (const tw of twlst) {\n\t\t\tif (tw.id && tw.id in terms) tw.term = terms[tw.id]\n\t\t}\n\t}\n}\n\n// add migrated tw fillers here, by term.type\n\nasync function mayUseTwRouterFill(\n\ttw: TermWrapper,\n\tvocabApi: VocabApi,\n\tdefaultQByTsHandler?: DefaultQByTsHandler\n): Promise<TermWrapper | false | TwBase> {\n\tif (!routedTermTypes.has(tw.term?.type)) return false\n\tif (tw.constructor.name != 'Object') return tw\n\tconst xtw = await TwRouter.initRaw(tw, { vocabApi, defaultQByTsHandler })\n\n\t// NOTE: while the tw refactor is not done for all term types and q.types/modes,\n\t// there will be some code duplication between TwRouter and the legacy code;\n\t// the latter will be deleted once the refactor/migration is done\n\t// fill-in the tw argument since consumer code may not be expecting a returned tw\n\tObject.assign(tw, xtw)\n\tmayValidateQmode(tw)\n\t// // this should be moved to the term-type specific handler??\n\tif (!tw.$id) tw.$id = await get$id(vocabApi.getTwMinCopy(tw))\n\tif (tw.q) tw.q.isAtomic = true\n\t// safe to return the xtw, it's compatible with either\n\t// code that expects literal tw or class instance tw\n\treturn xtw\n}\n\nexport async function fillTermWrapper(\n\ttw: TermWrapper,\n\tvocabApi: VocabApi,\n\tdefaultQByTsHandler?: DefaultQByTsHandler\n): Promise<TermWrapper | TwBase> {\n\ttw.isAtomic = true\n\tif (!tw.term && tw.id) {\n\t\t// hydrate tw.term using tw.id\n\t\tawait mayHydrateDictTwLst([tw], vocabApi)\n\t}\n\n\tconst xtw = await mayUseTwRouterFill(tw, vocabApi, defaultQByTsHandler)\n\tif (xtw) return xtw\n\n\t// tw.id is no longer needed\n\tdelete tw.id\n\tif (!tw.q) (tw.q as any) = {}\n\ttw.q.isAtomic = true\n\t// check for legacy tw structure\n\tcheckLegacyTw(tw)\n\t// call term-type specific logic to fill tw\n\tawait call_fillTW(tw, vocabApi, defaultQByTsHandler)\n\tmayValidateQmode(tw)\n\t// compute $id after tw is filled\n\tif (!tw.$id) tw.$id = await get$id(vocabApi.getTwMinCopy(tw))\n\treturn tw\n}\n\n// check for legacy tw structure that could be\n// present in old saved sessions\nfunction checkLegacyTw(tw) {\n\t// check for legacy q.groupsetting{}\n\tif (Object.keys(tw.q).includes('groupsetting')) {\n\t\tif (tw.q['groupsetting']['inuse']) {\n\t\t\tif (tw.q.type == 'predefined-groupset') {\n\t\t\t\ttw.q['predefined_groupset_idx'] = tw.q['groupsetting']['predefined_groupset_idx']\n\t\t\t} else if (tw.q.type == 'custom-groupset') {\n\t\t\t\ttw.q['customset'] = tw.q['groupsetting']['customset']\n\t\t\t} else {\n\t\t\t\tthrow 'invalid q.type'\n\t\t\t}\n\t\t} else {\n\t\t\ttw.q.type = 'values'\n\t\t}\n\t\tdelete tw.q['groupsetting']\n\t}\n}\n\nexport async function call_fillTW(tw: TermWrapper, vocabApi: VocabApi, defaultQByTsHandler?: DefaultQByTsHandler) {\n\t// repeating this logic from fillTermWrapper(), since call_fillTW() may be called directly\n\t// TODO: may deprecate call_fillTW() once all term types have been migrated to xtw\n\tif (await mayUseTwRouterFill(tw, vocabApi, defaultQByTsHandler)) return\n\n\tif (!tw.$id) tw.$id = await get$id(vocabApi.getTwMinCopy(tw))\n\tconst t = tw.term.type\n\tconst type = t == 'float' || t == 'integer' || t == 'date' ? 'numeric' : (t as string)\n\tlet _\n\tif (tw.term.type) {\n\t\ttry {\n\t\t\t_ = await import(`./handlers/${type}.ts`)\n\t\t} catch (_e) {\n\t\t\tthrow `Type ${type} does not exist`\n\t\t}\n\t} else throw `Type not defined for ${JSON.stringify(tw)}`\n\tawait _.fillTW(tw, vocabApi, defaultQByTsHandler ? defaultQByTsHandler[type] : null)\n}\n\nfunction mayValidateQmode(tw: TermWrapper) {\n\tif (!('mode' in tw.q)) {\n\t\t// at this stage q.mode is allowed to be missing and will not validate\n\t\treturn\n\t}\n\t// q.mode is set. here will validate\n\tif (typeof tw.q.mode != 'string') throw 'q.mode not string'\n\t// if (tw.q.mode == '') throw 'q.mode is empty string' //No longer required with typescript\n\t// handler code should implement term type-specific validations\n\t// e.g. to prevent cases such as mode=continuous for categorical term\n}\n\n// TODO: create and use a RawQ type that combines all raw q types\nexport function set_hiddenvalues(q: Q | RawValuesQ | RawGvQ, term: Term) {\n\tif (!q.hiddenValues) {\n\t\tq.hiddenValues = {}\n\t\t// by default, fill-in with uncomputable values\n\t\tif (term.values) {\n\t\t\tfor (const k in term.values) {\n\t\t\t\tif (term.values[k].uncomputable) q.hiddenValues[k] = 1\n\t\t\t}\n\t\t}\n\t}\n}\n", "export const balanced = (\n a: string | RegExp,\n b: string | RegExp,\n str: string,\n) => {\n const ma = a instanceof RegExp ? maybeMatch(a, str) : a\n const mb = b instanceof RegExp ? maybeMatch(b, str) : b\n\n const r = ma !== null && mb != null && range(ma, mb, str)\n\n return (\n r && {\n start: r[0],\n end: r[1],\n pre: str.slice(0, r[0]),\n body: str.slice(r[0] + ma.length, r[1]),\n post: str.slice(r[1] + mb.length),\n }\n )\n}\n\nconst maybeMatch = (reg: RegExp, str: string) => {\n const m = str.match(reg)\n return m ? m[0] : null\n}\n\nexport const range = (\n a: string,\n b: string,\n str: string,\n): undefined | [number, number] => {\n let begs: number[],\n beg: number | undefined,\n left: number,\n right: number | undefined = undefined,\n result: undefined | [number, number]\n let ai = str.indexOf(a)\n let bi = str.indexOf(b, ai + 1)\n let i = ai\n\n if (ai >= 0 && bi > 0) {\n if (a === b) {\n return [ai, bi]\n }\n begs = []\n left = str.length\n\n while (i >= 0 && !result) {\n if (i === ai) {\n begs.push(i)\n ai = str.indexOf(a, i + 1)\n } else if (begs.length === 1) {\n const r = begs.pop()\n if (r !== undefined) result = [r, bi]\n } else {\n beg = begs.pop()\n if (beg !== undefined && beg < left) {\n left = beg\n right = bi\n }\n\n bi = str.indexOf(b, i + 1)\n }\n\n i = ai < bi && ai >= 0 ? ai : bi\n }\n\n if (begs.length && right !== undefined) {\n result = [left, right]\n }\n }\n\n return result\n}\n", "import { balanced } from '@isaacs/balanced-match'\n\nconst escSlash = '\\0SLASH' + Math.random() + '\\0'\nconst escOpen = '\\0OPEN' + Math.random() + '\\0'\nconst escClose = '\\0CLOSE' + Math.random() + '\\0'\nconst escComma = '\\0COMMA' + Math.random() + '\\0'\nconst escPeriod = '\\0PERIOD' + Math.random() + '\\0'\nconst escSlashPattern = new RegExp(escSlash, 'g')\nconst escOpenPattern = new RegExp(escOpen, 'g')\nconst escClosePattern = new RegExp(escClose, 'g')\nconst escCommaPattern = new RegExp(escComma, 'g')\nconst escPeriodPattern = new RegExp(escPeriod, 'g')\nconst slashPattern = /\\\\\\\\/g\nconst openPattern = /\\\\{/g\nconst closePattern = /\\\\}/g\nconst commaPattern = /\\\\,/g\nconst periodPattern = /\\\\./g\n\nfunction numeric(str: string) {\n return !isNaN(str as any) ? parseInt(str, 10) : str.charCodeAt(0)\n}\n\nfunction escapeBraces(str: string) {\n return str\n .replace(slashPattern, escSlash)\n .replace(openPattern, escOpen)\n .replace(closePattern, escClose)\n .replace(commaPattern, escComma)\n .replace(periodPattern, escPeriod)\n}\n\nfunction unescapeBraces(str: string) {\n return str\n .replace(escSlashPattern, '\\\\')\n .replace(escOpenPattern, '{')\n .replace(escClosePattern, '}')\n .replace(escCommaPattern, ',')\n .replace(escPeriodPattern, '.')\n}\n\n/**\n * Basically just str.split(\",\"), but handling cases\n * where we have nested braced sections, which should be\n * treated as individual members, like {a,{b,c},d}\n */\nfunction parseCommaParts(str: string) {\n if (!str) {\n return ['']\n }\n\n const parts: string[] = []\n const m = balanced('{', '}', str)\n\n if (!m) {\n return str.split(',')\n }\n\n const { pre, body, post } = m\n const p = pre.split(',')\n\n p[p.length - 1] += '{' + body + '}'\n const postParts = parseCommaParts(post)\n if (post.length) {\n ;(p[p.length - 1] as string) += postParts.shift()\n p.push.apply(p, postParts)\n }\n\n parts.push.apply(parts, p)\n\n return parts\n}\n\nexport function expand(str: string) {\n if (!str) {\n return []\n }\n\n // I don't know why Bash 4.3 does this, but it does.\n // Anything starting with {} will have the first two bytes preserved\n // but *only* at the top level, so {},a}b will not expand to anything,\n // but a{},b}c will be expanded to [a}c,abc].\n // One could argue that this is a bug in Bash, but since the goal of\n // this module is to match Bash's rules, we escape a leading {}\n if (str.slice(0, 2) === '{}') {\n str = '\\\\{\\\\}' + str.slice(2)\n }\n\n return expand_(escapeBraces(str), true).map(unescapeBraces)\n}\n\nfunction embrace(str: string) {\n return '{' + str + '}'\n}\n\nfunction isPadded(el: string) {\n return /^-?0\\d/.test(el)\n}\n\nfunction lte(i: number, y: number) {\n return i <= y\n}\n\nfunction gte(i: number, y: number) {\n return i >= y\n}\n\nfunction expand_(str: string, isTop?: boolean): string[] {\n /** @type {string[]} */\n const expansions: string[] = []\n\n const m = balanced('{', '}', str)\n if (!m) return [str]\n\n // no need to expand pre, since it is guaranteed to be free of brace-sets\n const pre = m.pre\n const post: string[] = m.post.length ? expand_(m.post, false) : ['']\n\n if (/\\$$/.test(m.pre)) {\n for (let k = 0; k < post.length; k++) {\n const expansion = pre + '{' + m.body + '}' + post[k]\n expansions.push(expansion)\n }\n } else {\n const isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body)\n const isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body)\n const isSequence = isNumericSequence || isAlphaSequence\n const isOptions = m.body.indexOf(',') >= 0\n if (!isSequence && !isOptions) {\n // {a},b}\n if (m.post.match(/,(?!,).*\\}/)) {\n str = m.pre + '{' + m.body + escClose + m.post\n return expand_(str)\n }\n return [str]\n }\n\n let n: string[]\n if (isSequence) {\n n = m.body.split(/\\.\\./)\n } else {\n n = parseCommaParts(m.body)\n if (n.length === 1 && n[0] !== undefined) {\n // x{{a,b}}y ==> x{a}y x{b}y\n n = expand_(n[0], false).map(embrace)\n //XXX is this necessary? Can't seem to hit it in tests.\n /* c8 ignore start */\n if (n.length === 1) {\n return post.map(p => m.pre + n[0] + p)\n }\n /* c8 ignore stop */\n }\n }\n\n // at this point, n is the parts, and we know it's not a comma set\n // with a single entry.\n let N: string[]\n\n if (isSequence && n[0] !== undefined && n[1] !== undefined) {\n const x = numeric(n[0])\n const y = numeric(n[1])\n const width = Math.max(n[0].length, n[1].length)\n let incr =\n n.length === 3 && n[2] !== undefined ? Math.abs(numeric(n[2])) : 1\n let test = lte\n const reverse = y < x\n if (reverse) {\n incr *= -1\n test = gte\n }\n const pad = n.some(isPadded)\n\n N = []\n\n for (let i = x; test(i, y); i += incr) {\n let c\n if (isAlphaSequence) {\n c = String.fromCharCode(i)\n if (c === '\\\\') {\n c = ''\n }\n } else {\n c = String(i)\n if (pad) {\n const need = width - c.length\n if (need > 0) {\n const z = new Array(need + 1).join('0')\n if (i < 0) {\n c = '-' + z + c.slice(1)\n } else {\n c = z + c\n }\n }\n }\n }\n N.push(c)\n }\n } else {\n N = []\n\n for (let j = 0; j < n.length; j++) {\n N.push.apply(N, expand_(n[j] as string, false))\n }\n }\n\n for (let j = 0; j < N.length; j++) {\n for (let k = 0; k < post.length; k++) {\n const expansion = pre + N[j] + post[k]\n if (!isTop || isSequence || expansion) {\n expansions.push(expansion)\n }\n }\n }\n }\n\n return expansions\n}\n", "const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n pattern: any\n): asserts pattern is string => {\n if (typeof pattern !== 'string') {\n throw new TypeError('invalid pattern')\n }\n\n if (pattern.length > MAX_PATTERN_LENGTH) {\n throw new TypeError('pattern is too long')\n }\n}\n", "// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { <posix class>: [<translation>, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n '[:cntrl:]': ['\\\\p{Cc}', true],\n '[:digit:]': ['\\\\p{Nd}', true],\n '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n '[:lower:]': ['\\\\p{Ll}', true],\n '[:print:]': ['\\\\p{C}', true],\n '[:punct:]': ['\\\\p{P}', true],\n '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n '[:upper:]': ['\\\\p{Lu}', true],\n '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n src: string,\n uFlag: boolean,\n consumed: number,\n hasMagic: boolean\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n glob: string,\n position: number\n): ParseClassResult => {\n const pos = position\n /* c8 ignore start */\n if (glob.charAt(pos) !== '[') {\n throw new Error('not in a brace expression')\n }\n /* c8 ignore stop */\n const ranges: string[] = []\n const negs: string[] = []\n\n let i = pos + 1\n let sawStart = false\n let uflag = false\n let escaping = false\n let negate = false\n let endPos = pos\n let rangeStart = ''\n WHILE: while (i < glob.length) {\n const c = glob.charAt(i)\n if ((c === '!' || c === '^') && i === pos + 1) {\n negate = true\n i++\n continue\n }\n\n if (c === ']' && sawStart && !escaping) {\n endPos = i + 1\n break\n }\n\n sawStart = true\n if (c === '\\\\') {\n if (!escaping) {\n escaping = true\n i++\n continue\n }\n // escaped \\ char, fall through and treat like normal char\n }\n if (c === '[' && !escaping) {\n // either a posix class, a collation equivalent, or just a [\n for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n if (glob.startsWith(cls, i)) {\n // invalid, [a-[] is fine, but not [a-[:alpha]]\n if (rangeStart) {\n return ['$.', false, glob.length - pos, true]\n }\n i += cls.length\n if (neg) negs.push(unip)\n else ranges.push(unip)\n uflag = uflag || u\n continue WHILE\n }\n }\n }\n\n // now it's just a normal character, effectively\n escaping = false\n if (rangeStart) {\n // throw this range away if it's not valid, but others\n // can still match.\n if (c > rangeStart) {\n ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n } else if (c === rangeStart) {\n ranges.push(braceEscape(c))\n }\n rangeStart = ''\n i++\n continue\n }\n\n // now might be the start of a range.\n // can be either c-d or c-] or c<more...>] or c] at this point\n if (glob.startsWith('-]', i + 1)) {\n ranges.push(braceEscape(c + '-'))\n i += 2\n continue\n }\n if (glob.startsWith('-', i + 1)) {\n rangeStart = c\n i += 2\n continue\n }\n\n // not the start of a range, just a single character\n ranges.push(braceEscape(c))\n i++\n }\n\n if (endPos < i) {\n // didn't see the end of the class, not a valid class,\n // but might still be valid as a literal match.\n return ['', false, 0, false]\n }\n\n // if we got no ranges and no negates, then we have a range that\n // cannot possibly match anything, and that poisons the whole glob\n if (!ranges.length && !negs.length) {\n return ['$.', false, glob.length - pos, true]\n }\n\n // if we got one positive range, and it's a single character, then that's\n // not actually a magic pattern, it's just that one literal character.\n // we should not treat that as \"magic\", we should just return the literal\n // character. [_] is a perfectly valid way to escape glob magic chars.\n if (\n negs.length === 0 &&\n ranges.length === 1 &&\n /^\\\\?.$/.test(ranges[0]) &&\n !negate\n ) {\n const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n return [regexpEscape(r), false, endPos - pos, false]\n }\n\n const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n const comb =\n ranges.length && negs.length\n ? '(' + sranges + '|' + snegs + ')'\n : ranges.length\n ? sranges\n : snegs\n\n return [comb, uflag, endPos - pos, true]\n}\n", "import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes. For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n return windowsPathsNoEscape\n ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n", "// parse a single path portion\n\nimport { parseClass } from './brace-expressions.js'\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n// 1 2 3 4 5 6 1 2 3 46 5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n// v----- .* because there's more following,\n// v v otherwise, .+ because it must be\n// v v *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n// copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set<ExtglobType>(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!(?:^|/)\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n type: ExtglobType | null\n readonly #root: AST\n\n #hasMagic?: boolean\n #uflag: boolean = false\n #parts: (string | AST)[] = []\n readonly #parent?: AST\n readonly #parentIndex: number\n #negs: AST[]\n #filledNegs: boolean = false\n #options: MinimatchOptions\n #toString?: string\n // set to true if it's an extglob with no children\n // (which really means one child of '')\n #emptyExt: boolean = false\n\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {}\n ) {\n this.type = type\n // extglobs are inherently magical\n if (type) this.#hasMagic = true\n this.#parent = parent\n this.#root = this.#parent ? this.#parent.#root : this\n this.#options = this.#root === this ? options : this.#root.#options\n this.#negs = this.#root === this ? [] : this.#root.#negs\n if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n }\n\n get hasMagic(): boolean | undefined {\n /* c8 ignore start */\n if (this.#hasMagic !== undefined) return this.#hasMagic\n /* c8 ignore stop */\n for (const p of this.#parts) {\n if (typeof p === 'string') continue\n if (p.type || p.hasMagic) return (this.#hasMagic = true)\n }\n // note: will be undefined until we generate the regexp src and find out\n return this.#hasMagic\n }\n\n // reconstructs the pattern\n toString(): string {\n if (this.#toString !== undefined) return this.#toString\n if (!this.type) {\n return (this.#toString = this.#parts.map(p => String(p)).join(''))\n } else {\n return (this.#toString =\n this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n }\n }\n\n #fillNegs() {\n /* c8 ignore start */\n if (this !== this.#root) throw new Error('should only call on root')\n if (this.#filledNegs) return this\n /* c8 ignore stop */\n\n // call toString() once to fill this out\n this.toString()\n this.#filledNegs = true\n let n: AST | undefined\n while ((n = this.#negs.pop())) {\n if (n.type !== '!') continue\n // walk up the tree, appending everthing that comes AFTER parentIndex\n let p: AST | undefined = n\n let pp = p.#parent\n while (pp) {\n for (\n let i = p.#parentIndex + 1;\n !pp.type && i < pp.#parts.length;\n i++\n ) {\n for (const part of n.#parts) {\n /* c8 ignore start */\n if (typeof part === 'string') {\n throw new Error('string part in extglob AST??')\n }\n /* c8 ignore stop */\n part.copyIn(pp.#parts[i])\n }\n }\n p = pp\n pp = p.#parent\n }\n }\n return this\n }\n\n push(...parts: (string | AST)[]) {\n for (const p of parts) {\n if (p === '') continue\n /* c8 ignore start */\n if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n throw new Error('invalid part: ' + p)\n }\n /* c8 ignore stop */\n this.#parts.push(p)\n }\n }\n\n toJSON() {\n const ret: any[] =\n this.type === null\n ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n if (this.isStart() && !this.type) ret.unshift([])\n if (\n this.isEnd() &&\n (this === this.#root ||\n (this.#root.#filledNegs && this.#parent?.type === '!'))\n ) {\n ret.push({})\n }\n return ret\n }\n\n isStart(): boolean {\n if (this.#root === this) return true\n // if (this.type) return !!this.#parent?.isStart()\n if (!this.#parent?.isStart()) return false\n if (this.#parentIndex === 0) return true\n // if everything AHEAD of this is a negation, then it's still the \"start\"\n const p = this.#parent\n for (let i = 0; i < this.#parentIndex; i++) {\n const pp = p.#parts[i]\n if (!(pp instanceof AST && pp.type === '!')) {\n return false\n }\n }\n return true\n }\n\n isEnd(): boolean {\n if (this.#root === this) return true\n if (this.#parent?.type === '!') return true\n if (!this.#parent?.isEnd()) return false\n if (!this.type) return this.#parent?.isEnd()\n // if not root, it'll always have a parent\n /* c8 ignore start */\n const pl = this.#parent ? this.#parent.#parts.length : 0\n /* c8 ignore stop */\n return this.#parentIndex === pl - 1\n }\n\n copyIn(part: AST | string) {\n if (typeof part === 'string') this.push(part)\n else this.push(part.clone(this))\n }\n\n clone(parent: AST) {\n const c = new AST(this.type, parent)\n for (const p of this.#parts) {\n c.copyIn(p)\n }\n return c\n }\n\n static #parseAST(\n str: string,\n ast: AST,\n pos: number,\n opt: MinimatchOptions\n ): number {\n let escaping = false\n let inBrace = false\n let braceStart = -1\n let braceNeg = false\n if (ast.type === null) {\n // outside of a extglob, append until we find a start\n let i = pos\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n ast.push(acc)\n acc = ''\n const ext = new AST(c, ast)\n i = AST.#parseAST(str, ext, i, opt)\n ast.push(ext)\n continue\n }\n acc += c\n }\n ast.push(acc)\n return i\n }\n\n // some kind of extglob, pos is at the (\n // find the next | or )\n let i = pos + 1\n let part = new AST(null, ast)\n const parts: AST[] = []\n let acc = ''\n while (i < str.length) {\n const c = str.charAt(i++)\n // still accumulate escapes at this point, but we do ignore\n // starts that are escaped\n if (escaping || c === '\\\\') {\n escaping = !escaping\n acc += c\n continue\n }\n\n if (inBrace) {\n if (i === braceStart + 1) {\n if (c === '^' || c === '!') {\n braceNeg = true\n }\n } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n inBrace = false\n }\n acc += c\n continue\n } else if (c === '[') {\n inBrace = true\n braceStart = i\n braceNeg = false\n acc += c\n continue\n }\n\n if (isExtglobType(c) && str.charAt(i) === '(') {\n part.push(acc)\n acc = ''\n const ext = new AST(c, part)\n part.push(ext)\n i = AST.#parseAST(str, ext, i, opt)\n continue\n }\n if (c === '|') {\n part.push(acc)\n acc = ''\n parts.push(part)\n part = new AST(null, ast)\n continue\n }\n if (c === ')') {\n if (acc === '' && ast.#parts.length === 0) {\n ast.#emptyExt = true\n }\n part.push(acc)\n acc = ''\n ast.push(...parts, part)\n return i\n }\n acc += c\n }\n\n // unfinished extglob\n // if we got here, it was a malformed extglob! not an extglob, but\n // maybe something else in there.\n ast.type = null\n ast.#hasMagic = undefined\n ast.#parts = [str.substring(pos - 1)]\n return i\n }\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n const ast = new AST(null, undefined, options)\n AST.#parseAST(pattern, ast, 0, options)\n return ast\n }\n\n // returns the regular expression if there's magic, or the unescaped\n // string if not.\n toMMPattern(): MMRegExp | string {\n // should only be called on root\n /* c8 ignore start */\n if (this !== this.#root) return this.#root.toMMPattern()\n /* c8 ignore stop */\n const glob = this.toString()\n const [re, body, hasMagic, uflag] = this.toRegExpSource()\n // if we're in nocase mode, and not nocaseMagicOnly, then we do\n // still need a regular expression if we have to case-insensitively\n // match capital/lowercase characters.\n const anyMagic =\n hasMagic ||\n this.#hasMagic ||\n (this.#options.nocase &&\n !this.#options.nocaseMagicOnly &&\n glob.toUpperCase() !== glob.toLowerCase())\n if (!anyMagic) {\n return body\n }\n\n const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n return Object.assign(new RegExp(`^${re}$`, flags), {\n _src: re,\n _glob: glob,\n })\n }\n\n get options() {\n return this.#options\n }\n\n // returns the string match, the regexp source, whether there's magic\n // in the regexp (so a regular expression is required) and whether or\n // not the uflag is needed for the regular expression (for posix classes)\n // TODO: instead of injecting the start/end at this point, just return\n // the BODY of the regexp, along with the start/end portions suitable\n // for binding the start/end in either a joined full-path makeRe context\n // (where we bind to (^|/), or a standalone matchPart context (where\n // we bind to ^, and not /). Otherwise slashes get duped!\n //\n // In part-matching mode, the start is:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n // - if dots allowed or not possible: ^\n // - if dots possible and not allowed: ^(?!\\.)\n // end is:\n // - if not isEnd(): nothing\n // - else: $\n //\n // In full-path matching mode, we put the slash at the START of the\n // pattern, so start is:\n // - if first pattern: same as part-matching mode\n // - if not isStart(): nothing\n // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n // - if dots allowed or not possible: /\n // - if dots possible and not allowed: /(?!\\.)\n // end is:\n // - if last pattern, same as part-matching mode\n // - else nothing\n //\n // Always put the (?:$|/) on negated tails, though, because that has to be\n // there to bind the end of the negated pattern portion, and it's easier to\n // just stick it in now rather than try to inject it later in the middle of\n // the pattern.\n //\n // We can just always return the same end, and leave it up to the caller\n // to know whether it's going to be used joined or in parts.\n // And, if the start is adjusted slightly, can do the same there:\n // - if not isStart: nothing\n // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n // - if dots allowed or not possible: (?:/|^)\n // - if dots possible and not allowed: (?:/|^)(?!\\.)\n //\n // But it's better to have a simpler binding without a conditional, for\n // performance, so probably better to return both start options.\n //\n // Then the caller just ignores the end if it's not the first pattern,\n // and the start always gets applied.\n //\n // But that's always going to be $ if it's the ending pattern, or nothing,\n // so the caller can just attach $ at the end of the pattern when building.\n //\n // So the todo is:\n // - better detect what kind of start is needed\n // - return both flavors of starting pattern\n // - attach $ at the end of the pattern when creating the actual RegExp\n //\n // Ah, but wait, no, that all only applies to the root when the first pattern\n // is not an extglob. If the first pattern IS an extglob, then we need all\n // that dot prevention biz to live in the extglob portions, because eg\n // +(*|.x*) can match .xy but not .yx.\n //\n // So, return the two flavors if it's #root and the first child is not an\n // AST, otherwise leave it to the child AST to handle it, and there,\n // use the (?:^|/) style of start binding.\n //\n // Even simplified further:\n // - Since the start for a join is eg /(?!\\.) and the start for a part\n // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n // or start or whatever) and prepend ^ or / at the Regexp construction.\n toRegExpSource(\n allowDot?: boolean\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n const dot = allowDot ?? !!this.#options.dot\n if (this.#root === this) this.#fillNegs()\n if (!this.type) {\n const noEmpty = this.isStart() && this.isEnd()\n const src = this.#parts\n .map(p => {\n const [re, _, hasMagic, uflag] =\n typeof p === 'string'\n ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n : p.toRegExpSource(allowDot)\n this.#hasMagic = this.#hasMagic || hasMagic\n this.#uflag = this.#uflag || uflag\n return re\n })\n .join('')\n\n let start = ''\n if (this.isStart()) {\n if (typeof this.#parts[0] === 'string') {\n // this is the string that will match the start of the pattern,\n // so we need to protect against dots and such.\n\n // '.' and '..' cannot match unless the pattern is that exactly,\n // even if it starts with . or dot:true is set.\n const dotTravAllowed =\n this.#parts.length === 1 && justDots.has(this.#parts[0])\n if (!dotTravAllowed) {\n const aps = addPatternStart\n // check if we have a possibility of matching . or ..,\n // and prevent that.\n const needNoTrav =\n // dots are allowed, and the pattern starts with [ or .\n (dot && aps.has(src.charAt(0))) ||\n // the pattern starts with \\., and then [ or .\n (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n // the pattern starts with \\.\\., and then [ or .\n (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n // no need to prevent dots if it can't match a dot, or if a\n // sub-pattern will be preventing it anyway.\n const needNoDot = !dot && !allowDot && aps.has(src.charAt(0))\n\n start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n }\n }\n }\n\n // append the \"end of path portion\" pattern to negation tails\n let end = ''\n if (\n this.isEnd() &&\n this.#root.#filledNegs &&\n this.#parent?.type === '!'\n ) {\n end = '(?:$|\\\\/)'\n }\n const final = start + src + end\n return [\n final,\n unescape(src),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n // We need to calculate the body *twice* if it's a repeat pattern\n // at the start, once in nodot mode, then again in dot mode, so a\n // pattern like *(?) can match 'x.y'\n\n const repeated = this.type === '*' || this.type === '+'\n // some kind of extglob\n const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n let body = this.#partsToRegExp(dot)\n\n if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n // invalid extglob, has to at least be *something* present, if it's\n // the entire path portion.\n const s = this.toString()\n this.#parts = [s]\n this.type = null\n this.#hasMagic = undefined\n return [s, unescape(this.toString()), false, false]\n }\n\n // XXX abstract out this map method\n let bodyDotAllowed =\n !repeated || allowDot || dot || !startNoDot\n ? ''\n : this.#partsToRegExp(true)\n if (bodyDotAllowed === body) {\n bodyDotAllowed = ''\n }\n if (bodyDotAllowed) {\n body = `(?:${body})(?:${bodyDotAllowed})*?`\n }\n\n // an empty !() is exactly equivalent to a starNoEmpty\n let final = ''\n if (this.type === '!' && this.#emptyExt) {\n final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty\n } else {\n const close =\n this.type === '!'\n ? // !() must match something,but !(x) can match ''\n '))' +\n (this.isStart() && !dot && !allowDot ? startNoDot : '') +\n star +\n ')'\n : this.type === '@'\n ? ')'\n : this.type === '?'\n ? ')?'\n : this.type === '+' && bodyDotAllowed\n ? ')'\n : this.type === '*' && bodyDotAllowed\n ? `)?`\n : `)${this.type}`\n final = start + body + close\n }\n return [\n final,\n unescape(body),\n (this.#hasMagic = !!this.#hasMagic),\n this.#uflag,\n ]\n }\n\n #partsToRegExp(dot: boolean) {\n return this.#parts\n .map(p => {\n // extglob ASTs should only contain parent ASTs\n /* c8 ignore start */\n if (typeof p === 'string') {\n throw new Error('string type in extglob ast??')\n }\n /* c8 ignore stop */\n // can ignore hasMagic, because extglobs are already always magic\n const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot)\n this.#uflag = this.#uflag || uflag\n return re\n })\n .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n .join('|')\n }\n\n static #parseGlob(\n glob: string,\n hasMagic: boolean | undefined,\n noEmpty: boolean = false\n ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n let escaping = false\n let re = ''\n let uflag = false\n for (let i = 0; i < glob.length; i++) {\n const c = glob.charAt(i)\n if (escaping) {\n escaping = false\n re += (reSpecials.has(c) ? '\\\\' : '') + c\n continue\n }\n if (c === '\\\\') {\n if (i === glob.length - 1) {\n re += '\\\\\\\\'\n } else {\n escaping = true\n }\n continue\n }\n if (c === '[') {\n const [src, needUflag, consumed, magic] = parseClass(glob, i)\n if (consumed) {\n re += src\n uflag = uflag || needUflag\n i += consumed - 1\n hasMagic = hasMagic || magic\n continue\n }\n }\n if (c === '*') {\n if (noEmpty && glob === '*') re += starNoEmpty\n else re += star\n hasMagic = true\n continue\n }\n if (c === '?') {\n re += qmark\n hasMagic = true\n continue\n }\n re += regExpEscape(c)\n }\n return [re, unescape(glob), !!hasMagic, uflag]\n }\n}\n", "import { MinimatchOptions } from './index.js'\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character. In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n */\nexport const escape = (\n s: string,\n {\n windowsPathsNoEscape = false,\n }: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n) => {\n // don't need to escape +@! because we escape the parens\n // that make those magic, and escaping ! as [!] isn't valid,\n // because [!]] is a valid glob class meaning not ']'.\n return windowsPathsNoEscape\n ? s.replace(/[?*()[\\]]/g, '[$&]')\n : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n", "import { expand } from '@isaacs/brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n | 'aix'\n | 'android'\n | 'darwin'\n | 'freebsd'\n | 'haiku'\n | 'linux'\n | 'openbsd'\n | 'sunos'\n | 'win32'\n | 'cygwin'\n | 'netbsd'\n\nexport interface MinimatchOptions {\n nobrace?: boolean\n nocomment?: boolean\n nonegate?: boolean\n debug?: boolean\n noglobstar?: boolean\n noext?: boolean\n nonull?: boolean\n windowsPathsNoEscape?: boolean\n allowWindowsEscape?: boolean\n partial?: boolean\n dot?: boolean\n nocase?: boolean\n nocaseMagicOnly?: boolean\n magicalBraces?: boolean\n matchBase?: boolean\n flipNegate?: boolean\n preserveMultipleSlashes?: boolean\n optimizationLevel?: number\n platform?: Platform\n windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n p: string,\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n assertValidPattern(pattern)\n\n // shortcut: comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n return false\n }\n\n return new Minimatch(pattern, options).match(p)\n}\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n ext = ext.toLowerCase()\n return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n if (!ext) return noext\n ext = ext.toLowerCase()\n return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExtDot([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n const noext = qmarksTestNoExt([$0])\n return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n const len = $0.length\n return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n typeof process === 'object' && process\n ? (typeof process.env === 'object' &&\n process.env &&\n process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n process.platform\n : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n win32: { sep: '\\\\' },\n posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed. Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n (pattern: string, options: MinimatchOptions = {}) =>\n (p: string) =>\n minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n return minimatch\n }\n\n const orig = minimatch\n\n const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n orig(p, pattern, ext(def, options))\n\n return Object.assign(m, {\n Minimatch: class Minimatch extends orig.Minimatch {\n constructor(pattern: string, options: MinimatchOptions = {}) {\n super(pattern, ext(def, options))\n }\n static defaults(options: MinimatchOptions) {\n return orig.defaults(ext(def, options)).Minimatch\n }\n },\n\n AST: class AST extends orig.AST {\n /* c8 ignore start */\n constructor(\n type: ExtglobType | null,\n parent?: AST,\n options: MinimatchOptions = {}\n ) {\n super(type, parent, ext(def, options))\n }\n /* c8 ignore stop */\n\n static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n return orig.AST.fromGlob(pattern, ext(def, options))\n }\n },\n\n unescape: (\n s: string,\n options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n ) => orig.unescape(s, ext(def, options)),\n\n escape: (\n s: string,\n options: Pick<MinimatchOptions, 'windowsPathsNoEscape'> = {}\n ) => orig.escape(s, ext(def, options)),\n\n filter: (pattern: string, options: MinimatchOptions = {}) =>\n orig.filter(pattern, ext(def, options)),\n\n defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n orig.makeRe(pattern, ext(def, options)),\n\n braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n orig.braceExpand(pattern, ext(def, options)),\n\n match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n orig.match(list, pattern, ext(def, options)),\n\n sep: orig.sep,\n GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n assertValidPattern(pattern)\n\n // Thanks to Yeting Li <https://github.com/yetingli> for\n // improving this regexp to avoid a ReDOS vulnerability.\n if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n // shortcut. no need to expand.\n return [pattern]\n }\n\n return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion. Otherwise, any series\n// of * is equivalent to a single *. Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n list: string[],\n pattern: string,\n options: MinimatchOptions = {}\n) => {\n const mm = new Minimatch(pattern, options)\n list = list.filter(f => mm.match(f))\n if (mm.options.nonull && !list.length) {\n list.push(pattern)\n }\n return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n _src?: string\n _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n options: MinimatchOptions\n set: ParseReturnFiltered[][]\n pattern: string\n\n windowsPathsNoEscape: boolean\n nonegate: boolean\n negate: boolean\n comment: boolean\n empty: boolean\n preserveMultipleSlashes: boolean\n partial: boolean\n globSet: string[]\n globParts: string[][]\n nocase: boolean\n\n isWindows: boolean\n platform: Platform\n windowsNoMagicRoot: boolean\n\n regexp: false | null | MMRegExp\n constructor(pattern: string, options: MinimatchOptions = {}) {\n assertValidPattern(pattern)\n\n options = options || {}\n this.options = options\n this.pattern = pattern\n this.platform = options.platform || defaultPlatform\n this.isWindows = this.platform === 'win32'\n this.windowsPathsNoEscape =\n !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n if (this.windowsPathsNoEscape) {\n this.pattern = this.pattern.replace(/\\\\/g, '/')\n }\n this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n this.regexp = null\n this.negate = false\n this.nonegate = !!options.nonegate\n this.comment = false\n this.empty = false\n this.partial = !!options.partial\n this.nocase = !!this.options.nocase\n this.windowsNoMagicRoot =\n options.windowsNoMagicRoot !== undefined\n ? options.windowsNoMagicRoot\n : !!(this.isWindows && this.nocase)\n\n this.globSet = []\n this.globParts = []\n this.set = []\n\n // make the set of regexps etc.\n this.make()\n }\n\n hasMagic(): boolean {\n if (this.options.magicalBraces && this.set.length > 1) {\n return true\n }\n for (const pattern of this.set) {\n for (const part of pattern) {\n if (typeof part !== 'string') return true\n }\n }\n return false\n }\n\n debug(..._: any[]) {}\n\n make() {\n const pattern = this.pattern\n const options = this.options\n\n // empty patterns and comments match nothing.\n if (!options.nocomment && pattern.charAt(0) === '#') {\n this.comment = true\n return\n }\n\n if (!pattern) {\n this.empty = true\n return\n }\n\n // step 1: figure out negation, etc.\n this.parseNegate()\n\n // step 2: expand braces\n this.globSet = [...new Set(this.braceExpand())]\n\n if (options.debug) {\n this.debug = (...args: any[]) => console.error(...args)\n }\n\n this.debug(this.pattern, this.globSet)\n\n // step 3: now we have a set, so turn each one into a series of\n // path-portion matching patterns.\n // These will be regexps, except in the case of \"**\", which is\n // set to the GLOBSTAR object for globstar behavior,\n // and will not contain any / characters\n //\n // First, we preprocess to make the glob pattern sets a bit simpler\n // and deduped. There are some perf-killing patterns that can cause\n // problems with a glob walk, but we can simplify them down a bit.\n const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n this.globParts = this.preprocess(rawGlobParts)\n this.debug(this.pattern, this.globParts)\n\n // glob --> regexps\n let set = this.globParts.map((s, _, __) => {\n if (this.isWindows && this.windowsNoMagicRoot) {\n // check if it's a drive or unc path.\n const isUNC =\n s[0] === '' &&\n s[1] === '' &&\n (s[2] === '?' || !globMagic.test(s[2])) &&\n !globMagic.test(s[3])\n const isDrive = /^[a-z]:/i.test(s[0])\n if (isUNC) {\n return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n } else if (isDrive) {\n return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n }\n }\n return s.map(ss => this.parse(ss))\n })\n\n this.debug(this.pattern, set)\n\n // filter out everything that didn't compile properly.\n this.set = set.filter(\n s => s.indexOf(false) === -1\n ) as ParseReturnFiltered[][]\n\n // do not treat the ? in UNC paths as magic\n if (this.isWindows) {\n for (let i = 0; i < this.set.length; i++) {\n const p = this.set[i]\n if (\n p[0] === '' &&\n p[1] === '' &&\n this.globParts[i][2] === '?' &&\n typeof p[3] === 'string' &&\n /^[a-z]:$/i.test(p[3])\n ) {\n p[2] = '?'\n }\n }\n }\n\n this.debug(this.pattern, this.set)\n }\n\n // various transforms to equivalent pattern sets that are\n // faster to process in a filesystem walk. The goal is to\n // eliminate what we can, and push all ** patterns as far\n // to the right as possible, even if it increases the number\n // of patterns that we have to process.\n preprocess(globParts: string[][]) {\n // if we're not in globstar mode, then turn all ** into *\n if (this.options.noglobstar) {\n for (let i = 0; i < globParts.length; i++) {\n for (let j = 0; j < globParts[i].length; j++) {\n if (globParts[i][j] === '**') {\n globParts[i][j] = '*'\n }\n }\n }\n }\n\n const { optimizationLevel = 1 } = this.options\n\n if (optimizationLevel >= 2) {\n // aggressive optimization for the purpose of fs walking\n globParts = this.firstPhasePreProcess(globParts)\n globParts = this.secondPhasePreProcess(globParts)\n } else if (optimizationLevel >= 1) {\n // just basic optimizations to remove some .. parts\n globParts = this.levelOneOptimize(globParts)\n } else {\n // just collapse multiple ** portions into one\n globParts = this.adjascentGlobstarOptimize(globParts)\n }\n\n return globParts\n }\n\n // just get rid of adjascent ** portions\n adjascentGlobstarOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let i = gs\n while (parts[i + 1] === '**') {\n i++\n }\n if (i !== gs) {\n parts.splice(gs, i - gs)\n }\n }\n return parts\n })\n }\n\n // get rid of adjascent ** and resolve .. portions\n levelOneOptimize(globParts: string[][]) {\n return globParts.map(parts => {\n parts = parts.reduce((set: string[], part) => {\n const prev = set[set.length - 1]\n if (part === '**' && prev === '**') {\n return set\n }\n if (part === '..') {\n if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n set.pop()\n return set\n }\n }\n set.push(part)\n return set\n }, [])\n return parts.length === 0 ? [''] : parts\n })\n }\n\n levelTwoFileOptimize(parts: string | string[]) {\n if (!Array.isArray(parts)) {\n parts = this.slashSplit(parts)\n }\n let didSomething: boolean = false\n do {\n didSomething = false\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n parts.splice(dd - 1, 2)\n dd -= 2\n }\n }\n } while (didSomething)\n return parts.length === 0 ? [''] : parts\n }\n\n // First phase: single-pattern processing\n // <pre> is 1 or more portions\n // <rest> is 1 or more portions\n // <p> is any portion other than ., .., '', or **\n // <e> is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n // <pre>/<e>/<rest> -> <pre>/<rest>\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n // **/**/<rest> -> **/<rest>\n //\n // **/*/<rest> -> */**/<rest> <== not valid because ** doesn't follow\n // this WOULD be allowed if ** did follow symlinks, or * didn't\n firstPhasePreProcess(globParts: string[][]) {\n let didSomething = false\n do {\n didSomething = false\n // <pre>/**/../<p>/<p>/<rest> -> {<pre>/../<p>/<p>/<rest>,<pre>/**/<p>/<p>/<rest>}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n // <pre>/**/**/<rest> -> <pre>/**/<rest>\n gss++\n }\n // eg, if gs is 2 and gss is 4, that means we have 3 **\n // parts, and can remove 2 of them.\n if (gss > gs) {\n parts.splice(gs + 1, gss - gs)\n }\n\n let next = parts[gs + 1]\n const p = parts[gs + 2]\n const p2 = parts[gs + 3]\n if (next !== '..') continue\n if (\n !p ||\n p === '.' ||\n p === '..' ||\n !p2 ||\n p2 === '.' ||\n p2 === '..'\n ) {\n continue\n }\n didSomething = true\n // edit parts in place, and push the new one\n parts.splice(gs, 1)\n const other = parts.slice(0)\n other[gs] = '**'\n globParts.push(other)\n gs--\n }\n\n // <pre>/<e>/<rest> -> <pre>/<rest>\n if (!this.preserveMultipleSlashes) {\n for (let i = 1; i < parts.length - 1; i++) {\n const p = parts[i]\n // don't squeeze out UNC patterns\n if (i === 1 && p === '' && parts[0] === '') continue\n if (p === '.' || p === '') {\n didSomething = true\n parts.splice(i, 1)\n i--\n }\n }\n if (\n parts[0] === '.' &&\n parts.length === 2 &&\n (parts[1] === '.' || parts[1] === '')\n ) {\n didSomething = true\n parts.pop()\n }\n }\n\n // <pre>/<p>/../<rest> -> <pre>/<rest>\n let dd: number = 0\n while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n const p = parts[dd - 1]\n if (p && p !== '.' && p !== '..' && p !== '**') {\n didSomething = true\n const needDot = dd === 1 && parts[dd + 1] === '**'\n const splin = needDot ? ['.'] : []\n parts.splice(dd - 1, 2, ...splin)\n if (parts.length === 0) parts.push('')\n dd -= 2\n }\n }\n }\n } while (didSomething)\n\n return globParts\n }\n\n // second phase: multi-pattern dedupes\n // {<pre>/*/<rest>,<pre>/<p>/<rest>} -> <pre>/*/<rest>\n // {<pre>/<rest>,<pre>/<rest>} -> <pre>/<rest>\n // {<pre>/**/<rest>,<pre>/<rest>} -> <pre>/**/<rest>\n //\n // {<pre>/**/<rest>,<pre>/**/<p>/<rest>} -> <pre>/**/<rest>\n // ^-- not valid because ** doens't follow symlinks\n secondPhasePreProcess(globParts: string[][]): string[][] {\n for (let i = 0; i < globParts.length - 1; i++) {\n for (let j = i + 1; j < globParts.length; j++) {\n const matched = this.partsMatch(\n globParts[i],\n globParts[j],\n !this.preserveMultipleSlashes\n )\n if (matched) {\n globParts[i] = []\n globParts[j] = matched\n break\n }\n }\n }\n return globParts.filter(gs => gs.length)\n }\n\n partsMatch(\n a: string[],\n b: string[],\n emptyGSMatch: boolean = false\n ): false | string[] {\n let ai = 0\n let bi = 0\n let result: string[] = []\n let which: string = ''\n while (ai < a.length && bi < b.length) {\n if (a[ai] === b[bi]) {\n result.push(which === 'b' ? b[bi] : a[ai])\n ai++\n bi++\n } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n result.push(a[ai])\n ai++\n } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n result.push(b[bi])\n bi++\n } else if (\n a[ai] === '*' &&\n b[bi] &&\n (this.options.dot || !b[bi].startsWith('.')) &&\n b[bi] !== '**'\n ) {\n if (which === 'b') return false\n which = 'a'\n result.push(a[ai])\n ai++\n bi++\n } else if (\n b[bi] === '*' &&\n a[ai] &&\n (this.options.dot || !a[ai].startsWith('.')) &&\n a[ai] !== '**'\n ) {\n if (which === 'a') return false\n which = 'b'\n result.push(b[bi])\n ai++\n bi++\n } else {\n return false\n }\n }\n // if we fall out of the loop, it means they two are identical\n // as long as their lengths match\n return a.length === b.length && result\n }\n\n parseNegate() {\n if (this.nonegate) return\n\n const pattern = this.pattern\n let negate = false\n let negateOffset = 0\n\n for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n negate = !negate\n negateOffset++\n }\n\n if (negateOffset) this.pattern = pattern.slice(negateOffset)\n this.negate = negate\n }\n\n // set partial to true to test if, for example,\n // \"/a/b\" matches the start of \"/*/b/*/d\"\n // Partial means, if you run out of file before you run\n // out of pattern, then that's fine, as long as all\n // the parts match.\n matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n const options = this.options\n\n // UNC paths like //?/X:/... can match X:/... and vice versa\n // Drive letters in absolute drive or unc paths are always compared\n // case-insensitively.\n if (this.isWindows) {\n const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0])\n const fileUNC =\n !fileDrive &&\n file[0] === '' &&\n file[1] === '' &&\n file[2] === '?' &&\n /^[a-z]:$/i.test(file[3])\n\n const patternDrive =\n typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0])\n const patternUNC =\n !patternDrive &&\n pattern[0] === '' &&\n pattern[1] === '' &&\n pattern[2] === '?' &&\n typeof pattern[3] === 'string' &&\n /^[a-z]:$/i.test(pattern[3])\n\n const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined\n const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined\n if (typeof fdi === 'number' && typeof pdi === 'number') {\n const [fd, pd]: [string, string] = [file[fdi], pattern[pdi] as string]\n if (fd.toLowerCase() === pd.toLowerCase()) {\n pattern[pdi] = fd\n if (pdi > fdi) {\n pattern = pattern.slice(pdi)\n } else if (fdi > pdi) {\n file = file.slice(fdi)\n }\n }\n }\n }\n\n // resolve and reduce . and .. portions in the file as well.\n // dont' need to do the second phase, because it's only one string[]\n const { optimizationLevel = 1 } = this.options\n if (optimizationLevel >= 2) {\n file = this.levelTwoFileOptimize(file)\n }\n\n this.debug('matchOne', this, { file, pattern })\n this.debug('matchOne', file.length, pattern.length)\n\n for (\n var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n fi < fl && pi < pl;\n fi++, pi++\n ) {\n this.debug('matchOne loop')\n var p = pattern[pi]\n var f = file[fi]\n\n this.debug(pattern, p, f)\n\n // should be impossible.\n // some invalid regexp stuff in the set.\n /* c8 ignore start */\n if (p === false) {\n return false\n }\n /* c8 ignore stop */\n\n if (p === GLOBSTAR) {\n this.debug('GLOBSTAR', [pattern, p, f])\n\n // \"**\"\n // a/**/b/**/c would match the following:\n // a/b/x/y/z/c\n // a/x/y/z/b/c\n // a/b/x/b/x/c\n // a/b/c\n // To do this, take the rest of the pattern after\n // the **, and see if it would match the file remainder.\n // If so, return success.\n // If not, the ** \"swallows\" a segment, and try again.\n // This is recursively awful.\n //\n // a/**/b/**/c matching a/b/x/y/z/c\n // - a matches a\n // - doublestar\n // - matchOne(b/x/y/z/c, b/**/c)\n // - b matches b\n // - doublestar\n // - matchOne(x/y/z/c, c) -> no\n // - matchOne(y/z/c, c) -> no\n // - matchOne(z/c, c) -> no\n // - matchOne(c, c) yes, hit\n var fr = fi\n var pr = pi + 1\n if (pr === pl) {\n this.debug('** at the end')\n // a ** at the end will just swallow the rest.\n // We have found a match.\n // however, it will not swallow /.x, unless\n // options.dot is set.\n // . and .. are *never* matched by **, for explosively\n // exponential reasons.\n for (; fi < fl; fi++) {\n if (\n file[fi] === '.' ||\n file[fi] === '..' ||\n (!options.dot && file[fi].charAt(0) === '.')\n )\n return false\n }\n return true\n }\n\n // ok, let's see if we can swallow whatever we can.\n while (fr < fl) {\n var swallowee = file[fr]\n\n this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n // XXX remove this slice. Just pass the start index.\n if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n this.debug('globstar found match!', fr, fl, swallowee)\n // found a match.\n return true\n } else {\n // can't swallow \".\" or \"..\" ever.\n // can only swallow \".foo\" when explicitly asked.\n if (\n swallowee === '.' ||\n swallowee === '..' ||\n (!options.dot && swallowee.charAt(0) === '.')\n ) {\n this.debug('dot detected!', file, fr, pattern, pr)\n break\n }\n\n // ** swallows a segment, and continue.\n this.debug('globstar swallow a segment, and continue')\n fr++\n }\n }\n\n // no match was found.\n // However, in partial mode, we can't say this is necessarily over.\n /* c8 ignore start */\n if (partial) {\n // ran out of file\n this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n if (fr === fl) {\n return true\n }\n }\n /* c8 ignore stop */\n return false\n }\n\n // something other than **\n // non-magic patterns just have to match exactly\n // patterns with magic have been turned into regexps.\n let hit: boolean\n if (typeof p === 'string') {\n hit = f === p\n this.debug('string match', p, f, hit)\n } else {\n hit = p.test(f)\n this.debug('pattern match', p, f, hit)\n }\n\n if (!hit) return false\n }\n\n // Note: ending in / means that we'll get a final \"\"\n // at the end of the pattern. This can only match a\n // corresponding \"\" at the end of the file.\n // If the file ends in /, then it can only match a\n // a pattern that ends in /, unless the pattern just\n // doesn't have any more for it. But, a/b/ should *not*\n // match \"a/b/*\", even though \"\" matches against the\n // [^/]*? pattern, except in partial mode, where it might\n // simply not be reached yet.\n // However, a/b/ should still satisfy a/*\n\n // now either we fell off the end of the pattern, or we're done.\n if (fi === fl && pi === pl) {\n // ran out of pattern and filename at the same time.\n // an exact hit!\n return true\n } else if (fi === fl) {\n // ran out of file, but still had pattern left.\n // this is ok if we're doing the match as part of\n // a glob fs traversal.\n return partial\n } else if (pi === pl) {\n // ran out of pattern, still have file left.\n // this is only acceptable if we're on the very last\n // empty segment of a file with a trailing slash.\n // a/* should match a/b/\n return fi === fl - 1 && file[fi] === ''\n\n /* c8 ignore start */\n } else {\n // should be unreachable.\n throw new Error('wtf?')\n }\n /* c8 ignore stop */\n }\n\n braceExpand() {\n return braceExpand(this.pattern, this.options)\n }\n\n parse(pattern: string): ParseReturn {\n assertValidPattern(pattern)\n\n const options = this.options\n\n // shortcuts\n if (pattern === '**') return GLOBSTAR\n if (pattern === '') return ''\n\n // far and away, the most common glob pattern parts are\n // *, *.*, and *.<ext> Add a fast check method for those.\n let m: RegExpMatchArray | null\n let fastTest: null | ((f: string) => boolean) = null\n if ((m = pattern.match(starRE))) {\n fastTest = options.dot ? starTestDot : starTest\n } else if ((m = pattern.match(starDotExtRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? starDotExtTestNocaseDot\n : starDotExtTestNocase\n : options.dot\n ? starDotExtTestDot\n : starDotExtTest\n )(m[1])\n } else if ((m = pattern.match(qmarksRE))) {\n fastTest = (\n options.nocase\n ? options.dot\n ? qmarksTestNocaseDot\n : qmarksTestNocase\n : options.dot\n ? qmarksTestDot\n : qmarksTest\n )(m)\n } else if ((m = pattern.match(starDotStarRE))) {\n fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n } else if ((m = pattern.match(dotStarRE))) {\n fastTest = dotStarTest\n }\n\n const re = AST.fromGlob(pattern, this.options).toMMPattern()\n if (fastTest && typeof re === 'object') {\n // Avoids overriding in frozen environments\n Reflect.defineProperty(re, 'test', { value: fastTest })\n }\n return re\n }\n\n makeRe() {\n if (this.regexp || this.regexp === false) return this.regexp\n\n // at this point, this.set is a 2d array of partial\n // pattern strings, or \"**\".\n //\n // It's better to use .match(). This function shouldn't\n // be used, really, but it's pretty convenient sometimes,\n // when you just want to work with a regex.\n const set = this.set\n\n if (!set.length) {\n this.regexp = false\n return this.regexp\n }\n const options = this.options\n\n const twoStar = options.noglobstar\n ? star\n : options.dot\n ? twoStarDot\n : twoStarNoDot\n const flags = new Set(options.nocase ? ['i'] : [])\n\n // regexpify non-globstar patterns\n // if ** is only item, then we just do one twoStar\n // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n // if ** is last, append (\\/twoStar|) to previous\n // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n // then filter out GLOBSTAR symbols\n let re = set\n .map(pattern => {\n const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n if (p instanceof RegExp) {\n for (const f of p.flags.split('')) flags.add(f)\n }\n return typeof p === 'string'\n ? regExpEscape(p)\n : p === GLOBSTAR\n ? GLOBSTAR\n : p._src\n }) as (string | typeof GLOBSTAR)[]\n pp.forEach((p, i) => {\n const next = pp[i + 1]\n const prev = pp[i - 1]\n if (p !== GLOBSTAR || prev === GLOBSTAR) {\n return\n }\n if (prev === undefined) {\n if (next !== undefined && next !== GLOBSTAR) {\n pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n } else {\n pp[i] = twoStar\n }\n } else if (next === undefined) {\n pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n } else if (next !== GLOBSTAR) {\n pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n pp[i + 1] = GLOBSTAR\n }\n })\n return pp.filter(p => p !== GLOBSTAR).join('/')\n })\n .join('|')\n\n // need to wrap in parens if we had more than one thing with |,\n // otherwise only the first will be anchored to ^ and the last to $\n const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n // must match entire pattern\n // ending in a * or ** will make it less strict.\n re = '^' + open + re + close + '$'\n\n // can match anything, as long as it's not this.\n if (this.negate) re = '^(?!' + re + ').+$'\n\n try {\n this.regexp = new RegExp(re, [...flags].join(''))\n /* c8 ignore start */\n } catch (ex) {\n // should be impossible\n this.regexp = false\n }\n /* c8 ignore stop */\n return this.regexp\n }\n\n slashSplit(p: string) {\n // if p starts with // on windows, we preserve that\n // so that UNC paths aren't broken. Otherwise, any number of\n // / characters are coalesced into one, unless\n // preserveMultipleSlashes is set to true.\n if (this.preserveMultipleSlashes) {\n return p.split('/')\n } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n // add an extra '' for the one we lose\n return ['', ...p.split(/\\/+/)]\n } else {\n return p.split(/\\/+/)\n }\n }\n\n match(f: string, partial = this.partial) {\n this.debug('match', f, this.pattern)\n // short-circuit in the case of busted things.\n // comments, etc.\n if (this.comment) {\n return false\n }\n if (this.empty) {\n return f === ''\n }\n\n if (f === '/' && partial) {\n return true\n }\n\n const options = this.options\n\n // windows: need to use /, not \\\n if (this.isWindows) {\n f = f.split('\\\\').join('/')\n }\n\n // treat the test path as a set of pathparts.\n const ff = this.slashSplit(f)\n this.debug(this.pattern, 'split', ff)\n\n // just ONE of the pattern sets in this.set needs to match\n // in order for it to be valid. If negating, then just one\n // match means that we have failed.\n // Either way, return on the first hit.\n\n const set = this.set\n this.debug(this.pattern, 'set', set)\n\n // Find the basename of the path by looking for the last non-empty segment\n let filename: string = ff[ff.length - 1]\n if (!filename) {\n for (let i = ff.length - 2; !filename && i >= 0; i--) {\n filename = ff[i]\n }\n }\n\n for (let i = 0; i < set.length; i++) {\n const pattern = set[i]\n let file = ff\n if (options.matchBase && pattern.length === 1) {\n file = [filename]\n }\n const hit = this.matchOne(file, pattern, partial)\n if (hit) {\n if (options.flipNegate) {\n return true\n }\n return !this.negate\n }\n }\n\n // didn't get any hits. this is success if it's a negative\n // pattern, failure otherwise.\n if (options.flipNegate) {\n return false\n }\n return this.negate\n }\n\n static defaults(def: MinimatchOptions) {\n return minimatch.defaults(def).Minimatch\n }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n", "import { select, type BaseType } from 'd3-selection'\nimport type { TermSetting } from './TermSetting.ts'\n\ntype TermsSettingViewOpts = {\n\ttermsetting: TermSetting\n}\n\nexport class TermSettingView {\n\ttermsetting: TermSetting\n\n\t_exitPill: (elem: HTMLElement) => void\n\t_updatePill: (elem: HTMLElement) => void\n\t_enterPill: (elem: HTMLElement) => void\n\n\tconstructor(opts: TermsSettingViewOpts) {\n\t\tthis.termsetting = opts.termsetting\n\t\tthis.initUI()\n\t\t// eslint-disable-next-line @typescript-eslint/no-this-alias\n\t\tconst view = this\n\t\t// these methods are required to correctly handle the `this` == HTMLElement context as used by d3-selection,\n\t\t// while also keeping the `this` method reference to the view instance\n\t\tthis._exitPill = function (this: HTMLElement) {\n\t\t\tview.exitPill(this)\n\t\t}\n\t\tthis._updatePill = function (this: HTMLElement) {\n\t\t\tview.updatePill(this)\n\t\t}\n\t\tthis._enterPill = function (this: HTMLElement) {\n\t\t\tview.enterPill(this)\n\t\t}\n\t}\n\n\tinitUI() {\n\t\tconst self = this.termsetting\n\t\t// run only once, upon init\n\t\tif (self.opts.$id) {\n\t\t\tself.dom.tip.d.attr('id', self.opts.$id + '-ts-tip')\n\t\t}\n\n\t\tif (!self.dom.holder) return // toggle the display of pilldiv and nopilldiv with availability of this.term\n\t\tself.dom.nopilldiv = self.dom.holder\n\t\t\t.append('div')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.on('click', event => self.actions.clickNoPillDiv(event))\n\t\t\t.on(`keyup.sjpp-termdb`, event => {\n\t\t\t\tif (event.key == 'Enter') self.api.showTree(self.dom.nopilldiv.node(), event)\n\t\t\t})\n\t\tself.dom.pilldiv = self.dom.holder.append('div')\n\n\t\t// nopilldiv - placeholder label\n\t\tif (self.placeholder) {\n\t\t\tself.dom.nopilldiv\n\t\t\t\t.append('div')\n\t\t\t\t.html(self.placeholder)\n\t\t\t\t.attr('class', 'sja_clbtext2')\n\t\t\t\t.style('padding', '3px 6px 3px 6px')\n\t\t\t\t.style('display', 'inline-block')\n\t\t}\n\n\t\t// nopilldiv - plus button\n\t\tif (self.opts.placeholderIcon) {\n\t\t\t// margin & hover are applied so this icon looks identical to a pill without distracting visual diff on adding/removing tw; however the ts_pill class cannot be used for breaking termsetting ci test\n\t\t\tself.dom.nopilldiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_filter_tag_btn add_term_btn')\n\t\t\t\t.style('padding', '3px 6px')\n\t\t\t\t.style('margin', '2px')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('border-radius', '6px')\n\t\t\t\t.text(self.opts.placeholderIcon)\n\t\t\t\t.on('mouseover', e => (e.target.style.opacity = 0.8))\n\t\t\t\t.on('mouseout', e => (e.target.style.opacity = 1))\n\t\t}\n\n\t\tself.dom.btnDiv = self.dom.holder.append('div')\n\t\tself.dom.content_holder = select(self.dom.holder.node().parentNode).append('div')\n\t}\n\n\tasync updateUI() {\n\t\tconst self = this.termsetting\n\n\t\tself.dom.btnDiv.selectAll('*').remove() //remove info button\n\t\tself.dom.content_holder.selectAll('*').remove() //remove info content\n\n\t\tif (!self.term) {\n\t\t\t// no term\n\t\t\tself.dom.nopilldiv.style('display', 'block')\n\t\t\tself.dom.pilldiv.style('display', 'none')\n\t\t\tself.dom.btnDiv.style('display', 'none')\n\t\t\treturn\n\t\t}\n\n\t\t// has term\n\t\t// add info button for terms with meta data\n\t\tif (self.term.hashtmldetail) {\n\t\t\tif (self.opts.buttons && !self.opts.buttons.includes('info')) self.opts.buttons.unshift('info')\n\t\t\telse self.opts.buttons = ['info']\n\t\t} else {\n\t\t\tself.opts.buttons = []\n\t\t}\n\n\t\tif (self.opts.buttons.length) {\n\t\t\tself.dom.btnDiv\n\t\t\t\t.selectAll('div')\n\t\t\t\t.data(self.opts.buttons)\n\t\t\t\t.enter()\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('padding', '0px 5px')\n\t\t\t\t.style('cursor', 'pointer')\n\t\t\t\t.style('color', '#999')\n\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t.html((d: string) => d.toUpperCase())\n\t\t\t\t.on('click', (event: any, d: string) => {\n\t\t\t\t\tif (d == 'delete') self.actions.removeTerm()\n\t\t\t\t\telse if (d == 'replace') {\n\t\t\t\t\t\tself.api.showTree(event.target, event)\n\t\t\t\t\t} else throw 'unknown button'\n\t\t\t\t})\n\n\t\t\t// render info button only if term has html details\n\t\t\tif (self.term.hashtmldetail) {\n\t\t\t\tconst infoIcon_div = self.dom.btnDiv.selectAll('div').filter(function (this: BaseType) {\n\t\t\t\t\treturn select(this).text() === 'INFO'\n\t\t\t\t})\n\n\t\t\t\t// TODO: modify termInfoInit() to display term info in tip rather than in div\n\t\t\t\t// can be content_tip: self.dom.tip.d to separate it from content_holder\n\t\t\t\tconst termInfo = await import('../termdb/termInfo.js')\n\t\t\t\ttermInfo.termInfoInit({\n\t\t\t\t\tvocabApi: self.opts.vocabApi,\n\t\t\t\t\ticon_holder: infoIcon_div,\n\t\t\t\t\tcontent_holder: self.dom.content_holder,\n\t\t\t\t\tid: self.term.id,\n\t\t\t\t\tstate: { term: self.term }\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tself.dom.nopilldiv.style('display', 'none')\n\t\tself.dom.pilldiv.style('display', self.opts.buttons ? 'inline-block' : 'block')\n\t\tself.dom.btnDiv.style('display', self.opts.buttons ? 'inline-block' : 'none')\n\n\t\t//Gene expression terms do not have an id. Use the name if an id is not available.\n\t\tconst pills = self.dom.pilldiv.selectAll('.ts_pill').data([self.term], (d: any) => d.id || d.name)\n\n\t\t// this exit is really nice\n\t\tpills.exit().each(this._exitPill)\n\n\t\tpills.transition().duration(200).each(this._updatePill)\n\n\t\tpills\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('class', 'ts_pill')\n\t\t\t.style('display', 'grid')\n\t\t\t.style('grid-template-columns', 'auto')\n\t\t\t.style('grid-template-areas', '\"left right\"')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.style('margin', '2px')\n\t\t\t.on('click', (event, clickedElem, menuHolder) => self.api.showMenu(event, clickedElem, menuHolder))\n\t\t\t.transition()\n\t\t\t.duration(200)\n\t\t\t.each(this._enterPill)\n\t}\n\n\tenterPill(elem) {\n\t\tconst self = this.termsetting\n\t\tconst one_term_div = select(elem)\n\n\t\t// left half of blue pill\n\t\tself.dom.pill_termname = one_term_div\n\t\t\t.append('div')\n\t\t\t.attr('class', 'term_name_btn sja_filter_tag_btn')\n\t\t\t.attr('tabindex', 0)\n\t\t\t.style('display', 'flex')\n\t\t\t.style('grid-area', 'left')\n\t\t\t.style('position', 'relative')\n\t\t\t.style('align-items', 'center')\n\t\t\t.style('padding', '3px 6px 3px 6px')\n\t\t\t.style('border-radius', '6px')\n\t\t\t.html(d => self.handler.getPillName(d))\n\t\t\t.on(`keyup.sjpp-termdb`, event => {\n\t\t\t\tif (event.key == 'Enter') event.target.click()\n\t\t\t})\n\n\t\tthis.updatePill(elem)\n\t}\n\n\tasync updatePill(elem) {\n\t\tconst self = this.termsetting\n\t\t// decide if to show/hide the right half based on term status, and modify pill\n\t\tconst one_term_div = select(elem)\n\n\t\tconst pillstat: { text: string; bgcolor?: string } = self.handler.getPillStatus() || { text: '' }\n\t\t// { text, bgcolor }\n\n\t\tself.dom.pill_termname\n\t\t\t.style('border-radius', pillstat.text ? '6px 0 0 6px' : '6px')\n\t\t\t.html(d => self.handler.getPillName(d))\n\n\t\tconst pill_settingSummary = one_term_div\n\t\t\t.selectAll('.ts_summary_btn')\n\t\t\t// bind d.txt to dom, is important in making sure the same text label won't trigger the dom update\n\t\t\t.data(pillstat.text ? [{ txt: pillstat.text }] : [], (d: any) => d.txt as string)\n\n\t\t// because of using d.txt of binding data, exitPill cannot be used here\n\t\t// as two different labels will create the undesirable effect of two right halves\n\t\tpill_settingSummary.exit().remove()\n\n\t\tconst righthalf = pill_settingSummary\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('class', 'ts_summary_btn sja_filter_tag_btn')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('grid-area', 'right')\n\t\t\t.style('position', 'relative')\n\t\t\t.style('align-items', 'center')\n\t\t\t.style('padding', '3px 6px 3px 6px')\n\t\t\t.style('border-radius', '0 6px 6px 0')\n\t\t\t.style('font-style', 'italic')\n\t\t\t.html((d: any) => d.txt)\n\t\t\t.style('opacity', 0)\n\t\t\t.transition()\n\t\t\t.duration(200)\n\t\t\t.style('opacity', 1)\n\n\t\tif (pillstat.bgcolor) {\n\t\t\trighthalf.transition().duration(200).style('background-color', pillstat.bgcolor)\n\t\t}\n\t}\n\n\texitPill(elem) {\n\t\tselect(elem).style('opacity', 1).transition().duration(this.termsetting.durations.exit).style('opacity', 0).remove()\n\t}\n}\n", "import type { TermSetting } from './TermSetting.ts'\nimport { Menu } from '#dom'\n// import { TwRouter } from '#tw'\nimport { isNumericTerm } from '#shared/terms.js'\nimport { get$id } from './utils.ts'\n\nexport class TermSettingActions {\n\ttermsetting: TermSetting\n\n\tconstructor(opts) {\n\t\tthis.termsetting = opts.termsetting\n\t}\n\n\tremoveTerm() {\n\t\tthis.termsetting.opts.callback(null)\n\t}\n\n\tasync cancelGroupsetting() {\n\t\tconst self = this.termsetting\n\t\tself.opts.callback({\n\t\t\tid: self.term.id,\n\t\t\tterm: self.term,\n\t\t\tq: { mode: 'discrete', type: 'values', isAtomic: true }\n\t\t})\n\t}\n\n\tasync clickNoPillDiv(event) {\n\t\tconst self = this.termsetting\n\t\t// support various behaviors upon clicking nopilldiv\n\t\tif (!self.noTermPromptOptions || self.noTermPromptOptions.length == 0) {\n\t\t\t// show tree to select a dictionary term\n\t\t\tawait self.api.showTree(self.dom.nopilldiv.node(), event)\n\t\t\treturn\n\t\t}\n\t\tself.dom.tip.clear().showunder(self.dom.nopilldiv.node())\n\t\t// create small menu, one option for each ele in noTermPromptOptions[]\n\t\tconst optionTip = new Menu()\n\t\tfor (const option of self.noTermPromptOptions) {\n\t\t\t// {isDictionary, termtype, text, html, q{}}\n\t\t\tconst item = self.dom.tip.d\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t\t.on('click', async event => {\n\t\t\t\t\toptionTip.clear().hide()\n\t\t\t\t\tif (option.invalid) {\n\t\t\t\t\t\t// invalid option, display message\n\t\t\t\t\t\toptionTip\n\t\t\t\t\t\t\t.show(event.clientX, event.clientY)\n\t\t\t\t\t\t\t.d.append('div')\n\t\t\t\t\t\t\t.text(option.invalidMsg || '')\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tself.dom.tip.clear()\n\t\t\t\t\tif (option.isDictionary) {\n\t\t\t\t\t\tawait self.api.showTree(self.dom.tip.d.node(), event)\n\t\t\t\t\t} else if (option.termtype) {\n\t\t\t\t\t\t// pass in default q{} to customize settings in edit menu\n\t\t\t\t\t\tif (option.q) self.q = structuredClone(option.q)\n\t\t\t\t\t\tawait self.setHandler(option.termtype)\n\t\t\t\t\t\tif (isNumericTerm(self.term) && !self.term.bins && self.term.type != 'survival') {\n\t\t\t\t\t\t\tconst tw = { term: self.term, q: self.q /*, $id: ''*/ }\n\t\t\t\t\t\t\t//tw.$id = await get$id(tw)\n\t\t\t\t\t\t\tawait self.vocabApi.setTermBins(tw as any) // TODO: fix type\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!self.$id) self.$id = await get$id(self.vocabApi.getTwMinCopy({ term: self.term, q: self.q }))\n\t\t\t\t\t\tself.handler!.showEditMenu(self.dom.tip.d)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'termtype missing'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\tif (option.text) item.text(option.text)\n\t\t\telse if (option.html) item.html(option.html)\n\t\t}\n\t\t// load the input ui for this term type\n\t}\n}\n\n// // do not consider irrelevant q attributes when\n// // computing the deep equality of two term.q's\n// function equivalentQs(q0: Q, q1: Q) {\n// \tconst qlst = [q0, q1].map(q => JSON.parse(JSON.stringify(q)))\n// \tfor (const q of qlst) {\n// \t\tdelete q.binLabelFormatter\n// \t\tif (q.reuseId === 'Default') delete q.reuseId\n// \t\t// TODO: may need to delete non-relevant q attributes\n// \t\t// when setting defaults in regression.inputs.term.js\n// \t\tif (q.mode === 'continuous') delete q.mode\n// \t\tif (q.mode === 'discrete' && q.type == 'custom-bin' && q.lst) {\n// \t\t\tfor (const bin of q.lst) {\n// \t\t\t\tdelete bin.range\n// \t\t\t}\n// \t\t}\n// \t}\n// \treturn deepEqual(qlst[0], qlst[1])\n// }\n", "import type {\n\tTermSettingOpts,\n\tPillData,\n\tUseCase,\n\tSampleCountsEntry,\n\tNoTermPromptOptsEntry,\n\tVocabApi,\n\tHandler\n} from './types'\nimport type { TermSettingApi } from './TermSettingApi.ts'\nimport type { Term, Filter, Q, TermWrapper } from '#types'\nimport { TwBase /*CatValues, CatPredefinedGS, CatCustomGS*/ } from '#tw'\nimport { Menu } from '#dom'\nimport { TermTypes, isDictionaryType } from '#shared/terms.js'\nimport { minimatch } from 'minimatch'\nimport { HandlerBase } from './HandlerBase.ts'\nimport { TermSettingView } from './TermSettingView.ts'\nimport { TermSettingActions } from './TermSettingActions.ts'\n\ntype MenuOptions = string // 'edit|replace|save|remove|reuse'\ntype MenuLayout = 'vertical' | 'horizontal'\ntype CustomMenuOptions = { label: string; callback: (tw: TermWrapper) => void }\n\nconst defaultOpts = {\n\tmenuOptions: 'edit' satisfies MenuOptions,\n\tmenuLayout: 'vertical' satisfies MenuLayout,\n\tcustomMenuOptions: [] satisfies CustomMenuOptions[]\n}\n\nexport class TermSetting {\n\topts: any // Required<TermSettingOpts>\n\tvocabApi: VocabApi\n\tdom: {\n\t\t[name: string]: any // d3-selection\n\t} // Dom //opts.holder is required\n\n\t//Optional opts, hence undefined type\n\tactiveCohort?: number\n\tplaceholder?: string\n\tdurations: { exit: number } = { exit: 0 }\n\tdisable_terms?: Term[] = []\n\tusecase?: UseCase\n\tabbrCutoff?: number\n\t$id?: string\n\tsampleCounts?: SampleCountsEntry[]\n\tnoTermPromptOptions?: NoTermPromptOptsEntry[]\n\n\t//Optional opts in script, not init()\n\tdoNotHideTipInMain: boolean = false\n\n\t//Created\n\thasError: boolean = false\n\tapi: TermSettingApi\n\tnumqByTermIdModeType: { [twId: string]: { [mode: string]: any /* should be numeric q */ } } = {}\n\n\t//tw: TermWrapper\n\tview: TermSettingView\n\tactions: TermSettingActions\n\n\thandler: Handler\n\thandlerByType: {\n\t\t[termType: string]: any // TODO: define handler api\n\t} = {}\n\t// showTree: any\n\t// showGeneSearch: any\n\t// showMenu: any\n\t// initUI: any\n\t// updateUI: any\n\n\t//Pill data\n\ttw!: TwBase //CatValues | CatPredefinedGS | CatCustomGS\n\tterm: any\n\tq!: Q\n\tdata: any\n\terror: string | undefined\n\tfilter: Filter | undefined\n\tgroups?: any\n\n\tconstructor(opts: TermSettingOpts) {\n\t\tthis.opts = this.validateOpts(opts)\n\t\tthis.api = opts.api\n\t\tthis.vocabApi = opts.vocabApi\n\t\tthis.dom = this.getDom(opts)\n\n\t\tthis.activeCohort = opts.activeCohort\n\t\tthis.placeholder = opts.placeholder as string\n\t\tthis.durations = { exit: 0 }\n\t\tthis.disable_terms = opts.disable_terms\n\t\tthis.usecase = opts.usecase\n\t\tthis.abbrCutoff = opts.abbrCutoff\n\t\t// default handler\n\t\tthis.handler = new HandlerBase({ termsetting: this })\n\t\tthis.handlerByType.default = this.handler\n\t\t//this.tw = opts.tw\n\t\tthis.actions = new TermSettingActions({ termsetting: this })\n\t\tthis.view = new TermSettingView({ termsetting: this })\n\t}\n\n\tvalidateOpts(_opts: TermSettingOpts) {\n\t\tconst o = {\n\t\t\t...defaultOpts,\n\t\t\t..._opts\n\t\t}\n\t\tif (!o.holder && o.renderAs != 'none') throw '.holder missing'\n\t\tif (typeof o.callback != 'function') throw '.callback() is not a function'\n\t\tif (!o.vocabApi) throw '.vocabApi missing'\n\t\tif (typeof o.vocabApi != 'object') throw '.vocabApi{} is not object'\n\t\tif ('placeholder' in o && !o.placeholder && 'placeholderIcon' in o && !o.placeholderIcon)\n\t\t\tthrow 'must specify a non-empty opts.placeholder and/or .placeholderIcon'\n\t\tif (!('placeholder' in o)) o.placeholder = 'Select term '\n\t\tif (!('placeholderIcon' in o)) o.placeholderIcon = '+'\n\t\tif (!Number.isInteger(o.abbrCutoff)) o.abbrCutoff = 18 //set the default to 18\n\t\tthis.validateMenuOptions(o)\n\t\tif (!o.numericEditMenuVersion) o.numericEditMenuVersion = ['discrete']\n\t\tthis.mayValidate_noTermPromptOptions(o)\n\t\treturn o\n\t}\n\n\tgetDom(opts) {\n\t\tconst tip =\n\t\t\topts.tip ||\n\t\t\tnew Menu({\n\t\t\t\tpadding: '0px',\n\t\t\t\tparent_menu: this.opts.holder && this.opts.holder.node() && this.opts.holder.node().closest('.sja_menu_div')\n\t\t\t})\n\n\t\treturn {\n\t\t\tholder: opts.holder,\n\t\t\ttip,\n\t\t\t// tip2 is for showing inside tip, e.g. in snplocus UI\n\t\t\ttip2: new Menu({\n\t\t\t\tpadding: '0px',\n\t\t\t\tparent_menu: tip.d.node()\n\t\t\t})\n\t\t}\n\t}\n\n\tvalidateMainData(d: PillData) {\n\t\tif (d.term) {\n\t\t\t// term is optional\n\t\t\tif (!d.term.type) throw 'data.term.type missing'\n\t\t\t// hardcode non\n\t\t\tif (isDictionaryType(d.term.type)) {\n\t\t\t\tif (!d.term.id && d.term.type != TermTypes.SAMPLELST && d.term.type != TermTypes.TERM_COLLECTION)\n\t\t\t\t\tthrow 'data.term.id missing'\n\t\t\t\tif (!d.term.name) throw 'data.term.name missing'\n\t\t\t}\n\t\t}\n\t\tif (!d.q) d.q = {}\n\t\tif (typeof d.q != 'object') throw 'data.q{} is not object'\n\t\tif (d.disable_terms) {\n\t\t\tif (!Array.isArray(d.disable_terms)) throw 'data.disable_terms[] is not array'\n\t\t}\n\t\tthis.mayValidate_noTermPromptOptions(d)\n\t}\n\n\tvalidateMenuOptions(o: TermSettingOpts) {\n\t\tif (!o.menuOptions) o.menuOptions = defaultOpts.menuOptions\n\t\t// support legacy options, now converted to use glob-style pattern matching\n\t\tif (o.menuOptions == 'all') o.menuOptions = '*'\n\t\t// skip reuse option\n\t\tfor (const opt of ['edit', /*'reuse',*/ 'replace', 'remove']) {\n\t\t\tif (minimatch(opt, o.menuOptions)) return // matched at least one menu option\n\t\t}\n\t\tthrow `no matches found for termsetting opts.menuOptions='${o.menuOptions}'`\n\t}\n\n\tmayValidate_noTermPromptOptions(o) {\n\t\t//: TermSettingOpts | PillData) {\n\t\tif (!o.noTermPromptOptions) return\n\t\tif (!Array.isArray(o.noTermPromptOptions)) throw 'noTermPromptOptions[] is not array'\n\t\t// allow empty array\n\t\tfor (const t of o.noTermPromptOptions) {\n\t\t\tif (t.isDictionary) {\n\t\t\t\t// allowed\n\t\t\t} else {\n\t\t\t\t// otherwise, must be a non-dict term type\n\t\t\t\tif (!t.termtype) throw 'element of noTermPromptOptions[] missing both isDictionary=true and .termtype'\n\t\t\t}\n\t\t\tif (!t.text && !t.html) throw 'element of noTermPromptOptions[] missing both .text and .html'\n\t\t\tif (t.q && typeof t.q != 'object') throw 'type.q{} is not object'\n\t\t}\n\t\tthis.noTermPromptOptions = o.noTermPromptOptions\n\t}\n\n\tasync setHandler(termtype: string | undefined | null, tw?: TermWrapper) {\n\t\tif (tw instanceof TwBase) {\n\t\t\tswitch (tw.type) {\n\t\t\t\tcase 'QualTWValues':\n\t\t\t\tcase 'QualTWPredefinedGS':\n\t\t\t\tcase 'QualTWCustomGS': {\n\t\t\t\t\t/* commenting out, otherwise may reuse handler with stale termsetting instance\n\t\t\t\t\t(e.g. categorical term as independent variable in regression -> apply groupsetting -> re-open edit menu -> incorrect groupsetting\n\t\t\t\t\tbecause getGroups() from QualValues is used instead of getGroups() from QualCustomGS)\n\t\t\t\t\tif (this.handlerByType.qualitative) {\n\t\t\t\t\t\tthis.handler = this.handlerByType.qualitative\n\t\t\t\t\t\treturn\n\t\t\t\t\t}*/\n\t\t\t\t\tconst { GroupSet } = await import('./handlers/qualitative.ts')\n\t\t\t\t\tthis.handler = new GroupSet({ termsetting: this })\n\t\t\t\t\tthis.handlerByType.qualitative = this.handler\n\t\t\t\t\treturn\n\t\t\t\t\t//break\n\t\t\t\t}\n\t\t\t\tcase 'NumTWRegularBin':\n\t\t\t\tcase 'NumTWCustomBin':\n\t\t\t\tcase 'NumTWCont':\n\t\t\t\tcase 'NumTWBinary':\n\t\t\t\tcase 'NumTWSpline': {\n\t\t\t\t\tif (this.handlerByType.numeric) {\n\t\t\t\t\t\tthis.handler = this.handlerByType.numeric\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tconst { NumericHandler } = await import('./handlers/NumericHandler.ts')\n\t\t\t\t\tthis.handler = new NumericHandler({ termsetting: this })\n\t\t\t\t\tthis.handlerByType.numeric = this.handler\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// TODO: should reinstate throw once all migrated tw's have strict handlers for each tw type\n\t\t\t\tdefault:\n\t\t\t\t\tthrow `unsupported tw.type='${tw.type}'`\n\t\t\t}\n\t\t\t//return\n\t\t}\n\n\t\t// TODO: should use TwRouter here??? or expect tw to be already filled-in/instantiated???\n\t\tif (!termtype || termtype == 'termCollection') {\n\t\t\tthis.handler = this.handlerByType.default as Handler\n\t\t\treturn\n\t\t}\n\t\tconst type = termtype == 'integer' || termtype == 'float' || termtype == 'date' ? 'numeric' : termtype // 'categorical', 'condition', 'survival', etc\n\t\tif (!this.handlerByType[type]) {\n\t\t\ttry {\n\t\t\t\tconst _ = await import(`./handlers/${type}.ts`)\n\t\t\t\tthis.handlerByType[type] = await _.getHandler(this)\n\t\t\t} catch (e) {\n\t\t\t\tthrow `error with handler='./handlers/${type}.ts': ${e}`\n\t\t\t}\n\t\t}\n\t\tthis.handler = this.handlerByType[type] as Handler\n\t}\n\n\tdestroy() {\n\t\tthis.dom.holder.remove()\n\t\tthis.dom.tip.destroy()\n\t\tthis.dom.tip2.destroy()\n\t}\n}\n", "import type { TermSettingOpts } from './types'\nimport { TermSetting } from './TermSetting.ts'\nimport type { Term, TermWrapper, Filter, GvPredefinedGsTW } from '#types'\nimport { call_fillTW, get$id, fillTermWrapper } from './utils.ts'\nimport { minimatch } from 'minimatch'\nimport { isNumericTerm } from '#shared/terms.js'\nimport { copyMerge, deepEqual } from '#rx'\nimport { select } from 'd3-selection'\nimport { TwRouter, CategoricalBase, SnpBase, QualitativeBase, NumericBase } from '#tw'\n\nexport const termsettingInit = opts => {\n\t// TODO: may convert to async-await as needed to initialize,\n\t// if ever an async TermSettingApi.init() static method is created\n\treturn new TermSettingApi(opts)\n}\n\nexport class TermSettingApi {\n\t#termsetting: TermSetting\n\tInner?: TermSetting\n\n\tconstructor(opts: TermSettingOpts) {\n\t\topts.api = this //; console.log(14, opts)\n\t\tthis.#termsetting = new TermSetting(opts)\n\t\t// to be used for test-code only\n\t\tif (opts.debug) this.Inner = this.#termsetting\n\t}\n\n\tasync main(data: any = {}) {\n\t\tconst self = this.#termsetting\n\t\ttry {\n\t\t\tif (self.doNotHideTipInMain) {\n\t\t\t\t// single use: if true then delete\n\t\t\t\tself.doNotHideTipInMain = false\n\t\t\t} else {\n\t\t\t\tself.dom.tip.hide()\n\t\t\t}\n\t\t\tself.hasError = false\n\t\t\tdelete self.error\n\t\t\tself.validateMainData(data)\n\t\t\t// TODO: use routedTermTypes.has(data.term?.type) instead of just categorical\n\t\t\tif (!data.tw && (QualitativeBase.termTypes.has(data.term?.type) || NumericBase.termTypes.has(data.term?.type))) {\n\t\t\t\tdata.tw = await TwRouter.initRaw({ term: data.term, q: data.q })\n\t\t\t}\n\t\t\tself.tw = data.tw\n\t\t\t// may need original values for comparing edited settings\n\t\t\tself.data = data //as PillData\n\t\t\t// term is read-only if it comes from state, let it remain read-only\n\t\t\tself.term = data.term as Term\n\t\t\tself.q = JSON.parse(JSON.stringify(data.q)) // q{} will be altered here and must not be read-only\n\t\t\tif ('$id' in data) self.$id = data.$id\n\t\t\tif ('disable_terms' in data) self.disable_terms = data.disable_terms\n\t\t\tif ('filter' in data) self.filter = data.filter as Filter\n\t\t\tif ('activeCohort' in data) self.activeCohort = data.activeCohort\n\t\t\tif ('sampleCounts' in data) self.sampleCounts = data.sampleCounts\n\t\t\tif ('menuOptions' in data) self.opts.menuOptions = data.menuOptions\n\t\t\tawait self.setHandler(self.term ? self.term.type : null, data.tw)\n\t\t\tif (data.term && self.handler && self.handler.validateQ) self.handler.validateQ(data)\n\t\t\tif (self.handler.postMain) await self.handler.postMain()\n\t\t\tif (self.opts.renderAs != 'none') self.view.updateUI()\n\t\t} catch (e) {\n\t\t\tself.hasError = true\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync runCallback(overrideTw = null) {\n\t\tconst self = this.#termsetting\n\t\t/* optional termwrapper (tw) to override attributes of self.term{} and self.q{}\n\t\tthe override tw serves the \"atypical\" termsetting usage\n\t\tas used in snplocus block pan/zoom update in regression.results.js\n\t\t*/\n\t\tconst arg: any = self.term ? { term: self.term, q: self.q, isAtomic: true } : {}\n\t\targ.$id = '$id' in this ? this.$id : await get$id(arg)\n\t\tif (arg.q?.reuseId && arg.q.reuseId === self.data.q?.reuseId) {\n\t\t\tif (!deepEqual(arg.q, self.data.q)) {\n\t\t\t\tdelete arg.q.reuseId\n\t\t\t\tdelete arg.q.name\n\t\t\t}\n\t\t}\n\t\tconst otw = overrideTw ? JSON.parse(JSON.stringify(overrideTw)) : {}\n\t\tconst tw = overrideTw ? copyMerge(JSON.stringify(arg), otw) : arg\n\t\tif (self.tw instanceof CategoricalBase || self.tw instanceof SnpBase || self.tw instanceof NumericBase)\n\t\t\tself.tw = await TwRouter.initRaw(tw, self.opts)\n\t\tif (self.opts.callback) self.opts.callback(tw)\n\t}\n\n\tasync showTree(holder, event: MouseEvent | undefined) {\n\t\tconst self = this.#termsetting\n\t\tself.dom.tip.clear()\n\t\tif (holder)\n\t\t\tself.dom.tip.showunder(\n\t\t\t\tholder instanceof Element ? holder : this instanceof Element ? this : self.dom.holder.node()\n\t\t\t)\n\t\telse self.dom.tip.show(event!.clientX, event!.clientY)\n\t\tif (!self.usecase) self.usecase = { target: 'default' }\n\t\tconst termdb = await import('../termdb/app.js')\n\t\ttermdb.appInit({\n\t\t\tholder: self.dom.tip.d,\n\t\t\tvocabApi: self.vocabApi,\n\t\t\tstate: {\n\t\t\t\tactiveCohort: self.activeCohort,\n\t\t\t\ttree: {\n\t\t\t\t\tusecase: self.usecase\n\t\t\t\t}\n\t\t\t},\n\t\t\ttree: {\n\t\t\t\tdisable_terms: self.disable_terms,\n\t\t\t\tclick_term: async t => {\n\t\t\t\t\t// set up timer to display loading message\n\t\t\t\t\tlet showLoading = true\n\t\t\t\t\tconst loadingTimer = setTimeout(() => {\n\t\t\t\t\t\tif (showLoading) {\n\t\t\t\t\t\t\tself.dom.nopilldiv.text('Loading ...')\n\t\t\t\t\t\t\tself.dom.pilldiv.text('Loading ...')\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 200)\n\n\t\t\t\t\tself.dom.tip.hide()\n\n\t\t\t\t\tlet tw\n\t\t\t\t\tif (t.term) tw = t as TermWrapper\n\t\t\t\t\telse {\n\t\t\t\t\t\tconst term = t as Term\n\t\t\t\t\t\ttw = { term, q: { isAtomic: true }, isAtomic: true }\n\t\t\t\t\t}\n\n\t\t\t\t\tif (self.opts.customFillTw) tw = self.opts.customFillTw(tw)\n\t\t\t\t\ttw = await fillTermWrapper(tw, self.vocabApi, self.opts.defaultQ4fillTW)\n\t\t\t\t\t// tw is now furbished\n\n\t\t\t\t\tself.opts.callback!(tw)\n\n\t\t\t\t\t// stop the loading message from appearing\n\t\t\t\t\tshowLoading = false\n\t\t\t\t\tclearTimeout(loadingTimer)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\t// TODO: move this method to TermSetting class\n\tshowMenu(event: MouseEvent, clickedElem = null, menuHolder = null) {\n\t\tconst self = this.#termsetting\n\t\tconst tip = self.dom.tip\n\t\ttip.clear()\n\t\t// self.dom.holder really is set to clickedElem because\n\t\t// handler showEditMenu() use if for tip.showunder(self.dom.holder)\n\t\tif (self.opts.renderAs == 'none' && clickedElem) self.dom.holder = select(clickedElem)\n\t\tif (self.dom.holder) {\n\t\t\tconst elem = self.dom.holder?.node()\n\t\t\tif (elem) tip.showunder(elem)\n\t\t\telse tip.show(event.clientX, event.clientY)\n\t\t}\n\n\t\ttype opt = { label: string; callback: (f?: any) => void }\n\t\tconst options: opt[] = []\n\t\tconst q = self.q as any\n\n\t\tif (q.type == 'predefined-groupset' || q.type == 'custom-groupset') {\n\t\t\t// term is using groupsetting\n\t\t\t// should provide option to cancel it\n\t\t\tif (q.mode != 'binary' && self.term.type != 'geneVariant') {\n\t\t\t\t// mode=binary will never use groupsetting\n\t\t\t\t// geneVariant term can cancel groupsetting within edit menu\n\t\t\t\toptions.push({ label: 'Cancel grouping', callback: () => self.actions.cancelGroupsetting() } as opt)\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tself.q &&\n\t\t\t!self.term.groupsetting?.disabled &&\n\t\t\tself.term.type != 'survival' &&\n\t\t\tminimatch('edit', self.opts.menuOptions)\n\t\t) {\n\t\t\t// hide edit option for survival term because its showEditMenu() is disabled\n\t\t\toptions.push({\n\t\t\t\tlabel: 'Edit',\n\t\t\t\tcallback: async div => {\n\t\t\t\t\tif (self.term && isNumericTerm(self.term) && !self.term.bins) {\n\t\t\t\t\t\tconst tw = { term: self.term, q: self.q /*, $id: ''*/ }\n\t\t\t\t\t\t//tw.$id = await get$id(tw)\n\t\t\t\t\t\tawait self.vocabApi.setTermBins(tw as any) // TODO: fix type\n\t\t\t\t\t}\n\t\t\t\t\tawait self.handler.showEditMenu(div.append('div'))\n\t\t\t\t}\n\t\t\t} as opt)\n\t\t}\n\n\t\tif (self.term.type == 'geneVariant' && 'type' in self.q && self.q.type == 'predefined-groupset') {\n\t\t\t// display predefined groupsets of geneVariant term\n\t\t\t// for quick access\n\t\t\tconst groupsets = self.term.groupsetting?.lst\n\t\t\tif (!groupsets || !groupsets.length) throw 'predefined groupsets not found'\n\t\t\tfor (const [i, groupset] of groupsets.entries()) {\n\t\t\t\toptions.push({\n\t\t\t\t\tlabel: groupset.name,\n\t\t\t\t\tcallback: async () => {\n\t\t\t\t\t\tconst tw: GvPredefinedGsTW = {\n\t\t\t\t\t\t\ttype: 'GvPredefinedGsTW',\n\t\t\t\t\t\t\tisAtomic: true,\n\t\t\t\t\t\t\tterm: self.term,\n\t\t\t\t\t\t\tq: { type: 'predefined-groupset', predefined_groupset_idx: i, isAtomic: true }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait call_fillTW(tw, self.vocabApi)\n\t\t\t\t\t\tself.opts.callback(tw)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// Restored the reuse menu option for now, due to failing integration tests that will require more code changes to fix\n\t\t// Instead of deleting the reuse code, may move the Reuse to the edit menu for recovering saved grouping/bin config\n\t\t// if (minimatch('reuse', self.opts.menuOptions)) {\n\t\t// \toptions.push({ label: 'Reuse', callback: self.showReuseMenu } as opt)\n\t\t// }\n\n\t\tif (minimatch('replace', self.opts.menuOptions)) {\n\t\t\toptions.push({\n\t\t\t\tlabel: 'Replace',\n\t\t\t\tcallback: (event, d) => {\n\t\t\t\t\tthis.showTree(event, d)\n\t\t\t\t}\n\t\t\t} as opt)\n\t\t}\n\n\t\tif (minimatch('remove', self.opts.menuOptions)) {\n\t\t\toptions.push({ label: 'Remove', callback: () => self.actions.removeTerm() } as opt)\n\t\t}\n\n\t\tif (self.opts.customMenuOptions) options.push(...self.opts.customMenuOptions)\n\n\t\tconst activeMenu = menuHolder || tip.d\n\t\tactiveMenu\n\t\t\t.selectAll('div')\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('tabindex', (d, i) => i + 1)\n\t\t\t.style('display', self.opts.menuLayout == 'horizontal' ? 'inline-block' : 'block')\n\t\t\t.text((d: opt) => d.label)\n\t\t\t.on('click', (event: MouseEvent, d: opt) => {\n\t\t\t\tself.dom.tip.clear()\n\t\t\t\td.callback(self.dom.tip.d)\n\t\t\t})\n\t\t\t.on('keyup', event => {\n\t\t\t\tif (event.key == 'Enter') event.target.click()\n\t\t\t})\n\n\t\tactiveMenu.select('.sja_menuoption').node()?.focus()\n\t\t//self.showFullMenu(tip.d, self.opts.menuOptions)\n\t}\n\n\t// TODO: move this method to TermSetting class\n\tshowGeneSearch(clickedElem: Element | null, event: MouseEvent) {\n\t\tconst self = this.#termsetting\n\t\tself.dom.tip.clear()\n\t\tif (clickedElem)\n\t\t\tself.dom.tip.showunder(\n\t\t\t\tclickedElem instanceof Element ? clickedElem : this instanceof Element ? this : self.dom.holder.node()\n\t\t\t)\n\t\telse self.dom.tip.show(event.clientX, event.clientY)\n\n\t\tconst selectedGenes = new Set()\n\t\tconst searchDiv = self.dom.tip.d.append('div').style('padding', '5px')\n\t\tconst label = searchDiv.append('label')\n\t\tlabel.append('span').text('Search: ')\n\t\tconst input = label\n\t\t\t.append('input')\n\t\t\t.attr('type', 'text')\n\t\t\t.on('input', async () => {\n\t\t\t\tconst str = input.property('value')\n\t\t\t\tconst cohortStr = self.opts.vocabApi.termdbConfig.selectCohort.values[self.activeCohort || 0].keys\n\t\t\t\t\t.slice()\n\t\t\t\t\t.sort()\n\t\t\t\t\t.join(',')\n\n\t\t\t\ttry {\n\t\t\t\t\tconst results = !str ? { lst: [] } : await self.vocabApi.findTerm(str, cohortStr, self.usecase as any, 'gene')\n\t\t\t\t\tresultsDiv.selectAll('*').remove()\n\t\t\t\t\tresultsDiv\n\t\t\t\t\t\t.selectAll('div')\n\t\t\t\t\t\t.data(results.lst.filter((g: any) => !selectedGenes.has(g)))\n\t\t\t\t\t\t.enter()\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.attr('class', 'ts_pill sja_filter_tag_btn sja_tree_click_term')\n\t\t\t\t\t\t.style('display', 'block')\n\t\t\t\t\t\t.style('margin', '2px 3px')\n\t\t\t\t\t\t.style('width', 'fit-content')\n\t\t\t\t\t\t.text((gene: any) => gene.name)\n\t\t\t\t\t\t.on('click', async (gene: any) => {\n\t\t\t\t\t\t\tself.dom.tip.hide()\n\t\t\t\t\t\t\tthis.runCallback({\n\t\t\t\t\t\t\t\tterm: {\n\t\t\t\t\t\t\t\t\tname: gene.name,\n\t\t\t\t\t\t\t\t\ttype: 'geneVariant'\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tq: {\n\t\t\t\t\t\t\t\t\texclude: []\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} as any) // TODO: fix type\n\t\t\t\t\t\t})\n\t\t\t\t} catch (e) {\n\t\t\t\t\talert('Search error: ' + e)\n\t\t\t\t}\n\t\t\t})\n\n\t\tconst resultsDiv = self.dom.tip.d\n\t\t\t.append('div')\n\t\t\t.style('margin', '5px')\n\t\t\t.style('padding-left', '5px')\n\t\t\t.style('border-left', '2px solid #ccc')\n\t}\n\n\thasError() {\n\t\treturn this.#termsetting.hasError\n\t}\n\n\tvalidateQ(d /*: PillData*/) {\n\t\tconst self = this.#termsetting\n\t\tif (!self.handler?.validateQ) return\n\t\ttry {\n\t\t\tself.handler.validateQ(d)\n\t\t} catch (e) {\n\t\t\tthis.#termsetting.hasError = true\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tthis.#termsetting.destroy()\n\t}\n}\n", "import type { TermWrapper, Term } from '#types'\nimport type { MassAppApi, MassState } from '#mass/types/mass'\nimport { termsettingInit } from '#termsetting'\nimport { select } from 'd3-selection'\nimport type { MultiTermWrapperDom, MultiTermWrapperUIOpts } from './types/MultiTermWrapperEditUI'\n\n/** Creates a UI for users to select pills and edit the term\n * before submitting or dispatching an action.\n *\n * If editing the pill is not needed, use termdb.appInit() instead.\n *\n * The caller is responsible for handling the returned terms.\n * (i.e. any app actions). */\nexport class MultiTermWrapperEditUI {\n\treadonly type = 'multiTermEditUI'\n\tapp: MassAppApi\n\tbuttonLabel: string\n\tcallback: (terms: any) => void\n\tcustomInputs?: object\n\tdisable_terms: Term[]\n\tdom: MultiTermWrapperDom\n\theaderText: string\n\tinputListLength: number\n\tmaxNum: number\n\tstate?: MassState\n\ttwList: TermWrapper[]\n\tupdate: any\n\n\tconstructor(opts: MultiTermWrapperUIOpts) {\n\t\tthis.app = opts.app\n\t\tthis.callback = opts.callback\n\t\tconst holder = opts.holder.attr('data-testid', 'sjpp-multi-tw-edit-ui')\n\t\tconst header = holder\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-edit-ui-header')\n\t\t\t.style('display', 'block')\n\t\t\t.style('padding', '10px')\n\t\tconst tws = holder.append('div').style('display', 'block').style('margin-left', '10px')\n\t\tconst submitDiv = holder\n\t\t\t.append('div')\n\t\t\t.attr('data-testid', 'sjpp-edit-ui-submit')\n\t\t\t.style('display', 'block')\n\t\t\t.style('padding', '10px')\n\t\t\t.style('margin-left', '5px')\n\t\tthis.dom = {\n\t\t\tholder,\n\t\t\theader,\n\t\t\ttws,\n\t\t\tsubmitBtn: submitDiv.append('button').style('display', 'inline-block'),\n\t\t\tfooter: submitDiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('data-testid', 'sjpp-edit-ui-footer')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('margin-left', '10px')\n\t\t}\n\t\tthis.twList = opts.twList || []\n\t\t//Determines if the user can submit or not\n\t\t//If >0, can submit to remove terms\n\t\t//If == 0, user must select a term to submit\n\t\tthis.inputListLength = this.twList.length\n\t\tthis.buttonLabel = opts.buttonLabel || 'Submit'\n\t\tthis.maxNum = opts.maxNum || Infinity\n\t\tthis.headerText = opts.headerText || ''\n\t\tthis.customInputs = opts.customInputs || {}\n\t\tthis.disable_terms = opts.disable_terms || []\n\t\tif (opts.state) this.state = opts.state\n\n\t\tsetRenderers(this)\n\t}\n\n\tasync renderUI() {\n\t\tthis.dom.header.style('font-style', 'italic').style('opacity', 0.7).text(this.headerText)\n\n\t\tthis.dom.submitBtn.text(this.buttonLabel).on('click', () => {\n\t\t\tthis.callback(this.twList)\n\t\t})\n\n\t\tthis.update(this)\n\t}\n\n\tasync getNewPill(d, div) {\n\t\t//Do not allow users to select the same term more than once\n\t\t//Combine with specified disable_terms from the caller\n\t\tconst disable_terms = [...this.disable_terms, ...this.twList.map(tw => tw.term)]\n\t\tconst _opts = {\n\t\t\tabbrCutoff: 50,\n\t\t\tdebug: this.app.opts?.debug,\n\t\t\tdisable_terms,\n\t\t\tgenomeObj: this.app.opts.genome,\n\t\t\tholder: div,\n\t\t\tmenuOptions: '!replace',\n\t\t\tnumericEditMenuVersion: ['continuous', 'discrete'],\n\t\t\tplaceholder: 'Add term',\n\t\t\tvocabApi: this.app.vocabApi,\n\t\t\tcallback: (tw: any) => {\n\t\t\t\t/** Make a copy of the twList. When the edit UI is opened\n\t\t\t\t * with a list of terms, the object is sealed.*/\n\t\t\t\tconst twListCopy = this.twList.slice(0)\n\t\t\t\tconst idx = twListCopy.findIndex(t => t.$id === d.tw.$id)\n\t\t\t\tif (idx !== -1 && !tw?.term) {\n\t\t\t\t\ttwListCopy.splice(idx, 1)\n\t\t\t\t} else if (idx == -1) {\n\t\t\t\t\ttw.$id = d.tw.$id\n\t\t\t\t\ttwListCopy.push(tw)\n\t\t\t\t} else twListCopy[idx] = tw\n\t\t\t\tthis.twList = twListCopy\n\t\t\t\tthis.update(this)\n\t\t\t}\n\t\t} as any\n\n\t\tif (this.state) {\n\t\t\t_opts.activeCohort = this.state.activeCohort\n\t\t}\n\n\t\tif (this.app.opts?.genome) {\n\t\t\t_opts.genomeObj = this.app.opts.genome\n\t\t}\n\t\tconst termsettingOpts = Object.assign({}, _opts, this.customInputs)\n\t\tconst pill = await termsettingInit(termsettingOpts)\n\t\treturn pill\n\t}\n\n\tasync renderTerm(d, numericOpts = false) {\n\t\tif (!d?.pill) return\n\t\tconst pillOps = this.getPillOpts(d, numericOpts)\n\t\tawait d.pill.main(pillOps)\n\t}\n\n\tgetPillOpts(d, numericOpts) {\n\t\tconst pillOps: any = {\n\t\t\tterm: d.tw.term,\n\t\t\tq: d.tw.q\n\t\t}\n\t\tif (d.tw.$id) pillOps.$id = d.tw.$id\n\t\tif (this.state) {\n\t\t\tpillOps.activeCohort = this.state.activeCohort\n\t\t\tpillOps.filter = this.state?.termfilter?.filter\n\t\t}\n\t\tif (numericOpts) {\n\t\t\tpillOps.numericEditMenuVersion = ['continuous', 'discrete']\n\t\t}\n\t\treturn pillOps\n\t}\n}\n\nfunction setRenderers(self) {\n\tself.update = () => {\n\t\tself.dom.tws.selectAll('div').remove()\n\t\tconst twListCopy = self.twList.map(tw => {\n\t\t\treturn { tw }\n\t\t})\n\n\t\tif (twListCopy.length < self.maxNum) {\n\t\t\t/** Insert a blank tw to trigger a new termsetting init\n\t\t\t * until limit is reached */\n\t\t\ttwListCopy.push({ tw: { $id: Math.random().toString() } } as any)\n\t\t}\n\t\tconst tws = self.dom.tws.selectAll(':scope>.sjpp-edit-ui-pill').data(twListCopy, d => d.tw?.$id)\n\t\ttws.exit().remove()\n\t\ttws.each(self.renderTerm)\n\t\ttws.enter().append('div').attr('class', 'sjpp-edit-ui-pill').each(self.addTerm)\n\n\t\t//Disable submit if user did not remove terms from input list and did not select any terms\n\t\tself.dom.submitBtn.property('disabled', self.twList.length === 0 && self.inputListLength == 0)\n\t\t//Show message if terms are removed or if list is empty\n\t\tself.dom.footer.text(\n\t\t\t`${\n\t\t\t\tself.twList.length === 0 && self.inputListLength > 0 ? `Terms removed` : `${self.twList.length} terms selected`\n\t\t\t}`\n\t\t)\n\t}\n\n\tself.addTerm = async function (d) {\n\t\tconst div = select(this)\n\t\td.pill = await self.getNewPill(d, div)\n\t\tself.renderTerm(d, true)\n\t}\n}\n", "import { keyupEnter } from '#src/client'\n\n/*\nconfigure numeric axis\n* automatic\n* fixed min and max\n* percentile max\n\n\narg{}\n\n- holder\n\trequired\n\n- callback({})\n\trequired\n\tcallback parameter should be one of following 3:\n\t{auto:1}\n\t{fixed:{ min:, max:}}\n\t{percentile:}\n\n- setting{}\n\toptional\n\tone of the 3 callback() parameters to populate the ui\n\n- noPercentile:true\n\tif set, do not allow setting percentile\n*/\n\nexport function makeNumericAxisConfig({ holder, callback, setting, noPercentile }) {\n\tif (!holder) throw 'no holder'\n\tif (typeof callback != 'function') throw 'callback not function'\n\n\tif (!setting) setting = { auto: 1 }\n\tif (setting.auto) {\n\t} else if (setting.fixed) {\n\t\tif (!Number.isFinite(setting.fixed.min)) throw 'fixed.min is not number'\n\t\tif (!Number.isFinite(setting.fixed.max)) throw 'fixed.max is not number'\n\t\tif (setting.fixed.min >= setting.fixed.max) throw 'fixed min>=max'\n\t} else if (setting.percentile) {\n\t\tif (setting.percentile < 0 || setting.percentile > 100) throw 'invalid setting.percentile'\n\t} else {\n\t\tthrow 'invalid setting{}'\n\t}\n\n\tconst row = holder.append('div')\n\trow.append('span').html('Y scale ')\n\tconst ss = row.append('select')\n\tconst op1 = ss.append('option').text('Automatic')\n\tconst op2 = ss.append('option').text('Fixed')\n\tlet op3\n\tif (!noPercentile) op3 = ss.append('option').text('Percentile')\n\n\tss.on('change', event => {\n\t\tconst si = event.target.selectedIndex\n\t\tif (si == 0) {\n\t\t\tfixedDiv.style('display', 'none')\n\t\t\tpercentileDiv.style('display', 'none')\n\t\t\tcallback({ auto: 1 })\n\t\t\treturn\n\t\t}\n\t\tif (si == 1) {\n\t\t\tfixedDiv.style('display', '')\n\t\t\tmaxInput.node().focus()\n\t\t\tpercentileDiv.style('display', 'none')\n\t\t\treturn\n\t\t}\n\t\tfixedDiv.style('display', 'none')\n\t\tpercentileDiv.style('display', '')\n\t\tperInput.node().focus()\n\t})\n\n\tss.property('selectedIndex', setting.auto ? 0 : setting.fixed ? 1 : 2)\n\n\t// following code generates 3 <input> that are accessed upon select change\n\tlet maxInput, minInput, perInput\n\n\t// when \"fixed\" is selected, these controls are shown to enter fixed min/max\n\tconst fixedDiv = row\n\t\t.append('div')\n\t\t.style('margin', '10px')\n\t\t.style('display', setting.fixed ? 'block' : 'none')\n\t{\n\t\tconst row1 = fixedDiv.append('div')\n\t\trow1.append('span').html('Max ').style('font-family', 'Courier').style('font-size', '.9em')\n\t\tmaxInput = row1.append('input').attr('type', 'number').style('width', '50px')\n\t\tif (setting.fixed) maxInput.property('value', setting.fixed.max)\n\t\tconst row2 = fixedDiv.append('div')\n\t\trow2.append('span').html('Min ').style('font-family', 'Courier').style('font-size', '.9em')\n\t\tminInput = row2.append('input').attr('type', 'number').style('width', '50px')\n\t\tif (setting.fixed) minInput.property('value', setting.fixed.min)\n\t\trow2\n\t\t\t.append('button')\n\t\t\t.text('Set')\n\t\t\t.style('margin-left', '5px')\n\t\t\t.on('click', () => {\n\t\t\t\tlet min, max\n\t\t\t\tmax = maxInput.property('value')\n\t\t\t\tif (max == '') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tmax = Number.parseFloat(max)\n\t\t\t\tif (Number.isNaN(max)) {\n\t\t\t\t\talert('invalid max value')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tmin = minInput.property('value')\n\t\t\t\tif (min == '') {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tmin = Number.parseFloat(min)\n\t\t\t\tif (Number.isNaN(min)) {\n\t\t\t\t\talert('invalid min value')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (min >= max) {\n\t\t\t\t\talert('Min must be smaller than max')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tcallback({ fixed: { min, max } })\n\t\t\t})\n\t}\n\n\t// when \"percentile\" is selected, these controls are shown to enter percentile value\n\tconst percentileDiv = row\n\t\t.append('div')\n\t\t.style('margin-top', '6px')\n\t\t.style('display', setting.percentile ? 'block' : 'none')\n\tpercentileDiv.append('span').html('Percentile ').style('font-family', 'Courier').style('font-size', '.9em')\n\tperInput = percentileDiv.append('input').attr('type', 'number').style('width', '50px')\n\tif (setting.percentile) {\n\t\tperInput.property('value', setting.percentile)\n\t}\n\tconst setpercentile = s => {\n\t\tif (s == '') return\n\t\tconst v = Number.parseInt(s)\n\t\tif (Number.isNaN(v) || v <= 0 || v > 100) {\n\t\t\talert('percentile should be integer within range 0-100')\n\t\t\treturn\n\t\t}\n\t\tcallback({ percentile: v })\n\t}\n\tperInput.on('keyup', event => {\n\t\tif (!keyupEnter(event)) return\n\t\tsetpercentile(perInput.property('value'))\n\t})\n\tpercentileDiv\n\t\t.append('button')\n\t\t.text('Set')\n\t\t.style('margin-left', '5px')\n\t\t.on('click', () => {\n\t\t\tsetpercentile(perInput.property('value'))\n\t\t})\n}\n", "import type { Elem, Input } from '../types/d3'\n\n/* makes radio buttons */\n\ntype RadioButtonOpts = {\n\t/** Fires .oninput. Intended for general use. */\n\tcallback?: (f?: any) => void\n\t/** Required. */\n\tholder: any\n\t/** common Name of <input>, use random number if not given */\n\tinputName?: string | number\n\t/** Mass ui specific logic. Optional callback methods for\n\t * non oninput events. Intended to address needs for assistive techology\n\t */\n\tlisteners?: {\n\t\t/** Fires on onmouseup and onkeyup for the button and text label\n\t\t */\n\t\tinput: () => void\n\t}\n\t/** arr of objs defining the radio buttons and properties */\n\toptions: OptionEntry[]\n\t/** css to be applied to each <div> of the options\n\t * e.g. { \"padding\":\"5px\", \"display\":\"inline-block\" }\n\t */\n\tstyles?: { [index: string]: string | number }\n\t/** Legacy support for deprecated radio2 input option, will be mapped to wrapper div display */\n\tlabelDisplay?: string\n}\n\ntype OptionEntry = {\n\t/** only set for only *one* option */\n\tchecked?: boolean | number\n\t/** Text shown in the span to the right of the radio button */\n\tlabel: string\n\t/** Text shown in tooltip */\n\ttitle?: string\n\t/** Should correspond to 'currValue' in callbacks */\n\tvalue: string | number | boolean\n}\n\ntype RadioApi = {\n\t/** Divs containing the labels with the padding and display styles applied. */\n\tdivs: Elem\n\t/** Divs encapsulating the radio buttons and text. All styles provided in opts\n\t * applied here. */\n\tlabels: Elem\n\t/** Radio buttons, corresponding to the .options[] opt. */\n\tinputs: Input\n\t/** Trigger changing the checked button from the cooresponding value,\n\t * independent of user and other callbacks. */\n\tmain: (value: number) => void\n}\n\nlet nameSuffix = 0\n\nexport function make_radios(opts: RadioButtonOpts): RadioApi {\n\tif (!opts.callback && !opts.listeners) throw `Missing event callback for radios [#dom/radiobutton.js]`\n\tif (opts.callback && opts.listeners)\n\t\tthrow `Both callback() and .listeners defined [#dom/radiobutton.js]. Only supply one.`\n\tconst inputName = opts.inputName || 'pp-dom-radio-' + nameSuffix++\n\n\tif (!opts.styles) opts.styles = {}\n\tif (!opts.styles.display) {\n\t\tif (opts.labelDisplay) opts.styles.display = opts.labelDisplay\n\t\telse {\n\t\t\t// no style specified. compute automatic style. if total length of all options is small,\n\t\t\t// show all options in one row; otherwise one row per option. this allows to limit width in 2-col edit menu setting\n\t\t\t// count by total number of characters. radio button counts as 4 characters\n\t\t\tconst len = opts.options.reduce((total, d) => total + d.label.length + 4, 0)\n\t\t\topts.styles.display = len < 36 ? 'inline-block' : 'block'\n\t\t}\n\t}\n\tconst styleKeys = Object.keys(opts.styles)\n\tif (!styleKeys.includes('padding')) opts.styles.padding = '3px'\n\n\tconst divs = opts.holder\n\t\t.selectAll('div')\n\t\t.data(opts.options, (d: any) => d?.value)\n\t\t.enter()\n\t\t.append('div')\n\t\t.attr('aria-label', (d: OptionEntry) => d.title)\n\t\t//.style('display', opts.styles.display)\n\t\t.style('padding', opts.styles.padding)\n\n\tif (opts.styles) {\n\t\tfor (const k in opts.styles) {\n\t\t\t// apply opts.styles to div, instead of labels\n\t\t\tdivs.style(k, opts.styles[k])\n\t\t}\n\t}\n\n\tconst labels = divs.append('label')\n\tconst inputs = labels\n\t\t.append('input')\n\t\t.attr('type', 'radio')\n\t\t.attr('name', inputName)\n\t\t.attr('value', (d: OptionEntry) => d.value)\n\t\t/** vertical-align = top was the default in the now deleted radio2.js\n\t\t * used exclusively for mass. Allow for mass to implement this style\n\t\t * without impeding other use cases.*/\n\t\t.style('vertical-align', opts.styles && 'vertical-align' in opts.styles ? opts.styles['vertical-align'] : '')\n\t\t.style('margin-top', '2px')\n\t\t.style('margin-right', 0)\n\t\t.property('checked', (d: OptionEntry) => d?.checked)\n\tif (opts.callback) {\n\t\tinputs.on('input', async (event: KeyboardEvent, d: OptionEntry) => {\n\t\t\t//Disable the radio buttons while the callback is running\n\t\t\tinputs.property('disabled', true)\n\t\t\tif (!opts.callback) return //So eslint doesn't complain\n\t\t\tawait opts.callback(d.value)\n\t\t\tradio.main(d.value)\n\t\t\t//Re-enable the radio buttons after the callback finishes\n\t\t\tinputs.property('disabled', false)\n\t\t})\n\t}\n\n\tconst radioText = labels\n\t\t.append('span')\n\t\t.style('vertical-align', opts.styles && 'vertical-align' in opts.styles ? opts.styles['vertical-align'] : '')\n\t\t.html((d: OptionEntry) => ' ' + d.label)\n\n\tif (opts?.listeners?.input) {\n\t\t//Mass UI specific logic for assistive technologies\n\t\tinputs.on('mouseup', opts.listeners.input).on('keyup', opts.listeners.input)\n\t\tradioText.on('mouseup', opts.listeners.input).on('keyup', opts.listeners.input)\n\t}\n\n\tconst radio = {\n\t\tdivs,\n\t\tlabels,\n\t\tinputs,\n\t\tmain(currValue: string | number | boolean) {\n\t\t\tradio['currValue'] = currValue\n\t\t\tinputs.property('checked', (d: OptionEntry) => d.value == radio['currValue'])\n\t\t}\n\t}\n\n\treturn radio\n}\n", "import { icons } from './control.icons'\nimport type { ClientGenome } from '../types/clientGenome'\nimport type { Elem } from '../types/d3'\nimport type { RenderSandboxForm, NewSandboxOpts, NewSandbox } from './types/sandbox'\n\n/*\nCreates sandbox divs, containers running proteinpaint calls, forms, etc. \nindependent of one another. \n\nRequired:\n.holder\n.genomes\n\n****************\n\tEXPORTED\n****************\nrenderSandboxFormDiv\nnewSandboxDiv\n*/\n\nexport function renderSandboxFormDiv(holder: Elem, genomes: ClientGenome[]): RenderSandboxForm {\n\t//Classes for unit testing\n\tholder.classed('sjpp-sandbox-form', true)\n\tconst inputdiv = holder\n\t\t.append('div')\n\t\t.style('margin', '40px 20px 20px 20px')\n\t\t.classed('sjpp-sandbox-form-inputDiv', true)\n\tconst p = inputdiv.append('p').classed('sjpp-sandbox-form-gselect', true)\n\tp.append('span').html('Genome ')\n\tconst gselect = p.append('select')\n\tfor (const n in genomes) {\n\t\tgselect.append('option').text(n)\n\t}\n\t//For file select, pathway input, etc.\n\tconst filediv = inputdiv.append('div').style('margin', '20px 0px').classed('sjpp-sandbox-form-fileDiv', true)\n\t//For error messages\n\tconst saydiv = holder.append('div').style('margin', '10px 20px').classed('sjpp-sandbox-form-sayDiv', true)\n\t//For displaying output\n\tconst visualdiv = holder.append('div').style('margin', '20px').classed('sjpp-sandbox-form-visualDiv', true)\n\treturn [inputdiv, gselect.node(), filediv, saydiv, visualdiv]\n}\n\nconst plotIdToSandboxId = {}\nconst sandboxIdStr = Math.random().toString().slice(-6) + '-' + (+new Date()).toString().slice(-8)\nlet sandboxIdSuffix = 0\n\n/*\n\tsandbox_holder: a d3-selection\n*/\n\nexport function newSandboxDiv(sandbox_holder: Elem, opts: Partial<NewSandboxOpts> = {}): NewSandbox {\n\t// NOTE: plotId=0 (Number) will not be tracked, assumes a non-empty plotId is used\n\tconst insertSelector = opts.beforePlotId\n\t\t? opts.beforePlotId in plotIdToSandboxId\n\t\t\t? '#' + plotIdToSandboxId[opts.beforePlotId]\n\t\t\t: `#${opts.beforePlotId}`\n\t\t: ':first-child'\n\tconst app_div = sandbox_holder.insert('div', insertSelector).attr('class', 'sjpp-sandbox')\n\tlet sandboxId: string\n\tif (opts.plotId) {\n\t\tsandboxId = `sjpp-sandbox-${sandboxIdStr}-${sandboxIdSuffix++}`\n\t\tapp_div.attr('id', sandboxId)\n\t\tplotIdToSandboxId[opts.plotId] = sandboxId\n\t}\n\n\tconst header_row = app_div\n\t\t.append('div')\n\t\t.attr('class', 'sjpp-output-sandbox-header')\n\t\t.style('width', opts.style?.width || '95vw')\n\t\t.style('border', '1px solid #ccc')\n\t\t.style('display', 'flex')\n\t\t.style('align-items', 'center')\n\t\t.style('justify-content', 'left')\n\n\tconst hoverInColor = 'blue'\n\tconst hoverOutColor = 'black'\n\n\t// close_btn\n\tconst closeBtn = header_row\n\t\t.append('div')\n\t\t.classed('sjpp-output-sandbox-close-bt', true)\n\t\t// .classed('sja_menuoption', true)\n\t\t.style('cursor', 'pointer')\n\t\t.style('vertical-align', 'middle')\n\t\t.on('mouseenter', () => {\n\t\t\tconst path = closeBtn.select('path')\n\t\t\tpath.attr('stroke', hoverInColor)\n\t\t})\n\t\t.on('mouseleave', () => {\n\t\t\tconst path = closeBtn.select('path')\n\t\t\tpath.attr('stroke', hoverOutColor)\n\t\t})\n\t\t.html(\n\t\t\t`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#000\" class=\"bi bi-x-lg\" viewBox=\"0 0 16 16\">\n\t\t <path stroke='#000' d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n\t\t</svg>`\n\t\t)\n\t\t.on('mousedown', event => {\n\t\t\tdocument.body.dispatchEvent(new Event('mousedown'))\n\t\t\tevent.stopPropagation()\n\t\t})\n\t\t.on('click', () => {\n\t\t\t// clear event handlers\n\t\t\theader_row.on('click', null).on('mousedown', null)\n\t\t\tapp_div.selectAll('*').remove()\n\t\t\tif (typeof opts.close === 'function') opts.close()\n\t\t})\n\n\t// placeholder for collapse btn\n\tconst collapseBtnDiv = header_row\n\t\t.append('div')\n\t\t.attr('title', 'Click to collapse or expand this chart sandbox')\n\t\t.classed('sjpp-output-sandbox-collapse-btn', true)\n\t// .classed('sja_menuoption', true)\n\t//.style('vertical-align', 'middle')\n\n\t// placeholder for expand btn\n\tconst expandBtnDiv = header_row\n\t\t.append('div')\n\t\t.classed('sjpp-output-sandbox-expand-btn', true)\n\t\t// .classed('sja_menuoption', true)\n\t\t.style('display', 'none')\n\t//.style('vertical-align', 'sub')\n\n\tconst header = header_row\n\t\t.append('div')\n\t\t.attr('id', 'sandbox-header-text')\n\t\t.style('display', 'inline-flex')\n\t\t.style('align-items', 'center')\n\t\t.style('justify-content', 'left')\n\t\t.style('padding', '5px 10px')\n\n\tconst body = app_div\n\t\t.append('div')\n\t\t.attr('class', 'sjpp-output-sandbox-content sjpp_show_scrollbar')\n\t\t.style('width', opts.style?.width || '95vw')\n\n\tlet isSandboxContentVisible = true\n\n\t// Collapse btn\n\ticons['collapse'](collapseBtnDiv, {\n\t\tfontSize: '1.5em',\n\t\tpadding: '4px 10px',\n\t\tcolor: 'black',\n\t\thandler: expandCollapse\n\t})\n\t// Expand btn\n\ticons['expand'](expandBtnDiv, {\n\t\tfontSize: '1.5em',\n\t\tpadding: '4px 10px',\n\t\tcolor: 'black',\n\t\tdisplay: 'none',\n\t\thandler: expandCollapse\n\t})\n\n\tcollapseBtnDiv\n\t\t.on('mouseenter', () => {\n\t\t\tconst path = collapseBtnDiv.select('path')\n\t\t\tpath.attr('stroke', hoverInColor)\n\t\t})\n\t\t.on('mouseleave', () => {\n\t\t\tconst path = collapseBtnDiv.select('path')\n\t\t\tpath.attr('stroke', hoverOutColor)\n\t\t})\n\n\texpandBtnDiv\n\t\t.on('mouseenter', () => {\n\t\t\tconst path = expandBtnDiv.select('path')\n\t\t\tpath.attr('stroke', hoverInColor)\n\t\t})\n\t\t.on('mouseleave', () => {\n\t\t\tconst path = expandBtnDiv.select('path')\n\t\t\tpath.attr('stroke', hoverOutColor)\n\t\t})\n\n\tfunction expandCollapse() {\n\t\tisSandboxContentVisible = !isSandboxContentVisible\n\t\tcollapseBtnDiv.style('display', isSandboxContentVisible == true ? 'inline-block' : 'none')\n\t\texpandBtnDiv.style('display', isSandboxContentVisible == true ? 'none' : 'inline-block')\n\t\tbody.style('display', isSandboxContentVisible == true ? 'block' : 'none')\n\t}\n\n\treturn { header_row, header, body, app_div, id: sandboxId! }\n}\n", "import { debounce } from 'debounce'\nimport { Menu } from '#dom/menu'\nimport type { Selection } from 'd3-selection'\nimport { select } from 'd3-selection'\nimport { keyupEnter } from '../src/client'\nimport { throwMsgWithFilePathAndFnName } from './sayerror'\nimport type { Elem, Input, Span } from '../types/d3'\n\ntype SearchGroupEntry = {\n\t/** Text appearing above the search results group */\n\ttitle: string\n\t/** Array items to search. Maybe string char, objs, etc.\n\t * Buttons text determined by either item.name || item.label if an object\n\t * or as item, if item is a string\n\t */\n\titems: any[]\n\t/** Set the default callback behavior if no item(s) appear*/\n\tdefault: boolean\n\t/** Default color for buttons is light grey. Specify color for the group */\n\tcolor?: string\n\t/** Callback for onclick or onenter */\n\tcallback: (f: any) => any\n}\n\ntype InputSearchOpts = {\n\tholder: Elem\n\t/** can be async or synchronous search */\n\tsearchItems: () => Promise<SearchGroupEntry[]> | SearchGroupEntry[]\n\tapp?: any\n\t/** Menu tip. If not provided, created by default */\n\ttip?: any\n\t/** Add any css style here */\n\tstyle?: any\n\t/**Size of the input field */\n\tsize?: number\n\tplaceholder?: string\n\ttitle?: string\n}\n\nexport class InputSearch {\n\tholder: Elem\n\tinput: Input\n\treadonly tip: any\n\tsearchItems: () => Promise<SearchGroupEntry[]> | SearchGroupEntry[]\n\tstyle: any\n\tsize: number\n\tplaceholder: string\n\t/** Title for input, not title above each group */\n\ttitle: string\n\tapp: any\n\n\tconstructor(opts: InputSearchOpts) {\n\t\tthis.holder = opts.holder\n\t\tthis.input = opts.holder.append('input')\n\t\tthis.tip = opts.tip || new Menu({ border: '', padding: '0px' })\n\t\tthis.style = opts.style || {}\n\t\tthis.size = opts.size || 20\n\t\tthis.placeholder = opts.placeholder || ''\n\t\tthis.title = opts.title || ''\n\t\tthis.searchItems = opts.searchItems\n\t\tthis.app = opts.app\n\t}\n\n\tinitUI() {\n\t\tthis.holder.style('padding', 'padding' in this.style ? this.style.padding : '5px').style('display', 'inline-block')\n\t\tthis.input\n\t\t\t.attr('class', 'sjpp-input-search')\n\t\t\t.style('border', 'border' in this.style ? this.style.border : '5px')\n\t\t\t.attr('size', this.size)\n\t\t\t.attr('placeholder', this.placeholder)\n\t\t\t.attr('aria-label', this.title)\n\t\t\t.on('keyup', async (event: KeyboardEvent) => {\n\t\t\t\tif (keyupEnter(event)) await this.enterSearch()\n\t\t\t\tdebounce(this.addSearchItems(), 400)\n\t\t\t})\n\t}\n\n\tasync addSearchItems() {\n\t\tif (!this.input.property('value').trim()) {\n\t\t\tthis.tip.hide()\n\t\t\treturn\n\t\t}\n\t\ttry {\n\t\t\tthis.tip.clear().showunder(this.input.node())\n\n\t\t\tconst resultsWrapper = this.tip.d.append('div')\n\t\t\tconst results = await this.searchItems()\n\n\t\t\tawait resultsWrapper\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'flex')\n\t\t\t\t.selectAll()\n\t\t\t\t.data(results.filter(r => r.items?.length >= 1))\n\t\t\t\t.enter()\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'block')\n\t\t\t\t.style('border-left', '0.5px solid lightgrey')\n\t\t\t\t.each(this.showResultsList)\n\t\t} catch (e: any) {\n\t\t\tif (e.stack) console.error(e.stack)\n\t\t\telse throwMsgWithFilePathAndFnName(e)\n\t\t}\n\t}\n\n\tasync showResultsList(\n\t\tthis: Element,\n\t\tresult: SearchGroupEntry & {\n\t\t\twrapper: Selection<Element, any, any, any>\n\t\t\ttitleDiv: Span\n\t\t}\n\t) {\n\t\tresult.wrapper = select(this)\n\t\tresult.wrapper.style('padding', '5px')\n\t\tresult.titleDiv = result.wrapper\n\t\t\t.append('span')\n\t\t\t.style('padding', '3px 0px 5px')\n\t\t\t.style('opacity', 0.65)\n\t\t\t.style('font-size', '0.8em')\n\t\t\t.text(result.title)\n\n\t\tawait result.wrapper\n\t\t\t.append('div')\n\t\t\t.classed('sjpp-result-wrapper', true)\n\t\t\t.selectAll('div')\n\t\t\t.data(result.items)\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.classed('sjpp-search-result', true)\n\t\t\t.style('display', 'block')\n\t\t\t.style('padding-left', '10px')\n\t\t\t.style('background-color', result.color || '')\n\t\t\t.text((d: any) => d.name || d.label || d.title || d)\n\t\t\t.on('click', (event: MouseEvent, item: any) => {\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tresult.callback(item)\n\t\t\t\t/** Use tip.hide() in callback,\n\t\t\t\t * This will allow the tip to remain open for other\n\t\t\t\t * use cases.\n\t\t\t\t * */\n\t\t\t})\n\t}\n\n\tasync enterSearch() {\n\t\tif (!this.input.property('value').trim()) return\n\t\tconst wrapper = this.tip.d.select('.sjpp-result-wrapper').node()\n\t\tconst result = this.tip.d.select('.sjpp-search-result').node()\n\t\tif (result != null && result.__data__) wrapper.__data__.callback(result.__data__)\n\t\telse {\n\t\t\tconst results = await this.searchItems()\n\t\t\tconst defaultCallback = results.filter(d => d.default)\n\t\t\tdefaultCallback[0].callback(this.input.property('value'))\n\t\t}\n\t\tthis.input.property('value', '')\n\t\tthis.tip.hide()\n\t}\n\n\tupdatePlaceholder(placeholder: string) {\n\t\tthis.input.attr('placeholder', placeholder)\n\t}\n}\n", "import { select as d3select } from 'd3-selection'\n\n//Icons from bootstrap: https://icons.getbootstrap.com/\nexport const shapes = {\n\t//circle filled\n\tfilledCircle: {\n\t\tpath: 'M 8,8 m 8,0 a 8,8 0 1,0 -16,0 a 8,8 0 1,0 16,0',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { radius: 16 }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { radius } = _opts\n\n\t\t\treturn `M${radius},0 A${radius},${radius} 0 1,1 ${-radius},0 A${radius},${radius} 0 1,1 ${radius},0 Z`\n\t\t},\n\t\tisFilled: true\n\t},\n\n\t//rectangle empty\n\t// https://icons.getbootstrap.com/icons/file/\n\temptyVerticalRectangle: {\n\t\tpath: 'M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zm0 1h8a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { height: 16, width: 16 }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { width, height } = _opts\n\n\t\t\treturn `M-${width / 2},-${height / 2}h${width}v${height}h-${width}z`\n\t\t},\n\t\tisFilled: false\n\t},\n\n\t//circle empty\n\t//https://icons.getbootstrap.com/icons/circle/\n\temptyCircle: {\n\t\tpath: 'M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { radius: 16 }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { radius } = _opts\n\n\t\t\treturn `M${radius},0 A${radius},${radius} 0 1,1 ${-radius},0 A${radius},${radius} 0 1,1 ${radius},0 Z`\n\t\t},\n\t\tisFilled: false\n\t},\n\n\t// shield empty\n\t// https://icons.getbootstrap.com/icons/shield/\n\temptyShield: {\n\t\tpath: 'M5.338 1.59a61 61 0 0 0-2.837.856.48.48 0 0 0-.328.39c-.554 4.157.726 7.19 2.253 9.188a10.7 10.7 0 0 0 2.287 2.233c.346.244.652.42.893.533q.18.085.293.118a1 1 0 0 0 .101.025 1 1 0 0 0 .1-.025q.114-.034.294-.118c.24-.113.547-.29.893-.533a10.7 10.7 0 0 0 2.287-2.233c1.527-1.997 2.807-5.031 2.253-9.188a.48.48 0 0 0-.328-.39c-.651-.213-1.75-.56-2.837-.855C9.552 1.29 8.531 1.067 8 1.067c-.53 0-1.552.223-2.662.524zM5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.8 11.8 0 0 1-2.517 2.453 7 7 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7 7 0 0 1-1.048-.625 11.8 11.8 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 63 63 0 0 1 5.072.56',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { width: 16, height: 24 }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { width, height } = _opts\n\n\t\t\tconst halfWidth = width / 2\n\t\t\tconst arcRadius = halfWidth\n\n\t\t\treturn `M-${halfWidth},-${height / 2} A${arcRadius},${arcRadius} 0 0,1 ${halfWidth},-${\n\t\t\t\theight / 2\n\t\t\t} L${halfWidth},${height * 0.1} L0,${height / 2} L-${halfWidth},${height * 0.1} Z`\n\t\t},\n\t\tisFilled: false\n\t},\n\n\t// triangle filled\n\t// https://icons.getbootstrap.com/icons/triangle-fill/\n\tfilledTriangle: {\n\t\tpath: 'M7.022 1.566a1.13 1.13 0 0 1 1.96 0l6.857 11.667c.457.778-.092 1.767-.98 1.767H1.144c-.889 0-1.437-.99-.98-1.767z',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { height: 16, width: 16, isUp: true }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { width, height, isUp } = _opts\n\n\t\t\tconst xOffset = width / 2\n\t\t\tconst yOffset = height / 2\n\n\t\t\tconst p1 = isUp ? `M0,-${yOffset}` : `M0,${yOffset}`\n\t\t\tconst p2 = isUp ? `L${xOffset},${yOffset}` : `L${xOffset},-${yOffset}`\n\t\t\tconst p3 = isUp ? `L-${xOffset},${yOffset}` : `L-${xOffset},-${yOffset}`\n\n\t\t\treturn `${p1} ${p2} ${p3} Z`\n\t\t},\n\t\tisFilled: true\n\t},\n\n\t//triangle empty\n\t//https://icons.getbootstrap.com/icons/triangle/\n\temptyTriangle: {\n\t\tpath: 'M7.938 2.016A.13.13 0 0 1 8.002 2a.13.13 0 0 1 .063.016.15.15 0 0 1 .054.057l6.857 11.667c.036.06.035.124.002.183a.2.2 0 0 1-.054.06.1.1 0 0 1-.066.017H1.146a.1.1 0 0 1-.066-.017.2.2 0 0 1-.054-.06.18.18 0 0 1 .002-.183L7.884 2.073a.15.15 0 0 1 .054-.057m1.044-.45a1.13 1.13 0 0 0-1.96 0L.165 13.233c-.457.778.091 1.767.98 1.767h13.713c.889 0 1.438-.99.98-1.767z',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { height: 16, width: 16, isUp: true }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { width, height, isUp } = _opts\n\n\t\t\tconst xOffset = width / 2\n\t\t\tconst yOffset = height / 2\n\n\t\t\tconst p1 = isUp ? `M0,-${yOffset}` : `M0,${yOffset}`\n\t\t\tconst p2 = isUp ? `L${xOffset},${yOffset}` : `L${xOffset},-${yOffset}`\n\t\t\tconst p3 = isUp ? `L-${xOffset},${yOffset}` : `L-${xOffset},-${yOffset}`\n\n\t\t\treturn `${p1} ${p2} ${p3} Z`\n\t\t},\n\t\tisFilled: false\n\t},\n\n\t//shield filled\n\tfilledShield: {\n\t\tpath: 'M5.072.56C6.157.265 7.31 0 8 0s1.843.265 2.928.56c1.11.3 2.229.655 2.887.87a1.54 1.54 0 0 1 1.044 1.262c.596 4.477-.787 7.795-2.465 9.99a11.8 11.8 0 0 1-2.517 2.453 7 7 0 0 1-1.048.625c-.28.132-.581.24-.829.24s-.548-.108-.829-.24a7 7 0 0 1-1.048-.625 11.8 11.8 0 0 1-2.517-2.453C1.928 10.487.545 7.169 1.141 2.692A1.54 1.54 0 0 1 2.185 1.43 63 63 0 0 1 5.072.56',\n\t\tisFilled: true\n\t},\n\n\t//diamond filled\n\tfilledDiamond: {\n\t\tpath: 'M6.95.435c.58-.58 1.52-.58 2.1 0l6.515 6.516c.58.58.58 1.519 0 2.098L9.05 15.565c-.58.58-1.519.58-2.098 0L.435 9.05a1.48 1.48 0 0 1 0-2.098z',\n\t\tisFilled: true\n\t},\n\n\t//cross large\n\tlargeCross: {\n\t\tpath: 'M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z'\n\t},\n\n\t//diamond empty\n\temptyDiamond: {\n\t\tpath: 'M8.384 1.226a.463.463 0 0 0-.768 0l-4.56 6.468a.54.54 0 0 0 0 .612l4.56 6.469a.463.463 0 0 0 .768 0l4.56-6.469a.54.54 0 0 0 0-.612zM6.848.613a1.39 1.39 0 0 1 2.304 0l4.56 6.468a1.61 1.61 0 0 1 0 1.838l-4.56 6.468a1.39 1.39 0 0 1-2.304 0L2.288 8.92a1.61 1.61 0 0 1 0-1.838z',\n\t\tisFilled: false\n\t},\n\n\t//plus\n\tplusIcon: {\n\t\tpath: 'M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2'\n\t},\n\n\t// egg filled\n\tfilledEgg: {\n\t\tpath: 'M14 10a6 6 0 0 1-12 0C2 5.686 5 0 8 0s6 5.686 6 10',\n\t\tisFilled: true\n\t},\n\n\t//pentagon filled\n\tfilledPentagon: {\n\t\tpath: 'M7.685.256a.5.5 0 0 1 .63 0l7.421 6.03a.5.5 0 0 1 .162.538l-2.788 8.827a.5.5 0 0 1-.476.349H3.366a.5.5 0 0 1-.476-.35L.102 6.825a.5.5 0 0 1 .162-.538l7.42-6.03Z',\n\t\tisFilled: true\n\t},\n\n\t//egg empty\n\temptyEgg: {\n\t\tpath: 'M8 15a5 5 0 0 1-5-5c0-1.956.69-4.286 1.742-6.12.524-.913 1.112-1.658 1.704-2.164C7.044 1.206 7.572 1 8 1s.956.206 1.554.716c.592.506 1.18 1.251 1.704 2.164C12.31 5.714 13 8.044 13 10a5 5 0 0 1-5 5m0 1a6 6 0 0 0 6-6c0-4.314-3-10-6-10S2 5.686 2 10a6 6 0 0 0 6 6',\n\t\tisFilled: false\n\t},\n\n\t//pentagon empty\n\temptyPentagon: {\n\t\tpath: 'M7.685 1.545a.5.5 0 0 1 .63 0l6.263 5.088a.5.5 0 0 1 .161.539l-2.362 7.479a.5.5 0 0 1-.476.349H4.099a.5.5 0 0 1-.476-.35L1.26 7.173a.5.5 0 0 1 .161-.54l6.263-5.087Zm8.213 5.28a.5.5 0 0 0-.162-.54L8.316.257a.5.5 0 0 0-.631 0L.264 6.286a.5.5 0 0 0-.162.538l2.788 8.827a.5.5 0 0 0 .476.349h9.268a.5.5 0 0 0 .476-.35l2.788-8.826Z',\n\t\tisFilled: false\n\t},\n\n\t//suit diamond filled\n\tfilledDiamondSuit: {\n\t\tpath: 'M2.45 7.4 7.2 1.067a1 1 0 0 1 1.6 0L13.55 7.4a1 1 0 0 1 0 1.2L8.8 14.933a1 1 0 0 1-1.6 0L2.45 8.6a1 1 0 0 1 0-1.2',\n\t\tisFilled: true\n\t},\n\n\t//square empty\n\t//https://icons.getbootstrap.com/icons/square/\n\temptySquare: {\n\t\tpath: 'M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2z',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { height: 16, width: 16 }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { width, height } = _opts\n\n\t\t\treturn `M-${width / 2},-${height / 2} h${width} v${height} h-${width} Z`\n\t\t},\n\t\tisFilled: false\n\t},\n\n\t//suit diamond empty\n\temptyDiamondSuit: {\n\t\tpath: 'M6.95.435c.58-.58 1.52-.58 2.1 0l6.515 6.516c.58.58.58 1.519 0 2.098L9.05 15.565c-.58.58-1.519.58-2.098 0L.435 9.05a1.48 1.48 0 0 1 0-2.098zm1.4.7a.495.495 0 0 0-.7 0L1.134 7.65a.495.495 0 0 0 0 .7l6.516 6.516a.495.495 0 0 0 .7 0l6.516-6.516a.495.495 0 0 0 0-.7L8.35 1.134z',\n\t\tisFilled: false\n\t},\n\n\t//cross\n\tcrossShape: {\n\t\tpath: 'M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708'\n\t},\n\n\t//square filled\n\t// https://icons.getbootstrap.com/icons/square-fill/\n\tfilledSquare: {\n\t\tpath: 'M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2z',\n\t\tcalculatePath(opts) {\n\t\t\tconst _opts = { height: 16, width: 16 }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { width, height } = _opts\n\n\t\t\treturn `M-${width / 2},-${height / 2} h${width} v${height} h-${width} Z`\n\t\t},\n\t\tisFilled: true\n\t},\n\n\t//rectangle filled\n\t// https://icons.getbootstrap.com/icons/file-fill/\n\tfilledVerticalRectangle: {\n\t\tpath: 'M4 0h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2',\n\t\tcalculatePath: opts => {\n\t\t\tconst _opts = { height: 16, width: 16 }\n\t\t\tObject.assign(_opts, opts)\n\t\t\tconst { width, height } = _opts\n\n\t\t\treturn `M-${width / 2},-${height / 2}h${width}v${height}h-${width}z`\n\t\t},\n\t\tisFilled: true\n\t}\n}\n\nexport const shapesArray = Object.values(shapes).map(shape => shape.path)\n\nexport function shapeSelector(div, callback, arr = shapesArray, opts = {}) {\n\tconst size = 20\n\tconst cols = 8\n\tconst height = Math.ceil(arr.length / cols) * size\n\tdiv.style('background-color', 'backgroundColor' in opts ? opts.backgroundColor : 'white')\n\tconst svg = div\n\t\t.append('div')\n\t\t.style('padding', '5px')\n\t\t.append('svg')\n\t\t.attr('width', size * cols)\n\t\t.attr('height', height)\n\tlet count = 0\n\tlet y = 0\n\tfor (const shape of arr) {\n\t\tconst index = count + y * cols\n\t\tsvg\n\t\t\t.append('path')\n\t\t\t.style('pointer-events', 'bounding-box')\n\t\t\t.style('fill', 'gray')\n\t\t\t.attr('d', shape)\n\t\t\t.attr('transform', `translate(${size * count}, ${y * size})`)\n\t\t\t.on('click', () => {\n\t\t\t\tcallback(index)\n\t\t\t})\n\t\t\t.on('mouseover', function () {\n\t\t\t\td3select(this).style('fill', 'black')\n\t\t\t})\n\t\t\t.on('mouseout', function () {\n\t\t\t\td3select(this).style('fill', 'gray')\n\t\t\t})\n\t\tcount++\n\t\tif (count % cols == 0) {\n\t\t\tcount = 0\n\t\t\ty++\n\t\t}\n\t}\n}\n", "import type { UrlTemplateSsm } from '#types'\n\n/*\nMake html links from one m object (m is ssm-simple somatic mutation, snvindel, or nonmutation)\nextendable to support multiple link formats\n\nArguments:\n\nssm_urls:\n\tsee type def\nm:\n\tvariant object\nvariantNameDom:\n\tdom (<span>) that's already rendered with the variant name. \n\tif ssm url config.shownSeparately=false , <a> tag is rendered into this <span>, so the link appears over the variant name\n\totherwise the new link html is added to separateUrls[] and returned\ngenome:\n\tonly used for regulomedb for now\n\nReturns:\n\nseparateUrls[]: array of html links (if ssm_urls is array) or html string (if ssm_urls is object)\n*/\nexport function makeSsmLink(\n\tssm_urls: UrlTemplateSsm | UrlTemplateSsm[],\n\tm: {\n\t\tchr?: string\n\t\tpos?: number\n\t},\n\tvariantNameDom: any,\n\tgenome: string\n) {\n\t// urls shown separately\n\tconst separateUrls: string[] = []\n\n\tif (Array.isArray(ssm_urls)) {\n\t\t// ssm_urls is array\n\t\tfor (const ssm_url of ssm_urls) {\n\t\t\tif (ssm_url.namekey == 'regulomedb') {\n\t\t\t\t// this key corresponds to hardcoded logic to build regulomedb link with special requirements that also include genome\n\t\t\t\tif (typeof m.chr == 'string' && m.pos !== undefined && Number.isInteger(m.pos)) {\n\t\t\t\t\tconst coord = `${m.chr}%3A${m.pos}-${m.pos + 1}`\n\t\t\t\t\tseparateUrls.push(\n\t\t\t\t\t\t`<a href=\"${ssm_url.base}regions=${coord}&genome=${genome == 'hg38' ? 'GRCh38' : genome}\" target=\"_blank\">${\n\t\t\t\t\t\t\tssm_url.linkText\n\t\t\t\t\t\t}</a>`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmakeGeneralLink(ssm_url, m, variantNameDom, separateUrls)\n\t\t}\n\t} else {\n\t\tmakeGeneralLink(ssm_urls, m, variantNameDom, separateUrls)\n\t}\n\treturn separateUrls\n}\n\nfunction makeGeneralLink(ssm_url: UrlTemplateSsm, m: object, variantNameDom: any, separateUrls: string[]) {\n\tconst mValue = m[ssm_url.namekey]\n\tif (mValue == undefined) return // m{} does not have valid value which is required to compose a url. do not make\n\n\tconst url = ssm_url.base + mValue\n\n\tif (ssm_url.shownSeparately) {\n\t\t// to generate a link separate from variantNameDom\n\t\tseparateUrls.push(`<a href=\"${url}\" target=\"_blank\">${ssm_url.linkText || mValue}</a>`)\n\t\treturn\n\t}\n\t// not showing separately\n\tvariantNameDom.html(`<a href=\"${url}\" target=\"_blank\">${variantNameDom.html()}</a>`)\n}\n", "import { select } from 'd3-selection'\nimport { ColorScale } from '#dom'\n\nexport default function svgLegend(opts) {\n\tlet currlinex = 0\n\tlet currliney = 0\n\tlet currG\n\n\tconst defaultSettings = {\n\t\tontop: false,\n\t\tlineh: 25,\n\t\tpadx: 5,\n\t\tpadleft: 0, //150,\n\t\tpadright: 20,\n\t\tpadbtm: 30,\n\t\tfontsize: 12,\n\t\ticonh: 10,\n\t\ticonw: 10,\n\t\thangleft: 1,\n\t\tlinesep: false,\n\t\tmutationorder: [\n\t\t\t'M',\n\t\t\t'E',\n\t\t\t'F',\n\t\t\t'N',\n\t\t\t'S',\n\t\t\t'D',\n\t\t\t'I',\n\t\t\t'P',\n\t\t\t'L',\n\t\t\t'Intron',\n\t\t\t'ITD',\n\t\t\t'DEL',\n\t\t\t'NLOSS',\n\t\t\t'CLOSS',\n\t\t\t'Utr3',\n\t\t\t'Utr5',\n\t\t\t'X',\n\t\t\t'noncoding',\n\t\t\t'Fuserna',\n\t\t\t'SV',\n\t\t\t'CNV_amplification',\n\t\t\t'CNV_homozygous_deletion',\n\t\t\t'CNV_amp',\n\t\t\t'CNV_loss',\n\t\t\t'CNV_loh',\n\t\t\t'snv',\n\t\t\t'mnv'\n\t\t],\n\t\titemOpacity: 1\n\t}\n\n\tconst settings = Object.assign(defaultSettings, opts.settings || {})\n\n\tfunction render(data, overrides = {}) {\n\t\tObject.assign(settings, overrides.settings || {})\n\t\tcurrlinex = settings.padleft\n\t\tcurrliney = 0\n\n\t\topts.holder.selectAll('g').remove()\n\t\topts.holder.selectAll('text').remove()\n\t\tconst d = settings.dimensions\n\t\tif (!opts.holder.attr('transform')) {\n\t\t\t// d.yOffset should be used instead of settings.svgh ???\n\t\t\topts.holder.attr('transform', settings.ontop ? null : `translate(${d.xOffset},${settings.svgh})`)\n\t\t}\n\t\tif (opts.note && data.length) {\n\t\t\topts.holder\n\t\t\t\t.append('text')\n\t\t\t\t.style('font-size', '0.8em')\n\t\t\t\t.text(opts.note)\n\t\t\t\t.attr('transform', `translate(-135, 15)`)\n\t\t\t\t.attr('font-style', 'italic')\n\t\t}\n\t\tconst l = opts.holder.selectAll('g').data(data)\n\n\t\tl.exit().remove()\n\t\tl.enter().append('g').each(addGroup)\n\n\t\treturn currliney + settings.lineh + settings.padbtm\n\t}\n\n\tfunction addGroup(d, i) {\n\t\tif (!d.items || !d.items.length) return\n\t\tcurrlinex = 0\n\t\tcurrliney += settings.lineh\n\n\t\tlet g = select(this).style('opacity', d.crossedOut ? '0.6' : 1)\n\t\tif (d.id) g = g.attr('id', d.id)\n\t\tif (d.class) g = g.attr('class', d.class)\n\t\tconst leftdist = settings.hangleft ? settings.padleft + settings.hangleft - settings.padx : settings.padleft\n\n\t\tconst grplabel = g\n\t\t\t.append('text')\n\t\t\t.attr('transform', 'translate(' + leftdist + ',' + (currliney + settings.iconh / 2) + ')')\n\t\t\t.attr('text-anchor', settings.hangleft ? 'end' : 'start')\n\t\t\t.attr('font-weight', 700)\n\t\t\t.attr('font-size', settings.fontsize)\n\t\t\t.attr('dominant-baseline', 'central')\n\t\t\t.text(d.name)\n\t\t\t.style('text-decoration', d.crossedOut ? 'line-through' : '')\n\n\t\tif (settings.linesep) {\n\t\t\tcurrlinex = settings.padleft\n\t\t\tcurrliney += settings.lineh\n\t\t} /* else if (d.hasScale) {\n\t\t\tcurrlinex = leftdist - 2 * settings.padx + 2\n\t\t} */ else if (d.hasScale || settings.hangleft) {\n\t\t\tcurrlinex = leftdist + 2 * settings.padx\n\t\t} else {\n\t\t\tcurrlinex += settings.padleft + grplabel.node().getBBox().width + 2 * settings.padx\n\t\t}\n\n\t\tif (d.sorter) d.items.sort(d.sorter)\n\n\t\tg.selectAll('g')\n\t\t\t.data(d.items)\n\t\t\t.enter()\n\t\t\t.append('g')\n\t\t\t//.attr('transform', 'translate(0,'+i*20+')')\n\t\t\t.each(addItem)\n\n\t\tconst bbox = grplabel.node().getBBox()\n\t\tif (Math.abs(bbox.y + bbox.height / 2) > 1) {\n\t\t\t// dominant-baseline is not supported, manually position\n\t\t\tgrplabel.attr('y', bbox.height / 4)\n\t\t}\n\t}\n\n\tfunction addItem(d, i) {\n\t\tconst g = select(this)\n\t\t\t.attr('transform', 'translate(' + currlinex + ',' + currliney + ')')\n\t\t\t.style('opacity', settings.itemOpacity)\n\t\t\t.style('opacity', d.greyedOut ? '0.6' : 1)\n\n\t\tconst itemlabel = g\n\t\t\t.append('text')\n\t\t\t.attr('transform', 'translate(' + (settings.iconw + settings.padx / 2) + ',' + settings.iconh / 2 + ')')\n\t\t\t.attr('font-size', settings.fontsize)\n\t\t\t.attr('dominant-baseline', 'central')\n\t\t\t.style('cursor', 'default')\n\t\t\t.style(\n\t\t\t\t'text-decoration',\n\t\t\t\t(settings.exclude && settings.exclude.classes && settings.exclude.classes.includes(d.class)) || d.crossedOut\n\t\t\t\t\t? 'line-through'\n\t\t\t\t\t: ''\n\t\t\t)\n\n\t\titemlabel.each(function (d) {\n\t\t\tconst t = select(this)\n\t\t\tif (settings.isExcludedAttr && d[settings.isExcludedAttr]) {\n\t\t\t\tt.style('text-decoration', 'line-through').style('opacity', 0.5)\n\t\t\t}\n\t\t\tif (typeof d.text == 'string') {\n\t\t\t\tt.text(d.text)\n\t\t\t} else if (Array.isArray(d.text)) {\n\t\t\t\tt.selectAll('tspan')\n\t\t\t\t\t.data(d.text)\n\t\t\t\t\t.enter()\n\t\t\t\t\t.append('tspan')\n\t\t\t\t\t.text(d => d)\n\t\t\t\t\t.attr('dominant-baseline', 'central')\n\t\t\t\t\t.attr('x', function (dd, i) {\n\t\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\t\tselect(this).attr('font-weight', 700)\n\t\t\t\t\t\t\td.lastx = select(this).node().getComputedTextLength() + 10\n\t\t\t\t\t\t\treturn 0\n\t\t\t\t\t\t} else if (d.lastx) {\n\t\t\t\t\t\t\treturn d.lastx\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (d.onClickCallback) {\n\t\t\t\tt.on('click', () => d.onClickCallback(d, t))\n\t\t\t\tt.style('cursor', 'pointer')\n\t\t\t}\n\t\t})\n\n\t\tconst bbox = itemlabel.node().getBBox()\n\t\tconst width = d.width || settings.iconw\n\t\tcurrlinex += bbox.width + width\n\t\tif (settings.linesep || currlinex > settings.svgw - settings.padright) {\n\t\t\tcurrliney += settings.lineh\n\t\t\tconst leftdist = !settings.hangleft ? settings.padleft : settings.padleft + settings.hangleft + settings.padx\n\n\t\t\tg.attr('transform', 'translate(' + leftdist + ',' + currliney + ')')\n\t\t\tcurrlinex = bbox.width + width + settings.padleft\n\t\t\tif (settings.hangleft) currlinex = settings.iconw + bbox.width + leftdist\n\t\t\telse currlinex = width + bbox.width + settings.padleft\n\t\t}\n\n\t\tconst y = settings.fontsize - bbox.height + (bbox.height - settings.iconh) / 2\n\t\tlet colorGradientId\n\t\tif (d.domain) {\n\t\t\tcolorGradientId = `sjpp-linear-gradient-${getId()}`\n\t\t\tconst domain = d.domain || [d.minLabel, d.maxLabel]\n\t\t\tconst yPos = y + 3\n\t\t\tconst min = d.domain[0]\n\t\t\tconst max = d.domain[d.domain.length - 1]\n\t\t\tconst domainRange = Math.abs(max - min)\n\n\t\t\tconst opts = {\n\t\t\t\tbarwidth: width,\n\t\t\t\tbarheight: settings.iconh,\n\t\t\t\tcolors: d.colors || d.scale.range() || ['white', 'grey'],\n\t\t\t\tdomain,\n\t\t\t\tfontSize: 0.82 * settings.fontsize,\n\t\t\t\tholder: g,\n\t\t\t\tid: colorGradientId,\n\t\t\t\tposition: `${bbox.width + 25},${yPos}`,\n\t\t\t\tticks: 3,\n\t\t\t\ttickSize: 2,\n\t\t\t\ttopTicks: true\n\t\t\t}\n\t\t\tif (d.labels) {\n\t\t\t\topts.labels = d.labels\n\t\t\t\tif (d.text) opts.position = `${bbox.width + bbox.x + 45 + settings.padx},${yPos}`\n\t\t\t}\n\t\t\t// Ticks must be spaced appropriately for loss and gain\n\t\t\t// scales. Lowering the range for smaller ranges\n\t\t\t// appropriates spaces the scale ticks\n\t\t\tif ((min == 0 || max == 0) && domainRange > 1) {\n\t\t\t\topts.ticks = domainRange > 5 ? 2 : 1\n\t\t\t}\n\t\t\tif (d.numericInputs) opts.numericInputs = d.numericInputs\n\n\t\t\tnew ColorScale(opts)\n\n\t\t\tif (opts.labels) currlinex += bbox.width + 25 + 15 * settings.padx\n\t\t\telse currlinex += 10 * settings.padx\n\t\t} else {\n\t\t\tg.append('rect')\n\t\t\t\t.attr('height', settings.iconh)\n\t\t\t\t.attr('width', width)\n\t\t\t\t//.attr('x', bbox.width)\n\t\t\t\t.attr('y', y)\n\t\t\t\t.attr('fill', colorGradientId ? `url(#${colorGradientId})` : opts.rectFillFxn)\n\t\t\t\t.attr('stroke', opts.iconStroke)\n\t\t\t\t.attr('shape-rendering', 'crispEdges')\n\n\t\t\tcurrlinex += 2.5 * settings.padx\n\t\t}\n\n\t\tif (Math.abs(bbox.y + bbox.height / 2) > 1) {\n\t\t\t// dominant-baseline is not supported, manually position\n\t\t\titemlabel.attr('y', bbox.height / 4)\n\t\t}\n\t}\n\n\treturn render\n}\n\nlet i = 0\nfunction getId() {\n\treturn `${i++}-${Date.now().toString().slice(-6)}-${Math.random().toString().slice(-6)}`\n}\n", "import { select } from 'd3-selection'\n\nexport function svgScroll(_opts) {\n\tif (!_opts.holder) throw `missing svgScroll.opts.holder argument`\n\tconst defaults = {\n\t\theight: 12,\n\t\tzoomLevel: 1,\n\t\topacity: 0.3\n\t}\n\n\tconst opts = Object.assign({}, defaults, _opts)\n\n\tfunction scrollInit(e) {\n\t\tref.x = e.clientX\n\t\tselect('body').on('mousemove.sjppSvgScroll', scrollMove).on('mouseup.sjppSvgScroll', scrollStop)\n\t}\n\n\tfunction scrollMove(e) {\n\t\tif (!('x' in ref)) return\n\t\tconst dx = e.clientX - ref.x\n\t\tif (ref.sliderX + ref.sliderWidth + dx > opts.visibleWidth - 1) {\n\t\t\t// when the available space at the right side is less than the distance moved to the right\n\t\t\treturn\n\t\t}\n\t\tif (ref.sliderX + dx < 0) {\n\t\t\t// when the available space at the left side is less than the distance moved to the left\n\t\t\treturn\n\t\t}\n\t\tslider.attr('x', ref.sliderX + dx)\n\t\topts.callback(ref.dxFactor * dx, 'move')\n\t}\n\n\tfunction scrollStop(e) {\n\t\tif (!('x' in ref)) return\n\t\tconst dx = e.clientX - ref.x\n\t\topts.callback(ref.dxFactor * Math.min(ref.maxDx, Math.max(dx, ref.minDx)), 'up')\n\t\tdelete ref.x\n\t\tselect('body').on('mousemove.sjppSvgScroll', null).on('mouseup.sjppSvgScroll', null)\n\t}\n\n\tfunction scrollByClick(e) {\n\t\tref.x = e.clientX\n\t\tconst i = e.clientX < slideElem.getBoundingClientRect().x ? -1 : 1\n\t\tscrollStop({ clientX: Math.floor(ref.x + i * ref.arrowDx) })\n\t}\n\n\topts.holder\n\t\t.attr('display', 'none')\n\t\t.attr('opacity', opts.opacity)\n\t\t.on('mouseover', () => opts.holder.attr('opacity', 1))\n\t\t.on('mouseout', () => opts.holder.attr('opacity', opts.opacity))\n\n\t// assumes horizontal for now\n\tconst rect = opts.holder\n\t\t.append('rect')\n\t\t.style('height', opts.height)\n\t\t.style('stroke', 'none')\n\t\t//.style('stroke-width', 1)\n\t\t//.attr('rx', opts.height / 2)\n\t\t.style('fill', '#fff')\n\t\t.on('click', scrollByClick)\n\n\tconst line = opts.holder.append('line').style('stroke', '#ccc').style('stroke-width', 1).on('click', scrollByClick)\n\n\tconst leftArrow = opts.holder\n\t\t.append('path')\n\t\t.attr('y', -opts.height)\n\t\t.attr('d', `M0,${opts.height / 2}L${opts.height},0L${opts.height},${opts.height}Z`)\n\t\t.style('stroke', '#ccc')\n\t\t.style('stroke-width', 1)\n\t\t//.attr('rx', opts.height / 2)\n\t\t.style('fill', '#ccc')\n\t\t.on('click', e => {\n\t\t\tref.x = e.clientX\n\t\t\tscrollStop({ clientX: Math.round(ref.x - ref.arrowDx) })\n\t\t})\n\n\tconst rtArrow = opts.holder\n\t\t.append('path')\n\t\t.attr('y', -opts.height)\n\t\t.style('stroke', '#ccc')\n\t\t.style('stroke-width', 1)\n\t\t//.attr('rx', opts.height / 2)\n\t\t.style('fill', '#ccc')\n\t\t.attr('d', `M0,0L${opts.height},${opts.height / 2}L0,${opts.height}Z`)\n\t\t.on('click', e => {\n\t\t\tref.x = e.clientX\n\t\t\tscrollStop({ clientX: Math.round(ref.x + ref.arrowDx) })\n\t\t})\n\n\tconst sliderHt = opts.height - 4\n\tconst slider = opts.holder\n\t\t.append('rect')\n\t\t.attr('y', 2)\n\t\t.attr('height', sliderHt)\n\t\t.attr('stroke', '#aaa')\n\t\t.attr('stroke-width', 1)\n\t\t.attr('fill', '#ccc')\n\t\t.attr('rx', sliderHt / 2)\n\t\t.on('mousedown', scrollInit)\n\t\t.on('mousemove', scrollMove)\n\t\t.on('mouseup', scrollStop)\n\n\tconst slideElem = slider.node()\n\n\tconst ref = {}\n\n\tconst api = {\n\t\tupdate(_opts) {\n\t\t\tconst prev = { v: opts.visibleWidth, t: opts.totalWidth, z: opts.zoomCenter }\n\t\t\tObject.assign(opts, _opts)\n\t\t\tconst t = opts.totalWidth\n\t\t\tconst v = opts.visibleWidth\n\t\t\tif (t <= v) {\n\t\t\t\topts.holder.attr('display', 'none')\n\t\t\t\treturn\n\t\t\t}\n\t\t\topts.holder.attr('transform', `translate(${opts.x},${opts.y})`).attr('display', '')\n\n\t\t\trect.attr('width', v)\n\n\t\t\tline\n\t\t\t\t.attr('x1', 0)\n\t\t\t\t.attr('x2', v)\n\t\t\t\t.attr('y1', opts.height / 2)\n\t\t\t\t.attr('y2', opts.height / 2)\n\n\t\t\tleftArrow.attr('transform', `translate(0,0)`)\n\n\t\t\trtArrow.attr('transform', `translate(${v - opts.height},0)`)\n\n\t\t\tif (v != prev.v || t != prev.t) {\n\t\t\t\t// multiply visibleWidth by the ratio of v:t,\n\t\t\t\t// to make the slider width proportional to v:t\n\t\t\t\tref.sliderWidth = (v * v) / t\n\t\t\t\t// each slider dx movement is equivalent to the ratio of\n\t\t\t\t// the open slider space on its left and right side\n\t\t\t\t// versus the unseen left and right portions of the element to be scrolled;\n\t\t\t\t// in other words, the available slidable segment of the scrollbar handle\n\t\t\t\t// proprotionally represents the unseen segment of the svg element\n\t\t\t\tref.dxFactor = (t - v) / (v - ref.sliderWidth)\n\t\t\t}\n\n\t\t\tconst center = v * (opts.zoomCenter / t)\n\t\t\tref.sliderX = Math.max(0, Math.min(center - ref.sliderWidth / 2, v - ref.sliderWidth - 1))\n\t\t\tslider.attr('width', ref.sliderWidth).attr('x', ref.sliderX)\n\n\t\t\tref.maxDx = opts.visibleWidth - ref.sliderX - ref.sliderWidth\n\t\t\tref.minDx = -ref.sliderX\n\t\t\tref.arrowDx = Math.round(0.1 * opts.visibleWidth)\n\t\t\tdelete ref.x\n\t\t}\n\t}\n\n\treturn api\n}\n", "/*\nmake a html table of two columns, for showing a list of key-value pairs.\n1st column shows key in gray text, 2nd column shows value in black text, or arbitrary button/svg etc\nas rows are added, as soon as table width exceeds a limit, it auto scrolls\n\nto create new table:\n\n\tconst table = table2col({holder})\n\nto add a new row with only text data:\n\n\ttable.addRow('Key', 'Value')\n\nif need to insert html and other dynamic contents instead of plain text, do this instead:\n\n\tconst [td1,td2] = table.addRow()\n\ttd1.html(xx)\n\ttd2.append('input')...\n\n\narg{}\n\t.holder\n\t.margin\n\t.cellPadding\n\t.disableScroll=true\n*/\nexport function table2col(arg) {\n\tconst scrollDiv = arg.holder.append('div').style('max-width', '80vw')\n\n\tconst table = scrollDiv\n\t\t.append('table')\n\t\t.style('margin', arg.margin || '5px 8px')\n\t\t.attr('class', 'sja_simpletable')\n\t\t.attr('data-testid', 'sja_simpletable')\n\treturn {\n\t\tscrollDiv,\n\t\ttable,\n\t\taddRow: (text1, text2) => {\n\t\t\tif (table.node().offsetHeight > 500 && !arg.disableScroll) {\n\t\t\t\tscrollDiv\n\t\t\t\t\t.style('height', '450px')\n\t\t\t\t\t.style('resize', 'both')\n\t\t\t\t\t.style('overflow-y', 'scroll')\n\t\t\t\t\t.attr('class', 'sjpp_show_scrollbar')\n\t\t\t}\n\t\t\tconst tr = table.append('tr')\n\t\t\tconst td1 = tr\n\t\t\t\t.append('td')\n\t\t\t\t.style('padding', arg.cellPadding || '3px')\n\t\t\t\t.style('color', '#555')\n\t\t\tconst td2 = tr.append('td').style('padding', arg.cellPadding || '3px')\n\t\t\tif (text1 != undefined) td1.text(text1)\n\t\t\tif (text2 != undefined) td2.text(text2)\n\t\t\treturn [td1, td2]\n\t\t}\n\t}\n}\n\n/*\ndata[ {} ]\n.kvlst[]\n.k\n.v\n\ndeprecated, replace with above\n*/\nexport function make_table_2col(holder, data, overlen) {\n\tconst color = '#9e9e9e'\n\tconst table = holder\n\t\t.append('table')\n\t\t.style('margin', '5px 8px')\n\t\t.style('font-size', 'inherit')\n\t\t.attr('class', 'sja_simpletable')\n\tfor (const i of data) {\n\t\tconst tr = table.append('tr')\n\t\tif (i.kvlst) {\n\t\t\ttr.append('td').attr('rowspan', i.kvlst.length).style('padding', '3px').style('color', color).html(i.k)\n\t\t\ttr.append('td').style('padding', '3px').style('color', color).html(i.kvlst[0].k)\n\t\t\ttr.append('td').style('padding', '3px').html(i.kvlst[0].v)\n\t\t\tfor (let j = 1; j < i.kvlst.length; j++) {\n\t\t\t\tconst tr2 = table.append('tr')\n\t\t\t\ttr2.append('td').style('padding', '3px').style('color', color).html(i.kvlst[j].k)\n\t\t\t\ttr2.append('td').style('padding', '3px').html(i.kvlst[j].v)\n\t\t\t}\n\t\t} else {\n\t\t\ttr.append('td').attr('colspan', 2).style('padding', '3px').style('color', color).html(i.k)\n\t\t\tconst td = tr.append('td').style('padding', '3px')\n\t\t\tif (overlen && i.v.length > overlen) {\n\t\t\t\ttd.html(i.v.substr(0, overlen - 3) + ' ...»')\n\t\t\t\t\t.attr('class', 'sja_clbtext')\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\ttd.html(i.v).classed('sja_clbtext', false).on('click', null)\n\t\t\t\t\t})\n\t\t\t} else {\n\t\t\t\ttd.html(i.v)\n\t\t\t}\n\t\t}\n\t}\n\treturn table\n}\n", "import { select } from 'd3-selection'\nimport type { TabsInputEntry, TabsOpts } from './types/toggleButtons'\n\n/*\n********************** EXPORTED\nTabs(opts)\n\nNote: \n- newly created dom elements are attached to opts{} and tabs for external code to access\n- if everything should be rendered in single holder, supply just `holder`\n- if main tabs and div containing tab specific ui (e.g. the app drawer sandboxes) should be in different tabs, \n\tdefine them sepeartely as holder and contentholder\n- tab data is bound to the rendered tab elements/content holder and vice-versa. \n\tFor easier debugging, in the console using inspect element > styles > properties > __data__\t\n*/\n\nexport class Tabs {\n\topts: TabsOpts\n\ttabs: TabsInputEntry[]\n\tdom: {\n\t\tholder: HTMLDivElement\n\t}\n\tdefaultTabWidth: number\n\trender: any\n\tupdate: any\n\n\tconstructor(opts: TabsOpts) {\n\t\tthis.opts = this.validateOpts(opts)\n\t\tthis.tabs = opts.tabs\n\t\tthis.dom = {\n\t\t\tholder: opts.holder\n\t\t}\n\t\tthis.defaultTabWidth = 90\n\t\tsetRenderers(this)\n\t}\n\n\tvalidateOpts(opts: TabsOpts) {\n\t\tif (!opts.holder) throw `missing opts.holder for Tabs()`\n\t\tif (!Array.isArray(opts.tabs)) throw `invalid opts.tabs array for Tabs()`\n\t\tif (!opts.linePosition) opts.linePosition = 'bottom'\n\t\tif (\n\t\t\topts.linePosition != 'bottom' &&\n\t\t\topts.linePosition != 'top' &&\n\t\t\topts.linePosition != 'right' &&\n\t\t\topts.linePosition != 'left'\n\t\t)\n\t\t\tthrow `Invalid .linePosition arg. Must be either bottom, top, right, or left`\n\t\tif (!opts.tabsPosition) opts.tabsPosition = 'horizontal'\n\t\tif (opts.tabsPosition != 'horizontal' && opts.tabsPosition != 'vertical')\n\t\t\tthrow `Invalid .tabsPosition arg. Must be either vertical or horizontal`\n\t\treturn opts\n\t}\n\n\tasync main() {\n\t\ttry {\n\t\t\tawait this.render()\n\t\t} catch (e: any) {\n\t\t\tif (e.stack) console.log(e.stack)\n\t\t\telse throw e\n\t\t}\n\t}\n}\n\nfunction setRenderers(self) {\n\tself.render = async () => {\n\t\tconst has_active_tab = self.tabs.find(tab => tab.active)\n\t\tif (!has_active_tab) self.tabs[0].active = true\n\n\t\tconst textAlign =\n\t\t\tself.opts.linePosition == 'bottom' || self.opts.linePosition == 'top' ? 'center' : self.opts.linePosition\n\n\t\t/* Implementation assumes the position of the tabs and content are not contiguous\n\t\tto accommodate all situations. If having troubles with rendering, try creating \n\t\ta wrapper for the tabsHolder and contentHolder. */\n\n\t\tself.dom.tabsHolder = self.dom.holder\n\t\t\t.append('div')\n\t\t\t//add light blue border underneath the buttons\n\t\t\t.style(`border-${self.opts.linePosition}`, '0.5px solid #1575ad')\n\n\t\tif (!self.dom.contentHolder && !self.opts.noContent) {\n\t\t\tself.dom.contentHolder = self.opts.contentHolder || self.dom.holder.append('div')\n\t\t}\n\n\t\tif (self.opts.tabsPosition == 'vertical') {\n\t\t\tself.dom.tabsHolder\n\t\t\t\t.style('display', 'inline-grid')\n\t\t\t\t.style('align-items', 'start')\n\t\t\t\t.style('gap', self.opts.gap || '')\n\t\t\tself.dom.contentHolder\n\t\t\t\t//First part of fix for svgs rendering inline, outside of the contentHolder\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('vertical-align', 'top')\n\t\t\t\t.style('position', 'relative')\n\t\t} else self.dom.tabsHolder.style('display', 'inline-block')\n\n\t\tawait self.dom.tabsHolder\n\t\t\t.selectAll('button')\n\t\t\t.data(self.tabs)\n\t\t\t.enter()\n\t\t\t.append('button')\n\t\t\t.attr('data-testid', 'sja_toggle_button')\n\t\t\t.attr('class', 'sj-toggle-button') //\n\t\t\t.classed('sjpp-active', tab => tab.active)\n\t\t\t//Padding here overrides automatic styling for all pp buttons\n\t\t\t.style('padding', '0px')\n\t\t\t.style('width', tab => (tab.width ? `${tab.width}px` : 'fit-content'))\n\t\t\t.style('min-width', tab => (tab.width ? null : Math.max(self.defaultTabWidth)))\n\t\t\t.style('border', 'none')\n\t\t\t.style('background-color', 'transparent')\n\t\t\t.style('display', tab => {\n\t\t\t\tif (!tab.isVisible || tab.isVisible()) return self.opts.tabsPosition == 'vertical' ? 'flex' : 'inline-grid'\n\t\t\t\telse return 'none'\n\t\t\t})\n\t\t\t.property('disabled', tab => (tab.disabled ? tab.disabled() : false))\n\t\t\t.each(async function (this: any, tab) {\n\t\t\t\tif (tab.active) {\n\t\t\t\t\t// assume that an active tabbed content div should receive focus when first rendered,\n\t\t\t\t\t// otherwise using tabs to navigate would not be intuitive or user-friendly if it\n\t\t\t\t\t// starts far away from recently rendered content\n\t\t\t\t\tthis.focus()\n\t\t\t\t\t// blur the forced autofocus right away, only want the menu/pane to have priority when\n\t\t\t\t\t// navigating by keyboard, don't want the browser's default element highlight\n\t\t\t\t\t// (blue border in Chrome) to be distracting\n\t\t\t\t\tthis.blur()\n\t\t\t\t}\n\n\t\t\t\t/* The whole button is clickable (i.e. the white space where the blue, 'active' line\n\t\t\t\tis not visible). The event is on the button (i.e. tab.wrapper). The style changes \n\t\t\t\twhen the button is active/inactive are on the text (i.e. tab.tab) and line \n\t\t\t\t(i.e. tab.line) */\n\t\t\t\tconst isVisible = tab.isVisible ? tab.isVisible() : true\n\t\t\t\ttab.wrapper = select(this).style('cursor', isVisible && tab.disabled?.() ? 'not-allowed' : 'pointer')\n\n\t\t\t\tif (self.opts.linePosition == 'right') tab.wrapper.style('justify-self', 'end')\n\t\t\t\tif (self.opts.linePosition == 'left') tab.wrapper.style('justify-self', 'start')\n\n\t\t\t\t//Line position determines the order of appending divs\n\t\t\t\tif (self.opts.linePosition == 'top' || self.opts.linePosition == 'left') {\n\t\t\t\t\t//create the line div before the tab text\n\t\t\t\t\ttab.line = tab.wrapper\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.style('display', self.opts.linePosition == 'left' ? 'inline-flex' : 'flex')\n\t\t\t\t\ttab.tab = tab.wrapper\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.style('display', self.opts.linePosition == 'left' ? 'inline-block' : 'block')\n\t\t\t\t} else {\n\t\t\t\t\t//create the line div after the tab text\n\t\t\t\t\ttab.tab = tab.wrapper\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.style('display', self.opts.linePosition == 'right' ? 'inline-block' : 'block')\n\t\t\t\t\ttab.line = tab.wrapper\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.style('display', self.opts.linePosition == 'right' ? 'inline-flex' : 'flex')\n\t\t\t\t}\n\n\t\t\t\ttab.tab //Button text\n\t\t\t\t\t.style('color', tab.active ? '#1575ad' : '#757373')\n\t\t\t\t\t.style('text-align', textAlign)\n\t\t\t\t\t.style('padding', '5px')\n\t\t\t\t\t.html(tab.label)\n\n\t\t\t\ttab.line //Bolded, blue line indicating the active button\n\t\t\t\t\t.style('background-color', '#1575ad')\n\t\t\t\t\t.style('visibility', tab.active ? 'visible' : 'hidden')\n\n\t\t\t\tif (self.opts.linePosition == 'top' || self.opts.linePosition == 'bottom') {\n\t\t\t\t\ttab.line.style('height', '8px').style('padding', '0px 5px')\n\t\t\t\t} else {\n\t\t\t\t\ttab.line\n\t\t\t\t\t\t//stretch tricks div to expand to full height\n\t\t\t\t\t\t.style('align-self', 'stretch')\n\t\t\t\t\t\t.style('padding', '5px 0px')\n\t\t\t\t\t\t//inline width prevents width changing for long labels\n\t\t\t\t\t\t.html('<span style=\"width: 8px\";> </span>')\n\t\t\t\t}\n\n\t\t\t\tif (self.dom.contentHolder) {\n\t\t\t\t\ttab.contentHolder = self.dom.contentHolder\n\t\t\t\t\t\t/* Second part of svg rendering fix: Extra div prevents svgs from displaying \n\t\t\t\t\tabove contentHolder (i.e. inline at the beginning of the holder). \n\t\t\t\t\tDiv acts as a `viewBox`.*/\n\t\t\t\t\t\t.append('div')\n\t\t\t\t\t\t.style('display', tab.active ? 'block' : 'none')\n\t\t\t\t\tif (self.opts.tabsPosition == 'horizontal' && !self.opts.noTopContentStyle) {\n\t\t\t\t\t\ttab.contentHolder.style('padding-top', '10px').style('margin-top', '10px')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// TODO: window.event should not be used, see https://developer.mozilla.org/en-US/docs/Web/API/Window/event\n\t\t\t\t// event should always be detected from an event handler/listener's first argument\n\t\t\t\tif (tab.active && tab.callback) await tab.callback(event, tab)\n\n\t\t\t\ttab.wrapper\n\t\t\t\t\t.on('mouseenter', () => {\n\t\t\t\t\t\ttab.tab.style('color', tab.active ? '#757373' : '#1575ad')\n\t\t\t\t\t})\n\t\t\t\t\t.on('mouseleave', () => {\n\t\t\t\t\t\ttab.tab.style('color', tab.active ? '#1575ad' : '#757373')\n\t\t\t\t\t})\n\t\t\t})\n\t\t\t.on('click', async (event, tab) => {\n\t\t\t\tfor (const t of self.tabs) {\n\t\t\t\t\t/** Hide tab content on double click if specified */\n\t\t\t\t\tif (self.opts.hideOnDblClick && t.active == true && t === tab) {\n\t\t\t\t\t\tt.active = false\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tt.active = t === tab\n\t\t\t\t}\n\t\t\t\tconst activeTabIndex = self.tabs.findIndex(t => t.active) //Fix for non-Rx implementations\n\n\t\t\t\t/*\n\t\t\t\tTODO: self.update() not required for non-RX components\n\t\t\t\tIdea is to create super class, then state and stateless components\n\t\t\t\tfor rx and non-rx components, respectively.\n\t\t\t\trx -> include app.dispatch() here. Maybe other intuitive methods to \n\t\t\t\t\tallievate callback code in tabs array\n\t\t\t\tnon-rx -> include self.update() here without activeTabIndex arg\n\t\t\t\t*/\n\t\t\t\tself.update(activeTabIndex)\n\t\t\t\tif (tab.callback) await tab.callback(event, tab)\n\t\t\t})\n\t\t\t.on('keydown', async function (event, tab) {\n\t\t\t\t// ignore this event if it bubbled up from a descendant element\n\t\t\t\tif (event.target.tagName != 'BUTTON') return\n\t\t\t\tif (event.key == 'Escape') {\n\t\t\t\t\treturn false\n\t\t\t\t} else if (event.key == 'Enter') {\n\t\t\t\t\t// default behavior equals click event\n\t\t\t\t\tif (tab.keydownCallback) tab.keydownCallback(event, tab)\n\t\t\t\t}\n\t\t\t})\n\t\tconst activeTabIndex = self.tabs.findIndex(t => t.active) //Fix for non-Rx implementations\n\t\tself.update(activeTabIndex)\n\t}\n\n\tself.update = (activeTabIndex = 0) => {\n\t\tself.tabs.forEach((tab, i) => {\n\t\t\ttab.active = activeTabIndex === i\n\t\t})\n\t\tself.dom.tabsHolder\n\t\t\t.selectAll('button')\n\t\t\t.data(self.tabs)\n\t\t\t.classed('sjpp-active', tab => tab.active)\n\t\t\t.each(tab => {\n\t\t\t\tconst isVisible = tab.isVisible ? tab.isVisible() : true\n\t\t\t\ttab.wrapper.classed('sjpp-active', tab.active)\n\t\t\t\tif (tab.isVisible) tab.wrapper.style('display', isVisible ? '' : 'none')\n\t\t\t\tif (tab.contentHolder) tab.contentHolder.style('display', tab.active ? 'block' : 'none')\n\t\t\t\ttab.tab.style('color', tab.active ? '#1575ad' : '#757373')\n\t\t\t\ttab.line.style('visibility', tab.active ? 'visible' : 'hidden')\n\t\t\t\ttab.tab.html(tab.label) // re-print tab label since the label value could have been updated by outside code\n\t\t\t})\n\t}\n}\n", "export function zoom(opts) {\n\tif (!opts.holder) throw `zoom requires an opts.holder`\n\tif (typeof opts.callback != 'function') throw `zoom requires an opts.callback function`\n\n\tconst defaultSettings = {\n\t\tmin: 1,\n\t\tmax: 100,\n\t\tvalue: 25,\n\t\tstep: 10,\n\t\tincrement: 1,\n\t\tnumberInputWidth: '35px',\n\t\tshowJumpBtns: false\n\t}\n\n\tconst settings = Object.assign({}, defaultSettings, opts.settings || {})\n\n\tlet showSlider = false\n\topts.holder\n\t\t.attr('title', opts.title || null)\n\t\t.style('vertical-align', 'top')\n\t\t.style('text-align', 'center')\n\t\t.on('mouseenter', () => {\n\t\t\tsliderDiv.style('display', 'inline-block').style('overflow', 'visible')\n\t\t\tshowSlider = true\n\t\t})\n\t\t.on('mouseleave', () => {\n\t\t\tsliderDiv.style('display', 'none').style('overflow', 'hidden')\n\t\t\tshowSlider = false\n\t\t})\n\n\tconst label = opts.holder.append('label')\n\tconst labelText = label.append('span').text('Zoom')\n\n\tconst number = label\n\t\t.append('input')\n\t\t.attr('title', 'Enter a desired zoom level')\n\t\t.attr('type', 'number')\n\t\t.attr('min', settings.min)\n\t\t.attr('max', settings.max)\n\t\t.attr('step', settings.increment)\n\t\t.style('min-width', settings.numberInputWidth)\n\t\t.style('width', opts.width || 'fit-content')\n\t\t.style('margin', '3px 5px')\n\t\t.property('value', settings.value)\n\t\t.on('change', event => {\n\t\t\tconst value = Number(event.target.value)\n\t\t\tapi.update({ value })\n\t\t\topts.callback(value)\n\t\t})\n\n\tlabel.append('span').text('unit' in opts ? opts.unit : '%')\n\n\t// if the zoom is rendered within a parent/ancestor div that is invisible,\n\t// then the box dimensions will be zero, will be corrected in the update()\n\t// below as needed\n\tconst box = opts.holder.node().getBoundingClientRect()\n\topts.holder.style('max-height', box.height + 'px').style('max-width', box.width + 'px')\n\n\topts.holder.append('br')\n\n\tconst sliderDiv = opts.holder.append('div').style('display', 'none')\n\n\tconst minusBtn = !opts.showJumpBtns\n\t\t? null\n\t\t: opts.holder\n\t\t\t\t.append('button')\n\t\t\t\t.attr('title', 'Zoom in')\n\t\t\t\t.style('width', '25px')\n\t\t\t\t.html('-')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tconst value = Math.max(\n\t\t\t\t\t\tsettings.step * Math.ceil((settings.value - settings.step) / settings.step),\n\t\t\t\t\t\tsettings.min\n\t\t\t\t\t)\n\t\t\t\t\tapi.update({ value })\n\t\t\t\t\topts.callback(value)\n\t\t\t\t})\n\n\tconst slider = sliderDiv\n\t\t.append('input')\n\t\t.attr('title', 'Slide to desired zoom level')\n\t\t.attr('type', 'range')\n\t\t.attr('min', settings.min)\n\t\t.attr('max', settings.max)\n\t\t.attr('step', settings.increment)\n\t\t.style('margin', '2px 5px')\n\t\t.style('padding', 0)\n\t\t.style('vertical-align', 'middle')\n\t\t.property('value', settings.value)\n\t\t.html('-')\n\t\t.on('input', event => {\n\t\t\tnumber.property('value', event.target.value)\n\t\t})\n\t\t.on('change', event => {\n\t\t\tconst value = Number(event.target.value)\n\t\t\tapi.update({ value })\n\t\t\topts.callback(value)\n\t\t})\n\n\t// TODO: may give an option to render plus/minus 'jump' buttons\n\tconst plusBtn = !opts.showJumpBtns\n\t\t? null\n\t\t: opts.holder\n\t\t\t\t.append('button')\n\t\t\t\t.attr('title', 'Zoom out')\n\t\t\t\t.style('width', '25px')\n\t\t\t\t.html('+')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tconst value = Math.min(\n\t\t\t\t\t\tsettings.step * Math.floor((settings.value + settings.step) / settings.step),\n\t\t\t\t\t\tsettings.max\n\t\t\t\t\t)\n\t\t\t\t\tapi.update({ value })\n\t\t\t\t\topts.callback(value)\n\t\t\t\t})\n\n\tsliderDiv\n\t\t.append('span')\n\t\t.style('text-decoration', 'underline')\n\t\t.style('cursor', 'pointer')\n\t\t.style('title', 'use the default zoom value')\n\t\t.text('Reset')\n\t\t.on('click', opts.reset)\n\n\tconst api = {\n\t\tupdate(s = {}) {\n\t\t\tconst box = opts.holder.node().getBoundingClientRect()\n\t\t\tif (!box.height || !box.width) {\n\t\t\t\t// when the matrix renders in an invisible div, these dimensions are empty,\n\t\t\t\t// should be reset based on the width of its contents\n\t\t\t\topts.holder.style('max-height', '').style('max-width', '')\n\t\t\t\tconst box = opts.holder.node().getBoundingClientRect()\n\t\t\t\topts.holder.style('max-height', box.height + 'px').style('max-width', box.width + 'px')\n\t\t\t}\n\n\t\t\tObject.assign(settings, s)\n\t\t\tslider\n\t\t\t\t.property('value', settings.value)\n\t\t\t\t.attr('min', settings.min)\n\t\t\t\t.attr('max', settings.max)\n\t\t\t\t.attr('step', settings.increment)\n\t\t\tnumber\n\t\t\t\t.property('value', settings.value)\n\t\t\t\t.attr('min', settings.min)\n\t\t\t\t.attr('max', settings.max)\n\t\t\t\t.attr('step', settings.increment)\n\t\t\tminusBtn?.property('disabled', settings.value <= settings.min)\n\t\t\tplusBtn?.property('disabled', settings.value >= settings.max)\n\t\t}\n\t}\n\n\tif (opts.debug)\n\t\tapi.Inner = {\n\t\t\tsettings,\n\t\t\tnumber,\n\t\t\tslider,\n\t\t\tminusBtn,\n\t\t\tplusBtn\n\t\t}\n\n\treturn api\n}\n", "export class AppBase {\n\t//type: string\n\t//id: string\n\topts: any\n\tid: string\n\tstate: any\n\t// dom: any\n\t// config: any\n\n\tconstructor(opts) {\n\t\tthis.opts = this.validateOpts(opts)\n\t\tthis.id = opts.id\n\t}\n\n\tvalidateOpts(o: any = {}) {\n\t\tif (!o.holder) throw `missing opts.holder in the app constructor argument`\n\t\tif (!o.callbacks) o.callbacks = {}\n\t\tif (o.state) {\n\t\t\tif (!o.state.vocab) o.state.vocab = {}\n\t\t\tif (typeof o.state.vocab != 'object') throw 'opts.state.vocab{} is not an object'\n\t\t\tif (o.state.genome) {\n\t\t\t\to.state.vocab.genome = o.state.genome\n\t\t\t\tdelete o.state.genome\n\t\t\t}\n\t\t\tif (o.state.dslabel) {\n\t\t\t\to.state.vocab.dslabel = o.state.dslabel\n\t\t\t\tdelete o.state.dslabel\n\t\t\t}\n\t\t}\n\t\tif (o.app) {\n\t\t\tfor (const [k, v] of Object.entries(o.app)) {\n\t\t\t\to[k] = v\n\t\t\t}\n\t\t\tdelete o.app\n\t\t}\n\t\treturn o\n\t}\n}\n", "import { getCompInit } from '../rx'\nimport { select, selectAll } from 'd3-selection'\nimport { getNormalRoot } from '#filter'\nimport { isUsableTerm } from '#shared/termdb.usecase.js'\nimport { termInfoInit } from './termInfo'\nimport { TermTypeGroups, equals } from '#shared/terms.js'\n\nconst childterm_indent = '25px'\nexport const root_ID = 'root'\nexport const custom_variables_ID = '_Custom_Variables_'\n\n// when the total number of children at one branch exceeds this limit, the <div class=cls_termchilddiv> will scroll\n// this only count immediate children, not counting grandchildren\nconst minTermCount2scroll = 20\n// max height of aforementioned scrolling <div>\nconst scrollDivMaxHeight = '400px'\n\n// class names TODO they should be shared between test/tree.spec.js\nconst cls_termdiv = 'termdiv',\n\tcls_termchilddiv = 'termchilddiv',\n\tcls_termbtn = 'termbtn',\n\tcls_termlabel = 'termlabel',\n\tcls_termloading = 'termloading',\n\tcls_termcheck = 'termcheck'\n\n/*\n******************** EXPORTED\ntreeInit()\nroot_ID\n\n******************** constructor opts{}\n.holder\n.click_term()\n.disable_terms[]\n\n******************** exit/update/enter\ntermsById{} is bound to the DOM tree, to provide:\n- term label\n- list of children terms for a parent term\n\n\n******************* special flags\nroot term does not exist in the termdb, but is synthesized upon initializing instance, has the \"__tree_isroot\" flag\n\n\n\n******************* Recommended Component Code Organization\n\n(a) class (produces instance):\n- all methods expected by rx.api (main, etc)\n- all data processing code\n(b) setRenderers(self): attaches renderer methods\n(c) setInteractivity(self): attaches event handlers\n\n*/\n\nclass TdbTree {\n\t/*\n\tTermdb Tree Component\n\t- api-related and data processing code\n\t within this class declaration\n\t*/\n\tconstructor(opts) {\n\t\tthis.type = 'tree'\n\n\t\t// attach instance-specific methods via closure\n\t\tsetInteractivity(this)\n\t\tsetRenderers(this)\n\n\t\t// for terms waiting for server response for children terms, transient, not state\n\t\tthis.loadingTermSet = new Set()\n\t\tthis.termsByCohort = {}\n\t\tthis.expandAll = 'expandAll' in opts ? opts.expandAll : false\n\t\t//getCompInit(TdbTree) will set this.id, .app, .opts, .api\n\t}\n\n\tinit() {\n\t\tthis.dom = {\n\t\t\tholder: this.opts.holder.append('div')\n\t\t}\n\t}\n\n\treactsTo(action) {\n\t\tif (action.type.startsWith('tree_')) 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('info_')) return true\n\t\tif (action.type.startsWith('submenu_')) return true\n\t\tif (action.type == 'app_refresh') return true\n\t\tif (action.type == 'set_term_type_group') return true\n\t}\n\n\tgetState(appState) {\n\t\tconst filter = getNormalRoot(appState.termfilter.filter)\n\t\tconst state = {\n\t\t\tisVisible: !appState.submenu.term,\n\t\t\tactiveCohort: appState.activeCohort,\n\t\t\texpandedTermIds: appState.tree.expandedTermIds,\n\t\t\tselectedTerms: appState.selectedTerms,\n\t\t\ttermfilter: { filter },\n\t\t\tusecase: appState.tree.usecase,\n\t\t\ttermTypeGroup: appState.termTypeGroup\n\t\t}\n\n\t\t// if cohort selection is enabled for the dataset, tree component needs to know which cohort is selected\n\t\tif (appState.termdbConfig.selectCohort) {\n\t\t\tstate.toSelectCohort = true\n\t\t\tconst choice = appState.termdbConfig.selectCohort.values[appState.activeCohort]\n\t\t\tif (choice) {\n\t\t\t\t// a selection has been made\n\t\t\t\tstate.cohortValuelst = choice.keys\n\t\t\t}\n\t\t}\n\n\t\treturn state\n\t}\n\n\tasync main() {\n\t\tif (this.state.termTypeGroup != TermTypeGroups.DICTIONARY_VARIABLES) {\n\t\t\tthis.dom.holder.style('display', 'none')\n\t\t\treturn\n\t\t}\n\t\tif (!this.state.isVisible) {\n\t\t\tthis.dom.holder.style('display', 'none')\n\t\t\treturn\n\t\t}\n\n\t\tif (this.state.toSelectCohort) {\n\t\t\t// dataset requires a cohort to be selected\n\t\t\tif (!this.state.cohortValuelst) {\n\t\t\t\t// a selection has not been made; do not render tree\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\t// refer to the current cohort's termsById\n\t\tthis.termsById = this.getTermsById()\n\t\tconst root = this.termsById[root_ID]\n\t\troot.terms = await this.requestTermRecursive(root)\n\t\troot.terms.push(...(await this.mayGetCustomTerms()))\n\t\tthis.dom.holder.style('display', 'block')\n\t\tawait this.renderBranch(root, this.dom.holder)\n\t\tthis.dom.holder\n\t\t\t.selectAll('.termbtn, .sja_tree_click_term')\n\t\t\t.attr('tabindex', 0)\n\t\t\t.attr('data-testid', 'sjpp_termdbbutton')\n\t\t\t.on('keyup', event => {\n\t\t\t\tif (event.key == 'Enter') event.target.click()\n\t\t\t})\n\t}\n\n\tgetTermsById() {\n\t\tif (!(this.state.activeCohort in this.termsByCohort)) {\n\t\t\tthis.termsByCohort[this.state.activeCohort] = {\n\t\t\t\t[root_ID]: {\n\t\t\t\t\tid: root_ID,\n\t\t\t\t\t__tree_isroot: true // must not delete this flag\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn this.termsByCohort[this.state.activeCohort]\n\t}\n\n\tasync requestTermRecursive(term) {\n\t\t/* will request child terms for this entire branch recursively\n\n\t\tmust synthesize request string (dataName) for every call\n\t\tand get cached result for the same dataName which has been requested before\n\t\tthis is to support future features\n\t\te.g. to show number of samples for each term that can change based on filters\n\t\twhere the same child terms already loaded must be re-requested with the updated filter parameters to update\n\n\t\tTODO determine when to re-request cached server response as needed\n\n\t\tCAUTION\n\t\twill be great if tree_collapse will not trigger this function\n\t\tbut hard to do given that main() has no way of telling what action was dispatched\n\t\tto prevent previously loaded .terms[] for the collapsing term from been wiped out of termsById,\n\t\tneed to add it back TERMS_ADD_BACK\n\t\t*/\n\t\tconst data = await this.app.vocabApi.getTermChildren(\n\t\t\tterm,\n\t\t\tthis.state.toSelectCohort ? this.state.cohortValuelst : null,\n\t\t\tthis.state.termfilter.filter\n\t\t)\n\t\tif (data.error) throw data.error\n\t\tif (!data.lst || data.lst.length == 0) {\n\t\t\t// do not throw exception; its children terms may have been filtered out\n\t\t\treturn []\n\t\t}\n\t\tconst terms = []\n\t\tfor (const t of data.lst) {\n\t\t\tconst copy = Object.assign({}, t)\n\t\t\tterms.push(copy)\n\t\t\t// rehydrate expanded terms as needed\n\t\t\t// fills in termsById, for recovering tree\n\t\t\tif (this.state.expandedTermIds.includes(copy.id)) {\n\t\t\t\tcopy.terms = await this.requestTermRecursive(copy)\n\t\t\t} else {\n\t\t\t\t// not an expanded term\n\t\t\t\t// if it's collapsing this term, must add back its children terms for toggle button to work\n\t\t\t\t// see flag TERMS_ADD_BACK\n\t\t\t\tconst t0 = this.termsById[copy.id || copy.name]\n\t\t\t\tif (t0 && t0.terms) {\n\t\t\t\t\tcopy.terms = t0.terms\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.termsById[copy.id || copy.name] = copy\n\t\t}\n\t\treturn terms\n\t}\n\n\tbindKey(term) {\n\t\treturn term.id || term.name\n\t}\n\n\tasync mayGetCustomTerms() {\n\t\tconst tws = await this.app.vocabApi.getCustomTerms()\n\t\tif (!tws.length) return []\n\n\t\tconst id = custom_variables_ID\n\t\tconst parentTerm = {\n\t\t\tname: 'Custom Variables',\n\t\t\tid: id,\n\t\t\tisleaf: false,\n\t\t\tincluded_types: ['categorical'],\n\t\t\tchild_types: ['categorical'],\n\t\t\tterms: tws.map(tw => {\n\t\t\t\tthis.termsById[tw.term.id || tw.term.name] = tw.term\n\t\t\t\ttw.term.isleaf = true\n\t\t\t\treturn tw.term\n\t\t\t})\n\t\t}\n\t\tthis.termsById[id] = parentTerm\n\t\treturn [parentTerm]\n\t}\n}\n\nexport const treeInit = getCompInit(TdbTree)\n\nfunction setRenderers(self) {\n\t/*\n\t\tSet static renderer code here for HTML, SVGs, etc \n\n\t\tClosured reference to object instance as self\n\t\tversus alternative \"this\" context such as DOM element\n\n\t\tself: a TdbTree instance\n\t*/\n\t// !!! no free-floating variable declarations here !!!\n\t// set properties within the class declarations\n\n\t/*\n\tterm{}\n\t\tmust be from termsById\n\t\t.terms[]\n\t\t\tlist of children terms\n\tdiv\n\t\tthe childdiv of this term\n\tbutton\n\t\toptional, the toggle button\n\t*/\n\tself.renderBranch = (term, div, button) => {\n\t\tif (!term || !term.terms) return\n\n\t\tif (term.terms.length >= minTermCount2scroll) {\n\t\t\t// too many children. scroll\n\t\t\tif (div.classed('sjpp_show_scrollbar')) {\n\t\t\t\t// already scrolling. the style has been applied from a previous click. do not reset\n\t\t\t} else {\n\t\t\t\tdiv\n\t\t\t\t\t.style('max-height', scrollDivMaxHeight)\n\t\t\t\t\t.style('padding', '10px')\n\t\t\t\t\t.style('resize', 'vertical')\n\t\t\t\t\t.classed('sjpp_show_scrollbar', true)\n\n\t\t\t\t/***************************\n\t\t\t\tremaining issues\n\n\t\t\t\t1. if there's a way to make scrollbar always visible, as a clear indication you need to scroll to see more hidden stuff\n\t\t\t\t*/\n\t\t\t}\n\t\t}\n\n\t\t// add disabled terms to opts.disable_terms\n\t\tif (self.opts.disable_terms) {\n\t\t\tterm.terms.forEach(t => {\n\t\t\t\tif (t.disabled) self.opts.disable_terms.push(t)\n\t\t\t})\n\t\t}\n\n\t\tself.included_terms = []\n\t\tif (self.state.usecase) {\n\t\t\tfor (const t of term.terms) {\n\t\t\t\tif (isUsableTerm(t, self.state.usecase, self.app.vocabApi.termdbConfig).size) {\n\t\t\t\t\tself.included_terms.push(t)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tself.included_terms.push(...term.terms)\n\t\t}\n\n\t\tconst id = term.id || term.name\n\t\tif (!(id in self.termsById) || !self.included_terms.length) {\n\t\t\tdiv.style('display', 'none')\n\t\t\treturn\n\t\t}\n\n\t\tif (self.loadingTermSet.has(term.id)) {\n\t\t\tself.loadingTermSet.delete(term.id)\n\t\t\tdiv.select('.' + cls_termloading).remove()\n\t\t}\n\n\t\tconst expandedTermIds = self.state.expandedTermIds\n\t\tif (!expandedTermIds.includes(term.id)) {\n\t\t\tdiv.style('display', 'none')\n\t\t\tif (button) button.text('+')\n\t\t\treturn\n\t\t}\n\t\tdiv.style('display', 'block')\n\t\tif (button) button.text('-')\n\n\t\tconst divs = div.selectAll('.' + cls_termdiv).data(self.included_terms, self.bindKey)\n\n\t\tdivs.exit().each(self.hideTerm)\n\n\t\tdivs.each(self.updateTerm)\n\n\t\tdivs.enter().append('div').each(self.addTerm)\n\n\t\tfor (const child of term.terms) {\n\t\t\tif (expandedTermIds.includes(child.id)) {\n\t\t\t\tself.renderBranch(\n\t\t\t\t\tchild,\n\t\t\t\t\tdiv.selectAll('.' + cls_termchilddiv).filter(i => i.id == child.id),\n\t\t\t\t\tdiv.selectAll('.' + cls_termbtn).filter(i => i.id == child.id)\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t}\n\n\t// this == the d3 selected DOM node\n\tself.hideTerm = function (term) {\n\t\tconst id = term.id || term.name\n\t\tif (id in self.termsById && self.state.expandedTermIds.includes(term.id)) return\n\t\tselect(this).style('display', 'none')\n\t}\n\n\tself.updateTerm = function (term) {\n\t\tconst div = select(this)\n\t\tconst id = term.id || term.name\n\t\tif (!(id in self.termsById)) {\n\t\t\tdiv.style('display', 'none')\n\t\t\treturn\n\t\t}\n\n\t\tconst termIsDisabled = self.opts?.disable_terms?.some(t => equals(t, term))\n\t\tconst uses = isUsableTerm(term, self.state.usecase, self.app.vocabApi.termdbConfig)\n\n\t\tdiv.style('display', '')\n\t\tconst isExpanded = self.state.expandedTermIds.includes(term.id)\n\t\tdiv.select('.' + cls_termbtn).text(isExpanded ? '-' : '+')\n\t\t// update other parts if needed, e.g. label\n\t\tdiv.select('.' + cls_termchilddiv).style('display', isExpanded ? 'block' : 'none')\n\n\t\tconst tid = term.id || term.name\n\t\tconst isSelected = self.state.selectedTerms.find(t => (t.id ? t.id === id : t.name == id) && t.type === term.type)\n\t\tdiv\n\t\t\t.select('.' + cls_termlabel)\n\t\t\t.style(\n\t\t\t\t'background-color',\n\t\t\t\t!uses.has('plot') || termIsDisabled ? '' : isSelected ? 'rgba(255, 194, 10,0.5)' : '#cfe2f3'\n\t\t\t)\n\t\tdiv\n\t\t\t.select('.' + cls_termcheck)\n\t\t\t.style('display', uses.has('plot') && isSelected && !termIsDisabled ? 'inline-block' : 'none')\n\t}\n\n\tself.addTerm = async function (term) {\n\t\tconst termIsDisabled = self.opts?.disable_terms?.some(t => equals(t, term))\n\t\tconst uses = isUsableTerm(term, self.state.usecase, self.app.vocabApi.termdbConfig)\n\n\t\tconst div = select(this)\n\t\t\t.attr('class', cls_termdiv)\n\t\t\t.style('margin', term.isleaf ? '' : '2px')\n\t\t\t.style('padding', '0px 5px')\n\n\t\tif (uses.has('branch')) {\n\t\t\tdiv\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', 'sja_menuoption ' + cls_termbtn)\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('padding', '4px 9px')\n\t\t\t\t.style('font-family', 'courier')\n\t\t\t\t.text('+')\n\t\t\t\t// always allow show/hide children even this term is already in use\n\t\t\t\t.on('click', event => {\n\t\t\t\t\tevent.stopPropagation()\n\t\t\t\t\tself.toggleBranch(term)\n\t\t\t\t})\n\t\t\tif (self.expandAll) self.toggleBranch(term)\n\t\t}\n\n\t\tconst id = term.id || term.name\n\t\tconst isSelected = self.state.selectedTerms.find(t => t.id === id && t.type === term.type)\n\t\tconst labeldiv = div\n\t\t\t.append('div')\n\t\t\t.attr('class', cls_termlabel)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('padding', '5px')\n\t\t\t.style('opacity', termIsDisabled ? 0.4 : null)\n\t\t\t.text(term.name)\n\n\t\tlet infoIcon_div //Empty div for info icon if termInfoInit is called\n\t\tif (term.hashtmldetail) {\n\t\t\tinfoIcon_div = div.append('div').style('display', 'inline-block')\n\t\t}\n\n\t\tif (uses.size > 0) {\n\t\t\tif (termIsDisabled) {\n\t\t\t\tlabeldiv\n\t\t\t\t\t.attr('class', 'sja_tree_click_term_disabled ' + cls_termlabel)\n\t\t\t\t\t.style('padding', '5px 8px')\n\t\t\t\t\t.style('margin', '1px 0px')\n\t\t\t\t\t.style('opacity', 0.7)\n\t\t\t} else if (uses.has('plot')) {\n\t\t\t\tlabeldiv\n\t\t\t\t\t// need better css class\n\t\t\t\t\t.attr('class', 'ts_pill sja_filter_tag_btn sja_tree_click_term ' + cls_termlabel)\n\t\t\t\t\t.style('color', 'black')\n\t\t\t\t\t.style('padding', '5px 8px')\n\t\t\t\t\t.style('border-radius', '6px')\n\t\t\t\t\t.style('background-color', isSelected ? 'rgba(255, 194, 10,0.5)' : '#cfe2f3')\n\t\t\t\t\t.style('margin', '1px 0px')\n\t\t\t\t\t.style('cursor', 'default')\n\t\t\t\t\t.on('click', () => self.clickTerm(term))\n\t\t\t}\n\n\t\t\t//show sample count for a term\n\t\t\tif (term.samplecount !== undefined) {\n\t\t\t\tdiv\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.style('margin-left', '5px')\n\t\t\t\t\t.style('color', term.samplecount ? '#777' : '#ddd')\n\t\t\t\t\t.text('n=' + term.samplecount)\n\t\t\t}\n\t\t}\n\t\t//Creates the info icon and description div from termInfo.js\n\t\tif (term.hashtmldetail) {\n\t\t\ttermInfoInit({\n\t\t\t\tvocabApi: self.app.vocabApi,\n\t\t\t\ticon_holder: infoIcon_div,\n\t\t\t\tcontent_holder: div.append('div'),\n\t\t\t\tid: term.id,\n\t\t\t\tstate: { term }\n\t\t\t})\n\t\t}\n\n\t\tlet selected_checkbox\n\t\tif (self.opts.submit_lst) {\n\t\t\tselected_checkbox = div\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', cls_termcheck)\n\t\t\t\t.style('color', '#008000')\n\t\t\t\t.style('display', isSelected ? 'inline-block' : 'none')\n\t\t\t\t.html('✓')\n\t\t}\n\n\t\tif (!term.isleaf) {\n\t\t\tdiv.append('div').attr('class', cls_termchilddiv).style('padding-left', childterm_indent)\n\t\t}\n\t}\n}\n\nfunction setInteractivity(self) {\n\t/*\n\t\tSet interactivity code here, for mouseovers, clicks, etc.\n\n\t\tClosured reference to object instance as self\n\t\tversus alternative \"this\" context such as DOM element\n\n\t\tself: a TdbTree instance\n\t*/\n\t// !!! no free-floating variable declarations here !!!\n\t// use self in TdbTree constructor to create properties\n\n\tself.toggleBranch = function (term) {\n\t\t//event.stopPropagation()\n\t\tif (term.isleaf) return\n\t\tconst t0 = self.termsById[term.id || term.name]\n\t\tif (!t0) throw 'invalid term id'\n\n\t\tif (!t0.terms) {\n\t\t\t// to load child term with request, guard against repetitive clicking\n\t\t\t// TERMS_ADD_BACK\n\t\t\t// this requires .terms[] to be added back when updated by requestTermRecursive()\n\t\t\tif (self.loadingTermSet.has(t0.id)) return\n\t\t\tself.loadingTermSet.add(t0.id)\n\t\t\tselect(this.parentNode)\n\t\t\t\t.selectAll('.' + cls_termchilddiv)\n\t\t\t\t.filter(d => d.id === t0.id)\n\t\t\t\t.style('display', 'block')\n\t\t\t\t.append('div')\n\t\t\t\t.text('Loading...')\n\t\t\t\t.attr('class', cls_termloading)\n\t\t\t\t.style('opacity', 0.5)\n\t\t\t\t.style('padding', '5px')\n\t\t}\n\n\t\tconst expanded = self.state.expandedTermIds.includes(term.id)\n\t\tconst type = expanded ? 'tree_collapse' : 'tree_expand'\n\t\tself.app.dispatch({ type, termId: term.id })\n\t}\n\n\tself.clickTerm = async term => {\n\t\tif (self.opts.click_term2select_tvs) {\n\t\t\tself.app.dispatch({ type: 'submenu_set', submenu: { term, type: 'tvs' } })\n\t\t\treturn\n\t\t}\n\n\t\tif (self.opts.click_term_wrapper) {\n\t\t\tself.opts.click_term_wrapper(term)\n\t\t\treturn\n\t\t}\n\n\t\tif (self.opts.submit_lst) {\n\t\t\tconst id = term.id || term.name\n\t\t\tconst i = self.state.selectedTerms.findIndex(t => (t.id ? t.id === id : t.name == id) && t.type === term.type)\n\t\t\tif (i == -1) {\n\t\t\t\tself.app.dispatch({\n\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\tstate: {\n\t\t\t\t\t\tselectedTerms: [...self.state.selectedTerms, term]\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconst selectedTerms = self.state.selectedTerms.slice(0)\n\t\t\t\tselectedTerms.splice(i, 1)\n\t\t\t\tself.app.dispatch({\n\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\tstate: { selectedTerms }\n\t\t\t\t})\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tthrow 'missing term click callback'\n\t}\n}\n", "import { StoreApi, StoreBase, type AppApi, type RxStore } from '#rx'\nimport { root_ID, custom_variables_ID } from './tree'\nimport { getFilterItemByTag, findParent } from '#filter'\nimport { isUsableTerm } from '#shared/termdb.usecase.js'\n\nconst defaultState = {\n\theader_mode: 'search_only',\n\t// will be ignored if there is no dataset termdb.selectCohort\n\t// or value will be set to match a filter node that has been tagged\n\t// as 'cohortfilter' in state.termfilter.filter\n\tactiveCohort: 0,\n\ttree: {\n\t\tusecase: {},\n\t\texpandedTermIds: []\n\t},\n\tsubmenu: {\n\t\t// type: 'tvs', may add other types later\n\t\t// term: {} or undefined\n\t},\n\tsearch: { isVisible: true },\n\tselectedTerms: [],\n\ttermfilter: {\n\t\tfilter: {\n\t\t\ttype: 'tvslst',\n\t\t\tin: true,\n\t\t\tjoin: '',\n\t\t\tlst: []\n\t\t}\n\t}\n}\n\n// one store for the whole tdb app\nclass TdbStore extends StoreBase implements RxStore {\n\tstatic type = 'store'\n\n\t// expected RxStore, some are already declared/set in StoreBase\n\tapp: AppApi\n\tapi: StoreApi\n\ttype: string\n\n\t// expected class-specific props\n\tactions!: {\n\t\t[actionType: string]: (action: { type: string; [prop: string]: any }) => void | Promise<void>\n\t}\n\n\tdefaultState = defaultState\n\n\tconstructor(opts, api) {\n\t\tsuper(opts)\n\t\tthis.type = 'store'\n\t\tthis.app = opts.app\n\t\tthis.api = api\n\t\tthis.state = this.copyMerge(this.toJson(defaultState), opts.state) // opts.state\n\t\t// use for assigning unique IDs where needed\n\t\t// may be used later to simplify getting component state by type and id\n\t\tthis.prevGeneratedId = 0\n\t}\n\n\tvalidateOpts(opts) {\n\t\tif (!opts.state) throw '.state{} missing'\n\t\tconst s = opts.state\n\t\tif (s.vocab) {\n\t\t\t/*** !!! May not need to duplicate the validation steps in vocabulary.js ??? ***/\n\t\t\t// assume that any vocabulary with a route\n\t\t\t// will require genome + dslabel\n\t\t\tif (s.vocab.dslabel) {\n\t\t\t\tif (!s.vocab.genome) throw '.state[.vocab].genome missing'\n\t\t\t} else if (s.vocab.genome) {\n\t\t\t\tif (!s.vocab.dslabel) throw '.state[.vocab].dslabel missing'\n\t\t\t} else {\n\t\t\t\tif (!Array.isArray(s.vocab.terms)) throw 'vocab.terms must be an array of objects'\n\t\t\t}\n\t\t}\n\t\treturn opts\n\t}\n\n\tvalidateState() {\n\t\tconst s = this.state\n\t\tif (s.tree.expandedTermIds.length == 0) {\n\t\t\ts.tree.expandedTermIds.push(root_ID, custom_variables_ID)\n\t\t} else {\n\t\t\tif (s.tree.expandedTermIds[0] != root_ID) {\n\t\t\t\ts.tree.expandedTermIds.unshift(root_ID)\n\t\t\t}\n\t\t}\n\t}\n\n\tasync init() {\n\t\tthis.state.termdbConfig = await this.app.vocabApi.getTermdbConfig()\n\n\t\t// maybe no need to provide term filter at this query\n\t\tlet filterUiRoot = getFilterItemByTag(this.state.termfilter.filter, 'filterUiRoot')\n\t\tif (!filterUiRoot) {\n\t\t\tthis.state.termfilter.filter.tag = 'filterUiRoot'\n\t\t\tfilterUiRoot = this.state.termfilter.filter\n\t\t}\n\n\t\tif (this.state.termdbConfig.selectCohort) {\n\t\t\tlet cohortFilter = getFilterItemByTag(this.state.termfilter.filter, 'cohortFilter')\n\t\t\tif (!cohortFilter) {\n\t\t\t\t// support legacy state.termfilter and test scripts that\n\t\t\t\t// that does not specify a cohort when required;\n\t\t\t\t// will use state.activeCohort if not -1\n\t\t\t\tcohortFilter = {\n\t\t\t\t\ttag: 'cohortFilter',\n\t\t\t\t\ttype: 'tvs',\n\t\t\t\t\ttvs: {\n\t\t\t\t\t\tterm: JSON.parse(JSON.stringify(this.state.termdbConfig.selectCohort.term)),\n\t\t\t\t\t\tvalues:\n\t\t\t\t\t\t\tthis.state.activeCohort == -1\n\t\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t\t: this.state.termdbConfig.selectCohort.values[this.state.activeCohort].keys.map(key => {\n\t\t\t\t\t\t\t\t\t\treturn { key, label: key }\n\t\t\t\t\t\t\t\t })\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.state.termfilter.filter = {\n\t\t\t\t\ttype: 'tvslst',\n\t\t\t\t\tin: true,\n\t\t\t\t\tjoin: 'and',\n\t\t\t\t\tlst: [cohortFilter, filterUiRoot]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst sorter = (a, b) => (a < b ? -1 : 1)\n\t\t\t\tcohortFilter.tvs.values.sort((a, b) => (a.key < b.key ? -1 : 1))\n\t\t\t\tconst keysStr = JSON.stringify(cohortFilter.tvs.values.map(v => v.key).sort(sorter))\n\t\t\t\tconst i = this.state.termdbConfig.selectCohort.values.findIndex(\n\t\t\t\t\tv => keysStr == JSON.stringify(v.keys.sort(sorter))\n\t\t\t\t)\n\t\t\t\tif (this.state.activeCohort !== -1 && this.state.activeCohort !== 0 && i !== this.state.activeCohort) {\n\t\t\t\t\tconsole.log('Warning: cohortFilter will override the state.activeCohort due to mismatch')\n\t\t\t\t}\n\t\t\t\tthis.state.activeCohort = i\n\t\t\t}\n\t\t} else {\n\t\t\tthis.state.activeCohort = -1\n\t\t\tif (this.state.header_mode === 'with_cohortHtmlSelect') {\n\t\t\t\tconsole.warn(`no termdbConfig.selectCohort to use for state.header_mode = 'with_cohortHtmlSelect'`)\n\t\t\t\tthis.state.header_mode = 'search_only'\n\t\t\t}\n\t\t}\n\t}\n\n\tsetId(item) {\n\t\titem.$id = this.prevGeneratedId++\n\t\tif (item.$lst) {\n\t\t\tfor (const subitem of item.$lst) {\n\t\t\t\tthis.setId(subitem)\n\t\t\t}\n\t\t}\n\t}\n}\n\n/*\n\tTo clearly indicate the allowed store actions,\n\tsupply a literal \"actions\" object on the \n\tconstructor prototype\n*/\nTdbStore.prototype.actions = {\n\tapp_refresh(this: TdbStore, action) {\n\t\t// optional action.state{} may be full or partial overrides\n\t\t// to the current state\n\t\t//\n\t\t// when constructing an app, app_refresh() is called\n\t\t// without action.state as the current state at the\n\t\t// initial render is not meant to be modified yet\n\t\t//\n\t\tthis.state = this.copyMerge(this.toJson(this.state), action.state ? action.state : {})\n\t},\n\tcohort_set(this: TdbStore, action) {\n\t\tthis.state.activeCohort = action.activeCohort\n\t\tconst cohort = this.state.termdbConfig.selectCohort.values[action.activeCohort]\n\t\tconst cohortFilter = getFilterItemByTag(this.state.termfilter.filter, 'cohortFilter')\n\t\tif (!cohortFilter) throw `No item tagged with 'cohortFilter'`\n\t\tcohortFilter.tvs.values = cohort.keys.map(key => {\n\t\t\treturn { key, label: key }\n\t\t})\n\t},\n\ttree_expand(this: TdbStore, action) {\n\t\tif (this.state.tree.expandedTermIds.includes(action.termId)) return\n\t\tthis.state.tree.expandedTermIds.push(action.termId)\n\t},\n\n\ttree_collapse(this: TdbStore, action) {\n\t\tconst i = this.state.tree.expandedTermIds.indexOf(action.termId)\n\t\tif (i == -1) return\n\t\tthis.state.tree.expandedTermIds.splice(i, 1)\n\t},\n\n\tfilter_replace(this: TdbStore, action) {\n\t\tconst replacementFilter = action.filter ? action.filter : { type: 'tvslst', join: '', in: 1, lst: [] }\n\t\tif (!action.filter.tag) {\n\t\t\tthis.state.termfilter.filter = replacementFilter\n\t\t} else {\n\t\t\tconst filter = getFilterItemByTag(this.state.termfilter.filter, action.filter.tag)\n\t\t\tif (!filter) throw `cannot replace missing filter with tag '${action.filter.tag}'`\n\t\t\tconst parent = findParent(this.state.termfilter.filter, filter.$id)\n\t\t\tif (parent == filter) {\n\t\t\t\tthis.state.termfilter.filter = replacementFilter\n\t\t\t} else {\n\t\t\t\tconst i = parent.lst.indexOf(filter)\n\t\t\t\tparent.lst[i] = replacementFilter\n\t\t\t}\n\t\t}\n\t},\n\n\tsubmenu_set(this: TdbStore, action) {\n\t\tconst term = action.submenu && action.submenu.term\n\t\tif (!term) {\n\t\t\tthis.state.submenu = {}\n\t\t\tthis.state.tree.expandedTermIds = [root_ID]\n\t\t} else {\n\t\t\tconst expandedTermIds = [root_ID]\n\t\t\tif (term.__ancestors) {\n\t\t\t\texpandedTermIds.push(...term.__ancestors)\n\t\t\t}\n\n\t\t\tif (isUsableTerm(term, {}, this.state.termdbConfig).has('plot')) {\n\t\t\t\tObject.assign(this.state.submenu, action.submenu)\n\t\t\t} else {\n\t\t\t\texpandedTermIds.push(term.id)\n\t\t\t\tdelete this.state.submenu.term\n\t\t\t}\n\n\t\t\tthis.state.tree.expandedTermIds = expandedTermIds\n\t\t}\n\t},\n\n\tset_term_type_group(this: TdbStore, { value }) {\n\t\tthis.state.termTypeGroup = value\n\t}\n}\n\n// must use the await keyword when using this storeInit()\nexport const storeInit = StoreApi.getInitFxn(TdbStore)\n", "import { Tabs } from '#dom'\nimport { getCompInit } from '../rx'\nimport { TermTypeGroups, TermTypes, typeGroup, numericTypes } from '#shared/terms.js'\nimport type { Term } from '#types'\nimport { select } from 'd3-selection'\n\ntype Dict = {\n\t[key: string]: any\n}\n\n/*\nWhen searching for terms, depending on the use case, only certain types of terms are allowed.\nThe tree target is used to determine the allowed term types.\nNOTE: dataset-specific overrides may be applied when the TermTypeSearch is initialized\n */\n\nconst useCasesExcluded = {\n\tmatrix: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST],\n\tfilter: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\tdictionary: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\tsummary: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\tbarchart: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\tviolin: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\tsampleScatter: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\tcuminc: [\n\t\tTermTypeGroups.SNP_LOCUS,\n\t\tTermTypeGroups.SNP_LIST,\n\t\tTermTypeGroups.MUTATION_CNV_FUSION,\n\t\tTermTypeGroups.METABOLITE_INTENSITY,\n\t\tTermTypeGroups.TERM_COLLECTION\n\t],\n\tdataDownload: [\n\t\t//TermTypeGroups.SNP_LOCUS, //this tabs require that the handler for this term type to be implemented\n\t\t//TermTypeGroups.SNP_LIST, //this tabs require that the handler for this term type to be implemented\n\t\tTermTypeGroups.MUTATION_CNV_FUSION,\n\t\tTermTypeGroups.TERM_COLLECTION\n\t], //Later on can support other term types like snplocus, snplst, geneVariant, non dictionary terms\n\tsurvival: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\t//Used from the termsetting when searching for a term, as any term with categories is allowed\n\tdefault: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST, TermTypeGroups.TERM_COLLECTION],\n\tregression: [TermTypeGroups.SNP_LIST, TermTypeGroups.SNP_LOCUS, TermTypeGroups.TERM_COLLECTION],\n\tmetaboliteIntensity: [\n\t\tTermTypeGroups.SNP_LOCUS,\n\t\tTermTypeGroups.SNP_LIST,\n\t\tTermTypeGroups.MUTATION_CNV_FUSION,\n\t\tTermTypeGroups.DICTIONARY_VARIABLES,\n\t\tTermTypeGroups.GENE_EXPRESSION,\n\t\tTermTypeGroups.SSGSEA,\n\t\tTermTypeGroups.TERM_COLLECTION\n\t],\n\tgeneExpression: [\n\t\tTermTypeGroups.SNP_LOCUS,\n\t\tTermTypeGroups.SNP_LIST,\n\t\tTermTypeGroups.MUTATION_CNV_FUSION,\n\t\tTermTypeGroups.DICTIONARY_VARIABLES,\n\t\tTermTypeGroups.METABOLITE_INTENSITY,\n\t\tTermTypeGroups.SSGSEA,\n\t\tTermTypeGroups.TERM_COLLECTION\n\t],\n\tnumericDictTermCluster: [\n\t\tTermTypeGroups.SNP_LOCUS,\n\t\tTermTypeGroups.SNP_LIST,\n\t\tTermTypeGroups.MUTATION_CNV_FUSION,\n\t\tTermTypeGroups.GENE_EXPRESSION,\n\t\tTermTypeGroups.METABOLITE_INTENSITY,\n\t\tTermTypeGroups.SSGSEA,\n\t\tTermTypeGroups.TERM_COLLECTION\n\t],\n\tnumericTermCollections: [\n\t\tTermTypeGroups.SNP_LOCUS,\n\t\tTermTypeGroups.SNP_LIST,\n\t\tTermTypeGroups.MUTATION_CNV_FUSION,\n\t\tTermTypeGroups.GENE_EXPRESSION,\n\t\tTermTypeGroups.METABOLITE_INTENSITY,\n\t\tTermTypeGroups.SSGSEA,\n\t\t// we are still using dictionary tab to select mutation signature terms. The reason why we\n\t\t// add the TERM_COLLECTION term type is to show it at the first level of tabs. After clicking\n\t\t// TERM_COLLECTION tab, we use DICTIONARY tab to select the mutation signature terms, and all other tabs\n\t\t// will be hidden by default.\n\t\tTermTypeGroups.TERM_COLLECTION\n\t]\n}\n\nexport class TermTypeSearch {\n\tdom: any\n\ttypes: Array<string>\n\tapp: any\n\ttype: string\n\ttabs: {\n\t\tlabel: string // required by Tabs\n\t\ttermTypeGroup: string // required for comparing\n\t\tcontentHolder?: any // added by Tabs\n\t\tcallback: (any) => void\n\t}[]\n\tstate: any\n\tgenomeObj: any\n\thandlerByType: Dict\n\tclick_term: (term: Term) => void\n\tsubmit_lst?: (terms: Array<Term>) => void\n\tuseCasesExcluded: {\n\t\t[useCaseTarget: string]: string[]\n\t}\n\n\tconstructor(opts) {\n\t\tthis.type = 'termTypeSearch'\n\t\tthis.genomeObj = opts.genome\n\t\tthis.click_term = opts.click_term\n\t\tthis.submit_lst = opts.submit_lst\n\t\tconst selectedTermsDiv = opts.topbar\n\t\t\t.append('div')\n\t\t\t.append('div')\n\t\t\t.style('width', '99%')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('flex-wrap', 'wrap')\n\t\t\t.style('gap', '5px')\n\t\t\t.style('min-height', '20px')\n\t\t\t.style('border', 'solid 1px #aaa')\n\t\t\t.style('margin', '10px 0px')\n\t\t\t.style('padding', '6px 2px')\n\t\t\t.style('min-height', '30px')\n\t\tthis.types = []\n\t\tthis.tabs = []\n\t\tthis.handlerByType = {}\n\t\tthis.dom = { holder: opts.holder, topbar: opts.topbar, selectedTermsDiv, submitDiv: opts.submitDiv }\n\t\t// do not overwrite the original copy; may apply overrides in init()\n\t\tthis.useCasesExcluded = structuredClone(useCasesExcluded)\n\t}\n\n\tasync init(appState) {\n\t\tthis.types = this.app.vocabApi.termdbConfig?.allowedTermTypes || ['categorical'] //if no types it is a custom vocab for testing\n\t\tif (!this.types) return\n\n\t\tif (this.app.vocabApi.termdbConfig?.useCasesExcluded)\n\t\t\tObject.assign(this.useCasesExcluded, this.app.vocabApi.termdbConfig?.useCasesExcluded)\n\n\t\tconst state = this.getState(appState)\n\t\tawait this.addTabsAllowed(state)\n\t\tif (this.submit_lst) {\n\t\t\t//multiple terms can be selected\n\t\t\tthis.dom.clearbt = this.dom.submitDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('margin-left', '5px')\n\t\t\t\t.text('Clear')\n\t\t\t\t.on('click', () => this.selectTerms([]))\n\t\t}\n\n\t\tif (this.tabs.length == 0) throw 'No term types allowed for this use case'\n\t\tthis.app.dispatch({ type: 'set_term_type_group', value: this.tabs[0].termTypeGroup })\n\n\t\tif (this.tabs.length == 1 && this.tabs[0].termTypeGroup == TermTypeGroups.DICTIONARY_VARIABLES) return\n\n\t\tnew Tabs({\n\t\t\tholder: this.dom.holder,\n\t\t\ttabsPosition: 'vertical',\n\t\t\tlinePosition: 'right',\n\t\t\ttabs: this.tabs\n\t\t}).main()\n\n\t\tfor (const t of this.tabs) {\n\t\t\tconst holder = t.contentHolder.style('padding-left', '20px')\n\t\t\tholder.append('div')\n\t\t}\n\t}\n\n\treactsTo(action) {\n\t\tif (action.type.startsWith('submenu_')) return true //may change tree visibility\n\t\tif (action.type == 'set_term_type_group') return true\n\t\tif (action.type == 'app_refresh') return true\n\t}\n\n\tmain() {\n\t\tthis.dom.holder.style('display', this.state.isVisible ? 'inline-block' : 'none')\n\t\tthis.dom.topbar.style('display', this.state.isVisible ? 'inline-block' : 'none')\n\t\tif (this.submit_lst) {\n\t\t\tthis.renderTermsSelected()\n\t\t\tthis.dom.selectedTermsDiv.style('display', this.state.selectedTerms.length > 0 ? 'inline-block' : 'none')\n\t\t} else this.dom.selectedTermsDiv.style('display', 'none')\n\t\tthis.renderTermsSelected()\n\t\tif (this.dom.clearbt) this.dom.clearbt.property('disabled', this.state.selectedTerms.length == 0)\n\t}\n\n\trenderTermsSelected() {\n\t\tthis.dom.selectedTermsDiv.selectAll('*').remove()\n\t\tthis.dom.selectedTermsDiv\n\t\t\t.selectAll('div')\n\t\t\t.data(this.state.selectedTerms)\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('aria-label', 'Click to delete')\n\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t.attr('tabindex', 0)\n\t\t\t.style('position', 'relative')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('padding', '5px 16px 5px 9px')\n\t\t\t.style('margin-left', '5px')\n\t\t\t.each(renderTerm)\n\t\t\t.on('click', (e, t) => this.deleteTerm(e, t))\n\t\t\t.on('mouseover', function (event) {\n\t\t\t\tconst deleteSvg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"#000\" class=\"bi bi-x-lg\" viewBox=\"0 0 16 16\">\n\t\t\t\t<path stroke='#f00' d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8 2.146 2.854Z\"/>\n\t\t\t\t</svg>`\n\t\t\t\tconst div = select(event.target)\n\t\t\t\tdiv\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('margin-left', '4px')\n\t\t\t\t\t.classed('sjpp_deletebt', true)\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.style('position', 'absolute')\n\t\t\t\t\t.style('right', '0px')\n\t\t\t\t\t.style('top', '0px')\n\n\t\t\t\t\t.style('transform', 'scale(0.6)')\n\t\t\t\t\t.style('pointer-events', 'none')\n\t\t\t\t\t.html(deleteSvg)\n\t\t\t})\n\t\t\t.on('mouseout', function (event) {\n\t\t\t\tselect(event.target).select('.sjpp_deletebt').remove()\n\t\t\t})\n\n\t\tfunction renderTerm(this: any, term) {\n\t\t\tconst div = select(this).style('border-radius', '5px')\n\t\t\tdiv\n\t\t\t\t.insert('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.html(term.gene || term.name)\n\t\t}\n\t}\n\n\tdeleteTerm(e, t) {\n\t\tconst i = this.state.selectedTerms.findIndex(term => term.name === t.name)\n\t\tif (i != -1) {\n\t\t\tconst selectedTerms = [...this.state.selectedTerms]\n\t\t\tselectedTerms.splice(i, 1)\n\t\t\tthis.app.dispatch({\n\t\t\t\ttype: 'app_refresh',\n\t\t\t\tstate: { selectedTerms }\n\t\t\t})\n\t\t}\n\t}\n\n\tgetState(appState) {\n\t\treturn {\n\t\t\tdslabel: appState.dslabel,\n\t\t\ttermTypeGroup: appState.termTypeGroup,\n\t\t\tusecase: appState.tree.usecase,\n\t\t\tisVisible: !appState.submenu.term,\n\t\t\tselectedTerms: appState.selectedTerms,\n\t\t\ttermfilter: appState.termfilter\n\t\t}\n\t}\n\n\tasync addTabsAllowed(state) {\n\t\tfor (const type of this.types) {\n\t\t\tconst termTypeGroup = typeGroup[type]\n\t\t\tlet label = termTypeGroup\n\t\t\tif (type == TermTypes.GENE_VARIANT) {\n\t\t\t\tconst labels: string[] = []\n\t\t\t\tif (this.app.vocabApi.termdbConfig.queries.snvindel) labels.push('Mutation')\n\t\t\t\tif (this.app.vocabApi.termdbConfig.queries.cnv) labels.push('CNV')\n\t\t\t\tif (this.app.vocabApi.termdbConfig.queries.svfusion) labels.push('Fusion')\n\t\t\t\tif (labels.length == 0) continue\n\t\t\t\tlabel = labels.join('/')\n\t\t\t}\n\t\t\tif (type == TermTypes.SNP_LIST || type == TermTypes.SNP_LOCUS) {\n\t\t\t\t// do not create tabs for snplst/snplocus terms as these\n\t\t\t\t// terms do not have termdb search handlers\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (termTypeGroup && !this.tabs.some(tab => tab.label == termTypeGroup)) {\n\t\t\t\t//regression snplst/snplocus cases will be handled when the search handler is added\n\t\t\t\tif (state.usecase.target == 'regression') {\n\t\t\t\t\tif (type == TermTypes.SNP) continue // same funcationality is covered by snplst/snplocus terms\n\t\t\t\t\tif (type == TermTypes.GENE_VARIANT && state.usecase.detail != 'independent') continue\n\t\t\t\t\tif (type == TermTypes.GENE_EXPRESSION && state.usecase.detail != 'independent') continue\n\t\t\t\t\tif (type == TermTypes.SSGSEA && state.usecase.detail != 'independent') continue\n\t\t\t\t}\n\n\t\t\t\tif (state.usecase.target == 'sampleScatter') {\n\t\t\t\t\tif (state.usecase.detail == 'numeric' && !numericTypes.has(type)) continue\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(state.usecase.target == 'survival' || state.usecase.target == 'cuminc') &&\n\t\t\t\t\ttermTypeGroup != TermTypeGroups.DICTIONARY_VARIABLES\n\t\t\t\t) {\n\t\t\t\t\tif (state.usecase.detail == 'term') continue\n\t\t\t\t}\n\n\t\t\t\tif (state.usecase.target == 'dataDownload') {\n\t\t\t\t\tif (type == TermTypes.SNP) continue // same funcationality is covered by snplst/snplocus terms\n\t\t\t\t}\n\n\t\t\t\tif (state.usecase.target && this.useCasesExcluded[state.usecase.target]?.includes(termTypeGroup)) continue\n\n\t\t\t\ttry {\n\t\t\t\t\tif (!this.usesDefaultSearch(termTypeGroup)) {\n\t\t\t\t\t\tconst _ = await import(`./handlers/${type}.ts`)\n\t\t\t\t\t\tthis.handlerByType[type] = await new _.SearchHandler()\n\t\t\t\t\t\tif (!this.handlerByType[type].init) throw 'init not implemented'\n\t\t\t\t\t}\n\t\t\t\t\tthis.addLoadTopTerms(type)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow `error with handler='./handlers/${type}.ts': ${e}`\n\t\t\t\t}\n\t\t\t\tif (type == TermTypes.TERM_COLLECTION) {\n\t\t\t\t\tlabel = this.app.vocabApi?.termdbConfig?.numericTermCollections.map(ntc => ntc.name).join('/')\n\t\t\t\t}\n\t\t\t\tthis.tabs.push({ label, callback: () => this.setTermTypeGroup(type, termTypeGroup), termTypeGroup })\n\t\t\t}\n\t\t}\n\t}\n\n\tusesDefaultSearch(termTypeGroup) {\n\t\treturn termTypeGroup == TermTypeGroups.DICTIONARY_VARIABLES || termTypeGroup == TermTypeGroups.METABOLITE_INTENSITY\n\t}\n\n\tasync addLoadTopTerms(type) {\n\t\tif (type == TermTypes.METABOLITE_INTENSITY)\n\t\t\t//maybe later other types are supported\n\t\t\tthis.dom.submitDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('margin-left', '5px')\n\t\t\t\t.text('Load top terms')\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tconst args = {\n\t\t\t\t\t\tfilter0: this.state.termfilter.filter0,\n\t\t\t\t\t\tfilter: this.state.termfilter.filter,\n\t\t\t\t\t\ttype\n\t\t\t\t\t}\n\t\t\t\t\tconst result = await this.app.vocabApi.getTopTermsByType(args)\n\t\t\t\t\tthis.selectTerms(result.terms)\n\t\t\t\t})\n\t}\n\n\tselectTerms(terms) {\n\t\tthis.app.dispatch({\n\t\t\ttype: 'app_refresh',\n\t\t\tstate: {\n\t\t\t\tselectedTerms: terms\n\t\t\t}\n\t\t})\n\t}\n\tasync setTermTypeGroup(type, termTypeGroup) {\n\t\tawait this.app.dispatch({ type: 'set_term_type_group', value: termTypeGroup })\n\t\tconst tab = this.tabs.find(tab => tab.termTypeGroup == termTypeGroup)\n\t\tif (!tab) return\n\t\tconst holder = tab.contentHolder\n\t\tholder.selectAll('*').remove()\n\n\t\tif (\n\t\t\ttab.termTypeGroup != TermTypeGroups.DICTIONARY_VARIABLES &&\n\t\t\ttab.termTypeGroup != TermTypeGroups.METABOLITE_INTENSITY\n\t\t) {\n\t\t\tconst handler = this.handlerByType[type]\n\t\t\tawait handler.init({\n\t\t\t\tholder,\n\t\t\t\tapp: this.app,\n\t\t\t\tgenomeObj: this.genomeObj,\n\t\t\t\tcallback: term => this.selectTerm(term)\n\t\t\t})\n\t\t}\n\t}\n\t//This callback will be called by the handlers when a term is selected\n\tselectTerm(term) {\n\t\tif (this.click_term) this.click_term(term)\n\t\telse if (this.submit_lst) {\n\t\t\tconst t = term.term || term\n\t\t\tif (term.type == TermTypes.TERM_COLLECTION) {\n\t\t\t\tconst seletedTerms = [...term.seletedTerms]\n\t\t\t\tconst termNames = seletedTerms.map(o => o.id).join(',')\n\t\t\t\tconst termNamesLabel = `${term.name} (${termNames})`\n\t\t\t\tconst termName = termNamesLabel.length <= 26 ? termNamesLabel : termNamesLabel.slice(0, 26) + '...'\n\t\t\t\tconst newTerm = { name: termName, type: 'termCollection', isleaf: true, termlst: seletedTerms }\n\t\t\t\tthis.app.dispatch({\n\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\tstate: {\n\t\t\t\t\t\tselectedTerms: [newTerm]\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthis.app.dispatch({\n\t\t\t\ttype: 'app_refresh',\n\t\t\t\tstate: {\n\t\t\t\t\tselectedTerms: [...this.state.selectedTerms, t]\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tthis.app.dispatch({\n\t\t\t\ttype: 'submenu_set',\n\t\t\t\tsubmenu: {\n\t\t\t\t\ttype: 'tvs',\n\t\t\t\t\tterm: term.term?.type == 'geneVariant' ? this.getDtTerm(term) : term\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\t// get child dt term from geneVariant term to use for tvs\n\tgetDtTerm(tw) {\n\t\tif (tw.term.type != 'geneVariant') throw 'term.type is not geneVariant'\n\t\tif (tw.q.type != 'predefined-groupset') throw 'q.type must be predefined-groupset'\n\t\tconst dtTerm = tw.term.childTerms[tw.q.predefined_groupset_idx]\n\t\tif (!dtTerm) throw 'dtTerm not found'\n\t\treturn dtTerm\n\t}\n}\n\nexport const TermTypeSearchInit = getCompInit(TermTypeSearch)\n", "import { getCompInit } from '../rx'\nimport { showTvsMenu } from '../filter/tvs'\n\nclass TdbSubmenu {\n\tconstructor(opts) {\n\t\tthis.type = 'submenu'\n\t\tthis.dom = { holder: opts.holder }\n\t\tsetRenderers(this)\n\t\t//getCompInit(TdbSubmenu) will set this.id, .app, .opts, .api\n\t}\n\n\treactsTo(action) {\n\t\tif (action.type.startsWith('submenu_')) return true\n\t\tif (action.type == 'app_refresh') return true\n\t}\n\n\tgetState(appState) {\n\t\treturn {\n\t\t\ttype: appState.submenu.type,\n\t\t\tterm: appState.submenu.term,\n\t\t\ttermfilter: appState.termfilter\n\t\t}\n\t}\n\n\tmain() {\n\t\tif (!this.state.term) {\n\t\t\tthis.dom.holder.style('display', 'none')\n\t\t\treturn\n\t\t}\n\t\tif (this.state.type == 'tvs') this.showTvsMenu(this.state.term)\n\t\telse throw `unsupported submenu.type='${this.state.type}'`\n\t}\n}\n\nexport const submenuInit = getCompInit(TdbSubmenu)\n\nfunction setRenderers(self) {\n\tself.showTvsMenu = function (term) {\n\t\tself.dom.holder.selectAll('*').remove()\n\n\t\tself.dom.holder\n\t\t\t.style('display', 'block')\n\t\t\t.append('div')\n\t\t\t.style('margin', '10px')\n\t\t\t.append('span')\n\t\t\t.html('« ' + (self.app.opts.tree?.backToSelectionText || 'Back to variable selection'))\n\t\t\t.attr('class', 'sja_clbtext')\n\t\t\t.attr('data-testid', 'sja_treesubmenu_backprompt')\n\t\t\t.on('click', () => self.app.dispatch({ type: 'submenu_set', submenu: {} }))\n\n\t\tself.dom.holder\n\t\t\t.style('display', 'block')\n\t\t\t.append('div')\n\t\t\t.style('margin', '15px 0px 5px 10px')\n\t\t\t.style('font-weight', 'bold')\n\t\t\t.style('font-size', '.9em')\n\t\t\t.text(term.name)\n\n\t\tshowTvsMenu({\n\t\t\tterm,\n\t\t\tfilter: self.state.termfilter.filter,\n\t\t\tholder: self.dom.holder.append('div'),\n\t\t\tvocabApi: self.app.vocabApi,\n\t\t\tdebug: self.app.debug,\n\t\t\tgetCategoriesArguments: self.app.opts.getCategoriesArguments,\n\t\t\tcallback: self.app.opts.tree.click_term2select_tvs\n\t\t})\n\t}\n}\n", "import { getCompInit } from '#rx'\nimport { select, selectAll } from 'd3-selection'\nimport { sayerror } from '#dom'\nimport { debounce } from 'debounce'\nimport { root_ID } from './tree'\nimport { isUsableTerm } from '#shared/termdb.usecase.js'\nimport { keyupEnter } from '#src/client'\nimport { TermTypeGroups, isNonDictionaryType, equals } from '#shared/terms.js'\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 TermSearch {\n\tconstructor(opts) {\n\t\tthis.type = 'search'\n\t\t// currently postSearch is only used for testing\n\t\tthis.customEvents = ['postSearch']\n\t\t// set this.id, .app, .opts, .api\n\t\tsetRenderers(this)\n\t\tsetInteractivity(this)\n\t\tthis.dom = { holder: opts.holder }\n\n\t\tthis.isVisible = 'isVisible' in opts ? opts.isVisible : true\n\t}\n\n\tasync init(appState) {\n\t\tthis.initUI(this.getState(appState))\n\t}\n\n\treactsTo(action) {\n\t\tif (action.type == 'set_term_type_group') return true\n\t\tif (action.type == 'app_refresh') return true\n\t\tconst prefix = action.type.split('_')[0]\n\t\treturn ['search', 'cohort', 'submenu'].includes(prefix)\n\t}\n\n\tgetState(appState) {\n\t\treturn {\n\t\t\tisVisible: !appState.submenu.term && this.isVisible,\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\tallowedTermTypes: appState.termdbConfig?.allowedTermTypes || [],\n\t\t\texpandedTermIds: appState.tree.expandedTermIds,\n\t\t\tselectedTerms: appState.selectedTerms,\n\t\t\tusecase: appState.tree.usecase,\n\t\t\tsearch: appState.search,\n\t\t\ttermTypeGroup: appState.termTypeGroup\n\t\t}\n\t}\n\n\tisTermTypeSupported() {\n\t\tconst termTypeGroup = this.state.termTypeGroup\n\n\t\tif (termTypeGroup == TermTypeGroups.DICTIONARY_VARIABLES) return true\n\t\tif (termTypeGroup == TermTypeGroups.METABOLITE_INTENSITY) return true\n\n\t\treturn false\n\t}\n\n\tasync main() {\n\t\t// show/hide search input from the tree\n\t\tif (!this.isTermTypeSupported()) {\n\t\t\tthis.dom.holder.style('display', 'none') //These views will have their own UI\n\t\t\treturn\n\t\t}\n\t\tthis.dom.input.node().value = ''\n\t\tthis.dom.input.attr(\n\t\t\t'placeholder',\n\t\t\t// termTypeGroup values cannot cover geneset, thus this check\n\t\t\t// tdbcfg is missing for front vocab?\n\t\t\t`Search ${this.app.vocabApi.termdbConfig?.isGeneSetTermdb ? 'Gene Sets' : this.state.termTypeGroup}`\n\t\t)\n\t\tthis.clear()\n\t\tthis.dom.holder.style('display', this.state.isVisible ? 'block' : 'none')\n\t}\n\n\t// targetType optional, see vocab.findTerm()\n\tasync doSearch(str) {\n\t\tif (!str || str.length < 3) {\n\t\t\tthis.clear()\n\t\t\tthis.bus.emit('postSearch', [])\n\t\t\treturn\n\t\t}\n\t\tconst data = await this.app.vocabApi.findTerm(\n\t\t\tstr,\n\t\t\tthis.state.cohortStr,\n\t\t\tthis.state.usecase,\n\t\t\tthis.state.termTypeGroup\n\t\t)\n\t\tthis.currData = data\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(TermSearch)\n\nfunction setRenderers(self) {\n\tself.initUI = state => {\n\t\tself.dom.holder.style('display', self.search && self.search.isVisible == false ? 'none' : 'block')\n\n\t\tconst searchDiv = self.dom.holder.append('div').style('text-align', 'left')\n\n\t\tself.dom.input = searchDiv\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.style('width', '250px')\n\t\t\t.style('margin', '10px')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.on('input', debounce(self.onInput, 300))\n\t\t\t.on('keyup', self.onKeyup)\n\n\t\tself.dom.resultCntDiv = searchDiv.append('div').style('display', 'none')\n\n\t\tif (self.opts.focus != 'off') self.dom.input.node().focus()\n\n\t\t/* a holder to contain two side-by-side divs \n\t\tused to show genes on one side and dictionary term on another, but gene is no longer shown\n\t\tside-by-side holder is commented off but may be reused for new purpose\n\t\t*/\n\t\tself.dom.resultDiv = (self.opts.resultsHolder || self.dom.holder)\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sjpp_show_scrollbar')\n\t\t\t.style('max-height', '35vh')\n\t\t\t.style('display', 'none')\n\t\t\t//div is hidden when no results to show, since an empty grid holder occupies white space and increase the distance between search box and tree\n\t\t\t// when showing, turn to \"inline-grid\", but not \"grid\", to show up nicely\n\t\t\t.style('grid-template-columns', 'auto auto')\n\n\t\t// left div to show gene hits\n\t\t//const div_gene = self.dom.resultDiv.append('div')\n\t\t// right div to show term hits\n\t\tconst div_term = self.dom.resultDiv.append('div')\n\n\t\t/*\n\t\tself.dom.resultDiv_genes = div_gene\n\t\t\t.append('div')\n\t\t\t.style('border-left', 'solid 1px rgb(133,182,225)')\n\t\t\t.style('margin', '0px 0px 10px 10px')\n\t\t\t.style('padding-left', '5px')\n\t\t\t*/\n\t\tself.dom.resultDiv_terms = div_term\n\t\t\t.append('div')\n\t\t\t.style('border-left', self.opts.resultsHolder ? '' : 'solid 1px rgb(133,182,225)')\n\t\t\t.style('margin', '0px 0px 10px 10px')\n\t\t\t.style('padding-left', '5px')\n\t}\n\n\tself.noResult = () => {\n\t\tself.clear()\n\t\tself.dom.resultDiv.style('display', 'inline-grid')\n\t\tself.dom.resultDiv_terms.append('div').style('padding', '3px 3px 3px 0px').style('opacity', 0.5).text('No match')\n\t}\n\tself.showTerms = data => {\n\t\t// add disabled terms to opts.disable_terms\n\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\t}\n\t\tself.clear()\n\t\tself.dom.resultDiv.style('display', 'inline-grid')\n\n\t\tif (data.lst.length) {\n\t\t\tself.dom.resultDiv_terms.append('table').selectAll().data(data.lst).enter().append('tr').each(self.showTerm)\n\t\t\tself.dom.resultCntDiv.style('display', 'inline-block').text(`${data.lst.length} results`)\n\t\t}\n\n\t\tself.focusableResults = [...self.dom.resultDiv.node().querySelectorAll('.sja_tree_click_term, .sja_menuoption')]\n\t}\n\tself.showTerm = function (term) {\n\t\tconst tr = select(this)\n\t\tconst button = tr.append('td').text(term.name)\n\t\tconst uses = isUsableTerm(term, self.state.usecase, self.app.vocabApi.termdbConfig)\n\t\t/*\n\t\tbelow, both callbacks are made in app.js validateOpts()\n\t\t1. self.opts.click_term() is for selecting to tvs\n\t\t2. self.app.opts.tree.click_term_wrapper() is a wrapper for opts.tree.click_term()\n\t\t*/\n\t\tif ((self.opts.click_term || self.app.opts?.tree?.click_term_wrapper) && uses.has('plot')) {\n\t\t\t// to click a graphable term, show as blue button\n\t\t\tif (term && self.opts.disable_terms?.find(term2 => equals(term, term2))) {\n\t\t\t\t// but it's disabled\n\t\t\t\tbutton\n\t\t\t\t\t.attr('class', 'sja_tree_click_term_disabled')\n\t\t\t\t\t.style('display', 'block')\n\t\t\t\t\t.style('padding', '5px 8px')\n\t\t\t\t\t.style('margin', '1px 0px')\n\t\t\t\t\t.style('opacity', 0.4)\n\t\t\t} else {\n\t\t\t\t// clickable button\n\t\t\t\tbutton\n\t\t\t\t\t.attr('class', 'ts_pill sja_filter_tag_btn sja_tree_click_term')\n\t\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t\t.style('display', 'block')\n\t\t\t\t\t.style('color', 'black')\n\t\t\t\t\t.style('padding', '5px 8px')\n\t\t\t\t\t.style('border-radius', '6px')\n\t\t\t\t\t.style('background-color', '#cfe2f3')\n\t\t\t\t\t.style('margin', '1px 0px')\n\t\t\t\t\t.style('cursor', 'default')\n\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\tif (self.opts.click_term) {\n\t\t\t\t\t\t\tself.opts.click_term(term)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.app.opts.tree.click_term_wrapper(term)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tself.clear()\n\t\t\t\t\t\tself.dom.input.property('value', '')\n\t\t\t\t\t})\n\t\t\t\t\t.on('keyup', self.navInputValueByKeyboard)\n\t\t\t}\n\t\t\t//show sample count for a term\n\t\t\tif (term.samplecount !== undefined) {\n\t\t\t\ttr.append('td')\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t.style('margin-left', '5px')\n\t\t\t\t\t.style('color', term.samplecount ? '#777' : '#ddd')\n\t\t\t\t\t.text('n=' + term.samplecount)\n\t\t\t}\n\t\t} else {\n\t\t\t// as regular button, click to expand tree\n\t\t\tbutton\n\t\t\t\t.attr('class', 'sja_menuoption')\n\t\t\t\t.attr('tabindex', 0)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tself.clear()\n\t\t\t\t\tself.dom.input.property('value', '')\n\t\t\t\t\tconst expandedTermIds = [root_ID]\n\n\t\t\t\t\tif (term.type && isNonDictionaryType(term.type)) {\n\t\t\t\t\t\tself.app.dispatch({\n\t\t\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\tselectedTerms: [...self.state.selectedTerms, term]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (term.__ancestors) {\n\t\t\t\t\t\t\texpandedTermIds.push(...term.__ancestors)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// pre-expand non-selectable parent term\n\t\t\t\t\t\tif (!self.app.vocabApi.graphable(term)) expandedTermIds.push(term.id)\n\t\t\t\t\t\tself.app.dispatch({\n\t\t\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\ttree: { expandedTermIds }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on('keyup', self.navInputValueByKeyboard)\n\t\t}\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 = () => {\n\t\t//self.dom.resultDiv_genes.selectAll('*').remove()\n\t\tself.dom.resultDiv_terms.selectAll('*').remove()\n\t\tself.dom.resultDiv.style('display', 'none')\n\t\tself.dom.resultCntDiv.style('display', 'none')\n\t}\n}\n\nfunction setInteractivity(self) {\n\tself.onKeyup = event => {\n\t\t// to search snp upon hitting enter\n\t\tif (event.key == 'ArrowDown' && self.currData?.lst?.length) {\n\t\t\tself.dom.resultDiv.select('.sja_tree_click_term, .sja_menuoption').node().focus()\n\t\t\treturn\n\t\t}\n\t\tif (!keyupEnter(event)) return // not pressing enter\n\t\tself.onInput(event)\n\t}\n\n\tself.onInput = async event => {\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\tself.dom.resultDiv.style('display', 'inline-grid')\n\t\t\tsayerror(self.dom.resultDiv_terms, 'Error: ' + (e.message || e))\n\t\t\tif (e.stack) console.log(e.stack)\n\t\t}\n\t}\n\n\tself.navInputValueByKeyboard = event => {\n\t\tif (event.key == 'Enter') event.target.click()\n\t\telse if (event.key.startsWith('Arrow')) {\n\t\t\tconst i = self.focusableResults.findIndex(r => r === event.target)\n\t\t\tif (event.key == 'ArrowDown') {\n\t\t\t\tif (i < self.focusableResults.length - 1) self.focusableResults[i + 1].focus()\n\t\t\t\telse self.focusableResults[0].focus()\n\t\t\t} else if (event.key == 'ArrowUp') {\n\t\t\t\tif (i != 0) self.focusableResults[i - 1].focus()\n\t\t\t\telse self.focusableResults[self.focusableResults.length - 1].focus()\n\t\t\t}\n\t\t}\n\t}\n}\n", "import { AppApi, multiInit, type RxApp, type ComponentApi } from '#rx'\nimport { AppBase } from '#plots/AppBase.ts'\nimport { storeInit } from './store'\nimport { vocabInit } from './vocabulary'\nimport { treeInit } from './tree'\nimport { TermTypeSearchInit } from './TermTypeSearch'\nimport { submenuInit } from './submenu'\nimport { searchInit } from './search'\nimport { select } from 'd3-selection'\nimport { Menu, sayerror } from '#dom'\nimport { dofetch3 } from '#common/dofetch'\n\n/*\nopts{}\n\tstate{}\n\t\trequired, will fill-in or override store.defaultState\n\tapp{}\n\ttree{}\n\t\tdisable_terms[]\n\t\tclick_term2select_tvs()\n\t\tclick_term()\n\t\tbackToSelectionText:str\n\tsearch{}\n\tvocabApi\n\tgetCategoriesArguments{}\n*/\n\nclass TdbApp extends AppBase implements RxApp {\n\tstatic type = 'app'\n\t// expected RxApp, some are already declared/set in AppBase\n\tapi: AppApi\n\ttype = 'app'\n\tparentId?: string\n\tdom!: {\n\t\t[index: string]: any\n\t}\n\tcomponents: {\n\t\t[name: string]: ComponentApi | { [name: string]: ComponentApi }\n\t} = {}\n\n\twasDestroyed = false\n\tstore: any\n\tbus!: any\n\n\t// expected class-specific props\n\n\tconstructor(opts, api) {\n\t\tsuper(opts)\n\t\tthis.opts = this.validateOpts(this.opts)\n\t\tthis.api = api\n\t\tthis.dom = this.getDom(this.opts)\n\t}\n\n\t// override AppBase.validateOpts()\n\tvalidateOpts(o) {\n\t\tif (o.vocabApi) {\n\t\t\t// verify it is an object returned by vocabInit()\n\t\t} else if (o.state && o.state.vocab) {\n\t\t\tif (typeof o.state.vocab != 'object') throw 'opts.state.vocab{} is not an object'\n\t\t} else if (o.state && o.state.genome) {\n\t\t\tconst s = o.state\n\t\t\tif (!s.vocab) s.vocab = {}\n\t\t\ts.vocab.genome = s.genome\n\t\t\tdelete s.genome\n\t\t\tif (s.dslabel) {\n\t\t\t\ts.vocab.dslabel = s.dslabel\n\t\t\t\tdelete s.dslabel\n\t\t\t}\n\t\t} else {\n\t\t\tthrow 'neither state.vocab{} or opts.vocabApi provided'\n\t\t}\n\t\tif (o.tree) {\n\t\t\tif (\n\t\t\t\to.tree.disable_terms &&\n\t\t\t\t!o.tree.click_term &&\n\t\t\t\t!o.tree.click_term2select_tvs &&\n\t\t\t\t(!o.barchart || !o.barchart.bar_click_override)\n\t\t\t) {\n\t\t\t\tthrow `opts.tree.disable_terms is used only when opts.tree.click_term, opts.tree.click_term2select_tvs, or opts.barchart.bar_click_override is set`\n\t\t\t}\n\n\t\t\t// opts.search{} is required, possibly in search.js\n\t\t\tif (!o.search) o.search = {}\n\n\t\t\tif (o.tree.click_term2select_tvs) {\n\t\t\t\t// create the callback on o.search{} so search.js code does not break\n\t\t\t\t// FIXME dispatch('submenu_set') is coded twice (also in tree.js)\n\t\t\t\to.search.click_term = term =>\n\t\t\t\t\tthis.api.dispatch({\n\t\t\t\t\t\ttype: 'submenu_set',\n\t\t\t\t\t\tsubmenu: { term, type: 'tvs' }\n\t\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (o.tree.click_term) {\n\t\t\t\t// no need to create extra on\n\n\t\t\t\to.tree.click_term_wrapper = async term => {\n\t\t\t\t\t// this function wraps user-defined click_term, to encapsulate some logic\n\n\t\t\t\t\tif (this.state.termdbConfig.isGeneSetTermdb) {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\tthe dataset is special-purpose that will map terms to gene sets (e.g. msigdb)\n\t\t\t\t\t\tdo this hardcoded behavior that upon clicking a term, it fetches the list of genes for this term\n\t\t\t\t\t\tand attaches to the term object as an ad-hoc attribute\n\t\t\t\t\t\tthe same behaviors are maintained in that the click_term() callback gets the term obj as well as the genes\n\t\t\t\t\t\t*/\n\t\t\t\t\t\tconst geneset = await dofetch3('termdb', {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tgenome: this.state.vocab.genome,\n\t\t\t\t\t\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\t\t\t\t\t\tgenesetByTermId: term.id\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\tterm._geneset = geneset\n\t\t\t\t\t}\n\n\t\t\t\t\t// call the click callback\n\t\t\t\t\to.tree.click_term(term)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (o.tree.disable_terms) o.search.disable_terms = o.tree.disable_terms\n\t\t}\n\t\tif (o.app) {\n\t\t\tfor (const [k, v] of Object.entries(o.app)) {\n\t\t\t\to[k] = v\n\t\t\t}\n\t\t\tdelete o.app\n\t\t}\n\t\treturn o\n\t}\n\n\tgetDom(opts) {\n\t\tif (!opts.holder) select('body').append('div')\n\n\t\t// do this in the constructor to have an dom.errdiv\n\t\t// available at any point during initialization\n\t\tconst submitDiv = opts.holder\n\t\t\t.append('div')\n\t\t\t.style('display', opts.tree?.submit_lst ? '' : 'none')\n\t\t\t.style('text-align', 'center')\n\t\t\t.style('margin', '10px 5px')\n\n\t\tconst submitBtn = submitDiv\n\t\t\t.append('button')\n\t\t\t.property('disabled', true)\n\t\t\t.on('click', () => this.opts.tree?.submit_lst(this.state.selectedTerms))\n\n\t\tconst topbar = opts.holder.append('div')\n\t\tconst termTypeSearchDiv = topbar.append('div').style('display', 'inline-block')\n\t\tconst treeDiv = topbar.append('div').style('display', 'inline-block').style('vertical-align', 'top')\n\n\t\treturn {\n\t\t\ttopbar,\n\t\t\tholder: opts.holder,\n\t\t\ttermTypeSearchDiv,\n\t\t\tsearchDiv: treeDiv.append('div'),\n\t\t\ttreeDiv: treeDiv.append('div'),\n\t\t\tcustomTermDiv: treeDiv.append('div').style('margin', '10px'),\n\t\t\tsubmitDiv,\n\t\t\tsubmitBtn,\n\t\t\tfilterDiv: topbar.append('div').style('display', 'none'),\n\t\t\terrdiv: opts.holder.append('div'),\n\t\t\ttip: new Menu({ padding: '5px' })\n\t\t}\n\t}\n\n\tasync preApiFreeze(api) {\n\t\ttry {\n\t\t\tif (this.opts.vocabApi) {\n\t\t\t\tapi.vocabApi = this.opts.vocabApi\n\t\t\t} else {\n\t\t\t\tconst state = {\n\t\t\t\t\tvocab: this.opts.state.vocab || {\n\t\t\t\t\t\tgenome: this.opts.state.genome,\n\t\t\t\t\t\tdslabel: this.opts.state.dslabel\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tapi.vocabApi = await vocabInit({ app: this.api, state, fetchOpts: this.opts.fetchOpts })\n\t\t\t}\n\t\t\tapi.appInit = appInit\n\t\t} catch (e) {\n\t\t\tconsole.log(e)\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync init() {\n\t\ttry {\n\t\t\tthis.store = await storeInit({ app: this.api, state: this.opts.state })\n\t\t\tthis.state = await this.store.copyState()\n\t\t\tthis.components = await this.getComponents()\n\t\t\tawait this.api.dispatch()\n\t\t} catch (e) {\n\t\t\tthis.printError(e)\n\t\t}\n\t}\n\n\tasync getComponents() {\n\t\tconst header_mode = this.state.nav?.header_mode\n\t\tconst compPromises: { [name: string]: Promise<ComponentApi> } = {\n\t\t\t/*\n\t\t \tTODO: may need to handle a cohort filter option as an OPTIONAL component \n\t\t filter: filterInit({\n\t\t\t\tapp: this.api,\n\t\t\t\tholder: this.dom.filterDiv\n\t\t }),\n\t\t\t***/\n\t\t\tsearch: searchInit({\n\t\t\t\tapp: this.api,\n\t\t\t\tholder: this.dom.searchDiv,\n\t\t\t\tisVisible: header_mode !== 'hide_search'\n\t\t\t}),\n\t\t\ttermTypeSearch: TermTypeSearchInit({\n\t\t\t\tapp: this.api,\n\t\t\t\tholder: this.dom.termTypeSearchDiv,\n\t\t\t\ttopbar: this.dom.topbar,\n\t\t\t\tgenome: this.opts.vocabApi?.app?.opts?.genome,\n\t\t\t\tclick_term: this.opts.tree?.click_term,\n\t\t\t\tsubmit_lst: this.opts.tree?.submit_lst,\n\t\t\t\tsubmitDiv: this.dom.submitDiv\n\t\t\t}),\n\t\t\ttree: treeInit({\n\t\t\t\tapp: this.api,\n\t\t\t\tholder: this.dom.treeDiv,\n\t\t\t\theaderDiv: this.dom.headerDiv,\n\t\t\t\texpandAll: header_mode == 'hide_search'\n\t\t\t})\n\t\t}\n\t\tif (this.opts.tree && this.opts.tree.click_term2select_tvs) {\n\t\t\tcompPromises.submenu = submenuInit({\n\t\t\t\tapp: this.api,\n\t\t\t\tholder: this.dom.holder.append('div').style('display', 'none')\n\t\t\t})\n\t\t}\n\n\t\treturn multiInit(compPromises)\n\t}\n\n\tasync main() {\n\t\tthis.api.vocabApi.main()\n\t\tconst n = this.state.selectedTerms.length\n\t\tthis.dom.submitBtn\n\t\t\t.property('disabled', !n)\n\t\t\t.text(!n ? 'Search or click term(s)' : `Submit ${n} term${n > 1 ? 's' : ''}`)\n\n\t\tthis.dom.holder.selectAll('search, .termbtn, button').attr('tabindex', 0)\n\t\tthis.dom.holder.selectAll('.termbtn').on('keyup', event => {\n\t\t\tif (event.key == 'Enter') event.target.click()\n\t\t})\n\t}\n\n\tprintError(e) {\n\t\tsayerror(this.dom.errdiv, 'Error: ' + (e.message || e))\n\t\tif (e.stack) console.log(e.stack)\n\t}\n}\n\n// must use the await keyword when using this appInit()\nexport const appInit = AppApi.getInitFxn(TdbApp)\n", "import { appInit } from '#termdb/app'\nimport { Menu } from '#dom'\n\n/*\nFIXME return tw but not term\n\na ui to select two terms from termdb tree and submit them to a callback\nexample usage: dynamic scatter using two numeric terms, facet table using any two terms\n\nargs:\n\ttip\n\t\tin which this ui is shown\n\tapp\n\t\t.getState()\n\tchartType:string\n\tdetail{}\n\t\toptional, filters both X & Y terms\n\tcallback\n\tdetail2{}\n\t\tif provided, only filters the Y term.\n\t\tUsed for the run chart that requires date for the first time and a numeric term for the second value that is not a date.\n*/\nexport function select2Terms(tip, app, chartType, detail, callback, detail2) {\n\tconst tip2 = new Menu({\n\t\t// creates tip2 on every launch\n\t\tpadding: '5px',\n\t\tparent_menu: tip.d.node() // uses tip as parent to avoid hiding tip when toggling tabs inside tip2\n\t})\n\n\t// registers each selected terms FIXME use tw\n\tlet xterm, yterm\n\n\t// label for each term. tailor by chartType\n\tlet xlab = 'X',\n\t\tylab = 'Y'\n\tif (chartType == 'facet') {\n\t\tylab = 'Row ' // spaces for equal width\n\t\txlab = 'Column'\n\t}\n\n\tconst d0 = tip.d.append('div').style('margin', '10px')\n\t{\n\t\tconst row = d0.append('div')\n\t\trow\n\t\t\t.append('span')\n\t\t\t.html(xlab + ' ')\n\t\t\t.style('font-family', 'Courier')\n\t\tconst xdiv = row\n\t\t\t.append('div')\n\t\t\t.attr('class', 'ts_pill sja_filter_tag_btn')\n\t\t\t.style('padding', '3px 6px')\n\t\t\t.style('border-radius', '6px')\n\t\t\t.text('+')\n\t\t\t.on('click', e => {\n\t\t\t\tgetTreeTerm(xdiv, term => (xterm = term), detail)\n\t\t\t})\n\t}\n\t{\n\t\tconst row = d0.append('div').style('margin', '1px 0px 5px 0px')\n\t\trow\n\t\t\t.append('span')\n\t\t\t.html(ylab + ' ')\n\t\t\t.style('font-family', 'Courier')\n\t\tconst ydiv = row\n\t\t\t.append('div')\n\t\t\t.attr('class', 'ts_pill sja_filter_tag_btn')\n\t\t\t.style('padding', '3px 6px')\n\t\t\t.style('border-radius', '6px')\n\t\t\t.text('+')\n\t\t\t.on('click', e => {\n\t\t\t\tgetTreeTerm(ydiv, term => (yterm = term), detail2 || detail)\n\t\t\t})\n\t}\n\n\tconst row = d0.append('div')\n\tconst submitBtn = row\n\t\t.append('button')\n\t\t.text('Submit')\n\t\t.property('disabled', true)\n\t\t.on('click', () => {\n\t\t\tcallback(xterm, yterm)\n\t\t\ttip.hide()\n\t\t})\n\trow.append('span').html(' Select two variables to plot').style('opacity', 0.6).style('font-size', '.7em')\n\n\tfunction getTreeTerm(div, callback, detail) {\n\t\tconst disable_terms = []\n\t\tif (xterm) disable_terms.push(xterm)\n\t\tif (yterm) disable_terms.push(yterm)\n\t\tappInit({\n\t\t\tholder: tip2.clear().showunder(div.node()).d,\n\t\t\tvocabApi: app.vocabApi,\n\t\t\tstate: {\n\t\t\t\tactiveCohort: app.getState().activeCohort,\n\t\t\t\ttree: { usecase: { detail, target: chartType } }\n\t\t\t},\n\t\t\ttree: {\n\t\t\t\tdisable_terms,\n\t\t\t\tclick_term: term => {\n\t\t\t\t\t/////////////////////////////////////////\n\t\t\t\t\t// note! geneVariant yields a tw but not term; future fix is for this ui to return tw but not term\n\t\t\t\t\t/////////////////////////////////////////\n\t\t\t\t\tconst t = term.term || term\n\t\t\t\t\tcallback(t)\n\t\t\t\t\ttip2.hide()\n\t\t\t\t\tdiv.text(t.name)\n\t\t\t\t\tif (xterm != null && yterm != null) submitBtn.property('disabled', false)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n", "export function first_genetrack_tolist(genome, lst) {\n\tif (!genome.tracks) return\n\tfor (const t of genome.tracks) {\n\t\tif (t.__isgene) {\n\t\t\tlst.push(t)\n\t\t\treturn\n\t\t}\n\t}\n}\n", "import { TermTypes } from '#shared/terms.js'\nimport { dofetch3 } from '../src/client'\n\n/*\nto retrieve the termjson object of one term, using its id\nonly works for a termdb-enabled dataset\n\nif the function is attached to an instance with .state{ dslabel, genome }, then simply call:\n\tawait instance.getterm( ? )\n\notherwise, do:\n\tawait getterm( id, dslabel, genome )\n\n*/\n\nconst cache = { serverData: {} }\n\n/*\n\tGiven data of a sample and a filter, return if the sample match the filter\n\t\trow:{} data of a sample\n\t\tfilter\n\t\tgeneVariant$ids: [] array of $id of the geneVariant terms (in the matrix)\n*/\nexport function sample_match_termvaluesetting(row, filter, geneVariant$ids) {\n\tconst lst = !filter ? [] : filter.type == 'tvslst' ? filter.lst : [filter]\n\tlet numberofmatchedterms = 0\n\n\t/* for AND, require all terms to match */\n\tfor (const item of lst) {\n\t\tif (item.type == 'tvslst') {\n\t\t\tif (sample_match_termvaluesetting(row, item)) {\n\t\t\t\tnumberofmatchedterms++\n\t\t\t}\n\t\t} else {\n\t\t\tconst t = item.tvs\n\t\t\tlet samplevalue\n\t\t\tif (t.term.type == 'geneVariant') {\n\t\t\t\tsamplevalue = geneVariant$ids.map(g => row[g]).filter(s => s) // filter out the genes that are not annotated for the sample\n\t\t\t} else if (\n\t\t\t\tt.term.type == 'integer' ||\n\t\t\t\tt.term.type == 'float' ||\n\t\t\t\tt.term.type == TermTypes.GENE_EXPRESSION ||\n\t\t\t\tt.term.type == TermTypes.METABOLITE_INTENSITY\n\t\t\t) {\n\t\t\t\tsamplevalue = row[t.term.id] || row[t.term.$id]?.key\n\t\t\t} else if (t.term.type == 'survival') {\n\t\t\t\tsamplevalue = row[t.term.$id]?.key\n\t\t\t} else {\n\t\t\t\tsamplevalue = row[t.term.id] || row[t.term.$id]?.value\n\t\t\t}\n\t\t\tlet thistermmatch\n\n\t\t\tif (t.term.type == 'categorical') {\n\t\t\t\tif (samplevalue === undefined) {\n\t\t\t\t\t// this sample has no anno for this term, check isnot\n\t\t\t\t\tif (t.isnot) thistermmatch = !thistermmatch\n\t\t\t\t\tif (thistermmatch) numberofmatchedterms++\n\t\t\t\t\tcontinue\n\t\t\t\t\t// t may be frozen, should not modify to attach valueset if missing\n\t\t\t\t}\n\t\t\t\tconst valueset = t.valueset ? t.valueset : new Set(t.values.map(i => i.key))\n\t\t\t\tthistermmatch = valueset.has(samplevalue)\n\t\t\t} else if (\n\t\t\t\tt.term.type == 'integer' ||\n\t\t\t\tt.term.type == 'float' ||\n\t\t\t\tt.term.type == TermTypes.GENE_EXPRESSION ||\n\t\t\t\tt.term.type == TermTypes.METABOLITE_INTENSITY\n\t\t\t) {\n\t\t\t\tif (samplevalue === undefined) {\n\t\t\t\t\t// this sample has no anno for this term, check isnot\n\t\t\t\t\tif (t.isnot) thistermmatch = !thistermmatch\n\t\t\t\t\tif (thistermmatch) numberofmatchedterms++\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tfor (const range of t.ranges) {\n\t\t\t\t\tif ('value' in range) {\n\t\t\t\t\t\tthistermmatch = samplevalue === range.value // || \"\"+samplevalue == range.value || samplevalue == \"\"+range.value //; if (thistermmatch) console.log(i++)\n\t\t\t\t\t\tif (thistermmatch) break\n\t\t\t\t\t} else if (samplevalue == range.name) {\n\t\t\t\t\t\tthistermmatch = true\n\t\t\t\t\t\tbreak\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// actual range\n\t\t\t\t\t\tif (t.term.values) {\n\t\t\t\t\t\t\tconst v = t.term.values[samplevalue.toString()]\n\t\t\t\t\t\t\tif (v && v.uncomputable) {\n\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlet left, right\n\t\t\t\t\t\tif (range.startunbounded) {\n\t\t\t\t\t\t\tleft = true\n\t\t\t\t\t\t} else if ('start' in range) {\n\t\t\t\t\t\t\tif (range.startinclusive) {\n\t\t\t\t\t\t\t\tleft = samplevalue >= range.start\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tleft = samplevalue > range.start\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (range.stopunbounded) {\n\t\t\t\t\t\t\tright = true\n\t\t\t\t\t\t} else if ('stop' in range) {\n\t\t\t\t\t\t\tif (range.stopinclusive) {\n\t\t\t\t\t\t\t\tright = samplevalue <= range.stop\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tright = samplevalue < range.stop\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthistermmatch = left && right\n\t\t\t\t\t}\n\t\t\t\t\tif (thistermmatch) break\n\t\t\t\t}\n\t\t\t} else if (t.term.type == 'condition') {\n\t\t\t\tconst key = getPrecomputedKey(t)\n\t\t\t\tconst anno = samplevalue && samplevalue[key]\n\t\t\t\tif (anno) {\n\t\t\t\t\tthistermmatch = Array.isArray(anno)\n\t\t\t\t\t\t? t.values.find(d => anno.includes(d.key))\n\t\t\t\t\t\t: t.values.find(d => d.key == anno)\n\t\t\t\t}\n\t\t\t} else if (t.term.type == 'survival') {\n\t\t\t\tif (samplevalue === undefined) {\n\t\t\t\t\t// this sample has no anno for this term, check isnot\n\t\t\t\t\tif (t.isnot) thistermmatch = !thistermmatch\n\t\t\t\t\tif (thistermmatch) numberofmatchedterms++\n\t\t\t\t\tcontinue\n\t\t\t\t\t// t may be frozen, should not modify to attach valueset if missing\n\t\t\t\t}\n\t\t\t\tconst valueset = t.valueset ? t.valueset : new Set(t.values.map(i => i.key))\n\t\t\t\tthistermmatch = valueset.has(samplevalue)\n\t\t\t} else if (t.term.type == 'geneVariant' && t.legendFilterType == 'geneVariant_hard') {\n\t\t\t\t// handle a matrix legend hard filter\n\t\t\t\t// values: [{ dt, origin, mclasslst:[key] }]\n\t\t\t\tconst f = t.values[0] //matrix geneVariant legend filter only has one item in tvs.values\n\t\t\t\tthistermmatch =\n\t\t\t\t\tsamplevalue.find(s => {\n\t\t\t\t\t\tfor (const v of s.values) {\n\t\t\t\t\t\t\tif (v.dt == f.dt && (!v.origin || v.origin == f.origin) && f.mclasslst.includes(v.class)) return true\n\t\t\t\t\t\t}\n\t\t\t\t\t}) && true\n\t\t\t} else if (t.term.type == TermTypes.SINGLECELL_GENE_EXPRESSION) {\n\t\t\t} else {\n\t\t\t\tthrow 'unknown term type'\n\t\t\t}\n\n\t\t\tif (t.isnot) {\n\t\t\t\tthistermmatch = !thistermmatch\n\t\t\t}\n\t\t\tif (thistermmatch) numberofmatchedterms++\n\t\t}\n\n\t\t// if one tvslst is matched with an \"or\" (Set UNION), then sample is okay\n\t\tif (filter.join == 'or' && numberofmatchedterms) return true\n\t}\n\n\t// for join=\"and\" (Set intersection)\n\tif (numberofmatchedterms == lst.length) return true\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["t", "e", "s", "r", "o", "i", "n", "l", "c", "appear", "disappear", "gmmode", "tkt", "id", "event", "event", "id", "i", "i", "tip", "event", "i", "tip", "event", "position", "tip", "name", "tip", "event", "geneSymbol", "dbsnp", "event", "import_debounce", "event", "t", "i", "event", "checked", "self", "i", "id", "$id", "filter", "i", "setRenderers", "self", "i", "event", "filter", "t", "setInteractivity", "self", "event", "filter", "d", "i", "t", "jwt", "cache", "i", "match", "filter", "term", "data", "t", "i", "key", "id", "body", "$id", "t", "i", "key", "id", "filter", "term", "minvalue", "t", "setInteractivity", "setRenderers", "i", "filter", "$id", "i", "match", "process", "dataURL", "i", "id", "match", "format", "cache", "font", "node", "filter", "i", "t", "i", "event", "id", "i", "d", "value", "termType", "termType", "termType", "termType", "termType", "termType", "i", "self", "q", "filter", "i", "vocabApi", "t", "QualitativeBase", "i", "self", "id", "t", "i", "i", "i", "i", "acc", "ext", "start", "final", "ext", "qmark", "star", "defaults", "regExpEscape", "i", "self", "event", "self", "event", "tip", "t", "globImport_handlers_ts", "self", "event", "t", "tip", "i", "setRenderers", "t", "self", "event", "event", "path", "event", "import_debounce", "event", "i", "d", "t", "opts", "defaults", "i", "_opts", "t", "i", "setRenderers", "self", "event", "t", "activeTabIndex", "i", "event", "box", "setInteractivity", "setRenderers", "filter", "event", "t", "id", "self", "i", "i", "filter", "t", "event", "i", "globImport_handlers_ts", "tab", "setRenderers", "self", "import_debounce", "setRenderers", "setInteractivity", "self", "t", "event", "i", "event", "tip", "tip2", "row", "callback", "detail", "t", "t", "tkt", "gmmode", "appear", "disappear", "event", "types", "i", "x", "start", "stop", "ctx", "h", "color", "pad", "div", "t", "tip", "tr", "rgb", "filter", "t", "i", "range", "Partjson", "i", "id", "v", "d", "i", "Partjson"]
|
|
7
|
+
}
|