@sjcrh/proteinpaint-client 2.135.1 → 2.135.2-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{2dmaf-OKVQIVV4.js → 2dmaf-E6HNBNJK.js} +6 -6
- package/dist/{AppHeader-JX5XDPOB.js → AppHeader-MAZNYXEJ.js} +14 -14
- package/dist/{Disco-VMJEYX7S.js → Disco-VDHTF4EQ.js} +8 -8
- package/dist/{Disco.UI-JABO5EEQ.js → Disco.UI-UCVOHFW2.js} +9 -9
- package/dist/{HicApp-YORXEYLO.js → HicApp-SX7ODWXE.js} +8 -8
- package/dist/{Volcano-CCUB56LY.js → Volcano-CHB56C4Z.js} +9 -9
- package/dist/{WSISamplesPlot-RMXT6KOX.js → WSISamplesPlot-TMYFRUYO.js} +7 -7
- package/dist/{WSIViewer-IYKNEJDW.js → WSIViewer-WGLWFYJH.js} +6 -6
- package/dist/{adSandbox-QCU54DWR.js → adSandbox-IJHIHP7L.js} +7 -7
- package/dist/{app-HPNXUQ5W.js → app-PGVYIMOA.js} +20 -20
- package/dist/{app-ZMO3Y76U.js → app-WGYPDVM6.js} +6 -6
- package/dist/app.js +12 -12
- package/dist/{bam-QSMV5PBO.js → bam-NQDQ4FD5.js} +8 -8
- package/dist/{barchart-3WU5RWT7.js → barchart-L3RGQAM5.js} +9 -9
- package/dist/{barchart.data-FN247I25.js → barchart.data-LF3LKH64.js} +6 -6
- package/dist/{barchart.events-C2BKWCQD.js → barchart.events-MIHRSRJB.js} +9 -9
- package/dist/{block-E6ZAGAME.js → block-QBZZCTQE.js} +27 -27
- package/dist/{block.init-SS7PNMZ4.js → block.init-VKCYGG47.js} +7 -7
- package/dist/{block.mds.expressionrank-N76M4SER.js → block.mds.expressionrank-23VEEAKI.js} +8 -8
- package/dist/{block.mds.geneboxplot-V65GIE5O.js → block.mds.geneboxplot-A46AWVHU.js} +7 -7
- package/dist/{block.mds.junction-PCYJAGNH.js → block.mds.junction-VRJEVMUO.js} +14 -14
- package/dist/{block.mds.svcnv-W524V5CX.js → block.mds.svcnv-IHMGASDD.js} +20 -20
- package/dist/{block.svg-D7LFRALC.js → block.svg-NW5YUXIA.js} +6 -6
- package/dist/{block.tk.aicheck-LESQWKGQ.js → block.tk.aicheck-ELX44CK2.js} +6 -6
- package/dist/{block.tk.ase-5HJAED7A.js → block.tk.ase-RCZ6B2N6.js} +8 -8
- package/dist/{block.tk.bam-AUN22QWR.js → block.tk.bam-HKBLBQ67.js} +6 -6
- package/dist/{block.tk.bedgraphdot-SWTS6FZG.js → block.tk.bedgraphdot-ZOMDIGY3.js} +6 -6
- package/dist/{block.tk.bigwig.ui-HKHVV4CR.js → block.tk.bigwig.ui-TPGFVNPF.js} +6 -6
- package/dist/{block.tk.hicstraw-FYIOG5H3.js → block.tk.hicstraw-UHBNEB72.js} +7 -7
- package/dist/{block.tk.junction-2NW73GAU.js → block.tk.junction-N2YN35II.js} +11 -11
- package/dist/{block.tk.junction.textmatrixui-UY7H4DDA.js → block.tk.junction.textmatrixui-7B4QSZRQ.js} +7 -7
- package/dist/{block.tk.ld-3CZ6COL2.js → block.tk.ld-TZHWAR6G.js} +9 -9
- package/dist/{block.tk.menu-DISF7F3R.js → block.tk.menu-AS5SHN2W.js} +6 -6
- package/dist/{block.tk.pgv-DEG4VUNR.js → block.tk.pgv-TPM5E3QM.js} +9 -9
- package/dist/{boxplot-CFMEYYJJ.js → boxplot-N5OI2HY6.js} +9 -9
- package/dist/{brainImaging-QUSOD2VL.js → brainImaging-Q55XUH2E.js} +8 -8
- package/dist/{categorical-JBATOWF7.js → categorical-B347PA4U.js} +7 -7
- package/dist/{chunk-ZB2WHFWF.js → chunk-33DWF3FF.js} +4 -4
- package/dist/{chunk-GYFGL27E.js → chunk-3TX45ACE.js} +3 -3
- package/dist/{chunk-YCYBH4EW.js → chunk-4FDOZ23V.js} +125 -124
- package/dist/chunk-4FDOZ23V.js.map +7 -0
- package/dist/{chunk-M5YXCILD.js → chunk-5PIAFQ67.js} +2 -2
- package/dist/{chunk-7Z3NR2LZ.js → chunk-5VX3CXQ3.js} +3 -2
- package/dist/chunk-5VX3CXQ3.js.map +7 -0
- package/dist/{chunk-NIOOMPXC.js → chunk-64PFBK7R.js} +3 -3
- package/dist/{chunk-LC6ELBRE.js → chunk-6JUTHLZE.js} +2 -2
- package/dist/{chunk-7FV2INJI.js → chunk-6ZGPHCQ5.js} +3 -3
- package/dist/{chunk-CSHB56YZ.js → chunk-6ZPEEVHY.js} +2 -2
- package/dist/{chunk-2IKPSAVD.js → chunk-AFVPN2AK.js} +12 -12
- package/dist/{chunk-JPZAGEQS.js → chunk-ATCGA6SR.js} +7 -7
- package/dist/{chunk-W5LWVWPZ.js → chunk-BBAVUQU5.js} +10 -10
- package/dist/{chunk-NF775D2Y.js → chunk-BU7DHIOK.js} +3 -3
- package/dist/{chunk-U4UQNC2G.js → chunk-D7FABEBC.js} +4 -4
- package/dist/{chunk-DGKWL53O.js → chunk-D7SLEHQG.js} +2 -2
- package/dist/{chunk-6LRX64BI.js → chunk-DMWZ47SR.js} +3 -3
- package/dist/{chunk-GYAPO552.js → chunk-DREHXLD7.js} +2 -2
- package/dist/{chunk-SFGXU7LX.js → chunk-DUNCSRGN.js} +3 -3
- package/dist/{chunk-JQW65AIG.js → chunk-DZWBLK76.js} +5 -5
- package/dist/{chunk-GQAG5AN7.js → chunk-EF3KRNGH.js} +2 -2
- package/dist/{chunk-FIZP3345.js → chunk-EM6BFOPR.js} +3 -3
- package/dist/{chunk-LOTJWW6S.js → chunk-ENLG2OGS.js} +3 -3
- package/dist/{chunk-L7ACODWG.js → chunk-FXEPPQCW.js} +8 -8
- package/dist/{chunk-W7ONTJGW.js → chunk-FXV2SD2W.js} +2 -2
- package/dist/{chunk-GRVFADHP.js → chunk-FYFFYF5X.js} +5 -5
- package/dist/{chunk-BWSZ4L7N.js → chunk-FYQC5772.js} +7 -7
- package/dist/{chunk-XEMFX4SE.js → chunk-GQIRSNJ5.js} +4 -4
- package/dist/{chunk-EGRTRM2V.js → chunk-GWCMFYUD.js} +88 -88
- package/dist/{chunk-6Z3E6LCU.js → chunk-HAG3ZQV5.js} +2 -2
- package/dist/{chunk-NX57GJ7O.js → chunk-HBSFAHGZ.js} +46 -46
- package/dist/{chunk-3QCGJXNI.js → chunk-IMXYAQRH.js} +9 -10
- package/dist/chunk-IMXYAQRH.js.map +7 -0
- package/dist/{chunk-RBRAAJSI.js → chunk-JR37IU5O.js} +38 -9
- package/dist/chunk-JR37IU5O.js.map +7 -0
- package/dist/{chunk-A7LPCHFM.js → chunk-K3MGHF73.js} +11 -11
- package/dist/{chunk-P4H6CHRM.js → chunk-KJR2KZCM.js} +4 -4
- package/dist/{chunk-IT75ROC3.js → chunk-LFKXBEJU.js} +3 -3
- package/dist/{chunk-RQET6346.js → chunk-LJUQOCOW.js} +94 -94
- package/dist/{chunk-LVMYO3EF.js → chunk-LKGF6NHM.js} +3 -3
- package/dist/{chunk-URGWNNJF.js → chunk-MMM5BQTF.js} +8 -8
- package/dist/{chunk-I6TLN2OR.js → chunk-N2TEPJXS.js} +5 -5
- package/dist/{chunk-N2LZAZBC.js → chunk-NUJSVEJY.js} +3 -3
- package/dist/{chunk-W424NX2H.js → chunk-O7YQ4QWF.js} +2 -2
- package/dist/{chunk-U6CRL7IJ.js → chunk-PDCHOIX4.js} +3 -3
- package/dist/{chunk-MVCBBNFT.js → chunk-PIHGGU3H.js} +3 -3
- package/dist/{chunk-NVPHXDYL.js → chunk-PTG3DY75.js} +6 -6
- package/dist/{chunk-BNWCX44Z.js → chunk-PTOT7EU2.js} +2 -2
- package/dist/{chunk-XIQ65PVX.js → chunk-QMEPEBSM.js} +2 -2
- package/dist/{chunk-2LTOFU43.js → chunk-QQKEJ7QE.js} +87 -87
- package/dist/{chunk-OKMM7IKW.js → chunk-QZQIW25Q.js} +3 -3
- package/dist/{chunk-AAADNNCW.js → chunk-R3QFLBP3.js} +3 -3
- package/dist/{chunk-SK3NXLLY.js → chunk-S7RQDPHP.js} +90 -90
- package/dist/{chunk-JUXYQ5EJ.js → chunk-SH4YGXJC.js} +10 -10
- package/dist/{chunk-MWGQBGLF.js → chunk-SHV3Y6D6.js} +7 -7
- package/dist/{chunk-FBRTEWIG.js → chunk-SLKXRGMY.js} +6 -6
- package/dist/{chunk-32WBXZXK.js → chunk-TTFJA53D.js} +5 -5
- package/dist/{chunk-5GGFJVD7.js → chunk-UCJJUJNV.js} +2 -2
- package/dist/{chunk-6QDMJZEH.js → chunk-URGRZHRE.js} +2 -2
- package/dist/{chunk-QTWKTJNI.js → chunk-VB6IANQH.js} +2 -2
- package/dist/{chunk-3DNHZAJC.js → chunk-VBQBPNCJ.js} +7 -7
- package/dist/{chunk-3DNHZAJC.js.map → chunk-VBQBPNCJ.js.map} +2 -2
- package/dist/{chunk-Z6MJT6XW.js → chunk-VING5FB2.js} +23 -23
- package/dist/{chunk-HIKULOUG.js → chunk-VKWC3AK5.js} +12 -12
- package/dist/{chunk-B4OCUWGH.js → chunk-VPQCI5N7.js} +2 -2
- package/dist/{chunk-RTKZ3D7S.js → chunk-WRIEJGDJ.js} +4 -4
- package/dist/{chunk-R6QWH7WY.js → chunk-X3ZKV2AV.js} +13 -13
- package/dist/{chunk-27OOW36L.js → chunk-YHWMNKIX.js} +4 -4
- package/dist/{chunk-BTMXWDMY.js → chunk-YIURQAD6.js} +3 -3
- package/dist/{chunk-EANVYJGZ.js → chunk-YPWVTJ4U.js} +13 -13
- package/dist/{chunk-NA6KDFYD.js → chunk-Z2EYNEEX.js} +4 -4
- package/dist/{chunk-JBNO2HI5.js → chunk-ZDDQA4QW.js} +9 -9
- package/dist/{condition-NCFA5B4H.js → condition-VCJ35K52.js} +6 -6
- package/dist/{controls-A5FWLUH5.js → controls-VAY2R5AG.js} +8 -8
- package/dist/{controls.config-NCIEXAO4.js → controls.config-QSAZIUU7.js} +7 -7
- package/dist/{correlation-7QUA7AJ3.js → correlation-IYJKT6IM.js} +20 -20
- package/dist/{correlationVolcano-IBVPILAK.js → correlationVolcano-IC4WDS4T.js} +8 -8
- package/dist/{cuminc-7INXHKEU.js → cuminc-6NJWC7EL.js} +8 -8
- package/dist/{customdata.inputui-BHCKRA6Z.js → customdata.inputui-R4ATW6CE.js} +6 -6
- package/dist/{dataDownload-O3V7EQRT.js → dataDownload-4QAMCQ2O.js} +6 -6
- package/dist/{databrowser.ui-UMQ6QLNC.js → databrowser.ui-TJQDIOP6.js} +20 -20
- package/dist/{density-JEAPSCWR.js → density-5VYXBA2V.js} +4 -4
- package/dist/{dictionary-NMLOHCHU.js → dictionary-4F3D3SLV.js} +6 -6
- package/dist/{differentialAnalysis-FNWA3UQ4.js → differentialAnalysis-WUSVBMRE.js} +12 -12
- package/dist/{e2pca-3Y36SWF3.js → e2pca-BEPOMHXJ.js} +6 -6
- package/dist/{ep-SN65NXSO.js → ep-BTAMJCWC.js} +6 -6
- package/dist/{expclust.gdc.spec-XDDM5EUK.js → expclust.gdc.spec-422255DR.js} +14 -14
- package/dist/{facet-EZF3KSN7.js → facet-M4W7YHKR.js} +8 -8
- package/dist/{frequencyChart-YMKQPMMG.js → frequencyChart-IDJATXXJ.js} +13 -13
- package/dist/{frequencyChart.integration.spec-7TDBWKXD.js → frequencyChart.integration.spec-ICICJV2C.js} +14 -14
- package/dist/{geneExpClustering-MZDICSFR.js → geneExpClustering-FZPIOHE7.js} +8 -8
- package/dist/{geneExpression-Q7TWJE5I.js → geneExpression-5ZOMHESP.js} +5 -5
- package/dist/{geneExpression-EFKFEITO.js → geneExpression-LDROP42A.js} +6 -6
- package/dist/{geneExpression-CIOFR4NZ.js → geneExpression-OOUYZMP5.js} +6 -6
- package/dist/{geneORA-22TGPXBD.js → geneORA-4EFHDFTG.js} +8 -8
- package/dist/{geneVariant-OSQXVWDL.js → geneVariant-7GOMOWQD.js} +6 -6
- package/dist/{geneVariant-LMFNE5YY.js → geneVariant-IQFDHXCG.js} +6 -6
- package/dist/{genefusion.ui-UN3J75KY.js → genefusion.ui-AG5A63TC.js} +6 -6
- package/dist/{geneset-USGWTM7F.js → geneset-J34ESO6B.js} +6 -6
- package/dist/{genomeBrowser-ZNNOZFNL.js → genomeBrowser-NBYRMXNJ.js} +9 -9
- package/dist/{genomeBrowser.controls-ASAFYENK.js → genomeBrowser.controls-H6VDXIC7.js} +7 -7
- package/dist/{genomeBrowser.spec-L53YLB5C.js → genomeBrowser.spec-PKDOUPT3.js} +14 -14
- package/dist/{grin2-QSP7G3WO.js → grin2-J4HVT4RJ.js} +453 -255
- package/dist/grin2-J4HVT4RJ.js.map +7 -0
- package/dist/{groupsetting-IQKHVQPO.js → groupsetting-O2QSTFBD.js} +6 -6
- package/dist/{gsea-TNRJBB56.js → gsea-6UGZ7ZDM.js} +10 -10
- package/dist/{hierCluster-JH26TIA7.js → hierCluster-3KHWIHOW.js} +23 -23
- package/dist/{hierCluster-WFSD3V2Q.js → hierCluster-Q5ZZ42VB.js} +24 -24
- package/dist/{hierCluster.config-NZW66EEN.js → hierCluster.config-MZE4UUJP.js} +9 -9
- package/dist/{hierCluster.integration.spec-ASIZYYQI.js → hierCluster.integration.spec-RGRKOEFJ.js} +16 -16
- package/dist/{hierCluster.interactivity-FKCZVQOL.js → hierCluster.interactivity-4QDTY4LI.js} +7 -7
- package/dist/{hierCluster.renderers-6WEFBCNR.js → hierCluster.renderers-O7SFUMWK.js} +4 -4
- package/dist/{imagePlot-4WZJ3PIK.js → imagePlot-NMIRLHHN.js} +9 -9
- package/dist/{launch.adhoc-HV2XBU2J.js → launch.adhoc-DNJAK2PV.js} +9 -9
- package/dist/{leftlabel.sample-3Z7AD5UG.js → leftlabel.sample-CI4LHU53.js} +10 -10
- package/dist/{lollipop-LI23HDIA.js → lollipop-3XYW2RCY.js} +8 -8
- package/dist/{maf-PFEIWXOJ.js → maf-NDDKEMOB.js} +6 -6
- package/dist/{maftimeline-KSQMPQC3.js → maftimeline-PDNYKCR3.js} +6 -6
- package/dist/{matrix-IEW2FIAZ.js → matrix-7JJHZLXR.js} +20 -20
- package/dist/{matrix-P3YKH6YF.js → matrix-QSGTJIMD.js} +20 -20
- package/dist/{matrix.cells-XF4BHZ6J.js → matrix.cells-M77EC2QE.js} +5 -5
- package/dist/{matrix.config-Y2I4YZWH.js → matrix.config-CDSBBJCP.js} +8 -8
- package/dist/{matrix.controls-UFYAXNO2.js → matrix.controls-MNV4FRDX.js} +9 -9
- package/dist/{matrix.data-BQW474XY.js → matrix.data-UCLXTH3U.js} +7 -7
- package/dist/{matrix.groups-UQ723YEC.js → matrix.groups-SOL5P7CG.js} +5 -5
- package/dist/{matrix.integration.spec-NMKPY4RA.js → matrix.integration.spec-M3G6JZW4.js} +15 -15
- package/dist/{matrix.interactivity-XBS4M3IX.js → matrix.interactivity-L43OZLBR.js} +7 -7
- package/dist/{matrix.layout-4ZSNT6VB.js → matrix.layout-7BOJ3ZHG.js} +7 -7
- package/dist/{matrix.legend-Z5IW6WBE.js → matrix.legend-YBFBNX63.js} +4 -4
- package/dist/{matrix.renderers-XOBPFA5M.js → matrix.renderers-EKF3OGFS.js} +7 -7
- package/dist/{matrix.serieses-LPOIDDIM.js → matrix.serieses-ZLT6NZCU.js} +6 -6
- package/dist/{matrix.sort-A7N4DXTZ.js → matrix.sort-IG4AN53M.js} +4 -4
- package/dist/{matrix.sort.unit.spec-OHDG2Y6A.js → matrix.sort.unit.spec-BBSKK6QX.js} +8 -8
- package/dist/{matrix.sorterUi-GUN3S742.js → matrix.sorterUi-DDLJPQRT.js} +3 -3
- package/dist/{matrix.sorterUi.unit.spec-KTGUQRKD.js → matrix.sorterUi.unit.spec-JTPP2AMH.js} +10 -10
- package/dist/{mavb-S3FSNUKX.js → mavb-5QRUAYS4.js} +7 -7
- package/dist/{mds.fimo-TBQD23W2.js → mds.fimo-DQURACEK.js} +6 -6
- package/dist/{mds.samplescatterplot-HHXI6TKL.js → mds.samplescatterplot-7FKG4ADT.js} +8 -8
- package/dist/{mds.survivalplot-NNCLXVZO.js → mds.survivalplot-I4OS35TG.js} +6 -6
- package/dist/{metaboliteIntensity-JW6THF2K.js → metaboliteIntensity-JLOIT4XI.js} +6 -6
- package/dist/{numeric-KN2SFXIW.js → numeric-LROWA5OL.js} +6 -6
- package/dist/{numeric.binary-YBDSLFOF.js → numeric.binary-FS7DKV2S.js} +8 -8
- package/dist/{numeric.continuous-BER3DMAK.js → numeric.continuous-FMNKYXBS.js} +6 -6
- package/dist/{numeric.discrete-HYF5C5TH.js → numeric.discrete-ZMLJR4EC.js} +8 -8
- package/dist/{numeric.spline-R4IBKAUX.js → numeric.spline-Q5O2NPAD.js} +7 -7
- package/dist/{numeric.toggle-TZ5QHXGK.js → numeric.toggle-U7KTKH4U.js} +7 -7
- package/dist/{numericDictTermCluster-WG3JWVDZ.js → numericDictTermCluster-F2JUNE2V.js} +3 -3
- package/dist/{oncomatrix-EFNJEDDZ.js → oncomatrix-634CKJ4E.js} +8 -8
- package/dist/{oncomatrix.spec-TZL7R35W.js → oncomatrix.spec-O6GDRRJ6.js} +14 -14
- package/dist/{plot.2dvaf-ROCDS24P.js → plot.2dvaf-ALIJNBTJ.js} +6 -6
- package/dist/{plot.app-PVUWL7ZX.js → plot.app-LYCN45FY.js} +8 -8
- package/dist/{plot.barplot-OCKKWA6B.js → plot.barplot-XYHLJOT6.js} +6 -6
- package/dist/{plot.boxplot-L7DUSRM5.js → plot.boxplot-HHDEWSN5.js} +6 -6
- package/dist/{plot.brainImaging-Y6YUZC3D.js → plot.brainImaging-SZQJQWAO.js} +2 -2
- package/dist/{plot.disco-WXA7NB75.js → plot.disco-ASGYIHFD.js} +6 -6
- package/dist/{plot.dzi-PXGVXF2N.js → plot.dzi-7MENAHHE.js} +2 -2
- package/dist/{plot.ssgq-MDVFBDTX.js → plot.ssgq-MEJJO5F2.js} +7 -7
- package/dist/{plot.vaf2cov-CV3HTOXB.js → plot.vaf2cov-BC5K45AX.js} +6 -6
- package/dist/{plot.wsi-2L5VVJCJ.js → plot.wsi-IGB2KRNO.js} +2 -2
- package/dist/{profile.spec-MXMAGRHW.js → profile.spec-O3IPZPH7.js} +14 -14
- package/dist/{profileBarchart-JXQ4CZUJ.js → profileBarchart-XE2GTL5B.js} +10 -10
- package/dist/{profileForms-PXH5JUV4.js → profileForms-DVT53KQQ.js} +10 -10
- package/dist/{profilePlot-WLEGZKGK.js → profilePlot-5SANIMTN.js} +10 -10
- package/dist/{profilePolar-FRDDVOJA.js → profilePolar-TO5PLEEY.js} +10 -10
- package/dist/{profileRadar-YOUUN5IW.js → profileRadar-3OWMVP4Z.js} +10 -10
- package/dist/{profileRadarFacility-6UJPGSKX.js → profileRadarFacility-HFICMHX3.js} +10 -10
- package/dist/{regression-LBCJKRSY.js → regression-IUN2TIKQ.js} +16 -16
- package/dist/{regression.inputs-D3PBJ5NE.js → regression.inputs-2A7LGHXY.js} +16 -16
- package/dist/{regression.inputs.term-C53J2WOS.js → regression.inputs.term-IPXAQXGF.js} +16 -16
- package/dist/{regression.inputs.values.table-LRYZ5KZU.js → regression.inputs.values.table-MSE4UD7C.js} +14 -14
- package/dist/{regression.results-ZLVPCYU4.js → regression.results-3WNV6VQJ.js} +7 -7
- package/dist/{report-QY5DCTLC.js → report-EHXGM7VK.js} +93 -93
- package/dist/{runChart-2P6WJDUB.js → runChart-7BU2Q43V.js} +13 -13
- package/dist/{runchart.integration.spec-LWIMPOO5.js → runchart.integration.spec-TUN3I6CZ.js} +14 -14
- package/dist/{sampleScatter-ZFTT2GPK.js → sampleScatter-IRDGHEIH.js} +12 -12
- package/dist/{sampleView-4THGTXT5.js → sampleView-HH6ZXOA7.js} +9 -9
- package/dist/{samplelst-524FPKEL.js → samplelst-L46C45KF.js} +6 -6
- package/dist/{samplematrix-FACFCH7J.js → samplematrix-QP2HGUUM.js} +8 -8
- package/dist/{sc-FOHQ7TGP.js → sc-T7MIGPEG.js} +6 -6
- package/dist/{scatter.integration.spec-XNAQVECZ.js → scatter.integration.spec-7ZME4YI4.js} +14 -14
- package/dist/{selectGenomeWithTklst-VEMYQKBI.js → selectGenomeWithTklst-MAHCAX3S.js} +7 -7
- package/dist/{singleCellCellType-ZMZOZPR6.js → singleCellCellType-7ZFDSWVB.js} +7 -7
- package/dist/{singleCellGeneExpression-N337DGGD.js → singleCellGeneExpression-OIKBHOD2.js} +6 -6
- package/dist/{singleCellPlot-EGHVFU5A.js → singleCellPlot-WNVDRYZK.js} +10 -10
- package/dist/{singlecell-WCGJWYHF.js → singlecell-SDXBISH3.js} +8 -8
- package/dist/{singlecell-25QHBAQJ.js → singlecell-ZB2KARTB.js} +9 -9
- package/dist/{snp-DTPNDTQS.js → snp-AWA6XFJU.js} +6 -6
- package/dist/{snp-Q5YDKDCZ.js → snp-E5ACTK6V.js} +7 -7
- package/dist/{snplocus-P3EQSE3L.js → snplocus-TPOZCFGZ.js} +6 -6
- package/dist/{spliceevent.a53ss.diagram-MOVDKXCU.js → spliceevent.a53ss.diagram-XPPKDAOS.js} +6 -6
- package/dist/{spliceevent.exonskip.diagram-UJANYRQS.js → spliceevent.exonskip.diagram-2GY44MUI.js} +7 -7
- package/dist/{spliceevent.noeventdiagram-WLVYT266.js → spliceevent.noeventdiagram-Z7EM6F5I.js} +6 -6
- package/dist/{summary-IU7L7IVT.js → summary-ZVN5MECE.js} +18 -18
- package/dist/{sunburst-DUKKVIQD.js → sunburst-SMYQYHP4.js} +6 -6
- package/dist/{survival-PAH7XOWK.js → survival-XNQMR4HP.js} +7 -7
- package/dist/{survival-HKQP23U4.js → survival-YKQLPGOX.js} +9 -9
- package/dist/{svgraph-KSABARBS.js → svgraph-BE7A5CIL.js} +6 -6
- package/dist/{svmr-OJPF2PSE.js → svmr-NVG7YIZ7.js} +9 -9
- package/dist/{table-ZV4223R4.js → table-5MAQTTLK.js} +8 -8
- package/dist/{tk-36QYLTXO.js → tk-Q5PFQM33.js} +10 -10
- package/dist/{tp.ui-AF5HHBAE.js → tp.ui-JLCEFY3K.js} +15 -15
- package/dist/{tvs.geneVariant-YSGFB6TY.js → tvs.geneVariant-PQ2DSKUX.js} +7 -7
- package/dist/{tvs.samplelst-E2SIBDIH.js → tvs.samplelst-SSLJYD7R.js} +6 -6
- package/dist/{violin-VBN4L7SV.js → violin-DEFL5YEM.js} +11 -11
- package/dist/{violin.interactivity-YQFQU3PD.js → violin.interactivity-JS5YHF44.js} +7 -7
- package/dist/{violin.renderer-JJKD3W7G.js → violin.renderer-DTIQJQQG.js} +7 -7
- package/dist/{vocabulary-7ZNNZYS4.js → vocabulary-CCI3QKSA.js} +6 -6
- package/dist/{volcano-WS2VIMNR.js → volcano-QGKB2GWL.js} +9 -9
- package/package.json +3 -3
- package/dist/chunk-3QCGJXNI.js.map +0 -7
- package/dist/chunk-7Z3NR2LZ.js.map +0 -7
- package/dist/chunk-RBRAAJSI.js.map +0 -7
- package/dist/chunk-YCYBH4EW.js.map +0 -7
- package/dist/grin2-QSP7G3WO.js.map +0 -7
- /package/dist/{2dmaf-OKVQIVV4.js.map → 2dmaf-E6HNBNJK.js.map} +0 -0
- /package/dist/{AppHeader-JX5XDPOB.js.map → AppHeader-MAZNYXEJ.js.map} +0 -0
- /package/dist/{Disco-VMJEYX7S.js.map → Disco-VDHTF4EQ.js.map} +0 -0
- /package/dist/{Disco.UI-JABO5EEQ.js.map → Disco.UI-UCVOHFW2.js.map} +0 -0
- /package/dist/{HicApp-YORXEYLO.js.map → HicApp-SX7ODWXE.js.map} +0 -0
- /package/dist/{Volcano-CCUB56LY.js.map → Volcano-CHB56C4Z.js.map} +0 -0
- /package/dist/{WSISamplesPlot-RMXT6KOX.js.map → WSISamplesPlot-TMYFRUYO.js.map} +0 -0
- /package/dist/{WSIViewer-IYKNEJDW.js.map → WSIViewer-WGLWFYJH.js.map} +0 -0
- /package/dist/{adSandbox-QCU54DWR.js.map → adSandbox-IJHIHP7L.js.map} +0 -0
- /package/dist/{app-HPNXUQ5W.js.map → app-PGVYIMOA.js.map} +0 -0
- /package/dist/{app-ZMO3Y76U.js.map → app-WGYPDVM6.js.map} +0 -0
- /package/dist/{bam-QSMV5PBO.js.map → bam-NQDQ4FD5.js.map} +0 -0
- /package/dist/{barchart-3WU5RWT7.js.map → barchart-L3RGQAM5.js.map} +0 -0
- /package/dist/{barchart.data-FN247I25.js.map → barchart.data-LF3LKH64.js.map} +0 -0
- /package/dist/{barchart.events-C2BKWCQD.js.map → barchart.events-MIHRSRJB.js.map} +0 -0
- /package/dist/{block-E6ZAGAME.js.map → block-QBZZCTQE.js.map} +0 -0
- /package/dist/{block.init-SS7PNMZ4.js.map → block.init-VKCYGG47.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-N76M4SER.js.map → block.mds.expressionrank-23VEEAKI.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-V65GIE5O.js.map → block.mds.geneboxplot-A46AWVHU.js.map} +0 -0
- /package/dist/{block.mds.junction-PCYJAGNH.js.map → block.mds.junction-VRJEVMUO.js.map} +0 -0
- /package/dist/{block.mds.svcnv-W524V5CX.js.map → block.mds.svcnv-IHMGASDD.js.map} +0 -0
- /package/dist/{block.svg-D7LFRALC.js.map → block.svg-NW5YUXIA.js.map} +0 -0
- /package/dist/{block.tk.aicheck-LESQWKGQ.js.map → block.tk.aicheck-ELX44CK2.js.map} +0 -0
- /package/dist/{block.tk.ase-5HJAED7A.js.map → block.tk.ase-RCZ6B2N6.js.map} +0 -0
- /package/dist/{block.tk.bam-AUN22QWR.js.map → block.tk.bam-HKBLBQ67.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-SWTS6FZG.js.map → block.tk.bedgraphdot-ZOMDIGY3.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-HKHVV4CR.js.map → block.tk.bigwig.ui-TPGFVNPF.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-FYIOG5H3.js.map → block.tk.hicstraw-UHBNEB72.js.map} +0 -0
- /package/dist/{block.tk.junction-2NW73GAU.js.map → block.tk.junction-N2YN35II.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-UY7H4DDA.js.map → block.tk.junction.textmatrixui-7B4QSZRQ.js.map} +0 -0
- /package/dist/{block.tk.ld-3CZ6COL2.js.map → block.tk.ld-TZHWAR6G.js.map} +0 -0
- /package/dist/{block.tk.menu-DISF7F3R.js.map → block.tk.menu-AS5SHN2W.js.map} +0 -0
- /package/dist/{block.tk.pgv-DEG4VUNR.js.map → block.tk.pgv-TPM5E3QM.js.map} +0 -0
- /package/dist/{boxplot-CFMEYYJJ.js.map → boxplot-N5OI2HY6.js.map} +0 -0
- /package/dist/{brainImaging-QUSOD2VL.js.map → brainImaging-Q55XUH2E.js.map} +0 -0
- /package/dist/{categorical-JBATOWF7.js.map → categorical-B347PA4U.js.map} +0 -0
- /package/dist/{chunk-ZB2WHFWF.js.map → chunk-33DWF3FF.js.map} +0 -0
- /package/dist/{chunk-GYFGL27E.js.map → chunk-3TX45ACE.js.map} +0 -0
- /package/dist/{chunk-M5YXCILD.js.map → chunk-5PIAFQ67.js.map} +0 -0
- /package/dist/{chunk-NIOOMPXC.js.map → chunk-64PFBK7R.js.map} +0 -0
- /package/dist/{chunk-LC6ELBRE.js.map → chunk-6JUTHLZE.js.map} +0 -0
- /package/dist/{chunk-7FV2INJI.js.map → chunk-6ZGPHCQ5.js.map} +0 -0
- /package/dist/{chunk-CSHB56YZ.js.map → chunk-6ZPEEVHY.js.map} +0 -0
- /package/dist/{chunk-2IKPSAVD.js.map → chunk-AFVPN2AK.js.map} +0 -0
- /package/dist/{chunk-JPZAGEQS.js.map → chunk-ATCGA6SR.js.map} +0 -0
- /package/dist/{chunk-W5LWVWPZ.js.map → chunk-BBAVUQU5.js.map} +0 -0
- /package/dist/{chunk-NF775D2Y.js.map → chunk-BU7DHIOK.js.map} +0 -0
- /package/dist/{chunk-U4UQNC2G.js.map → chunk-D7FABEBC.js.map} +0 -0
- /package/dist/{chunk-DGKWL53O.js.map → chunk-D7SLEHQG.js.map} +0 -0
- /package/dist/{chunk-6LRX64BI.js.map → chunk-DMWZ47SR.js.map} +0 -0
- /package/dist/{chunk-GYAPO552.js.map → chunk-DREHXLD7.js.map} +0 -0
- /package/dist/{chunk-SFGXU7LX.js.map → chunk-DUNCSRGN.js.map} +0 -0
- /package/dist/{chunk-JQW65AIG.js.map → chunk-DZWBLK76.js.map} +0 -0
- /package/dist/{chunk-GQAG5AN7.js.map → chunk-EF3KRNGH.js.map} +0 -0
- /package/dist/{chunk-FIZP3345.js.map → chunk-EM6BFOPR.js.map} +0 -0
- /package/dist/{chunk-LOTJWW6S.js.map → chunk-ENLG2OGS.js.map} +0 -0
- /package/dist/{chunk-L7ACODWG.js.map → chunk-FXEPPQCW.js.map} +0 -0
- /package/dist/{chunk-W7ONTJGW.js.map → chunk-FXV2SD2W.js.map} +0 -0
- /package/dist/{chunk-GRVFADHP.js.map → chunk-FYFFYF5X.js.map} +0 -0
- /package/dist/{chunk-BWSZ4L7N.js.map → chunk-FYQC5772.js.map} +0 -0
- /package/dist/{chunk-XEMFX4SE.js.map → chunk-GQIRSNJ5.js.map} +0 -0
- /package/dist/{chunk-EGRTRM2V.js.map → chunk-GWCMFYUD.js.map} +0 -0
- /package/dist/{chunk-6Z3E6LCU.js.map → chunk-HAG3ZQV5.js.map} +0 -0
- /package/dist/{chunk-NX57GJ7O.js.map → chunk-HBSFAHGZ.js.map} +0 -0
- /package/dist/{chunk-A7LPCHFM.js.map → chunk-K3MGHF73.js.map} +0 -0
- /package/dist/{chunk-P4H6CHRM.js.map → chunk-KJR2KZCM.js.map} +0 -0
- /package/dist/{chunk-IT75ROC3.js.map → chunk-LFKXBEJU.js.map} +0 -0
- /package/dist/{chunk-RQET6346.js.map → chunk-LJUQOCOW.js.map} +0 -0
- /package/dist/{chunk-LVMYO3EF.js.map → chunk-LKGF6NHM.js.map} +0 -0
- /package/dist/{chunk-URGWNNJF.js.map → chunk-MMM5BQTF.js.map} +0 -0
- /package/dist/{chunk-I6TLN2OR.js.map → chunk-N2TEPJXS.js.map} +0 -0
- /package/dist/{chunk-N2LZAZBC.js.map → chunk-NUJSVEJY.js.map} +0 -0
- /package/dist/{chunk-W424NX2H.js.map → chunk-O7YQ4QWF.js.map} +0 -0
- /package/dist/{chunk-U6CRL7IJ.js.map → chunk-PDCHOIX4.js.map} +0 -0
- /package/dist/{chunk-MVCBBNFT.js.map → chunk-PIHGGU3H.js.map} +0 -0
- /package/dist/{chunk-NVPHXDYL.js.map → chunk-PTG3DY75.js.map} +0 -0
- /package/dist/{chunk-BNWCX44Z.js.map → chunk-PTOT7EU2.js.map} +0 -0
- /package/dist/{chunk-XIQ65PVX.js.map → chunk-QMEPEBSM.js.map} +0 -0
- /package/dist/{chunk-2LTOFU43.js.map → chunk-QQKEJ7QE.js.map} +0 -0
- /package/dist/{chunk-OKMM7IKW.js.map → chunk-QZQIW25Q.js.map} +0 -0
- /package/dist/{chunk-AAADNNCW.js.map → chunk-R3QFLBP3.js.map} +0 -0
- /package/dist/{chunk-SK3NXLLY.js.map → chunk-S7RQDPHP.js.map} +0 -0
- /package/dist/{chunk-JUXYQ5EJ.js.map → chunk-SH4YGXJC.js.map} +0 -0
- /package/dist/{chunk-MWGQBGLF.js.map → chunk-SHV3Y6D6.js.map} +0 -0
- /package/dist/{chunk-FBRTEWIG.js.map → chunk-SLKXRGMY.js.map} +0 -0
- /package/dist/{chunk-32WBXZXK.js.map → chunk-TTFJA53D.js.map} +0 -0
- /package/dist/{chunk-5GGFJVD7.js.map → chunk-UCJJUJNV.js.map} +0 -0
- /package/dist/{chunk-6QDMJZEH.js.map → chunk-URGRZHRE.js.map} +0 -0
- /package/dist/{chunk-QTWKTJNI.js.map → chunk-VB6IANQH.js.map} +0 -0
- /package/dist/{chunk-Z6MJT6XW.js.map → chunk-VING5FB2.js.map} +0 -0
- /package/dist/{chunk-HIKULOUG.js.map → chunk-VKWC3AK5.js.map} +0 -0
- /package/dist/{chunk-B4OCUWGH.js.map → chunk-VPQCI5N7.js.map} +0 -0
- /package/dist/{chunk-RTKZ3D7S.js.map → chunk-WRIEJGDJ.js.map} +0 -0
- /package/dist/{chunk-R6QWH7WY.js.map → chunk-X3ZKV2AV.js.map} +0 -0
- /package/dist/{chunk-27OOW36L.js.map → chunk-YHWMNKIX.js.map} +0 -0
- /package/dist/{chunk-BTMXWDMY.js.map → chunk-YIURQAD6.js.map} +0 -0
- /package/dist/{chunk-EANVYJGZ.js.map → chunk-YPWVTJ4U.js.map} +0 -0
- /package/dist/{chunk-NA6KDFYD.js.map → chunk-Z2EYNEEX.js.map} +0 -0
- /package/dist/{chunk-JBNO2HI5.js.map → chunk-ZDDQA4QW.js.map} +0 -0
- /package/dist/{condition-NCFA5B4H.js.map → condition-VCJ35K52.js.map} +0 -0
- /package/dist/{controls-A5FWLUH5.js.map → controls-VAY2R5AG.js.map} +0 -0
- /package/dist/{controls.config-NCIEXAO4.js.map → controls.config-QSAZIUU7.js.map} +0 -0
- /package/dist/{correlation-7QUA7AJ3.js.map → correlation-IYJKT6IM.js.map} +0 -0
- /package/dist/{correlationVolcano-IBVPILAK.js.map → correlationVolcano-IC4WDS4T.js.map} +0 -0
- /package/dist/{cuminc-7INXHKEU.js.map → cuminc-6NJWC7EL.js.map} +0 -0
- /package/dist/{customdata.inputui-BHCKRA6Z.js.map → customdata.inputui-R4ATW6CE.js.map} +0 -0
- /package/dist/{dataDownload-O3V7EQRT.js.map → dataDownload-4QAMCQ2O.js.map} +0 -0
- /package/dist/{databrowser.ui-UMQ6QLNC.js.map → databrowser.ui-TJQDIOP6.js.map} +0 -0
- /package/dist/{density-JEAPSCWR.js.map → density-5VYXBA2V.js.map} +0 -0
- /package/dist/{dictionary-NMLOHCHU.js.map → dictionary-4F3D3SLV.js.map} +0 -0
- /package/dist/{differentialAnalysis-FNWA3UQ4.js.map → differentialAnalysis-WUSVBMRE.js.map} +0 -0
- /package/dist/{e2pca-3Y36SWF3.js.map → e2pca-BEPOMHXJ.js.map} +0 -0
- /package/dist/{ep-SN65NXSO.js.map → ep-BTAMJCWC.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-XDDM5EUK.js.map → expclust.gdc.spec-422255DR.js.map} +0 -0
- /package/dist/{facet-EZF3KSN7.js.map → facet-M4W7YHKR.js.map} +0 -0
- /package/dist/{frequencyChart-YMKQPMMG.js.map → frequencyChart-IDJATXXJ.js.map} +0 -0
- /package/dist/{frequencyChart.integration.spec-7TDBWKXD.js.map → frequencyChart.integration.spec-ICICJV2C.js.map} +0 -0
- /package/dist/{geneExpClustering-MZDICSFR.js.map → geneExpClustering-FZPIOHE7.js.map} +0 -0
- /package/dist/{geneExpression-Q7TWJE5I.js.map → geneExpression-5ZOMHESP.js.map} +0 -0
- /package/dist/{geneExpression-EFKFEITO.js.map → geneExpression-LDROP42A.js.map} +0 -0
- /package/dist/{geneExpression-CIOFR4NZ.js.map → geneExpression-OOUYZMP5.js.map} +0 -0
- /package/dist/{geneORA-22TGPXBD.js.map → geneORA-4EFHDFTG.js.map} +0 -0
- /package/dist/{geneVariant-OSQXVWDL.js.map → geneVariant-7GOMOWQD.js.map} +0 -0
- /package/dist/{geneVariant-LMFNE5YY.js.map → geneVariant-IQFDHXCG.js.map} +0 -0
- /package/dist/{genefusion.ui-UN3J75KY.js.map → genefusion.ui-AG5A63TC.js.map} +0 -0
- /package/dist/{geneset-USGWTM7F.js.map → geneset-J34ESO6B.js.map} +0 -0
- /package/dist/{genomeBrowser-ZNNOZFNL.js.map → genomeBrowser-NBYRMXNJ.js.map} +0 -0
- /package/dist/{genomeBrowser.controls-ASAFYENK.js.map → genomeBrowser.controls-H6VDXIC7.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-L53YLB5C.js.map → genomeBrowser.spec-PKDOUPT3.js.map} +0 -0
- /package/dist/{groupsetting-IQKHVQPO.js.map → groupsetting-O2QSTFBD.js.map} +0 -0
- /package/dist/{gsea-TNRJBB56.js.map → gsea-6UGZ7ZDM.js.map} +0 -0
- /package/dist/{hierCluster-JH26TIA7.js.map → hierCluster-3KHWIHOW.js.map} +0 -0
- /package/dist/{hierCluster-WFSD3V2Q.js.map → hierCluster-Q5ZZ42VB.js.map} +0 -0
- /package/dist/{hierCluster.config-NZW66EEN.js.map → hierCluster.config-MZE4UUJP.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-ASIZYYQI.js.map → hierCluster.integration.spec-RGRKOEFJ.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-FKCZVQOL.js.map → hierCluster.interactivity-4QDTY4LI.js.map} +0 -0
- /package/dist/{hierCluster.renderers-6WEFBCNR.js.map → hierCluster.renderers-O7SFUMWK.js.map} +0 -0
- /package/dist/{imagePlot-4WZJ3PIK.js.map → imagePlot-NMIRLHHN.js.map} +0 -0
- /package/dist/{launch.adhoc-HV2XBU2J.js.map → launch.adhoc-DNJAK2PV.js.map} +0 -0
- /package/dist/{leftlabel.sample-3Z7AD5UG.js.map → leftlabel.sample-CI4LHU53.js.map} +0 -0
- /package/dist/{lollipop-LI23HDIA.js.map → lollipop-3XYW2RCY.js.map} +0 -0
- /package/dist/{maf-PFEIWXOJ.js.map → maf-NDDKEMOB.js.map} +0 -0
- /package/dist/{maftimeline-KSQMPQC3.js.map → maftimeline-PDNYKCR3.js.map} +0 -0
- /package/dist/{matrix-IEW2FIAZ.js.map → matrix-7JJHZLXR.js.map} +0 -0
- /package/dist/{matrix-P3YKH6YF.js.map → matrix-QSGTJIMD.js.map} +0 -0
- /package/dist/{matrix.cells-XF4BHZ6J.js.map → matrix.cells-M77EC2QE.js.map} +0 -0
- /package/dist/{matrix.config-Y2I4YZWH.js.map → matrix.config-CDSBBJCP.js.map} +0 -0
- /package/dist/{matrix.controls-UFYAXNO2.js.map → matrix.controls-MNV4FRDX.js.map} +0 -0
- /package/dist/{matrix.data-BQW474XY.js.map → matrix.data-UCLXTH3U.js.map} +0 -0
- /package/dist/{matrix.groups-UQ723YEC.js.map → matrix.groups-SOL5P7CG.js.map} +0 -0
- /package/dist/{matrix.integration.spec-NMKPY4RA.js.map → matrix.integration.spec-M3G6JZW4.js.map} +0 -0
- /package/dist/{matrix.interactivity-XBS4M3IX.js.map → matrix.interactivity-L43OZLBR.js.map} +0 -0
- /package/dist/{matrix.layout-4ZSNT6VB.js.map → matrix.layout-7BOJ3ZHG.js.map} +0 -0
- /package/dist/{matrix.legend-Z5IW6WBE.js.map → matrix.legend-YBFBNX63.js.map} +0 -0
- /package/dist/{matrix.renderers-XOBPFA5M.js.map → matrix.renderers-EKF3OGFS.js.map} +0 -0
- /package/dist/{matrix.serieses-LPOIDDIM.js.map → matrix.serieses-ZLT6NZCU.js.map} +0 -0
- /package/dist/{matrix.sort-A7N4DXTZ.js.map → matrix.sort-IG4AN53M.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-OHDG2Y6A.js.map → matrix.sort.unit.spec-BBSKK6QX.js.map} +0 -0
- /package/dist/{matrix.sorterUi-GUN3S742.js.map → matrix.sorterUi-DDLJPQRT.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-KTGUQRKD.js.map → matrix.sorterUi.unit.spec-JTPP2AMH.js.map} +0 -0
- /package/dist/{mavb-S3FSNUKX.js.map → mavb-5QRUAYS4.js.map} +0 -0
- /package/dist/{mds.fimo-TBQD23W2.js.map → mds.fimo-DQURACEK.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-HHXI6TKL.js.map → mds.samplescatterplot-7FKG4ADT.js.map} +0 -0
- /package/dist/{mds.survivalplot-NNCLXVZO.js.map → mds.survivalplot-I4OS35TG.js.map} +0 -0
- /package/dist/{metaboliteIntensity-JW6THF2K.js.map → metaboliteIntensity-JLOIT4XI.js.map} +0 -0
- /package/dist/{numeric-KN2SFXIW.js.map → numeric-LROWA5OL.js.map} +0 -0
- /package/dist/{numeric.binary-YBDSLFOF.js.map → numeric.binary-FS7DKV2S.js.map} +0 -0
- /package/dist/{numeric.continuous-BER3DMAK.js.map → numeric.continuous-FMNKYXBS.js.map} +0 -0
- /package/dist/{numeric.discrete-HYF5C5TH.js.map → numeric.discrete-ZMLJR4EC.js.map} +0 -0
- /package/dist/{numeric.spline-R4IBKAUX.js.map → numeric.spline-Q5O2NPAD.js.map} +0 -0
- /package/dist/{numeric.toggle-TZ5QHXGK.js.map → numeric.toggle-U7KTKH4U.js.map} +0 -0
- /package/dist/{numericDictTermCluster-WG3JWVDZ.js.map → numericDictTermCluster-F2JUNE2V.js.map} +0 -0
- /package/dist/{oncomatrix-EFNJEDDZ.js.map → oncomatrix-634CKJ4E.js.map} +0 -0
- /package/dist/{oncomatrix.spec-TZL7R35W.js.map → oncomatrix.spec-O6GDRRJ6.js.map} +0 -0
- /package/dist/{plot.2dvaf-ROCDS24P.js.map → plot.2dvaf-ALIJNBTJ.js.map} +0 -0
- /package/dist/{plot.app-PVUWL7ZX.js.map → plot.app-LYCN45FY.js.map} +0 -0
- /package/dist/{plot.barplot-OCKKWA6B.js.map → plot.barplot-XYHLJOT6.js.map} +0 -0
- /package/dist/{plot.boxplot-L7DUSRM5.js.map → plot.boxplot-HHDEWSN5.js.map} +0 -0
- /package/dist/{plot.brainImaging-Y6YUZC3D.js.map → plot.brainImaging-SZQJQWAO.js.map} +0 -0
- /package/dist/{plot.disco-WXA7NB75.js.map → plot.disco-ASGYIHFD.js.map} +0 -0
- /package/dist/{plot.dzi-PXGVXF2N.js.map → plot.dzi-7MENAHHE.js.map} +0 -0
- /package/dist/{plot.ssgq-MDVFBDTX.js.map → plot.ssgq-MEJJO5F2.js.map} +0 -0
- /package/dist/{plot.vaf2cov-CV3HTOXB.js.map → plot.vaf2cov-BC5K45AX.js.map} +0 -0
- /package/dist/{plot.wsi-2L5VVJCJ.js.map → plot.wsi-IGB2KRNO.js.map} +0 -0
- /package/dist/{profile.spec-MXMAGRHW.js.map → profile.spec-O3IPZPH7.js.map} +0 -0
- /package/dist/{profileBarchart-JXQ4CZUJ.js.map → profileBarchart-XE2GTL5B.js.map} +0 -0
- /package/dist/{profileForms-PXH5JUV4.js.map → profileForms-DVT53KQQ.js.map} +0 -0
- /package/dist/{profilePlot-WLEGZKGK.js.map → profilePlot-5SANIMTN.js.map} +0 -0
- /package/dist/{profilePolar-FRDDVOJA.js.map → profilePolar-TO5PLEEY.js.map} +0 -0
- /package/dist/{profileRadar-YOUUN5IW.js.map → profileRadar-3OWMVP4Z.js.map} +0 -0
- /package/dist/{profileRadarFacility-6UJPGSKX.js.map → profileRadarFacility-HFICMHX3.js.map} +0 -0
- /package/dist/{regression-LBCJKRSY.js.map → regression-IUN2TIKQ.js.map} +0 -0
- /package/dist/{regression.inputs-D3PBJ5NE.js.map → regression.inputs-2A7LGHXY.js.map} +0 -0
- /package/dist/{regression.inputs.term-C53J2WOS.js.map → regression.inputs.term-IPXAQXGF.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-LRYZ5KZU.js.map → regression.inputs.values.table-MSE4UD7C.js.map} +0 -0
- /package/dist/{regression.results-ZLVPCYU4.js.map → regression.results-3WNV6VQJ.js.map} +0 -0
- /package/dist/{report-QY5DCTLC.js.map → report-EHXGM7VK.js.map} +0 -0
- /package/dist/{runChart-2P6WJDUB.js.map → runChart-7BU2Q43V.js.map} +0 -0
- /package/dist/{runchart.integration.spec-LWIMPOO5.js.map → runchart.integration.spec-TUN3I6CZ.js.map} +0 -0
- /package/dist/{sampleScatter-ZFTT2GPK.js.map → sampleScatter-IRDGHEIH.js.map} +0 -0
- /package/dist/{sampleView-4THGTXT5.js.map → sampleView-HH6ZXOA7.js.map} +0 -0
- /package/dist/{samplelst-524FPKEL.js.map → samplelst-L46C45KF.js.map} +0 -0
- /package/dist/{samplematrix-FACFCH7J.js.map → samplematrix-QP2HGUUM.js.map} +0 -0
- /package/dist/{sc-FOHQ7TGP.js.map → sc-T7MIGPEG.js.map} +0 -0
- /package/dist/{scatter.integration.spec-XNAQVECZ.js.map → scatter.integration.spec-7ZME4YI4.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-VEMYQKBI.js.map → selectGenomeWithTklst-MAHCAX3S.js.map} +0 -0
- /package/dist/{singleCellCellType-ZMZOZPR6.js.map → singleCellCellType-7ZFDSWVB.js.map} +0 -0
- /package/dist/{singleCellGeneExpression-N337DGGD.js.map → singleCellGeneExpression-OIKBHOD2.js.map} +0 -0
- /package/dist/{singleCellPlot-EGHVFU5A.js.map → singleCellPlot-WNVDRYZK.js.map} +0 -0
- /package/dist/{singlecell-WCGJWYHF.js.map → singlecell-SDXBISH3.js.map} +0 -0
- /package/dist/{singlecell-25QHBAQJ.js.map → singlecell-ZB2KARTB.js.map} +0 -0
- /package/dist/{snp-DTPNDTQS.js.map → snp-AWA6XFJU.js.map} +0 -0
- /package/dist/{snp-Q5YDKDCZ.js.map → snp-E5ACTK6V.js.map} +0 -0
- /package/dist/{snplocus-P3EQSE3L.js.map → snplocus-TPOZCFGZ.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-MOVDKXCU.js.map → spliceevent.a53ss.diagram-XPPKDAOS.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-UJANYRQS.js.map → spliceevent.exonskip.diagram-2GY44MUI.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-WLVYT266.js.map → spliceevent.noeventdiagram-Z7EM6F5I.js.map} +0 -0
- /package/dist/{summary-IU7L7IVT.js.map → summary-ZVN5MECE.js.map} +0 -0
- /package/dist/{sunburst-DUKKVIQD.js.map → sunburst-SMYQYHP4.js.map} +0 -0
- /package/dist/{survival-PAH7XOWK.js.map → survival-XNQMR4HP.js.map} +0 -0
- /package/dist/{survival-HKQP23U4.js.map → survival-YKQLPGOX.js.map} +0 -0
- /package/dist/{svgraph-KSABARBS.js.map → svgraph-BE7A5CIL.js.map} +0 -0
- /package/dist/{svmr-OJPF2PSE.js.map → svmr-NVG7YIZ7.js.map} +0 -0
- /package/dist/{table-ZV4223R4.js.map → table-5MAQTTLK.js.map} +0 -0
- /package/dist/{tk-36QYLTXO.js.map → tk-Q5PFQM33.js.map} +0 -0
- /package/dist/{tp.ui-AF5HHBAE.js.map → tp.ui-JLCEFY3K.js.map} +0 -0
- /package/dist/{tvs.geneVariant-YSGFB6TY.js.map → tvs.geneVariant-PQ2DSKUX.js.map} +0 -0
- /package/dist/{tvs.samplelst-E2SIBDIH.js.map → tvs.samplelst-SSLJYD7R.js.map} +0 -0
- /package/dist/{violin-VBN4L7SV.js.map → violin-DEFL5YEM.js.map} +0 -0
- /package/dist/{violin.interactivity-YQFQU3PD.js.map → violin.interactivity-JS5YHF44.js.map} +0 -0
- /package/dist/{violin.renderer-JJKD3W7G.js.map → violin.renderer-DTIQJQQG.js.map} +0 -0
- /package/dist/{vocabulary-7ZNNZYS4.js.map → vocabulary-CCI3QKSA.js.map} +0 -0
- /package/dist/{volcano-WS2VIMNR.js.map → volcano-QGKB2GWL.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../node_modules/debounce/index.js", "../../node_modules/partjson/dist/partjson.umd.js", "../dom/animation.js", "../dom/sayerror.ts", "../termsetting/handlers/groupsetting.ts", "../dom/axisstyle.js", "../dom/boxplot.js", "../dom/checkbox.js", "../src/client.js", "../common/1stGenetk.js", "../dom/ColorScale/ColorScaleMenu.ts", "../dom/ColorScale/ColorScale.ts", "../dom/ColorScale/helpers.ts", "../dom/downloadTextfile.js", "../dom/fillbar.js", "../dom/genesearch.ts", "../dom/GeneSetEdit/addButton.ts", "../dom/GeneSetEdit/radioWithContent.ts", "../dom/GeneSetEdit/GenesMenu.ts", "../dom/GeneSetEdit/GeneSetEditUI.ts", "../dom/html.legend.js", "../dom/LegendCircleReference.ts", "../dom/maxLabelWidth.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", "../tw/TwBase.ts", "../tw/categorical.ts", "../termsetting/handlers/geneVariant.ts", "../tw/geneVariant.ts", "../tw/numeric.ts", "../tw/TwRouter.ts", "../termsetting/termsetting.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", "../termdb/tree.js", "../termdb/store.js", "../termdb/Vocab.js", "../plots/barchart.data.js", "../common/termutils.js", "../termdb/TermdbVocab.js", "../termdb/FrontendVocab.js", "../termdb/vocabulary.js", "../termdb/TermTypeSearch.ts", "../termdb/submenu.js", "../termdb/search.js", "../termdb/app.js", "../mass/charts.js", "../mass/groups.js", "../dom/select2Terms.js", "../dom/table.ts", "../filter/tvs.js", "../filter/filter.utils.js", "../filter/filter.renderer.js", "../filter/filter.interactivity.js", "../filter/FilterClass.js", "../filter/FilterStateless.js", "../filter/FilterRxComp.js", "../filter/FilterPrompt.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce(func, wait, immediate){\n var timeout, args, context, timestamp, result;\n if (null == wait) wait = 100;\n\n function later() {\n var last = Date.now() - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n context = args = null;\n }\n }\n };\n\n var debounced = function(){\n context = this;\n args = arguments;\n timestamp = Date.now();\n var callNow = immediate && !timeout;\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, args);\n context = args = null;\n }\n\n return result;\n };\n\n debounced.clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n };\n \n debounced.flush = function() {\n if (timeout) {\n result = func.apply(context, args);\n context = args = null;\n \n clearTimeout(timeout);\n timeout = null;\n }\n };\n\n return debounced;\n};\n\n// Adds compatibility for ES modules\ndebounce.debounce = debounce;\n\nmodule.exports = debounce;\n", "!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", "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", "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 { select, type Selection } from 'd3-selection'\n//import { Tabs } from '#dom/toggleButtons'\n//import { disappear } from '#src/client'\nimport { throwMsgWithFilePathAndFnName } from '#dom/sayerror'\nimport { debounce } from 'debounce'\nimport type { TermSettingInstance, CustomGroupSettingQ, GroupSettingQ, MinBaseQ, Term, Filter, GvTerm } from '#types'\nimport { filterInit, getNormalRoot, getWrappedTvslst, filterJoin } from '#filter/filter'\n\n/*\n---------Exported---------\nclass GroupSettingMethods\n\nRefactor notes/TODOs:\n - Visual reference items moved, such as a collapsed div with animation\n\nFuture plans: \n\t- Make available for subconditions, ie. condition terms\n\t- Toggle at the top: switch between drag UI and text UI\n\t\t- for long list of categories, create a text change with tab delimited UI\n\t\t\t0\tAcute...\n\t\t\t1\tChronic...\n\t\t\t2\tDiabetes...\n\t\t\t3\tOther...\n\t\t\tUser can simply change the group number. Switch back to the drag UI and see the updated list and change group names\n\t\t- maybe increase the cap? but only from this UI, not drag and drop\n*/\n\ntype Opts = {\n\ttype?: 'values' | 'filter' // type of groupsetting\n\tholder?: HTMLElement // div holder for drag-and-drop\n\thideApply?: boolean // whether to hide apply button\n}\ntype TsInstance = TermSettingInstance & {\n\tq: MinBaseQ & GroupSettingQ\n\tcategory2samplecount: any\n}\ntype ItemEntry = {\n\tkey: number | string //key returned from vocab.getCategories()\n\tlabel: string //Text label of drag item\n\tgroup: number //Current group index for item.\n\tsamplecount: number | string | null //Sample count number or 'n/a'\n\tuncomputable?: boolean\n}\ntype FilterEntry = {\n\tterms: Term[]\n\tgroup: number // group index\n\tactive?: Filter\n}\ntype DataInput = { [index: string]: ItemEntry }\ntype GrpEntry = {\n\t//Scoped for file, maybe merge with GroupEntry type in future??\n\tcurrentIdx: number //Current index of group\n\ttype: string //'values' | 'filter'\n\tname: string //Mutable group name, default .currentIdx\n\tuncomputable?: boolean\n}\ntype GrpEntryWithDom = GrpEntry & {\n\twrapper: Selection<Element, any, any, any>\n\tdragActionDiv: any\n\ttitle: any\n\tdestroyBtn: any\n\tinput: any\n\tinputMessage: any\n\tdraggables: any\n}\ntype GrpSetDom = {\n\tmenuWrapper: HTMLElement\n\tactionDiv: HTMLElement\n\tgrpsWrapper: HTMLElement\n\tincludedWrapper: HTMLElement\n\texcludedWrapper: HTMLElement\n}\n\nexport class GroupSettingMethods {\n\ttsInstance: TsInstance // termsetting instance\n\topts: Opts //options for groupsetting\n\tdom: Partial<GrpSetDom> //main menu dom elements before drag and drop divs are added\n\tminGrpNum: number //minimum num of groups rendered (excluded categories + 2 groups)\n\tdefaultMaxGrpNum: number //default cutoff for num of groups. Used to calculate the actual max group num later\n\ttype: 'values' | 'filter' // type of groupsetting\n\tdata: { groups: GrpEntry[]; values: ItemEntry[]; filters: FilterEntry[] }\n\tinitGrpSetUI: any //func init for groupsetting UI\n\n\tconstructor(tsInstance, opts: Opts = {}) {\n\t\tthis.tsInstance = tsInstance\n\t\tthis.opts = opts\n\t\tthis.dom = {\n\t\t\tmenuWrapper: opts.holder || tsInstance.dom.tip.d.append('div')\n\t\t}\n\t\tthis.minGrpNum = 3\n\t\tthis.defaultMaxGrpNum = 5\n\t\tthis.type = opts.type || 'values'\n\t\tthis.data = { groups: [], values: [], filters: [] }\n\t\tsetRenderers(this)\n\t}\n\n\tprocessInput(data: DataInput) {\n\t\t// add excluded categories, group 1, and group 2 indexes by default\n\t\t// these three groups should always appear in the menu\n\t\tconst grpIdxes: Set<number> = new Set([0, 1, 2])\n\t\tconst input = structuredClone(data)\n\t\tif (this.tsInstance.q.type == 'values') {\n\t\t\t// q.type='values'\n\t\t\t// if group assignments are attached to values then use these assignments\n\t\t\t// otherwise group all values into a single group\n\t\t\tfor (const v of Object.values(input)) {\n\t\t\t\tif (v.uncomputable) return //Still necessary? Possibly taken care of termdb route... somewhere\n\t\t\t\tif (v?.group > this.defaultMaxGrpNum)\n\t\t\t\t\tthrowMsgWithFilePathAndFnName(\n\t\t\t\t\t\t`The maximum number of groups is ${this.defaultMaxGrpNum}. The group index for value = ${v.label} is ${v.group}`\n\t\t\t\t\t)\n\t\t\t\tconst value = {\n\t\t\t\t\tkey: v.key,\n\t\t\t\t\tlabel: v.label,\n\t\t\t\t\tgroup: v.group || 1,\n\t\t\t\t\tsamplecount: v.samplecount\n\t\t\t\t}\n\t\t\t\tthis.data.values.push(value)\n\t\t\t\tgrpIdxes.add(value.group)\n\t\t\t}\n\t\t} else if (this.tsInstance.q.type == 'custom-groupset') {\n\t\t\tif (this.tsInstance.q.customset) {\n\t\t\t\t// custom groupset defined\n\t\t\t\t// process the groupset\n\t\t\t\tthis.formatCustomset(grpIdxes, input)\n\t\t\t} else {\n\t\t\t\t// custom groupset undefined\n\t\t\t\t// build empty groupset\n\t\t\t\tconst term = this.tsInstance.term as GvTerm\n\t\t\t\tif (!term.childTerms) throw 'child terms missing'\n\t\t\t\tfor (const grpIdx of grpIdxes) {\n\t\t\t\t\tthis.data.filters.push({ terms: term.childTerms, group: grpIdx })\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this.tsInstance.q.type == 'predefined-groupset') {\n\t\t\tthrow \"q.type='predefined-groupset' not supported\"\n\t\t} else {\n\t\t\tthrow 'q.type not recognized'\n\t\t}\n\n\t\tif (this.type == 'values') {\n\t\t\tif (!this.data.values.length) throwMsgWithFilePathAndFnName(`Missing values`)\n\n\t\t\t// re-populate missing sample counts, which can occur\n\t\t\t// for a custom groupset\n\t\t\tthis.data.values.forEach(v => {\n\t\t\t\tif (!v.samplecount) {\n\t\t\t\t\tv.samplecount = this.tsInstance.category2samplecount\n\t\t\t\t\t\t? this.tsInstance.category2samplecount.find(\n\t\t\t\t\t\t\t\t(d: { key: string; label?: string; samplecount: number }) => d.key == v.key\n\t\t\t\t\t\t )?.samplecount\n\t\t\t\t\t\t: 'n/a'\n\t\t\t\t}\n\t\t\t})\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\tthis.data.groups.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\t\tthis.data.groups.sort((a: GrpEntry, b: GrpEntry) => a.currentIdx - b.currentIdx)\n\t}\n\n\tformatCustomset(grpIdxes: Set<number>, input: DataInput) {\n\t\tconst q = this.tsInstance.q as CustomGroupSettingQ\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\tthis.data.groups.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: group.uncomputable\n\t\t\t})\n\t\t\tgrpIdxes.delete(i)\n\t\t\tif (group.type == 'filter') {\n\t\t\t\tconst term = this.tsInstance.term as GvTerm\n\t\t\t\tif (!term.childTerms) throw 'child terms missing'\n\t\t\t\tthis.data.filters.push({ terms: term.childTerms, active: group.filter, group: i })\n\t\t\t} else if (group.type == 'values') {\n\t\t\t\tfor (const value of group.values) {\n\t\t\t\t\t/** label may not be provided in groupsetting.customset.\n\t\t\t\t\t * If missing, find the label from category2samplecout or\n\t\t\t\t\t * use the last ditch effort to use the key.\n\t\t\t\t\t */\n\t\t\t\t\tconst label = value.label\n\t\t\t\t\t\t? value.label\n\t\t\t\t\t\t: this.tsInstance.category2samplecount\n\t\t\t\t\t\t? this.tsInstance.category2samplecount.find(\n\t\t\t\t\t\t\t\t(d: { key: string; label?: string; samplecount: number }) => d.key == value.key\n\t\t\t\t\t\t )?.label\n\t\t\t\t\t\t: value.key\n\t\t\t\t\tthis.data.values.push({\n\t\t\t\t\t\tkey: value.key,\n\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\tgroup: i,\n\t\t\t\t\t\tsamplecount: null\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.type == 'filter') return\n\n\t\t//Find excluded values not returned in customset\n\t\tif (\n\t\t\tthis.data.values.length !== Object.keys(input).length &&\n\t\t\tthis.tsInstance.q.type != 'predefined-groupset' &&\n\t\t\tthis.tsInstance.q.type != 'custom-groupset'\n\t\t) {\n\t\t\tObject.entries(input)\n\t\t\t\t.filter((v: any) => !this.data.values.some(d => d.key == v[1].label))\n\t\t\t\t.forEach(v => {\n\t\t\t\t\tthis.data.values.push({\n\t\t\t\t\t\tkey: v[0],\n\t\t\t\t\t\tlabel: v[1].label,\n\t\t\t\t\t\tgroup: 0,\n\t\t\t\t\t\tsamplecount: this.tsInstance.category2samplecount\n\t\t\t\t\t\t\t? this.tsInstance.category2samplecount.find(\n\t\t\t\t\t\t\t\t\t(d: { key: string; label?: string; samplecount: number }) => d.key == v[0]\n\t\t\t\t\t\t\t )?.samplecount\n\t\t\t\t\t\t\t: 'n/a'\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t} else if (this.data.values.length !== this.tsInstance.category2samplecount.length) {\n\t\t\tthis.tsInstance.category2samplecount\n\t\t\t\t.filter((v: ItemEntry) => !this.data.values.some(d => d.key == v.key))\n\t\t\t\t.forEach((v: ItemEntry) => {\n\t\t\t\t\tthis.data.values.push({\n\t\t\t\t\t\tkey: v.key,\n\t\t\t\t\t\tlabel: v.label,\n\t\t\t\t\t\tgroup: 0,\n\t\t\t\t\t\tsamplecount: v.samplecount\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t}\n\t}\n\n\tasync main() {\n\t\ttry {\n\t\t\tconst input =\n\t\t\t\t(this.tsInstance.q.type == 'custom-groupset' && this.tsInstance.q.customset) ||\n\t\t\t\tthis.tsInstance.category2samplecount ||\n\t\t\t\tthis.tsInstance.term.values\n\t\t\tthis.processInput(input)\n\t\t\tawait this.initGrpSetUI()\n\t\t} catch (e: any) {\n\t\t\tif (e.stack) console.log(e.stack)\n\t\t\telse throwMsgWithFilePathAndFnName(e)\n\t\t}\n\t}\n}\n\nfunction setRenderers(self: any) {\n\tself.initGrpSetUI = async function () {\n\t\t/*max num of groups rendered + excluded categories\n\t\tOnly allow adding the max feasible groups with cutoff of 5 + excluded categories*/\n\t\tif (self.type == 'filter') {\n\t\t\tself.maxGrpNum = self.defaultMaxGrpNum + 1\n\t\t} else {\n\t\t\tself.maxGrpNum =\n\t\t\t\tself.data.values.length >= self.defaultMaxGrpNum ? self.defaultMaxGrpNum + 1 : self.data.values.length\n\t\t}\n\t\tself.tsInstance.dom.tip.showunder(self.tsInstance.dom.holder.node())\n\t\t// if (self.data.values.length > 10) {\n\t\t// \t//Tabs functionality for later - leave it for layout testing\n\t\t//\t//TODO: move apply button up\n\t\t// \tconst tabs = [\n\t\t// \t\t{\n\t\t// \t\t\tlabel: 'Drag',\n\t\t// \t\t\tcallback: async (event, tab) => {\n\t\t// \t\t\t\ttry {\n\t\t// \t\t\t\t\tself.tsInstance.showDraggables()\n\t\t// \t\t\t\t\tdelete tab.callback\n\t\t// \t\t\t\t} catch (e: any) {\n\t\t// \t\t\t\t\tif (e.stack) console.log(e.stack)\n\t\t// \t\t\t\t\telse throw e\n\t\t// \t\t\t\t}\n\t\t// \t\t\t}\n\t\t// \t\t},\n\t\t// \t\t{\n\t\t// \t\t\tlabel: 'Text',\n\t\t// \t\t\tcallback: () => {console.log('Under Development')}\n\t\t// \t\t}\n\t\t// \t]\n\n\t\t// \tnew Tabs({holder: self.dom.tip.d, tabs}).main()\n\t\t// } else {\n\t\tawait self.showDraggables()\n\t\t// }\n\t}\n\tself.showDraggables = async function () {\n\t\tself.dom.menuWrapper.selectAll('*').remove()\n\t\tself.dom.menuWrapper.style('padding', '10px')\n\t\tself.dom.actionDiv = self.dom.menuWrapper\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sjpp-group-actions')\n\t\t\t.style('padding', '0px 10px 10px 0px')\n\n\t\t/*A goal when refactoring groupsetting was to ~not~ attach any variable or \n\t\tfunction to the termsetting instance. Must find all previous `New Group #`s \n\t\tand create a counter.*/\n\t\tconst findNewGrps = self.data.groups.filter((g: GrpEntryWithDom) => g.name.startsWith('New Group'))\n\t\tlet newGrpNum = findNewGrps.length > 0 ? findNewGrps[findNewGrps.length - 1].name.replace(`New Group `, '') : 0\n\n\t\t//Add Group button\n\t\tself.dom.actionDiv.addGroup = self.dom.actionDiv\n\t\t\t.append('button')\n\t\t\t.classed('sjpp_grpset_addGrp_btn', true) //for integration testing\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('text-align', 'center')\n\t\t\t.style('cursor', self.tsInstance.q.mode == 'binary' ? 'default' : 'pointer')\n\t\t\t.property('disabled', self.tsInstance.q.mode == 'binary' ? true : self.data.groups.length >= self.maxGrpNum)\n\t\t\t.text('Add Group')\n\t\t\t.on('click', async () => {\n\t\t\t\tnewGrpNum++\n\t\t\t\tself.data.groups.push({\n\t\t\t\t\tcurrentIdx: self.data.groups.length,\n\t\t\t\t\ttype: self.type,\n\t\t\t\t\tname: `New Group${newGrpNum != 1 ? ` ${newGrpNum}` : ''}`\n\t\t\t\t})\n\t\t\t\tconst group = self.data.groups[self.data.groups.length - 1]\n\t\t\t\tif (self.type == 'filter') {\n\t\t\t\t\t// add empty filter for this group\n\t\t\t\t\t// will display filter button in UI\n\t\t\t\t\tconst term = self.tsInstance.term\n\t\t\t\t\tif (!term.childTerms) throw 'child terms missing'\n\t\t\t\t\tself.data.filters.push({ terms: term.childTerms, group: group.currentIdx })\n\t\t\t\t}\n\t\t\t\tawait initGroupDiv(group)\n\t\t\t\tawait self.update()\n\t\t\t})\n\n\t\t//Apply button\n\t\tself.dom.actionDiv.applyBtn = self.dom.actionDiv\n\t\t\t.append('button')\n\t\t\t.classed('sjpp_grpset_apply_btn', true) //for integration testing\n\t\t\t.style('display', self.opts.hideApply ? 'none' : 'inline-block')\n\t\t\t.style('text-align', 'center')\n\t\t\t.style('float', 'right')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.text('Apply')\n\t\t\t.on('click', () => {\n\t\t\t\tself.processDraggables()\n\t\t\t\tself.tsInstance.dom.tip.hide()\n\t\t\t\tself.tsInstance.runCallback()\n\t\t\t})\n\n\t\t//Top message\n\t\tself.dom.menuWrapper\n\t\t\t.append('div')\n\t\t\t.style('display', self.type == 'filter' ? 'none' : 'block')\n\t\t\t.style('margin', '5px 2px')\n\t\t\t.style('font-size', '.6em')\n\t\t\t.style('color', '#999')\n\t\t\t.text('Drag-and-drop to assign categories to groups.')\n\n\t\tself.dom.grpsWrapper = self.dom.menuWrapper.append('div').classed('sjpp-groups-wrapper', true)\n\t\tself.dom.includedWrapper = self.dom.grpsWrapper\n\t\t\t.append('div')\n\t\t\t.classed('sjpp-groups-include', true)\n\t\t\t.classed('sjpp-group-edit-div', true)\n\t\t\t.style('display', 'flex')\n\t\tself.dom.excludedWrapper = self.dom.grpsWrapper\n\t\t\t.append('div')\n\t\t\t.classed('sjpp-groups-exclude', true)\n\t\t\t.classed('sjpp-group-edit-div', true)\n\t\t\t.classed('sjpp-drag-drop-div', true)\n\n\t\tconst excludedGroup = self.data.groups.find((d: GrpEntry) => d.currentIdx === 0)\n\t\tdelete excludedGroup.wrapper // excludedGroup will not get displayed by initGroupDiv() if .wrapper present\n\t\tawait initGroupDiv(excludedGroup)\n\n\t\tawait self.dom.includedWrapper\n\t\t\t.selectAll('div')\n\t\t\t.data(self.data.groups.filter((d: GrpEntry) => d.currentIdx != 0))\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.classed('sjpp-drag-drop-div', true) //for unit testing\n\t\t\t.style('border', '1px solid #efefef')\n\t\t\t.style('display', 'block')\n\t\t\t.style('padding', '10px')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.each(async function (this: Element, group: GrpEntryWithDom) {\n\t\t\t\tgroup.wrapper = select(this)\n\t\t\t\tawait initGroupDiv(group)\n\t\t\t})\n\t}\n\n\tself.processDraggables = () => {\n\t\tconst editedGrpset = draggedItem || addedFilter || editedName || removedGrp\n\t\tif (!editedGrpset) return // no groupset changes, so return\n\t\tconst customset: any = { groups: [] }\n\t\tfor (const group of self.data.groups) {\n\t\t\tconst customgroup: any = { name: group.name, type: group.type, uncomputable: group.uncomputable }\n\t\t\tif (group.type == 'filter') {\n\t\t\t\tconst groupFilter = self.data.filters.find((d: FilterEntry) => d.group == group.currentIdx)\n\t\t\t\tif (!groupFilter) throw 'filter missing'\n\t\t\t\tcustomgroup.filter = getNormalRoot(groupFilter.active)\n\t\t\t} else if (group.type == 'values') {\n\t\t\t\tconst groupValues = self.data.values\n\t\t\t\t\t.filter((v: ItemEntry) => v.group == group.currentIdx)\n\t\t\t\t\t.map((v: ItemEntry) => {\n\t\t\t\t\t\treturn { key: v.key, label: v.label }\n\t\t\t\t\t})\n\t\t\t\tcustomgroup.values = groupValues\n\t\t\t} else {\n\t\t\t\tthrow 'group.type is not recognized'\n\t\t\t}\n\t\t\tcustomset.groups.push(customgroup)\n\t\t}\n\t\tself.tsInstance.q.type = 'custom-groupset'\n\t\tself.tsInstance.q.customset = customset\n\t\tdelete self.tsInstance.q.predefined_groupset_idx\n\t}\n\n\tlet draggedItem: any\n\tlet addedFilter: boolean\n\tlet editedName: boolean\n\tlet removedGrp: boolean\n\tasync function initGroupDiv(group: GrpEntryWithDom) {\n\t\t//Create the parent group div on load and with user actions on the top\n\t\tconst wrapper = group.currentIdx === 0 ? self.dom.excludedWrapper : self.dom.includedWrapper\n\t\tif (!group.type) group.type = 'values'\n\t\tif (!group.wrapper)\n\t\t\tgroup.wrapper = wrapper\n\t\t\t\t.append('div')\n\t\t\t\t.classed('sjpp-drag-drop-div', true)\n\t\t\t\t.style('border', '1px solid #efefef')\n\t\t\t\t.style('display', 'block')\n\t\t\t\t.style('padding', '10px')\n\t\t\t\t.style('vertical-align', 'top')\n\n\t\tgroup.wrapper\n\t\t\t.on('drop', function (event: DragEvent) {\n\t\t\t\tconst itemData = draggedItem.node().__data__\n\t\t\t\tif (itemData.group === group.currentIdx) return\n\t\t\t\tgroup.draggables.node().appendChild(draggedItem.node())\n\n\t\t\t\tdraggedItem\n\t\t\t\t\t.style('transition-property', 'background-color')\n\t\t\t\t\t.style('transition-duration', '1s')\n\t\t\t\t\t.style('background-color', '#fff2cc')\n\n\t\t\t\tself.data.values.find((v: ItemEntry) => v === itemData).group = group.currentIdx\n\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t})\n\t\t\t.on('dragleave', function (event: DragEvent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tgroup.wrapper.style('background-color', '#fff')\n\t\t\t})\n\t\t\t.on('dragend', function (event: DragEvent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tgroup.wrapper.style('background-color', '#fff')\n\t\t\t})\n\t\t\t.on('dragover', function (event: DragEvent) {\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tgroup.wrapper.style(\n\t\t\t\t\t'background-color',\n\t\t\t\t\tgroup.currentIdx !== draggedItem.node().__data__.group ? '#cfe2f3' : '#fff'\n\t\t\t\t)\n\t\t\t})\n\t\t\t.on('dragenter', function (event: DragEvent) {\n\t\t\t\tif (draggedItem.node().__data__.group === group.currentIdx) return\n\t\t\t\tevent.preventDefault()\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tgroup.wrapper.style(\n\t\t\t\t\t'background-color',\n\t\t\t\t\tgroup.currentIdx !== draggedItem.node().__data__.group ? '#cfe2f3' : '#fff'\n\t\t\t\t)\n\t\t\t})\n\n\t\tif (group.currentIdx === 0) {\n\t\t\tgroup.title = group.wrapper\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('padding', '3px 10px')\n\t\t\t\t.style('text-align', 'left')\n\t\t\t\t.style('font-size', '.6em')\n\t\t\t\t.style('text-transform', 'uppercase')\n\t\t\t\t.style('color', '#999')\n\t\t\t\t.text(group.name)\n\t\t} else {\n\t\t\tgroup.dragActionDiv = group.wrapper.append('div').style('display', 'flex').style('align-items', 'center')\n\t\t\tgroup.input = group.dragActionDiv\n\t\t\t\t.append('input')\n\t\t\t\t.attr('size', 12)\n\t\t\t\t.attr('value', group.name)\n\t\t\t\t.style('margin', '5px')\n\t\t\t\t.style('margin-left', '8px')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t.style('width', '87%')\n\t\t\t\t.on('keyup', () => {\n\t\t\t\t\tdebounce(self.onKeyUp(group), 1000)\n\t\t\t\t})\n\n\t\t\tgroup.inputMessage = group.dragActionDiv\n\t\t\t\t.append('span')\n\t\t\t\t.style('color', 'red')\n\t\t\t\t.style('font-size', '0.7em')\n\t\t\t\t.text('NOT unique')\n\t\t\t\t.style('display', 'none')\n\n\t\t\tgroup.destroyBtn = group.dragActionDiv\n\t\t\t\t.append('button')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('padding', '0px 4px')\n\t\t\t\t.property('disabled', self.data.groups.length <= self.minGrpNum) //Each appears disabled/enabled based on the number of groups\n\t\t\t\t.text('x')\n\t\t\t\t.on('click', async () => {\n\t\t\t\t\tif (self.data.groups.length <= self.minGrpNum) return\n\t\t\t\t\tself.data.groups = self.data.groups.filter((d: GrpEntry) => d.currentIdx != group.currentIdx)\n\t\t\t\t\tawait self.removeGroup(group)\n\t\t\t\t}) as Element\n\t\t}\n\n\t\tgroup.draggables = group.wrapper.append('div').classed('sjpp-drag-list-div', true)\n\n\t\tif (group.type == 'filter') {\n\t\t\t// group is filter type, render filter button\n\t\t\tawait mayDisplayFilter(group)\n\t\t} else {\n\t\t\t// not filter type, render values in group\n\t\t\tawait self.addItems(group)\n\t\t}\n\t}\n\n\tasync function mayDisplayFilter(group, callback2?: any) {\n\t\tgroup.draggables.selectAll('*').remove()\n\t\tconst holder = group.draggables.append('div').style('margin-top', '15px')\n\n\t\tconst filter = self.data.filters.find((d: FilterEntry) => d.group == group.currentIdx)\n\t\tif (!filter || !filter.terms?.length) return\n\t\tif (!filter.active) filter.active = getWrappedTvslst()\n\n\t\tfilterInit({\n\t\t\tjoinWith: ['and', 'or'],\n\t\t\temptyLabel: '+Variant Filter',\n\t\t\tholder,\n\t\t\tvocab: {\n\t\t\t\tterms: filter.terms,\n\t\t\t\tparent_termdbConfig: self.tsInstance.vocabApi.termdbConfig\n\t\t\t},\n\t\t\tcallback: async f => {\n\t\t\t\t// once the filter is updated from UI, it's only updated here\n\t\t\t\t// user must press submit button to attach current filter to self.q{}\n\t\t\t\taddedFilter = true\n\t\t\t\tfilter.active = f\n\t\t\t\tif (callback2) await callback2()\n\t\t\t}\n\t\t}).main(filter.active)\n\t}\n\n\tself.onKeyUp = async function (group: GrpEntryWithDom) {\n\t\t//Detect unique name on change. If not a unique name, alert the user and disable apply button\n\t\tif (group.name == group.input.node().value) return\n\t\teditedName = true\n\t\tconst match = self.data.groups.filter((g: GrpEntryWithDom) => g.name == group.input.node().value)\n\t\tif (match.length > 0) {\n\t\t\tself.dom.actionDiv.applyBtn.property('disabled', true)\n\t\t\tgroup.inputMessage.style('display', 'block')\n\t\t} else {\n\t\t\tself.dom.actionDiv.applyBtn.property('disabled', false)\n\t\t\tgroup.inputMessage.style('display', 'none')\n\t\t\tself.data.groups[group.currentIdx].name = group.input.node().value.trim()\n\t\t}\n\t}\n\n\tself.addItems = async function (group: GrpEntryWithDom) {\n\t\t//add draggable items to group div\n\t\tawait group.draggables\n\t\t\t.selectAll('div')\n\t\t\t.data(self.data.values.filter((d: ItemEntry) => d.group == group.currentIdx))\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.attr('draggable', 'true')\n\t\t\t.attr('class', 'sjpp-drag-item')\n\t\t\t.style('margin', '3px')\n\t\t\t.style('cursor', 'default')\n\t\t\t.style('padding', '3px 10px')\n\t\t\t.style('border-radius', '5px')\n\t\t\t.style('color', (d: ItemEntry) => (d.samplecount == 0 ? '#777' : 'black'))\n\t\t\t.text((d: ItemEntry) => `${d.label}${d.samplecount !== undefined ? ` (n=${d.samplecount})` : ''}`)\n\t\t\t.style('background-color', '#eee')\n\t\t\t.each(function (this: Element) {\n\t\t\t\tconst itemNode = select(this)\n\t\t\t\t\t.on('dragstart', function () {\n\t\t\t\t\t\titemNode.style('background-color', '#fff2cc')\n\t\t\t\t\t\tdraggedItem = itemNode\n\t\t\t\t\t})\n\t\t\t\t\t.on('mouseenter', function () {\n\t\t\t\t\t\titemNode.style('background-color', '#fff2cc')\n\t\t\t\t\t})\n\t\t\t\t\t.on('mouseleave', function () {\n\t\t\t\t\t\titemNode.style('background-color', '#eee')\n\t\t\t\t\t})\n\t\t\t})\n\t}\n\n\tself.removeGroup = async function (group: GrpEntryWithDom) {\n\t\tremovedGrp = true\n\t\tif (self.type == 'values') {\n\t\t\tconst itemsNum = group.wrapper.selectAll('.sjpp-drag-item').nodes()\n\t\t\tif (itemsNum.length === 0) {\n\t\t\t\tgroup.wrapper.remove()\n\t\t\t} else {\n\t\t\t\tgroup.input.remove()\n\t\t\t\tgroup.destroyBtn.remove()\n\t\t\t\tgroup.wrapper.remove()\n\t\t\t\t// reassign all values to excluded categories group\n\t\t\t\tfor (const v of self.data.values) {\n\t\t\t\t\tif (v.group == group.currentIdx) v.group = 0\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (self.type == 'filter') {\n\t\t\tconst groupFilterIdx = self.data.filters.findIndex(f => f.group === group.currentIdx)\n\t\t\tconst groupFilter = self.data.filters.splice(groupFilterIdx, 1)[0]\n\t\t\tif (!groupFilter.active.lst.length) {\n\t\t\t\tgroup.wrapper.remove()\n\t\t\t} else {\n\t\t\t\tgroup.input.remove()\n\t\t\t\tgroup.destroyBtn.remove()\n\t\t\t\tgroup.wrapper.remove()\n\t\t\t\t// join the group filter to the excluded filter\n\t\t\t\tconst excludedFilter = self.data.filters.find(f => f.group === 0)\n\t\t\t\texcludedFilter.active = filterJoin([excludedFilter.active, groupFilter.active])\n\t\t\t}\n\t\t}\n\t\tawait self.update()\n\n\t\t// async function collapseAnimation(defaultDuration: number) {\n\t\t// \t//Remove user action divs\n\t\t// \tgroup.input.remove()\n\t\t// \tgroup.destroyBtn.remove()\n\t\t// \tgroup.wrapper.remove()\n\n\t\t// \t\t// const z = self.dom.excludedWrapper.node().getBoundingClientRect()\n\t\t// \t\t// const a = group.draggables.selectAll('.sjpp-drag-item')\n\t\t// \t\t// a\n\t\t// \t\t// .style('transform', `translate(${z.x}px, ${z.y}px)`)\n\t\t// \t\t// .style('transtition', `transform ${defaultDuration}ms ease-in-out`)\n\n\t\t// \t\t// a.transition().duration(defaultDuration).attr(`transform`, `translate(${z.x}, ${z.y})`)\n\t\t// \t\t// const { x, y } = getCollapsedScale(self.dom.excludedWrapper.node(), group.wrapper.node())\n\t\t// \t\t// console.log(x, y)\n\t\t// \t\t// \tconst collapsedX = 0\n\t\t// \t\t// \tconst collapsedY = 0\n\n\t\t// \t\t// const collapseEffect = [\n\t\t// \t\t// \t{ transform: 'none' },\n\t\t// \t\t// \t// { transform: 'none', offset: 0.2 },\n\t\t// \t\t// \t{ transform: `translate(${collapsedX}px, ${collapsedY}px)` }\n\t\t// \t\t// ]\n\n\t\t// \t\t// \tconst collapseTime = {\n\t\t// \t\t// \t\tduration: defaultDuration,\n\t\t// \t\t// \t\titerations: 1\n\t\t// \t\t// \t}\n\n\t\t// \t\t// \tawait group.draggables.each(function (this: HTMLElement) {\n\t\t// \t\t// \t\tconst item = select(this).node()\n\t\t// \t\t// \t\tif (!(item instanceof HTMLElement)) return\n\t\t// \t\t// \t\titem.animate(collapseEffect, collapseTime)\n\t\t// \t\t// \t})\n\n\t\t// \t\t// \tconst values2Exclude = self.data.values.filter((d: ItemEntry) => d.group == group.currentIdx)\n\t\t// \t\t// \tvalues2Exclude.forEach((d: ItemEntry) => (d.group = 0))\n\t\t// \t\t// \t// group.destroyBtn\n\t\t// \t\t// \t// \t.style('padding', '5px')\n\t\t// \t\t// \t// \t.text(itemsNum.length)\n\t\t// \t\t// \tgroup.draggables.style('transform', `translate(${collapsedX}px, ${collapsedY}px) scale(0)`)\n\t\t// \t}\n\t\t// }\n\n\t\t// function getCollapsedScale(anchor: any, div: Element) {\n\t\t// \t//anchor: constant element appearing on expand and collapse\n\t\t// \t//div: the whole div, items and all, to collapse and expand\n\t\t// \tconst collapsed = anchor.getBoundingClientRect()\n\t\t// \tconst expanded = div.getBoundingClientRect()\n\t\t// \tconsole.log(collapsed, expanded)\n\t\t// \treturn{ x: 0, y: 0}\n\t\t// \t// return {\n\t\t// \t// \tx: collapsed.width / expanded.width,\n\t\t// \t// \ty: collapsed.height / expanded.height\n\t\t// \t// }\n\t}\n\n\tself.update = async function () {\n\t\tself.dom.actionDiv.addGroup.property('disabled', self.data.groups.length >= self.maxGrpNum)\n\t\tfor (const [i, grp] of self.data.groups.entries()) {\n\t\t\tif (i === 0) continue\n\t\t\tif (grp.currentIdx != i) {\n\t\t\t\tself.data.values.filter((v: ItemEntry) => v.group == grp.currentIdx).forEach((v: ItemEntry) => (v.group = i))\n\t\t\t\tself.data.filters.filter(f => f.group == grp.currentIdx).forEach(f => (f.group = i))\n\t\t\t\tgrp.currentIdx = i\n\t\t\t}\n\t\t}\n\t\tself.dom.grpsWrapper\n\t\t\t.selectAll('.sjpp-drag-drop-div')\n\t\t\t.data(self.data.groups)\n\t\t\t.each(async (group: GrpEntryWithDom) => {\n\t\t\t\tif (group.currentIdx !== 0) {\n\t\t\t\t\tgroup.input.node().value = group.name\n\t\t\t\t\tgroup.destroyBtn.property('disabled', self.data.groups.length <= self.minGrpNum)\n\t\t\t\t}\n\t\t\t\tif (self.type == 'filter') await mayDisplayFilter(group)\n\t\t\t\telse await self.addItems(group)\n\t\t\t})\n\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.labeltext\n.callback()\n\tasync\n\tone boolean argument corresponding to whether the box is checked or not\n******* optional\n.divstyle{}\n.checked\n\tif set to true, box is checked by default\n*/\nexport function make_one_checkbox(arg) {\n\tconst { holder, labeltext, callback, checked, divstyle, id } = 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 (id) input.attr('id', id)\n\tlabel.append('span').html(' ' + labeltext)\n\treturn input\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 const domaincolorlst = [\n\t'#8dd3c7',\n\t'#bebada',\n\t'#fb8072',\n\t'#80b1d3',\n\t'#E8E89E',\n\t'#a6d854',\n\t'#fdb462',\n\t'#ffd92f',\n\t'#e5c494',\n\t'#b3b3b3'\n]\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 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 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", "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 { keyupEnter, gmlst2loci } from '#src/client'\nimport { debounce } from 'debounce'\nimport { dofetch3 } from '#common/dofetch'\nimport { invalidcoord, string2pos } from '#src/coord'\nimport type { ClientCopyGenome } from '../types/global'\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-- need ci tests\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/** required. menu instance to show list of matching genes */\n\ttip: any\n\t/** required. d3 element in which <input> is created */\n\trow: any\n\t/** Optional. The default is 'Gene, position' */\n\tplaceholder?: string\n\t/** optional\n\t * if 'gene' =>\n input can be symbol or alias\n result is {geneSymbol:str}, will not map to coord\n cannot map isoform to gene name!\n (later may need geneOrIsoform flag to query both) \n\tif 'snp' =>\n\tuser must select a single snp\n\tinput can be dbSNP id, position, or variant format (chr.pos.ref.alt)\n\tallow to enter chr.pos.ref.alt or hgvs (see next section)\n otherwise, only allow chr:start-stop\n\t*/\n\tsearchOnly?: 'gene' | 'snp'\n\tallowVariant?: boolean\n\t/** optional\n 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/** optional\n triggered when a valid hit is found, and has been written to RESULT object (see below)\n no parameter is supplied */\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: ClientCopyGenome\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}\n/*************************************\nby calling addGeneSearchbox(), it redirectly returns a RESULT object detailed below without await\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/***********************************\nif arg.callback() is not provided:\n any match is silently written to RESULT\n with repeated search the latest match is written to RESULT\n common pattern is that user will press a button to launch some logic that will check RESULT\n it's up to the calling code to decide when to access RESULT (e.g. pressing some button in caller's ui)\n usecase: block.tk.bam.gdc.js\n\nif arg.callback() is provided:\n upon a match, RESULT is updated and callback is triggered\n as a way to notify caller to do subsequent steps\n usecase: geneSearch4GDCmds3.js\n\n\n***********************************\npartial support of hgvs https://varnomen.hgvs.org/recommendations/DNA/\n\nlimited to substitution/insertion/deletion on \"g.\"\nother references (o. m. c. n.) are not supported\n\nentered positions are 1-based, parse to 0-based (TODO: this needs to be verified)\n\nsnv\n given chr14:g.104780214C>T\n parse to chr14.104780214.C.T\n\nmnv\n given chr2:g.119955155_119955159delinsTTTTT\n parse to chr2.119955155.AGCTG.TTTTT\n must query ref allele\n\ndeletion\n chr17:g.7673802delCGCACCTCAAAGCTGTTC\n parse to chr17.7673802.CGCACCTCAAAGCTGTTC.-\n\n chr?:g.33344591del\n parse to chr?.33344591.A.-\n must query ref allele\n\n if allele is present after \"del\", will use the allele\n otherwise decide by position/range\n https://varnomen.hgvs.org/recommendations/DNA/variant/deletion/\n\ninsertion\n chr5:g.171410539_171410540insTCTG\n parse to chr5.171410539.-.TCTG\n*/\n\nexport const debounceDelay = 500\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\t\t\t\tinput.blur()\n\t\t\t\ttip.hide()\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') getResult({ geneSymbol }, geneSymbol)\n\t\t\t\t\t\telse await geneCoordSearch(geneSymbol)\n\n\t\t\t\t\t\t// clear gene hits\n\t\t\t\t\t\ttip.showunder(searchbox.node()).clear()\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\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) throw gene.error\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: ClientCopyGenome) {\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: ClientCopyGenome) {\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: ClientCopyGenome) {\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: ClientCopyGenome) {\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: ClientCopyGenome) {\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: ClientCopyGenome) {\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 { ClientCopyGenome } from '../../types/global.ts'\n\ntype GenesMenuArgs = {\n\t/** tip holder for displaying the Menu */\n\ttip: Menu\n\tgenome: ClientCopyGenome\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: ClientCopyGenome\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 { 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 { ClientCopyGenome } from '../../types/global'\nimport type { GeneArgumentEntry } from '#types'\nimport { GenesMenu } from './GenesMenu'\nimport { addButton } from './addButton.ts'\nimport { dofetch3 } from '#common/dofetch'\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}\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: ClientCopyGenome\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/** 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}\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: ClientCopyGenome\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\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.minNumGenes = opts.minNumGenes || 0\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 = JSON.stringify(this.geneList.map(t => t.gene).sort())\n\n\t\tthis.holder.selectAll('*').remove()\n\t\tconst div = this.holder.append('div').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\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.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\tthis.callback({ geneList: this.geneList })\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) args.filter = 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()\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() {\n\t\tconst hasStat = this.geneList.some(g => g.mutationStat)\n\t\tif (!hasStat && !this.termsAsListed)\n\t\t\tthis.geneList.sort((a, b) => {\n\t\t\t\tif (a.gene < b.gene) return -1\n\t\t\t\tif (a.gene > b.gene) return 1\n\t\t\t\treturn 0\n\t\t\t})\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\tthis.api.dom.clearBtn.property('disabled', !this.geneList?.length)\n\t\tconst hasChanged = this.origNames !== 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.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 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", "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 type { TermWrapper, Q } from '@sjcrh/proteinpaint-types/updated'\nimport type { Term } from '#types'\nimport type { SetCellPropsSignature } from '../plots/matrix/matrix.xtw.ts'\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\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.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", "import type {\n\tCategoricalTerm,\n\tValuesQ,\n\tPredefinedGroupSettingQ,\n\tCustomGroupSettingQ,\n\tBaseGroupSet,\n\tCatTWTypes,\n\tCatTWValues,\n\tCatTWPredefinedGS,\n\tCatTWCustomGS,\n\tRawCatTW,\n\tRawCatTWValues,\n\tRawCatTWPredefinedGS,\n\tRawCatTWCustomGS\n} from '#types'\nimport type { TwOpts } from './TwBase.ts'\nimport { TwBase } from './TwBase.ts'\nimport { copyMerge } from '#rx'\nimport { set_hiddenvalues } from '#termsetting'\n\nexport type CatInstance = CatValues | CatPredefinedGS | CatCustomGS\nexport type CatTypes = typeof CatValues | typeof CatPredefinedGS | typeof CatCustomGS\n\nexport class CategoricalBase extends TwBase {\n\t// type, isAtomic, $id are set in ancestor base classes\n\tterm: CategoricalTerm\n\n\tconstructor(tw: CatTWTypes, 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 fill(tw: RawCatTW, opts: TwOpts = {}): CatTWTypes {\n\t\tif (!tw.term) throw `missing tw.term, must already be filled in`\n\t\tif (tw.term.type != 'categorical') throw `incorrect term.type='${tw.term?.type}', expecting 'categorical'`\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\t\tif (!tw.q) tw.q = { type: 'values', isAtomic: true }\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 RawCatTW 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? 'CatTWValues'\n\t\t\t\t: tw.q.type == 'predefined-groupset'\n\t\t\t\t? 'CatTWPredefinedGS'\n\t\t\t\t: tw.q.type == 'custom-groupset'\n\t\t\t\t? 'CatTWCustomGS'\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 RawCatTW* equivalent of the full CatTW* 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 CatTW* 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 'CatTWValues':\n\t\t\t\treturn CatValues.fill(tw)\n\n\t\t\tcase 'CatTWPredefinedGS':\n\t\t\t\treturn CatPredefinedGS.fill(tw)\n\n\t\t\tcase 'CatTWCustomGS':\n\t\t\t\treturn CatCustomGS.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 CategoricalBase.fill()`\n\t\t}\n\t}\n}\n\nexport class CatValues extends CategoricalBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: ValuesQ\n\t#tw: CatTWValues\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: CatTWValues, 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 CategoricalBase.fill() function above\n\tstatic fill(tw: RawCatTWValues): CatTWValues {\n\t\tif (!tw.type) tw.type = 'CatTWValues'\n\t\telse if (tw.type != 'CatTWValues') throw `expecting tw.type='CatTWValues', got '${tw.type}'`\n\n\t\tif (tw.term.type != 'categorical') throw `expecting tw.term.type='categorical', 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\n\t\t// GDC or other dataset may allow missing term.values\n\t\tif (!term.values) term.values = {}\n\t\t//const numVals = Object.keys(tw.term.values).length\n\t\t//GDC or other dataset may allow empty term.values\n\t\t//if (!numVals) throw `empty term.values`\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(tw.term.values).length != 2) throw 'term.values must have exactly two keys'\n\t\t}\n\t\tset_hiddenvalues(q, term)\n\t\treturn tw as CatTWValues\n\t}\n}\n\nexport class CatPredefinedGS extends CategoricalBase {\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: CatTWPredefinedGS\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: CatTWPredefinedGS, 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.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 fill(tw: RawCatTWPredefinedGS): CatTWPredefinedGS {\n\t\tif (!tw.type) tw.type = 'CatTWPredefinedGS'\n\t\telse if (tw.type != 'CatTWPredefinedGS') throw `expecting tw.type='CatTWPredefinedGS', got '${tw.type}'`\n\n\t\tif (tw.term.type != 'categorical') throw `expecting tw.term.type='categorical', got '${tw.term.type}'`\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)\n\t\treturn tw as CatTWPredefinedGS\n\t}\n}\n\nexport class CatCustomGS extends CategoricalBase {\n\t// term, type, isAtomic, $id are set in ancestor base classes\n\tq: CustomGroupSettingQ\n\tgroupset!: BaseGroupSet\n\t#tw: CatTWCustomGS\n\t#opts: TwOpts\n\n\t// declare a constructor, to narrow the tw type\n\tconstructor(tw: CatTWCustomGS, 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 CategoricalBase.fill() function above\n\tstatic fill(tw: RawCatTWCustomGS): CatTWCustomGS {\n\t\tif (!tw.type) tw.type = 'CatTWCustomGS'\n\t\telse if (tw.type != 'CatTWCustomGS') throw `expecting tw.type='CatTWCustomGS', got '${tw.type}'`\n\n\t\tif (tw.term.type != 'categorical') throw `expecting tw.term.type='categorical', 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.mode == 'binary') {\n\t\t\tif (q.customset.groups.length != 2) throw 'there must be exactly two groups'\n\t\t\t// TODO:\n\t\t\t// - add validation that both groups have samplecount > 0 or some other minimum count\n\t\t\t// - rough example\n\t\t\t// const data = vocabApi.getCategories() or maybe this.countSamples()\n\t\t\t// if (data.sampleCounts) {\n\t\t\t// \tfor (const grp of groupset.groups) {\n\t\t\t// \t\tif (!data.sampleCounts.find(d => d.label === grp.name))\n\t\t\t// \t\t\tthrow `there are no samples for the required binary value=${grp.name}`\n\t\t\t// \t}\n\t\t\t// }\n\t\t}\n\t\tset_hiddenvalues(q, term)\n\t\treturn tw as CatTWCustomGS\n\t}\n}\n", "import { getPillNameDefault } from '../termsetting'\nimport type { GeneVariantTermSettingInstance, RawGvTerm, VocabApi, DtTerm } from '#types'\nimport type { PillData } from '../types'\nimport { make_radios } from '#dom'\nimport { GroupSettingMethods } from './groupsetting.ts'\nimport { dtTerms } from '#shared/common.js'\n\n// self is the termsetting instance\nexport function getHandler(self: GeneVariantTermSettingInstance) {\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\tif (self.q.type == 'custom-groupset') {\n\t\t\t\tconst n = self.q.customset.groups.filter(group => !group.uncomputable).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\n\t\tasync postMain() {\n\t\t\t// need to regenerate child dt terms here to update\n\t\t\t// the terms upon data updates (e.g., filter)\n\t\t\tawait getChildTerms(self.term, self.vocabApi)\n\t\t}\n\t}\n}\n\nasync function makeEditMenu(self: GeneVariantTermSettingInstance, _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\t*/\n\tconst div = _div.append('div').style('padding', '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\n\t\t.append('div')\n\t\t.style('display', 'none')\n\t\t.style('margin', '5px 0px 0px 30px')\n\t\t.style('vertical-align', 'top')\n\tconst draggablesDiv = div.append('div').style('display', 'none').style('margin-left', '15px')\n\t// apply button\n\t// must create it at beginning to allow toggling applySpan message\n\tconst applyRow = div.append('div').style('margin-top', '15px')\n\tapplyRow\n\t\t.append('button')\n\t\t.style('display', 'inline-block')\n\t\t.text('Apply')\n\t\t.on('click', () => {\n\t\t\tif (self.groupSettingInstance) self.groupSettingInstance.processDraggables()\n\t\t\tlet validGrpset = false\n\t\t\tif (self.q.type == 'custom-groupset') {\n\t\t\t\t// groupset is assigned\n\t\t\t\tif (self.q.customset?.groups.map((group: any) => group.filter?.lst).some(lst => lst.length)) {\n\t\t\t\t\t// filters in groupset are non-empty\n\t\t\t\t\tvalidGrpset = true\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!validGrpset) {\n\t\t\t\t// groupset is not valid, so clear it\n\t\t\t\tclearGroupset(self)\n\t\t\t}\n\t\t\tself.runCallback()\n\t\t})\n\tapplyRow\n\t\t.append('span')\n\t\t.attr('id', 'applySpan')\n\t\t.style('display', 'none')\n\t\t.style('padding-left', '15px')\n\t\t.style('opacity', 0.8)\n\t\t.style('font-size', '.8em')\n\t\t.text('Only tested variants are considered')\n\n\t// radio buttons for whether or not to group variants\n\toptsDiv.append('div').style('font-weight', 'bold').text('Group variants')\n\tconst isGroupset = self.q.type == 'custom-groupset'\n\tconst radios = make_radios({\n\t\tholder: optsDiv,\n\t\toptions: [\n\t\t\t{ label: 'No variant grouping', value: 'noGroup', checked: !isGroupset },\n\t\t\t{ label: 'Assign variants to groups', value: 'group', checked: isGroupset }\n\t\t],\n\t\tcallback: async v => {\n\t\t\tif (v == 'group') {\n\t\t\t\tawait makeGroupUI()\n\t\t\t} else {\n\t\t\t\tclearGroupset(self)\n\t\t\t\tgroupsDiv.style('display', 'none')\n\t\t\t\tdraggablesDiv.style('display', 'none')\n\t\t\t\tapplyRow.select('#applySpan').style('display', 'none')\n\t\t\t}\n\t\t}\n\t})\n\n\tif (self.usecase?.detail == 'term0' || self.usecase?.detail == 'term2' || self.opts.geneVariantEditMenuOnlyGrp) {\n\t\t// hide option for turning off groupsetting\n\t\toptsDiv.style('display', 'none')\n\t\tgroupsDiv.style('margin-top', '10px')\n\t}\n\n\tconst selected = radios.inputs.filter(d => d.checked)\n\tif (selected.property('value') == 'group') await makeGroupUI()\n\n\t// make radio buttons for grouping variants\n\tasync function makeGroupUI() {\n\t\tself.q.type = 'custom-groupset'\n\t\tawait makeGroupsetDraggables()\n\t\tapplyRow.select('#applySpan').style('display', 'inline')\n\t}\n\n\t// function for making groupset draggables\n\tasync function makeGroupsetDraggables() {\n\t\tdraggablesDiv.style('display', 'inline-block')\n\t\tdraggablesDiv.selectAll('*').remove()\n\t\tself.groupSettingInstance = new GroupSettingMethods(self, {\n\t\t\ttype: 'filter',\n\t\t\tholder: draggablesDiv,\n\t\t\thideApply: true\n\t\t})\n\t\tawait self.groupSettingInstance.main()\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\tdelete self.groupSettingInstance\n}\n\n// function to get child dt terms\n// will use these terms to generate a frontend vocab\nexport async function getChildTerms(term: RawGvTerm, vocabApi: VocabApi) {\n\tif (!vocabApi.termdbConfig?.queries) throw 'termdbConfig.queries is missing'\n\tconst termdbmclass = vocabApi.termdbConfig.mclass // custom mclass labels from dataset\n\tconst dtTermsInDs: DtTerm[] = [] // dt terms in dataset\n\tconst body: any = {}\n\tconst filter = vocabApi.state?.termfilter?.filter\n\tconst filter0 = vocabApi.state?.termfilter?.filter0\n\tif (filter0) {\n\t\t// TODO: currently adding filter0 to body{}, but should\n\t\t// refactor the input of getCategories() to be a single opts{}\n\t\t// object, which can include .term, .filter, .filter0, and\n\t\t// any other properties\n\t\tbody.filter0 = filter0\n\t}\n\tconst categories = await vocabApi.getCategories(term, filter, body)\n\tfor (const _t of dtTerms) {\n\t\tconst t: any = structuredClone(_t)\n\t\tif (!Object.keys(vocabApi.termdbConfig.queries).includes(t.query)) continue // dt is not in dataset\n\t\tconst data = categories.lst.find(x => x.dt == t.dt)\n\t\tif (!data) continue // gene does not have this dt\n\t\tconst byOrigin = vocabApi.termdbConfig.assayAvailability?.byDt[t.dt]?.byOrigin\n\t\tlet classes\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\tclasses = data.classes.byOrigin[t.origin]\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\tclasses = data.classes\n\t\t}\n\t\t// filter for only those mutation classes that are in the dataset\n\t\tconst values = Object.fromEntries(Object.entries(t.values).filter(([k, _v]) => Object.keys(classes).includes(k)))\n\t\t// add custom mclass labels from dataset\n\t\tfor (const k of Object.keys(values)) {\n\t\t\tconst v: any = values[k]\n\t\t\tif (termdbmclass && Object.keys(termdbmclass).includes(k)) v.label = termdbmclass[k].label\n\t\t}\n\t\tt.values = values\n\t\tt.parentTerm = structuredClone(term)\n\t\tdelete t.parentTerm.childTerms // remove any nested child terms\n\t\tdtTermsInDs.push(t)\n\t}\n\tterm.childTerms = dtTermsInDs\n}\n", "import type {\n\tGvTerm,\n\tBaseGroupSet,\n\tGvValuesQ,\n\tGvCustomGsQ,\n\tRawGvValuesTW,\n\tGvValuesTW,\n\tRawGvCustomGsTW,\n\tGvCustomGsTW,\n\tRawGvTW,\n\tGvTW,\n\tFilterGroup,\n\tVocabApi,\n\tFilter\n} from '#types'\nimport { TwBase, type TwOpts } from './TwBase.ts'\nimport { copyMerge } from '#rx'\nimport { set_hiddenvalues } from '#termsetting'\nimport { getWrappedTvslst } from '#filter/filter'\nimport { getChildTerms } 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.kind) {\n\t\t\t// support saved states that don't have term.kind, applied when rehydrating at runtime\n\t\t\tconst term: any = tw.term\n\t\t\tif (term.gene || (term.name && !term.chr)) term.kind = 'gene'\n\t\t\telse if (term.chr) term.kind = 'coord'\n\t\t\telse throw 'unable to assign geneVariant term.kind'\n\t\t}\n\n\t\tif (tw.term.kind == 'gene') {\n\t\t\tif (!tw.term.gene) tw.term.gene = tw.term.name\n\t\t\tif (!tw.term.name) tw.term.name = tw.term.gene\n\t\t\tif (!tw.term.gene || !tw.term.name) throw 'missing gene/name'\n\t\t} else if (tw.term.kind == 'coord') {\n\t\t\tif (!tw.term.chr || !Number.isInteger(tw.term.start) || !Number.isInteger(tw.term.stop))\n\t\t\t\tthrow 'no position specified'\n\t\t\tif (!tw.term.name) {\n\t\t\t\ttw.term.name = `${tw.term.chr}:${tw.term.start + 1}-${tw.term.stop}`\n\t\t\t}\n\t\t} else {\n\t\t\tthrow 'cannot recognize tw.term.kind'\n\t\t}\n\n\t\tif (!tw.term.id) tw.term.id = tw.term.name\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{\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\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' ? 'GvValuesTW' : tw.q.type == 'custom-groupset' ? 'GvCustomGsTW' : 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 'GvCustomGsTW':\n\t\t\t\treturn await GvCustomGS.fill(tw, opts)\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 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, opts: TwOpts = {}): 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\t// may fill groups\n\t\tawait mayMakeGroups(tw, opts.vocabApi)\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\nexport async function mayMakeGroups(tw: RawGvCustomGsTW, vocabApi: VocabApi) {\n\tif (tw.q.type != 'custom-groupset' || tw.q.customset?.groups.length) return\n\t// custom groupset, but customset.groups[] is empty\n\t// fill with 2 groups for the first applicable dt term\n\tawait getChildTerms(tw.term, vocabApi)\n\tconst dtTerms = tw.term.childTerms\n\tif (!dtTerms) throw 'dtTerms is missing'\n\tlet grp1Class, grp1Name, grp1Value, grp1Tvs, grp1Filter\n\tlet grp2Class, grp2Name, grp2Value, grp2Tvs, grp2Filter\n\tfor (const dtTerm of dtTerms) {\n\t\tconst classes = Object.keys(dtTerm.values)\n\t\tif (classes.length < 2) {\n\t\t\t// fewer than 2 classes, try next dt term\n\t\t\tcontinue\n\t\t}\n\t\t// group 1 will be wildtype or first available mutant class\n\t\tgrp1Class = classes.includes('WT') ? 'WT' : classes[0]\n\t\tgrp1Name = dtTerm.values[grp1Class].label\n\t\tgrp1Value = { key: grp1Class, label: grp1Name, value: grp1Class }\n\t\tgrp1Tvs = { type: 'tvs', tvs: { term: dtTerm, values: [grp1Value] } }\n\t\tgrp1Filter = getWrappedTvslst([grp1Tvs])\n\t\tif (dtTerm.origin) grp1Name += ` (${dtTerm.origin})`\n\t\t// group 2 will be all other classes\n\t\tif (classes.length == 2) {\n\t\t\tgrp2Class = classes.find(c => c != grp1Class)\n\t\t\tif (!grp2Class) throw 'mutant class cannot be found'\n\t\t\tgrp2Name = dtTerm.values[grp2Class].label\n\t\t\tgrp2Value = { key: grp2Class, label: grp2Name, value: grp2Class }\n\t\t\tgrp2Tvs = { type: 'tvs', tvs: { term: dtTerm, values: [grp2Value] } }\n\t\t\tif (dtTerm.origin) grp2Name += ` (${dtTerm.origin})`\n\t\t} else {\n\t\t\tgrp2Tvs = { type: 'tvs', tvs: { term: dtTerm, values: [grp1Value], isnot: true } }\n\t\t\tgrp2Name = classes.includes('WT') ? dtTerm.name : `Other ${dtTerm.name}`\n\t\t}\n\t\tgrp2Filter = getWrappedTvslst([grp2Tvs])\n\t\tbreak\n\t}\n\t// assign filters to groups\n\tconst grp1: FilterGroup = {\n\t\tname: grp1Name,\n\t\ttype: 'filter',\n\t\tuncomputable: false,\n\t\tfilter: grp1Filter\n\t}\n\tconst grp2: FilterGroup = {\n\t\tname: grp2Name,\n\t\ttype: 'filter',\n\t\tuncomputable: false,\n\t\tfilter: grp2Filter\n\t}\n\tconst grp0: FilterGroup = {\n\t\tname: 'Excluded categories',\n\t\ttype: 'filter',\n\t\tuncomputable: true,\n\t\tfilter: getWrappedTvslst() as Filter\n\t}\n\t// assign groups to custom groupset\n\ttw.q.customset = { groups: [grp0, grp1, grp2] }\n}\n", "import type {\n\tNumericTerm,\n\tNumericQ,\n\tNumTWTypes,\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 { copyMerge } from '#rx'\nimport { isNumeric } from '#shared/helpers.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\n\nexport class NumericBase extends TwBase {\n\t// type is set by TwBase constructor\n\tterm: NumericTerm\n\tstatic termTypes = new Set(['integer', 'float', 'geneExpression', 'metaboliteIntensity'])\n\n\tconstructor(tw: NumTWTypes, opts: TwOpts) {\n\t\tsuper(tw, opts)\n\t\tthis.term = tw.term\n\t}\n\n\tstatic async fill(tw: RawNumTW, opts: TwOpts = {}): Promise<NumTWTypes> {\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\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\tif (!tw.q.mode) tw.q.mode = 'discrete'\n\n\t\t// fill q.type for binary or discrete mode to enable routing\n\t\tif ((tw.q.mode == 'discrete' || tw.q.mode == 'binary') && !tw.q.type) {\n\t\t\tif (tw.q.mode == 'binary') tw.q.type = 'custom-bin'\n\t\t\telse if (tw.q.mode == 'discrete') mayFillQWithPresetBins(tw)\n\t\t}\n\n\t\t// remove q.type for continuous or spline mode\n\t\tif (tw.q.mode == 'continuous' || tw.q.mode == 'spline') delete tw.q.type\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\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)\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\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\t// See the relevant comments in the NumericBase.fill() function above\n\tstatic async fill(tw: RawNumTWRegularBin): 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\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\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.q.preferredBins == 'median' && !tw.q.lst?.length) {\n\t\t\tconst result = await opts.vocabApi.getPercentile(tw.term.id, [50])\n\t\t\tif (!result.values) throw '.values[] missing from vocab.getPercentile()'\n\t\t\tconst median = roundValueAuto(result.values[0])\n\n\t\t\tif (!isNumeric(median)) throw 'median value not a number'\n\t\t\ttw.q.type = 'custom-bin'\n\t\t\ttw.q.lst = [\n\t\t\t\t{\n\t\t\t\t\tstartunbounded: true,\n\t\t\t\t\tstop: median,\n\t\t\t\t\tstopinclusive: false,\n\t\t\t\t\tlabel: '<' + median // if label is missing, cuminc will break with \"unexpected seriesId\", cuminc.js:367\n\t\t\t\t} as StartUnboundedBin,\n\t\t\t\t{\n\t\t\t\t\tstart: median,\n\t\t\t\t\tstartinclusive: true,\n\t\t\t\t\tstopunbounded: true,\n\t\t\t\t\tlabel: '\u2265' + median\n\t\t\t\t} as StopUnboundedBin\n\t\t\t]\n\t\t\tdelete tw.q.preferredBins\n\t\t} else 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\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\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\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 { TermWrapper } from '@sjcrh/proteinpaint-types/updated'\nimport type { TwOpts, TwBase } from './TwBase'\nimport { mayHydrateDictTwLst } from '../termsetting/termsetting.ts'\nimport { CategoricalBase, CatValues, CatPredefinedGS, CatCustomGS } from './categorical'\nimport { GvBase } from './geneVariant'\nimport { NumericBase, NumRegularBin, NumCustomBins, NumCont } from './numeric'\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 'CatTWValues':\n\t\t\t\treturn new CatValues(tw, opts)\n\t\t\tcase 'CatTWPredefinedGS':\n\t\t\t\treturn new CatPredefinedGS(tw, opts)\n\t\t\tcase 'CatTWCustomGS':\n\t\t\t\treturn new CatCustomGS(tw, opts)\n\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\n\t\t\tdefault:\n\t\t\t\t//console.log(57, tw)\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\treturn TwRouter.init(tw, opts)\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\t\treturn await CategoricalBase.fill(tw, opts)\n\t\t\t}\n\t\t\tcase 'integer':\n\t\t\tcase 'float':\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\t// case 'geneExpression':\n\t\t\t// \treturn\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 { getInitFxn, copyMerge, deepEqual } from '#rx'\nimport { Menu } from '#dom'\nimport { select, type BaseType } from 'd3-selection'\nimport { minimatch } from 'minimatch'\nimport type {\n\tCategoricalQ,\n\tQ,\n\tTermWrapper,\n\tTwLst,\n\tNumericQ,\n\tSnpsQ,\n\tVocabApi,\n\tDom,\n\tUseCase,\n\tNoTermPromptOptsEntry,\n\tFilter,\n\tSampleCountsEntry,\n\tTerm\n} from '#types'\nimport type { TermSettingOpts, Handler, PillData } from './types'\nimport { TermTypes, isDictionaryType, isNumericTerm } from '#shared/terms.js'\nimport { TwRouter } from '#tw/TwRouter'\n\n/*\n********************* EXPORTED\ntermsettingInit()\ngetPillNameDefault()\nfillTermWrapper()\n\tcall_fillTW\n\tmayValidateQmode\nset_hiddenvalues()\n********************* Instance methods\nclickNoPillDiv\nshowTree\n\nopts{}\n\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\nconst defaultOpts: { menuOptions: string; menuLayout: string } = {\n\tmenuOptions: 'edit', // ['edit', 'replace', 'save', 'remove', 'reuse'],\n\tmenuLayout: 'vertical'\n}\n\n//type HandlerByType = { [index: string]: Handler }\ntype HandlerByType = {\n\tdefault: Handler\n\t[termType: string]: Handler\n\t//categorical: CategoricalHandler\n\t//numeric: NumericHandler\n}\n\ninterface TermSettingApi {\n\tmain: (d: PillData) => void\n\trunCallback: () => void\n\tshowTree: (holder, event: MouseEvent) => boolean\n\tshowMenu: (event: MouseEvent, clickedElem, menuHolder: Selection | null) => void\n\tshowGeneSearch: (clickedElem: Element | null, event: MouseEvent) => void\n\thasError: () => boolean\n\tvalidateQ: (d: PillData) => void\n}\n\nexport class TermSetting {\n\topts: TermSettingOpts\n\tvocabApi: VocabApi\n\tdom: Dom //opts.holder is required\n\n\t//Optional opts, hence undefined type\n\tactiveCohort?: number\n\tplaceholder?: string\n\tdurations: { exit: number }\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 | undefined\n\n\t//Created\n\thasError: boolean\n\tapi: TermSettingApi\n\tnumqByTermIdModeType: any //{}\n\thandlerByType: HandlerByType\n\tshowTree: any\n\tshowGeneSearch: any\n\tshowMenu: any\n\tinitUI: any\n\tupdateUI: any\n\thandler: Handler\n\n\t//Pill data\n\tterm: any\n\tq!: Q\n\tdata: any\n\terror: string | undefined\n\tfilter: Filter | undefined\n\n\tconstructor(opts: TermSettingOpts) {\n\t\tthis.opts = this.validateOpts(opts)\n\t\tthis.vocabApi = opts.vocabApi\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\n\t\t// numqByTermIdModeType is used if/when a numeric pill term type changes:\n\t\t// it will track numeric term.q by term.id, q.mode, and q.type to enable\n\t\t// the \"remember\" input values when switching between\n\t\t// discrete, continuous, and binary edit menus for the same term\n\t\tthis.numqByTermIdModeType = {}\n\n\t\t// parent_menu is for detecting if the holder is contained within a floating client Menu instance;\n\t\t// this will be useful in preventing premature closure of the menu in case\n\t\t// a submenu is clicked and is still visible\n\t\t// NOTE: the parent_menu value may be empty (undefined)\n\t\tthis.dom = {\n\t\t\tholder: opts.holder,\n\t\t\ttip:\n\t\t\t\topts.tip ||\n\t\t\t\tnew Menu({\n\t\t\t\t\tpadding: '0px',\n\t\t\t\t\tparent_menu: this.opts.holder && this.opts.holder.node() && this.opts.holder.node().closest('.sja_menu_div')\n\t\t\t\t})\n\t\t} as Dom\n\t\t// tip2 is for showing inside tip, e.g. in snplocus UI\n\t\tthis.dom.tip2 = new Menu({\n\t\t\tpadding: '0px',\n\t\t\tparent_menu: this.dom.tip.d.node()\n\t\t})\n\n\t\tsetInteractivity(this)\n\t\tsetRenderers(this)\n\t\tthis.initUI()\n\n\t\tconst defaultHandler = getDefaultHandler(this)\n\t\tthis.handlerByType = {\n\t\t\tdefault: defaultHandler\n\t\t}\n\t\tthis.handler = defaultHandler\n\n\t\tthis.hasError = false\n\n\t\t// this api will be frozen and returned by termsettingInit()\n\t\tthis.api = {\n\t\t\t// bind the 'this' context of api.main() to the Termsetting instance\n\t\t\t// instead of to the this.api object\n\t\t\tmain: this.main.bind(this),\n\t\t\trunCallback: this.runCallback.bind(this),\n\t\t\t// do not change the this context of showTree, d3 sets it to the DOM element\n\t\t\tshowTree: this.showTree,\n\t\t\tshowMenu: this.showMenu.bind(this),\n\t\t\tshowGeneSearch: this.showGeneSearch,\n\t\t\thasError: () => this.hasError,\n\t\t\tvalidateQ: (d: PillData) => {\n\t\t\t\tif (!this.handler || !this.handler.validateQ) return\n\t\t\t\ttry {\n\t\t\t\t\tthis.handler.validateQ(d)\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthis.hasError = true\n\t\t\t\t\tthrow e\n\t\t\t\t}\n\t\t\t}\n\t\t} as TermSettingApi\n\t}\n\n\trunCallback(overrideTw = null) {\n\t\t/* optional termwrapper (tw) to override attributes of this.term{} and this.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 = this.term ? { term: this.term, q: this.q, isAtomic: true } : {}\n\t\tif ('$id' in this) arg.$id = this.$id\n\t\tif (arg.q?.reuseId && arg.q.reuseId === this.data.q?.reuseId) {\n\t\t\tif (!deepEqual(arg.q, this.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\tif (this.opts.callback) this.opts.callback(overrideTw ? copyMerge(JSON.stringify(arg), otw) : arg)\n\t}\n\n\tvalidateOpts(_opts: TermSettingOpts) {\n\t\tconst o = Object.assign({}, defaultOpts, _opts)\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\tasync main(data = {} as PillData) {\n\t\ttry {\n\t\t\tif (this.doNotHideTipInMain) {\n\t\t\t\t// single use: if true then delete\n\t\t\t\tdelete this.doNotHideTipInMain\n\t\t\t} else {\n\t\t\t\tthis.dom.tip.hide()\n\t\t\t}\n\t\t\tthis.hasError = false\n\t\t\tdelete this.error\n\t\t\tthis.validateMainData(data)\n\t\t\t// may need original values for comparing edited settings\n\t\t\tthis.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\tthis.term = data.term as Term\n\t\t\tthis.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) this.$id = data.$id\n\t\t\tif ('disable_terms' in data) this.disable_terms = data.disable_terms\n\t\t\tif ('filter' in data) this.filter = data.filter as Filter\n\t\t\tif ('activeCohort' in data) this.activeCohort = data.activeCohort\n\t\t\tif ('sampleCounts' in data) this.sampleCounts = data.sampleCounts\n\t\t\tif ('menuOptions' in data) this.opts.menuOptions = data.menuOptions\n\t\t\tawait this.setHandler(this.term ? this.term.type : null)\n\t\t\tif (data.term && this.handler && this.handler.validateQ) this.handler.validateQ(data)\n\t\t\tif (this.handler.postMain) await this.handler.postMain()\n\t\t\tif (this.opts.renderAs != 'none') this.updateUI()\n\t\t} catch (e) {\n\t\t\tthis.hasError = true\n\t\t\tthrow e\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) throw '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) {\n\t\tif (!termtype) {\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\nexport const termsettingInit = getInitFxn(TermSetting)\n\nfunction setRenderers(self) {\n\tself.initUI = () => {\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\t;(self.dom.nopilldiv as HTMLElement) = self.dom.holder\n\t\t\t.append('div')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.on('click', self.clickNoPillDiv)\n\t\t\t.on(`keyup.sjpp-termdb`, event => {\n\t\t\t\tif (event.key == 'Enter') self.showTree(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.opts.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\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 3px 6px')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('border-radius', '6px')\n\t\t\t\t.style('background-color', '#4888BF')\n\t\t\t\t.text(self.opts.placeholderIcon)\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\tself.updateUI = async () => {\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.removeTerm!()\n\t\t\t\t\telse if (d == 'replace') {\n\t\t\t\t\t\tself.showTree(event.target)\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(self.exitPill)\n\n\t\tpills.transition().duration(200).each(self.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', self.showMenu)\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 (this: string) {\n\t\tconst one_term_div = select(this)\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(self.handler!.getPillName)\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\tself.updatePill!.call(this)\n\t}\n\n\tself.updatePill = async function (this: string) {\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(this)\n\n\t\tconst pillstat: { text: string; bgcolor?: string } = self.handler!.getPillStatus() || {}\n\t\t// { text, bgcolor }\n\n\t\tself.dom.pill_termname.style('border-radius', pillstat.text ? '6px 0 0 6px' : '6px').html(self.handler!.getPillName)\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\tself.exitPill = function (this: string) {\n\t\tselect(this).style('opacity', 1).transition().duration(self.durations.exit).style('opacity', 0).remove()\n\t}\n}\n\nfunction setInteractivity(self) {\n\tself.removeTerm = () => {\n\t\tself.opts.callback!(null)\n\t}\n\n\tself.cancelGroupsetting = () => {\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\tself.clickNoPillDiv = async () => {\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.showTree(self.dom.nopilldiv.node())\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.show(event.clientX, event.clientY).d.append('div').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.showTree(self.dom.tip.d.node())\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\tawait self.vocabApi.setTermBins({ term: self.term, q: self.q })\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\tself.showTree = async function (holder, event: MouseEvent | undefined) {\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\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) self.opts.customFillTw(tw)\n\t\t\t\t\tawait call_fillTW(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\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tself.showMenu = (event: MouseEvent, clickedElem = null, menuHolder = null) => {\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\n\t\tif (self.q.type == 'predefined-groupset' || self.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 (self.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.cancelGroupsetting } as opt)\n\t\t\t}\n\t\t}\n\n\t\tif (self.q && !self.term.groupsetting?.disabled && minimatch('edit', self.opts.menuOptions)) {\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 && self.term.type != 'survival') {\n\t\t\t\t\t\tawait self.vocabApi.setTermBins({ term: self.term, q: self.q })\n\t\t\t\t\t}\n\t\t\t\t\tself.handler!.showEditMenu(div)\n\t\t\t\t}\n\t\t\t} as opt)\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({ label: 'Replace', callback: self.showTree } as opt)\n\t\t}\n\n\t\tif (minimatch('remove', self.opts.menuOptions)) {\n\t\t\toptions.push({ label: 'Remove', callback: self.removeTerm } as opt)\n\t\t}\n\n\t\tif (self.opts.customMenuOptions) options.push(...self.opts.customMenuOptions)\n\n\t\tself.openMenu = menuHolder || tip.d\n\t\tself.openMenu\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\tself.openMenu.select('.sja_menuoption').node()?.focus()\n\t\t//self.showFullMenu(tip.d, self.opts.menuOptions)\n\t}\n\n\t// TODO: deprecate the reuse option???\n\tself.showReuseMenu = async function (_div: any) {\n\t\tconst saveDiv = _div.append('div')\n\t\tsaveDiv\n\t\t\t.style('display', 'block')\n\t\t\t.style('padding', '10px')\n\t\t\t.append('span')\n\t\t\t.style('color', '#aaa')\n\t\t\t.html('Save current setting as ')\n\n\t\tconst qlst = self.vocabApi.getCustomTermQLst(self.term)\n\t\tconst qNameInput = saveDiv\n\t\t\t.append('input')\n\t\t\t.attr('type', 'text')\n\t\t\t.attr('placeholder', qlst.nextReuseId)\n\t\t\t.attr('value', self.q.reuseId || qlst.nextReuseId)\n\t\t//.style('width', '300px')\n\n\t\tsaveDiv\n\t\t\t.append('button')\n\t\t\t.style('margin-left', '5px')\n\t\t\t.html('Save')\n\t\t\t.on('click', () => {\n\t\t\t\tconst reuseId = qNameInput.property('value').trim() || qlst.nextReuseId\n\t\t\t\tself.q.reuseId = reuseId\n\t\t\t\t//self.q.name = self.q.reuseId\n\t\t\t\tself.vocabApi.cacheTermQ(self.term, self.q)\n\t\t\t\tself.runCallback!()\n\t\t\t\tself.dom.tip.hide()\n\t\t\t})\n\n\t\tconst tableWrapper = _div.append('div').style('margin', '10px')\n\t\t// TODO: may use a more specific type, if the reuse menu option is not deprecated\n\t\tconst defaultTw: any = { term: self.term, q: {} }\n\t\tawait fillTermWrapper(defaultTw, self.vocabApi)\n\t\tdefaultTw.q.reuseId = 'Default'\n\t\tqlst.push(defaultTw.q)\n\t\tif (qlst.length > 1) {\n\t\t\ttableWrapper.append('div').style('color', '#aaa').html('Previously saved settings')\n\t\t}\n\n\t\ttableWrapper\n\t\t\t.append('table')\n\t\t\t.selectAll('tr')\n\t\t\t.data(qlst)\n\t\t\t.enter()\n\t\t\t.append('tr')\n\t\t\t.style('margin', '2px 5px')\n\t\t\t.each(function (this: BaseType, q: Q) {\n\t\t\t\tconst tr = select(this)\n\t\t\t\tconst inuse = equivalentQs(self.q, q)\n\t\t\t\tconst html2Use = q.name || (q.reuseId as string)\n\t\t\t\ttr.append('td')\n\t\t\t\t\t.style('min-width', '180px')\n\t\t\t\t\t//.style('border-bottom', '1px solid #eee')\n\t\t\t\t\t.style('text-align', 'center')\n\t\t\t\t\t.html(html2Use)\n\n\t\t\t\tconst useTd = tr.append('td').style('text-align', 'center')\n\t\t\t\tif (inuse) {\n\t\t\t\t\tuseTd.html(`In use <span style='color:#5a5;font-weight:600'>✓</span>`)\n\t\t\t\t} else {\n\t\t\t\t\tuseTd\n\t\t\t\t\t\t.append('button')\n\t\t\t\t\t\t.style('min-width', '80px')\n\t\t\t\t\t\t.html('Use')\n\t\t\t\t\t\t.on('click', () => {\n\t\t\t\t\t\t\tif (q.reuseId === 'Default') {\n\t\t\t\t\t\t\t\tdelete q.reuseId\n\t\t\t\t\t\t\t\tdelete q.name\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tself.q = q\n\t\t\t\t\t\t\tself.dom.tip.hide()\n\t\t\t\t\t\t\tself.runCallback!()\n\t\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tconst deleteTd = tr.append('td').style('text-align', 'center')\n\t\t\t\tif (!inuse && q.reuseId != 'Default') {\n\t\t\t\t\tdeleteTd\n\t\t\t\t\t\t.append('button')\n\t\t\t\t\t\t.style('min-width', '80px')\n\t\t\t\t\t\t.html('Delete')\n\t\t\t\t\t\t.on('click', async () => {\n\t\t\t\t\t\t\tawait self.vocabApi.uncacheTermQ(self.term!, q)\n\t\t\t\t\t\t\tself.dom.tip.hide()\n\t\t\t\t\t\t\tself.runCallback!()\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\n\t\t_div\n\t\t\t.append('div')\n\t\t\t.style('margin', '20px 5px 5px 5px')\n\t\t\t.style('padding', '5px')\n\t\t\t.style('font-size', '0.8em')\n\t\t\t.style('color', '#aaa')\n\t\t\t.html(\n\t\t\t\t`Saving the setting will allow it to be reused at another chart.<br/>` +\n\t\t\t\t\t`The setting will be reusable in your current or saved session.`\n\t\t\t)\n\t}\n\n\tself.showGeneSearch = function (clickedElem: Element | null, event: MouseEvent) {\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\ttry {\n\t\t\t\t\tconst results = !str\n\t\t\t\t\t\t? { lst: [] }\n\t\t\t\t\t\t: await self.vocabApi.findTerm(str, self.activeCohort!, self.usecase!, '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', (gene: any) => {\n\t\t\t\t\t\t\tself.dom.tip.hide()\n\t\t\t\t\t\t\tself.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})\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\n// do not consider irrelevant q attributes when\n// computing the deep equality of two term.q's\nfunction 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)\n}\n\nfunction getDefaultHandler(self): Handler {\n\treturn {\n\t\tshowEditMenu() {\n\t\t\t//ignore\n\t\t},\n\t\tgetPillStatus() {\n\t\t\t//ignore\n\t\t},\n\t\tgetPillName(d: PillData) {\n\t\t\treturn getPillNameDefault(self, d)\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?: CategoricalQ\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>[] = []\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\nconst routedTermTypes = new Set(['categorical', 'integer', 'float', 'geneVariant'])\n\nasync function mayUseTwRouterFill(\n\ttw: TermWrapper,\n\tvocabApi: VocabApi,\n\tdefaultQByTsHandler?: DefaultQByTsHandler\n): Promise<TermWrapper | false> {\n\tif (!routedTermTypes.has(tw.term?.type)) return false\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\tconst fullTw = await TwRouter.fill(tw, { vocabApi, defaultQByTsHandler })\n\tObject.assign(tw, fullTw)\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\treturn tw\n}\n\nexport async function fillTermWrapper(\n\ttw: TermWrapper,\n\tvocabApi: VocabApi,\n\tdefaultQByTsHandler?: DefaultQByTsHandler\n): Promise<TermWrapper> {\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\tif (await mayUseTwRouterFill(tw, vocabApi, defaultQByTsHandler)) return tw\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\nasync 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\nexport function set_hiddenvalues(q: Q, 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", "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 { ClientCopyGenome } from '../types/global'\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: ClientCopyGenome[]): 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) {\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\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*/\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) {\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.append('td').style('padding', '3px').style('color', '#555')\n\t\t\tconst td2 = tr.append('td')\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.opts.contentHolder && !self.opts.noContent) {\n\t\t\tself.dom.contentHolder = self.dom.holder.append('div')\n\t\t} else self.dom.contentHolder = self.opts.contentHolder\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", "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'\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\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)\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]\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\n\t\t}\n\t\treturn terms\n\t}\n\n\tbindKey(term) {\n\t\treturn term.id\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\tif (!(term.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\tif (term.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\tif (!(term.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 isSelected = self.state.selectedTerms.find(t => t.id === term.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 isSelected = self.state.selectedTerms.find(t => t.id === term.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]\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 i = self.state.selectedTerms.findIndex(t => t.id === term.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 * as rx from '#rx'\nimport { root_ID } from './tree'\nimport { filterJoin, getFilterItemByTag, findItem, findParent } from '#filter'\nimport { isUsableTerm } from '#shared/termdb.usecase.js'\nimport { TermTypeGroups } from '#shared/terms.js'\n\n// state definition: https://docs.google.com/document/d/1gTPKS9aDoYi4h_KlMBXgrMxZeA_P4GXhWcQdNQs3Yp8/edit#\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 {\n\tconstructor(opts) {\n\t\tthis.type = 'store'\n\t\tthis.defaultState = defaultState\n\t\t// set this.app, .opts, .api, expected store methods,\n\t\t// and the initial non-rehydrated state with overrides\n\t\trx.prepStore(this, opts)\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}\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)\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\tfromJson(str) {\n\t\tconst obj = JSON.parse(str)\n\t\treturn obj\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(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 : {}, this.replaceKeyVals)\n\t},\n\tcohort_set(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(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(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(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(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({ value }) {\n\t\tthis.state.termTypeGroup = value\n\t}\n}\n\n// must use the await keyword when using this storeInit()\nexport const storeInit = rx.getInitFxn(TdbStore)\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\tmayGetAuthHeaders(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) || 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 = 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\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} 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 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", "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", "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 = 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) {\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}\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) {\n\t\tconst [route, body] = this.getTdbDataUrl(opts)\n\t\tconst headers = this.mayGetAuthHeaders('termdb')\n\t\tconst data = await dofetch3(route, { headers, body }, 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.mayFillInValues(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.values and term.samplecounts with\n\t// categories computed from the data\n\tmayFillInValues(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 clst = categories[i]\n\t\t\tif (!clst?.length) continue\n\t\t\tconst term = tw.term\n\t\t\tterm.values = {}\n\t\t\tterm.samplecounts = []\n\t\t\tfor (const c of clst) {\n\t\t\t\tterm.values[c.key] = { label: c.label }\n\t\t\t\tterm.samplecounts.push({ key: c.key, label: c.label, samplecount: c.samplecount })\n\t\t\t}\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: 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\treturn data.count\n\t}\n\n\t/*\n Inputs:\n\n arg{}\n .tw main term to create violin/boxplot with\n .divideTw={}\n optional termwrapper of 2nd term to divide cohort\n if given, will result in multiple plots, and pvalue computed for each pair of plots\n if missing, will result in one plot\n .filter={}\n optional\n .svgw=int\n required\n .axisHeight=80\n .rightMargin=50\n\n additionalArgs{}\n optional bag of key:value pairs\n\t\n Output: {}\n min:num\n max:num\n pvalues[] array of pvalues, empty if just one plot\n plots[ {} ]\n plotValueCount:int\n total number of samples plotted\n median:num\n label:str\n biggestBin: int\n as the thickest point of the violin plot\n bins[]\n x0: number\n x1: number\n density: int\n */\n\tasync getViolinPlotData(arg, _body = {}) {\n\t\t// the violin plot may still render when not in session,\n\t\t// but not have an option to list samples\n\t\tconst headers = this.mayGetAuthHeaders('termdb')\n\t\targ.tw = this.getTwMinCopy(arg.tw)\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\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 || 3,\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\t// no need to do the same for filter0\n\t\tconst d = await dofetch3('termdb/violin', { headers, body })\n\n\t\treturn d\n\t}\n\n\tasync getBoxPlotData(arg, _body = {}) {\n\t\tconst headers = this.mayGetAuthHeaders('termdb')\n\t\targ.tw = this.getTwMinCopy(arg.tw)\n\t\tif (arg.overlayTw) arg.overlayTw = this.getTwMinCopy(arg.overlayTw)\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\t\tif (body.filter) body.filter = getNormalRoot(body.filter)\n\t\tconst d = await dofetch3('termdb/boxplot', { headers, body })\n\n\t\treturn d\n\t}\n\n\tasync getPercentile(term_id, 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 body = {\n\t\t\tgetpercentile: percentile_lst,\n\t\t\ttid: term_id,\n\t\t\tgenome: this.vocab.genome,\n\t\t\tdslabel: this.vocab.dslabel\n\t\t}\n\t\tif (filter) {\n\t\t\tbody.filter = getNormalRoot(filter)\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 = 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.samplecounts) {\n\t\t\t// grab directly from body and not server\n\t\t\treturn { lst: _body.samplecounts }\n\t\t}\n\n\t\tif (_body.skip_samplecounts) {\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\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\tasync getSamplesPerFilter(opts) {\n\t\treturn await dofetch3('termdb', {\n\t\t\tbody: {\n\t\t\t\tfor: 'getSamplesPerFilter',\n\t\t\t\tgenome: this.state.vocab.genome,\n\t\t\t\tdslabel: this.state.vocab.dslabel,\n\t\t\t\tfilters: opts.filters\n\t\t\t}\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 = 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 = opts.isHierCluster\n\t\t\t? null\n\t\t\t: opts.terms\n\t\t\t\t\t.filter(tw => tw.term.type === 'geneVariant')\n\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.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() // 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 // an AbortController.signal to trigger a fetch cancellation\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) samples[sampleId][tw.$id] = sample[tw.$id]\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) {\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 = 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: 'scatter',\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}\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\n\t\treturn await dofetch3('termdb', { headers, body })\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 = 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({ term, q }) {\n\t\t//TODO use the PresetNumericBins type for presetBins\n\t\tconst presetBins = await this.getDefaultBins({ tw: { 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 = 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\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 = 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 = 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 = 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 = 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 = 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 = 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 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\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 = 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\treturn await dofetch3('filterTermValues', { method: 'GET', 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\treturn await dofetch3('profileScores', { method: 'GET', 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\treturn await dofetch3('profileFormScores', { method: 'GET', 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 { roundValue } from '#shared/roundValue.js'\nimport { isNumeric } from '#shared/helpers.js'\nimport computePercentile from '#shared/compute.percentile.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_id, 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\t// compute percentiles\n\t\t// source: https://www.dummies.com/article/academics-the-arts/math/statistics/how-to-calculate-percentiles-in-statistics-169783/\n\t\tvalues.sort((a, b) => a - b)\n\t\tfor (const percentile of percentile_lst) {\n\t\t\tconst index = Math.abs((percentile / 100) * values.length - 1)\n\t\t\tconst perc_value = Number.isInteger(index) ? (values[index] + values[index + 1]) / 2 : values[Math.ceil(index)]\n\t\t\tperc_values.push(perc_value)\n\t\t}\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\tvalues.sort((a, b) => a - b)\n\n\t\t// compute statistics\n\t\t// total\n\t\tconst total = values.length\n\n\t\t// mean\n\t\tconst sum = values.reduce((a, b) => a + b, 0)\n\t\tconst mean = sum / total\n\n\t\t// percentiles\n\t\tconst p25 = computePercentile(values, 25)\n\t\tconst median = computePercentile(values, 50)\n\t\tconst p75 = computePercentile(values, 75)\n\n\t\t// standard deviation\n\t\t// get sum of squared differences from mean\n\t\tconst sumSqDiff = values.map(v => (v - mean) ** 2).reduce((a, b) => a + b, 0)\n\t\t// get variance\n\t\tconst variance = sumSqDiff / (values.length - 1)\n\t\t// get standard deviation\n\t\tconst sd = Math.sqrt(variance)\n\n\t\t// min/max\n\t\tconst min = Math.min(...values)\n\t\tconst max = Math.max(...values)\n\n\t\treturn {\n\t\t\tvalues: [\n\t\t\t\t{ id: 'total', label: 'n', value: total },\n\t\t\t\t{ id: 'min', label: 'Minimum', value: roundValue(min, 2) },\n\t\t\t\t{ id: 'p25', label: '1st quartile', value: roundValue(p25, 2) },\n\t\t\t\t{ id: 'median', label: 'Median', value: roundValue(median, 2) },\n\t\t\t\t{ id: 'mean', label: 'Mean', value: roundValue(mean, 2) },\n\t\t\t\t{ id: 'p75', label: '3rd quartile', value: roundValue(p75, 2) },\n\t\t\t\t{ id: 'max', label: 'Maximum', value: roundValue(max, 2) },\n\t\t\t\t{ id: 'sd', label: 'Standard deviation', value: roundValue(sd, 2) }\n\t\t\t]\n\t\t}\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", "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}\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 { Tabs } from '../dom/toggleButtons'\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],\n\tdictionary: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST],\n\tsummary: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST],\n\tbarchart: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST],\n\tviolin: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST],\n\tsampleScatter: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST],\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],\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], //Later on can support other term types like snplocus, snplst, geneVariant, non dictionary terms\n\tsurvival: [TermTypeGroups.SNP_LOCUS, TermTypeGroups.SNP_LIST],\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],\n\tregression: [TermTypeGroups.SNP_LIST, TermTypeGroups.SNP_LOCUS],\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],\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],\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]\n}\n\nexport class TermTypeSearch {\n\tdom: any\n\ttypes: Array<string>\n\tapp: any\n\ttype: string\n\ttabs: Array<Dict>\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\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 [i] of this.tabs.entries()) {\n\t\t\tconst holder = this.tabs[i].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.insert('div').style('display', 'inline-block').html(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}\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\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\tthis.app.dispatch({\n\t\t\t\ttype: 'app_refresh',\n\t\t\t\tstate: {\n\t\t\t\t\tselectedTerms: [...this.state.selectedTerms, term]\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: { term, type: 'tvs' }\n\t\t\t})\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/sayerror.ts'\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\tisGeneSetTermdb: appState.termdbConfig.isGeneSetTermdb,\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('placeholder', 'Search ' + this.state.termTypeGroup)\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 for genes and dictionary term hits\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\tconst 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\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\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.getPrompt = state => {\n\t\t/* term search prompt is decided by two factors:\n\t\tTODO geneVariant is no longer supported here\n\t\t1. if the term type exists in allowedTermTypes from the dataset\n\t\t e.g. if geneVariant type does not exist in the dataset, do not show prompt (and no need to check usecase)\n\t\t2. termdb client app usecase, defines the context for using terms selected from the termdb app\n\t\t e.g. if the usecase context does not allow geneVariant, even if geneVariant exists in ds, do not show \"gene\" in prompt\n\t\t*/\n\t\tconst mayUseGeneVariant =\n\t\t\tstate.allowedTermTypes.includes('geneVariant') && isUsableTerm({ type: 'geneVariant' }, state.usecase).has('plot')\n\n\t\tif (mayUseGeneVariant) return ' variables or genes' // if true, it should be \"variables\" but not gene set\n\t\tif (state.isGeneSetTermdb) return ' gene sets'\n\t\treturn ' variables'\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\n\t\t\t.append('div')\n\t\t\t.style('padding', '3px 3px 3px 0px')\n\t\t\t.style('opacity', 0.5)\n\t\t\t.text(\n\t\t\t\t'No match' + (self.app.vocabApi.termdbConfig?.queries?.snvindel?.allowSNPs ? '. Press ENTER to search SNP' : '')\n\t\t\t)\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\tconst geneTerms = [],\n\t\t\tdictTerms = []\n\t\tfor (const t of data.lst) {\n\t\t\tif (t.type == 'geneVariant') {\n\t\t\t\tgeneTerms.push(t)\n\t\t\t} else {\n\t\t\t\tdictTerms.push(t)\n\t\t\t}\n\t\t}\n\n\t\tif (geneTerms.length) {\n\t\t\tself.dom.resultDiv_genes.append('table').selectAll().data(geneTerms).enter().append('tr').each(self.showTerm)\n\t\t}\n\n\t\tif (dictTerms.length) {\n\t\t\tself.dom.resultDiv_terms.append('table').selectAll().data(dictTerms).enter().append('tr').each(self.showTerm)\n\t\t}\n\n\t\tif (data.lst.length > 1) self.dom.resultCntDiv.style('display', 'inline-block').text(`${data.lst.length} results`)\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', term.type == 'geneVariant' ? 'rgba(251,171,96,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', () => {\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 == 'geneVariant' && self.opts.handleGeneVariant) {\n\t\t\t\t\t\tself.opts.handleGeneVariant(term)\n\t\t\t\t\t} else if (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.type == 'geneVariant' ? 'gene variant' : (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\tself.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 { getAppInit, multiInit } from '#rx'\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'\nimport { isUsableTerm } from '#shared/termdb.usecase.js'\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 {\n\tconstructor(opts) {\n\t\tthis.type = 'app'\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.text(this.noSelectionPrompt)\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\tthis.dom = {\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\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.termMatch2geneSet) {\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\treturn o\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\tawait this.setComponents()\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 setComponents() {\n\t\ttry {\n\t\t\tconst header_mode = this.state.nav?.header_mode\n\t\t\tconst compPromises = {\n\t\t\t\t/*\n\t\t\t \tTODO: may need to handle a cohort filter option as an OPTIONAL component \n\t\t\t filter: filterInit({\n\t\t\t\t\tapp: this.api,\n\t\t\t\t\tholder: this.dom.filterDiv\n\t\t\t }),\n\t\t\t\t***/\n\t\t\t\tsearch: searchInit({\n\t\t\t\t\tapp: this.api,\n\t\t\t\t\tholder: this.dom.searchDiv,\n\t\t\t\t\tisVisible: header_mode !== 'hide_search'\n\t\t\t\t}),\n\t\t\t\ttermTypeSearch: TermTypeSearchInit({\n\t\t\t\t\tapp: this.api,\n\t\t\t\t\tholder: this.dom.termTypeSearchDiv,\n\t\t\t\t\ttopbar: this.dom.topbar,\n\t\t\t\t\tgenome: this.opts.vocabApi?.app?.opts?.genome,\n\t\t\t\t\tclick_term: this.opts.tree?.click_term,\n\t\t\t\t\tsubmit_lst: this.opts.tree?.submit_lst,\n\t\t\t\t\tsubmitDiv: this.dom.submitDiv\n\t\t\t\t}),\n\t\t\t\ttree: treeInit({\n\t\t\t\t\tapp: this.api,\n\t\t\t\t\tholder: this.dom.treeDiv,\n\t\t\t\t\theaderDiv: this.dom.headerDiv,\n\t\t\t\t\texpandAll: header_mode == 'hide_search'\n\t\t\t\t})\n\t\t\t}\n\t\t\tif (this.opts.tree && this.opts.tree.click_term2select_tvs) {\n\t\t\t\tcompPromises.submenu = submenuInit({\n\t\t\t\t\tapp: this.api,\n\t\t\t\t\tholder: this.dom.holder.append('div').style('display', 'none')\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.components = await multiInit(compPromises)\n\t\t} catch (e) {\n\t\t\tthrow e\n\t\t}\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\tawait this.mayShowCustomTerms()\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\tasync mayShowCustomTerms() {\n\t\tif (Object.keys(this.state.submenu).length) return this.dom.customTermDiv.style('display', 'none') // do not display for submenu\n\n\t\t// only run once, upon initiating this tree ui\n\t\tconst tws = await this.api.vocabApi.getCustomTerms()\n\n\t\tif (!Array.isArray(tws) || tws.length == 0) return this.dom.customTermDiv.style('display', 'none')\n\n\t\t// filter for display terms with usecase\n\t\tconst useTerms = []\n\t\tfor (const tw of tws) {\n\t\t\tconst uses = isUsableTerm(tw.term, this.state.tree.usecase, this.state.termdbConfig)\n\t\t\tif (uses.has('plot')) useTerms.push(tw)\n\t\t}\n\t\tif (useTerms.length == 0) return this.dom.customTermDiv.style('display', 'none')\n\n\t\t// has usable terms to display\n\t\tthis.dom.customTermDiv.selectAll('*').remove()\n\t\tthis.dom.customTermDiv.append('div').text('CUSTOM VARIABLES').style('font-size', '.7em')\n\t\tfor (const tw of useTerms) {\n\t\t\tthis.dom.customTermDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('margin-bottom', '3px')\n\t\t\t\t.append('div')\n\t\t\t\t.text(tw.term.name)\n\t\t\t\t.attr('class', 'sja_filter_tag_btn')\n\t\t\t\t.style('padding', '3px 6px')\n\t\t\t\t.style('border-radius', '6px')\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tif (!this.opts.tree) return // click callbacks are all under tree{}\n\t\t\t\t\tif (this.opts.tree.click_term) {\n\t\t\t\t\t\tthis.opts.tree.click_term(tw)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (this.opts.tree.click_term2select_tvs) {\n\t\t\t\t\t\tthis.api.dispatch({\n\t\t\t\t\t\t\ttype: 'submenu_set',\n\t\t\t\t\t\t\tsubmenu: { term: tw.term, type: 'tvs' }\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t}\n\t}\n}\n\n// must use the await keyword when using this appInit()\nexport const appInit = getAppInit(TdbApp)\n\nfunction setInteractivity(self) {\n\t// set optional event handlers\n}\n", "import { getCompInit } from '#rx'\nimport { Menu } from '#dom'\nimport { getNormalRoot } from '#filter/filter'\nimport { NumericModes, TermTypes } from '#shared/terms.js'\nimport { GeneSetEditUI } from '../dom/GeneSetEdit/GeneSetEditUI.ts' // cannot use '#dom/', breaks\n\nclass MassCharts {\n\tconstructor(opts = {}) {\n\t\tthis.type = 'charts'\n\t\tsetRenderers(this)\n\t}\n\n\tasync init(appState) {\n\t\tthis.dom = {\n\t\t\tholder: this.opts.holder,\n\t\t\ttip: new Menu({ padding: '0px' }),\n\t\t\ttooltip: new Menu({ padding: '4px' })\n\t\t}\n\n\t\tthis.makeButtons(appState)\n\t}\n\n\t// TODO later add reactsTo() to react to filter change\n\n\tgetState(appState) {\n\t\tconst state = {\n\t\t\tvocab: appState.vocab, // TODO delete it as vocabApi should be used instead\n\t\t\tactiveCohort: appState.activeCohort,\n\t\t\ttermfilter: appState.termfilter,\n\t\t\tcurrentCohortChartTypes: getCurrentCohortChartTypes(appState),\n\t\t\ttermdbConfig: appState.termdbConfig\n\t\t}\n\t\tif (appState?.termfilter?.filter) {\n\t\t\tstate.filter = getNormalRoot(appState.termfilter.filter)\n\t\t}\n\t\treturn state\n\t}\n\n\tmain() {\n\t\t//this.dom.holder.style('display', 'block')\n\t\tthis.dom.btns.style('display', d => (this.state.currentCohortChartTypes.includes(d.chartType) ? '' : 'none'))\n\t}\n\n\tgetRegressionBtnLabel(state) {\n\t\t/* define button label based conditions:\n\t\tif ds allows multiple regression methods, use generic name, click btn will display menu of options\n\t\tif ds allows just one method, directly show method name on button, click btn will show sandbox\n\t\t*/\n\t\tconst lst = getCurrentCohortChartTypes(state)\n\t\tif (!lst.includes('regression')) return '' // plot not supported. label doesn't matter as button will be hidden\n\t\tconst ms = []\n\t\tif (lst.includes('linear')) ms.push('linear')\n\t\tif (lst.includes('logistic')) ms.push('logistic')\n\t\tif (lst.includes('cox')) ms.push('cox')\n\t\tif (ms.length > 1) return 'Regression Analysis' // more than 1 methods. return general name\n\t\t// only 1 method\n\t\treturn `${ms[0] == 'linear' ? 'Linear' : ms[0] == 'cox' ? 'Cox' : 'Logistic'} Regression`\n\t}\n\tgetSamplescatterBtnLabel(state) {\n\t\t// define button label\n\t\tconst lst = getCurrentCohortChartTypes(state)\n\t\tif (state.termdbConfig.scatterplots?.length == 1 && !lst.includes('dynamicScatter')) {\n\t\t\t// has 1 premade plot and no dynamic scatter. just show premade plot name as button name\n\t\t\treturn state.termdbConfig.scatterplots[0].name\n\t\t}\n\t\t// either has >1 premade plots or dynamic scatter. show generic name\n\t\treturn 'Sample Scatter'\n\t}\n}\n\nexport const chartsInit = getCompInit(MassCharts)\n\nexport function getActiveCohortStr(appState) {\n\tif (appState?.termdbConfig?.selectCohort?.values) {\n\t\t// dataset allows subcohort selection\n\t\tif (!Number.isInteger(appState.activeCohort)) throw 'appState.activeCohort is not integer array index'\n\t\tconst activeCohortObject = appState.termdbConfig.selectCohort.values[appState.activeCohort]\n\t\tif (!activeCohortObject) throw 'appState.activeCohort array index out of bound'\n\t\t// get a valid cohort obj\n\t\treturn [...activeCohortObject.keys].sort().join(',')\n\t}\n\t// if not, is undefined\n\treturn ''\n}\n\nexport function getCurrentCohortChartTypes(appState) {\n\tconst activeCohortStr = getActiveCohortStr(appState)\n\tconst chartTypesByCohort = structuredClone(appState.termdbConfig?.supportedChartTypes || {})\n\t// {}, key is cohortstr, value is list of supported chart types under this cohort\n\treturn chartTypesByCohort[activeCohortStr] || ['summary']\n}\n\nfunction getChartTypeList(self, state) {\n\t/* returns a list all possible chart types supported in mass\n\teach char type will generate a button under the nav bar\n\ta dataset can support a subset of these charts\n\n\tallow some chart button objects to be dynamically generated based on state\n\n\tdesign goal is that chart specific logic should not leak into mass UI\n\n\tdesign idea is that a button click will trigger a callback to do one of following things\n\tin which chart-type specific logic is not included\n\n\t1. show dictionary tree\n\t\tby calling showTree_select1term() or showTree_selectlst()\n\t2. prep chart\n\t\tby calling prepPlot()\n\t3. display chart-specific menu by importing from ../plots/<chartType>.js\n\t\tand call the imported function loadChartSpecificMenu()\n\n\t.label:\n\t\ttext to show in the button\n\n\t.chartType:\n\t\tvalues are controlled\n\t\tmust include for deciding if to display a chart button for a dataset\n\t\te.g. cumulative incidence plot will require \"condition\" term to be present in a dataset\n\t\tsee main()\n\n\t.clickTo:\n\t\tcallback to handle the button click event, may use any of the following renderer methods:\n\t\n\t\tself.tree_select1term \n\t\t- will show a term tree to select a term\t\n\n\t\tself.prepPlot\n\t\t- dispatch \"plot_prep\" action to produce a 'initiating' UI of this plot, for user to fill in additional details to launch the plot\n\t\t\texample: regression, table, scatterplot which requires user to select two terms\n\t\t\n\t.usecase:{}\n\t\trequired for clickTo=tree_select1term\n\t\tprovide to termdb app\n\n\t.config:{}\n\t\trequired for clickTo=prepPlot\n\t\tdescribe private details for creating a chart of a particular type\n\t\tto be attached to action and used by store\n\n\t.updateActionBySelectedTerms:\n\t\toptional callback. used for geneExpression and metabolicIntensity \"intermediary\" chart types which do not correspond to actual chart, but will route to an actual chart (summary/scatter/hierclust) based on number of selected terms. this callback will update the action based on selected terms to do the routing\n\n\tTODO order of buttons is hardcoded, may allow to customize order\n\t*/\n\n\tconst buttons = [\n\t\t////////////////////// PROFILE PLOTS START //////////////////////\n\t\t{\n\t\t\tlabel: 'Polar',\n\t\t\tchartType: 'profilePolar',\n\t\t\tclickTo: self.prepPlot,\n\t\t\tconfig: { chartType: 'profilePolar' }\n\t\t},\n\t\t{\n\t\t\tlabel: 'Barchart',\n\t\t\tclickTo: self.prepPlot,\n\t\t\tchartType: 'profileBarchart',\n\t\t\tconfig: { chartType: 'profileBarchart' }\n\t\t},\n\t\t{\n\t\t\tlabel: 'Facility Radar',\n\t\t\tchartType: 'profileRadarFacility',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\t\t{\n\t\t\tlabel: 'Radar',\n\t\t\tchartType: 'profileRadar',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\t\t{\n\t\t\tlabel: 'Templates',\n\t\t\tchartType: 'profileForms',\n\t\t\tclickTo: self.showTree_select1term,\n\t\t\tusecase: { target: 'profileForms', detail: 'tw' },\n\t\t\tconfig: { chartType: 'profileForms' }\n\t\t},\n\t\t////////////////////// PROFILE PLOTS END //////////////////////\n\t\t{\n\t\t\tlabel: 'Data Dictionary',\n\t\t\tclickTo: self.prepPlot,\n\t\t\tchartType: 'dictionary',\n\t\t\tconfig: {\n\t\t\t\tchartType: 'dictionary'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tlabel: 'Report',\n\t\t\tchartType: 'report',\n\n\t\t\tclickTo: self.plotCreate, //when using prepPlot this error was raised: No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this). TOD0: check with Edgar\n\t\t\tconfig: { chartType: 'report' }\n\t\t},\n\t\t{\n\t\t\tlabel: 'Sample View',\n\t\t\tclickTo: self.prepPlot,\n\t\t\tchartType: 'sampleView',\n\t\t\tconfig: {\n\t\t\t\tchartType: 'sampleView'\n\t\t\t}\n\t\t},\n\n\t\t{\n\t\t\tlabel: 'Summary Plots',\n\t\t\tchartType: 'summary',\n\t\t\tclickTo: self.showTree_select1term,\n\t\t\tusecase: { target: 'summary', detail: 'term' }\n\t\t},\n\t\t{\n\t\t\tlabel: self.getSamplescatterBtnLabel(state),\n\t\t\tchartType: 'sampleScatter',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\t\t{\n\t\t\tlabel: 'Run Chart',\n\t\t\tchartType: 'runChart',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\t\t{\n\t\t\tlabel: 'Frecuency Chart',\n\t\t\tchartType: 'frequencyChart',\n\t\t\tclickTo: self.showTree_select1term,\n\t\t\tusecase: { target: 'frequencyChart', detail: 'term' }\n\t\t},\n\n\t\t{\n\t\t\tlabel: 'Cumulative Incidence',\n\t\t\tchartType: 'cuminc',\n\t\t\tclickTo: self.showTree_select1term,\n\t\t\tusecase: { target: 'cuminc', detail: 'term' }\n\t\t},\n\t\t{\n\t\t\tlabel: 'Survival',\n\t\t\tchartType: 'survival',\n\t\t\tclickTo: self.showTree_select1term,\n\t\t\tusecase: { target: 'survival', detail: 'term' }\n\t\t},\n\n\t\t{\n\t\t\tlabel: self.getRegressionBtnLabel(state),\n\t\t\tchartType: 'regression',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\n\t\t{\n\t\t\tlabel: 'Sample Matrix',\n\t\t\tchartType: 'matrix',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\t\t{\n\t\t\tlabel: 'Genome Browser',\n\t\t\tchartType: 'genomeBrowser',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\n\t\t// Commenting out this button since DE does not work without specifying two groups\n\t\t//{\n\t\t//\tlabel: 'Differential Expression',\n\t\t//\tchartType: 'DEanalysis',\n\t\t//\tclickTo: self.loadChartSpecificMenu\n\t\t//},\n\n\t\t{\n\t\t\tlabel: 'Data Download',\n\t\t\tclickTo: self.prepPlot,\n\t\t\tchartType: 'dataDownload',\n\t\t\tconfig: {\n\t\t\t\tchartType: 'dataDownload',\n\t\t\t\tterms: []\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tlabel: 'Facet Table',\n\t\t\tclickTo: self.loadChartSpecificMenu,\n\t\t\tchartType: 'facet',\n\t\t\tconfig: {\n\t\t\t\tchartType: 'facet'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tlabel: 'Brain Imaging',\n\t\t\tclickTo: self.loadChartSpecificMenu,\n\t\t\tchartType: 'brainImaging',\n\t\t\tconfig: {\n\t\t\t\tchartType: 'brainImaging'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tlabel: 'Single Cell Plot',\n\t\t\tclickTo: self.prepPlot,\n\t\t\tchartType: 'singleCellPlot',\n\t\t\tconfig: {\n\t\t\t\tchartType: 'singleCellPlot'\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t//This chart may be later on extended to support other gene expression data types\n\t\t\tlabel: 'Gene Expression',\n\t\t\tchartType: 'geneExpression',\n\t\t\tclickTo: self.showGenesetEditUI,\n\t\t\tusecase: { target: 'geneExpression' }\n\t\t},\n\t\t{\n\t\t\tlabel: 'Metabolite Intensity',\n\t\t\tchartType: 'metaboliteIntensity', // TODO change to metaboliteIntensity\n\t\t\tclickTo: self.showTree_selectlst,\n\t\t\tusecase: { target: 'metaboliteIntensity', detail: 'term' },\n\t\t\tupdateActionBySelectedTerms: (action, termlst) => {\n\t\t\t\tconst twlst = termlst.map(term => ({\n\t\t\t\t\tterm: structuredClone(term),\n\t\t\t\t\tq: { mode: NumericModes.continuous }\n\t\t\t\t}))\n\t\t\t\tif (twlst.length == 1) {\n\t\t\t\t\t// violin\n\t\t\t\t\taction.config.chartType = 'summary'\n\t\t\t\t\taction.config.term = twlst[0]\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (twlst.length == 2) {\n\t\t\t\t\t// scatter\n\t\t\t\t\taction.config.chartType = 'summary'\n\t\t\t\t\taction.config.term = twlst[0]\n\t\t\t\t\taction.config.term2 = twlst[1]\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// 3 or more terms, launch clustering\n\t\t\t\taction.config.chartType = 'hierCluster'\n\t\t\t\taction.config.dataType = TermTypes.METABOLITE_INTENSITY\n\t\t\t\taction.config.termgroups = [{ name: 'Metabolite Intensity Cluster', lst: twlst, type: 'hierCluster' }]\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t//use the app name defined in dataset file\n\t\t\tlabel: state.termdbConfig.numericDictTermCluster?.appName || 'Numeric Dictionary Term cluster',\n\t\t\tchartType: 'numericDictTermCluster',\n\t\t\tclickTo: self.loadChartSpecificMenu\n\t\t},\n\t\t{\n\t\t\tlabel: 'Correlation Volcano',\n\t\t\tchartType: 'correlationVolcano',\n\t\t\tusecase: { target: 'correlationVolcano', detail: 'numeric' },\n\t\t\tclickTo: self.showTree_select1term\n\t\t}\n\t]\n\n\tfor (const field in state?.termdbConfig.renamedChartTypes || []) {\n\t\tconst btn = buttons.find(b => b.chartType === field)\n\t\tif (btn) {\n\t\t\tbtn.label = state.termdbConfig.renamedChartTypes[field]\n\t\t}\n\t}\n\treturn buttons\n}\n\nfunction setRenderers(self) {\n\tself.makeButtons = function (state) {\n\t\tconst chartTypeList = getChartTypeList(self, state)\n\t\tself.dom.btns = self.dom.holder\n\t\t\t.selectAll('button')\n\t\t\t.data(chartTypeList)\n\t\t\t.enter()\n\t\t\t.append('button')\n\t\t\t.style('margin', '10px')\n\t\t\t.style('padding', '10px 15px')\n\t\t\t.style('border-radius', '20px')\n\t\t\t.style('border-color', '#ededed')\n\t\t\t.html(d => d.label)\n\t\t\t.on('click', function (event, chart) {\n\t\t\t\tself.dom.tip.clear().showunder(this)\n\t\t\t\tchart.clickTo(chart)\n\t\t\t})\n\t\t\t.on('mouseover', (e, d) => {\n\t\t\t\tif (d.tooltip) self.dom.tooltip.clear().showunder(e.target).d.text(d.tooltip)\n\t\t\t})\n\t\t\t.on('mouseleave', (e, d) => {\n\t\t\t\tif (d.tooltip) self.dom.tooltip.hide()\n\t\t\t})\n\t}\n\n\t/*\t\n\t\tshow termdb tree to select a term\n\t\tonce selected, dispatch \"plot_create\" action (with the selected term) to produce the plot\n\t\texample: summary\n\t*/\n\tself.showTree_select1term = async chart => {\n\t\tif (chart.usecase.label) {\n\t\t\tself.dom.tip.d\n\t\t\t\t.append('div')\n\t\t\t\t.style('margin', '3px 5px')\n\t\t\t\t.style('padding', '3px 5px')\n\t\t\t\t.style('font-weight', 600)\n\t\t\t\t.html(chart.usecase.label)\n\t\t}\n\n\t\tconst action = {\n\t\t\ttype: 'plot_create',\n\t\t\tid: getId(),\n\t\t\tconfig: { chartType: chart.chartType, activeCohort: self.state.activeCohort }\n\t\t}\n\n\t\tif (chart.parentId) action.parentId = chart.parentId\n\n\t\tconst termdb = await import('../termdb/app')\n\t\ttermdb.appInit({\n\t\t\tvocabApi: self.app.vocabApi,\n\t\t\tholder: self.dom.tip.d.append('div'),\n\t\t\tstate: {\n\t\t\t\tactiveCohort: self.state.activeCohort,\n\t\t\t\tnav: {\n\t\t\t\t\theader_mode: 'search_only'\n\t\t\t\t},\n\t\t\t\ttree: { usecase: chart.usecase }\n\t\t\t},\n\t\t\ttree: {\n\t\t\t\tclick_term: term => {\n\t\t\t\t\t// summary/survival/cuminc all expect config.term{} to be a termsetting object, but not term (which is confusing)\n\t\t\t\t\t// thus convert term into a termwrapper (termsetting obj)\n\t\t\t\t\t// tw.q{} is missing and will be fill in with default settings\n\t\t\t\t\tconst tw = term.term ? term : { term }\n\t\t\t\t\taction.config[chart.usecase.detail] = tw\n\t\t\t\t\tself.dom.tip.hide()\n\t\t\t\t\tself.app.dispatch(action)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tself.showGenesetEditUI = async chart => {\n\t\tconst geneList = []\n\t\tconst app = self.app\n\t\tconst tip = self.dom.tip\n\t\tconst holder = self.dom.tip.d\n\t\tholder.selectAll('*').remove()\n\t\tconst div = holder.append('div').style('padding', '5px')\n\t\tconst label = div.append('label')\n\t\tlabel.append('span').text('Create ')\n\t\tlet name\n\t\tconst nameInput = label\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\tname = nameInput.property('value')\n\t\t\t})\n\t\tconst selectedGroup = {\n\t\t\tindex: 0,\n\t\t\tname,\n\t\t\tlabel: name,\n\t\t\tlst: [],\n\t\t\tstatus: 'new'\n\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 is the group used for clustering\n\t\tpass this mode value to inform ui to support the optional button \"top variably exp gene\"\n\t\tthis is hardcoded for the purpose of gene expression and should be improved\n\t\t*/\n\t\t\tgenome: app.opts.genome,\n\t\t\tgeneList,\n\t\t\tmode: 'geneExpression',\n\t\t\tvocabApi: app.vocabApi,\n\t\t\tcallback: async ({ geneList, groupName }) => {\n\t\t\t\tif (!selectedGroup) throw `missing selectedGroup`\n\t\t\t\ttip.hide()\n\t\t\t\tconst group = { name: groupName || name, lst: [], type: 'hierCluster' }\n\t\t\t\tconst lst = group.lst.filter(tw => tw.term.type != 'geneVariant')\n\t\t\t\tconst tws = await Promise.all(\n\t\t\t\t\tgeneList.map(async d => {\n\t\t\t\t\t\tconst term = {\n\t\t\t\t\t\t\tgene: d.symbol || d.gene,\n\t\t\t\t\t\t\tname: d.symbol || d.gene,\n\t\t\t\t\t\t\ttype: 'geneExpression'\n\t\t\t\t\t\t}\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\tlet tw = group.lst.find(tw => tw.term.name == d.symbol || tw.term.name == d.gene)\n\t\t\t\t\t\tif (!tw) {\n\t\t\t\t\t\t\ttw = { term, q: {} }\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn tw\n\t\t\t\t\t})\n\t\t\t\t)\n\n\t\t\t\tif (tws.length == 1) {\n\t\t\t\t\tconst tw = tws[0]\n\t\t\t\t\tapp.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tchartType: 'summary',\n\t\t\t\t\t\t\tterm: tw\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tif (tws.length == 2) {\n\t\t\t\t\tconst tw = tws[0]\n\t\t\t\t\tconst tw2 = tws[1]\n\t\t\t\t\tapp.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tchartType: 'summary',\n\t\t\t\t\t\t\tterm: tw,\n\t\t\t\t\t\t\tterm2: tw2\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tgroup.lst = [...lst, ...tws]\n\t\t\t\tif (!group.lst.length) tg.splice(selectedGroup.index, 1)\n\n\t\t\t\t// close geneset edit ui after clicking submit\n\t\t\t\tholder.selectAll('*').remove()\n\n\t\t\t\tapp.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\tself.showTree_selectlst = async chart => {\n\t\tif (chart.usecase?.label) {\n\t\t\tself.dom.tip.d\n\t\t\t\t.append('div')\n\t\t\t\t.style('margin', '3px 5px')\n\t\t\t\t.style('padding', '3px 5px')\n\t\t\t\t.style('font-weight', 600)\n\t\t\t\t.html(chart.usecase.label)\n\t\t}\n\n\t\tconst action = {\n\t\t\ttype: 'plot_create',\n\t\t\tid: getId(),\n\t\t\tconfig: { chartType: chart.chartType } // NOTE if chartType is intermediary, action will be updated on term selection\n\t\t}\n\t\tconst termdb = await import('../termdb/app')\n\t\tself.dom.submenu = self.dom.tip.d.append('div')\n\t\ttermdb.appInit({\n\t\t\tholder: self.dom.submenu,\n\t\t\tvocabApi: self.app.vocabApi,\n\t\t\tstate: {\n\t\t\t\tactiveCohort: self.state.activeCohort,\n\t\t\t\tnav: {\n\t\t\t\t\theader_mode: 'search_only'\n\t\t\t\t},\n\t\t\t\ttree: { usecase: chart.usecase }\n\t\t\t},\n\t\t\ttree: {\n\t\t\t\tsubmit_lst: termlst => {\n\t\t\t\t\tconst data = chart.processSelection ? chart.processSelection(termlst) : termlst\n\t\t\t\t\taction.config[chart.usecase.detail] = data\n\t\t\t\t\tif (chart.updateActionBySelectedTerms) chart.updateActionBySelectedTerms(action, termlst)\n\t\t\t\t\tself.dom.tip.hide()\n\t\t\t\t\tself.app.dispatch(action)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tself.loadChartSpecificMenu = async chart => {\n\t\tself.dom.tip.clear()\n\t\tconst _ = await import(`../plots/${chart.chartType}.js`)\n\t\t_.makeChartBtnMenu(self.dom.tip.d, self, chart.chartType)\n\t}\n\n\t/*\n\t\tdispatch \"plot_prep\" action to produce a 'initiating' UI of this plot, for user to fill in additional details to launch the plot\n\t\texample: table, scatterplot which requires user to select two terms\n\t*/\n\tself.prepPlot = function (chart) {\n\t\tconst action = { type: 'plot_prep', config: chart.config, id: getId() }\n\t\tself.app.dispatch(action)\n\t}\n\n\tself.plotCreate = function (chart) {\n\t\tconst action = { type: 'plot_create', config: chart.config, id: getId() }\n\t\tself.app.dispatch(action)\n\t}\n}\n\n// to assign chart ID to distinguish between chart instances\nconst idPrefix = '_CHART_AUTOID_' // to distinguish from user-assigned chart IDs\nlet id = Date.now()\n\nfunction getId() {\n\treturn idPrefix + id++\n}\n", "import { copyMerge, getCompInit } from '#rx'\nimport { Menu, addGeneSearchbox, GeneSetEditUI, renderTable, table2col } from '#dom'\nimport {\n\tfilterInit,\n\tgetNormalRoot,\n\tfilterPromptInit,\n\tgetFilterItemByTag,\n\tnegateFilter,\n\tfilterJoin\n} from '#filter/filter'\nimport { appInit } from '#termdb/app'\nimport { fillTermWrapper, get$id } from '#termsetting'\nimport { getCurrentCohortChartTypes } from './charts'\nimport { getColors } from '#shared/common.js'\nimport { rgb } from 'd3-color'\nimport { TermTypes, isNumericTerm, termType2label } from '#shared/terms.js'\n\n/*\nthis\n\tapp\n\t\tvocabApi\n\t\topts\n\t\t\tgenome{}\n\t\t\tstate\n\t\t\t\tvocab{}\n\tstate {}\n\t\tgroups []\n\t\t\tgroup.name=str\n\t\t\tgroup.filter={}\n\t\ttermfilter{}\n\t\t\tfilter{}\n*/\n\nconst colorScale = getColors(5)\n\n// tip2 is used for showing the terms tree, which works as a submenu of this.tip, created here for reuse\nlet tip2\nfunction addTip2(tip) {\n\t// FIXME hardcoded x pos is not generally applicable\n\tif (!tip2) tip2 = new Menu({ padding: 0, offsetX: 250, offsetY: -34, parent_menu: tip.d.node() })\n\ttip2.clear()\n}\n\nconst geneTip = new Menu({ padding: '0px' })\n\nclass MassGroups {\n\tconstructor(opts = {}) {\n\t\tthis.type = 'groups'\n\t\tthis.selectedGroupsIdx = new Set() // set of array index for this.state.groups[], for those selected in table ui\n\t}\n\n\tasync init() {\n\t\tthis.dom = {\n\t\t\tholder: this.opts.holder.append('div').style('margin', '10px')\n\t\t}\n\t\tinitUI(this)\n\t\tthis.tip = new Menu({ padding: '0px' })\n\t}\n\n\tgetState(appState) {\n\t\tconst state = {\n\t\t\ttermfilter: appState.termfilter,\n\t\t\tgroups: rebaseGroupFilter(appState),\n\t\t\tcustomTerms: appState.customTerms,\n\t\t\tcurrentCohortChartTypes: getCurrentCohortChartTypes(appState),\n\t\t\tmatrixplots: this.app.vocabApi.termdbConfig.matrixplots\n\t\t}\n\t\treturn state\n\t}\n\n\tasync main() {\n\t\tawait updateUI(this)\n\t}\n\n\t//////////////// rest are app-specific logic\n\n\tgetMassFilter() {\n\t\tif (!this.state.termfilter.filter || this.state.termfilter.filter.lst.length == 0) {\n\t\t\treturn { type: 'tvslst', in: true, join: '', lst: [] }\n\t\t}\n\t\tconst f = getNormalRoot(structuredClone(this.state.termfilter.filter)) // strip tag\n\t\treturn f\n\t}\n\n\tasync groups2samplelst(groups) {\n\t\tconst samplelstGroups = []\n\t\tconst processedSamples = new Set(),\n\t\t\toverlap = []\n\t\tfor (const g of groups) {\n\t\t\tconst samples = await this.app.vocabApi.getFilteredSampleList(\n\t\t\t\tfilterJoin([g.filter, this.state.termfilter.filter])\n\t\t\t)\n\n\t\t\tconst items = []\n\t\t\tfor (const sample of samples) {\n\t\t\t\tconst item = { sampleId: sample.id }\n\t\t\t\tif ('name' in sample) {\n\t\t\t\t\titem.sample = sample.name\n\t\t\t\t}\n\t\t\t\t//items.push(item)\n\t\t\t\tif (!processedSamples.has(sample.id)) items.push(item)\n\t\t\t\telse {\n\t\t\t\t\tfor (const pg of samplelstGroups) {\n\t\t\t\t\t\t//if (pg.name === g.name) continue\n\t\t\t\t\t\tconst i = pg.items.findIndex(i => i.sampleId === sample.id)\n\t\t\t\t\t\tif (i !== -1) overlap.push(...pg.items.splice(i, 1))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprocessedSamples.add(item.sampleId)\n\t\t\t}\n\t\t\tif (items.length) samplelstGroups.push({ name: g.name, items, color: g.color })\n\t\t}\n\n\t\tif (overlap.length) {\n\t\t\tconst ok = confirm(\n\t\t\t\t'Overlap detected: 1 or more samples belong to >1 groups. A new group will be created for these \"overlap\" samples.'\n\t\t\t)\n\t\t\tif (!ok) return\n\t\t\tsamplelstGroups.push({ name: 'Group overlap', items: overlap })\n\t\t}\n\n\t\tif (groups.length == 1) {\n\t\t\t/* request rest of samples not in this single group, to form group2\n\t\t\t */\n\t\t\tconst samples = await this.app.vocabApi.getFilteredSampleList(\n\t\t\t\tfilterJoin([negateFilter(groups[0].filter), this.state.termfilter.filter])\n\t\t\t)\n\t\t\tif (!samples.length) throw '0 samples for the other group'\n\t\t\tconst items = []\n\t\t\tfor (const sample of samples) {\n\t\t\t\tconst item = { sampleId: sample.id }\n\t\t\t\tif ('name' in sample) {\n\t\t\t\t\titem.sample = sample.name\n\t\t\t\t}\n\t\t\t\titems.push(item)\n\t\t\t}\n\t\t\tsamplelstGroups.push({ name: 'Not in ' + groups[0].name, items, color: '#ccc' })\n\t\t}\n\n\t\treturn getSamplelstTW2(samplelstGroups)\n\t}\n\n\tupdateLaunchButton() {\n\t\t// turn both off by default; selectively turn on\n\t\tthis.dom.newTermSpan.style('display', 'none')\n\t\tthis.dom.noGroupSelected.style('display', 'none')\n\n\t\tif (this.state.groups.length == 0) return // no groups\n\n\t\tif (this.state.groups.length == 1) {\n\t\t\t// only one group present, launch button is always on to work on this group\n\t\t\tthis.dom.newTermSpan.style('display', '')\n\t\t\tthis.dom.launchButton.text(`Create variable using \"${this.state.groups[0].name}\"`)\n\t\t\tthis.dom.newTermNameInput.property('value', this.state.groups[0].name + ' vs others')\n\t\t\treturn\n\t\t}\n\n\t\t// 2 or more groups, button is based on the number of selected groups\n\t\tconst lst = [...this.selectedGroupsIdx]\n\t\tif (lst.length == 0) {\n\t\t\t// none selected\n\t\t\tthis.dom.noGroupSelected.style('display', '')\n\t\t\treturn\n\t\t}\n\t\t// at least 1 selected, display button\n\t\tthis.dom.newTermSpan.style('display', '')\n\t\tif (lst.length == 1) {\n\t\t\t// only 1 selected\n\t\t\tthis.dom.launchButton.text(`Create variable using \"${this.state.groups[lst[0]]?.name}\"`)\n\t\t\tthis.dom.newTermNameInput.property('value', this.state.groups[lst[0]].name + ' vs others')\n\t\t\treturn\n\t\t}\n\t\tthis.dom.launchButton.text(`Create variable using ${lst.length} groups`)\n\t\tthis.dom.newTermNameInput.property('value', lst.map(i => this.state.groups[i].name).join(' vs '))\n\t}\n\n\tdisplayCustomTerms() {\n\t\tthis.dom.customTermDiv.selectAll('*').remove()\n\t\tif (this.state.customTerms.length == 0) {\n\t\t\tthis.dom.customTermDiv\n\t\t\t\t.append('div')\n\t\t\t\t.text('No custom variables. Use above controls to create new ones. Custom variables are added to dictionary.')\n\t\t\t\t.style('font-size', '.8em')\n\t\t\treturn\n\t\t}\n\t\tthis.dom.customTermDiv\n\t\t\t.append('div')\n\t\t\t.style('margin-bottom', '10px')\n\t\t\t.style('font-size', '.8em')\n\t\t\t.text('Following custom variables are available in all charts where variables are used. Click one to delete.')\n\t\tfor (const { name, tw } of this.state.customTerms) {\n\t\t\tconst div = this.dom.customTermDiv.append('div')\n\t\t\tdiv\n\t\t\t\t.text(name)\n\t\t\t\t.attr('class', 'sja_filter_tag_btn')\n\t\t\t\t.style('padding', '3px 6px')\n\t\t\t\t.style('border-radius', '6px')\n\t\t\t\t.style('margin-right', '5px')\n\t\t\t\t.on('click', event => {\n\t\t\t\t\tconst deleteCallback = () => this.app.vocabApi.deleteCustomTerm(name)\n\t\t\t\t\tthis.showGroupsMenu(event, tw, deleteCallback)\n\t\t\t\t})\n\t\t}\n\t}\n\n\tnewId() {\n\t\tthis.lastId = get$id()\n\t\treturn this.lastId\n\t}\n\n\tshowGroupsMenu(event, tw, deleteCallback) {\n\t\tconst samplelstTW = structuredClone(tw)\n\t\tthis.tip.clear()\n\t\tconst menuDiv = this.tip.d.append('div')\n\t\tconst id = this?.lastId\n\n\t\tconst groupsInfo = menuDiv.append('div')\n\n\t\tconst table = table2col({ holder: groupsInfo })\n\t\tfor (const [grpKey, grp] of Object.entries(tw.term.values)) {\n\t\t\tconst colorSquare = grp.color\n\t\t\t\t? `<span style=\"display:inline-block; width:12px; height:12px; background-color:${grp.color}\" ></span>`\n\t\t\t\t: `<span style=\"display:inline-block; width:11px; height:11px; background-color:${'#fff'}; border: 0.1px solid black\" ></span>`\n\t\t\tconst [c1, c2] = table.addRow()\n\t\t\tc1.html(`${colorSquare} ${grp.label}:`)\n\t\t\tc2.html(`${grp.othersGroupSampleNum || grp.list.length} samples`)\n\t\t}\n\n\t\tif (this.state.currentCohortChartTypes.includes('DA') && samplelstTW.q.groups.length == 2)\n\t\t\taddDiffAnalysisPlotMenuItem(menuDiv, this, samplelstTW)\n\n\t\tif (this.state.currentCohortChartTypes.includes('survival'))\n\t\t\taddPlotMenuItem('survival', menuDiv, 'Compare survival', this.tip, samplelstTW, id, this, true)\n\n\t\tif (this.state.currentCohortChartTypes.includes('geneExpression'))\n\t\t\taddHierClusterPlotMenuItem('geneExpression', menuDiv, 'Gene expression', this.tip, samplelstTW, id, this, true)\n\n\t\tif (this.state.currentCohortChartTypes.includes('matrix'))\n\t\t\taddMatrixMenuItems(menuDiv, 'Matrix', this.tip, samplelstTW, id, this, this.state, true, () => this.newId)\n\n\t\tif (this.state.currentCohortChartTypes.includes('cuminc'))\n\t\t\taddPlotMenuItem('cuminc', menuDiv, 'Compare cumulative incidence', this.tip, samplelstTW, id, this, true)\n\n\t\taddSummarizeOption(menuDiv, this, samplelstTW, id)\n\n\t\tmayAddSamplescatterOption(menuDiv, this, samplelstTW)\n\t\tmayAddGenomebrowserOption(menuDiv, this, samplelstTW)\n\n\t\t//show option to delete custom variable\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('Delete variable')\n\t\t\t.on('click', event => {\n\t\t\t\tdeleteCallback()\n\t\t\t\tthis.tip.hide()\n\t\t\t})\n\n\t\tthis.tip.showunder(event.target)\n\t}\n}\n\nexport const groupsInit = getCompInit(MassGroups)\n\nfunction addSummarizeOption(menuDiv, self, samplelstTW, id) {\n\tconst summarizeDiv = menuDiv.append('div').attr('class', 'sja_menuoption sja_sharp_border').html('Summarize')\n\tsummarizeDiv.insert('div').html('\u203A').style('float', 'right')\n\n\tsummarizeDiv.on('click', async () => {\n\t\tshowTermsTree(\n\t\t\tsummarizeDiv,\n\t\t\tterm => {\n\t\t\t\tconst tw = { term }\n\t\t\t\tif (isNumericTerm(term)) tw.q = { mode: 'continuous' }\n\t\t\t\topenSummaryPlot(tw, samplelstTW, self.app, id, () => self.newId)\n\t\t\t},\n\t\t\tself.app,\n\t\t\tself.tip\n\t\t)\n\t})\n}\n\nfunction mayAddGenomebrowserOption(menuDiv, self, samplelstTW) {\n\tif (!self.state.currentCohortChartTypes.includes('genomeBrowser')) return\n\tif (!self.app.vocabApi.termdbConfig.queries?.snvindel) return // for now only allow for snvindel\n\tif (samplelstTW.q.groups.length != 2) return // hardcoded to only support 2 groups\n\tconst itemdiv = menuDiv\n\t\t.append('div')\n\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t.text('Compare mutations')\n\t\t.on('click', () => {\n\t\t\taddTip2(self.tip)\n\t\t\ttip2.showunderoffset(itemdiv.node())\n\t\t\tconst arg = {\n\t\t\t\ttip: geneTip,\n\t\t\t\tgenome: self.app.opts.genome,\n\t\t\t\trow: tip2.d.append('div').style('margin', '10px'),\n\t\t\t\tcallback: () => {\n\t\t\t\t\tconst [f1, f2] = makeFiltersFromTwoSampleGroups(samplelstTW)\n\t\t\t\t\tconst config = {\n\t\t\t\t\t\tchartType: 'genomeBrowser',\n\t\t\t\t\t\tgeneSearchResult: result,\n\t\t\t\t\t\tsnvindel: { filter: f1 }, // code filter in 1st tk\n\t\t\t\t\t\tsubMds3TkFilters: [f2] // code filter in 2nd tk\n\t\t\t\t\t}\n\t\t\t\t\tself.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst result = addGeneSearchbox(arg)\n\t\t})\n}\n\nfunction makeFiltersFromTwoSampleGroups(tw) {\n\tconst [g1, g2] = tw.q.groups\n\tif (!g1 || !g2) throw 'not 2 groups in tw.q.groups[]'\n\treturn [\n\t\t{\n\t\t\tin: g1.in,\n\t\t\tjoin: '',\n\t\t\ttype: 'tvslst',\n\t\t\tlst: [\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: {\n\t\t\t\t\t\t\tname: g1.name,\n\t\t\t\t\t\t\ttype: 'samplelst',\n\t\t\t\t\t\t\tvalues: {\n\t\t\t\t\t\t\t\t[g1.name]: {\n\t\t\t\t\t\t\t\t\tkey: g1.name,\n\t\t\t\t\t\t\t\t\tlabel: g1.name,\n\t\t\t\t\t\t\t\t\tlist: g1.values\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\t{\n\t\t\tin: g2.in,\n\t\t\tjoin: '',\n\t\t\ttype: 'tvslst',\n\t\t\tlst: [\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: {\n\t\t\t\t\t\t\tname: g2.name,\n\t\t\t\t\t\t\ttype: 'samplelst',\n\t\t\t\t\t\t\tvalues: {\n\t\t\t\t\t\t\t\t[g2.name]: {\n\t\t\t\t\t\t\t\t\tkey: g2.name,\n\t\t\t\t\t\t\t\t\tlabel: g2.name,\n\t\t\t\t\t\t\t\t\tlist: g2.values\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]\n}\n\nfunction mayAddSamplescatterOption(menuDiv, self, samplelstTW) {\n\t// this is only for pre-made scatterplots\n\tif (!self.app.vocabApi.termdbConfig.scatterplots) return\n\tfor (const plot of self.app.vocabApi.termdbConfig.scatterplots) {\n\t\tif (plot.colorTW)\n\t\t\t//the plot supports overlay by a color term\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(`Overlay on ${plot.name}`)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tlet config = {\n\t\t\t\t\t\tchartType: 'sampleScatter',\n\t\t\t\t\t\tname: plot.name\n\t\t\t\t\t}\n\t\t\t\t\tif (plot.sampleCategory)\n\t\t\t\t\t\t//if the plot filters by a sample category, like D1, R1\n\t\t\t\t\t\tconfig.sampleCategory = {\n\t\t\t\t\t\t\ttw: structuredClone(plot.sampleCategory.tw),\n\t\t\t\t\t\t\torder: plot.sampleCategory.order,\n\t\t\t\t\t\t\tdefaultValue: plot.sampleCategory.defaultValue\n\t\t\t\t\t\t}\n\t\t\t\t\tif (plot.sampleType) config.sampleType = plot.sampleType //if the plot specifies the sample type to customize the legend\n\t\t\t\t\tconfig.colorTW = structuredClone(samplelstTW)\n\n\t\t\t\t\tif (plot.settings) config.settings = structuredClone(plot.settings) //if the plot specifies settings\n\t\t\t\t\tself.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig: config\n\t\t\t\t\t})\n\t\t\t\t\tself.tip.hide()\n\t\t\t\t})\n\t}\n}\n\nfunction addDiffAnalysisPlotMenuItem(div, self, samplelstTW) {\n\t// DA app can be applied to multiple datatypes. show options based on availability for each datatype\n\tif (self.app.vocabApi.termdbConfig.queries?.rnaseqGeneCount) {\n\t\t// hardcoded! rnaseq genecount will correspond to gene exp term type on DA ui\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text(`Differential ${termType2label(TermTypes.GENE_EXPRESSION)} Analysis`)\n\t\t\t.on('click', e => {\n\t\t\t\t//Move this to diff analysis plot??\n\t\t\t\t//Do the check but not add to the state??\n\t\t\t\tconst groups = []\n\t\t\t\tfor (const group of samplelstTW.q.groups) {\n\t\t\t\t\tif (group.values && group.values.length > 0) {\n\t\t\t\t\t\tgroups.push(group)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow 'group does not contain samples for differential analysis'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst config = {\n\t\t\t\t\tchartType: 'differentialAnalysis',\n\t\t\t\t\tstate: self.state,\n\t\t\t\t\tsamplelst: { groups },\n\t\t\t\t\ttermType: TermTypes.GENE_EXPRESSION,\n\t\t\t\t\ttw: samplelstTW\n\t\t\t\t}\n\t\t\t\tself.tip.hide()\n\t\t\t\tself.app.dispatch({\n\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\tconfig\n\t\t\t\t})\n\t\t\t})\n\t}\n\n\tif (self.app.vocabApi.termdbConfig.allowedTermTypes?.includes(TermTypes.METABOLITE_INTENSITY)) {\n\t\tdiv.append('div').text('DA should support metabolite')\n\t}\n\n\t// small text to explain which is case/control. always show this for all DA\n\tdiv\n\t\t.append('div')\n\t\t.html(\n\t\t\t`<span style=\"font-size:.8em;font-weight:bold\">CASE</span> ${samplelstTW.q.groups[1].name}\n\t\t \n\t\t<span style=\"font-size:.8em;font-weight:bold\">CONTROL</span> ${samplelstTW.q.groups[0].name}`\n\t\t)\n\t\t.style('font-size', '0.8em')\n\t\t.style('opacity', 0.8)\n\t\t.style('padding', '3px 3px 3px 10px')\n}\n\nfunction initUI(self) {\n\tself.dom.filterTableDiv = self.dom.holder.append('div').style('margin-bottom', '10px')\n\n\t// row of buttons\n\tconst btnRow = self.dom.holder.append('div')\n\n\t// btn 1: prompt to add new group\n\tself.dom.addNewGroupBtnHolder = btnRow.append('span').style('margin-right', '20px')\n\n\t// btn 2: patch of controls to create new term\n\tself.dom.newTermSpan = btnRow.append('span') // contains \"create button\" and <input>, so they can toggle on/off together\n\tself.dom.newTermSpan.append('span').style('padding-left', '15px').text('Add variable:')\n\tself.dom.newTermNameInput = self.dom.newTermSpan.append('input').attr('type', 'text')\n\n\tself.dom.launchButton = self.dom.newTermSpan\n\t\t.append('span')\n\t\t.attr('class', 'sja_menuoption')\n\t\t.on('click', () => clickLaunchBtn(self))\n\n\t// msg: none selected\n\tself.dom.noGroupSelected = btnRow.append('span').text('No groups selected').style('opacity', 0.5)\n\n\t// bottom box to list custom terms\n\tself.dom.customTermDiv = self.dom.holder\n\t\t.append('div')\n\t\t.style('margin', '20px')\n\t\t.style('border-left', 'solid 1px black')\n\t\t.style('padding', '10px')\n\n\tself.dom.holder.on('click', event => {\n\t\tif (tip2) tip2.hide()\n\t})\n}\n\nasync function updateUI(self) {\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\n\t// create \"Add new group\" button as needed\n\tif (!self.filterPrompt) {\n\t\tself.filterPrompt = await filterPromptInit({\n\t\t\tholder: self.dom.addNewGroupBtnHolder,\n\t\t\tvocabApi: self.app.vocabApi,\n\t\t\temptyLabel: 'Add group',\n\t\t\ttermdbConfig: self.app.vocabApi.termdbConfig,\n\t\t\tcallback: f => {\n\t\t\t\taddNewGroup(self.app, f, self.state.groups)\n\t\t\t},\n\t\t\tdebug: self.opts.debug\n\t\t})\n\t}\n\n\t// filterPrompt.main() always empties the filterUiRoot data\n\tself.filterPrompt.main(self.getMassFilter()) // provide mass filter to limit the term tree\n\n\t// duplicate groups[] array to mutate and add to action.state for dispatching\n\tconst groups = structuredClone(self.state.groups)\n\n\tif (!groups.length) {\n\t\t// no groups, do not show launch button, hide table\n\t\tself.updateLaunchButton()\n\t\tself.dom.filterTableDiv.style('display', 'none')\n\t\tself.displayCustomTerms()\n\t\treturn\n\t}\n\n\t// clear table and populate rows\n\tself.dom.filterTableDiv.style('display', '').selectAll('*').remove()\n\n\tconst tableArg = {\n\t\tdiv: self.dom.filterTableDiv,\n\t\tcolumns: [\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.state.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\tupdateUI(self)\n\t\t\t\t\t} else\n\t\t\t\t\t\tawait self.app.dispatch({\n\t\t\t\t\t\t\ttype: 'rename_group',\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tnewName: cell.value\n\t\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\tawait self.app.dispatch({\n\t\t\t\t\t\ttype: 'change_color_group',\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tnewColor: cell.color\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ label: '#SAMPLE' },\n\t\t\t{ label: 'FILTER' }\n\t\t],\n\t\tcolumnButtons: [\n\t\t\t{\n\t\t\t\ttext: 'Delete',\n\t\t\t\tcallback: (e, i) => {\n\t\t\t\t\tconst group = groups[i]\n\t\t\t\t\tself.app.vocabApi.deleteGroup(group.name)\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\trows: []\n\t}\n\tfor (const g of groups) {\n\t\ttableArg.rows.push([\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.app.vocabApi.getFilteredSampleCount(g.filter)) },\n\t\t\t{} // blank cell to show filter ui\n\t\t])\n\t}\n\n\t// clear existing selected groups\n\tself.selectedGroupsIdx.clear()\n\n\tif (groups.length == 1) {\n\t\t// only one group, add index 0\n\t\tself.selectedGroupsIdx.add(0)\n\t} else {\n\t\t// more than 1 group, show checkboxes for each row\n\t\ttableArg.noButtonCallback = (i, node) => {\n\t\t\tif (node.checked) self.selectedGroupsIdx.add(i)\n\t\t\telse self.selectedGroupsIdx.delete(i)\n\t\t\tself.updateLaunchButton() // update button text, based on how many groups are selected\n\t\t}\n\t\t//\n\t\ttableArg.selectedRows = []\n\t\tfor (let i = 0; i < groups.length; i++) {\n\t\t\ttableArg.selectedRows.push(i) // check all rows by default\n\t\t\tself.selectedGroupsIdx.add(i)\n\t\t}\n\t}\n\n\trenderTable(tableArg)\n\tfor (const [i, row] of tableArg.rows.entries()) {\n\t\tconst group = groups[i]\n\t\tfilterInit({\n\t\t\tholder: row[3].__td,\n\t\t\tvocabApi: self.app.vocabApi,\n\t\t\ttermdbConfig: self.app.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 = groups.findIndex(g => g.name == group.name)\n\t\t\t\t\tgroups.splice(i, 1)\n\t\t\t\t} else {\n\t\t\t\t\t// update filter\n\t\t\t\t\tgroup.filter = f\n\t\t\t\t}\n\t\t\t\tself.app.dispatch({\n\t\t\t\t\ttype: 'app_refresh',\n\t\t\t\t\tstate: { groups }\n\t\t\t\t})\n\t\t\t}\n\t\t}).main(group.filter)\n\t}\n\n\tself.updateLaunchButton()\n\n\tself.displayCustomTerms()\n}\n\nasync function clickLaunchBtn(self) {\n\t// click button to create samplelst tw\n\t// collect groups in use\n\tconst groups = []\n\tfor (const i of self.selectedGroupsIdx) {\n\t\tconst g = self.state.groups[i]\n\t\tif (g) groups.push(g)\n\t}\n\n\tif (groups.length == 0) throw 'No groups, should not happen'\n\n\tconst name = self.dom.newTermNameInput.property('value')\n\n\t// 1 or more groups are in use, generate samplelst tw and save it to state\n\tconst tw = await self.groups2samplelst(groups)\n\tif (!tw) return\n\ttw.term.name = name\n\tself.app.vocabApi.addCustomTerm({ name, tw })\n\n\tself.dom.newTermSpan.style('display', 'none')\n}\n\n/*\ns = {groups[ {filter} ], termfilter{filter} }\ntermfilter is mass global filter\nif provided, need to \"rebase\" group's visible filter to it\na group filter contains the shadowy global filter from previous state. when new state is provided, need to replace it\n*/\nexport function rebaseGroupFilter(s) {\n\tif (!s.termfilter?.filter || s.termfilter.filter.lst.length == 0) {\n\t\t// blank filter\n\t\treturn s.groups\n\t}\n\tconst groups = [] // new groups\n\tfor (const g of s.groups) {\n\t\tconst f = getNormalRoot(structuredClone(s.termfilter.filter))\n\t\tconst f2 = getFilterItemByTag(g.filter, 'filterUiRoot')\n\t\tif (!f2) {\n\t\t\t//console.log('filterUiRoot not found')\n\t\t\tgroups.push(g)\n\t\t\tcontinue\n\t\t}\n\t\tf.lst.push(f2)\n\t\tf.join = f.lst.length > 1 ? 'and' : ''\n\t\tconst g2 = {\n\t\t\tname: g.name,\n\t\t\tfilter: f,\n\t\t\tcolor: g.color\n\t\t}\n\t\tgroups.push(g2)\n\t}\n\treturn groups\n}\n\nexport async function openPlot(chartType, term, term2, app, id, newId) {\n\tlet config = {\n\t\tchartType,\n\t\tterm,\n\t\tterm2\n\t}\n\tif (id) config.insertBefore = id\n\tif (newId) config.id = newId()\n\tawait app.dispatch({\n\t\ttype: 'plot_create',\n\t\tconfig\n\t})\n}\n\nexport async function openSummaryPlot(tw, samplelstTW, app, id, newId) {\n\tconst config = {\n\t\tchartType: 'summary',\n\t\tchildType: tw.q?.mode == 'continuous' ? 'violin' : 'barchart',\n\t\tterm: tw,\n\t\tterm2: samplelstTW\n\t}\n\tif (id) config.insertBefore = id\n\tif (newId) config.id = newId()\n\tawait app.dispatch({\n\t\ttype: 'plot_create',\n\t\tconfig\n\t})\n}\nexport async function showTermsTree(\n\tdiv,\n\tcallback,\n\tapp,\n\ttip,\n\ttreeState = { tree: { usecase: { target: 'default', detail: 'term' } } },\n\tcloseParent = true,\n\tshift = true,\n\tdisable_terms = []\n) {\n\tconst activeCohort = app.getState().activeCohort\n\t//we need to pass the active cohort to build the tree with the correct terms\n\tconst state = { activeCohort, ...treeState }\n\taddTip2(tip) // tip2 is added if missing and ready to use\n\tif (shift) tip2.showunderoffset(div.node())\n\telse tip2.showunder(div.node())\n\tappInit({\n\t\tholder: tip2.d,\n\t\tvocabApi: app.vocabApi,\n\t\tstate,\n\t\ttree: {\n\t\t\tdisable_terms,\n\t\t\tclick_term: term => {\n\t\t\t\tcallback(term)\n\t\t\t\ttip2.hide()\n\t\t\t\tif (closeParent) tip.hide()\n\t\t\t}\n\t\t}\n\t})\n}\nexport function addPlotMenuItem(chartType, div, text, tip, samplelstTW, id, parent, openOnTop = false) {\n\tconst itemDiv = div\n\t\t.append('div')\n\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t//.html('Compare survival \u203A')\n\t\t.html(`${text} \u203A`)\n\t\t.on('click', e => {\n\t\t\tconst state = { tree: { usecase: { target: chartType, detail: 'term' } } }\n\t\t\tif (chartType == 'survival') state.nav = { header_mode: 'hide_search' }\n\t\t\tshowTermsTree(\n\t\t\t\titemDiv,\n\t\t\t\tterm => {\n\t\t\t\t\topenPlot(chartType, term, samplelstTW, parent.app, id, openOnTop ? () => parent.newId : null)\n\t\t\t\t},\n\t\t\t\tparent.app,\n\t\t\t\ttip,\n\t\t\t\tstate\n\t\t\t)\n\t\t})\n}\n\nexport function addHierClusterPlotMenuItem(chartType, div, text, tip, samplelstTW, id, parent, openOnTop = false) {\n\tconst itemDiv = div\n\t\t.append('div')\n\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t.html(`${text} \u203A`)\n\t\t.on('click', () => {\n\t\t\taddTip2(tip) // tip2 is added if missing and ready to use\n\t\t\ttip2.showunderoffset(itemDiv.node())\n\n\t\t\tnew GeneSetEditUI({\n\t\t\t\tholder: tip2.d,\n\t\t\t\tgenome: parent.app.opts.genome,\n\t\t\t\tgeneList: [],\n\t\t\t\tvocabApi: parent.app.vocabApi,\n\t\t\t\tmode: TermTypes.GENE_EXPRESSION,\n\t\t\t\tcallback: async ({ geneList, groupName }) => {\n\t\t\t\t\ttip.hide()\n\t\t\t\t\tconst group = { name: groupName, lst: [], type: 'hierCluster' }\n\t\t\t\t\tconst lst = group.lst.filter(tw => tw.term.type != 'geneExpression')\n\n\t\t\t\t\tconst tws = await Promise.all(\n\t\t\t\t\t\tgeneList.map(async d => {\n\t\t\t\t\t\t\tconst term = {\n\t\t\t\t\t\t\t\tgene: d.symbol || d.gene,\n\t\t\t\t\t\t\t\tname: d.symbol || d.gene,\n\t\t\t\t\t\t\t\ttype: 'geneExpression'\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet tw = group.lst.find(tw => tw.term.name == d.symbol || tw.term.name == d.gene)\n\t\t\t\t\t\t\tif (!tw) {\n\t\t\t\t\t\t\t\ttw = { term, q: {} }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn tw\n\t\t\t\t\t\t})\n\t\t\t\t\t)\n\n\t\t\t\t\t// close geneset edit ui after clicking submit\n\t\t\t\t\ttip2.d.selectAll('*').remove()\n\n\t\t\t\t\tif (tws.length == 1) {\n\t\t\t\t\t\tconst tw = tws[0]\n\t\t\t\t\t\tparent.app.dispatch({\n\t\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\t\tchartType: 'summary',\n\t\t\t\t\t\t\t\tterm: tw,\n\t\t\t\t\t\t\t\tterm2: samplelstTW\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (tws.length == 2) {\n\t\t\t\t\t\tconst tw = tws[0]\n\t\t\t\t\t\tconst tw2 = tws[1]\n\t\t\t\t\t\tparent.app.dispatch({\n\t\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\t\tchartType: 'summary',\n\t\t\t\t\t\t\t\tterm: tw,\n\t\t\t\t\t\t\t\tterm2: tw2,\n\t\t\t\t\t\t\t\tcolorTW: samplelstTW\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup.lst = [...lst, ...tws]\n\n\t\t\t\t\tparent.app.dispatch({\n\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tchartType: 'hierCluster',\n\t\t\t\t\t\t\ttermgroups: [group],\n\t\t\t\t\t\t\tdataType: TermTypes.GENE_EXPRESSION,\n\t\t\t\t\t\t\tdivideBy: samplelstTW,\n\t\t\t\t\t\t\tsettings: { hierCluster: { yDendrogramHeight: 0, clusterSamples: false } }\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\nexport function addMatrixMenuItems(div, text, tip, samplelstTW, id, parent, state, openOnTop = false, newId) {\n\tconst preBuiltMatrix = state.matrixplots\n\tconst hasSnvIndel = parent.app.vocabApi.termdbConfig?.queries?.snvindel\n\tif (!preBuiltMatrix && !hasSnvIndel) return\n\tconst itemDiv = div\n\t\t.append('div')\n\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t.html(`${text} \u203A`)\n\t\t.on('click', () => {\n\t\t\taddTip2(tip) // tip2 is added if missing and ready to use\n\t\t\ttip2.showunderoffset(itemDiv.node())\n\n\t\t\tif (preBuiltMatrix) {\n\t\t\t\t// adding buttons to divide each pre-built matrix\n\t\t\t\tconst preBuiltMatrixDiv = tip2.d.append('div')\n\t\t\t\tfor (const plot of preBuiltMatrix) {\n\t\t\t\t\tpreBuiltMatrixDiv\n\t\t\t\t\t\t.append('button')\n\t\t\t\t\t\t.style('margin', '10px')\n\t\t\t\t\t\t.style('padding', '10px 15px')\n\t\t\t\t\t\t.style('border-radius', '20px')\n\t\t\t\t\t\t.style('border-color', '#ededed')\n\t\t\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t\t\t.text('Divide ' + plot.name)\n\t\t\t\t\t\t.on('click', async () => {\n\t\t\t\t\t\t\tconst config = await parent.app.vocabApi.getMatrixByName(plot.name)\n\t\t\t\t\t\t\tconfig.divideBy = samplelstTW\n\t\t\t\t\t\t\tconfig.insertBefore = id\n\t\t\t\t\t\t\tconfig.settings.matrix.colw = 0\n\t\t\t\t\t\t\tif (newId) config.id = newId()\n\t\t\t\t\t\t\tparent.app.dispatch({\n\t\t\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\t\t\tconfig\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\ttip.hide()\n\t\t\t\t\t\t\ttip2.hide()\n\t\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (hasSnvIndel) {\n\t\t\t\t// adding geneSet edit UI for building new matrix\n\t\t\t\tconst newMatrixDiv = tip2.d.append('div')\n\t\t\t\tnew GeneSetEditUI({\n\t\t\t\t\tholder: newMatrixDiv,\n\t\t\t\t\tgenome: parent.app.opts.genome,\n\t\t\t\t\tgeneList: [],\n\t\t\t\t\tmode: TermTypes.GENE_VARIANT,\n\t\t\t\t\tvocabApi: parent.app.vocabApi,\n\t\t\t\t\tcallback: async ({ geneList, groupName }) => {\n\t\t\t\t\t\ttip.hide()\n\t\t\t\t\t\tconst group = { name: groupName, lst: [] }\n\t\t\t\t\t\tconst lst = group.lst.filter(tw => tw.term.type != 'geneVariant')\n\n\t\t\t\t\t\tconst tws = await Promise.all(\n\t\t\t\t\t\t\tgeneList.map(async d => {\n\t\t\t\t\t\t\t\tconst term = {\n\t\t\t\t\t\t\t\t\tgene: d.symbol || d.gene,\n\t\t\t\t\t\t\t\t\tname: d.symbol || d.gene,\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\tlet tw = group.lst.find(tw => tw.term.name == d.symbol || tw.term.name == d.gene)\n\t\t\t\t\t\t\t\tif (!tw) {\n\t\t\t\t\t\t\t\t\ttw = { term }\n\t\t\t\t\t\t\t\t\tawait fillTermWrapper(tw, parent.app.vocabApi)\n\t\t\t\t\t\t\t\t} else if (!tw.$id) {\n\t\t\t\t\t\t\t\t\ttw.$id = await get$id(parent.app.vocabApi.getTwMinCopy({ term }))\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn tw\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t\t// close geneset edit ui after clicking submit\n\t\t\t\t\t\ttip2.d.selectAll('*').remove()\n\t\t\t\t\t\tgroup.lst = [...lst, ...tws]\n\t\t\t\t\t\tparent.app.dispatch({\n\t\t\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\t\tchartType: 'matrix',\n\t\t\t\t\t\t\t\ttermgroups: [group],\n\t\t\t\t\t\t\t\tdataType: TermTypes.GENE_VARIANT,\n\t\t\t\t\t\t\t\tdivideBy: samplelstTW\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}\n\nexport function addNewGroup(app, filter, groups) {\n\tgroups = JSON.parse(JSON.stringify(groups))\n\tlet name = 'New group'\n\tlet i = 0\n\twhile (1) {\n\t\tconst name2 = name + (i == 0 ? '' : ' ' + i)\n\t\tif (!groups.find(g => g.name == name2)) break\n\t\ti++\n\t}\n\tname = name + (i == 0 ? '' : ' ' + i)\n\tconst newGroup = {\n\t\tname,\n\t\tfilter,\n\t\tcolor: rgb(colorScale(groups.length)).formatHex()\n\t}\n\tgroups.push(newGroup)\n\tapp.dispatch({\n\t\ttype: 'app_refresh',\n\t\tstate: { groups }\n\t})\n}\n\nexport function getSamplelstTWFromIds(ids) {\n\tif (!ids) throw 'getSamplelstTWFromIds: ids is empty'\n\tif (!Array.isArray(ids)) throw 'getSamplelstTWFromIds: ids must be an array'\n\tconst name = 'group'\n\tconst values = ids.map(id => {\n\t\treturn { sampleId: id }\n\t})\n\tconst qgroup = {\n\t\tname: name,\n\t\tin: true,\n\t\tvalues\n\t}\n\n\tconst tw = {\n\t\tisAtomic: true,\n\t\tterm: { name, type: 'samplelst', values: { [name]: { key: name, list: values } } },\n\t\tq: {\n\t\t\tgroups: [qgroup]\n\t\t}\n\t}\n\treturn tw\n}\n\nexport function getFilter(samplelstTW) {\n\tlet i = 0\n\tlet noEdit = true\n\tfor (const field in samplelstTW.term.values) {\n\t\tconst values = samplelstTW.q.groups[i].values\n\t\tsamplelstTW.term.values[field].list = values\n\t\tif (values[0] && 'sample' in values[0]) noEdit = false\n\t\ti++\n\t}\n\tconst filter = {\n\t\ttype: 'tvslst',\n\t\tin: true,\n\t\tjoin: '',\n\t\tlst: [\n\t\t\t{\n\t\t\t\ttype: 'tvs',\n\t\t\t\ttvs: { term: samplelstTW.term },\n\t\t\t\tnoEdit\n\t\t\t}\n\t\t]\n\t}\n\treturn filter\n}\n\nexport function getSampleFilter(sampleId) {\n\tif (!sampleId) throw 'getSampleFilter: sampleId is empty'\n\tif (Array.isArray(sampleId)) throw 'getSampleFilter: sampleId arg cannot be an array'\n\tconst group = { name: '', index: 0, items: [{ sampleId }] }\n\tconst samplelst = getSamplelstTW([group], '', false)\n\tconst filter = getFilter(samplelst)\n\treturn filter\n}\n\n// no special handling when groups.length=1\nexport function getSamplelstTW2(groups) {\n\tconst values = {}\n\tconst qgroups = []\n\tfor (const group of groups) {\n\t\tconst samples = getGroupSamples(group)\n\t\tconst qgroup = {\n\t\t\tname: group.name,\n\t\t\tin: true,\n\t\t\tvalues: samples\n\t\t}\n\t\tqgroups.push(qgroup)\n\t\tvalues[group.name] = { key: group.name, label: group.name, color: group.color, list: samples } //samples need to be passed for the samplelst filter to work\n\t}\n\treturn {\n\t\tisAtomic: true,\n\t\tterm: { name: 'groups', type: 'samplelst', values },\n\t\tq: { groups: qgroups }\n\t}\n}\n\nexport function getSamplelstTW(groups, name = 'groups', notIn = true) {\n\tconst values = {}\n\tconst qgroups = []\n\tlet samples\n\tfor (const group of groups) {\n\t\tsamples = getGroupSamples(group)\n\t\tconst qgroup = {\n\t\t\tname: group.name,\n\t\t\tin: true,\n\t\t\tvalues: samples\n\t\t}\n\t\tqgroups.push(qgroup)\n\t\tvalues[group.name] = { key: group.name, label: group.name, color: group.color, list: samples } //samples need to be passed for the samplelst filter to work\n\t}\n\tif (groups.length == 1 && notIn) {\n\t\tconst name2 = 'Not in ' + groups[0].name\n\t\tvalues[name2] = { key: name2, label: name2, color: '#aaa', list: samples }\n\t\tqgroups.push({\n\t\t\tname: name2,\n\t\t\tin: false,\n\t\t\tvalues: samples\n\t\t})\n\t}\n\tconst tw = {\n\t\tisAtomic: true,\n\t\tterm: { name, type: 'samplelst', values },\n\t\tq: { groups: qgroups }\n\t}\n\treturn tw\n}\nfunction getGroupSamples(group) {\n\tconst values = []\n\tfor (const item of group.items) {\n\t\tconst value = { sampleId: item.sampleId }\n\t\tif ('sample' in item) {\n\t\t\tvalue.sample = item.sample\n\t\t}\n\t\tvalues.push(value)\n\t}\n\treturn values\n}\n", "import { showTermsTree } from '../mass/groups'\nimport { Menu } from '#dom/menu'\n\n//This function builds an intermediate UI to select two terms from a tree.\n//It receives a callback that will be called with the two terms selected.\n//it is used, for example, to create a scatter plot using the two numeric terms selected as coordinates,\n// and to create a facet table where the rows and columns are filled with the categories from the two terms selected.\n//If detail2 is provided, it will be used to filter the second term based on this value. Used for the run chart that requires date for the first time\n// and a numeric term for the second value that is not a date.\nexport function select2Terms(tip, app, chartType, detail, callback, detail2) {\n\tconst tip2 = new Menu({ padding: '5px' })\n\tconst coordsDiv = tip.d.append('div').style('padding', '5px') //.attr('class', 'sja_menuoption sja_sharp_border')\n\tcoordsDiv.append('div').html('Select variables to plot').style('font-size', '0.9rem')\n\tlet xterm, yterm\n\tconst xDiv = coordsDiv.append('div').style('padding-top', '5px').html(' X ')\n\tconst xtermDiv = xDiv\n\t\t.append('div')\n\t\t.attr('class', 'sja_filter_tag_btn add_term_btn')\n\t\t.text('+')\n\t\t.on('click', e => {\n\t\t\tgetTreeTerm(xtermDiv, term => (xterm = term), detail)\n\t\t})\n\n\tconst yDiv = coordsDiv.append('div').html(' Y ')\n\tconst ytermDiv = yDiv\n\t\t.append('div')\n\t\t.attr('class', 'sja_filter_tag_btn add_term_btn')\n\t\t.text('+')\n\t\t.on('click', e => {\n\t\t\tgetTreeTerm(ytermDiv, term => (yterm = term), detail2 || detail)\n\t\t})\n\n\tconst submitbt = coordsDiv\n\t\t.append('div')\n\t\t.style('float', 'right')\n\t\t.style('padding', '5px')\n\t\t.insert('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\n\tfunction getTreeTerm(div, callback, detail) {\n\t\tconst state = { tree: { usecase: { detail, target: chartType } } }\n\t\t//state.nav = {header_mode: 'hide_search'}\n\t\tconst disable_terms = []\n\t\tif (xterm) disable_terms.push(xterm)\n\t\tif (yterm) disable_terms.push(yterm)\n\t\tshowTermsTree(\n\t\t\tdiv,\n\t\t\tterm => {\n\t\t\t\tcallback(term)\n\t\t\t\ttip2.hide()\n\t\t\t\tdiv.selectAll('*').remove()\n\t\t\t\tdiv.text(term.name)\n\t\t\t\tif (xterm != null && yterm != null) submitbt.property('disabled', false)\n\t\t\t},\n\t\t\tapp,\n\t\t\ttip,\n\t\t\tstate,\n\t\t\tfalse,\n\t\t\tfalse,\n\t\t\tdisable_terms\n\t\t)\n\t}\n}\n", "import { select } from 'd3-selection'\nimport { icons, axisstyle } 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\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\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\tconst checkboxH = cell\n\t\t\t\t\t.append('input')\n\t\t\t\t\t// TODO: should use a globally-unique element id for the checkbox\n\t\t\t\t\t.attr('id', 'checkboxHeader')\n\t\t\t\t\t.attr('type', 'checkbox')\n\t\t\t\t\t.attr('title', 'Check or uncheck all')\n\t\t\t\t\t.on('change', () => {\n\t\t\t\t\t\tconst nodes = tbody.selectAll('input').nodes()\n\t\t\t\t\t\ttbody.selectAll('input').property('checked', checkboxH.node().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\tcheckboxH.node().checked = selectAll\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\t//Do not scroll when all rows are selected. Problem appears when sorting.\n\t\t\t\tif (selectedRows.length != rows.length && rowIdx === selectedRows[0] && tr.node()) {\n\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// scroll to the table row,so that it's visible and obvious to the user\n\t\t\t\t\t// which rows are pre-selected\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\ttr.node()?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n\t\t\t\t\t}, 500)\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 ('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', '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\nfunction sortTableCallBack(i: number, rows: any, isAscending: boolean) {\n\tconst newRows = rows.sort((a, b) => {\n\t\tif ((!a[i].value && a[i].value != 0) || (!b[i].value && b[i].value != 0)) return\n\t\t//numbers\n\t\tif (typeof a[i].value === 'number' && typeof b[i].value === 'number') {\n\t\t\tif (!isAscending) return b[i].value - a[i].value\n\t\t\telse return a[i].value - b[i].value\n\t\t\t//strings\n\t\t} else if (typeof a[i].value === 'string' && typeof b[i].value === 'string') {\n\t\t\tif (!isAscending) return b[i].value.localeCompare(a[i].value)\n\t\t\telse return a[i].value.localeCompare(b[i].value)\n\t\t}\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\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\tawait self.setHandler()\n\tif (self.handler.setTvsDefaults) self.handler.setTvsDefaults(self.tvs)\n\tself.handler.fillMenu(self, opts.holder, self.tvs)\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\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\tconst filter = JSON.parse(JSON.stringify(rawFilter))\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\tdelete filter.$id\n\tdelete filter.tag\n\tif (filter.type != 'tvslst') return filter\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 f\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 f\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", "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 { setRenderers } from './filter.renderer'\nimport { setInteractivity } from './filter.interactivity'\nimport { findItem, findParent, getFilterItemByTag, getNormalRoot } 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\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\treturn getNormalRoot(rootCopy)\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", "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}\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 { getCompInit } from '#rx'\nimport { Filter } from './FilterClass'\nimport { getNormalRoot } from './filter.utils'\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.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}\n\n\tgetState(appState) {\n\t\treturn {\n\t\t\ttermfilter: 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 rawCopy = JSON.stringify(rawFilter || f.filter)\n\t\tsuper.main(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}\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["debounce", "t", "e", "s", "r", "o", "i", "n", "l", "c", "match", "import_debounce", "id", "event", "appear", "disappear", "gmmode", "tkt", "t", "tkt", "gmmode", "appear", "disappear", "event", "types", "i", "x", "start", "stop", "ctx", "h", "color", "pad", "div", "t", "tip", "tr", "rgb", "event", "id", "i", "i", "tip", "event", "geneSymbol", "dbsnp", "event", "import_debounce", "event", "t", "t", "i", "event", "id", "i", "d", "value", "i", "i", "i", "i", "acc", "ext", "start", "final", "ext", "qmark", "star", "regExpEscape", "i", "i", "self", "filter", "t", "dtTerms", "i", "t", "self", "event", "tip", "id", "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", "self", "i", "i", "filter", "jwt", "i", "filter", "t", "i", "range", "Partjson", "i", "id", "v", "d", "i", "Partjson", "term", "data", "t", "i", "filter", "key", "id", "body", "$id", "t", "i", "key", "id", "filter", "term", "minvalue", "t", "i", "t", "event", "globImport_handlers_ts", "tab", "setRenderers", "self", "import_debounce", "setRenderers", "setInteractivity", "self", "t", "event", "i", "event", "setRenderers", "self", "event", "getId", "tip", "geneList", "tw", "id", "tip", "i", "event", "id", "self", "tw", "filter", "i", "filter", "tip", "tip2", "callback", "detail", "i", "event", "checked", "setInteractivity", "setRenderers", "self", "i", "id", "$id", "filter", "i", "setRenderers", "self", "i", "event", "filter", "t", "setInteractivity", "self", "event", "filter", "d", "i", "t", "defaults", "setInteractivity", "setRenderers", "i", "filter", "$id", "i", "setRenderers", "i", "self", "event", "filter", "match"]
|
|
7
|
+
}
|