@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
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
downloadSingleSVG
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-VB6IANQH.js";
|
|
4
4
|
import {
|
|
5
5
|
controlsInit
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-PDCHOIX4.js";
|
|
7
7
|
import {
|
|
8
8
|
fillTermWrapper,
|
|
9
9
|
fillTwLst
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-4FDOZ23V.js";
|
|
11
11
|
import {
|
|
12
12
|
icons
|
|
13
13
|
} from "./chunk-RY7CVONT.js";
|
|
14
14
|
import {
|
|
15
15
|
getCategoricalTermFilter
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-VBQBPNCJ.js";
|
|
17
17
|
import {
|
|
18
18
|
Menu
|
|
19
19
|
} from "./chunk-ASTFYDAL.js";
|
|
@@ -62,7 +62,7 @@ var profilePlot = class {
|
|
|
62
62
|
isAggregate() {
|
|
63
63
|
if (!this.state.logged) return true;
|
|
64
64
|
if (this.settings.isAggregate) return true;
|
|
65
|
-
if (this.state.sites?.length > 1 || this.state.user == "admin") return true;
|
|
65
|
+
if (this.state.sites?.length > 1 || this.state.user == "admin" || this.isRadarFacility) return true;
|
|
66
66
|
}
|
|
67
67
|
async init(appState) {
|
|
68
68
|
const config = appState.plots.find((p) => p.id === this.id);
|
|
@@ -204,7 +204,7 @@ var profilePlot = class {
|
|
|
204
204
|
});
|
|
205
205
|
if (isRadarFacility) {
|
|
206
206
|
if (!this.settings.facilitySite) this.settings.facilitySite = this.sites[0]?.value;
|
|
207
|
-
} else if (!this.settings.site && !this.settings.sites && this.state.sites?.length == 1) {
|
|
207
|
+
} else if (!this.settings.site && !this.settings.sites && this.state.sites?.length == 1 && !isAggregate) {
|
|
208
208
|
this.settings.site = this.data.sites?.[0]?.value;
|
|
209
209
|
this.settings.sites = [this.settings.site];
|
|
210
210
|
}
|
|
@@ -435,11 +435,10 @@ var profilePlot = class {
|
|
|
435
435
|
this.filterG.attr("font-size", "0.9em").append("text").attr("text-anchor", "left").style("font-weight", "bold").text(`${title} (n=${this.data.n})`).attr("transform", `translate(0, -5)`);
|
|
436
436
|
for (const tw of this.config.filterTWs) this.addFilterLegendItem(tw.term.name, this.settings[tw.term.id]);
|
|
437
437
|
const hospital = this.data.hospital;
|
|
438
|
-
if (
|
|
438
|
+
if (this.settings.site) {
|
|
439
439
|
const label = this.sites.find((s) => s.value == this.settings.site).label;
|
|
440
440
|
this.addFilterLegendItem("Facility ID", label);
|
|
441
|
-
|
|
442
|
-
this.addFilterLegendItem("Facility", hospital2);
|
|
441
|
+
this.addFilterLegendItem("Facility", hospital);
|
|
443
442
|
}
|
|
444
443
|
}
|
|
445
444
|
addFilterLegendItem(filter, value) {
|
|
@@ -575,4 +574,4 @@ export {
|
|
|
575
574
|
getDefaultProfilePlotSettings,
|
|
576
575
|
getProfileLogin
|
|
577
576
|
};
|
|
578
|
-
//# sourceMappingURL=chunk-
|
|
577
|
+
//# sourceMappingURL=chunk-IMXYAQRH.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../plots/profilePlot.js"],
|
|
4
|
+
"sourcesContent": ["import { downloadSingleSVG } from '../common/svg.download.js'\nimport { controlsInit } from './controls.js'\nimport { fillTermWrapper, fillTwLst } from '#termsetting'\nimport { select } from 'd3-selection'\nimport { getSampleFilter } from '../mass/groups.js'\nimport { Menu } from '#dom/menu'\nimport { icons as icon_functions } from '#dom/control.icons'\nimport { getCategoricalTermFilter } from '#shared/filter.js'\n\n/*\n\nThe profilePlot is the base class for all the profile plots. It handles the common functionality such as setting controls, fetching data, and initializing the plot elements.\nAll the profile plots have the same filters:\n- Region\n- Country\n- Income group\n- Facility type\n- Teaching status\n- Referral status\n- Funding source\n- Hospital volume\n- Year of implementation\n- Sites\n\nThe profileRadarFacility adds at the top of these filters the facility select as here we compare a single facility with the average scores of all the facilities aggregated\n*/\n\nconst orderedIncomes = ['Low income', 'Lower middle income', 'Upper middle income', 'High income']\nconst orderedVolumes = [\n\t'Small (1-25 annual newly diagnoses)',\n\t'Medium (26-80 annual newly diagnoses)',\n\t'Large (81-120 annual newly diagnoses)',\n\t'Very large (>120 annual newly diagnoses)'\n]\n\nexport const ABBREV_COHORT = 0\nexport const FULL_COHORT = 1\nexport class profilePlot {\n\tconstructor() {\n\t\tthis.type = 'profilePlot'\n\t\tthis.downloadCount = 0\n\t\tthis.tip = new Menu({ padding: '4px', offsetX: 10, offsetY: 15 })\n\t\tthis.scoreTerms = []\n\t\tthis.isRadarFacility = false\n\t}\n\n\tgetState(appState) {\n\t\tconst config = appState.plots.find(p => p.id === this.id)\n\t\tif (!config) throw `No plot with id='${this.id}' found`\n\t\tconst { logged, sites, user } = getProfileLogin(this.app, appState.activeCohort) //later on replace with real login info\n\t\tconst site = sites?.[0]\n\t\treturn {\n\t\t\tconfig,\n\t\t\ttermfilter: appState.termfilter,\n\t\t\tdslabel: appState.vocab.dslabel,\n\t\t\ttermdbConfig: appState.termdbConfig,\n\t\t\tvocab: appState.vocab,\n\t\t\tlogged, //later change to read login info\n\t\t\tsite,\n\t\t\tsites,\n\t\t\tuser,\n\t\t\tactiveCohort: appState.activeCohort\n\t\t}\n\t}\n\n\t//refers to the view where all the filters are shown and not the preselected site\n\tisAggregate() {\n\t\tif (!this.state.logged) return true\n\t\tif (this.settings.isAggregate) return true //marked by the user\n\t\tif (this.state.sites?.length > 1 || this.state.user == 'admin' || this.isRadarFacility) return true //multiple sites selected\n\t}\n\n\tasync init(appState) {\n\t\tconst config = appState.plots.find(p => p.id === this.id)\n\t\tconst state = this.getState(appState)\n\t\tif (this.opts.header) {\n\t\t\tlet chartName = config.chartType.match(/[A-Z][a-z]+/g)\n\t\t\tchartName = chartName.join(' ')\n\t\t\tthis.opts.header\n\t\t\t\t.style('text-transform', 'capitalize')\n\t\t\t\t.text(config.header ? config.header + ` / ${state.user}` : chartName + ` / ${state.user}`)\n\t\t}\n\t\tconst div = this.opts.holder.append('div').style('display', 'inline-block')\n\t\tconst leftDiv = div.append('div').style('display', 'inline-block').style('vertical-align', 'top')\n\n\t\tconst rightDiv = div.append('div').style('display', 'inline-block').style('vertical-align', 'top')\n\n\t\tconst controlsDiv = leftDiv.append('div').style('display', 'inline-block').style('font-size', '0.9em')\n\t\tconst iconsDiv = leftDiv.append('div').style('margin-left', '6px').style('margin-top', '15px')\n\n\t\tconst holder = rightDiv.insert('div').style('display', 'inline-block')\n\n\t\tconst plotDiv = holder.append('div')\n\t\tthis.dom = {\n\t\t\tcontrolsDiv,\n\t\t\tholder,\n\t\t\ticonsDiv,\n\t\t\trightDiv,\n\t\t\tplotDiv\n\t\t}\n\t\tselect('.sjpp-output-sandbox-content').on('scroll', event => {\n\t\t\tif (this.onMouseOut) this.onMouseOut(event)\n\t\t})\n\t\tthis.dom.rightDiv.on('mousemove', event => this.onMouseOver(event))\n\t\tthis.dom.rightDiv.on('mouseleave', event => this.onMouseOut(event))\n\t\tthis.dom.rightDiv.on('mouseout', event => this.onMouseOut(event))\n\n\t\tdocument.addEventListener('scroll', () => this?.tip?.hide())\n\t\ticon_functions['pdf'](iconsDiv.append('div').style('padding', '0px 5px 15px 5px'), {\n\t\t\ttitle: 'Prints page, select Save as PDF in the options to download as a pdf',\n\t\t\thandler: () => {\n\t\t\t\twindow.print()\n\t\t\t}\n\t\t})\n\t\t//later on show table for the profileForms\n\t\tif (this.type != 'profileBarchart' && this.type != 'profileForms') {\n\t\t\tconst tableIconDiv = iconsDiv.append('div').style('padding-bottom', '15px')\n\t\t\tthis.dom.tableBt = tableIconDiv\n\t\t\t\t.append('button')\n\t\t\t\t.attr('data-testid', 'sjpp-profile-table-button')\n\t\t\t\t.style('border', 'none')\n\t\t\t\t.style('background-color', 'rgb(207, 226, 243)')\n\t\t\ticon_functions['table'](this.dom.tableBt, { title: 'Show table with data' })\n\t\t\tthis.dom.tableBt.on('click', () => {\n\t\t\t\tconst show = !this.settings.showTable\n\t\t\t\tthis.dom.tableBt.style('background-color', show ? 'rgb(207, 226, 243)' : 'transparent')\n\t\t\t\tthis.showTable(show)\n\t\t\t})\n\t\t}\n\t\ticon_functions['restart'](iconsDiv.append('div').style('padding', '0px 5px 15px 5px'), {\n\t\t\ttitle: 'Clear filters',\n\t\t\thandler: async () => {\n\t\t\t\tthis.clearFiltersExcept([])\n\t\t\t\tthis.app.dispatch({\n\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\tid: this.id,\n\t\t\t\t\tconfig: { filter: this.getFilter(), settings: { [this.type]: this.settings } }\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\ticon_functions['add'](iconsDiv.append('div').style('padding', '3px'), {\n\t\t\ttitle: 'Open a new plot',\n\t\t\thandler: async () => {\n\t\t\t\tlet config = structuredClone(this.config)\n\t\t\t\tconfig.insertBeforeId = this.id\n\t\t\t\tthis.app.dispatch({\n\t\t\t\t\ttype: 'plot_create',\n\t\t\t\t\tconfig\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t}\n\n\tonMouseOut(event) {\n\t\tthis.tip.hide()\n\t}\n\n\tasync showTable(show) {\n\t\tthis.settings.showTable = show\n\t\tawait this.app.dispatch({ type: 'plot_edit', id: this.id, config: { settings: { [this.type]: this.settings } } })\n\t}\n\n\tasync main() {\n\t\tthis.config = JSON.parse(JSON.stringify(this.state.config))\n\t\tthis.settings = this.config.settings[this.type]\n\t\tif (this.dom.tableBt)\n\t\t\tthis.dom.tableBt.style('background-color', this.settings.showTable ? 'rgb(207, 226, 243)' : 'transparent')\n\t}\n\n\tasync setControls(additionalInputs = []) {\n\t\tconst isRadarFacility = this.isRadarFacility\n\t\tconst filters = {}\n\t\tfor (const tw of this.config.filterTWs) {\n\t\t\tconst filter = getCategoricalTermFilter(this.config.filterTWs, this.settings, tw, this.state.termfilter.filter)\n\n\t\t\tif (filter) filters[tw.term.id] = filter\n\t\t}\n\t\tthis.filteredTermValues = await this.app.vocabApi.filterTermValues({\n\t\t\tterms: this.config.filterTWs,\n\t\t\tfilters\n\t\t})\n\t\tthis.regions = this.filteredTermValues[this.config.regionTW.id]\n\t\tthis.countries = this.filteredTermValues[this.config.countryTW.id]\n\t\tthis.incomes = this.filteredTermValues[this.config.incomeTW.id]\n\t\tthis.teachingStates = this.filteredTermValues[this.config.teachingStatusTW.id]\n\t\tthis.referralStates = this.filteredTermValues[this.config.referralStatusTW.id]\n\t\tthis.fundingSources = this.filteredTermValues[this.config.fundingSourceTW.id]\n\t\tthis.hospitalVolumes = this.filteredTermValues[this.config.hospitalVolumeTW.id]\n\t\tthis.yearsOfImplementation = this.filteredTermValues[this.config.yearOfImplementationTW.id]\n\n\t\tthis.incomes.sort((elem1, elem2) => {\n\t\t\tconst i1 = orderedIncomes.indexOf(elem1.value)\n\t\t\tconst i2 = orderedIncomes.indexOf(elem2.value)\n\t\t\tif (i1 < i2) return -1\n\t\t\treturn 1\n\t\t})\n\t\tthis.hospitalVolumes.sort((elem1, elem2) => {\n\t\t\tconst i1 = orderedVolumes.indexOf(elem1.value)\n\t\t\tconst i2 = orderedVolumes.indexOf(elem2.value)\n\t\t\tif (i1 < i2) return -1\n\t\t\treturn 1\n\t\t})\n\t\tthis.types = this.filteredTermValues[this.config.typeTW.id]\n\t\tthis.filter = this.config.filter || this.getFilter()\n\n\t\tconst isAggregate = this.isAggregate()\n\t\tif (this.type != 'profileForms')\n\t\t\tthis.data = await this.app.vocabApi.getProfileScores({\n\t\t\t\tscoreTerms: this.scoreTerms,\n\t\t\t\tfilter: this.filter,\n\t\t\t\tisAggregate,\n\t\t\t\tsites: this.settings.sites,\n\t\t\t\tuserSites: this.state.sites,\n\t\t\t\tfacilityTW: this.config.facilityTW\n\t\t\t})\n\t\telse\n\t\t\tthis.data = await this.app.vocabApi.getProfileFormScores({\n\t\t\t\tscoreTerms: this.scoreTerms,\n\t\t\t\tscScoreTerms: this.scScoreTerms,\n\t\t\t\tfilter: this.filter,\n\t\t\t\tisAggregate,\n\t\t\t\tsites: this.settings.sites,\n\t\t\t\tuserSites: this.state.sites,\n\t\t\t\tfacilityTW: this.config.facilityTW\n\t\t\t})\n\t\tthis.sites = this.data.sites\n\t\tthis.sites.sort((a, b) => {\n\t\t\treturn a.label.localeCompare(b.label)\n\t\t})\n\t\tif (isRadarFacility) {\n\t\t\tif (!this.settings.facilitySite) this.settings.facilitySite = this.sites[0]?.value //set the first site as the facility site\n\t\t} else if (!this.settings.site && !this.settings.sites && this.state.sites?.length == 1 && !isAggregate) {\n\t\t\tthis.settings.site = this.data.sites?.[0]?.value\n\t\t\tthis.settings.sites = [this.settings.site] //set sites to the single site\n\t\t}\n\t\tif (this.settings.sites)\n\t\t\tfor (const site of this.settings.sites) {\n\t\t\t\tconst siteOption = this.sites.find(s => s.value == site)\n\t\t\t\tif (siteOption) siteOption.selected = true //mark selected sites\n\t\t\t}\n\t\tconst chartType = this.type\n\t\tthis.dom.controlsDiv.selectAll('*').remove()\n\t\tlet inputs = []\n\t\tif (this.state.sites?.length == 1 && !isRadarFacility) {\n\t\t\tconst dataInput = {\n\t\t\t\tlabel: 'Data',\n\t\t\t\ttype: 'radio',\n\t\t\t\tchartType,\n\t\t\t\tsettingsKey: 'isAggregate',\n\t\t\t\tstyles: { display: 'inline-block' },\n\t\t\t\toptions: [\n\t\t\t\t\t{ label: this.state.site, value: false },\n\t\t\t\t\t{ label: 'Aggregate', value: true }\n\t\t\t\t],\n\t\t\t\tcallback: isAggregate => {\n\t\t\t\t\tthis.settings.isAggregate = isAggregate\n\t\t\t\t\tconst id = this.sites.find(s => s.label == this.state.site)?.value\n\t\t\t\t\tisAggregate ? this.setSite('') : this.setSite(id)\n\t\t\t\t}\n\t\t\t}\n\t\t\tinputs.push(dataInput)\n\t\t}\n\t\tif (isAggregate || isRadarFacility) {\n\t\t\tinputs.push(\n\t\t\t\t...[\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Region',\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.regionTW.term.id,\n\t\t\t\t\t\toptions: this.regions,\n\t\t\t\t\t\tcallback: value => this.setRegion(value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Country',\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.countryTW.term.id,\n\t\t\t\t\t\toptions: this.countries,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.countryTW.term.id, value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Income group',\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.incomeTW.term.id,\n\t\t\t\t\t\toptions: this.incomes,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.incomeTW.term.id, value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Facility type',\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.typeTW.term.id,\n\t\t\t\t\t\toptions: this.types,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.typeTW.term.id, value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: this.config.teachingStatusTW.term.name,\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.teachingStatusTW.term.id,\n\t\t\t\t\t\toptions: this.teachingStates,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.teachingStatusTW.term.id, value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: this.config.referralStatusTW.term.name,\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.referralStatusTW.term.id,\n\t\t\t\t\t\toptions: this.referralStates,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.referralStatusTW.term.id, value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: this.config.fundingSourceTW.term.name,\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.fundingSourceTW.term.id,\n\t\t\t\t\t\toptions: this.fundingSources,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.fundingSourceTW.term.id, value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: this.config.hospitalVolumeTW.term.name,\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.hospitalVolumeTW.term.id,\n\t\t\t\t\t\toptions: this.hospitalVolumes,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.hospitalVolumeTW.term.id, value)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: this.config.yearOfImplementationTW.term.name,\n\t\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\t\tchartType,\n\t\t\t\t\t\tsettingsKey: this.config.yearOfImplementationTW.term.id,\n\t\t\t\t\t\toptions: this.yearsOfImplementation,\n\t\t\t\t\t\tcallback: value => this.setFilterValue(this.config.yearOfImplementationTW.term.id, value)\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t)\n\t\t}\n\t\tif (this.state.logged) {\n\t\t\tif (isAggregate && (this.state.sites?.length > 1 || this.state.user == 'admin')) {\n\t\t\t\tconst sitesInput = {\n\t\t\t\t\tlabel: 'Sites',\n\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\tchartType,\n\t\t\t\t\toptions: this.sites,\n\t\t\t\t\tmultiple: true,\n\t\t\t\t\tcallback: values => {\n\t\t\t\t\t\tthis.setSites(values)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tinputs.push(sitesInput)\n\t\t\t}\n\t\t\tif (isRadarFacility) {\n\t\t\t\tthis.sampleData = await this.app.vocabApi.getProfileScores({\n\t\t\t\t\tterms: [...this.twLst, this.config.facilityTW], //added facility term to all the plots to get the hospital name\n\t\t\t\t\tscoreTerms: this.scoreTerms,\n\t\t\t\t\tfilter: this.filter,\n\t\t\t\t\tisAggregate: true,\n\t\t\t\t\tsite: this.settings.facilitySite,\n\t\t\t\t\tuserSites: this.state.sites,\n\t\t\t\t\tfacilityTW: this.config.facilityTW\n\t\t\t\t})\n\t\t\t\tthis.facilitySites = this.sampleData.sites\n\t\t\t\tthis.facilitySites.sort((a, b) => {\n\t\t\t\t\treturn a.label.localeCompare(b.label)\n\t\t\t\t})\n\t\t\t\tthis.facilitySites.find(s => s.value == this.settings.facilitySite).selected = true //mark selected facility site\n\n\t\t\t\tinputs.unshift({\n\t\t\t\t\tlabel: 'Facility site',\n\t\t\t\t\ttype: 'dropdown',\n\t\t\t\t\tchartType,\n\t\t\t\t\toptions: this.facilitySites,\n\t\t\t\t\tcallback: value => {\n\t\t\t\t\t\tthis.setFacilitySite(value)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tinputs.unshift(...additionalInputs)\n\t\tthis.components = {\n\t\t\tcontrols: await controlsInit({\n\t\t\t\tapp: this.app,\n\t\t\t\tid: this.id,\n\t\t\t\tholder: this.dom.controlsDiv,\n\t\t\t\tinputs,\n\t\t\t\ttitle: 'Filters'\n\t\t\t})\n\t\t}\n\t\tthis.components.controls.on(`downloadClick.${chartType}`, () =>\n\t\t\tdownloadSingleSVG(this.dom.svg, this.getDownloadFilename(), this.dom.holder.node())\n\t\t)\n\t\tthis.components.controls.on(`helpClick.${chartType}`, () => {\n\t\t\tconst activeCohort = this.state.activeCohort\n\t\t\tlet link\n\t\t\tif (activeCohort == ABBREV_COHORT) {\n\t\t\t\tif (chartType == 'profileBarchart')\n\t\t\t\t\tlink = 'https://global.stjude.org/content/dam/global/en-us/documents/no-index/bar-graph-abbr-profiledash.pdf'\n\t\t\t\telse if (chartType == 'profilePolar')\n\t\t\t\t\tlink =\n\t\t\t\t\t\t'https://global.stjude.org/content/dam/global/en-us/documents/no-index/polar-graph-abbr-profiledash.pdf'\n\t\t\t\telse if (chartType.startsWith('profileRadar'))\n\t\t\t\t\tlink = 'https://global.stjude.org/content/dam/global/en-us/documents/no-index/radar-abbr-profiledash.pdf'\n\t\t\t} else if (activeCohort == FULL_COHORT) {\n\t\t\t\tif (chartType == 'profileBarchart')\n\t\t\t\t\tlink = 'https://global.stjude.org/content/dam/global/en-us/documents/no-index/bar-graph-full-profiledash.pdf'\n\t\t\t\telse if (chartType == 'profilePolar')\n\t\t\t\t\tlink =\n\t\t\t\t\t\t'https://global.stjude.org/content/dam/global/en-us/documents/no-index/polar-graph-full-profiledash.pdf'\n\t\t\t\telse if (chartType.startsWith('profileRadar'))\n\t\t\t\t\tlink = 'https://global.stjude.org/content/dam/global/en-us/documents/no-index/radar-full-profiledash.pdf'\n\t\t\t}\n\t\t\tif (link) window.open(link)\n\t\t})\n\t\tthis.filtersCount = 0\n\t}\n\n\tsetFilterValue(key, value) {\n\t\tconst config = this.config\n\t\tthis.settings[key] = value\n\t\tthis.settings.site = '' //always clear site when a filter is changed\n\t\tthis.settings.sites = null //clear sites\n\t\tconfig.filter = this.getFilter()\n\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config: this.config })\n\t}\n\n\tgetFilter() {\n\t\treturn getCategoricalTermFilter(this.config.filterTWs, this.settings, null, this.state.termfilter.filter)\n\t}\n\n\tsetRegion(region) {\n\t\tconst config = this.config\n\t\tthis.settings[config.regionTW.term.id] = region\n\t\tthis.clearFiltersExcept([config.regionTW.term.id])\n\t\tconfig.filter = this.getFilter()\n\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config })\n\t}\n\n\tclearFiltersExcept(ids) {\n\t\tfor (const tw of this.config.filterTWs) if (!ids.includes(tw.term.id)) this.settings[tw.term.id] = ''\n\t\tthis.settings.site = ''\n\t\tthis.settings.sites = null //clear sites\n\t}\n\n\tsetSite(site) {\n\t\tthis.settings.site = site\n\t\tthis.settings.sites = null //clear sites\n\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config: this.config })\n\t}\n\n\tsetFacilitySite(site) {\n\t\tthis.settings.facilitySite = site\n\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config: this.config })\n\t}\n\n\tsetSites(sites) {\n\t\tif (sites && sites.length == 1) this.settings.site = sites[0] //if only one site selected, set it as the site\n\t\tthis.settings.sites = sites?.map(s => Number(s))\n\t\tif (this.settings.sites.length > 1) this.settings.site = '' //clear site\n\t\telse if (this.settings.sites.length == 1) this.settings.site = this.settings.sites[0] //set site to the single site\n\t\tthis.app.dispatch({ type: 'plot_edit', id: this.id, config: this.config })\n\t}\n\n\taddFilterLegend() {\n\t\tconst hasFilters = this.config.filterTWs.some(tw => this.settings[tw.term.id]) || this.settings.sites?.length > 0\n\t\tconst title = hasFilters ? 'Filters' : 'No filter applied'\n\t\tthis.filterG\n\t\t\t.attr('font-size', '0.9em')\n\t\t\t.append('text')\n\t\t\t.attr('text-anchor', 'left')\n\t\t\t.style('font-weight', 'bold')\n\t\t\t.text(`${title} (n=${this.data.n})`)\n\t\t\t.attr('transform', `translate(0, -5)`)\n\t\tfor (const tw of this.config.filterTWs) this.addFilterLegendItem(tw.term.name, this.settings[tw.term.id])\n\t\tconst hospital = this.data.hospital\n\t\tif (this.settings.site) {\n\t\t\tconst label = this.sites.find(s => s.value == this.settings.site).label\n\t\t\tthis.addFilterLegendItem('Facility ID', label)\n\t\t\tthis.addFilterLegendItem('Facility', hospital)\n\t\t}\n\t}\n\n\taddFilterLegendItem(filter, value) {\n\t\tif (!value) return\n\t\tthis.filtersCount++\n\n\t\tconst itemG = this.filterG.append('g').attr('font-size', '0.95em')\n\t\tconst text = itemG\n\t\t\t.append('text')\n\t\t\t.attr('transform', `translate(0, ${this.filtersCount * 22})`)\n\t\t\t.attr('text-anchor', 'left')\n\t\ttext.append('tspan').attr('font-size', 'bold').text(filter)\n\t\ttext.append('tspan').text(`: ${value ? value : 'None'}`)\n\t}\n\n\taddEndUserImpressionNote(uiG) {\n\t\tuiG.attr('font-size', '0.9em')\n\t\tlet textElem = uiG.append('text').attr('transform', `translate(0, 115)`)\n\t\ttextElem.append('tspan').attr('font-weight', 'bold').text('End-user Impression: ')\n\t\ttextElem.append('tspan').text('It is provided by the local liaison who completed the assessment ')\n\t\tuiG\n\t\t\t.append('text')\n\t\t\t.attr('transform', `translate(0, 140)`)\n\t\t\t.text('in consultation with the PHO medical director or directly by the PHO medical director.')\n\t\tuiG\n\t\t\t.append('text')\n\t\t\t.attr('transform', `translate(0, 165)`)\n\t\t\t.text('The end-user was asked to rate the current status of the domains and subdomains included.')\n\t}\n\n\taddPOCNote(uiG) {\n\t\tuiG.attr('font-size', '0.9em')\n\t\tlet textElem = uiG.append('text').attr('transform', `translate(0, 115)`)\n\t\ttextElem.append('tspan').attr('font-weight', 'bold').text('Point of Care (POC) Staff: ')\n\t\ttextElem.append('tspan').text('All members of the assessment team, ')\n\t\tuiG\n\t\t\t.append('text')\n\t\t\t.attr('transform', `translate(0, 140)`)\n\t\t\t.text('excluding the Site Coordinator. POC staff provide subjective information based ')\n\t\tuiG\n\t\t\t.append('text')\n\t\t\t.attr('transform', `translate(0, 165)`)\n\t\t\t.text('on their experience and perception about service delivery at the PHO facility.')\n\t}\n\n\taddLegendItem(category, description, index) {\n\t\tconst text = this.legendG\n\t\t\t.append('text')\n\t\t\t.attr('font-size', '0.9em')\n\t\t\t.attr('transform', `translate(0, ${index * 20})`)\n\t\t\t.attr('text-anchor', 'left')\n\t\ttext.append('tspan').attr('font-weight', 'bold').text(category)\n\t\ttext.append('tspan').text(`: ${description}`)\n\t}\n\n\tgetDownloadFilename() {\n\t\tthis.downloadCount++\n\t\tlet filename = `${this.type}${this.downloadCount}.svg`\n\t\tfilename = filename.split(' ').join('_')\n\t\treturn filename\n\t}\n\n\tgetPercentage(d) {\n\t\tif (!d) return 0\n\t\tconst score = this.data.term2Score[d.score.term.id]\n\t\treturn score\n\t}\n}\n\nexport function makeChartBtnMenu(holder, chartsInstance, chartType) {\n\t/*\n\tholder: the holder in the tooltip\n\tchartsInstance: MassCharts instance\n\t\ttermdbConfig is accessible at chartsInstance.state.termdbConfig{}\n\t\tmass option is accessible at chartsInstance.app.opts{}\n\t*/\n\tconst state = chartsInstance.state\n\tconst key = state.activeCohort == FULL_COHORT ? 'full' : 'abbrev'\n\tconst typeConfig = state.termdbConfig?.plotConfigByCohort[key][chartType]\n\tif (typeConfig.options.length == 1) {\n\t\tcreatePlot(typeConfig.options[0], chartType, chartsInstance)\n\t\treturn\n\t}\n\tconst menuDiv = holder.append('div')\n\tfor (const plotConfig of typeConfig.options) {\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(plotConfig.title)\n\t\t\t.on('click', () => {\n\t\t\t\tcreatePlot(plotConfig, chartType, chartsInstance)\n\t\t\t\tchartsInstance.dom.tip.hide()\n\t\t\t})\n\t}\n\n\tfunction createPlot(plotConfig, chartType, chartsInstance) {\n\t\tlet config = structuredClone(plotConfig)\n\t\tconfig.chartType = chartType\n\t\tconfig.header = chartType == 'profileRadarFacility' ? 'Facility Radar Graph' : 'Radar Graph'\n\t\tchartsInstance.app.dispatch({\n\t\t\ttype: 'plot_create',\n\t\t\tchartType,\n\t\t\tconfig\n\t\t})\n\t}\n}\n\nexport async function getProfilePlotConfig(activeCohort, app, opts) {\n\tconst key = activeCohort == FULL_COHORT ? 'full' : 'abbrev'\n\tconst config = app.vocabApi.termdbConfig?.plotConfigByCohort[key]?.[opts.chartType]\n\tif (!config) throw `No data available for the plot ${opts.chartType} in this dataset`\n\tconst cohortPreffix = activeCohort == FULL_COHORT ? 'F' : 'A'\n\tconfig.facilityTW = { id: cohortPreffix + 'facility' } //All the plots want the facility term to show the hospital name if a site is selected\n\tawait fillTermWrapper(config.facilityTW, app.vocabApi)\n\tawait loadFilterTerms(config, activeCohort, app)\n\treturn structuredClone(config)\n}\n\nexport async function loadFilterTerms(config, activeCohort, app) {\n\tconst cohortPreffix = activeCohort == FULL_COHORT ? 'F' : 'A'\n\tconfig.countryTW = { id: cohortPreffix + 'country' }\n\tconfig.regionTW = { id: cohortPreffix + 'WHO_region' }\n\tconfig.incomeTW = { id: cohortPreffix + 'Income_group' }\n\tconfig.typeTW = { id: cohortPreffix + 'FC_TypeofFacility' }\n\tconfig.teachingStatusTW = { id: cohortPreffix + 'FC_TeachingFacility' }\n\tconfig.referralStatusTW = { id: cohortPreffix + 'FC_ReferralFacility' }\n\tconfig.fundingSourceTW = { id: cohortPreffix + 'FC_FundingSrc' }\n\t//config.annualDiagnosisNumber = {id: 'PO_TotalDxAll'}\n\tconfig.hospitalVolumeTW = { id: cohortPreffix + 'PO_HospitalVolume' }\n\tconfig.yearOfImplementationTW = { id: cohortPreffix + 'Year_implementation' }\n\n\tconst filterTWs = [\n\t\tconfig.countryTW,\n\t\tconfig.regionTW,\n\t\tconfig.incomeTW,\n\t\tconfig.typeTW,\n\t\tconfig.teachingStatusTW,\n\t\tconfig.referralStatusTW,\n\t\tconfig.fundingSourceTW,\n\t\tconfig.hospitalVolumeTW,\n\t\tconfig.yearOfImplementationTW\n\t]\n\tawait fillTwLst(filterTWs, app.vocabApi)\n\tconfig.filterTWs = filterTWs\n}\n\nexport function clearLocalFilters(plot) {\n\tplot.settings = getDefaultProfilePlotSettings()\n}\n\nexport function getDefaultProfilePlotSettings() {\n\treturn {\n\t\tisAggregate: false,\n\t\tshowTable: true\n\t}\n}\n\nexport function getProfileLogin(app, cohort = FULL_COHORT) {\n\tconst auth = app.vocabApi.getClientAuthResult()\n\tif (!auth) return { logged: false, sites: [], user: 'public' }\n\tconst auth_info = cohort == FULL_COHORT ? auth.full : auth.abbrev\n\tconst logged = auth_info?.role != 'public'\n\tif (!auth_info) return { logged: false, sites: [], user: 'public' } //no login info for the cohort, treat it as not logged in, public view for that cohort\n\tconst user = auth_info?.role || 'public'\n\tconst sites = user == 'admin' ? null : auth_info.sites //site only matters if you are not admin\n\treturn { logged, sites, user }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config", "isAggregate", "chartType", "chartsInstance"]
|
|
7
|
+
}
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
controlsInit,
|
|
9
9
|
renderTerm1Label,
|
|
10
10
|
term0_term2_defaultQ
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-PDCHOIX4.js";
|
|
12
12
|
import {
|
|
13
13
|
fillTermWrapper,
|
|
14
14
|
filterJoin,
|
|
@@ -20,10 +20,10 @@ import {
|
|
|
20
20
|
renderTable,
|
|
21
21
|
svgLegend,
|
|
22
22
|
to_svg
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-4FDOZ23V.js";
|
|
24
24
|
import {
|
|
25
25
|
isNumericTerm
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-5VX3CXQ3.js";
|
|
27
27
|
import {
|
|
28
28
|
copyMerge,
|
|
29
29
|
getCompInit
|
|
@@ -32,7 +32,7 @@ import {
|
|
|
32
32
|
getColors,
|
|
33
33
|
mclass,
|
|
34
34
|
plotColor
|
|
35
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-VBQBPNCJ.js";
|
|
36
36
|
import {
|
|
37
37
|
roundValueAuto
|
|
38
38
|
} from "./chunk-5OHXYXLD.js";
|
|
@@ -431,14 +431,15 @@ async function listSamples(event, self, seriesId, dataId, chartId) {
|
|
|
431
431
|
}
|
|
432
432
|
const opts = {
|
|
433
433
|
terms,
|
|
434
|
-
filter: filterJoin([self.state.termfilter.filter, tvslst])
|
|
434
|
+
filter: filterJoin([self.state.termfilter.filter, tvslst]),
|
|
435
|
+
filter0: self.state.termfilter.filter0
|
|
435
436
|
};
|
|
436
437
|
const data = await self.app.vocabApi.getAnnotatedSampleData(opts);
|
|
437
438
|
const rows = [];
|
|
438
439
|
const termIsNumeric = isNumericTerm(self.config.term.term);
|
|
439
440
|
const term2isNumeric = self.config.term2 ? isNumericTerm(self.config.term2.term) : false;
|
|
440
441
|
for (const sample of data.lst) {
|
|
441
|
-
const sampleName = data.refs.bySampleId[
|
|
442
|
+
const sampleName = data.refs.bySampleId[sample.sample].label;
|
|
442
443
|
const row = [{ value: sampleName }];
|
|
443
444
|
if (self.config.term.q?.hiddenValues && `${sample[self.config.term.$id].key}` in self.config.term.q.hiddenValues)
|
|
444
445
|
continue;
|
|
@@ -475,7 +476,7 @@ async function listSamples(event, self, seriesId, dataId, chartId) {
|
|
|
475
476
|
menu.show(event.clientX, event.clientY, false);
|
|
476
477
|
function getTvs(termIndex, value) {
|
|
477
478
|
const term = termIndex == 0 ? self.config.term0 : termIndex == 1 ? self.config.term : self.config.term2;
|
|
478
|
-
|
|
479
|
+
let tvs = {
|
|
479
480
|
type: "tvs",
|
|
480
481
|
tvs: {
|
|
481
482
|
term: term.term,
|
|
@@ -486,6 +487,33 @@ async function listSamples(event, self, seriesId, dataId, chartId) {
|
|
|
486
487
|
const bins = self.bins[termIndex];
|
|
487
488
|
tvs.tvs.ranges = [bins.find((bin) => bin.label == value)];
|
|
488
489
|
}
|
|
490
|
+
if (term.term.type == "geneVariant") {
|
|
491
|
+
const termdbmclass = self.app.vocabApi.termdbConfig?.mclass;
|
|
492
|
+
if (termIndex === 1) {
|
|
493
|
+
const dtTerm = self.chartid2dtterm[chartId];
|
|
494
|
+
let key;
|
|
495
|
+
if (termdbmclass) {
|
|
496
|
+
key = Object.keys(termdbmclass).find((k) => termdbmclass[k].label == value);
|
|
497
|
+
}
|
|
498
|
+
if (!key) {
|
|
499
|
+
key = Object.keys(mclass).find((k) => mclass[k].label == value);
|
|
500
|
+
}
|
|
501
|
+
tvs = {
|
|
502
|
+
type: "tvs",
|
|
503
|
+
tvs: {
|
|
504
|
+
term: dtTerm,
|
|
505
|
+
values: [{ key }],
|
|
506
|
+
includeNotTested: true
|
|
507
|
+
// to be able to list not tested samples
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
} else {
|
|
511
|
+
const groups = term.q.customset?.groups;
|
|
512
|
+
if (!groups || !Array.isArray(groups)) throw "groups[] is missing";
|
|
513
|
+
const group = groups.find((group2) => group2.name == value);
|
|
514
|
+
tvs = group.filter;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
489
517
|
return tvs;
|
|
490
518
|
}
|
|
491
519
|
}
|
|
@@ -520,7 +548,7 @@ function menuoption_select_to_gp(self, tvslst) {
|
|
|
520
548
|
const item = findItemByTermId(self.state.termfilter.filter, t.tvs.term.id);
|
|
521
549
|
if (!item) lst.push(wrapTvs(t));
|
|
522
550
|
}
|
|
523
|
-
import("./block-
|
|
551
|
+
import("./block-QBZZCTQE.js").then(async (_) => {
|
|
524
552
|
const obj = {
|
|
525
553
|
genome: self.app.opts.genome,
|
|
526
554
|
dslabel: self.state.dslabel
|
|
@@ -918,6 +946,7 @@ var Barchart = class {
|
|
|
918
946
|
const data = results.data;
|
|
919
947
|
this.sampleType = results.sampleType;
|
|
920
948
|
this.bins = results.bins;
|
|
949
|
+
if (results.chartid2dtterm) this.chartid2dtterm = results.chartid2dtterm;
|
|
921
950
|
this.toggleLoadingDiv("none");
|
|
922
951
|
this.app.vocabApi.syncTermData(this.config, data, this.prevConfig);
|
|
923
952
|
this.currServerData = data;
|
|
@@ -1600,4 +1629,4 @@ export {
|
|
|
1600
1629
|
getHandlers,
|
|
1601
1630
|
hideCategory
|
|
1602
1631
|
};
|
|
1603
|
-
//# sourceMappingURL=chunk-
|
|
1632
|
+
//# sourceMappingURL=chunk-JR37IU5O.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../plots/barchart.events.js", "../plots/barchart.js"],
|
|
4
|
+
"sourcesContent": ["import { Menu, renderTable } from '#dom'\nimport { dofetch3 } from '../common/dofetch'\nimport { newpane, export_data } from '../src/client'\nimport { filterJoin, getFilterItemByTag, getNormalRoot, findItemByTermId, normalizeProps } from '#filter'\nimport { rgb } from 'd3-color'\nimport { roundValueAuto } from '#shared/roundValue.js'\nimport { isNumericTerm } from '#shared/terms.js'\nimport { negateTermLabel } from './barchart'\nimport { mclass } from '#shared/common.js'\n\nexport default function getHandlers(self) {\n\tconst tip = new Menu({ padding: '5px' })\n\tself.dom.tip = tip\n\tconst s = self.settings\n\n\tfunction barLabelClickHandler(event) {\n\t\t// same handler for row label click in horziontal orientation\n\t\t// or col label click in vertical orientation, since\n\t\t// row/column labels only apply to bars\n\t\tconst d = event.target.__data__\n\t\tif (d === undefined) return\n\t\tconst termNum = d.type == 'col' ? 'term' : 'term2'\n\t\tconst term = self.config.term\n\t\tself.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: self.id,\n\t\t\tconfig: {\n\t\t\t\tterm: {\n\t\t\t\t\t//Fix for list samples options not working\n\t\t\t\t\t//after hiding a category\n\t\t\t\t\t$id: term?.$id,\n\t\t\t\t\tid: term.id,\n\n\t\t\t\t\tisAtomic: true,\n\t\t\t\t\tterm: term.term,\n\t\t\t\t\tq: getUpdatedQfromClick(d, term, true)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\treturn {\n\t\tchart: {\n\t\t\ttitle(chart) {\n\t\t\t\tif (!self.config.term0) return chart.chartId\n\t\t\t\treturn self.config.term0.term.values && chart.chartId in self.config.term0.term.values\n\t\t\t\t\t? self.config.term0.term.values[chart.chartId].label\n\t\t\t\t\t: chart.chartId\n\t\t\t}\n\t\t},\n\t\tsvg: {\n\t\t\tmouseout: () => {\n\t\t\t\ttip.hide()\n\t\t\t}\n\t\t},\n\t\tseries: {\n\t\t\tmouseover(event, d) {\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tlet percent = self.config.term2 ? (d.total / d.seriesTotal) * 100 : (d.seriesTotal / d.chartTotal) * 100\n\t\t\t\tpercent = percent.toFixed(1)\n\t\t\t\tconst t1 = self.config.term.term\n\t\t\t\tconst t2 = self.config.term2 && self.config.term2.term\n\t\t\t\tconst term1unit = t1.unit\n\t\t\t\tconst seriesLabel =\n\t\t\t\t\t(t1.values && d.seriesId in t1.values ? t1.values[d.seriesId].label : d.seriesId) +\n\t\t\t\t\t(t1.unit ? ' ' + t1.unit : '')\n\t\t\t\tconst dataLabel =\n\t\t\t\t\t(t2 && t2.values && d.dataId in t2.values ? t2.values[d.dataId].label : d.dataId) +\n\t\t\t\t\t(t2 && t2.unit ? ' ' + t2.unit : '')\n\t\t\t\tconst icon = !t2\n\t\t\t\t\t? ''\n\t\t\t\t\t: \"<div style='display:inline-block; width:14px; height:14px; margin: 2px 3px; vertical-align:top; background:\" +\n\t\t\t\t\t d.color +\n\t\t\t\t\t \"'> </div>\"\n\t\t\t\tconst rows = [`<tr><td colspan=2 style='padding:3px; text-align:center'>${seriesLabel}</td></tr>`]\n\t\t\t\tif (t2) {\n\t\t\t\t\trows.push(\n\t\t\t\t\t\t`<tr><td colspan=2 style='padding:3px; text-align:center'>${icon} <span>${dataLabel}</span></td></tr>`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\trows.push(\n\t\t\t\t\t`<tr><td style='padding:3px; color:#aaa'>#Individuals</td><td style='padding:3px; text-align:center'>${d.total}</td></tr>`,\n\t\t\t\t\t`<tr><td style='padding:3px; color:#aaa'>percent</td><td style='padding:3px; text-align:center'>${percent}%</td></tr>`\n\t\t\t\t)\n\n\t\t\t\t//mouse-over p-value and 2x2 table\n\t\t\t\tif (t2) {\n\t\t\t\t\tconst pvalue = d.groupPvalues?.term2tests?.find(x => x.term2id === d.dataId).pvalue\n\t\t\t\t\tconst term1Label = d.groupPvalues.term1Label\n\t\t\t\t\tconst term2Label = d.groupPvalues.term2tests.find(x => x.term2id === d.dataId).term2Label\n\t\t\t\t\tconst tableValues = d.groupPvalues.term2tests.find(x => x.term2id === d.dataId).tableValues\n\t\t\t\t\tconst skipped = d.groupPvalues.term2tests.find(x => x.term2id === d.dataId).skipped\n\n\t\t\t\t\t// when term1 has only 2 categories, Row2 would be the other category instead of \"not Row1\"\n\t\t\t\t\tconst negateTerm1Label = !(\n\t\t\t\t\t\tself.settings.cols.length - self.settings.exclude.cols.length == 2 &&\n\t\t\t\t\t\tself.chartsData.tests[d.chartId].length == 2\n\t\t\t\t\t)\n\t\t\t\t\t\t? negateTermLabel(term1Label)\n\t\t\t\t\t\t: self.chartsData.tests[d.chartId][0].term1Label == term1Label\n\t\t\t\t\t\t? self.chartsData.tests[d.chartId][1].term1Label\n\t\t\t\t\t\t: self.chartsData.tests[d.chartId][0].term1Label\n\n\t\t\t\t\tlet negateTerm2Label = negateTermLabel(term2Label)\n\t\t\t\t\tif (self.settings.rows.length - self.settings.exclude.rows.length == 2) {\n\t\t\t\t\t\t// when term2 has only 2 visible categories, Col2 would be the other category instead of \"not Col1\"\n\t\t\t\t\t\tconst visibleTerm2CatsKeys = self.settings.rows.filter(row => !self.settings.exclude.rows.includes(row))\n\t\t\t\t\t\tconst visibleTerm2Labels = visibleTerm2CatsKeys\n\t\t\t\t\t\t\t.map(catK => self.config.term2?.term?.values?.[catK]?.label)\n\t\t\t\t\t\t\t.filter(x => x != undefined)\n\t\t\t\t\t\tif (visibleTerm2Labels?.length == 2)\n\t\t\t\t\t\t\tnegateTerm2Label = visibleTerm2Labels[0] == term2Label ? visibleTerm2Labels[1] : visibleTerm2Labels[0]\n\t\t\t\t\t}\n\n\t\t\t\t\trows.push(\n\t\t\t\t\t\t`<tr>\n\t\t\t\t\t\t\t<td style='padding:3px; color:#aaa'>p-value</td>\n\t\t\t\t\t\t\t<td style='padding:3px; text-align:center'>${\n\t\t\t\t\t\t\t\tskipped ? 'N/A' : pvalue > 1e-4 ? Number(pvalue.toFixed(4)) : roundValueAuto(Number(pvalue))\n\t\t\t\t\t\t\t}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<table style=\"margin: 5px; text-align:left; font-size: 0.8em; border-spacing: 5px; border-collapse: separate;\"\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style='color:#aaa'></td>\n\t\t\t\t\t\t\t\t<td style='color:#aaa'>${term2Label}</td>\n\t\t\t\t\t\t\t\t<td style='color:#aaa'>${negateTerm2Label}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style='color:#aaa'>${term1Label}</td>\n\t\t\t\t\t\t\t\t<td>${tableValues.R1C1}</td>\n\t\t\t\t\t\t\t\t<td>${tableValues.R1C2}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style='color:#aaa'>${negateTerm1Label}</td>\n\t\t\t\t\t\t\t\t<td>${tableValues.R2C1}</td>\n\t\t\t\t\t\t\t\t<td>${tableValues.R2C2}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (!t1.type == 'condition' && (!t2 || !t2.type == 'condition')) {\n\t\t\t\t\trows.push(\n\t\t\t\t\t\t`<tr><td style='padding:3px; color:#aaa'>Percentage</td><td style='padding:3px; text-align:center'>${(\n\t\t\t\t\t\t\t(100 * d.total) /\n\t\t\t\t\t\t\t(t2 ? d.seriesTotal : d.chartTotal)\n\t\t\t\t\t\t).toFixed(1)}%</td></tr>`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\ttip.show(event.clientX, event.clientY).d.html(`<table class='sja_simpletable'>${rows.join('\\n')}</table>`)\n\t\t\t},\n\t\t\tmouseout: () => {\n\t\t\t\ttip.hide()\n\t\t\t},\n\t\t\trectFill(d) {\n\t\t\t\treturn d.color\n\t\t\t},\n\t\t\tstrokeFill(d) {\n\t\t\t\tconst rgbColor = rgb(d.color)\n\t\t\t\tconst stroke = rgbColor.toString() == rgb('white').toString() ? rgbColor.darker() : rgbColor\n\t\t\t\treturn stroke\n\t\t\t},\n\t\t\tclick: self.opts.bar_click_override\n\t\t\t\t? (event, d) => self.opts.bar_click_override(getTermValues(d, self))\n\t\t\t\t: (event, d) => handle_click(event, self, d)\n\t\t},\n\t\tcolLabel: {\n\t\t\ttext: d => {\n\t\t\t\treturn 'label' in d\n\t\t\t\t\t? d.label\n\t\t\t\t\t: self.config.term.values && 'id' in d && d.id in self.config.term.values\n\t\t\t\t\t? self.config.term.values[d.id].label\n\t\t\t\t\t: d\n\t\t\t},\n\t\t\tclick: barLabelClickHandler,\n\t\t\tmouseover: event => {\n\t\t\t\tevent.stopPropagation()\n\t\t\t\ttip.show(event.clientX, event.clientY).d.html('Click to hide bar')\n\t\t\t},\n\t\t\tmouseout: () => {\n\t\t\t\ttip.hide()\n\t\t\t}\n\t\t},\n\t\trowLabel: {\n\t\t\ttext: d => {\n\t\t\t\treturn d.label\n\t\t\t\t\t? d.label\n\t\t\t\t\t: self.config.term.values && 'id' in d && d.id in self.config.term.values\n\t\t\t\t\t? self.config.term.values[d.id].label\n\t\t\t\t\t: d\n\t\t\t},\n\t\t\tclick: barLabelClickHandler,\n\t\t\tmouseover: event => {\n\t\t\t\tevent.stopPropagation()\n\t\t\t\ttip.show(event.clientX, event.clientY).d.html('Click to hide bar')\n\t\t\t},\n\t\t\tmouseout: () => {\n\t\t\t\ttip.hide()\n\t\t\t}\n\t\t},\n\t\tlegend: {\n\t\t\tonColorClick: e => handleLegendClick(e.target, self),\n\t\t\tclick: e => handleLegendClick(e.target, self),\n\t\t\tmouseover: event => {\n\t\t\t\tevent.stopPropagation()\n\t\t\t\tconst d = event.target.__data__\n\t\t\t\tif (d === undefined) return\n\t\t\t\tif (d.isHidden) tip.show(event.clientX, event.clientY).d.html('Click to unhide bar')\n\t\t\t},\n\t\t\tmouseout: () => {\n\t\t\t\ttip.hide()\n\t\t\t}\n\t\t},\n\t\tyAxis: {\n\t\t\ttext: visibleTotal => {\n\t\t\t\tconst type = self.sampleType?.plural_name || 'samples'\n\t\t\t\tconst term = self.config.term\n\t\t\t\tif (s.orientation == 'vertical') {\n\t\t\t\t\t// Do not show the sum of serieses as (n=...) when serieses are 'Sub-condition', 'Most recent grade' or 'Any grade'\n\t\t\t\t\t// because a patient could have multiple 'Sub-condition', 'Most recent grade' or 'Any grade', and as a result could\n\t\t\t\t\t// be counted multiple times.\n\t\t\t\t\treturn s.unit == 'pct'\n\t\t\t\t\t\t? `% of ${type}`\n\t\t\t\t\t\t: `# of ${type} ` +\n\t\t\t\t\t\t\t\t(term.q.bar_by_children || term.q.value_by_most_recent || term.q.value_by_computable_grade\n\t\t\t\t\t\t\t\t\t? ''\n\t\t\t\t\t\t\t\t\t: `(n=${visibleTotal})`)\n\t\t\t\t} else {\n\t\t\t\t\treturn term.q.bar_by_children\n\t\t\t\t\t\t? 'Sub-condition'\n\t\t\t\t\t\t: term.q.value_by_max_grade\n\t\t\t\t\t\t? 'Maximum grade'\n\t\t\t\t\t\t: term.q.value_by_most_recent\n\t\t\t\t\t\t? 'Most recent grade'\n\t\t\t\t\t\t: term.q.value_by_computable_grade\n\t\t\t\t\t\t? 'Any grade'\n\t\t\t\t\t\t: term.type == 'categorical' || !term.unit\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: term.unit\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\txAxis: {\n\t\t\ttext: visibleTotal => {\n\t\t\t\tconst type = self.sampleType?.plural_name || 'samples'\n\t\t\t\tconst term = self.config.term\n\t\t\t\tif (s.orientation == 'vertical') {\n\t\t\t\t\treturn term.q.bar_by_children\n\t\t\t\t\t\t? 'Sub-condition'\n\t\t\t\t\t\t: term.q.value_by_max_grade\n\t\t\t\t\t\t? 'Maximum grade'\n\t\t\t\t\t\t: term.q.value_by_most_recent\n\t\t\t\t\t\t? 'Most recent grade'\n\t\t\t\t\t\t: term.q.value_by_computable_grade\n\t\t\t\t\t\t? 'Any grade'\n\t\t\t\t\t\t: term.type == 'categorical' || !term.unit\n\t\t\t\t\t\t? ''\n\t\t\t\t\t\t: term.unit\n\t\t\t\t} else {\n\t\t\t\t\t// Do not show the sum of serieses as (n=...) when serieses are 'Sub-condition', 'Most recent grade' or 'Any grade'\n\t\t\t\t\t// because a patient could have multiple 'Sub-condition', 'Most recent grade' or 'Any grade', and as a result could\n\t\t\t\t\t// be counted multiple times.\n\t\t\t\t\treturn s.unit == 'pct'\n\t\t\t\t\t\t? `% of ${type}`\n\t\t\t\t\t\t: `# of ${type} ` +\n\t\t\t\t\t\t\t\t(term.q.bar_by_children || term.q.value_by_most_recent || term.q.value_by_computable_grade\n\t\t\t\t\t\t\t\t\t? ''\n\t\t\t\t\t\t\t\t\t: `(n=${visibleTotal})`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction handleColorClick(d, self, color) {\n\tconst termNum = d.type == 'col' ? 'term' : 'term2'\n\tconst term = self.config[termNum]\n\tlet dataId = d.dataId\n\tif (term.term.values && !term.term.values?.[dataId])\n\t\tfor (const [key, value] of Object.entries(term.term.values)) if (value.label == d.dataId) dataId = key\n\tif (term.term.values?.[dataId]) term.term.values[dataId].color = color\n\tif (term.term.type == 'geneVariant') {\n\t\tif (!term.term.values) term.term.values = {}\n\t\tterm.term.values[d.dataId] = { label: d.dataId, color }\n\t}\n\tlet binColored = null\n\tif (self.bins[2].length > 0) {\n\t\t//term index: term0: 0, term: 1, term2: 2\n\t\tconst binMatched = self.bins[2].find(bin => bin.label == d.dataId)\n\t\tif (binMatched) {\n\t\t\tbinMatched.color = color\n\t\t\tbinColored = self.bins[2]\n\t\t}\n\t}\n\tself.app.dispatch({\n\t\ttype: 'plot_edit',\n\t\tid: self.id,\n\t\tconfig: {\n\t\t\t[termNum]: {\n\t\t\t\t$id: term.$id,\n\t\t\t\tid: term.id,\n\t\t\t\tisAtomic: true,\n\t\t\t\tterm: term.term,\n\t\t\t\tq: getUpdatedQfromClick(d, term, d.isHidden, binColored)\n\t\t\t}\n\t\t}\n\t})\n}\n\nfunction handleLegendClick(target, self) {\n\tconst d = target.__data__\n\tif (d === undefined) return\n\tif (!('type' in d)) return\n\tconst termNum = d.type == 'col' ? 'term' : 'term2'\n\tconst term = self.config[termNum]\n\tconst isHidden =\n\t\t'isHidden' in d\n\t\t\t? !d.isHidden\n\t\t\t: !(term.q && term.q.hiddenValues && term.q.hiddenValues['dataId' in d ? d.dataId : d.id])\n\tconst tip = self.app.tip\n\tconst menu = tip.clear()\n\tmenu.showunder(target)\n\tconst div = menu.d.append('div')\n\tdiv\n\t\t.append('div')\n\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t.text(!isHidden ? 'Show' : 'Hide')\n\t\t.on('click', () => {\n\t\t\tmenu.hide()\n\t\t\thideCategory(d, self, isHidden)\n\t\t})\n\tif (term.q.hiddenValues && Object.keys(term.q.hiddenValues).length > 1)\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('Show all')\n\t\t\t.on('click', () => {\n\t\t\t\tmenu.hide()\n\t\t\t\tconst config = {}\n\t\t\t\tconst tw = structuredClone(term)\n\t\t\t\tdelete tw.q.hiddenValues\n\n\t\t\t\tself.app.dispatch({\n\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\tid: self.id,\n\t\t\t\t\tconfig: { [termNum]: tw }\n\t\t\t\t})\n\t\t\t})\n\tconst color = rgb(d.color).formatHex()\n\tif (color != '#ffffff') {\n\t\tconst input = div\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_sharp_border')\n\t\t\t.style('padding', '0px 10px')\n\t\t\t.text('Color:')\n\t\t\t.append('input')\n\t\t\t.attr('type', 'color')\n\t\t\t.attr('value', color)\n\t\t\t.on('change', () => {\n\t\t\t\thandleColorClick(d, self, input.node().value)\n\t\t\t\tmenu.hide()\n\t\t\t})\n\t}\n}\n\nexport function hideCategory(d, self, isHidden) {\n\tconst termNum = d.type == 'col' ? 'term' : 'term2'\n\tconst term = self.config[termNum]\n\tself.app.dispatch({\n\t\ttype: 'plot_edit',\n\t\tid: self.id,\n\t\tconfig: {\n\t\t\t[termNum]: {\n\t\t\t\t//Fix for list samples options not working\n\t\t\t\t//after hiding a category\n\t\t\t\t$id: term?.$id,\n\t\t\t\tid: term.id,\n\n\t\t\t\tisAtomic: true,\n\t\t\t\tterm: term.term,\n\t\t\t\tq: getUpdatedQfromClick(d, term, isHidden)\n\t\t\t}\n\t\t}\n\t})\n}\n\nfunction getUpdatedQfromClick(d, term, isHidden = false, binColored = null) {\n\tconst label = 'id' in d ? d.id : d.type == 'col' ? d.seriesId : d.dataId\n\tconst valueId = term.term.values && Object.keys(term.term.values).find(id => term.term.values[id].label === label)\n\tconst id = !valueId ? label : valueId\n\tconst q = JSON.parse(JSON.stringify(term.q))\n\tif (!q.hiddenValues) q.hiddenValues = {}\n\tif (isHidden) q.hiddenValues[id] = 1\n\telse delete q.hiddenValues[id]\n\tif (binColored) q.binColored = binColored\n\treturn q\n}\n\nfunction handle_click(event, self, chart) {\n\tconst d = event.target.__data__ || event.target.parentNode.__data__\n\t// bar label data only has {id,label},\n\t// while bar data has all required data including seriesId\n\tconst term1 = self.config.term.term\n\tconst term2 = self.config.term2 ? self.config.term2.term : null\n\tconst uncomp_term1 = term1.values ? Object.values(term1.values).map(v => v.label) : []\n\tconst uncomp_term2 = term2 && term2.values ? Object.values(term2.values).map(v => v.label) : []\n\tconst term1unit = term1.unit && !uncomp_term1.includes(d.seriesId || d.id) ? ' ' + term1.unit : ''\n\tconst term2unit = term2 && term2.unit && !uncomp_term2.includes(d.dataId || d.id) ? ' ' + term2.unit : ''\n\tconst seriesLabel =\n\t\t(term1.values && d.seriesId in term1.values ? term1.values[d.seriesId].label : d.seriesId ? d.seriesId : d.id) +\n\t\tterm1unit\n\tconst dataLabel =\n\t\t(term2 && term2.values && d.dataId in term2.values ? term2.values[d.dataId].label : d.dataId ? d.dataId : d.id) +\n\t\tterm2unit\n\tconst icon = !term2\n\t\t? ''\n\t\t: \"<div style='display:inline-block; width:14px; height:14px; margin: 2px 3px; vertical-align:top; background:\" +\n\t\t d.color +\n\t\t \"'> </div>\"\n\tconst header =\n\t\t`<div style='padding:2px'><b>${term1.name}</b>: ${seriesLabel}</div>` +\n\t\t(d.seriesId && term2 ? `<div style='padding:2px'><b>${term2.name}</b>: ${dataLabel} ${icon}</div>` : '')\n\n\tconst data = d.seriesId || d.seriesId === 0 ? d : { seriesId: d.id, dataId: d.dataId }\n\n\tconst options = []\n\tif (self.opts.bar_click_opts.includes('hide_bar')) {\n\t\toptions.push({\n\t\t\tlabel: d.seriesId ? 'Hide \"' + seriesLabel + '\"' : 'Hide',\n\t\t\tcallback: () => {\n\t\t\t\tconst term = self.config.term\n\t\t\t\tself.app.dispatch({\n\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\tid: self.id,\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tterm: {\n\t\t\t\t\t\t\t$id: term.$id,\n\t\t\t\t\t\t\tid: term.id,\n\t\t\t\t\t\t\tisAtomic: true,\n\t\t\t\t\t\t\tterm: term.term,\n\t\t\t\t\t\t\tq: getUpdatedQfromClick({ id: d.seriesId, type: 'col' }, term, true)\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\tif (d.dataId || d.dataId === 0) {\n\t\t\toptions.push({\n\t\t\t\tlabel: 'Hide \"' + dataLabel + '\" ' + icon,\n\t\t\t\tcallback: () => {\n\t\t\t\t\tconst term2 = self.config.term2\n\t\t\t\t\tself.app.dispatch({\n\t\t\t\t\t\tisAtomic: true,\n\t\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\t\tid: self.id,\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tterm2: {\n\t\t\t\t\t\t\t\tisAtomic: true,\n\t\t\t\t\t\t\t\tterm: term2.term,\n\t\t\t\t\t\t\t\tq: getUpdatedQfromClick({ id: d.dataId, type: 'row' }, term2, true)\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\tif (self.opts.bar_click_opts.includes('add_filter') && (!term2 || !term2.isgenotype)) {\n\t\tconst item = findItemByTermId(self.state.termfilter.filter, self.config.term.term.id)\n\t\tif (!item) {\n\t\t\toptions.push({\n\t\t\t\tlabel: 'Add as filter',\n\t\t\t\tcallback: menuoption_add_filter\n\t\t\t})\n\t\t}\n\t}\n\t//disable sample listing temporarily\n\tif (self.config.displaySampleIds) {\n\t\toptions.push({\n\t\t\tlabel: 'List samples',\n\t\t\tcallback: async () => await listSamples(event, self, d.seriesId, d.dataId, chart.chartId)\n\t\t})\n\t}\n\n\tif (self.opts.bar_click_opts.includes('select_to_gp')) {\n\t\toptions.push({\n\t\t\tlabel: 'Select to GenomePaint',\n\t\t\tcallback: menuoption_select_to_gp\n\t\t})\n\t}\n\n\t// TODO: add to cart\n\t//\n\t// if (self.opts.bar_click_opts.includes('add_to_cart')) {\n\t// \toptions.push({\n\t// \t\tlabel: 'Add group to cart',\n\t// \t\tcallback: menuoption_select_group_add_to_cart\n\t// \t})\n\t// }\n\n\tif (!options.length) return\n\tself.app.tip.clear()\n\tif (header) {\n\t\tself.app.tip.d.append('div').html(header)\n\t}\n\tconst tvslst = getTermValues(data, self)\n\tself.app.tip.d\n\t\t.append('div')\n\t\t.selectAll('div')\n\t\t.data(options)\n\t\t.enter()\n\t\t.append('div')\n\t\t.attr('class', 'sja_menuoption')\n\t\t.html(d => d.label)\n\t\t.on('click', async (event, d) => {\n\t\t\tself.app.tip.hide()\n\t\t\tawait d.callback(self, tvslst)\n\t\t})\n\tself.app.tip.show(event.clientX, event.clientY)\n}\n\nasync function listSamples(event, self, seriesId, dataId, chartId) {\n\tconst tvslst = {\n\t\ttype: 'tvslst',\n\t\tin: true,\n\t\tjoin: 'and',\n\t\tlst: [getTvs(1, seriesId)]\n\t}\n\tconst terms = [self.config.term]\n\tif (self.config.term2) {\n\t\tterms.push(self.config.term2)\n\t\ttvslst.lst.push(getTvs(2, dataId))\n\t}\n\tif (self.config.term0) {\n\t\tterms.push(self.config.term0)\n\t\ttvslst.lst.push(getTvs(0, chartId))\n\t}\n\tconst opts = {\n\t\tterms,\n\t\tfilter: filterJoin([self.state.termfilter.filter, tvslst]),\n\t\tfilter0: self.state.termfilter.filter0\n\t}\n\tconst data = await self.app.vocabApi.getAnnotatedSampleData(opts)\n\tconst rows = []\n\tconst termIsNumeric = isNumericTerm(self.config.term.term)\n\tconst term2isNumeric = self.config.term2 ? isNumericTerm(self.config.term2.term) : false\n\n\tfor (const sample of data.lst) {\n\t\tconst sampleName = data.refs.bySampleId[sample.sample].label\n\t\tconst row = [{ value: sampleName }]\n\t\t/** Don't show hidden values in the results\n\t\t * May not be caught in server request for custom variables\n\t\t * with user supplied keys */\n\t\tif (self.config.term.q?.hiddenValues && `${sample[self.config.term.$id].key}` in self.config.term.q.hiddenValues)\n\t\t\tcontinue\n\t\tif (termIsNumeric) {\n\t\t\tconst value = sample[self.config.term.$id]?.value\n\t\t\trow.push({ value: roundValueAuto(value) })\n\t\t}\n\t\tif (self.config.term2) {\n\t\t\t//Don't show hidden values in the results\n\t\t\tif (\n\t\t\t\tself.config.term2.q?.hiddenValues &&\n\t\t\t\t`${sample[self.config.term2.$id].key}` in self.config.term2.q.hiddenValues\n\t\t\t)\n\t\t\t\tcontinue\n\t\t\tlet value = sample[self.config.term2.$id]\n\t\t\tif (!value) row.push({ value: '' })\n\t\t\telse {\n\t\t\t\tconst label = self.config.term2.term.values?.[value.key]?.label\n\t\t\t\tvalue = term2isNumeric ? roundValueAuto(value.value) : label || value.value\n\t\t\t\trow.push({ value })\n\t\t\t}\n\t\t}\n\t\trows.push(row)\n\t}\n\tconst columns = [{ label: 'Sample' }]\n\tif (termIsNumeric) columns.push({ label: self.config.term.term.name })\n\tif (self.config.term2) columns.push({ label: self.config.term2.term.name })\n\tconst menu = new Menu({ padding: '5px' })\n\tconst div = menu.d.append('div')\n\trenderTable({\n\t\trows,\n\t\tcolumns,\n\t\tdiv,\n\t\tshowLines: true,\n\t\tmaxHeight: '40vh',\n\t\tresize: true\n\t})\n\tmenu.show(event.clientX, event.clientY, false)\n\n\tfunction getTvs(termIndex, value) {\n\t\tconst term = termIndex == 0 ? self.config.term0 : termIndex == 1 ? self.config.term : self.config.term2\n\t\tlet tvs = {\n\t\t\ttype: 'tvs',\n\t\t\ttvs: {\n\t\t\t\tterm: term.term,\n\t\t\t\tvalues: [{ key: value }]\n\t\t\t}\n\t\t}\n\t\tif (isNumericTerm(term.term)) {\n\t\t\tconst bins = self.bins[termIndex]\n\t\t\ttvs.tvs.ranges = [bins.find(bin => bin.label == value)]\n\t\t}\n\t\tif (term.term.type == 'geneVariant') {\n\t\t\t// geneVariant term\n\t\t\tconst termdbmclass = self.app.vocabApi.termdbConfig?.mclass\n\t\t\tif (termIndex === 1) {\n\t\t\t\t// term1=geneVariant, chart will be divided by dt term\n\t\t\t\t// get dt term from selected chart and build tvs\n\t\t\t\tconst dtTerm = self.chartid2dtterm[chartId]\n\t\t\t\tlet key\n\t\t\t\tif (termdbmclass) {\n\t\t\t\t\t// custom mclass labels defined in dataset\n\t\t\t\t\tkey = Object.keys(termdbmclass).find(k => termdbmclass[k].label == value)\n\t\t\t\t}\n\t\t\t\tif (!key) {\n\t\t\t\t\tkey = Object.keys(mclass).find(k => mclass[k].label == value)\n\t\t\t\t}\n\t\t\t\ttvs = {\n\t\t\t\t\ttype: 'tvs',\n\t\t\t\t\ttvs: {\n\t\t\t\t\t\tterm: dtTerm,\n\t\t\t\t\t\tvalues: [{ key }],\n\t\t\t\t\t\tincludeNotTested: true // to be able to list not tested samples\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// term0/2=geneVariant, get dt term from groupsetting\n\t\t\t\tconst groups = term.q.customset?.groups\n\t\t\t\tif (!groups || !Array.isArray(groups)) throw 'groups[] is missing'\n\t\t\t\tconst group = groups.find(group => group.name == value)\n\t\t\t\ttvs = group.filter\n\t\t\t}\n\t\t}\n\t\treturn tvs\n\t}\n}\n\nfunction menuoption_add_filter(self, tvslst) {\n\t/*\n\tself: the tree object\n\ttvslst: an array of 1 or 2 term-value setting objects\n\t\tthis is to be added to the obj.termfilter.filter[]\n\t\tif barchart is single-term, tvslst will have only one element\n\t\tif barchart is two-term overlay, tvslst will have two elements, one for term1, the other for term2\n \t*/\n\tif (!tvslst) return\n\tif (!self.state.termfilter || self.state.nav?.header_mode !== 'with_tabs') {\n\t\t// do not display ui, and do not collect callbacks\n\t\treturn\n\t}\n\tconst filterUiRoot = getFilterItemByTag(self.state.termfilter.filter, 'filterUiRoot')\n\tconst filter = filterJoin([\n\t\tfilterUiRoot,\n\t\t{\n\t\t\ttype: 'tvslst',\n\t\t\tin: true,\n\t\t\tjoin: tvslst.length > 1 ? 'and' : '',\n\t\t\tlst: [...tvslst.map(wrapTvs)]\n\t\t}\n\t])\n\tfilter.tag = 'filterUiRoot'\n\tself.app.dispatch({\n\t\ttype: 'filter_replace',\n\t\tfilter\n\t})\n}\n\nfunction wrapTvs(tvs) {\n\treturn tvs.type === 'tvs' ? tvs : { type: 'tvs', tvs }\n}\n\n/* \t\t\tTODO: add to cart and gp */\n\nfunction menuoption_listsamples(self, tvslst) {\n\tconst filterRoot = getNormalRoot({\n\t\ttype: 'tvslst',\n\t\tjoin: 'and',\n\t\tlst: [\n\t\t\tself.state.termfilter.filter,\n\t\t\t// create a copy of tvslst to not mutate the barchart state,\n\t\t\t// such as when deleting tvs.tvs.term.values below\n\t\t\t...tvslst.map(tvs => wrapTvs(JSON.parse(JSON.stringify(tvs))))\n\t\t]\n\t})\n\t///////////// quick fix to delete term.values{} from stringified filter to reduce url length\n\tnormalizeProps(filterRoot, f => {\n\t\tdelete f.tag\n\t\tif (f.type == 'tvs' && f.tvs && f.tvs.term) delete f.tvs.term.values\n\t})\n\tconst arg = [\n\t\t'getsamples=1',\n\t\t'genome=' + self.app.vocabApi.vocab.genome,\n\t\t'dslabel=' + self.app.vocabApi.vocab.dslabel,\n\t\t'filter=' + encodeURIComponent(JSON.stringify(filterRoot))\n\t]\n\n\tdofetch3('termdb?' + arg.join('&')).then(data => {\n\t\texport_data(data.samples.length + ' samples', [{ text: data.samples.join('\\n') }])\n\t})\n}\n\nfunction menuoption_select_to_gp(self, tvslst) {\n\tconst lst = []\n\tfor (const t of tvslst) {\n\t\tconst f = wrapTvs(t)\n\t\tconst item = findItemByTermId(self.state.termfilter.filter, t.tvs.term.id)\n\t\tif (!item) lst.push(wrapTvs(t))\n\t}\n\n\timport('../src/block').then(async _ => {\n\t\tconst obj = {\n\t\t\tgenome: self.app.opts.genome,\n\t\t\tdslabel: self.state.dslabel\n\t\t}\n\t\tconst pane = newpane({ x: 100, y: 100 })\n\t\tconst filterRoot = getNormalRoot(self.state.termfilter.filter)\n\t\tconst filterUiRoot = getFilterItemByTag(filterRoot, filterUiRoot)\n\t\tif (filterUiRoot && filterUiRoot != filterRoot) delete filterUiRoot.tag\n\t\tfilterRoot.tag = 'filterUiRoot'\n\t\tif (lst.length) {\n\t\t\tfilterRoot.join = 'and'\n\t\t\tfilterRoot.lst.push(...lst)\n\t\t}\n\t\tconst cohortFilter = getFilterItemByTag(filterRoot, 'cohortFilter')\n\t\tif (cohortFilter) {\n\t\t\tcohortFilter.renderAs = 'htmlSelect'\n\t\t\tcohortFilter.selectOptionsFrom = 'selectCohort'\n\t\t}\n\t\tnew _.Block({\n\t\t\thostURL: sessionStorage.getItem('hostURL'),\n\t\t\tholder: pane.body,\n\t\t\tgenome: obj.genome,\n\t\t\tnobox: true,\n\t\t\tchr: obj.genome.defaultcoord.chr,\n\t\t\tstart: obj.genome.defaultcoord.start,\n\t\t\tstop: obj.genome.defaultcoord.stop,\n\t\t\tnativetracks: [obj.genome.tracks.find(i => i.__isgene).name.toLowerCase()],\n\t\t\ttklst: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'mds2',\n\t\t\t\t\tdslabel: obj.dslabel,\n\t\t\t\t\tvcf: {\n\t\t\t\t\t\tnumerical_axis: {\n\t\t\t\t\t\t\tAFtest: {\n\t\t\t\t\t\t\t\tgroups: [\n\t\t\t\t\t\t\t\t\t{ is_termdb: true, filter: filterRoot },\n\t\t\t\t\t\t\t\t\t{ is_population: true, key: 'gnomAD', allowto_adjust_race: true, adjust_race: true }\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 menuoption_select_group_add_to_cart(self, tvslst) {\n\tif (!tvslst || !tvslst.length) return\n\n\tconst new_group = {}\n\tnew_group.is_termdb = true\n\tnew_group.terms = []\n\n\tfor (const [i, term] of tvslst.entries()) {\n\t\tnew_group.terms.push(term)\n\t}\n\n\tif (!self.selected_groups) {\n\t\tself.selected_groups = []\n\t}\n\n\tself.selected_groups.push(new_group)\n\tself.components.cart.main()\n}\n\nfunction getTermValues(d, self) {\n\t/*\n d: clicked bar data\n */\n\tconst termValues = []\n\tif (self.state.nav?.header_mode == 'with_cohortHtmlSelect') {\n\t\t// pass the cohort filter information back to calling app\n\t\t// do not set the renderAs in here since that is decided by the calling app\n\t\tconst cohortFilter = getFilterItemByTag(self.state.termfilter.filter, 'cohortFilter')\n\t\tif (cohortFilter) termValues.push(JSON.parse(JSON.stringify(cohortFilter)))\n\t}\n\n\tconst t1 = self.config.term\n\tconst t1ValKey =\n\t\tt1.term.values && Object.keys(t1.term.values).filter(key => t1.term.values[key].label === d.seriesId)[0]\n\tconst t1ValId = t1.term.values && t1ValKey in t1.term.values ? t1ValKey : d.seriesId\n\tconst t2 = self.config.term2\n\tconst t2ValKey =\n\t\tt2 && t2.term.values && Object.keys(t2.term.values).filter(key => t2.term.values[key].label === d.dataId)[0]\n\tconst t2ValId = t2 && t2.term.values && t2ValKey in t2.term.values ? t2ValKey : d.dataId\n\n\tfor (const term of [t1, t2]) {\n\t\tif (!term) continue\n\t\tconst i = term == t1 ? 1 : 2\n\t\tconst key = term == t1 ? t1ValId : t2ValId\n\t\t// const q = term ? term.q : {}\n\t\tconst q = term.q //self.currServerData.refs.q[i]\n\t\tconst label = !term || !term.term.values ? key : key in term.term.values ? term.term.values[key].label : key\n\n\t\tif (q.type == 'predefined-groupset' || q.type == 'custom-groupset') {\n\t\t\tconst groupset =\n\t\t\t\tq.type == 'predefined-groupset' ? term.term.groupsetting.lst[q.predefined_groupset_idx] : q.customset\n\t\t\tconst group = groupset.groups.find(g => g.name === key)\n\t\t\tconst tvs = { term: term.term, values: group.values, groupset_label: group.name }\n\t\t\tif (term.term.type == 'condition') {\n\t\t\t\ttvs.bar_by_children = term.q.bar_by_children\n\t\t\t\ttvs.bar_by_grade = term.q.bar_by_grade\n\t\t\t\ttvs.value_by_most_recent = term.q.value_by_most_recent\n\t\t\t\ttvs.value_by_max_grade = term.q.value_by_max_grade\n\t\t\t}\n\t\t\ttermValues.push(tvs)\n\t\t} else if (term.term.type == 'condition') {\n\t\t\tif (!t2 || t1.term.id != t2.term.id) {\n\t\t\t\ttermValues.push(\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tterm: term.term,\n\t\t\t\t\t\t\tvalues: [{ key, label }]\n\t\t\t\t\t\t},\n\t\t\t\t\t\tq\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\n\t\t\tif (term == t1 && t2 && term.term.id == t2.term.id) {\n\t\t\t\tconst q2 = t2.q\n\t\t\t\tconst term2Label =\n\t\t\t\t\tt2.term.values && d.dataId in t2.term.values ? self.config.term2.values[d.dataId].label : d.dataId\n\n\t\t\t\ttermValues.push(\n\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tterm: term.term,\n\t\t\t\t\t\t\tgrade_and_child: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tgrade: q2.bar_by_grade ? d.dataId : key,\n\t\t\t\t\t\t\t\t\tgrade_label: q2.bar_by_grade ? term2Label : label,\n\t\t\t\t\t\t\t\t\tchild_id: q2.bar_by_children ? d.dataId : key,\n\t\t\t\t\t\t\t\t\tchild_label: q2.bar_by_children ? term2Label : label\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\tq2\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tconst bins = self.currServerData.refs.bins[i]\n\t\t\tif (!bins || !bins.length) {\n\t\t\t\t// not associated with numeric bins\n\t\t\t\ttermValues.push({ term: term.term, values: [{ key, label }] })\n\t\t\t} else {\n\t\t\t\tconst range = bins.find(d => d.label == label || d.name == label)\n\t\t\t\tif (range) termValues.push({ term: term.term, ranges: [range] })\n\t\t\t\telse if (term == t1) {\n\t\t\t\t\ttermValues.push({ term: term.term, ranges: [{ value: key }] })\n\t\t\t\t} else if (term == t2) {\n\t\t\t\t\ttermValues.push({ term: term.term, ranges: [{ value: key }] })\n\t\t\t\t} else {\n\t\t\t\t\tthrow 'should not happen'\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn termValues.map(f => wrapTvs(f))\n}\n", "import { getCompInit, copyMerge } from '../rx'\nimport getHandlers from './barchart.events'\nimport barsRenderer from './bars.renderer'\nimport rendererSettings from './bars.settings'\nimport { htmlLegend, svgLegend, renderTable } from '#dom'\nimport { select } from 'd3-selection'\nimport { rgb } from 'd3-color'\nimport { controlsInit, term0_term2_defaultQ, renderTerm1Label } from './controls'\nimport { to_svg } from '../src/client'\nimport { fillTermWrapper } from '#termsetting'\nimport { getColors, mclass, plotColor } from '#shared/common.js'\nimport { isNumericTerm } from '#shared/terms.js'\nimport { roundValueAuto } from '#shared/roundValue.js'\n\nexport class Barchart {\n\tconstructor(opts) {\n\t\t// rx.getComponentInit() will set this.app, this.id, this.opts\n\t\tthis.type = 'barchart'\n\t\tif (opts?.parentId) this.parentId = opts.parentId\n\t}\n\t//freeze the api of this class. don't want embedder functions to modify it.\n\tpreApiFreeze(api) {\n\t\tapi.download = this.download\n\t}\n\n\tasync init(appState) {\n\t\tconst opts = this.opts\n\t\tconst controls = this.opts.controls ? null : opts.holder.append('div')\n\t\tconst holder = opts.controls ? opts.holder : opts.holder.append('div')\n\t\tthis.dom = {\n\t\t\tloadingDiv: holder\n\t\t\t\t.append('div')\n\t\t\t\t.style('position', 'absolute')\n\t\t\t\t.style('display', 'none')\n\t\t\t\t.style('padding', '20px')\n\t\t\t\t.html('Loading ...'),\n\t\t\theader: opts.header,\n\t\t\tcontrols,\n\t\t\tholder,\n\t\t\tbanner: holder\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'none')\n\t\t\t\t.style('text-align', 'center')\n\t\t\t\t.style('padding', '24px')\n\t\t\t\t.style('font-size', '16px')\n\t\t\t\t.style('color', '#aaa'),\n\t\t\tbarDiv: holder.append('div'),\n\t\t\tlegendDiv: holder.append('div').style('margin', '5px 5px 15px 5px')\n\t\t}\n\t\tif (this.dom.header) this.dom.header.html('Barchart')\n\t\tthis.settings = JSON.parse(rendererSettings)\n\n\t\tsetRenderers(this)\n\t\tsetInteractivity(this)\n\n\t\tthis.renderers = {}\n\t\tthis.legendRenderer = htmlLegend(\n\t\t\tthis.dom.legendDiv,\n\t\t\t{\n\t\t\t\tsettings: {\n\t\t\t\t\tlegendOrientation: 'vertical'\n\t\t\t\t},\n\t\t\t\thandlers: this.handlers\n\t\t\t},\n\t\t\tthis.dom.barDiv\n\t\t)\n\t\tthis.controls = {}\n\t\tthis.term2toColor = {}\n\n\t\tif (this.opts.bar_click_override) {\n\t\t\t// will use this as callback to bar click\n\t\t\t// and will not set up bar click menu\n\t\t} else if (!this.opts.bar_click_opts) {\n\t\t\tthis.opts.bar_click_opts = ['hide_bar']\n\t\t\tif (this.app.getState().nav.header_mode === 'with_tabs') this.opts.bar_click_opts.push('add_filter')\n\t\t}\n\t}\n\n\tasync setControls() {\n\t\tconst state = this.state\n\t\tthis.dom.controls.selectAll('*').remove()\n\t\tif (this.opts.controls) {\n\t\t\tthis.opts.controls.on('downloadClick.barchart', this.download)\n\t\t} else {\n\t\t\tthis.dom.holder\n\t\t\t\t.attr('class', 'pp-termdb-plot-viz')\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.style('min-width', '300px')\n\t\t\t\t.style('margin-left', '50px')\n\n\t\t\tconst inputs = [\n\t\t\t\t{\n\t\t\t\t\ttype: 'term',\n\t\t\t\t\tconfigKey: 'term',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tusecase: { target: 'barchart', detail: 'term' },\n\t\t\t\t\tlabel: renderTerm1Label,\n\t\t\t\t\tvocabApi: this.app.vocabApi,\n\t\t\t\t\tmenuOptions: 'edit',\n\t\t\t\t\tgetBodyParams: () => {\n\t\t\t\t\t\tconst tw = this.config['term']\n\t\t\t\t\t\tif (!tw) return { skip_samplecounts: true }\n\t\t\t\t\t\tif (tw.term.samplecounts) return { samplecounts: tw.term.samplecounts }\n\t\t\t\t\t\treturn {}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: 'term',\n\t\t\t\t\tconfigKey: 'term2',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tusecase: { target: 'barchart', detail: 'term2' },\n\t\t\t\t\ttitle: 'Overlay data',\n\t\t\t\t\tlabel: 'Overlay',\n\t\t\t\t\tvocabApi: this.app.vocabApi,\n\t\t\t\t\tnumericEditMenuVersion: this.opts.numericEditMenuVersion,\n\t\t\t\t\tdefaultQ4fillTW: term0_term2_defaultQ,\n\t\t\t\t\t// overlay option should always be visible, but must convert unit from log to abs\n\t\t\t\t\t// when an overlay is added\n\t\t\t\t\t//getDisplayStyle: () => (this.settings.unit == 'log' ? 'none' : ''),\n\t\t\t\t\tprocessConfig: config => {\n\t\t\t\t\t\t//config.settings not usually passed for logic check below\n\t\t\t\t\t\tconst s = this.state.config.settings.barchart\n\t\t\t\t\t\tif (!config.settings) config.settings = { barchart: {} }\n\t\t\t\t\t\t//Prevent showing Log option when overlay is selected\n\t\t\t\t\t\tif (config.term2 && s.unit == 'log') config.settings.barchart.unit = 'abs'\n\t\t\t\t\t\t//Revert back to Linear radio when Proportion is selected\n\t\t\t\t\t\t//but the overlay term is removed\n\t\t\t\t\t\tif (!config.term2 && s.unit == 'pct') config.settings.barchart.unit = 'abs'\n\t\t\t\t\t},\n\t\t\t\t\tgetBodyParams: () => {\n\t\t\t\t\t\tconst tw = this.config['term2']\n\t\t\t\t\t\tif (!tw) return { skip_samplecounts: true }\n\t\t\t\t\t\tif (tw.term.samplecounts) return { samplecounts: tw.term.samplecounts }\n\t\t\t\t\t\treturn {}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttype: 'term',\n\t\t\t\t\tconfigKey: 'term0',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tusecase: { target: 'barchart', detail: 'term0' },\n\t\t\t\t\ttitle: 'Divide by data',\n\t\t\t\t\tlabel: 'Divide by',\n\t\t\t\t\tvocabApi: this.app.vocabApi,\n\t\t\t\t\tnumericEditMenuVersion: this.opts.numericEditMenuVersion,\n\t\t\t\t\tdefaultQ4fillTW: term0_term2_defaultQ,\n\t\t\t\t\tgetBodyParams: () => {\n\t\t\t\t\t\tconst tw = this.config['term0']\n\t\t\t\t\t\tif (!tw) return { skip_samplecounts: true }\n\t\t\t\t\t\tif (tw.term.samplecounts) return { samplecounts: tw.term.samplecounts }\n\t\t\t\t\t\treturn {}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Charts layout',\n\t\t\t\t\ttype: 'radio',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'divideOrientation',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: 'Vertical', value: 'vertical' },\n\t\t\t\t\t\t{ label: 'Horizontal', value: 'horizontal' }\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Bar orientation',\n\t\t\t\t\ttype: 'radio',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'orientation',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: 'Vertical', value: 'vertical' },\n\t\t\t\t\t\t{ label: 'Horizontal', value: 'horizontal' }\n\t\t\t\t\t]\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Scale',\n\t\t\t\t\ttype: 'radio',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'unit',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ label: 'Linear', value: 'abs' },\n\t\t\t\t\t\t/** Option not available when term2 is present:\n\t\t\t\t\t\t * 1. The scale for the plot renders incorrectly\n\t\t\t\t\t\t * 2. The bars do not appear to be rendering correctly as a result\n\t\t\t\t\t\t * TODOs: Investigate the cause of the rendering issue\n\t\t\t\t\t\t */\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Log',\n\t\t\t\t\t\t\tvalue: 'log',\n\t\t\t\t\t\t\tgetDisplayStyle: (plot, computedDisplay = 'inline-block') => (plot.term2 ? 'none' : computedDisplay)\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tlabel: 'Proportion',\n\t\t\t\t\t\t\tvalue: 'pct',\n\t\t\t\t\t\t\tgetDisplayStyle: (plot, computedDisplay = 'inline-block') => (plot.term2 ? computedDisplay : 'none')\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: 'Multicolor bars',\n\t\t\t\t\ttitle: 'Color bars using the colors preassigned if available, otherwise generates a color',\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'colorBars',\n\t\t\t\t\tboxLabel: 'Yes',\n\t\t\t\t\tgetDisplayStyle: plot => (plot.term2 ? 'none' : 'table-row')\n\t\t\t\t},\n\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Deduplicate',\n\t\t\t\t\ttitle: 'Use separate bars samples that has multiple values or belong to multiple groups',\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'dedup',\n\t\t\t\t\tboxLabel: 'Yes',\n\t\t\t\t\tgetDisplayStyle: plot =>\n\t\t\t\t\t\tthis.chartsData.charts.find(c => c.serieses.length != c.dedupedSerieses.length) ? 'table-row' : 'none'\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tlabel: 'Default color',\n\t\t\t\t\ttitle: 'Default color for bars when there is no overlay',\n\t\t\t\t\ttype: 'color',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'defaultColor'\n\t\t\t\t\t//getDisplayStyle: plot => (plot.settings.barchart.colorBars || plot.term2 ? 'none' : 'table-row')\n\t\t\t\t}\n\t\t\t]\n\t\t\tif (state.config.term2)\n\t\t\t\tinputs.push({\n\t\t\t\t\tlabel: 'Show stats table',\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'showStatsTable',\n\t\t\t\t\tboxLabel: 'Yes'\n\t\t\t\t})\n\t\t\tconst multipleTestingCorrection = this.app.getState().termdbConfig.multipleTestingCorrection\n\t\t\tif (multipleTestingCorrection) {\n\t\t\t\t// a checkbox to allow users to show or hide asterisks on bars\n\t\t\t\tinputs.push({\n\t\t\t\t\tlabel: 'Asterisks',\n\t\t\t\t\tboxLabel: 'Visible',\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'asterisksVisible',\n\t\t\t\t\ttitle: 'Display the asterisks'\n\t\t\t\t})\n\t\t\t\tconst mtcMethod = multipleTestingCorrection.method\n\t\t\t\tif (!mtcMethod) throw 'no multiple testing correction method specified'\n\t\t\t\tinputs.push({\n\t\t\t\t\tlabel: `Multiple testing correction (${mtcMethod == 'bon' ? 'Bonferroni' : mtcMethod})`,\n\t\t\t\t\tboxLabel: '',\n\t\t\t\t\ttype: 'checkbox',\n\t\t\t\t\tchartType: 'barchart',\n\t\t\t\t\tsettingsKey: 'multiTestingCorr',\n\t\t\t\t\ttitle: `Perform multiple testing correction (${mtcMethod == 'bon' ? 'Bonferroni' : mtcMethod})`\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.components = {\n\t\t\t\tcontrols: await controlsInit({\n\t\t\t\t\tapp: this.app,\n\t\t\t\t\tid: this.id,\n\t\t\t\t\tholder: this.dom.controls.attr('class', 'pp-termdb-plot-controls').style('display', 'inline-block'),\n\t\t\t\t\tinputs\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.components.controls.on('downloadClick.barchart', this.download)\n\t\t}\n\t}\n\n\treactsTo(action) {\n\t\tif (action.type.startsWith('plot_')) {\n\t\t\treturn (\n\t\t\t\t(action.id === this.id || action.id == this.parentId) &&\n\t\t\t\t(!action.config?.childType || action.config?.childType == this.type)\n\t\t\t)\n\t\t}\n\t\treturn true\n\t}\n\n\tgetState(appState) {\n\t\tconst config = appState.plots.find(p => p.id === this.id)\n\t\tif (!config) {\n\t\t\tthrow `No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`\n\t\t}\n\t\tconst parentConfig = appState.plots.find(p => p.id === this.parentId)\n\t\treturn {\n\t\t\tnav: {\n\t\t\t\theader_mode: appState.nav.header_mode\n\t\t\t},\n\t\t\ttermfilter: parentConfig ? { filter: parentConfig.filter } : appState.termfilter,\n\t\t\tconfig: Object.assign({}, config, {\n\t\t\t\tsettings: {\n\t\t\t\t\tbarchart: config.settings.barchart,\n\t\t\t\t\tcommon: config.settings.common\n\t\t\t\t},\n\t\t\t\tdisplaySampleIds: appState.termdbConfig.displaySampleIds && this.app.vocabApi.hasVerifiedToken()\n\t\t\t}),\n\t\t\tmultipleTestingCorrection: appState.termdbConfig.multipleTestingCorrection,\n\t\t\tbar_click_menu: appState.bar_click_menu || {}\n\t\t}\n\t}\n\n\tasync main() {\n\t\tconst c = this.state.config\n\t\tif (c.chartType != this.type && c.childType != this.type) return\n\t\ttry {\n\t\t\tthis.config = structuredClone(c)\n\t\t\tif (!this.currServerData) this.dom.barDiv.style('max-width', window.innerWidth + 'px')\n\t\t\tthis.prevConfig = this.config || {}\n\t\t\tif (this.dom.header)\n\t\t\t\tthis.dom.header.html(\n\t\t\t\t\tthis.config.term.term.name + ` <span style=\"opacity:.6;font-size:.7em;margin-left:10px;\">BARCHART</span>`\n\t\t\t\t)\n\n\t\t\tthis.toggleLoadingDiv()\n\t\t\tawait this.setControls()\n\n\t\t\tconst reqOpts = this.getDataRequestOpts()\n\t\t\tawait this.getDescrStats()\n\t\t\tconst results = await this.app.vocabApi.getNestedChartSeriesData(reqOpts)\n\t\t\tconst data = results.data\n\t\t\tthis.sampleType = results.sampleType\n\t\t\tthis.bins = results.bins\n\t\t\tif (results.chartid2dtterm) this.chartid2dtterm = results.chartid2dtterm\n\t\t\tthis.toggleLoadingDiv('none')\n\t\t\tthis.app.vocabApi.syncTermData(this.config, data, this.prevConfig)\n\t\t\tthis.currServerData = data\n\t\t\tif (this.currServerData.refs && this.currServerData.refs.q) {\n\t\t\t\tfor (const q of this.currServerData.refs.q) {\n\t\t\t\t\tif (q.error) throw q.error\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.term1toColor = {}\n\t\t\tthis.term2toColor = {} // forget any assigned overlay colors when refreshing a barchart\n\t\t\tthis.updateSettings(this.config)\n\n\t\t\tconst numColors = this.config.term2 ? this.settings.rows?.length : this.settings.cols?.length\n\t\t\tthis.colorScale = getColors(numColors || 0)\n\t\t\tthis.chartsData = this.processData(this.currServerData)\n\t\t\tthis.render()\n\t\t} catch (e) {\n\t\t\tthrow e\n\t\t}\n\t}\n\n\t// creates an opts object for the vocabApi.getNestedChartsData()\n\tgetDataRequestOpts() {\n\t\tconst c = this.config\n\t\tconst opts = { term: c.term, filter: this.state.termfilter.filter }\n\t\tif (this.state.termfilter.filter0) opts.filter0 = this.state.termfilter.filter0\n\t\tif (c.term2) opts.term2 = c.term2\n\t\tif (c.term0) opts.term0 = c.term0\n\t\treturn opts\n\t}\n\n\tasync getDescrStats() {\n\t\t// get descriptive statistics for numerical terms\n\t\tconst terms = [this.config.term]\n\t\tif (this.config.term2) terms.push(this.config.term2)\n\t\tif (this.config.term0) terms.push(this.config.term0)\n\t\tfor (const t of terms) {\n\t\t\tif (isNumericTerm(t.term)) {\n\t\t\t\tconst data = await this.app.vocabApi.getDescrStats(t, this.state.termfilter)\n\t\t\t\tif (data.error) throw data.error\n\t\t\t\tt.q.descrStats = data.values\n\t\t\t}\n\t\t}\n\t}\n\n\tupdateSettings(config) {\n\t\tif (!config) return\n\t\t// translate relevant config keys to barchart settings keys\n\t\tconst obj = this.state\n\t\tconst settings = {\n\t\t\tterm0: config.term0 ? config.term0.term.id : '', // convenient reference to the term id\n\t\t\tterm1: config.term.term.id, // convenient reference to the term2 id\n\t\t\tterm2: config.term2 ? config.term2.term.id : '',\n\t\t\tunit: config.settings.barchart.unit,\n\t\t\torientation: config.settings.barchart.orientation,\n\t\t\tdivideOrientation: config.settings.barchart.divideOrientation,\n\t\t\tasterisksVisible: config.settings.barchart.asterisksVisible,\n\t\t\tmultiTestingCorr: config.settings.barchart.multiTestingCorr,\n\t\t\tdefaultColor: config.settings.barchart.defaultColor,\n\t\t\tcolorBars: config.settings.barchart.colorBars,\n\t\t\tdedup: config.settings.barchart.dedup,\n\t\t\t// normalize bar thickness regardless of orientation\n\t\t\tcolw: config.settings.common.barwidth,\n\t\t\trowh: config.settings.common.barwidth,\n\t\t\tcolspace: config.settings.common.barspace,\n\t\t\trowspace: config.settings.common.barspace\n\t\t}\n\n\t\t/* mayResetHidden() was added before to prevent showing empty chart due to automatic hiding uncomputable categories\n\t\tthis has following problems:\n\t\t1. when term1=diaggrp and term2=hrtavg, uncomputable categories from term2 can show up by default.\n\t\t2. inconsistent behavior: when term1=agedx, term2=hrtavg the uncomputable categories are hidden by default\n\n\t\tside effect of disabling this function can cause empty chart, but seems to be minor given above\n\t\t*/\n\t\t//this.mayResetHidden(this.config.term, this.config.term2, this.config.term0)\n\n\t\tthis.setExclude(this.config.term, this.config.term2)\n\t\tObject.assign(this.settings, settings, this.currServerData.refs || {}, {\n\t\t\texclude: this.settings.exclude\n\t\t})\n\n\t\tthis.settings.cols = this.settings.dedup ? this.currServerData.refs.dedupCols : this.currServerData.refs.cols\n\t\tthis.settings.numCharts = this.currServerData.charts ? this.currServerData.charts.length : 0\n\t\tif (!config.term2 && this.settings.unit == 'pct') {\n\t\t\tthis.settings.unit = 'abs'\n\t\t}\n\t}\n\n\tmayResetHidden(term, term2, term0) {\n\t\tconst combinedTermIds = (term && term.term.id) + ';;' + (term2 && term2.term.id) + ';;' + (term0 && term0.term.id)\n\t\tif (combinedTermIds === this.currCombinedTermIds) return\n\t\t// only reset hidden if terms have changed\n\t\tfor (const chart of this.currServerData.charts) {\n\t\t\tif (term.q && term.q.hiddenValues) {\n\t\t\t\tthis.mayEditHiddenValues(term, chart.serieses.length, 'term')\n\t\t\t}\n\t\t\tif (term2 && term2.q && term2.q.hiddenValues) {\n\t\t\t\tfor (const series of chart.serieses) {\n\t\t\t\t\tthis.mayEditHiddenValues(term2, series.data.length, 'term2')\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.currCombinedTermIds = combinedTermIds\n\t}\n\n\tmayEditHiddenValues(term, numAvailable, termNum) {\n\t\tconst numHidden = Object.keys(term.q.hiddenValues).filter(key => term.q.hiddenValues[key]).length\n\t\tif (numHidden < numAvailable) return\n\t\t/*\n\t\t\tif all the serieses are assigned to be hidden on first render,\n\t\t\tshow the usually hidden values instead to avoid confusion\n\t\t\twith an empty plot\n\t\t*/\n\t\tfor (const key in term.q.hiddenValues) {\n\t\t\tif (!term.q.hiddenValues[key]) return\n\t\t\tdelete term.q.hiddenValues[key]\n\t\t}\n\t\t// since config.[term | term2 | term0] are copies of appState,\n\t\t// must save the changes to q.hiddenValues in the stored state\n\t\t// for consistent behavior in later app.dispatch or barchart updates\n\t\tthis.app.save({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.id,\n\t\t\tconfig: {\n\t\t\t\t[termNum]: term\n\t\t\t}\n\t\t})\n\t}\n\n\tsetExclude(term, term2) {\n\t\t// a non-numeric term.id is used directly as seriesId or dataId\n\t\tthis.settings.exclude.cols = Object.keys(term.q?.hiddenValues || {})\n\t\t\t.filter(id => term.q.hiddenValues[id])\n\t\t\t.map(id => {\n\t\t\t\treturn term.term.type == 'categorical'\n\t\t\t\t\t? id\n\t\t\t\t\t: this.settings.cols?.includes(id)\n\t\t\t\t\t? id\n\t\t\t\t\t: term.term.values[id]?.label\n\t\t\t\t\t? term.term.values[id].label\n\t\t\t\t\t: id\n\t\t\t})\n\n\t\tthis.settings.exclude.rows = !term2?.q?.hiddenValues\n\t\t\t? []\n\t\t\t: Object.keys(term2.q.hiddenValues)\n\t\t\t\t\t.filter(id => term2.q.hiddenValues[id])\n\t\t\t\t\t.map(id =>\n\t\t\t\t\t\tterm2.term.type == 'categorical'\n\t\t\t\t\t\t\t? id\n\t\t\t\t\t\t\t: this.settings.rows?.includes(id)\n\t\t\t\t\t\t\t? id\n\t\t\t\t\t\t\t: term2.term.values[id]?.label\n\t\t\t\t\t\t\t? term2.term.values[id].label\n\t\t\t\t\t\t\t: id\n\t\t\t\t\t)\n\t}\n\n\tprocessData(chartsData) {\n\t\tthis.seriesOrder = this.setMaxVisibleTotals(chartsData)\n\t\tif (!chartsData.charts.length) {\n\t\t\tthis.seriesOrder = []\n\t\t} else if (chartsData.refs.useColOrder) {\n\t\t\tthis.seriesOrder = this.settings.cols\n\t\t}\n\n\t\tconst rows = chartsData.refs.rows\n\n\t\tthis.barSorter = (a, b) => this.seriesOrder.indexOf(a) - this.seriesOrder.indexOf(b)\n\t\tthis.overlaySorter = chartsData.refs.useRowOrder\n\t\t\t? (a, b) => rows.indexOf(a.dataId) - rows.indexOf(b.dataId)\n\t\t\t: (a, b) =>\n\t\t\t\t\tthis.totalsByDataId[b.dataId] > this.totalsByDataId[a.dataId]\n\t\t\t\t\t\t? 1\n\t\t\t\t\t\t: this.totalsByDataId[b.dataId] < this.totalsByDataId[a.dataId]\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: a.dataId < b.dataId\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1\n\n\t\tthis.visibleCharts = chartsData.charts.filter(chart => chart.visibleSerieses.length)\n\n\t\tconst t1 = this.config.term\n\t\tconst t2 = this.config.term2\n\t\tconst chartsTests = chartsData.tests\n\n\t\t//get term1 and term2 labels\n\t\tfor (const chartId in chartsTests) {\n\t\t\tconst chartTests = chartsTests[chartId]\n\t\t\tfor (const t1c of chartTests) {\n\t\t\t\tconst t1label =\n\t\t\t\t\tt1.term.values && t1c.term1comparison in t1.term.values\n\t\t\t\t\t\t? t1.term.values[t1c.term1comparison].label\n\t\t\t\t\t\t: t1c.term1comparison\n\t\t\t\tt1c.term1Label = t1label\n\n\t\t\t\tfor (const t2t of t1c.term2tests) {\n\t\t\t\t\tconst t2label =\n\t\t\t\t\t\tt2.term.values && t2t.term2id in t2.term.values ? t2.term.values[t2t.term2id].label : t2t.term2id\n\t\t\t\t\tt2t.term2Label = t2label\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chartsData\n\t}\n\n\tsetMaxVisibleTotals(chartsData) {\n\t\t// chartsData = this.currServerData\n\t\tthis.totalsByDataId = {}\n\t\tconst t1 = this.config.term\n\t\tconst t2 = this.config.term2\n\t\t// this will prioritize sorting series totals in the first chart,\n\t\t// then serieses in the subsequent chart that are not already in the first chart, and so on\n\t\tconst visibleTotalsByChartSeriesId = {}\n\t\tlet maxVisibleAcrossCharts = 0\n\t\tfor (const chart of chartsData.charts) {\n\t\t\tif (!chart.settings) chart.settings = JSON.parse(rendererSettings)\n\t\t\tObject.assign(chart.settings, this.settings)\n\t\t\tchart.visibleTotal = 0\n\t\t\tconst serieses = this.settings.dedup ? chart.dedupedSerieses : chart.serieses\n\t\t\tchart.visibleSerieses = serieses.filter(series => {\n\t\t\t\tif (chart.settings.exclude.cols.includes(series.seriesId)) return false\n\t\t\t\tseries.visibleData = series.data.filter(d => !chart.settings.exclude.rows.includes(d.dataId))\n\t\t\t\tseries.visibleTotal = series.visibleData.reduce((sum, a) => sum + a.total, 0)\n\t\t\t\tif (!series.visibleTotal) return false\n\t\t\t\tchart.visibleTotal += series.visibleTotal\n\t\t\t\tif (!(series.seriesId in visibleTotalsByChartSeriesId))\n\t\t\t\t\tvisibleTotalsByChartSeriesId[series.seriesId] = series.visibleTotal\n\t\t\t\tfor (const data of series.data) {\n\t\t\t\t\tdata.seriesId = series.seriesId\n\t\t\t\t\tif (\n\t\t\t\t\t\t(t1.term.type == 'geneVariant' && t1.q.type == 'values') ||\n\t\t\t\t\t\t(t2?.term.type == 'geneVariant' && t2?.q.type == 'values')\n\t\t\t\t\t) {\n\t\t\t\t\t\t// term1 or term2 is a geneVariant term not using groupsetting\n\t\t\t\t\t\t// need specialized processing\n\t\t\t\t\t\tif (!(data.dataId in this.totalsByDataId)) {\n\t\t\t\t\t\t\tthis.totalsByDataId[data.dataId] = {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.totalsByDataId[data.dataId][chart.chartId] = this.totalsByDataId[data.dataId][chart.chartId]\n\t\t\t\t\t\t\t? this.totalsByDataId[data.dataId][chart.chartId] + data.total\n\t\t\t\t\t\t\t: 0 + data.total\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (!(data.dataId in this.totalsByDataId)) {\n\t\t\t\t\t\t\tthis.totalsByDataId[data.dataId] = 0\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.totalsByDataId[data.dataId] += data.total\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t\tchart.settings.colLabels = chart.visibleSerieses.map(series => {\n\t\t\t\tconst id = series.seriesId\n\t\t\t\tconst label = t1.term.values && id in t1.term.values ? t1.term.values[id].label : id\n\t\t\t\tconst af = series && 'AF' in series ? ', AF=' + series.AF : ''\n\t\t\t\tconst ntotal =\n\t\t\t\t\tt2 && t2.term.type == 'condition' && t2.q.value_by_computable_grade ? '' : `, n=${series.visibleTotal}`\n\t\t\t\treturn {\n\t\t\t\t\tid,\n\t\t\t\t\tlabel: label + af + ntotal\n\t\t\t\t}\n\t\t\t})\n\t\t\tchart.maxVisibleSeriesTotal = chart.visibleSerieses.reduce((max, series) => {\n\t\t\t\treturn series.visibleTotal > max ? series.visibleTotal : max\n\t\t\t}, 0)\n\t\t\tif (chart.maxVisibleSeriesTotal > maxVisibleAcrossCharts) {\n\t\t\t\tmaxVisibleAcrossCharts = chart.maxVisibleSeriesTotal\n\t\t\t}\n\t\t}\n\t\tfor (const chart of chartsData.charts) {\n\t\t\tchart.maxVisibleAcrossCharts = maxVisibleAcrossCharts\n\t\t}\n\n\t\treturn Object.keys(visibleTotalsByChartSeriesId).sort(\n\t\t\t(a, b) => visibleTotalsByChartSeriesId[b] - visibleTotalsByChartSeriesId[a]\n\t\t)\n\t}\n\n\tsortStacking(series, chart, chartsData) {\n\t\tthis.term1toColor[series.seriesId] = this.settings.colorBars\n\t\t\t? this.getColor(this.config.term, series.seriesId, this.bins?.[1])\n\t\t\t: this.settings.defaultColor\n\n\t\tseries.visibleData.sort(this.overlaySorter)\n\t\tlet seriesLogTotal = 0\n\t\tfor (const result of series.visibleData) {\n\t\t\tresult.colgrp = '-'\n\t\t\tresult.rowgrp = '-'\n\t\t\tresult.chartId = chart.chartId\n\t\t\tresult.seriesId = series.seriesId\n\t\t\tif (chartsData.tests) {\n\t\t\t\t// statistical tests result exist\n\t\t\t\t// put the pvalues corresponding to series.seriesId to result.groupPvalues\n\t\t\t\tresult.groupPvalues = chartsData.tests[chart.chartId].find(x => x.term1comparison === series.seriesId)\n\t\t\t}\n\t\t\tresult.seriesTotal = series.total\n\t\t\tresult.chartTotal = chart.visibleTotal\n\t\t\tresult.logTotal = Math.log10(result.total)\n\t\t\tseriesLogTotal += result.logTotal\n\t\t\tthis.setTerm2Color(result)\n\t\t\tresult.color = this.term2toColor[result.dataId] || this.term1toColor[series.seriesId]\n\t\t}\n\t\tif (seriesLogTotal > chart.maxSeriesLogTotal) {\n\t\t\tchart.maxSeriesLogTotal = seriesLogTotal\n\t\t}\n\t\t// assign color to hidden data for use in legend\n\t\tfor (const result of series.data) {\n\t\t\tif (result.color) continue\n\t\t\tthis.setTerm2Color(result)\n\t\t\tresult.color = this.term2toColor[result.dataId] || this.term1toColor[series.seriesId]\n\t\t}\n\t}\n\n\tsetTerm2Color(result) {\n\t\tif (!this.config.term2) return\n\t\tthis.term2toColor[result.dataId] = this.getColor(this.config.term2, result.dataId, this.bins?.[2])\n\t}\n\n\tgetColor(t, label, bins) {\n\t\tif (!t.term) return\n\t\tif (t.term.values) {\n\t\t\tfor (const [key, v] of Object.entries(t.term.values)) {\n\t\t\t\tif (!v.color) continue\n\t\t\t\tif (key === label) return v.color\n\t\t\t\tif (v.label === label) return v.color\n\t\t\t}\n\t\t}\n\t\tconst bin = bins?.find(bin => bin.label == label)\n\t\tif (bin?.color) return bin.color\n\n\t\tif (t.term.type == 'geneVariant' && t.q.type == 'values') return this.getMutationColor(label)\n\n\t\treturn rgb(this.colorScale(label)).toString()\n\t}\n\n\t// should move this outside of setTerm2Color(),\n\t// otherwise it will get *** recreated on every call *** to setTerm2Color()\n\tgetMutationColor(label) {\n\t\t// for (const [key, mc] of Object.entries(mclass)) if (mc.label == label) return mc.color\n\n\t\t// key is not used in loop above, can do this instead\n\t\tfor (const mc of Object.values(mclass)) if (mc.label === label && mc.color) return mc.color\n\n\t\t// can loop on the object directly\n\t\tfor (const key in mclass) {\n\t\t\tif (mclass[key].label === label && mclass[key].color) return mclass[key].color\n\t\t}\n\t}\n\n\t/*\n\t when term1 or term2 is a geneVariant term, return legendGrps: \n\t\t[ \n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tname: \"...\", \n\t\t\t\t\titems: [...]\n\t\t\t\t},\n\t\t\t\t...\n\t\t\t],\n\t\t\t... \n\t\t]\n\t*/\n\tgetLegendGrps() {\n\t\tconst t1 = this.config.term\n\t\tconst t2 = this.config.term2\n\t\tif (\n\t\t\t(t1.term.type == 'geneVariant' && t1.q.type == 'values') ||\n\t\t\t(t2?.term.type == 'geneVariant' && t2?.q.type == 'values')\n\t\t) {\n\t\t\tconst legendGrps = []\n\t\t\tfor (const chart of this.chartsData.charts) {\n\t\t\t\tlegendGrps.push(this.getOneLegendGrps(chart))\n\t\t\t}\n\t\t\treturn legendGrps\n\t\t}\n\t\treturn this.getOneLegendGrps()\n\t}\n\n\t//Used by getLegendGrps to get one legendGrps\n\tgetOneLegendGrps(chart) {\n\t\tconst legendGrps = []\n\t\tconst s = this.settings\n\t\tconst t1 = this.config.term\n\t\tconst t2 = this.config.term2\n\t\tconst headingStyle = 'color: #aaa; font-weight: 400'\n\n\t\t// descriptive statistics\n\t\tif (t1.q.descrStats) {\n\t\t\t// term1 has descriptive stats\n\t\t\tconst items = t1.q.descrStats.map(stat => {\n\t\t\t\treturn {\n\t\t\t\t\ttext: `${stat.label}: ${stat.value}`,\n\t\t\t\t\tnoIcon: true\n\t\t\t\t}\n\t\t\t})\n\t\t\t// title of descriptive stats should include the term1 name if term2 is present\n\t\t\tconst title = t2 ? `Descriptive statistics: ${t1.term.name}` : 'Descriptive statistics'\n\t\t\tconst name = `<span style=\"${headingStyle}\">${title}</span>`\n\t\t\tlegendGrps.push({ name, items })\n\t\t}\n\t\tif (t2?.q.descrStats) {\n\t\t\t// term2 has descriptive stats\n\t\t\tconst items = t2.q.descrStats.map(stat => {\n\t\t\t\treturn {\n\t\t\t\t\ttext: `${stat.label}: ${stat.value}`,\n\t\t\t\t\tnoIcon: true\n\t\t\t\t}\n\t\t\t})\n\t\t\t// title of descriptive stats will include the term2 name\n\t\t\t// because two terms are present\n\t\t\tconst title = `Descriptive statistics: ${t2.term.name}`\n\t\t\tconst name = `<span style=\"${headingStyle}\">${title}</span>`\n\t\t\tlegendGrps.push({ name, items })\n\t\t}\n\n\t\tif (s.cols && s.exclude.cols.length) {\n\t\t\tconst reducer = (sum, b) => sum + b.total\n\t\t\tconst items = s.exclude.cols\n\t\t\t\t.filter(collabel => s.cols.includes(collabel)) // && (!t1.term.values || collabel in t1.term.values))\n\t\t\t\t.flatMap(collabel => {\n\t\t\t\t\tconst filter = c => c.seriesId == collabel\n\t\t\t\t\tconst total =\n\t\t\t\t\t\tt2?.term?.type == 'condition'\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: (t1.term.type == 'geneVariant' && t1.q.type == 'values') ||\n\t\t\t\t\t\t\t (t2?.term.type == 'geneVariant' && t2?.q.type == 'values')\n\t\t\t\t\t\t\t? chart.serieses.filter(filter).reduce(reducer, 0)\n\t\t\t\t\t\t\t: this.currServerData.charts.reduce((sum, chart) => {\n\t\t\t\t\t\t\t\t\treturn sum + chart.serieses.filter(filter).reduce(reducer, 0)\n\t\t\t\t\t\t\t }, 0)\n\t\t\t\t\tif (!total && !t2?.term?.type) return []\n\t\t\t\t\tconst label = t1.term.values && collabel in t1.term.values ? t1.term.values[collabel].label : collabel\n\t\t\t\t\tconst ntotal = total ? ', n=' + total : ''\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid: collabel,\n\t\t\t\t\t\t\ttext: label + ntotal,\n\t\t\t\t\t\t\tcolor: '#fff',\n\t\t\t\t\t\t\ttextColor: '#000',\n\t\t\t\t\t\t\tborder: '1px solid #333',\n\t\t\t\t\t\t\t//inset: total ? \"n=\"+total : '',\n\t\t\t\t\t\t\tnoIcon: true,\n\t\t\t\t\t\t\ttype: 'col',\n\t\t\t\t\t\t\tisHidden: true,\n\t\t\t\t\t\t\thiddenOpacity: 1\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t})\n\t\t\t\t.sort(this.barSorter)\n\n\t\t\tif (items.length) {\n\t\t\t\tconst name = t2 ? t1.term.name : 'Other categories'\n\t\t\t\tlegendGrps.push({\n\t\t\t\t\tname: `<span style=\"${headingStyle}\">${name}</span>`,\n\t\t\t\t\titems\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\tif (s.rows /*&& s.rows.length > 1*/ && !s.hidelegend && t2 && this.term2toColor) {\n\t\t\tconst value_by_label =\n\t\t\t\tt2.term.type != 'condition' || !t2.q\n\t\t\t\t\t? ''\n\t\t\t\t\t: t2.q.value_by_max_grade\n\t\t\t\t\t? 'max. grade'\n\t\t\t\t\t: t2.q.value_by_most_recent\n\t\t\t\t\t? 'most recent'\n\t\t\t\t\t: ''\n\t\t\tlegendGrps.push({\n\t\t\t\tname:\n\t\t\t\t\t`<span style=\"${headingStyle}\">` + t2.term.name + (value_by_label ? ', ' + value_by_label : '') + '</span>',\n\t\t\t\titems: s.rows\n\t\t\t\t\t.flatMap(d => {\n\t\t\t\t\t\tconst total = chart ? this.totalsByDataId[d]?.[chart.chartId] : this.totalsByDataId[d]\n\t\t\t\t\t\tif (!total) return []\n\t\t\t\t\t\tconst ntotal = total ? ', n=' + total : ''\n\t\t\t\t\t\tconst label = t2.term.values && d in t2.term.values ? t2.term.values[d].label : d\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdataId: d,\n\t\t\t\t\t\t\t\ttext: label + ntotal,\n\t\t\t\t\t\t\t\tcolor: this.term2toColor[d],\n\t\t\t\t\t\t\t\ttype: 'row',\n\t\t\t\t\t\t\t\tisHidden: s.exclude.rows.includes(d)\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\t.sort(this.overlaySorter)\n\t\t\t})\n\t\t}\n\t\tif (t2 && this.state.multipleTestingCorrection) {\n\t\t\t// the dataset requires multiple testing correction and therefore needs to show this legend of Statistical Significance\n\t\t\t// calculate total number of unskipped tests\n\t\t\tlet testNum = 0\n\t\t\tfor (const chartId in this.chartsData.tests) {\n\t\t\t\ttestNum += this.chartsData.tests[chartId].reduce((a, b) => a + b.term2tests.filter(a => !a.skipped).length, 0)\n\t\t\t}\n\t\t\tconst items =\n\t\t\t\ttestNum > 1 && this.state.config.settings.barchart.multiTestingCorr\n\t\t\t\t\t? [{ text: `* p-value < (0.05 / ${testNum} tests)`, noEditColor: true }]\n\t\t\t\t\t: [{ text: `* p-value < 0.05`, noEditColor: true }]\n\t\t\tlegendGrps.push({\n\t\t\t\tname: `<span style=\"${headingStyle}\"> </span>`,\n\t\t\t\titems\n\t\t\t})\n\t\t}\n\n\t\treturn legendGrps\n\t}\n\n\t// helper so that 'Loading...' does not flash when not needed\n\ttoggleLoadingDiv(display = '') {\n\t\tif (display != 'none') {\n\t\t\tthis.dom.loadingDiv\n\t\t\t\t.style('opacity', 0)\n\t\t\t\t.style('display', display)\n\t\t\t\t.transition()\n\t\t\t\t.duration('loadingWait' in this ? this.loadingWait : 0)\n\t\t\t\t.style('opacity', 1)\n\t\t} else {\n\t\t\tthis.dom.loadingDiv.style('display', display)\n\t\t}\n\t\t// do not transition on initial chart load\n\t\tthis.loadingWait = 1000\n\t}\n}\n\nexport const barInit = getCompInit(Barchart)\n// this alias will allow abstracted dynamic imports\nexport const componentInit = barInit\n\nfunction setRenderers(self) {\n\tself.render = function () {\n\t\tconst charts = self.dom.barDiv.selectAll('.pp-sbar-div').data(self.visibleCharts, chart => chart.chartId)\n\n\t\tcharts.exit().each(self.exitChart)\n\t\tcharts.each(self.updateChart)\n\t\tcharts.enter().append('div').each(self.addChart)\n\n\t\tself.dom.holder.selectAll('.pp-chart-title').style('display', self.visibleCharts.length < 2 ? 'none' : 'block')\n\t\tconst grps = self.getLegendGrps()\n\t\tself.legendRenderer(grps)\n\n\t\tif (!self.visibleCharts.length) {\n\t\t\tconst clickLegendMessage =\n\t\t\t\tself.settings.exclude.cols.length || self.settings.exclude.rows.length\n\t\t\t\t\t? `<br/><span>click on a legend label below to display the barchart</span>`\n\t\t\t\t\t: ''\n\t\t\tself.dom.banner\n\t\t\t\t.html(`<span>No visible barchart data to render</span>${clickLegendMessage}`)\n\t\t\t\t.style('display', 'block')\n\t\t\tself.dom.legendDiv.selectAll('*').remove()\n\t\t} else {\n\t\t\tself.dom.banner.text('').style('display', 'none')\n\t\t}\n\t}\n\n\tself.exitChart = function (chart) {\n\t\tdelete self.renderers[chart.chartId]\n\t\tselect(this).remove()\n\t}\n\n\tself.updateChart = function (chart) {\n\t\t// this.dom.legendDiv.remove(\"*\")\n\t\tchart.settings.cols.sort(self.barSorter)\n\t\tchart.maxAcrossCharts = self.chartsData.maxAcrossCharts\n\t\tchart.handlers = self.handlers\n\t\tchart.maxSeriesLogTotal = 0\n\t\tchart.visibleSerieses.forEach(series => self.sortStacking(series, chart, self.chartsData))\n\t\tself.renderers[chart.chartId](chart)\n\n\t\tconst div = select(this)\n\t\tdiv.style(\n\t\t\t'display',\n\t\t\tself.state.config.settings.barchart.divideOrientation == 'horizontal' ? 'inline-block' : 'block'\n\t\t)\n\n\t\tdiv.select('.pp-sbar-div-chartLengends').selectAll('*').remove()\n\t\tif (self.chartsData.tests && self.chartsData.tests[chart.chartId] && self.config.settings.barchart.showStatsTable) {\n\t\t\t//chart has pvalues\n\t\t\tgeneratePvalueTable(chart, div)\n\t\t}\n\t}\n\n\tself.addChart = function (chart, i) {\n\t\tconst div = select(this)\n\t\t\t.attr('class', 'pp-sbar-div')\n\t\t\t.style(\n\t\t\t\t'display',\n\t\t\t\tself.state.config.settings.barchart.divideOrientation == 'horizontal' ? 'inline-block' : 'block'\n\t\t\t)\n\t\t\t.style('padding', '20px')\n\t\t\t.style('vertical-align', 'top')\n\t\tself.renderers[chart.chartId] = barsRenderer(self, select(this))\n\t\t//self.updateChart.call(this, chart)\n\t\tchart.settings.cols.sort(self.barSorter)\n\t\tchart.maxAcrossCharts = self.chartsData.maxAcrossCharts\n\t\tchart.handlers = self.handlers\n\t\tchart.maxSeriesLogTotal = 0\n\t\tchart.visibleSerieses.forEach(series => self.sortStacking(series, chart, self.chartsData))\n\t\tself.renderers[chart.chartId](chart)\n\n\t\t// div for chart-specific legends\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.attr('class', 'pp-sbar-div-chartLengends')\n\t\t\t.attr('data-testid', 'sjpcb-bars-chartLengends')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.style('margin', '10px 10px 10px 30px')\n\t\t\t.style('display', 'none')\n\n\t\tif (self.chartsData.tests && self.chartsData.tests[chart.chartId] && self.config.settings.barchart.showStatsTable) {\n\t\t\t//chart has pvalues\n\t\t\tgeneratePvalueTable(chart, div)\n\t\t}\n\t}\n\n\t/*\n\tA function to generate a p-value table for Chi-squared/Fisher's exact tests\n\t*/\n\tfunction generatePvalueTable(chart, div) {\n\t\tconst holder = div\n\t\t\t.select('.pp-sbar-div-chartLengends')\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('vertical-align', 'top')\n\t\t\t.style('text-align', 'center')\n\t\t\t.append('div')\n\t\t// sort term1 categories based on self.chartsData.refs.cols\n\t\t// const cols = self.settings.dedup ? self.chartsData.refs.cols\n\t\tself.chartsData.tests[chart.chartId].sort(function (a, b) {\n\t\t\treturn self.settings.cols.indexOf(a.term1comparison) - self.settings.cols.indexOf(b.term1comparison)\n\t\t})\n\n\t\t// sort term2 categories based on self.chartsData.refs.rows\n\t\tfor (const t1c of self.chartsData.tests[chart.chartId]) {\n\t\t\tt1c.term2tests.sort(function (a, b) {\n\t\t\t\treturn self.chartsData.refs.rows.indexOf(a.term2id) - self.chartsData.refs.rows.indexOf(b.term2id)\n\t\t\t})\n\t\t}\n\t\tconst columns = [\n\t\t\t{ label: 'Row 1' },\n\t\t\t{ label: 'Row 2' },\n\t\t\t{ label: 'Column 1' },\n\t\t\t{ label: 'Column 2' },\n\t\t\t{ label: 'P-value' }\n\t\t]\n\t\tconst noSkipped = self.chartsData.tests[chart.chartId].every(term1 =>\n\t\t\tterm1.term2tests.every(term2 => !term2.skipped)\n\t\t)\n\t\tconst rows = []\n\n\t\tconst visibleTests = self.chartsData.tests[chart.chartId].filter(term1Data =>\n\t\t\tchart.visibleSerieses.some(visibleTerm1 => visibleTerm1.seriesId === term1Data.term1comparison)\n\t\t)\n\t\tfor (const [index, term1] of visibleTests.entries()) {\n\t\t\tif (visibleTests.length == 2 && index == 1) {\n\t\t\t\t// when term1 has only 2 categories, then only a single category needs to be tested in the\n\t\t\t\t// association test (because the other category will get tested in that same test).\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tconst visibleTerm1Data = chart.visibleSerieses.find(\n\t\t\t\tvisibleTerm1 => visibleTerm1.seriesId === term1.term1comparison\n\t\t\t)\n\t\t\tconst visibleTerm2Data = term1.term2tests.filter(term2Data =>\n\t\t\t\tvisibleTerm1Data.visibleData.some(visibleTerm2 => visibleTerm2.dataId === term2Data.term2id)\n\t\t\t)\n\t\t\tfor (const [index2, term2] of visibleTerm2Data.entries()) {\n\t\t\t\tif (chart.settings.rows.length - chart.settings.exclude.rows.length == 2 && index2 == 1) {\n\t\t\t\t\t// when term2 has only 2 visible categories, then only a single category needs to be tested in the\n\t\t\t\t\t// association test (because the other category will get tested in that same test).\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tlet negateTerm2Label = negateTermLabel(term2.term2Label)\n\t\t\t\tif (chart.settings.rows.length - chart.settings.exclude.rows.length == 2) {\n\t\t\t\t\t// when term2 has only 2 visible categories, Col2 would be the other category instead of \"not Col1\"\n\t\t\t\t\tconst visibleTerm2CatsKeys = chart.settings.rows.filter(row => !chart.settings.exclude.rows.includes(row))\n\t\t\t\t\tconst visibleTerm2Labels = visibleTerm2CatsKeys\n\t\t\t\t\t\t.map(catK => self.config.term2?.term?.values?.[catK]?.label)\n\t\t\t\t\t\t.filter(x => x != undefined)\n\t\t\t\t\tif (visibleTerm2Labels?.length == 2)\n\t\t\t\t\t\tnegateTerm2Label = visibleTerm2Labels[0] == term2.term2Label ? visibleTerm2Labels[1] : visibleTerm2Labels[0]\n\t\t\t\t}\n\n\t\t\t\trows.push([\n\t\t\t\t\t{ value: `${term1.term1Label}` },\n\t\t\t\t\t// when term1 has only 2 categories, Row2 would be the other category instead of \"not Row1\"\n\t\t\t\t\t{ value: visibleTests.length == 2 ? visibleTests[1].term1Label : negateTermLabel(term1.term1Label) },\n\t\t\t\t\t{ value: term2.term2Label },\n\t\t\t\t\t{ value: negateTerm2Label },\n\t\t\t\t\t//if both chi-square and Fisher's exact tests were used. for the tests computed by Fisher's exact test, add a superscript letter 'a' after the pvalue.\n\t\t\t\t\t{\n\t\t\t\t\t\thtml: term2.skipped\n\t\t\t\t\t\t\t? 'N/A'\n\t\t\t\t\t\t\t: term2.pvalue > 1e-4\n\t\t\t\t\t\t\t? roundValueAuto(Number(term2.pvalue))\n\t\t\t\t\t\t\t: roundValueAuto(Number(term2.pvalue))\n\t\t\t\t\t}\n\t\t\t\t])\n\t\t\t}\n\t\t}\n\t\t//adding a title for the pvalue table\n\t\t//title is \"Group comparisons (Fisher's exact test)\" if all tests are Fisher's exact test, otherwise title is 'Group comparisons (Chi-square test)'\n\t\tconst title = holder\n\t\t\t.append('div')\n\t\t\t.style('font-weight', 'bold')\n\t\t\t.style('padding-bottom', '0.5em')\n\t\t\t.html(\"2x2 Association test (Fisher's exact test)\")\n\t\t\t.style('font-size', '0.9em')\n\n\t\tconst table = holder.append('div').style('font-size', '0.9em')\n\n\t\trenderTable({\n\t\t\tcolumns,\n\t\t\trows,\n\t\t\tdiv: table,\n\t\t\tshowLines: false,\n\t\t\tmaxWidth: '70vw',\n\t\t\tmaxHeight: `${chart.svgh - 100}px`,\n\t\t\tresize: true\n\t\t})\n\n\t\t//footnote: superscript letter 'a' indicates the pvalue was computed by Fisher's exact test\n\t\ttable\n\t\t\t.append('div')\n\t\t\t.style('margin-top', '10px')\n\t\t\t.style('text-align', 'left')\n\t\t\t.style('font-size', '10px')\n\t\t\t.style('font-weight', 'normal')\n\t\t\t.html(noSkipped ? '' : 'N/A: association test skipped because of limited sample size <br>')\n\t}\n}\n\nfunction setInteractivity(self) {\n\tself.handlers = getHandlers(self)\n\n\tself.download = function () {\n\t\tif (!self.state) return\n\t\t// has to be able to handle multichart view\n\t\tconst mainGs = []\n\t\tconst translate = { x: undefined, y: undefined }\n\t\tconst titles = []\n\t\tlet maxw = 0,\n\t\t\tmaxh = 0,\n\t\t\ttboxh = 0\n\t\tlet prevY = 0,\n\t\t\tnumChartsPerRow = 0\n\n\t\tself.dom.barDiv.selectAll('.sjpcb-bars-mainG').each(function () {\n\t\t\tmainGs.push(this)\n\t\t\tconst bbox = this.getBBox()\n\t\t\tif (bbox.width > maxw) maxw = bbox.width\n\t\t\tif (bbox.height > maxh) maxh = bbox.height\n\t\t\tconst divY = Math.round(this.parentNode.parentNode.getBoundingClientRect().y)\n\t\t\tif (!numChartsPerRow) {\n\t\t\t\tprevY = divY\n\t\t\t\tnumChartsPerRow++\n\t\t\t} else if (Math.abs(divY - prevY) < 5) {\n\t\t\t\tnumChartsPerRow++\n\t\t\t}\n\t\t\tconst xy = select(this)\n\t\t\t\t.attr('transform')\n\t\t\t\t.split('translate(')[1]\n\t\t\t\t.split(')')[0]\n\t\t\t\t.split(',')\n\t\t\t\t.map(d => +d.trim())\n\t\t\tif (translate.x === undefined || xy[0] > translate.x) translate.x = +xy[0]\n\t\t\tif (translate.y === undefined || xy[1] > translate.y) translate.y = +xy[1]\n\n\t\t\tconst title = this.parentNode.parentNode.firstChild\n\t\t\tconst tbox = title.getBoundingClientRect()\n\t\t\tif (tbox.width > maxw) maxw = tbox.width\n\t\t\tif (tbox.height > tboxh) tboxh = tbox.height\n\t\t\ttitles.push({ text: title.innerText, styles: window.getComputedStyle(title) })\n\t\t})\n\n\t\t// add padding between charts\n\t\tmaxw += 30\n\t\tmaxh += 30\n\n\t\tconst svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\n\t\tconst svgSel = select(svg)\n\t\t\t.style('display', 'block')\n\t\t\t.style('opacity', 1)\n\t\t\t.attr('width', numChartsPerRow * maxw)\n\t\t\t.attr('height', Math.floor(mainGs.length / numChartsPerRow) * maxh)\n\n\t\tconst svgStyles = window.getComputedStyle(document.querySelector('.pp-bars-svg'))\n\t\tfor (const prop of svgStyles) {\n\t\t\tif (prop.startsWith('font')) svgSel.style(prop, svgStyles.getPropertyValue(prop))\n\t\t}\n\n\t\tmainGs.forEach((g, i) => {\n\t\t\tconst mainG = g.cloneNode(true)\n\t\t\tconst colNum = i % numChartsPerRow\n\t\t\tconst rowNum = Math.floor(i / numChartsPerRow)\n\t\t\tconst corner = { x: colNum * maxw + translate.x, y: rowNum * maxh + translate.y }\n\t\t\tconst title = select(svg)\n\t\t\t\t.append('text')\n\t\t\t\t.attr('transform', 'translate(' + corner.x + ',' + corner.y + ')')\n\t\t\t\t.text(titles[i].text)\n\t\t\tfor (const prop of titles[i].styles) {\n\t\t\t\tif (prop.startsWith('font')) title.style(prop, titles[i].styles.getPropertyValue(prop))\n\t\t\t}\n\n\t\t\tselect(mainG).attr('transform', 'translate(' + corner.x + ',' + (corner.y + tboxh) + ')')\n\t\t\tsvg.appendChild(mainG)\n\t\t})\n\n\t\t// svg + legend must be attached to DOM in order for getBBox() to work within svgLegendRenderer\n\t\tconst hiddenDiv = select('body').append('div').style('opacity', 0)\n\t\thiddenDiv.node().appendChild(svg)\n\n\t\tself.svgLegendRenderer = svgLegend({\n\t\t\tholder: svgSel.append('g'),\n\t\t\trectFillFxn: d => d.color,\n\t\t\ticonStroke: '#aaa'\n\t\t})\n\n\t\tconst s = self.settings\n\t\tconst svg0 = self.dom.barDiv.select('svg').node().getBoundingClientRect()\n\t\tlet data = self.getLegendGrps()\n\t\tdata.forEach(d => {\n\t\t\td.name = d.name.replace(/<[^>]*>?/gm, '')\n\t\t\tif (d.items) d.items = d.items.filter(c => !c.isHidden)\n\t\t})\n\t\tdata = data.filter(d => d.items.length && !d.name.includes('tatistic'))\n\t\tconst fontsize = 14\n\t\tself.svgLegendRenderer(data, {\n\t\t\tsettings: Object.assign(\n\t\t\t\t{\n\t\t\t\t\tontop: false,\n\t\t\t\t\tlineh: 25,\n\t\t\t\t\tpadx: 5,\n\t\t\t\t\tpadleft: 0, //150,\n\t\t\t\t\tpadright: 20,\n\t\t\t\t\tpadbtm: 30,\n\t\t\t\t\tfontsize,\n\t\t\t\t\ticonh: fontsize - 2,\n\t\t\t\t\ticonw: fontsize - 2,\n\t\t\t\t\thangleft: 1,\n\t\t\t\t\tlinesep: false\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tsvgw: self.visibleCharts.length * svg0.width,\n\t\t\t\t\tsvgh: svg0.height,\n\t\t\t\t\tdimensions: {\n\t\t\t\t\t\txOffset: 50\n\t\t\t\t\t},\n\t\t\t\t\tpadleft: 50\n\t\t\t\t}\n\t\t\t)\n\t\t})\n\n\t\tconst box = self.dom.legendDiv.node().getBoundingClientRect()\n\t\tselect(svg).attr('height', svg0.height + box.height + 30)\n\t\tif (box.width > svg0.width) select(svg).attr('width', box.width)\n\t\thiddenDiv.remove()\n\n\t\tconst svg_name = self.config.term.term.name + ' barchart'\n\t\tto_svg(svg, svg_name, { apply_dom_styles: true })\n\t}\n}\n\nexport function getDefaultBarSettings(app) {\n\treturn {\n\t\torientation: 'horizontal',\n\t\tdivideOrientation: 'horizontal', // maintain horizontal as default charts layout\n\t\tunit: 'abs',\n\t\toverlay: 'none',\n\t\tdivideBy: 'none',\n\t\trowlabelw: 250,\n\t\tasterisksVisible: app?.getState()?.termdbConfig?.multipleTestingCorrection ? true : false,\n\t\tmultiTestingCorr: app?.getState()?.termdbConfig?.multipleTestingCorrection?.applyByDefault ? true : false,\n\t\tdefaultColor: plotColor,\n\t\tcolorBars: false,\n\t\tdedup: false,\n\t\tshowStatsTable: true\n\t}\n}\n\nexport async function getPlotConfig(opts, app) {\n\tif (!opts.term) throw 'barchart getPlotConfig: opts.term{} missing'\n\ttry {\n\t\tawait fillTermWrapper(opts.term, app.vocabApi)\n\t\tif (opts.term2) await fillTermWrapper(opts.term2, app.vocabApi)\n\t\tif (opts.term0) await fillTermWrapper(opts.term0, app.vocabApi)\n\t} catch (e) {\n\t\tconsole.log('Error reading config: ' + JSON.stringify(opts))\n\t\tconsole.error(e)\n\t\tthrow `${e} [barchart getPlotConfig()]`\n\t}\n\n\tconst config = {\n\t\tid: opts.term.term.id,\n\t\tsettings: {\n\t\t\tcontrols: {\n\t\t\t\tterm2: null, // the previous overlay value may be displayed as a convenience for toggling\n\t\t\t\tterm0: null\n\t\t\t},\n\t\t\tcommon: {\n\t\t\t\tuse_logscale: false, // flag for y-axis scale type, 0=linear, 1=log\n\t\t\t\tuse_percentage: false,\n\t\t\t\tbarheight: 300, // maximum bar length\n\t\t\t\tbarwidth: 20, // bar thickness\n\t\t\t\tbarspace: 2 // space between two bars\n\t\t\t},\n\t\t\tbarchart: getDefaultBarSettings(app)\n\t\t}\n\t}\n\n\t// may apply term-specific changes to the default object\n\treturn copyMerge(config, opts)\n}\n\n// a function used by generatePvalueTable to negate a term label\n// TODO: add more conditions for better negation than \"not termLable\"\nexport function negateTermLabel(termLabel) {\n\tconst termLabelStr = String(termLabel)\n\tif (termLabelStr.toUpperCase().startsWith('NOT ')) {\n\t\treturn termLabelStr.substring(4) // Remove the \"not\" prefix\n\t} else {\n\t\treturn 'not ' + termLabelStr // Otherwise, add \"not\" prefix\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["id", "term2", "d", "event", "group", "d", "bin", "chart", "a"]
|
|
7
|
+
}
|