@sjcrh/proteinpaint-client 2.170.2 → 2.171.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-TRTL5RIT.js → 2dmaf-NULVBOXA.js} +8 -8
- package/dist/{AIProjectAdmin-YQEZDLTR.js → AIProjectAdmin-CFBJXRDX.js} +71 -26
- package/dist/{AIProjectAdmin-YQEZDLTR.js.map → AIProjectAdmin-CFBJXRDX.js.map} +2 -2
- package/dist/{AppHeader-UWDROFOQ.js → AppHeader-7JYXB4DY.js} +16 -16
- package/dist/{BoxPlot-6YBOOOMT.js → BoxPlot-RFW4FE7T.js} +8 -8
- package/dist/{BoxPlot-6YBOOOMT.js.map → BoxPlot-RFW4FE7T.js.map} +2 -2
- package/dist/{CorrelationVolcano-HQVOSKB3.js → CorrelationVolcano-KMBRCL7V.js} +8 -8
- package/dist/{DifferentialAnalysis-PYO2CH5P.js → DifferentialAnalysis-QMZAHDUY.js} +10 -10
- package/dist/{Disco-D52FVUEO.js → Disco-Y7SGKJ6O.js} +71 -34
- package/dist/Disco-Y7SGKJ6O.js.map +7 -0
- package/dist/{Disco.UI-IYLN42SN.js → Disco.UI-XV547I36.js} +11 -11
- package/dist/{GB-ZAMWKKEW.js → GB-PP6V7Q5Q.js} +10 -10
- package/dist/{HicApp-NDWHBLJR.js → HicApp-U3FSL5IQ.js} +10 -10
- package/dist/{NumBinaryEditor-ENCJVC3Q.js → NumBinaryEditor-QX6XP55J.js} +8 -8
- package/dist/{NumBinaryEditor.unit.spec-27PMZBYI.js → NumBinaryEditor.unit.spec-4WULZW4X.js} +9 -9
- package/dist/{NumContEditor-KMZ6TPHX.js → NumContEditor-U6TP4JUK.js} +8 -8
- package/dist/{NumContEditor.unit.spec-I4G3X5XV.js → NumContEditor.unit.spec-YV6VJSSF.js} +9 -9
- package/dist/{NumCustomBinEditor-YZF67LOQ.js → NumCustomBinEditor-QYGSDTAO.js} +9 -9
- package/dist/{NumCustomBinEditor.unit.spec-WC6LQDGJ.js → NumCustomBinEditor.unit.spec-Q6EURCRN.js} +9 -9
- package/dist/{NumDiscreteEditor-PRWHOR4D.js → NumDiscreteEditor-S3AIKKVE.js} +12 -12
- package/dist/{NumDiscreteEditor.unit.spec-F4RUC5XQ.js → NumDiscreteEditor.unit.spec-X4P2WCWA.js} +9 -9
- package/dist/{NumRegularBinEditor-SGJ64KAG.js → NumRegularBinEditor-KEY7EYOZ.js} +9 -9
- package/dist/{NumRegularBinEditor.unit.spec-4GGUHTIQ.js → NumRegularBinEditor.unit.spec-P6OZIF67.js} +9 -9
- package/dist/{NumSplineEditor-3YD2LY66.js → NumSplineEditor-KLSQQZZM.js} +8 -8
- package/dist/{NumSplineEditor.unit.spec-MY5VM6CN.js → NumSplineEditor.unit.spec-D7H4N5YN.js} +9 -9
- package/dist/{NumericDensity-FWSZV7TD.js → NumericDensity-JPTAN3DG.js} +8 -8
- package/dist/{NumericDensity.unit.spec-MMBSYCHJ.js → NumericDensity.unit.spec-4KZPLVD3.js} +8 -8
- package/dist/{NumericHandler-TJVMR232.js → NumericHandler-U2QBQS7T.js} +9 -9
- package/dist/{NumericHandler.unit.spec-XEJRRORV.js → NumericHandler.unit.spec-AWMQMBSC.js} +9 -9
- package/dist/{SC-GGN7UVLX.js → SC-J3PVK4Q5.js} +8 -8
- package/dist/{Volcano-2WPXXICL.js → Volcano-75ZAK5VI.js} +9 -9
- package/dist/{WSIViewer-PZW4NQB6.js → WSIViewer-6QJPUMKA.js} +28 -20
- package/dist/{WSIViewer-PZW4NQB6.js.map → WSIViewer-6QJPUMKA.js.map} +2 -2
- package/dist/{WsiSamplesPlot-25VDFJX3.js → WsiSamplesPlot-ZMV7ILUV.js} +9 -9
- package/dist/{adSandbox-CPZBFRYS.js → adSandbox-ORRNN4M7.js} +9 -9
- package/dist/{alphaGenome-RI7WM5JR.js → alphaGenome-TLQHWR5H.js} +8 -8
- package/dist/{app-KHGVOGCA.js → app-6EHQG2LS.js} +18 -18
- package/dist/{app-HQIYQFAQ.js → app-HVS47MKD.js} +8 -8
- package/dist/app.js +14 -14
- package/dist/{bam-VORHBA6P.js → bam-EXBX3IJY.js} +10 -10
- package/dist/{barchart-7A6QUYMI.js → barchart-CCYIYLAK.js} +8 -8
- package/dist/{barchart.data-RUKFEDLG.js → barchart.data-V757AO73.js} +8 -8
- package/dist/{barchart.events-X5MR77JP.js → barchart.events-MSKITZZN.js} +8 -8
- package/dist/{barchart.integration.spec-LKTHIRKC.js → barchart.integration.spec-4NI3OMFT.js} +18 -17
- package/dist/{barchart.integration.spec-LKTHIRKC.js.map → barchart.integration.spec-4NI3OMFT.js.map} +2 -2
- package/dist/{block-XJNR427G.js → block-HARZTSBZ.js} +29 -29
- package/dist/{block.init-K6IYQCVG.js → block.init-5TGIIXLK.js} +9 -9
- package/dist/{block.mds.expressionrank-G4YT3ITI.js → block.mds.expressionrank-L6LF5OGC.js} +10 -10
- package/dist/{block.mds.geneboxplot-2VFCOY4F.js → block.mds.geneboxplot-2LGE36IG.js} +9 -9
- package/dist/{block.mds.junction-3RADQYBR.js → block.mds.junction-GQA3H7WZ.js} +15 -15
- package/dist/{block.mds.svcnv-G7UTUOIX.js → block.mds.svcnv-UCR4S2LF.js} +22 -22
- package/dist/{block.svg-W2CR4CTT.js → block.svg-OXWF3HSA.js} +8 -8
- package/dist/{block.tk.aicheck-W7N2FBKE.js → block.tk.aicheck-SDZPT3PF.js} +8 -8
- package/dist/{block.tk.ase-OHVIYASE.js → block.tk.ase-4O5LJPTL.js} +10 -10
- package/dist/{block.tk.bam-GYDBKELJ.js → block.tk.bam-LRMNMFCJ.js} +8 -8
- package/dist/{block.tk.bedgraphdot-335OUZDX.js → block.tk.bedgraphdot-MBBCR4NC.js} +8 -8
- package/dist/{block.tk.bigwig.ui-UEIKD46U.js → block.tk.bigwig.ui-FL5UUQVN.js} +8 -8
- package/dist/{block.tk.hicstraw-JQYWZTBW.js → block.tk.hicstraw-KTTJDPGS.js} +9 -9
- package/dist/{block.tk.junction-WPGJ7APU.js → block.tk.junction-VMPDXHQR.js} +12 -12
- package/dist/{block.tk.junction.textmatrixui-MY4FCKK5.js → block.tk.junction.textmatrixui-6IUZRTGV.js} +9 -9
- package/dist/{block.tk.ld-W6S2DEOS.js → block.tk.ld-HN7TITP4.js} +11 -11
- package/dist/{block.tk.menu-KI65FAQC.js → block.tk.menu-5S2VJJKZ.js} +8 -8
- package/dist/{block.tk.pgv-E5BSB22L.js → block.tk.pgv-KFM6VQEA.js} +11 -11
- package/dist/{brainImaging-4NPWW63N.js → brainImaging-LAJPH266.js} +8 -8
- package/dist/{chat-IV67D3I3.js → chat-B7MJ6MXM.js} +9 -9
- package/dist/{chunk-DQNHLS6Y.js → chunk-34RYIRTD.js} +3 -3
- package/dist/{chunk-RERIGX7D.js → chunk-3Q5HK4N4.js} +2 -2
- package/dist/{chunk-HD5BRUXL.js → chunk-4JEN2Y3T.js} +5 -5
- package/dist/{chunk-MQFFZOYH.js → chunk-5AHDD454.js} +5 -5
- package/dist/{chunk-CSMHADZL.js → chunk-5UXFNBWZ.js} +7 -7
- package/dist/{chunk-GHI75432.js → chunk-67QJQ4MT.js} +8 -2
- package/dist/chunk-67QJQ4MT.js.map +7 -0
- package/dist/{chunk-CBH7E4CZ.js → chunk-6XZ4QG2S.js} +3 -3
- package/dist/{chunk-UMD43EU7.js → chunk-77OHO7EA.js} +2 -2
- package/dist/{chunk-GOSADDSN.js → chunk-7RXIGX5P.js} +12 -12
- package/dist/{chunk-NLS7X5LY.js → chunk-AY73FQLU.js} +9 -9
- package/dist/{chunk-XNNPS7PL.js → chunk-BH5G6JKX.js} +11 -11
- package/dist/{chunk-OKAXAC5U.js → chunk-BTYRXZZL.js} +6 -6
- package/dist/{chunk-5K6L3WGS.js → chunk-CAJJV4K2.js} +31 -31
- package/dist/{chunk-BUXS26F4.js → chunk-CNW6OLYY.js} +4 -4
- package/dist/{chunk-HISAS5OU.js → chunk-CTDY2CMT.js} +2 -2
- package/dist/{chunk-B4YNT4QW.js → chunk-CXW25G2T.js} +7 -7
- package/dist/{chunk-6IH5W6UC.js → chunk-D3PQH6RE.js} +3 -3
- package/dist/{chunk-4XAAGRWA.js → chunk-D6VZESYY.js} +7 -7
- package/dist/{chunk-MUCRBG5F.js → chunk-DNZHE7FP.js} +4 -4
- package/dist/{chunk-RU7NM2HO.js → chunk-F5BTEQEW.js} +3 -3
- package/dist/{chunk-ZJFQ5N4A.js → chunk-F6XCNNS6.js} +5 -5
- package/dist/{chunk-WTNMUTHT.js → chunk-FIZ4S7AN.js} +8 -8
- package/dist/{chunk-K4LI3NKS.js → chunk-FLJ2GUHL.js} +227 -162
- package/dist/chunk-FLJ2GUHL.js.map +7 -0
- package/dist/chunk-FSGEVTVI.js +168 -0
- package/dist/{chunk-7FCA4KIE.js → chunk-FVTQMCMG.js} +3 -3
- package/dist/{chunk-3VA4MJQQ.js → chunk-GSRQZE6V.js} +2 -2
- package/dist/{chunk-7575UK54.js → chunk-HHFK426A.js} +2 -2
- package/dist/{chunk-JTGDV7NZ.js → chunk-HX2U4DFY.js} +7 -7
- package/dist/chunk-HX2U4DFY.js.map +7 -0
- package/dist/{chunk-WNBJMVEE.js → chunk-IAMFJMMC.js} +2 -2
- package/dist/{chunk-6BV2ZBNU.js → chunk-JFQM7LYS.js} +8 -8
- package/dist/{chunk-WIEKWIQY.js → chunk-JINNBHDF.js} +3 -3
- package/dist/chunk-JINNBHDF.js.map +7 -0
- package/dist/{chunk-T3U2GVSC.js → chunk-KAXBZQW3.js} +3 -3
- package/dist/{chunk-TLZJXDZZ.js → chunk-KDVM3AVQ.js} +11 -11
- package/dist/chunk-KDVM3AVQ.js.map +7 -0
- package/dist/{chunk-4ANV7WKU.js → chunk-KZXEXB3K.js} +2 -2
- package/dist/{chunk-BJ2UYDYL.js → chunk-L435EWEI.js} +5 -6
- package/dist/chunk-L435EWEI.js.map +7 -0
- package/dist/{chunk-52DOAUEG.js → chunk-MUN6WCMX.js} +5 -5
- package/dist/{chunk-2WPIXNJD.js → chunk-MYBLQGD6.js} +3 -2
- package/dist/{chunk-2WPIXNJD.js.map → chunk-MYBLQGD6.js.map} +2 -2
- package/dist/{chunk-EHMNO46L.js → chunk-N7BE3ZF5.js} +2 -2
- package/dist/{chunk-EIMOBM5J.js → chunk-NL7WRKHQ.js} +6 -6
- package/dist/{chunk-L7YF2J27.js → chunk-NTH4X4ZX.js} +14 -14
- package/dist/{chunk-QAC4K4S6.js → chunk-OUKTVVOI.js} +3 -3
- package/dist/{chunk-S7FUDZD5.js → chunk-PJEIREMJ.js} +2 -2
- package/dist/{chunk-32LUIEDR.js → chunk-PLPYDZS7.js} +11 -16
- package/dist/chunk-PLPYDZS7.js.map +7 -0
- package/dist/{chunk-VJUB2TUE.js → chunk-PNVVKQJV.js} +2 -2
- package/dist/{chunk-DEUI26GX.js → chunk-PO22RN6V.js} +9 -9
- package/dist/{chunk-DFBQHO4T.js → chunk-QSSTMH7C.js} +23 -3
- package/dist/chunk-QSSTMH7C.js.map +7 -0
- package/dist/{chunk-LNKVNRRR.js → chunk-RDMXKGKH.js} +2 -2
- package/dist/{chunk-DWE42LXW.js → chunk-RGNJKYXM.js} +2 -2
- package/dist/{chunk-7EUKSBAJ.js → chunk-ROY5OATX.js} +5 -5
- package/dist/{chunk-PJ376FKI.js → chunk-SEEKAG6E.js} +2 -2
- package/dist/{chunk-IJPAGSZN.js → chunk-SPCZQRRQ.js} +5 -5
- package/dist/{chunk-JJECYRIX.js → chunk-SZOQJ5NV.js} +6 -6
- package/dist/{chunk-F7KC4VGP.js → chunk-TKNO4Y2X.js} +2 -2
- package/dist/{chunk-NCT2SONQ.js → chunk-TMYG3EWX.js} +3 -3
- package/dist/{chunk-LSEFWW72.js → chunk-TPK3G44P.js} +3 -3
- package/dist/{chunk-OLU24OY5.js → chunk-TR6EV3FG.js} +1 -5
- package/dist/{chunk-OLU24OY5.js.map → chunk-TR6EV3FG.js.map} +3 -3
- package/dist/{chunk-NFUK32U5.js → chunk-U4TQ2HA6.js} +2 -2
- package/dist/{chunk-OH5HST4D.js → chunk-UVJS2AS7.js} +2 -2
- package/dist/{chunk-IQ3AZ4GW.js → chunk-VCWFNXJ6.js} +2 -2
- package/dist/{chunk-RDQKNQYT.js → chunk-WF4GYH5G.js} +2 -2
- package/dist/{chunk-N7JXPFLR.js → chunk-XBALT3QM.js} +39 -39
- package/dist/{chunk-QJPJZQEQ.js → chunk-XKL4CBO4.js} +10 -4
- package/dist/chunk-XKL4CBO4.js.map +7 -0
- package/dist/{chunk-3YJYBZIJ.js → chunk-XKMTTIU6.js} +3 -2
- package/dist/chunk-XKMTTIU6.js.map +7 -0
- package/dist/{chunk-4RQZE32U.js → chunk-ZES5HYNU.js} +5 -5
- package/dist/{chunk-622K7HUV.js → chunk-ZPCPRN4P.js} +2 -2
- package/dist/{chunk-BWKM4SGN.js → chunk-ZZOURNNY.js} +4 -4
- package/dist/{condition-OV5LAKLC.js → condition-MXP7ZZJA.js} +8 -8
- package/dist/{controls-VU4ZKU6P.js → controls-NOPNWCWP.js} +8 -8
- package/dist/{controls.btns-HOYT3NHX.js → controls.btns-QJI3KHUO.js} +2 -2
- package/dist/{controls.config-Y4ABH4KN.js → controls.config-2FG63Z7P.js} +8 -8
- package/dist/{correlation-ONQEZZP5.js → correlation-G5KHUFPN.js} +18 -18
- package/dist/{cuminc-ZVFVJZOP.js → cuminc-M5VZA3M5.js} +9 -9
- package/dist/{cuminc.integration.spec-G33322YH.js → cuminc.integration.spec-7GRBB7SM.js} +16 -16
- package/dist/{customdata.inputui-N7QJ3US3.js → customdata.inputui-UF2FWEXK.js} +8 -8
- package/dist/{dataDownload-QEZSVVGK.js → dataDownload-NLSMLL2P.js} +8 -8
- package/dist/{dataDownload.integration.spec-B7BYKLZ4.js → dataDownload.integration.spec-BVHNEKY2.js} +16 -16
- package/dist/{databrowser.ui-CK4GJYKG.js → databrowser.ui-D7LBOQH3.js} +18 -18
- package/dist/{dictionary-7SKULO7G.js → dictionary-NFZ5TJMD.js} +8 -8
- package/dist/{e2pca-FWCP5KPK.js → e2pca-4ZZMZYLO.js} +8 -8
- package/dist/{ep-DC6Q7DUI.js → ep-HJKT323Q.js} +8 -8
- package/dist/{expclust.gdc.spec-N25HZEDL.js → expclust.gdc.spec-2DNCZGRP.js} +16 -16
- package/dist/{facet-S7XUSJWD.js → facet-BLY52PGL.js} +8 -8
- package/dist/{frequencyChart-6DQVTXVX.js → frequencyChart-2XZFQNZC.js} +13 -13
- package/dist/{frequencyChart.integration.spec-NEGNBLSZ.js → frequencyChart.integration.spec-GVJ2OZ52.js} +16 -16
- package/dist/{geneExpClustering-ZAFWKTBV.js → geneExpClustering-YKXQ2JCT.js} +10 -10
- package/dist/{geneExpression-V7AK7EMP.js → geneExpression-3RE5NMZL.js} +2 -2
- package/dist/{geneExpression-3RNMGWS4.js → geneExpression-UJCKOE5D.js} +8 -8
- package/dist/{geneORA-HYOP6FZB.js → geneORA-CM5ORPVR.js} +8 -8
- package/dist/{geneVariant-664QBH6K.js → geneVariant-JIW5GGOY.js} +8 -8
- package/dist/{geneVariant-3QMO5W7L.js → geneVariant-S3RFTETK.js} +29 -13
- package/dist/geneVariant-S3RFTETK.js.map +7 -0
- package/dist/{genefusion.ui-65T7HWCP.js → genefusion.ui-UVVG7TLG.js} +8 -8
- package/dist/{geneset-RLF2QY3Q.js → geneset-YUBHI7I4.js} +8 -8
- package/dist/{genomeBrowser.spec-THSMBWSH.js → genomeBrowser.spec-ZOUFAGFU.js} +16 -16
- package/dist/{grin2-DLON3V6G.js → grin2-XFLJN3GN.js} +41 -14
- package/dist/grin2-XFLJN3GN.js.map +7 -0
- package/dist/{grin2-YCLS7BTZ.js → grin2-ZLNP6D6C.js} +8 -8
- package/dist/{gsea-ILVHCEGZ.js → gsea-3LW6XJS5.js} +10 -10
- package/dist/{hierCluster-HWGEOUI6.js → hierCluster-CCZVW5OF.js} +23 -23
- package/dist/{hierCluster-G34AJU7M.js → hierCluster-GX2WYV4Z.js} +24 -24
- package/dist/{hierCluster.config-4MKGOKX3.js → hierCluster.config-VFWPURDQ.js} +11 -11
- package/dist/{hierCluster.integration.spec-Y5CFAATW.js → hierCluster.integration.spec-Z4FVRPUS.js} +18 -18
- package/dist/{hierCluster.interactivity-4TOA3DI4.js → hierCluster.interactivity-OXZNJ7MJ.js} +9 -9
- package/dist/{imagePlot-NTYHGNQC.js → imagePlot-CSCIBTHV.js} +9 -9
- package/dist/importPlot-IW6SLCS6.js +8 -0
- package/dist/{launch.adhoc-NZBQY7PN.js → launch.adhoc-JQW25MWJ.js} +11 -11
- package/dist/{leftlabel.sample-4C7KG3K7.js → leftlabel.sample-CVAXEIGU.js} +12 -12
- package/dist/{lollipop-5HPH542E.js → lollipop-ZJOQSYUJ.js} +10 -10
- package/dist/{maf-QBMGGLED.js → maf-5KRAV3A6.js} +8 -8
- package/dist/{maftimeline-THWK7TLK.js → maftimeline-VMM3ZKBN.js} +8 -8
- package/dist/{matrix-WWJIS7D5.js → matrix-CLZDLAOP.js} +21 -21
- package/dist/{matrix-CHTKEBFW.js → matrix-LFEJ34H5.js} +21 -21
- package/dist/{matrix.cells-M5CPM7ZI.js → matrix.cells-YWNMLSFC.js} +2 -2
- package/dist/{matrix.config-SVUETO7Z.js → matrix.config-OKPQCMWE.js} +10 -10
- package/dist/{matrix.controls-MDGMUAAL.js → matrix.controls-Z2VGWKYP.js} +10 -10
- package/dist/{matrix.data-TOZOWWM4.js → matrix.data-N32LBVPR.js} +9 -9
- package/dist/{matrix.dom-Z7QTJAII.js → matrix.dom-A4TQOINQ.js} +3 -3
- package/dist/{matrix.groups-IP32LHZJ.js → matrix.groups-DDVCI2NY.js} +3 -3
- package/dist/{matrix.integration.spec-YQ324UVF.js → matrix.integration.spec-EANYKW4Q.js} +17 -17
- package/dist/{matrix.interactivity-ZZ76OJ6T.js → matrix.interactivity-SIIZP4OJ.js} +9 -9
- package/dist/{matrix.layout-BP53ZLXC.js → matrix.layout-5HB2A5ZD.js} +9 -9
- package/dist/{matrix.renderers-XJY7D2QZ.js → matrix.renderers-ENBCBB6K.js} +9 -9
- package/dist/{matrix.serieses-F4FILQSZ.js → matrix.serieses-NKLZCLCX.js} +3 -3
- package/dist/{matrix.sort-7E37JVSG.js → matrix.sort-ARDUX4LO.js} +2 -2
- package/dist/{matrix.sort.unit.spec-CJXECJKF.js → matrix.sort.unit.spec-O3QJGKYQ.js} +13 -13
- package/dist/matrix.sort.unit.spec-O3QJGKYQ.js.map +7 -0
- package/dist/{matrix.sorterUi-W5WSBIK3.js → matrix.sorterUi-QLE77DQJ.js} +3 -3
- package/dist/{matrix.sorterUi.unit.spec-SV2ERK3O.js → matrix.sorterUi.unit.spec-SNQJWIYP.js} +11 -11
- package/dist/{mavb-J3HZ7UPM.js → mavb-EPO6A3T3.js} +9 -9
- package/dist/{mds.fimo-VDAO6SM6.js → mds.fimo-UQZF6XBC.js} +8 -8
- package/dist/{mds.samplescatterplot-LG2WMXDN.js → mds.samplescatterplot-HH5UDW5M.js} +10 -10
- package/dist/{mds.survivalplot-DYBON35O.js → mds.survivalplot-NFOGOIDJ.js} +8 -8
- package/dist/{oncomatrix-U55ZZCEC.js → oncomatrix-6OYUBYSH.js} +10 -10
- package/dist/{oncomatrix.spec-MU3TKNDB.js → oncomatrix.spec-4LSAMP7J.js} +16 -16
- package/dist/{plot.2dvaf-NPQZEVER.js → plot.2dvaf-4BULS5KC.js} +8 -8
- package/dist/{plot.app-QOFQXUHZ.js → plot.app-DBLPSEPU.js} +10 -10
- package/dist/{plot.barplot-KT7OCAEH.js → plot.barplot-RZG6XWV6.js} +8 -8
- package/dist/{plot.boxplot-WUHHDDM6.js → plot.boxplot-EPLLF7BQ.js} +8 -8
- package/dist/{plot.brainImaging-UQAIXNZU.js → plot.brainImaging-GAU5OM35.js} +2 -2
- package/dist/{plot.disco-JNGIOXPR.js → plot.disco-YRSGKRFR.js} +3 -3
- package/dist/{plot.dzi-EEJWLNPJ.js → plot.dzi-EGT7BQL4.js} +2 -2
- package/dist/{plot.ssgq-EWESEOHV.js → plot.ssgq-H2HKABFX.js} +9 -9
- package/dist/{plot.vaf2cov-5WXKJ6GX.js → plot.vaf2cov-C3AOQHNQ.js} +8 -8
- package/dist/{plot.wsi-F7EYLIPZ.js → plot.wsi-6AV6EBAB.js} +2 -2
- package/dist/{polar-LHEB7JBA.js → polar-CBDHRCYP.js} +9 -9
- package/dist/{profile.spec-JB2Y7COH.js → profile.spec-TW22RJ3B.js} +16 -16
- package/dist/{profileBarchart-M4MHZGMF.js → profileBarchart-3EIN4G7G.js} +9 -9
- package/dist/{profileForms-N4MGO7JR.js → profileForms-6QN6ZR63.js} +9 -9
- package/dist/{profilePlot-5TWNY3BY.js → profilePlot-KI2O7AO7.js} +9 -9
- package/dist/{profileRadar-35DX3H4S.js → profileRadar-4FRECZBQ.js} +9 -9
- package/dist/{profileRadarFacility-42VHQ6H3.js → profileRadarFacility-ET55BLVY.js} +9 -9
- package/dist/{qualitative-7XEX7QZP.js → qualitative-5GZNYRZK.js} +2 -2
- package/dist/{qualitative-VFV3PZ73.js → qualitative-Y4SOI3NG.js} +8 -8
- package/dist/{regression-UBWBXUX7.js → regression-5X24WGFI.js} +16 -16
- package/dist/{regression.inputs-JRKFOOAS.js → regression.inputs-JRDHMRTI.js} +16 -16
- package/dist/{regression.inputs.term-XK336S56.js → regression.inputs.term-FPNBMBD6.js} +16 -16
- package/dist/{regression.inputs.values.table-VNAS2CYH.js → regression.inputs.values.table-JWHXLNEH.js} +14 -14
- package/dist/{regression.integration.spec-K24LWLJQ.js → regression.integration.spec-V6AR7TGG.js} +16 -16
- package/dist/{regression.results-JYJIFBF5.js → regression.results-U5DCIZH6.js} +9 -9
- package/dist/{regression.spec-2IGOGZOI.js → regression.spec-2KAC4RYW.js} +16 -16
- package/dist/{report-U6C6KH23.js → report-M54QTHDN.js} +8 -8
- package/dist/{runChart-2AU5V7YZ.js → runChart-2HEBZSNA.js} +13 -13
- package/dist/{runchart.integration.spec-26ECFMW6.js → runchart.integration.spec-EENJZO6G.js} +16 -16
- package/dist/{sampleScatter.spec-HJOFRGXF.js → sampleScatter.spec-B7BYCA5G.js} +16 -16
- package/dist/{sampleView-LNMGHP2S.js → sampleView-IBTJXOLP.js} +9 -9
- package/dist/{samplelst-NHV3L7VQ.js → samplelst-KTYW33VS.js} +8 -8
- package/dist/{samplematrix-UZJCQNX6.js → samplematrix-HKAHNAQO.js} +10 -10
- package/dist/{scatter-TX4LFLWA.js → scatter-LX6I77IQ.js} +12 -12
- package/dist/{scatter.integration.spec-MII4PEEA.js → scatter.integration.spec-CIOYCGEZ.js} +18 -18
- package/dist/{scatter.integration.spec-MII4PEEA.js.map → scatter.integration.spec-CIOYCGEZ.js.map} +1 -1
- package/dist/{selectGenomeWithTklst-DWOXKTKK.js → selectGenomeWithTklst-XK5LOKVG.js} +9 -9
- package/dist/{singleCellPlot-ZN63SGRK.js → singleCellPlot-JXHU7UQB.js} +10 -10
- package/dist/{singlecell-R4EZ64MN.js → singlecell-2MDKWQU6.js} +10 -10
- package/dist/{singlecell-R5JL7Y3S.js → singlecell-EPRGSEYW.js} +11 -11
- package/dist/{snp-EMO5QUTM.js → snp-I7PXNT72.js} +8 -8
- package/dist/{snplocus-OPRWGUNV.js → snplocus-AHE63KVG.js} +8 -8
- package/dist/{spliceevent.a53ss.diagram-R3EGNK2H.js → spliceevent.a53ss.diagram-E5XJJGBR.js} +8 -8
- package/dist/{spliceevent.exonskip.diagram-VNQ3LMIR.js → spliceevent.exonskip.diagram-WIOUHVF4.js} +9 -9
- package/dist/{spliceevent.noeventdiagram-PE7ZFCX5.js → spliceevent.noeventdiagram-PET4MAN6.js} +8 -8
- package/dist/{ssGSEA-EHMVZRLT.js → ssGSEA-Z7D4KGMJ.js} +8 -8
- package/dist/{summarizeCnvGeneexp-DPC46KRO.js → summarizeCnvGeneexp-2N5DFIY6.js} +9 -9
- package/dist/{summarizeGeneexpSurvival-IKLETOG6.js → summarizeGeneexpSurvival-PHIZRHPP.js} +9 -9
- package/dist/{summarizeMutationCnv-JWHFPBWD.js → summarizeMutationCnv-ERXRGOCB.js} +9 -9
- package/dist/{summarizeMutationCnv-JWHFPBWD.js.map → summarizeMutationCnv-ERXRGOCB.js.map} +1 -1
- package/dist/{summarizeMutationDiagnosis-UKEYFSXO.js → summarizeMutationDiagnosis-JKM3D5E4.js} +9 -9
- package/dist/{summarizeMutationSurvival-PIQ7ARNQ.js → summarizeMutationSurvival-ID6IEX3P.js} +9 -9
- package/dist/{summary-IQ7KTGHL.js → summary-CFSGPVQP.js} +16 -16
- package/dist/{summary.integration.spec-45ZW4VZK.js → summary.integration.spec-LIXRGLJK.js} +16 -16
- package/dist/{summaryInput-XHSRKMKN.js → summaryInput-TVI2YO5X.js} +10 -10
- package/dist/{sunburst-L44YEEXE.js → sunburst-ZNEMRBYL.js} +8 -8
- package/dist/{survival-XPREV45R.js → survival-GWK746XM.js} +8 -8
- package/dist/{survival-HMZ7YKVF.js → survival-WDLZPIUA.js} +10 -10
- package/dist/{survival.integration.spec-35CXQT47.js → survival.integration.spec-VAXMDKVX.js} +16 -16
- package/dist/{svgraph-5XUKZTD2.js → svgraph-MGGDOCRI.js} +8 -8
- package/dist/{svmr-CWUV45FJ.js → svmr-OWCDZEHH.js} +11 -11
- package/dist/{table-T3BDLKKZ.js → table-SGZTBKE5.js} +8 -8
- package/dist/{termCollection-6AJEDX6T.js → termCollection-352FUO52.js} +8 -8
- package/dist/{termCollection-EQHZHAP7.js → termCollection-MF4OMB6J.js} +8 -8
- package/dist/{tk-ZRFTYEFW.js → tk-ZRD7LHV5.js} +12 -12
- package/dist/{tp.ui-KW4NTQ74.js → tp.ui-I7KWGUNS.js} +17 -17
- package/dist/{tvs.dt-XJ2JQ6NU.js → tvs.dt-3BDSNMWN.js} +8 -8
- package/dist/{tvs.dtcnv.categorical-7ZH6MGF4.js → tvs.dtcnv.categorical-FDTJEVL6.js} +8 -8
- package/dist/{tvs.dtcnv.continuous-FEFX55VN.js → tvs.dtcnv.continuous-ZUFI3KJZ.js} +8 -8
- package/dist/{tvs.dtfusion-NRJWR2MX.js → tvs.dtfusion-T6H3TQTI.js} +8 -8
- package/dist/{tvs.dtsnvindel-BEVOQG7X.js → tvs.dtsnvindel-VIA7G6RX.js} +8 -8
- package/dist/{tvs.dtsv-O7HDJCV2.js → tvs.dtsv-K5MFTD4O.js} +8 -8
- package/dist/{tvs.numeric-MKU7IL3X.js → tvs.numeric-PA5UOKZL.js} +3 -3
- package/dist/{tvs.samplelst-3JLHTKTG.js → tvs.samplelst-X3ZXYF4C.js} +8 -8
- package/dist/{tvs.termCollection-YGVKC6ZZ.js → tvs.termCollection-RY45Q374.js} +12 -12
- package/dist/{violin-6RJ3566I.js → violin-GFMXHEHZ.js} +11 -11
- package/dist/{violin.integration.spec-AS4IAZDO.js → violin.integration.spec-7BX4T4G5.js} +25 -21
- package/dist/violin.integration.spec-7BX4T4G5.js.map +7 -0
- package/dist/{violin.interactivity-MDBS4ZKL.js → violin.interactivity-5XIJRFC2.js} +9 -9
- package/dist/{violin.renderer-PHUNX2QD.js → violin.renderer-OAJJKCMF.js} +9 -9
- package/dist/{vocabulary-OGJQIIHW.js → vocabulary-O7NLLQLC.js} +8 -8
- package/package.json +3 -3
- package/dist/Disco-D52FVUEO.js.map +0 -7
- package/dist/chunk-32LUIEDR.js.map +0 -7
- package/dist/chunk-3YJYBZIJ.js.map +0 -7
- package/dist/chunk-BJ2UYDYL.js.map +0 -7
- package/dist/chunk-DFBQHO4T.js.map +0 -7
- package/dist/chunk-GHI75432.js.map +0 -7
- package/dist/chunk-JTGDV7NZ.js.map +0 -7
- package/dist/chunk-K4LI3NKS.js.map +0 -7
- package/dist/chunk-QJPJZQEQ.js.map +0 -7
- package/dist/chunk-SNSSSEK7.js +0 -168
- package/dist/chunk-TLZJXDZZ.js.map +0 -7
- package/dist/chunk-WIEKWIQY.js.map +0 -7
- package/dist/geneVariant-3QMO5W7L.js.map +0 -7
- package/dist/grin2-DLON3V6G.js.map +0 -7
- package/dist/importPlot-4TORYPBO.js +0 -8
- package/dist/matrix.sort.unit.spec-CJXECJKF.js.map +0 -7
- package/dist/violin.integration.spec-AS4IAZDO.js.map +0 -7
- /package/dist/{2dmaf-TRTL5RIT.js.map → 2dmaf-NULVBOXA.js.map} +0 -0
- /package/dist/{AppHeader-UWDROFOQ.js.map → AppHeader-7JYXB4DY.js.map} +0 -0
- /package/dist/{CorrelationVolcano-HQVOSKB3.js.map → CorrelationVolcano-KMBRCL7V.js.map} +0 -0
- /package/dist/{DifferentialAnalysis-PYO2CH5P.js.map → DifferentialAnalysis-QMZAHDUY.js.map} +0 -0
- /package/dist/{Disco.UI-IYLN42SN.js.map → Disco.UI-XV547I36.js.map} +0 -0
- /package/dist/{GB-ZAMWKKEW.js.map → GB-PP6V7Q5Q.js.map} +0 -0
- /package/dist/{HicApp-NDWHBLJR.js.map → HicApp-U3FSL5IQ.js.map} +0 -0
- /package/dist/{NumBinaryEditor-ENCJVC3Q.js.map → NumBinaryEditor-QX6XP55J.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-27PMZBYI.js.map → NumBinaryEditor.unit.spec-4WULZW4X.js.map} +0 -0
- /package/dist/{NumContEditor-KMZ6TPHX.js.map → NumContEditor-U6TP4JUK.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-I4G3X5XV.js.map → NumContEditor.unit.spec-YV6VJSSF.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-YZF67LOQ.js.map → NumCustomBinEditor-QYGSDTAO.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-WC6LQDGJ.js.map → NumCustomBinEditor.unit.spec-Q6EURCRN.js.map} +0 -0
- /package/dist/{NumDiscreteEditor-PRWHOR4D.js.map → NumDiscreteEditor-S3AIKKVE.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-F4RUC5XQ.js.map → NumDiscreteEditor.unit.spec-X4P2WCWA.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-SGJ64KAG.js.map → NumRegularBinEditor-KEY7EYOZ.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-4GGUHTIQ.js.map → NumRegularBinEditor.unit.spec-P6OZIF67.js.map} +0 -0
- /package/dist/{NumSplineEditor-3YD2LY66.js.map → NumSplineEditor-KLSQQZZM.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-MY5VM6CN.js.map → NumSplineEditor.unit.spec-D7H4N5YN.js.map} +0 -0
- /package/dist/{NumericDensity-FWSZV7TD.js.map → NumericDensity-JPTAN3DG.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-MMBSYCHJ.js.map → NumericDensity.unit.spec-4KZPLVD3.js.map} +0 -0
- /package/dist/{NumericHandler-TJVMR232.js.map → NumericHandler-U2QBQS7T.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-XEJRRORV.js.map → NumericHandler.unit.spec-AWMQMBSC.js.map} +0 -0
- /package/dist/{SC-GGN7UVLX.js.map → SC-J3PVK4Q5.js.map} +0 -0
- /package/dist/{Volcano-2WPXXICL.js.map → Volcano-75ZAK5VI.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-25VDFJX3.js.map → WsiSamplesPlot-ZMV7ILUV.js.map} +0 -0
- /package/dist/{adSandbox-CPZBFRYS.js.map → adSandbox-ORRNN4M7.js.map} +0 -0
- /package/dist/{alphaGenome-RI7WM5JR.js.map → alphaGenome-TLQHWR5H.js.map} +0 -0
- /package/dist/{app-HQIYQFAQ.js.map → app-6EHQG2LS.js.map} +0 -0
- /package/dist/{app-KHGVOGCA.js.map → app-HVS47MKD.js.map} +0 -0
- /package/dist/{bam-VORHBA6P.js.map → bam-EXBX3IJY.js.map} +0 -0
- /package/dist/{barchart-7A6QUYMI.js.map → barchart-CCYIYLAK.js.map} +0 -0
- /package/dist/{barchart.data-RUKFEDLG.js.map → barchart.data-V757AO73.js.map} +0 -0
- /package/dist/{barchart.events-X5MR77JP.js.map → barchart.events-MSKITZZN.js.map} +0 -0
- /package/dist/{block-XJNR427G.js.map → block-HARZTSBZ.js.map} +0 -0
- /package/dist/{block.init-K6IYQCVG.js.map → block.init-5TGIIXLK.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-G4YT3ITI.js.map → block.mds.expressionrank-L6LF5OGC.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-2VFCOY4F.js.map → block.mds.geneboxplot-2LGE36IG.js.map} +0 -0
- /package/dist/{block.mds.junction-3RADQYBR.js.map → block.mds.junction-GQA3H7WZ.js.map} +0 -0
- /package/dist/{block.mds.svcnv-G7UTUOIX.js.map → block.mds.svcnv-UCR4S2LF.js.map} +0 -0
- /package/dist/{block.svg-W2CR4CTT.js.map → block.svg-OXWF3HSA.js.map} +0 -0
- /package/dist/{block.tk.aicheck-W7N2FBKE.js.map → block.tk.aicheck-SDZPT3PF.js.map} +0 -0
- /package/dist/{block.tk.ase-OHVIYASE.js.map → block.tk.ase-4O5LJPTL.js.map} +0 -0
- /package/dist/{block.tk.bam-GYDBKELJ.js.map → block.tk.bam-LRMNMFCJ.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-335OUZDX.js.map → block.tk.bedgraphdot-MBBCR4NC.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-UEIKD46U.js.map → block.tk.bigwig.ui-FL5UUQVN.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-JQYWZTBW.js.map → block.tk.hicstraw-KTTJDPGS.js.map} +0 -0
- /package/dist/{block.tk.junction-WPGJ7APU.js.map → block.tk.junction-VMPDXHQR.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-MY4FCKK5.js.map → block.tk.junction.textmatrixui-6IUZRTGV.js.map} +0 -0
- /package/dist/{block.tk.ld-W6S2DEOS.js.map → block.tk.ld-HN7TITP4.js.map} +0 -0
- /package/dist/{block.tk.menu-KI65FAQC.js.map → block.tk.menu-5S2VJJKZ.js.map} +0 -0
- /package/dist/{block.tk.pgv-E5BSB22L.js.map → block.tk.pgv-KFM6VQEA.js.map} +0 -0
- /package/dist/{brainImaging-4NPWW63N.js.map → brainImaging-LAJPH266.js.map} +0 -0
- /package/dist/{chat-IV67D3I3.js.map → chat-B7MJ6MXM.js.map} +0 -0
- /package/dist/{chunk-DQNHLS6Y.js.map → chunk-34RYIRTD.js.map} +0 -0
- /package/dist/{chunk-RERIGX7D.js.map → chunk-3Q5HK4N4.js.map} +0 -0
- /package/dist/{chunk-HD5BRUXL.js.map → chunk-4JEN2Y3T.js.map} +0 -0
- /package/dist/{chunk-MQFFZOYH.js.map → chunk-5AHDD454.js.map} +0 -0
- /package/dist/{chunk-CSMHADZL.js.map → chunk-5UXFNBWZ.js.map} +0 -0
- /package/dist/{chunk-CBH7E4CZ.js.map → chunk-6XZ4QG2S.js.map} +0 -0
- /package/dist/{chunk-UMD43EU7.js.map → chunk-77OHO7EA.js.map} +0 -0
- /package/dist/{chunk-GOSADDSN.js.map → chunk-7RXIGX5P.js.map} +0 -0
- /package/dist/{chunk-NLS7X5LY.js.map → chunk-AY73FQLU.js.map} +0 -0
- /package/dist/{chunk-XNNPS7PL.js.map → chunk-BH5G6JKX.js.map} +0 -0
- /package/dist/{chunk-OKAXAC5U.js.map → chunk-BTYRXZZL.js.map} +0 -0
- /package/dist/{chunk-5K6L3WGS.js.map → chunk-CAJJV4K2.js.map} +0 -0
- /package/dist/{chunk-BUXS26F4.js.map → chunk-CNW6OLYY.js.map} +0 -0
- /package/dist/{chunk-HISAS5OU.js.map → chunk-CTDY2CMT.js.map} +0 -0
- /package/dist/{chunk-B4YNT4QW.js.map → chunk-CXW25G2T.js.map} +0 -0
- /package/dist/{chunk-6IH5W6UC.js.map → chunk-D3PQH6RE.js.map} +0 -0
- /package/dist/{chunk-4XAAGRWA.js.map → chunk-D6VZESYY.js.map} +0 -0
- /package/dist/{chunk-MUCRBG5F.js.map → chunk-DNZHE7FP.js.map} +0 -0
- /package/dist/{chunk-RU7NM2HO.js.map → chunk-F5BTEQEW.js.map} +0 -0
- /package/dist/{chunk-ZJFQ5N4A.js.map → chunk-F6XCNNS6.js.map} +0 -0
- /package/dist/{chunk-WTNMUTHT.js.map → chunk-FIZ4S7AN.js.map} +0 -0
- /package/dist/{chunk-SNSSSEK7.js.map → chunk-FSGEVTVI.js.map} +0 -0
- /package/dist/{chunk-7FCA4KIE.js.map → chunk-FVTQMCMG.js.map} +0 -0
- /package/dist/{chunk-3VA4MJQQ.js.map → chunk-GSRQZE6V.js.map} +0 -0
- /package/dist/{chunk-7575UK54.js.map → chunk-HHFK426A.js.map} +0 -0
- /package/dist/{chunk-WNBJMVEE.js.map → chunk-IAMFJMMC.js.map} +0 -0
- /package/dist/{chunk-6BV2ZBNU.js.map → chunk-JFQM7LYS.js.map} +0 -0
- /package/dist/{chunk-T3U2GVSC.js.map → chunk-KAXBZQW3.js.map} +0 -0
- /package/dist/{chunk-4ANV7WKU.js.map → chunk-KZXEXB3K.js.map} +0 -0
- /package/dist/{chunk-52DOAUEG.js.map → chunk-MUN6WCMX.js.map} +0 -0
- /package/dist/{chunk-EHMNO46L.js.map → chunk-N7BE3ZF5.js.map} +0 -0
- /package/dist/{chunk-EIMOBM5J.js.map → chunk-NL7WRKHQ.js.map} +0 -0
- /package/dist/{chunk-L7YF2J27.js.map → chunk-NTH4X4ZX.js.map} +0 -0
- /package/dist/{chunk-QAC4K4S6.js.map → chunk-OUKTVVOI.js.map} +0 -0
- /package/dist/{chunk-S7FUDZD5.js.map → chunk-PJEIREMJ.js.map} +0 -0
- /package/dist/{chunk-VJUB2TUE.js.map → chunk-PNVVKQJV.js.map} +0 -0
- /package/dist/{chunk-DEUI26GX.js.map → chunk-PO22RN6V.js.map} +0 -0
- /package/dist/{chunk-LNKVNRRR.js.map → chunk-RDMXKGKH.js.map} +0 -0
- /package/dist/{chunk-DWE42LXW.js.map → chunk-RGNJKYXM.js.map} +0 -0
- /package/dist/{chunk-7EUKSBAJ.js.map → chunk-ROY5OATX.js.map} +0 -0
- /package/dist/{chunk-PJ376FKI.js.map → chunk-SEEKAG6E.js.map} +0 -0
- /package/dist/{chunk-IJPAGSZN.js.map → chunk-SPCZQRRQ.js.map} +0 -0
- /package/dist/{chunk-JJECYRIX.js.map → chunk-SZOQJ5NV.js.map} +0 -0
- /package/dist/{chunk-F7KC4VGP.js.map → chunk-TKNO4Y2X.js.map} +0 -0
- /package/dist/{chunk-NCT2SONQ.js.map → chunk-TMYG3EWX.js.map} +0 -0
- /package/dist/{chunk-LSEFWW72.js.map → chunk-TPK3G44P.js.map} +0 -0
- /package/dist/{chunk-NFUK32U5.js.map → chunk-U4TQ2HA6.js.map} +0 -0
- /package/dist/{chunk-OH5HST4D.js.map → chunk-UVJS2AS7.js.map} +0 -0
- /package/dist/{chunk-IQ3AZ4GW.js.map → chunk-VCWFNXJ6.js.map} +0 -0
- /package/dist/{chunk-RDQKNQYT.js.map → chunk-WF4GYH5G.js.map} +0 -0
- /package/dist/{chunk-N7JXPFLR.js.map → chunk-XBALT3QM.js.map} +0 -0
- /package/dist/{chunk-4RQZE32U.js.map → chunk-ZES5HYNU.js.map} +0 -0
- /package/dist/{chunk-622K7HUV.js.map → chunk-ZPCPRN4P.js.map} +0 -0
- /package/dist/{chunk-BWKM4SGN.js.map → chunk-ZZOURNNY.js.map} +0 -0
- /package/dist/{condition-OV5LAKLC.js.map → condition-MXP7ZZJA.js.map} +0 -0
- /package/dist/{controls-VU4ZKU6P.js.map → controls-NOPNWCWP.js.map} +0 -0
- /package/dist/{controls.btns-HOYT3NHX.js.map → controls.btns-QJI3KHUO.js.map} +0 -0
- /package/dist/{controls.config-Y4ABH4KN.js.map → controls.config-2FG63Z7P.js.map} +0 -0
- /package/dist/{correlation-ONQEZZP5.js.map → correlation-G5KHUFPN.js.map} +0 -0
- /package/dist/{cuminc-ZVFVJZOP.js.map → cuminc-M5VZA3M5.js.map} +0 -0
- /package/dist/{cuminc.integration.spec-G33322YH.js.map → cuminc.integration.spec-7GRBB7SM.js.map} +0 -0
- /package/dist/{customdata.inputui-N7QJ3US3.js.map → customdata.inputui-UF2FWEXK.js.map} +0 -0
- /package/dist/{dataDownload-QEZSVVGK.js.map → dataDownload-NLSMLL2P.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-B7BYKLZ4.js.map → dataDownload.integration.spec-BVHNEKY2.js.map} +0 -0
- /package/dist/{databrowser.ui-CK4GJYKG.js.map → databrowser.ui-D7LBOQH3.js.map} +0 -0
- /package/dist/{dictionary-7SKULO7G.js.map → dictionary-NFZ5TJMD.js.map} +0 -0
- /package/dist/{e2pca-FWCP5KPK.js.map → e2pca-4ZZMZYLO.js.map} +0 -0
- /package/dist/{ep-DC6Q7DUI.js.map → ep-HJKT323Q.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-N25HZEDL.js.map → expclust.gdc.spec-2DNCZGRP.js.map} +0 -0
- /package/dist/{facet-S7XUSJWD.js.map → facet-BLY52PGL.js.map} +0 -0
- /package/dist/{frequencyChart-6DQVTXVX.js.map → frequencyChart-2XZFQNZC.js.map} +0 -0
- /package/dist/{frequencyChart.integration.spec-NEGNBLSZ.js.map → frequencyChart.integration.spec-GVJ2OZ52.js.map} +0 -0
- /package/dist/{geneExpClustering-ZAFWKTBV.js.map → geneExpClustering-YKXQ2JCT.js.map} +0 -0
- /package/dist/{geneExpression-V7AK7EMP.js.map → geneExpression-3RE5NMZL.js.map} +0 -0
- /package/dist/{geneExpression-3RNMGWS4.js.map → geneExpression-UJCKOE5D.js.map} +0 -0
- /package/dist/{geneORA-HYOP6FZB.js.map → geneORA-CM5ORPVR.js.map} +0 -0
- /package/dist/{geneVariant-664QBH6K.js.map → geneVariant-JIW5GGOY.js.map} +0 -0
- /package/dist/{genefusion.ui-65T7HWCP.js.map → genefusion.ui-UVVG7TLG.js.map} +0 -0
- /package/dist/{geneset-RLF2QY3Q.js.map → geneset-YUBHI7I4.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-THSMBWSH.js.map → genomeBrowser.spec-ZOUFAGFU.js.map} +0 -0
- /package/dist/{grin2-YCLS7BTZ.js.map → grin2-ZLNP6D6C.js.map} +0 -0
- /package/dist/{gsea-ILVHCEGZ.js.map → gsea-3LW6XJS5.js.map} +0 -0
- /package/dist/{hierCluster-G34AJU7M.js.map → hierCluster-CCZVW5OF.js.map} +0 -0
- /package/dist/{hierCluster-HWGEOUI6.js.map → hierCluster-GX2WYV4Z.js.map} +0 -0
- /package/dist/{hierCluster.config-4MKGOKX3.js.map → hierCluster.config-VFWPURDQ.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-Y5CFAATW.js.map → hierCluster.integration.spec-Z4FVRPUS.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-4TOA3DI4.js.map → hierCluster.interactivity-OXZNJ7MJ.js.map} +0 -0
- /package/dist/{imagePlot-NTYHGNQC.js.map → imagePlot-CSCIBTHV.js.map} +0 -0
- /package/dist/{importPlot-4TORYPBO.js.map → importPlot-IW6SLCS6.js.map} +0 -0
- /package/dist/{launch.adhoc-NZBQY7PN.js.map → launch.adhoc-JQW25MWJ.js.map} +0 -0
- /package/dist/{leftlabel.sample-4C7KG3K7.js.map → leftlabel.sample-CVAXEIGU.js.map} +0 -0
- /package/dist/{lollipop-5HPH542E.js.map → lollipop-ZJOQSYUJ.js.map} +0 -0
- /package/dist/{maf-QBMGGLED.js.map → maf-5KRAV3A6.js.map} +0 -0
- /package/dist/{maftimeline-THWK7TLK.js.map → maftimeline-VMM3ZKBN.js.map} +0 -0
- /package/dist/{matrix-CHTKEBFW.js.map → matrix-CLZDLAOP.js.map} +0 -0
- /package/dist/{matrix-WWJIS7D5.js.map → matrix-LFEJ34H5.js.map} +0 -0
- /package/dist/{matrix.cells-M5CPM7ZI.js.map → matrix.cells-YWNMLSFC.js.map} +0 -0
- /package/dist/{matrix.config-SVUETO7Z.js.map → matrix.config-OKPQCMWE.js.map} +0 -0
- /package/dist/{matrix.controls-MDGMUAAL.js.map → matrix.controls-Z2VGWKYP.js.map} +0 -0
- /package/dist/{matrix.data-TOZOWWM4.js.map → matrix.data-N32LBVPR.js.map} +0 -0
- /package/dist/{matrix.dom-Z7QTJAII.js.map → matrix.dom-A4TQOINQ.js.map} +0 -0
- /package/dist/{matrix.groups-IP32LHZJ.js.map → matrix.groups-DDVCI2NY.js.map} +0 -0
- /package/dist/{matrix.integration.spec-YQ324UVF.js.map → matrix.integration.spec-EANYKW4Q.js.map} +0 -0
- /package/dist/{matrix.interactivity-ZZ76OJ6T.js.map → matrix.interactivity-SIIZP4OJ.js.map} +0 -0
- /package/dist/{matrix.layout-BP53ZLXC.js.map → matrix.layout-5HB2A5ZD.js.map} +0 -0
- /package/dist/{matrix.renderers-XJY7D2QZ.js.map → matrix.renderers-ENBCBB6K.js.map} +0 -0
- /package/dist/{matrix.serieses-F4FILQSZ.js.map → matrix.serieses-NKLZCLCX.js.map} +0 -0
- /package/dist/{matrix.sort-7E37JVSG.js.map → matrix.sort-ARDUX4LO.js.map} +0 -0
- /package/dist/{matrix.sorterUi-W5WSBIK3.js.map → matrix.sorterUi-QLE77DQJ.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-SV2ERK3O.js.map → matrix.sorterUi.unit.spec-SNQJWIYP.js.map} +0 -0
- /package/dist/{mavb-J3HZ7UPM.js.map → mavb-EPO6A3T3.js.map} +0 -0
- /package/dist/{mds.fimo-VDAO6SM6.js.map → mds.fimo-UQZF6XBC.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-LG2WMXDN.js.map → mds.samplescatterplot-HH5UDW5M.js.map} +0 -0
- /package/dist/{mds.survivalplot-DYBON35O.js.map → mds.survivalplot-NFOGOIDJ.js.map} +0 -0
- /package/dist/{oncomatrix-U55ZZCEC.js.map → oncomatrix-6OYUBYSH.js.map} +0 -0
- /package/dist/{oncomatrix.spec-MU3TKNDB.js.map → oncomatrix.spec-4LSAMP7J.js.map} +0 -0
- /package/dist/{plot.2dvaf-NPQZEVER.js.map → plot.2dvaf-4BULS5KC.js.map} +0 -0
- /package/dist/{plot.app-QOFQXUHZ.js.map → plot.app-DBLPSEPU.js.map} +0 -0
- /package/dist/{plot.barplot-KT7OCAEH.js.map → plot.barplot-RZG6XWV6.js.map} +0 -0
- /package/dist/{plot.boxplot-WUHHDDM6.js.map → plot.boxplot-EPLLF7BQ.js.map} +0 -0
- /package/dist/{plot.brainImaging-UQAIXNZU.js.map → plot.brainImaging-GAU5OM35.js.map} +0 -0
- /package/dist/{plot.disco-JNGIOXPR.js.map → plot.disco-YRSGKRFR.js.map} +0 -0
- /package/dist/{plot.dzi-EEJWLNPJ.js.map → plot.dzi-EGT7BQL4.js.map} +0 -0
- /package/dist/{plot.ssgq-EWESEOHV.js.map → plot.ssgq-H2HKABFX.js.map} +0 -0
- /package/dist/{plot.vaf2cov-5WXKJ6GX.js.map → plot.vaf2cov-C3AOQHNQ.js.map} +0 -0
- /package/dist/{plot.wsi-F7EYLIPZ.js.map → plot.wsi-6AV6EBAB.js.map} +0 -0
- /package/dist/{polar-LHEB7JBA.js.map → polar-CBDHRCYP.js.map} +0 -0
- /package/dist/{profile.spec-JB2Y7COH.js.map → profile.spec-TW22RJ3B.js.map} +0 -0
- /package/dist/{profileBarchart-M4MHZGMF.js.map → profileBarchart-3EIN4G7G.js.map} +0 -0
- /package/dist/{profileForms-N4MGO7JR.js.map → profileForms-6QN6ZR63.js.map} +0 -0
- /package/dist/{profilePlot-5TWNY3BY.js.map → profilePlot-KI2O7AO7.js.map} +0 -0
- /package/dist/{profileRadar-35DX3H4S.js.map → profileRadar-4FRECZBQ.js.map} +0 -0
- /package/dist/{profileRadarFacility-42VHQ6H3.js.map → profileRadarFacility-ET55BLVY.js.map} +0 -0
- /package/dist/{qualitative-7XEX7QZP.js.map → qualitative-5GZNYRZK.js.map} +0 -0
- /package/dist/{qualitative-VFV3PZ73.js.map → qualitative-Y4SOI3NG.js.map} +0 -0
- /package/dist/{regression-UBWBXUX7.js.map → regression-5X24WGFI.js.map} +0 -0
- /package/dist/{regression.inputs-JRKFOOAS.js.map → regression.inputs-JRDHMRTI.js.map} +0 -0
- /package/dist/{regression.inputs.term-XK336S56.js.map → regression.inputs.term-FPNBMBD6.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-VNAS2CYH.js.map → regression.inputs.values.table-JWHXLNEH.js.map} +0 -0
- /package/dist/{regression.integration.spec-K24LWLJQ.js.map → regression.integration.spec-V6AR7TGG.js.map} +0 -0
- /package/dist/{regression.results-JYJIFBF5.js.map → regression.results-U5DCIZH6.js.map} +0 -0
- /package/dist/{regression.spec-2IGOGZOI.js.map → regression.spec-2KAC4RYW.js.map} +0 -0
- /package/dist/{report-U6C6KH23.js.map → report-M54QTHDN.js.map} +0 -0
- /package/dist/{runChart-2AU5V7YZ.js.map → runChart-2HEBZSNA.js.map} +0 -0
- /package/dist/{runchart.integration.spec-26ECFMW6.js.map → runchart.integration.spec-EENJZO6G.js.map} +0 -0
- /package/dist/{sampleScatter.spec-HJOFRGXF.js.map → sampleScatter.spec-B7BYCA5G.js.map} +0 -0
- /package/dist/{sampleView-LNMGHP2S.js.map → sampleView-IBTJXOLP.js.map} +0 -0
- /package/dist/{samplelst-NHV3L7VQ.js.map → samplelst-KTYW33VS.js.map} +0 -0
- /package/dist/{samplematrix-UZJCQNX6.js.map → samplematrix-HKAHNAQO.js.map} +0 -0
- /package/dist/{scatter-TX4LFLWA.js.map → scatter-LX6I77IQ.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-DWOXKTKK.js.map → selectGenomeWithTklst-XK5LOKVG.js.map} +0 -0
- /package/dist/{singleCellPlot-ZN63SGRK.js.map → singleCellPlot-JXHU7UQB.js.map} +0 -0
- /package/dist/{singlecell-R4EZ64MN.js.map → singlecell-2MDKWQU6.js.map} +0 -0
- /package/dist/{singlecell-R5JL7Y3S.js.map → singlecell-EPRGSEYW.js.map} +0 -0
- /package/dist/{snp-EMO5QUTM.js.map → snp-I7PXNT72.js.map} +0 -0
- /package/dist/{snplocus-OPRWGUNV.js.map → snplocus-AHE63KVG.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-R3EGNK2H.js.map → spliceevent.a53ss.diagram-E5XJJGBR.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-VNQ3LMIR.js.map → spliceevent.exonskip.diagram-WIOUHVF4.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-PE7ZFCX5.js.map → spliceevent.noeventdiagram-PET4MAN6.js.map} +0 -0
- /package/dist/{ssGSEA-EHMVZRLT.js.map → ssGSEA-Z7D4KGMJ.js.map} +0 -0
- /package/dist/{summarizeCnvGeneexp-DPC46KRO.js.map → summarizeCnvGeneexp-2N5DFIY6.js.map} +0 -0
- /package/dist/{summarizeGeneexpSurvival-IKLETOG6.js.map → summarizeGeneexpSurvival-PHIZRHPP.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-UKEYFSXO.js.map → summarizeMutationDiagnosis-JKM3D5E4.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-PIQ7ARNQ.js.map → summarizeMutationSurvival-ID6IEX3P.js.map} +0 -0
- /package/dist/{summary-IQ7KTGHL.js.map → summary-CFSGPVQP.js.map} +0 -0
- /package/dist/{summary.integration.spec-45ZW4VZK.js.map → summary.integration.spec-LIXRGLJK.js.map} +0 -0
- /package/dist/{summaryInput-XHSRKMKN.js.map → summaryInput-TVI2YO5X.js.map} +0 -0
- /package/dist/{sunburst-L44YEEXE.js.map → sunburst-ZNEMRBYL.js.map} +0 -0
- /package/dist/{survival-XPREV45R.js.map → survival-GWK746XM.js.map} +0 -0
- /package/dist/{survival-HMZ7YKVF.js.map → survival-WDLZPIUA.js.map} +0 -0
- /package/dist/{survival.integration.spec-35CXQT47.js.map → survival.integration.spec-VAXMDKVX.js.map} +0 -0
- /package/dist/{svgraph-5XUKZTD2.js.map → svgraph-MGGDOCRI.js.map} +0 -0
- /package/dist/{svmr-CWUV45FJ.js.map → svmr-OWCDZEHH.js.map} +0 -0
- /package/dist/{table-T3BDLKKZ.js.map → table-SGZTBKE5.js.map} +0 -0
- /package/dist/{termCollection-6AJEDX6T.js.map → termCollection-352FUO52.js.map} +0 -0
- /package/dist/{termCollection-EQHZHAP7.js.map → termCollection-MF4OMB6J.js.map} +0 -0
- /package/dist/{tk-ZRFTYEFW.js.map → tk-ZRD7LHV5.js.map} +0 -0
- /package/dist/{tp.ui-KW4NTQ74.js.map → tp.ui-I7KWGUNS.js.map} +0 -0
- /package/dist/{tvs.dt-XJ2JQ6NU.js.map → tvs.dt-3BDSNMWN.js.map} +0 -0
- /package/dist/{tvs.dtcnv.categorical-7ZH6MGF4.js.map → tvs.dtcnv.categorical-FDTJEVL6.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-FEFX55VN.js.map → tvs.dtcnv.continuous-ZUFI3KJZ.js.map} +0 -0
- /package/dist/{tvs.dtfusion-NRJWR2MX.js.map → tvs.dtfusion-T6H3TQTI.js.map} +0 -0
- /package/dist/{tvs.dtsnvindel-BEVOQG7X.js.map → tvs.dtsnvindel-VIA7G6RX.js.map} +0 -0
- /package/dist/{tvs.dtsv-O7HDJCV2.js.map → tvs.dtsv-K5MFTD4O.js.map} +0 -0
- /package/dist/{tvs.numeric-MKU7IL3X.js.map → tvs.numeric-PA5UOKZL.js.map} +0 -0
- /package/dist/{tvs.samplelst-3JLHTKTG.js.map → tvs.samplelst-X3ZXYF4C.js.map} +0 -0
- /package/dist/{tvs.termCollection-YGVKC6ZZ.js.map → tvs.termCollection-RY45Q374.js.map} +0 -0
- /package/dist/{violin-6RJ3566I.js.map → violin-GFMXHEHZ.js.map} +0 -0
- /package/dist/{violin.interactivity-MDBS4ZKL.js.map → violin.interactivity-5XIJRFC2.js.map} +0 -0
- /package/dist/{violin.renderer-PHUNX2QD.js.map → violin.renderer-OAJJKCMF.js.map} +0 -0
- /package/dist/{vocabulary-OGJQIIHW.js.map → vocabulary-O7NLLQLC.js.map} +0 -0
|
@@ -8,13 +8,13 @@ import {
|
|
|
8
8
|
renderSandboxFormDiv,
|
|
9
9
|
sayerror,
|
|
10
10
|
to_svg
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-FLJ2GUHL.js";
|
|
12
12
|
import "./chunk-HJ6L54YS.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-FSGEVTVI.js";
|
|
14
14
|
import {
|
|
15
15
|
Menu
|
|
16
|
-
} from "./chunk-
|
|
17
|
-
import "./chunk-
|
|
16
|
+
} from "./chunk-QSSTMH7C.js";
|
|
17
|
+
import "./chunk-TR6EV3FG.js";
|
|
18
18
|
import "./chunk-3JH6BKPD.js";
|
|
19
19
|
import {
|
|
20
20
|
mclass,
|
|
@@ -23,11 +23,10 @@ import {
|
|
|
23
23
|
import "./chunk-IQIXGTQV.js";
|
|
24
24
|
import "./chunk-ITJ2SXU5.js";
|
|
25
25
|
import "./chunk-FN5XPUPH.js";
|
|
26
|
-
import "./chunk-
|
|
26
|
+
import "./chunk-MYBLQGD6.js";
|
|
27
27
|
import "./chunk-6LZYWV4K.js";
|
|
28
28
|
import "./chunk-FIZCTRIV.js";
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-DQC5FFGV.js";
|
|
29
|
+
import "./chunk-TPK3G44P.js";
|
|
31
30
|
import "./chunk-LD45BCVM.js";
|
|
32
31
|
import "./chunk-RA5EXEHB.js";
|
|
33
32
|
import {
|
|
@@ -56,6 +55,7 @@ import "./chunk-OMR2DT66.js";
|
|
|
56
55
|
import {
|
|
57
56
|
select_default
|
|
58
57
|
} from "./chunk-NDWTN4U5.js";
|
|
58
|
+
import "./chunk-DQC5FFGV.js";
|
|
59
59
|
import "./chunk-HFNDKYVF.js";
|
|
60
60
|
|
|
61
61
|
// src/2dmaf.anchors.js
|
|
@@ -1365,4 +1365,4 @@ export {
|
|
|
1365
1365
|
d2mafparseinput,
|
|
1366
1366
|
d2mafui
|
|
1367
1367
|
};
|
|
1368
|
-
//# sourceMappingURL=2dmaf-
|
|
1368
|
+
//# sourceMappingURL=2dmaf-NULVBOXA.js.map
|
|
@@ -7,14 +7,14 @@ import {
|
|
|
7
7
|
getNormalRoot,
|
|
8
8
|
renderTable,
|
|
9
9
|
sayerror
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-FLJ2GUHL.js";
|
|
11
11
|
import "./chunk-HJ6L54YS.js";
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-FSGEVTVI.js";
|
|
13
|
+
import "./chunk-QSSTMH7C.js";
|
|
14
14
|
import {
|
|
15
15
|
dofetch2,
|
|
16
16
|
dofetch3
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-TR6EV3FG.js";
|
|
18
18
|
import "./chunk-3JH6BKPD.js";
|
|
19
19
|
import {
|
|
20
20
|
getColors
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
import "./chunk-IQIXGTQV.js";
|
|
23
23
|
import "./chunk-ITJ2SXU5.js";
|
|
24
24
|
import "./chunk-FN5XPUPH.js";
|
|
25
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-MYBLQGD6.js";
|
|
26
26
|
import "./chunk-6LZYWV4K.js";
|
|
27
27
|
import {
|
|
28
28
|
copyMerge,
|
|
@@ -30,8 +30,7 @@ import {
|
|
|
30
30
|
} from "./chunk-FIZCTRIV.js";
|
|
31
31
|
import {
|
|
32
32
|
require_debounce
|
|
33
|
-
} from "./chunk-
|
|
34
|
-
import "./chunk-DQC5FFGV.js";
|
|
33
|
+
} from "./chunk-TPK3G44P.js";
|
|
35
34
|
import "./chunk-LD45BCVM.js";
|
|
36
35
|
import "./chunk-RA5EXEHB.js";
|
|
37
36
|
import "./chunk-2MN5JLZB.js";
|
|
@@ -44,6 +43,7 @@ import {
|
|
|
44
43
|
rgb
|
|
45
44
|
} from "./chunk-OMR2DT66.js";
|
|
46
45
|
import "./chunk-NDWTN4U5.js";
|
|
46
|
+
import "./chunk-DQC5FFGV.js";
|
|
47
47
|
import {
|
|
48
48
|
__toESM
|
|
49
49
|
} from "./chunk-HFNDKYVF.js";
|
|
@@ -330,7 +330,7 @@ var AIProjectAdminInteractions = class {
|
|
|
330
330
|
);
|
|
331
331
|
images = response.images;
|
|
332
332
|
}
|
|
333
|
-
const wsiViewer = await import("./plot.wsi-
|
|
333
|
+
const wsiViewer = await import("./plot.wsi-6AV6EBAB.js");
|
|
334
334
|
wsiViewer.default(this.dslabel, holder, { name: this.genome }, null, config.settings.project.id, images, true);
|
|
335
335
|
}
|
|
336
336
|
async appDispatchEdit(settings, config = {}) {
|
|
@@ -475,6 +475,9 @@ var ClassesTableRender = class {
|
|
|
475
475
|
// plots/aiProjectAdmin/view/SelectorTableRender.ts
|
|
476
476
|
var SelectorTableRender = class {
|
|
477
477
|
constructor(holder, interactions, images) {
|
|
478
|
+
this.images = { rows: [], cols: [] };
|
|
479
|
+
this.selectedRows = /* @__PURE__ */ new Set();
|
|
480
|
+
this.sortedIndexMap = [];
|
|
478
481
|
this.dom = {
|
|
479
482
|
holder,
|
|
480
483
|
tableDiv: holder.append("div").attr("class", ".sjpp-deletable-ai-prjt-admin-div").attr("id", "sjpp-selector-table").style("padding", "10px 0"),
|
|
@@ -482,34 +485,76 @@ var SelectorTableRender = class {
|
|
|
482
485
|
};
|
|
483
486
|
this.images = images;
|
|
484
487
|
this.interactions = interactions;
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
)
|
|
488
|
+
const selectedList = images?.selectedImages;
|
|
489
|
+
const normalizeImageName = (s) => String(s ?? "").replace(/\.svs$/i, "").toLowerCase();
|
|
490
|
+
const selectedSet = new Set((selectedList || []).map(normalizeImageName));
|
|
491
|
+
this.selectedRows = /* @__PURE__ */ new Set();
|
|
492
|
+
(this.images?.rows ?? []).forEach((row, i) => {
|
|
493
|
+
const candidate = row?.[0]?.value;
|
|
494
|
+
const n = normalizeImageName(candidate);
|
|
495
|
+
if (selectedSet.has(n)) this.selectedRows.add(i);
|
|
496
|
+
});
|
|
490
497
|
this.render();
|
|
491
498
|
}
|
|
492
499
|
render() {
|
|
500
|
+
const columns = this.images.cols.map((c) => ({ ...c, sortable: true })) || [];
|
|
501
|
+
if (!columns.length) {
|
|
502
|
+
this.dom.tableDiv.append("div").text("Missing columns data").style("color", "red");
|
|
503
|
+
this.renderApplyBtn(
|
|
504
|
+
/*disable=*/
|
|
505
|
+
true
|
|
506
|
+
);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
const rows = this.images?.rows ?? [];
|
|
510
|
+
const mapped = rows.map((row, origIdx) => ({
|
|
511
|
+
row,
|
|
512
|
+
origIdx,
|
|
513
|
+
selected: this.selectedRows.has(origIdx)
|
|
514
|
+
}));
|
|
515
|
+
mapped.sort((a, b) => {
|
|
516
|
+
const selDiff = Number(b.selected) - Number(a.selected);
|
|
517
|
+
return selDiff || a.origIdx - b.origIdx;
|
|
518
|
+
});
|
|
519
|
+
const rowsSorted = mapped.map((m) => m.row);
|
|
520
|
+
this.sortedIndexMap = mapped.map((m) => m.origIdx);
|
|
521
|
+
const selectedRowsForRender = mapped.reduce((acc, m, idx) => {
|
|
522
|
+
if (m.selected) acc.push(idx);
|
|
523
|
+
return acc;
|
|
524
|
+
}, []);
|
|
493
525
|
renderTable({
|
|
494
526
|
div: this.dom.tableDiv,
|
|
495
|
-
columns
|
|
496
|
-
rows:
|
|
497
|
-
selectedRows:
|
|
527
|
+
columns,
|
|
528
|
+
rows: rowsSorted,
|
|
529
|
+
selectedRows: selectedRowsForRender,
|
|
498
530
|
striped: true,
|
|
499
531
|
header: { allowSort: true },
|
|
500
|
-
noButtonCallback: (
|
|
532
|
+
noButtonCallback: (sortedIdx, node) => {
|
|
533
|
+
const orig = this.sortedIndexMap?.[sortedIdx];
|
|
534
|
+
if (orig === void 0) return;
|
|
501
535
|
if (node.checked) {
|
|
502
|
-
this.selectedRows.add(
|
|
536
|
+
this.selectedRows.add(orig);
|
|
503
537
|
} else {
|
|
504
|
-
this.selectedRows.delete(
|
|
538
|
+
this.selectedRows.delete(orig);
|
|
505
539
|
}
|
|
540
|
+
;
|
|
541
|
+
this.dom.tableDiv.selectAll("*").remove();
|
|
542
|
+
this.render();
|
|
506
543
|
}
|
|
507
544
|
});
|
|
508
|
-
this.renderApplyBtn(
|
|
545
|
+
this.renderApplyBtn(
|
|
546
|
+
/*disable=*/
|
|
547
|
+
false
|
|
548
|
+
);
|
|
509
549
|
}
|
|
510
|
-
renderApplyBtn() {
|
|
511
|
-
const btn = this.dom.btnDiv.append("div").text("Apply").classed("sja_menuoption", true).style("display", "block").style("width", "fit-content").style("margin-left", "5vw")
|
|
512
|
-
|
|
550
|
+
renderApplyBtn(disable = false) {
|
|
551
|
+
const btn = this.dom.btnDiv.append("div").text("Apply").classed("sja_menuoption", true).style("display", "block").style("width", "fit-content").style("margin-left", "5vw");
|
|
552
|
+
if (disable) btn.attr("disabled", true);
|
|
553
|
+
btn.on("click", async () => {
|
|
554
|
+
if (!this.selectedRows.size) {
|
|
555
|
+
alert(`No rows selected. Please select some rows.`);
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
513
558
|
btn.attr("disabled", true);
|
|
514
559
|
const images = Array.from(this.selectedRows).map((i) => `${this.images.rows[i][0].value}.svs`);
|
|
515
560
|
await this.interactions.editProject({
|
|
@@ -518,7 +563,7 @@ var SelectorTableRender = class {
|
|
|
518
563
|
}
|
|
519
564
|
});
|
|
520
565
|
this.dom.holder.selectAll("*").remove();
|
|
521
|
-
this.interactions.launchViewer(this.dom.holder, images);
|
|
566
|
+
await this.interactions.launchViewer(this.dom.holder, images);
|
|
522
567
|
});
|
|
523
568
|
}
|
|
524
569
|
};
|
|
@@ -638,7 +683,7 @@ var CreateProjectRender = class {
|
|
|
638
683
|
const btn = this.dom.classDiv.append("div").text("Apply").classed("sja_menuoption", true).style("display", "inline-block").style("margin-left", "200px").on("click", async () => {
|
|
639
684
|
btn.attr("disabled", true);
|
|
640
685
|
const selections = await this.interactions.getFilteredImages(this.filter);
|
|
641
|
-
if (this.filter && (selections.status != "ok" || selections.data
|
|
686
|
+
if (this.filter && (selections.status != "ok" || selections.data?.length === 0)) {
|
|
642
687
|
alert("No images match your filter criteria.");
|
|
643
688
|
return;
|
|
644
689
|
}
|
|
@@ -779,4 +824,4 @@ export {
|
|
|
779
824
|
componentInit,
|
|
780
825
|
getPlotConfig
|
|
781
826
|
};
|
|
782
|
-
//# sourceMappingURL=AIProjectAdmin-
|
|
827
|
+
//# sourceMappingURL=AIProjectAdmin-CFBJXRDX.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../plots/aiProjectAdmin/defaults.ts", "../plots/aiProjectAdmin/repo/ProjectReposity.ts", "../plots/aiProjectAdmin/view/ProjectAdminRender.ts", "../plots/aiProjectAdmin/interactions/AIProjectAdminInteractions.ts", "../plots/aiProjectAdmin/view/ClassesTableRender.ts", "../plots/aiProjectAdmin/view/SelectorTableRender.ts", "../plots/aiProjectAdmin/view/UsersRender.ts", "../plots/aiProjectAdmin/view/CreateProjectRender.ts", "../plots/aiProjectAdmin/AIProjectAdmin.ts"],
|
|
4
|
-
"sourcesContent": ["import type Settings from './Settings'\n\nexport function getDefaultAIProjectAdminSettings(overrides = {}): Settings {\n\tconst defaults: Settings = {}\n\treturn Object.assign(defaults, overrides)\n}\n", "import { dofetch2, dofetch3 } from '#common/dofetch'\nimport type { AIProjectAdminRequest, AIProjectAdminResponse } from '#types'\n\nexport class ProjectReposity {\n\tpublic async getProjects(genome: string, dslabel: string): Promise<string[]> {\n\t\tconst body: AIProjectAdminRequest = {\n\t\t\tgenome,\n\t\t\tdslabel,\n\t\t\tfor: 'list'\n\t\t}\n\t\ttry {\n\t\t\tconst response = await dofetch3('aiProjectAdmin', { body })\n\t\t\treturn response || []\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching projects:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/** Gets the image paths from db */\n\tpublic async getImagePaths(genome: string, dslabel: string, project: any): Promise<AIProjectAdminResponse> {\n\t\tconst body: AIProjectAdminRequest = {\n\t\t\tgenome,\n\t\t\tdslabel,\n\t\t\tfor: 'images',\n\t\t\tproject\n\t\t}\n\t\ttry {\n\t\t\treturn await dofetch3('aiProjectAdmin', { body })\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching images:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tpublic async updateProject(_body: any, method: string): Promise<AIProjectAdminResponse> {\n\t\tconst body: AIProjectAdminRequest = Object.assign({}, _body, { for: 'admin' })\n\t\ttry {\n\t\t\tif (method == 'PUT' || method == 'DELETE') {\n\t\t\t\t/** 3rd argument is for serverData caching.\n\t\t\t\t * Do not cache put or delete requests */\n\t\t\t\treturn await dofetch2('aiProjectAdmin', { method, body }, {})\n\t\t\t}\n\t\t\treturn await dofetch3('aiProjectAdmin', { method, body })\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching projects:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t//TODO: Will need a method to call metadata API, then build dictionary\n\tasync getTerms(app: any): Promise<any> {\n\t\tconst root = { id: '__root', name: 'root', __tree_isroot: true }\n\t\ttry {\n\t\t\tawait app.vocabApi.buildAdHocDictionary()\n\t\t\tconst terms = await app.vocabApi.getTermChildren(root, [])\n\t\t\treturn terms || []\n\t\t} catch (error) {\n\t\t\tconsole.error('Error getting terms:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync getAnnotations(genome: string, dslabel: string, projectId: number) {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\tgenome,\n\t\t\t\tdslabel,\n\t\t\t\tprojectId,\n\t\t\t\twsimagesFilenames: ['all']\n\t\t\t}\n\t\t\tconst response: any = await dofetch3('aiProjectSelectedWSImages', { body })\n\t\t\tconst wsimages = response?.wsimages || []\n\t\t\tconst annotations: any[] = []\n\t\t\tfor (const w of wsimages) {\n\t\t\t\tconst anns = w.annotations || []\n\t\t\t\tconst filename = w.filename\n\t\t\t\tif (Array.isArray(anns)) {\n\t\t\t\t\tfor (const a of anns) {\n\t\t\t\t\t\t// attach filename so consumers know which WSI each annotation came from\n\t\t\t\t\t\tannotations.push(Object.assign({ filename }, a))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn annotations\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching annotations from server:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n", "import { renderTable, sayerror } from '#dom'\nimport { debounce } from 'debounce'\nimport type { AIProjectAdminInteractions } from '../interactions/AIProjectAdminInteractions'\n\nexport class ProjectAdminRender {\n\tdom: any\n\tprojects: any[]\n\tinteractions: AIProjectAdminInteractions\n\n\tconstructor(dom: any, projects: any[], interactions: AIProjectAdminInteractions) {\n\t\tthis.dom = dom\n\t\tthis.projects = projects //returns as [{ value: 'Project1' }, { value: 'Project2' }, ...]\n\t\tthis.interactions = interactions\n\t}\n\n\t/** Renders project administration UI, allowing users to\n\t * create new projects or edit existing ones.*/\n\trenderProjectAdmin() {\n\t\tconst projectDiv = this.dom.holder\n\t\t\t.append('div')\n\t\t\t.attr('id', 'sjpp-ai-prjt-admin-projects')\n\t\t\t.attr('class', 'sjpp-deletable-ai-prjt-admin-div')\n\t\tthis.renderCreateProject(projectDiv)\n\t\tthis.renderProjectSelection(projectDiv)\n\t}\n\n\t/** Users submit a new project name before sample\n\t * filtering UI to finalize project creation.*/\n\trenderCreateProject(projectDiv) {\n\t\tconst newProjectDiv = projectDiv.append('div').attr('class', 'sjpp-project-select-new').style('padding', '10px')\n\n\t\tconst input = newProjectDiv\n\t\t\t.append('input')\n\t\t\t.attr('id', 'sjpp-new-project-name')\n\t\t\t.attr('display', 'inline-block')\n\t\t\t.attr('placeholder', 'New project name')\n\n\t\tconst button = newProjectDiv\n\t\t\t.append('div')\n\t\t\t.text('Create Project')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.property('disabled', true)\n\t\t\t.on('click', async () => {\n\t\t\t\tconst projectName = input.property('value')\n\t\t\t\tconst prjtNameLen = projectName.trim().length\n\n\t\t\t\tconst showError = (msg: string) => {\n\t\t\t\t\tsayerror(this.dom.errorDiv, msg)\n\t\t\t\t\tinput.property('value', '')\n\t\t\t\t\tbutton.property('disabled', true)\n\n\t\t\t\t\t//Show error for 3 seconds, then remove\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.dom.errorDiv.selectAll('*').remove()\n\t\t\t\t\t}, 3000)\n\t\t\t\t}\n\n\t\t\t\tif (prjtNameLen == 0) {\n\t\t\t\t\t//Shouldn't be necessary because of the debouncer\n\t\t\t\t\treturn showError('Project name cannot be empty')\n\t\t\t\t}\n\t\t\t\tif (prjtNameLen > 50 || prjtNameLen < 3) {\n\t\t\t\t\treturn showError('Project name must be between 3 and 50 characters')\n\t\t\t\t}\n\t\t\t\tconst notUnique = this.projects.some((p: any) => p.name === projectName.trim())\n\t\t\t\tif (notUnique) {\n\t\t\t\t\treturn showError(`Project name '${projectName}' already exists`)\n\t\t\t\t}\n\n\t\t\t\t//Show project name in sandbox header\n\t\t\t\tif (this.dom.header) this.dom.header.text(`Project: ${projectName}`)\n\n\t\t\t\t//calls main() to trigger CreateProjectRender\n\t\t\t\tawait this.interactions.appDispatchEdit({ settings: { project: { name: projectName, type: 'new' } } })\n\t\t\t})\n\n\t\tinput.on('keydown', () => {\n\t\t\tconst debouncer = () => {\n\t\t\t\tbutton.property('disabled', input.property('value').length == 0)\n\t\t\t}\n\t\t\tdebounce(debouncer, 300)()\n\t\t})\n\t}\n\n\t/** Users may select an existing project from a table\n\t * returned for the db to edit or delete, depending\n\t * on user roles.*/\n\trenderProjectSelection(projectDiv) {\n\t\tif (!this.projects.length) return\n\n\t\tconst tableDiv = projectDiv.append('div').attr('class', 'sjpp-project-select-table').style('padding', '10px')\n\t\tconst columns = [{ label: 'Project', sortable: true }]\n\n\t\tconst columnButtons = [\n\t\t\t{\n\t\t\t\ttext: 'Edit',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\t//_ = event, __ = idx\n\t\t\t\tcallback: async (_, idx) => {\n\t\t\t\t\t/** TODO: open wsisamples plot ||\n\t\t\t\t\t * get project details rather than edit the db */\n\t\t\t\t\tconst project = this.projects[idx]\n\t\t\t\t\tawait this.interactions.appDispatchEdit({ settings: { project } })\n\t\t\t\t\t// remove 'dev' for production\n\t\t\t\t\tthis.interactions.launchViewer(this.dom.holder, [])\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t// Export button - pass only project.id and export will be CSV\n\t\t\t\ttext: 'Export',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\tcallback: async (_, idx) => {\n\t\t\t\t\tconst project = this.projects[idx]\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.interactions.exportAnnotations(project.id)\n\t\t\t\t\t} catch (_: any) {\n\t\t\t\t\t\tsayerror(this.dom.errorDiv, 'Failed to export annotations')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t//TODO: Add logic for admins only once user roles are implemented\n\t\t\t\t//Leave here for development\n\t\t\t\ttext: 'Delete',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\tcallback: (_, i) => {\n\t\t\t\t\tconst project = this.projects[i]\n\t\t\t\t\tthis.interactions.deleteProject(project)\n\n\t\t\t\t\t//Update UI after deletion. Maybe cleaner way to handle this?\n\t\t\t\t\t//Maybe app.dispatch and rerender instead?\n\t\t\t\t\tthis.projects.splice(i, 1)\n\t\t\t\t\t//Remove the table from the projectDiv and re-render\n\t\t\t\t\tprojectDiv.select('.sjpp-project-select-table').remove()\n\t\t\t\t\tthis.renderProjectSelection(projectDiv)\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\n\t\trenderTable({\n\t\t\tdiv: tableDiv,\n\t\t\trows: this.projects.map((p: any) => {\n\t\t\t\treturn [{ value: p.name }]\n\t\t\t}),\n\t\t\theader: {\n\t\t\t\tallowSort: true\n\t\t\t},\n\t\t\tcolumns,\n\t\t\tsingleMode: true,\n\t\t\tcolumnButtons\n\t\t})\n\t}\n}\n", "import type { ProjectReposity } from '../repo/ProjectReposity'\nimport type { AIProjectAdminResponse } from '#types'\nimport { buildAnnotationsCsv } from '#plots/wsiviewer/interactions/annotationsCsv.ts'\n\nexport class AIProjectAdminInteractions {\n\tapp: any\n\tid: string\n\tgenome: string\n\tdslabel: string\n\tprjtRepo: ProjectReposity\n\n\tconstructor(app: any, id: string, prjtRepo: ProjectReposity) {\n\t\tthis.app = app\n\t\tthis.id = id\n\t\tthis.genome = app.vocabApi.vocab.genome\n\t\tthis.dslabel = app.vocabApi.vocab.dslabel\n\t\tthis.prjtRepo = prjtRepo\n\t}\n\n\tasync addProject(opts: { project: any }): Promise<void> {\n\t\tconst config = this.getConfig()\n\t\tconst projectObject = Object.assign({}, config.settings.project, opts.project)\n\n\t\tconst body = {\n\t\t\tgenome: this.genome,\n\t\t\tdslabel: this.dslabel,\n\t\t\tproject: projectObject\n\t\t}\n\t\ttry {\n\t\t\tawait this.prjtRepo.updateProject(body, 'PUT')\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error adding project:', e.message || e)\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync editProject(opts: { project: any }): Promise<void> {\n\t\tconst config = this.getConfig()\n\t\tconst project = Object.assign(\n\t\t\t{},\n\t\t\tconfig.settings.project,\n\t\t\t{\n\t\t\t\ttype: 'edit'\n\t\t\t},\n\t\t\topts.project\n\t\t)\n\n\t\tconst body = {\n\t\t\tgenome: this.genome,\n\t\t\tdslabel: this.dslabel,\n\t\t\tproject\n\t\t}\n\t\ttry {\n\t\t\tconst res = (await this.prjtRepo.updateProject(body, 'POST')) as any\n\t\t\tif (!project.id) project.id = res.projectId\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error editing project:', e.message || e)\n\t\t\tthrow e\n\t\t}\n\t\tawait this.appDispatchEdit({ settings: { project } }, config)\n\t}\n\n\tasync deleteProject(project: { value: string; id: number }): Promise<void> {\n\t\tconst body = {\n\t\t\tgenome: this.genome,\n\t\t\tdslabel: this.dslabel,\n\t\t\tproject: {\n\t\t\t\tname: project.value,\n\t\t\t\tid: project.id\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.prjtRepo.updateProject(body, 'DELETE')\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error deleting project:', e.message || e)\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync getFilteredImages(filter: any): Promise<AIProjectAdminResponse> {\n\t\tconst config = this.getConfig()\n\t\treturn await this.app.vocabApi.getFilteredAiImages(config.settings.project, filter)\n\t}\n\n\tasync launchViewer(holder: any, _images?: string[]): Promise<void> {\n\t\tholder.selectAll('.sjpp-deletable-ai-prjt-admin-div').remove()\n\n\t\tconst config = this.getConfig()\n\t\tlet images: string[] = []\n\n\t\tif (_images && _images.length > 0) {\n\t\t\timages = _images\n\t\t} else {\n\t\t\tconst response: AIProjectAdminResponse = await this.prjtRepo.getImagePaths(\n\t\t\t\tthis.genome,\n\t\t\t\tthis.dslabel,\n\t\t\t\tconfig.settings.project\n\t\t\t)\n\t\t\timages = response.images\n\t\t}\n\n\t\tconst wsiViewer = await import('#plots/wsiviewer/plot.wsi.js')\n\t\twsiViewer.default(this.dslabel, holder, { name: this.genome }, null, config.settings.project.id, images, true)\n\t}\n\n\tpublic async appDispatchEdit(settings: any, config: any = {}): Promise<void> {\n\t\tif (!config?.settings) {\n\t\t\tconfig = this.getConfig()\n\t\t\tif (!config) throw new Error(`No plot with id='${this.id}' found.`)\n\t\t}\n\n\t\tawait this.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.id,\n\t\t\tconfig: Object.assign(settings, config.settings)\n\t\t})\n\t}\n\n\tprivate getConfig(): any {\n\t\treturn this.app.getState().plots.find((p: any) => p.id === this.id)\n\t}\n\n\tpublic async exportAnnotations(projectId: number): Promise<void> {\n\t\tconst config = this.getConfig()\n\t\tif (!config || !config.settings) throw new Error(`No plot with id='${this.id}' found.`)\n\n\t\t// fetch annotations for the entire project (server endpoint will expand ['all'] to all images)\n\t\tlet annotations: any[] = []\n\t\ttry {\n\t\t\tannotations = await this.prjtRepo.getAnnotations(this.genome, this.dslabel, projectId)\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error fetching annotations for export:', e?.message || e)\n\t\t\tthrow e\n\t\t}\n\n\t\t// Always produce CSV\n\t\tconst mime = 'text/csv;charset=utf-8;'\n\t\tlet content: string\n\n\t\tif (!Array.isArray(annotations) || annotations.length === 0) {\n\t\t\tcontent = ''\n\t\t} else {\n\t\t\t// use shared CSV builder; let it pick per-annotation filename (a.filename || a.image)\n\t\t\tcontent = buildAnnotationsCsv(annotations as any[])\n\t\t}\n\n\t\t// build a safe filename for download: prefer project name, fallback to projectId\n\t\tconst rawName =\n\t\t\tconfig.settings && config.settings.project && config.settings.project.name\n\t\t\t\t? String(config.settings.project.name)\n\t\t\t\t: `project-${projectId}`\n\t\tconst safeName = rawName.replace(/[^a-z0-9_.-]/gi, '_').slice(0, 200)\n\t\tconst filename = `${safeName}-annotations.csv`\n\n\t\ttry {\n\t\t\tconst blob = new Blob([content], { type: mime })\n\t\t\tconst url = URL.createObjectURL(blob)\n\t\t\tconst a = document.createElement('a')\n\t\t\ta.href = url\n\t\t\ta.download = filename\n\t\t\tdocument.body.appendChild(a)\n\t\t\ta.click()\n\t\t\ta.remove()\n\t\t\tsetTimeout(() => URL.revokeObjectURL(url), 1000)\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error creating annotation download:', e?.message || e)\n\t\t\tthrow e\n\t\t}\n\t}\n}\n", "import { renderTable } from '#dom'\nimport { getColors } from '#shared/common.js'\nimport { rgb } from 'd3-color'\nimport type { TableColumn, TableRow } from '#dom'\nimport type { Elem } from '../../../types/d3'\n\nexport class ClassesTableRender {\n\tdom: {\n\t\tholder: Elem\n\t\ttableDiv: Elem\n\t\tbtnDiv: Elem\n\t}\n\tcolumns: TableColumn[]\n\trows: TableRow[]\n\t/** table.ts updates this.rows and cell values in editCallback\n\t * Save a copy to check for duplicates when editing class names.*/\n\trowsCopy: TableRow[]\n\n\tconstructor(holder: any, rows?: TableRow[]) {\n\t\tthis.dom = {\n\t\t\tholder,\n\t\t\ttableDiv: holder.append('div'),\n\t\t\tbtnDiv: holder.append('div')\n\t\t}\n\t\tthis.columns = [\n\t\t\t{ label: '' }, // Empty for the delete icon\n\t\t\t{\n\t\t\t\tlabel: 'NAME',\n\t\t\t\teditCallback: (rowIdx, cell) => {\n\t\t\t\t\tconst newValue = (cell.value as string).trim()\n\t\t\t\t\tconst foundSameName = this.rows.some((r, i) => newValue === (r[1].value as string).trim() && i !== rowIdx)\n\t\t\t\t\tif (foundSameName) {\n\t\t\t\t\t\talert(`Class name '${newValue}' already exists`)\n\t\t\t\t\t\t/** Reset to original value\n\t\t\t\t\t\t * renderTable() updates arg.rows and cell value before this callback.\n\t\t\t\t\t\t * This resets the value to the original value */\n\t\t\t\t\t\tcell.value = this.rowsCopy[rowIdx][1].value\n\t\t\t\t\t\tcell.__td.text(this.rowsCopy[rowIdx][1].value)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tthis.rowsCopy = this.rows.map(r => r.map(c => ({ ...c })))\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ label: 'COLOR' }\n\t\t]\n\t\tconst colorScale = getColors(5)\n\t\tthis.rows = rows || this.setDefaultClasses(colorScale)\n\t\tthis.rowsCopy = []\n\n\t\tthis.renderTable()\n\t\tthis.renderAddClassBtn(colorScale)\n\t}\n\n\trenderTable() {\n\t\tthis.dom.tableDiv.select('table').remove()\n\t\tif (!this.rows || this.rows.length === 0) return\n\n\t\t// Deep copy to avoid reference issues\n\t\t// Regenerate on every render\n\t\tthis.rowsCopy = this.rows.map(r => r.map(c => ({ ...c })))\n\n\t\trenderTable({\n\t\t\tdiv: this.dom.tableDiv,\n\t\t\tcolumns: this.columns,\n\t\t\trows: this.rows,\n\t\t\tstriped: false,\n\t\t\tshowLines: false,\n\t\t\tsingleMode: false,\n\t\t\tresize: true\n\t\t})\n\n\t\t//editCallback only works with changing the value of the cell\n\t\tfor (const [i, row] of this.rows.entries()) {\n\t\t\tconst deleteBtn = row[0].__td.select('.sja_menuoption')\n\t\t\tdeleteBtn.on('click', () => {\n\t\t\t\tthis.rows.splice(i, 1)\n\t\t\t\tthis.renderTable()\n\t\t\t})\n\t\t}\n\t}\n\n\tsetDefaultClasses(colorScale) {\n\t\t//TODO default classes from dataset\n\t\tconst rows: TableRow[] = []\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tthis.getNewClass(colorScale, rows)\n\t\t}\n\n\t\treturn rows\n\t}\n\n\tgetNewClass(colorScale: any, rows: TableRow[]) {\n\t\tconst getName = (i: number) => `New class ${i}`\n\n\t\tlet i = 1\n\t\tlet found = true\n\t\twhile (found) {\n\t\t\tconst checkName = getName(i)\n\t\t\tfound = rows.some(r => r[1].value == checkName)\n\t\t\tif (found) i++\n\t\t}\n\n\t\trows.push([\n\t\t\t{ html: `<div class=\"sja_menuoption\">×<div>` },\n\t\t\t{ value: getName(i) },\n\t\t\t{ color: rgb(colorScale(`${i}`)).formatHex() }\n\t\t])\n\t}\n\n\trenderAddClassBtn(colorScale: any) {\n\t\tthis.dom.btnDiv\n\t\t\t.append('div')\n\t\t\t.text('Add Class')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin', '10px 0px 0px 0px')\n\t\t\t.on('click', () => {\n\t\t\t\tif (this.rows.length >= 9) {\n\t\t\t\t\talert('Maximum number of classes reached.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.getNewClass(colorScale, this.rows)\n\t\t\t\tthis.renderTable()\n\t\t\t})\n\t}\n}\n", "import { renderTable } from '#dom'\nimport type { TableColumn, TableRow } from '#dom'\nimport type { AIProjectAdminInteractions } from '../interactions/AIProjectAdminInteractions'\nimport type { Elem, Div } from '../../../types/d3'\n\nexport class SelectorTableRender {\n\tdom: {\n\t\tholder: Elem\n\t\ttableDiv: Div | Elem\n\t\tbtnDiv: Div | Elem\n\t}\n\timages: { rows: any[]; cols: any[] }\n\tinteractions: AIProjectAdminInteractions\n\tselectedRows: Set<number>\n\n\tconstructor(\n\t\tholder: Elem,\n\t\tinteractions: AIProjectAdminInteractions,\n\t\timages: { rows: TableRow[]; cols: TableColumn[] }\n\t) {\n\t\tthis.dom = {\n\t\t\tholder,\n\t\t\ttableDiv: holder\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', '.sjpp-deletable-ai-prjt-admin-div')\n\t\t\t\t.attr('id', 'sjpp-selector-table')\n\t\t\t\t.style('padding', '10px 0'),\n\t\t\tbtnDiv: holder.append('div').attr('class', '.sjpp-deletable-ai-prjt-admin-div').attr('id', 'sjpp-selector-btns')\n\t\t}\n\t\tthis.images = images\n\t\tthis.interactions = interactions\n\t\t/** This is for development\n\t\t * eventually the API request will return which rows should be selected.\n\t\t */\n\t\tthis.selectedRows = new Set(\n\t\t\tthis.images.rows\n\t\t\t\t.filter((_, i) => {\n\t\t\t\t\tif (i < 50) return true\n\t\t\t\t})\n\t\t\t\t.map((_, i) => i)\n\t\t) // Select first 50 rows for prototype\n\n\t\tthis.render()\n\t}\n\n\tprivate render() {\n\t\trenderTable({\n\t\t\tdiv: this.dom.tableDiv,\n\t\t\tcolumns: this.images.cols.map(c => ({ ...c, sortable: true })),\n\t\t\trows: this.images.rows,\n\t\t\tselectedRows: Array.from(this.selectedRows),\n\t\t\tstriped: true,\n\t\t\theader: { allowSort: true },\n\t\t\tnoButtonCallback: (i, node) => {\n\t\t\t\tif (node.checked) {\n\t\t\t\t\tthis.selectedRows.add(i)\n\t\t\t\t} else {\n\t\t\t\t\tthis.selectedRows.delete(i)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tthis.renderApplyBtn()\n\t}\n\n\tprivate renderApplyBtn() {\n\t\tconst btn = this.dom.btnDiv\n\t\t\t.append('div')\n\t\t\t.text('Apply')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'block')\n\t\t\t.style('width', 'fit-content')\n\t\t\t.style('margin-left', '5vw')\n\t\t\t.on('click', async () => {\n\t\t\t\tif (!this.selectedRows.size) alert(`No rows selected. Please select some rows.`)\n\t\t\t\t//Don't allow multiple clicks\n\t\t\t\tbtn.attr('disabled', true)\n\n\t\t\t\tconst images = Array.from(this.selectedRows).map(i => `${this.images.rows[i][0].value}.svs`)\n\t\t\t\tawait this.interactions.editProject({\n\t\t\t\t\tproject: {\n\t\t\t\t\t\timages\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.dom.holder.selectAll('*').remove()\n\t\t\t\tthis.interactions.launchViewer(this.dom.holder, images)\n\t\t\t})\n\t}\n}\n", "import { renderTable, sayerror } from '#dom'\n\nexport class UsersRender {\n\tdom: any\n\tusers: string[]\n\n\tconstructor(dom: any, users: string[] = []) {\n\t\tthis.dom = dom\n\t\tthis.users = users.slice()\n\t}\n\n\trender() {\n\t\t// TODO remove this if check after sso is enabled\n\t\tif (this.users.length > 0) {\n\t\t\t// container\n\t\t\tconst container = this.dom.holder\n\t\t\t\t.append('div')\n\t\t\t\t.attr('id', 'sjpp-users-render')\n\t\t\t\t.attr('class', 'sjpp-deletable-ai-prjt-admin-div')\n\t\t\t\t.style('padding', '10px')\n\n\t\t\tconst inputRow = container.append('div').attr('class', 'sjpp-users-input-row').style('margin-bottom', '10px')\n\n\t\t\tconst input = inputRow\n\t\t\t\t.append('input')\n\t\t\t\t.attr('type', 'text')\n\t\t\t\t.attr('placeholder', 'user@example.com')\n\t\t\t\t.attr('id', 'sjpp-user-email-input')\n\t\t\t\t.style('margin-right', '8px')\n\t\t\t\t.style('width', '300px')\n\n\t\t\tconst addBtn = inputRow\n\t\t\t\t.append('div')\n\t\t\t\t.text('Add')\n\t\t\t\t.classed('sja_menuoption', true)\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.property('disabled', true)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tconst email = input.property('value').trim()\n\t\t\t\t\tconst showError = (msg: string) => {\n\t\t\t\t\t\tsayerror(this.dom.errorDiv, msg)\n\t\t\t\t\t\t// clear after 3s\n\t\t\t\t\t\tsetTimeout(() => this.dom.errorDiv.selectAll('*').remove(), 3000)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (email.length === 0) {\n\t\t\t\t\t\treturn showError('Email cannot be empty')\n\t\t\t\t\t}\n\n\t\t\t\t\tconst emailRe = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$/\n\n\t\t\t\t\tif (!emailRe.test(email)) {\n\t\t\t\t\t\treturn showError('Invalid email address')\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.users.includes(email)) {\n\t\t\t\t\t\treturn showError('Email already added')\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.users.push(email)\n\t\t\t\t\tinput.property('value', '')\n\t\t\t\t\taddBtn.property('disabled', true)\n\t\t\t\t\tthis.renderTableArea(container)\n\t\t\t\t})\n\n\t\t\tinput.on('input', () => {\n\t\t\t\taddBtn.property('disabled', input.property('value').trim().length === 0)\n\t\t\t})\n\n\t\t\tthis.renderTableArea(container)\n\t\t}\n\t}\n\n\tprivate renderTableArea(container: any) {\n\t\tcontainer.select('.sjpp-users-table-area').remove()\n\n\t\tconst tableDiv = container.append('div').attr('class', 'sjpp-users-table-area').style('padding', '6px 0')\n\n\t\tif (!this.users.length) {\n\t\t\ttableDiv.append('div').text('No users added yet.').style('color', '#666')\n\t\t\treturn\n\t\t}\n\n\t\tconst columns = [{ label: 'Email', sortable: true }]\n\n\t\tconst columnButtons = [\n\t\t\t{\n\t\t\t\ttext: '\u00D7',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\tcallback: (_, idx: number) => {\n\t\t\t\t\t// remove user and re-render\n\t\t\t\t\tthis.users.splice(idx, 1)\n\t\t\t\t\t// clear and re-render table area\n\t\t\t\t\tcontainer.select('.sjpp-users-table-area').remove()\n\t\t\t\t\tthis.renderTableArea(container)\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\n\t\trenderTable({\n\t\t\tdiv: tableDiv,\n\t\t\trows: this.users.map(u => [{ value: u }]),\n\t\t\tcolumns,\n\t\t\tcolumnButtons,\n\t\t\tsingleMode: false,\n\t\t\tstriped: false,\n\t\t\tshowLines: false,\n\t\t\tresize: true\n\t\t})\n\t\ttableDiv.selectAll('.sja_menuoption').html('\u00D7<div></div>')\n\t}\n}\n", "import { filterInit, getNormalRoot } from '#filter'\nimport { ClassesTableRender } from './ClassesTableRender'\nimport type { Elem } from '../../../types/d3'\nimport type { AIProjectAdminInteractions } from '../interactions/AIProjectAdminInteractions'\nimport { SelectorTableRender } from './SelectorTableRender'\nimport { UsersRender } from './UsersRender'\n\nexport class CreateProjectRender {\n\tdom: {\n\t\tholder: Elem\n\t\terrorDiv: Elem\n\t\tfilterDiv: Elem\n\t\tclassDiv: Elem\n\t\tusersDiv?: Elem\n\t}\n\tapp: any\n\tinteractions: AIProjectAdminInteractions\n\tfilter: any\n\tclassesTable?: ClassesTableRender\n\tusersRender?: UsersRender\n\n\tconstructor(dom: any, app: any, interactions: AIProjectAdminInteractions) {\n\t\tdom.holder.style('padding', '10px 20px').attr('class', 'sjpp-deletable-ai-prjt-admin-div')\n\n\t\tconst filterDiv = dom.holder.append('div').attr('id', 'sjpp-ai-prjt-admin-filter-div')\n\n\t\tconst wrapper = dom.holder\n\t\t\t.append('div')\n\t\t\t.attr('id', 'sjpp-ai-prjt-admin-classes-users-wrapper')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('gap', '20px')\n\t\t\t.style('align-items', 'flex-start')\n\t\t\t.style('padding', '20px 0px')\n\n\t\tconst left = wrapper.append('div').attr('id', 'sjpp-ai-prjt-admin-classes-table').style('flex', '0 1 auto')\n\n\t\tconst right = wrapper\n\t\t\t.append('div')\n\t\t\t.attr('id', 'sjpp-ai-prjt-admin-users')\n\t\t\t.style('width', '320px')\n\t\t\t.style('margin-left', '8px')\n\n\t\tthis.dom = {\n\t\t\tholder: dom.holder,\n\t\t\terrorDiv: dom.errorDiv,\n\t\t\tfilterDiv: filterDiv,\n\t\t\tclassDiv: left,\n\t\t\tusersDiv: right\n\t\t}\n\n\t\tthis.app = app\n\t\tthis.interactions = interactions\n\t\tthis.filter = null\n\t}\n\n\trender() {\n\t\tthis.renderFilter()\n\t\tthis.classesTable = new ClassesTableRender(this.dom.classDiv)\n\n\t\tthis.usersRender = new UsersRender({ holder: this.dom.usersDiv, errorDiv: this.dom.errorDiv }, [])\n\t\tthis.usersRender.render()\n\n\t\tthis.renderApplyBtn()\n\t}\n\n\tprivate renderFilter() {\n\t\tconst filter = filterInit({\n\t\t\tholder: this.dom.filterDiv,\n\t\t\temptyLabel: 'Add filter',\n\t\t\tvocabApi: this.app.vocabApi,\n\t\t\ttermdbConfig: this.app.vocabApi.termdbConfig,\n\t\t\tcallback: filter => {\n\t\t\t\tthis.filter = filter\n\t\t\t}\n\t\t})\n\n\t\tconst state = this.app.getState()\n\t\tconst root = getNormalRoot(state.termfilter.filter)\n\t\tfilter.main(root)\n\t}\n\n\tprivate renderApplyBtn() {\n\t\tconst btn = this.dom.classDiv\n\t\t\t.append('div')\n\t\t\t.text('Apply')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin-left', '200px')\n\t\t\t.on('click', async () => {\n\t\t\t\t/**** Uncomment before production */\n\n\t\t\t\t// const invalidInfo = this.validateInput()\n\t\t\t\t// const numInvalid = invalidInfo.entries?.length\n\t\t\t\t// if (numInvalid) {\n\t\t\t\t// \t/** TODO: allow user to ignore filter error on second click */\n\t\t\t\t// \tif (numInvalid === 1) sayerror(this.dom.errorDiv, invalidInfo.entries[0].reason)\n\t\t\t\t// else InvalidDataUI.render(this.dom.errorDiv, invalidInfo)\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\t\t\t\tbtn.attr('disabled', true) //Don't allow multiple clicks\n\n\t\t\t\tconst selections: any = await this.interactions.getFilteredImages(this.filter)\n\t\t\t\tif (this.filter && (selections.status != 'ok' || selections.data.length === 0)) {\n\t\t\t\t\talert('No images match your filter criteria.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// TODO: Enable user assignment after SSO is ready\n\t\t\t\t// if (!this.usersRender || !Array.isArray(this.usersRender.users) || this.usersRender.users.length === 0) {\n\t\t\t\t// \talert('Please add at least one user.')\n\t\t\t\t// \tbtn.attr('disabled', null)\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tawait this.interactions.addProject({\n\t\t\t\t\tproject: {\n\t\t\t\t\t\tfilter: this.filter,\n\t\t\t\t\t\tclasses: this.classesTable!.rows.map((row, i) => {\n\t\t\t\t\t\t\treturn { label: row[1].value, color: row[2].color, key_shortcut: `Digit${i + 1}` }\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tusers: this.usersRender?.users || []\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.dom.holder.selectAll('*').remove()\n\t\t\t\tnew SelectorTableRender(this.dom.holder, this.interactions, selections.data)\n\t\t\t})\n\t}\n\n\t/**** Uncomment before production */\n\t// private validateInput() {\n\t// \tconst invalidInfo = {\n\t// \t\tentries: [] as { dataType: string; reason: string }[],\n\t// \t\terrorMsg: 'Please clear all \"Data type: Class\" errors before applying changes.'\n\t// \t}\n\n\t// \t//Show user error if no filter is defined.\n\t// \tif (!this.filter) {\n\t// \t\tinvalidInfo.entries.push({ dataType: 'Filter', reason: 'No filter defined. Did you mean to add a filter?' })\n\t// \t}\n\t// \t//Check if all classes were deleted\n\t// \tconst classes = this.classesTable?.rows.map(row => row[1].value) || []\n\t// \tif (classes.length === 0) {\n\t// \t\tinvalidInfo.entries.push({ dataType: 'Class', reason: 'No classes defined. Did you mean to add a class?' })\n\t// \t}\n\t// \t//Check to see if any class is still a default class\n\t// \tconst unchangedClasses =\n\t// \t\tthis.classesTable?.rows\n\t// \t\t\t.filter(row => (row[1]?.value as string)?.startsWith('New class'))\n\t// \t\t\t.map(r => r[1]?.value as string) || []\n\t// \tfor (const c of unchangedClasses) {\n\t// \t\tinvalidInfo.entries.push({ dataType: 'Class', reason: `${c} is the default class name. Please rename.` })\n\t// \t}\n\n\t// \treturn invalidInfo\n\t// }\n}\n", "import { getCompInit, copyMerge, type RxComponent } from '#rx'\nimport { PlotBase } from '../PlotBase'\nimport type { MassState } from '#mass/types/mass'\nimport { getDefaultAIProjectAdminSettings } from './defaults'\nimport { ProjectReposity } from './repo/ProjectReposity'\nimport { ProjectAdminRender } from './view/ProjectAdminRender'\nimport { AIProjectAdminInteractions } from './interactions/AIProjectAdminInteractions'\nimport { CreateProjectRender } from './view/CreateProjectRender'\nimport { sayerror } from '#dom'\n\n/** This plot supports training AI models.\n * The UI allows users to create and manage projects. */\n\nclass AIProjectAdmin extends PlotBase implements RxComponent {\n\tstatic type = 'AIProjectAdmin'\n\tpublic type = 'AIProjectAdmin'\n\tprjtRepo: ProjectReposity\n\tprojects?: any[]\n\tprjtAdminUI?: ProjectAdminRender\n\tinteractions?: AIProjectAdminInteractions\n\n\tdom!: {\n\t\t[name: string]: any\n\t}\n\n\tconstructor(opts: any, api) {\n\t\tsuper(opts, api)\n\t\tthis.opts = opts\n\t\tthis.dom = {\n\t\t\tholder: opts.holder,\n\t\t\terrorDiv: opts.holder.append('div').style('margin', '3px').attr('class', 'sjpp-ai-prjt-admin-error')\n\t\t}\n\t\tif (opts.header) this.dom.header = opts.header\n\n\t\tthis.prjtRepo = new ProjectReposity()\n\t}\n\n\tgetState(appState: MassState) {\n\t\tconst config = appState.plots.find((p: any) => 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\treturn {\n\t\t\tconfig,\n\t\t\tvocab: appState.vocab,\n\t\t\tfilter: appState.termfilter.filter\n\t\t}\n\t}\n\n\tasync init(appState: MassState) {\n\t\tthis.interactions = new AIProjectAdminInteractions(this.app, this.id, this.prjtRepo)\n\n\t\ttry {\n\t\t\tthis.projects = await this.prjtRepo.getProjects(appState.vocab.genome, appState.vocab.dslabel)\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error initializing AIProjectAdmin:', e)\n\t\t\tthrow e\n\t\t}\n\t\tthis.prjtAdminUI = new ProjectAdminRender(this.dom, this.projects, this.interactions)\n\t\tthis.prjtAdminUI.renderProjectAdmin()\n\t}\n\n\tasync main() {\n\t\tconst state = structuredClone(this.state)\n\t\tconst config = state.config\n\t\tif (config.chartType != this.type) return\n\t\tconst project = config.settings.project\n\t\tif (!project) return\n\n\t\tif (!this.interactions) throw new Error('AIProjectAdminInteractions not initialized')\n\n\t\tthis.dom.holder.selectAll('.sjpp-deletable-ai-prjt-admin-div').remove()\n\n\t\tif (project.type === 'new') {\n\t\t\tconst terms = await this.prjtRepo.getTerms(this.app)\n\t\t\tif (!terms || terms.length === 0) {\n\t\t\t\tsayerror(this.dom.errorDiv, 'No metadata found.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst createProjectRender = new CreateProjectRender(this.dom, this.app, this.interactions)\n\t\t\tcreateProjectRender.render()\n\t\t}\n\n\t\t//launching project from embedded runpp()\n\t\tif (project.type == 'existing') {\n\t\t\tif (!project.name) {\n\t\t\t\tsayerror(this.dom.errorDiv, 'Project name not provided.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!project.id) {\n\t\t\t\tconst existingProject = this.projects?.find(p => p.name === project.name)\n\t\t\t\tif (!existingProject) {\n\t\t\t\t\tsayerror(this.dom.errorDiv, `Project ${project.name} not found.`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//No need to call dispatch. Save to the state and call the wsi viewer.\n\t\t\t\tawait this.app.save({\n\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\tid: this.id,\n\t\t\t\t\tconfig: { settings: { project: { id: existingProject.id } } }\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait this.interactions.launchViewer(this.dom.holder, [])\n\t\t}\n\t}\n}\n\nexport const aiProjectAdminInit = getCompInit(AIProjectAdmin)\nexport const componentInit = aiProjectAdminInit\n\nexport async function getPlotConfig(opts: any) {\n\tconst config = {\n\t\tchartType: 'AIProjectAdmin',\n\t\tsubfolder: 'aiProjectAdmin',\n\t\textension: 'ts',\n\t\thidePlotFilter: true, //Disable the filter in the sandbox header\n\t\tsettings: getDefaultAIProjectAdminSettings(opts.overrides)\n\t}\n\tif (opts.settings?.project && !opts.settings?.project?.type) {\n\t\t//If passing project from embedded runpp(), force type\n\t\topts.settings.project.type = 'existing'\n\t}\n\treturn copyMerge(config, opts)\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type Settings from './Settings'\n\nexport function getDefaultAIProjectAdminSettings(overrides = {}): Settings {\n\tconst defaults: Settings = {}\n\treturn Object.assign(defaults, overrides)\n}\n", "import { dofetch2, dofetch3 } from '#common/dofetch'\nimport type { AIProjectAdminRequest, AIProjectAdminResponse } from '#types'\n\nexport class ProjectReposity {\n\tpublic async getProjects(genome: string, dslabel: string): Promise<string[]> {\n\t\tconst body: AIProjectAdminRequest = {\n\t\t\tgenome,\n\t\t\tdslabel,\n\t\t\tfor: 'list'\n\t\t}\n\t\ttry {\n\t\t\tconst response = await dofetch3('aiProjectAdmin', { body })\n\t\t\treturn response || []\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching projects:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/** Gets the image paths from db */\n\tpublic async getImagePaths(genome: string, dslabel: string, project: any): Promise<AIProjectAdminResponse> {\n\t\tconst body: AIProjectAdminRequest = {\n\t\t\tgenome,\n\t\t\tdslabel,\n\t\t\tfor: 'images',\n\t\t\tproject\n\t\t}\n\t\ttry {\n\t\t\treturn await dofetch3('aiProjectAdmin', { body })\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching images:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tpublic async updateProject(_body: any, method: string): Promise<AIProjectAdminResponse> {\n\t\tconst body: AIProjectAdminRequest = Object.assign({}, _body, { for: 'admin' })\n\t\ttry {\n\t\t\tif (method == 'PUT' || method == 'DELETE') {\n\t\t\t\t/** 3rd argument is for serverData caching.\n\t\t\t\t * Do not cache put or delete requests */\n\t\t\t\treturn await dofetch2('aiProjectAdmin', { method, body }, {})\n\t\t\t}\n\t\t\treturn await dofetch3('aiProjectAdmin', { method, body })\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching projects:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t//TODO: Will need a method to call metadata API, then build dictionary\n\tasync getTerms(app: any): Promise<any> {\n\t\tconst root = { id: '__root', name: 'root', __tree_isroot: true }\n\t\ttry {\n\t\t\tawait app.vocabApi.buildAdHocDictionary()\n\t\t\tconst terms = await app.vocabApi.getTermChildren(root, [])\n\t\t\treturn terms || []\n\t\t} catch (error) {\n\t\t\tconsole.error('Error getting terms:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n\n\tasync getAnnotations(genome: string, dslabel: string, projectId: number) {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\tgenome,\n\t\t\t\tdslabel,\n\t\t\t\tprojectId,\n\t\t\t\twsimagesFilenames: ['all']\n\t\t\t}\n\t\t\tconst response: any = await dofetch3('aiProjectSelectedWSImages', { body })\n\t\t\tconst wsimages = response?.wsimages || []\n\t\t\tconst annotations: any[] = []\n\t\t\tfor (const w of wsimages) {\n\t\t\t\tconst anns = w.annotations || []\n\t\t\t\tconst filename = w.filename\n\t\t\t\tif (Array.isArray(anns)) {\n\t\t\t\t\tfor (const a of anns) {\n\t\t\t\t\t\t// attach filename so consumers know which WSI each annotation came from\n\t\t\t\t\t\tannotations.push(Object.assign({ filename }, a))\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn annotations\n\t\t} catch (error) {\n\t\t\tconsole.error('Error fetching annotations from server:', error)\n\t\t\tthrow error\n\t\t}\n\t}\n}\n", "import { renderTable, sayerror } from '#dom'\nimport { debounce } from 'debounce'\nimport type { AIProjectAdminInteractions } from '../interactions/AIProjectAdminInteractions'\n\nexport class ProjectAdminRender {\n\tdom: any\n\tprojects: any[]\n\tinteractions: AIProjectAdminInteractions\n\n\tconstructor(dom: any, projects: any[], interactions: AIProjectAdminInteractions) {\n\t\tthis.dom = dom\n\t\tthis.projects = projects //returns as [{ value: 'Project1' }, { value: 'Project2' }, ...]\n\t\tthis.interactions = interactions\n\t}\n\n\t/** Renders project administration UI, allowing users to\n\t * create new projects or edit existing ones.*/\n\trenderProjectAdmin() {\n\t\tconst projectDiv = this.dom.holder\n\t\t\t.append('div')\n\t\t\t.attr('id', 'sjpp-ai-prjt-admin-projects')\n\t\t\t.attr('class', 'sjpp-deletable-ai-prjt-admin-div')\n\t\tthis.renderCreateProject(projectDiv)\n\t\tthis.renderProjectSelection(projectDiv)\n\t}\n\n\t/** Users submit a new project name before sample\n\t * filtering UI to finalize project creation.*/\n\trenderCreateProject(projectDiv) {\n\t\tconst newProjectDiv = projectDiv.append('div').attr('class', 'sjpp-project-select-new').style('padding', '10px')\n\n\t\tconst input = newProjectDiv\n\t\t\t.append('input')\n\t\t\t.attr('id', 'sjpp-new-project-name')\n\t\t\t.attr('display', 'inline-block')\n\t\t\t.attr('placeholder', 'New project name')\n\n\t\tconst button = newProjectDiv\n\t\t\t.append('div')\n\t\t\t.text('Create Project')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.property('disabled', true)\n\t\t\t.on('click', async () => {\n\t\t\t\tconst projectName = input.property('value')\n\t\t\t\tconst prjtNameLen = projectName.trim().length\n\n\t\t\t\tconst showError = (msg: string) => {\n\t\t\t\t\tsayerror(this.dom.errorDiv, msg)\n\t\t\t\t\tinput.property('value', '')\n\t\t\t\t\tbutton.property('disabled', true)\n\n\t\t\t\t\t//Show error for 3 seconds, then remove\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.dom.errorDiv.selectAll('*').remove()\n\t\t\t\t\t}, 3000)\n\t\t\t\t}\n\n\t\t\t\tif (prjtNameLen == 0) {\n\t\t\t\t\t//Shouldn't be necessary because of the debouncer\n\t\t\t\t\treturn showError('Project name cannot be empty')\n\t\t\t\t}\n\t\t\t\tif (prjtNameLen > 50 || prjtNameLen < 3) {\n\t\t\t\t\treturn showError('Project name must be between 3 and 50 characters')\n\t\t\t\t}\n\t\t\t\tconst notUnique = this.projects.some((p: any) => p.name === projectName.trim())\n\t\t\t\tif (notUnique) {\n\t\t\t\t\treturn showError(`Project name '${projectName}' already exists`)\n\t\t\t\t}\n\n\t\t\t\t//Show project name in sandbox header\n\t\t\t\tif (this.dom.header) this.dom.header.text(`Project: ${projectName}`)\n\n\t\t\t\t//calls main() to trigger CreateProjectRender\n\t\t\t\tawait this.interactions.appDispatchEdit({ settings: { project: { name: projectName, type: 'new' } } })\n\t\t\t})\n\n\t\tinput.on('keydown', () => {\n\t\t\tconst debouncer = () => {\n\t\t\t\tbutton.property('disabled', input.property('value').length == 0)\n\t\t\t}\n\t\t\tdebounce(debouncer, 300)()\n\t\t})\n\t}\n\n\t/** Users may select an existing project from a table\n\t * returned for the db to edit or delete, depending\n\t * on user roles.*/\n\trenderProjectSelection(projectDiv) {\n\t\tif (!this.projects.length) return\n\n\t\tconst tableDiv = projectDiv.append('div').attr('class', 'sjpp-project-select-table').style('padding', '10px')\n\t\tconst columns = [{ label: 'Project', sortable: true }]\n\n\t\tconst columnButtons = [\n\t\t\t{\n\t\t\t\ttext: 'Edit',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\t//_ = event, __ = idx\n\t\t\t\tcallback: async (_, idx) => {\n\t\t\t\t\t/** TODO: open wsisamples plot ||\n\t\t\t\t\t * get project details rather than edit the db */\n\t\t\t\t\tconst project = this.projects[idx]\n\t\t\t\t\tawait this.interactions.appDispatchEdit({ settings: { project } })\n\t\t\t\t\t// remove 'dev' for production\n\t\t\t\t\tthis.interactions.launchViewer(this.dom.holder, [])\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t// Export button - pass only project.id and export will be CSV\n\t\t\t\ttext: 'Export',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\tcallback: async (_, idx) => {\n\t\t\t\t\tconst project = this.projects[idx]\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.interactions.exportAnnotations(project.id)\n\t\t\t\t\t} catch (_: any) {\n\t\t\t\t\t\tsayerror(this.dom.errorDiv, 'Failed to export annotations')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t//TODO: Add logic for admins only once user roles are implemented\n\t\t\t\t//Leave here for development\n\t\t\t\ttext: 'Delete',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\tcallback: (_, i) => {\n\t\t\t\t\tconst project = this.projects[i]\n\t\t\t\t\tthis.interactions.deleteProject(project)\n\n\t\t\t\t\t//Update UI after deletion. Maybe cleaner way to handle this?\n\t\t\t\t\t//Maybe app.dispatch and rerender instead?\n\t\t\t\t\tthis.projects.splice(i, 1)\n\t\t\t\t\t//Remove the table from the projectDiv and re-render\n\t\t\t\t\tprojectDiv.select('.sjpp-project-select-table').remove()\n\t\t\t\t\tthis.renderProjectSelection(projectDiv)\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\n\t\trenderTable({\n\t\t\tdiv: tableDiv,\n\t\t\trows: this.projects.map((p: any) => {\n\t\t\t\treturn [{ value: p.name }]\n\t\t\t}),\n\t\t\theader: {\n\t\t\t\tallowSort: true\n\t\t\t},\n\t\t\tcolumns,\n\t\t\tsingleMode: true,\n\t\t\tcolumnButtons\n\t\t})\n\t}\n}\n", "import type { ProjectReposity } from '../repo/ProjectReposity'\nimport type { AIProjectAdminResponse } from '#types'\nimport { buildAnnotationsCsv } from '#plots/wsiviewer/interactions/annotationsCsv.ts'\n\nexport class AIProjectAdminInteractions {\n\tapp: any\n\tid: string\n\tgenome: string\n\tdslabel: string\n\tprjtRepo: ProjectReposity\n\n\tconstructor(app: any, id: string, prjtRepo: ProjectReposity) {\n\t\tthis.app = app\n\t\tthis.id = id\n\t\tthis.genome = app.vocabApi.vocab.genome\n\t\tthis.dslabel = app.vocabApi.vocab.dslabel\n\t\tthis.prjtRepo = prjtRepo\n\t}\n\n\tasync addProject(opts: { project: any }): Promise<void> {\n\t\tconst config = this.getConfig()\n\t\tconst projectObject = Object.assign({}, config.settings.project, opts.project)\n\n\t\tconst body = {\n\t\t\tgenome: this.genome,\n\t\t\tdslabel: this.dslabel,\n\t\t\tproject: projectObject\n\t\t}\n\t\ttry {\n\t\t\tawait this.prjtRepo.updateProject(body, 'PUT')\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error adding project:', e.message || e)\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync editProject(opts: { project: any }): Promise<void> {\n\t\tconst config = this.getConfig()\n\t\tconst project = Object.assign(\n\t\t\t{},\n\t\t\tconfig.settings.project,\n\t\t\t{\n\t\t\t\ttype: 'edit'\n\t\t\t},\n\t\t\topts.project\n\t\t)\n\n\t\tconst body = {\n\t\t\tgenome: this.genome,\n\t\t\tdslabel: this.dslabel,\n\t\t\tproject\n\t\t}\n\t\ttry {\n\t\t\tconst res = (await this.prjtRepo.updateProject(body, 'POST')) as any\n\t\t\tif (!project.id) project.id = res.projectId\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error editing project:', e.message || e)\n\t\t\tthrow e\n\t\t}\n\t\tawait this.appDispatchEdit({ settings: { project } }, config)\n\t}\n\n\tasync deleteProject(project: { value: string; id: number }): Promise<void> {\n\t\tconst body = {\n\t\t\tgenome: this.genome,\n\t\t\tdslabel: this.dslabel,\n\t\t\tproject: {\n\t\t\t\tname: project.value,\n\t\t\t\tid: project.id\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.prjtRepo.updateProject(body, 'DELETE')\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error deleting project:', e.message || e)\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync getFilteredImages(filter: any): Promise<AIProjectAdminResponse> {\n\t\tconst config = this.getConfig()\n\t\treturn await this.app.vocabApi.getFilteredAiImages(config.settings.project, filter)\n\t}\n\n\tasync launchViewer(holder: any, _images?: string[]): Promise<void> {\n\t\tholder.selectAll('.sjpp-deletable-ai-prjt-admin-div').remove()\n\n\t\tconst config = this.getConfig()\n\t\tlet images: string[] = []\n\n\t\tif (_images && _images.length > 0) {\n\t\t\timages = _images\n\t\t} else {\n\t\t\tconst response: AIProjectAdminResponse = await this.prjtRepo.getImagePaths(\n\t\t\t\tthis.genome,\n\t\t\t\tthis.dslabel,\n\t\t\t\tconfig.settings.project\n\t\t\t)\n\t\t\timages = response.images\n\t\t}\n\n\t\tconst wsiViewer = await import('#plots/wsiviewer/plot.wsi.js')\n\t\twsiViewer.default(this.dslabel, holder, { name: this.genome }, null, config.settings.project.id, images, true)\n\t}\n\n\tpublic async appDispatchEdit(settings: any, config: any = {}): Promise<void> {\n\t\tif (!config?.settings) {\n\t\t\tconfig = this.getConfig()\n\t\t\tif (!config) throw new Error(`No plot with id='${this.id}' found.`)\n\t\t}\n\n\t\tawait this.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: this.id,\n\t\t\tconfig: Object.assign(settings, config.settings)\n\t\t})\n\t}\n\n\tprivate getConfig(): any {\n\t\treturn this.app.getState().plots.find((p: any) => p.id === this.id)\n\t}\n\n\tpublic async exportAnnotations(projectId: number): Promise<void> {\n\t\tconst config = this.getConfig()\n\t\tif (!config || !config.settings) throw new Error(`No plot with id='${this.id}' found.`)\n\n\t\t// fetch annotations for the entire project (server endpoint will expand ['all'] to all images)\n\t\tlet annotations: any[] = []\n\t\ttry {\n\t\t\tannotations = await this.prjtRepo.getAnnotations(this.genome, this.dslabel, projectId)\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error fetching annotations for export:', e?.message || e)\n\t\t\tthrow e\n\t\t}\n\n\t\t// Always produce CSV\n\t\tconst mime = 'text/csv;charset=utf-8;'\n\t\tlet content: string\n\n\t\tif (!Array.isArray(annotations) || annotations.length === 0) {\n\t\t\tcontent = ''\n\t\t} else {\n\t\t\t// use shared CSV builder; let it pick per-annotation filename (a.filename || a.image)\n\t\t\tcontent = buildAnnotationsCsv(annotations as any[])\n\t\t}\n\n\t\t// build a safe filename for download: prefer project name, fallback to projectId\n\t\tconst rawName =\n\t\t\tconfig.settings && config.settings.project && config.settings.project.name\n\t\t\t\t? String(config.settings.project.name)\n\t\t\t\t: `project-${projectId}`\n\t\tconst safeName = rawName.replace(/[^a-z0-9_.-]/gi, '_').slice(0, 200)\n\t\tconst filename = `${safeName}-annotations.csv`\n\n\t\ttry {\n\t\t\tconst blob = new Blob([content], { type: mime })\n\t\t\tconst url = URL.createObjectURL(blob)\n\t\t\tconst a = document.createElement('a')\n\t\t\ta.href = url\n\t\t\ta.download = filename\n\t\t\tdocument.body.appendChild(a)\n\t\t\ta.click()\n\t\t\ta.remove()\n\t\t\tsetTimeout(() => URL.revokeObjectURL(url), 1000)\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error creating annotation download:', e?.message || e)\n\t\t\tthrow e\n\t\t}\n\t}\n}\n", "import { renderTable } from '#dom'\nimport { getColors } from '#shared/common.js'\nimport { rgb } from 'd3-color'\nimport type { TableColumn, TableRow } from '#dom'\nimport type { Elem } from '../../../types/d3'\n\nexport class ClassesTableRender {\n\tdom: {\n\t\tholder: Elem\n\t\ttableDiv: Elem\n\t\tbtnDiv: Elem\n\t}\n\tcolumns: TableColumn[]\n\trows: TableRow[]\n\t/** table.ts updates this.rows and cell values in editCallback\n\t * Save a copy to check for duplicates when editing class names.*/\n\trowsCopy: TableRow[]\n\n\tconstructor(holder: any, rows?: TableRow[]) {\n\t\tthis.dom = {\n\t\t\tholder,\n\t\t\ttableDiv: holder.append('div'),\n\t\t\tbtnDiv: holder.append('div')\n\t\t}\n\t\tthis.columns = [\n\t\t\t{ label: '' }, // Empty for the delete icon\n\t\t\t{\n\t\t\t\tlabel: 'NAME',\n\t\t\t\teditCallback: (rowIdx, cell) => {\n\t\t\t\t\tconst newValue = (cell.value as string).trim()\n\t\t\t\t\tconst foundSameName = this.rows.some((r, i) => newValue === (r[1].value as string).trim() && i !== rowIdx)\n\t\t\t\t\tif (foundSameName) {\n\t\t\t\t\t\talert(`Class name '${newValue}' already exists`)\n\t\t\t\t\t\t/** Reset to original value\n\t\t\t\t\t\t * renderTable() updates arg.rows and cell value before this callback.\n\t\t\t\t\t\t * This resets the value to the original value */\n\t\t\t\t\t\tcell.value = this.rowsCopy[rowIdx][1].value\n\t\t\t\t\t\tcell.__td.text(this.rowsCopy[rowIdx][1].value)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tthis.rowsCopy = this.rows.map(r => r.map(c => ({ ...c })))\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ label: 'COLOR' }\n\t\t]\n\t\tconst colorScale = getColors(5)\n\t\tthis.rows = rows || this.setDefaultClasses(colorScale)\n\t\tthis.rowsCopy = []\n\n\t\tthis.renderTable()\n\t\tthis.renderAddClassBtn(colorScale)\n\t}\n\n\trenderTable() {\n\t\tthis.dom.tableDiv.select('table').remove()\n\t\tif (!this.rows || this.rows.length === 0) return\n\n\t\t// Deep copy to avoid reference issues\n\t\t// Regenerate on every render\n\t\tthis.rowsCopy = this.rows.map(r => r.map(c => ({ ...c })))\n\n\t\trenderTable({\n\t\t\tdiv: this.dom.tableDiv,\n\t\t\tcolumns: this.columns,\n\t\t\trows: this.rows,\n\t\t\tstriped: false,\n\t\t\tshowLines: false,\n\t\t\tsingleMode: false,\n\t\t\tresize: true\n\t\t})\n\n\t\t//editCallback only works with changing the value of the cell\n\t\tfor (const [i, row] of this.rows.entries()) {\n\t\t\tconst deleteBtn = row[0].__td.select('.sja_menuoption')\n\t\t\tdeleteBtn.on('click', () => {\n\t\t\t\tthis.rows.splice(i, 1)\n\t\t\t\tthis.renderTable()\n\t\t\t})\n\t\t}\n\t}\n\n\tsetDefaultClasses(colorScale) {\n\t\t//TODO default classes from dataset\n\t\tconst rows: TableRow[] = []\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tthis.getNewClass(colorScale, rows)\n\t\t}\n\n\t\treturn rows\n\t}\n\n\tgetNewClass(colorScale: any, rows: TableRow[]) {\n\t\tconst getName = (i: number) => `New class ${i}`\n\n\t\tlet i = 1\n\t\tlet found = true\n\t\twhile (found) {\n\t\t\tconst checkName = getName(i)\n\t\t\tfound = rows.some(r => r[1].value == checkName)\n\t\t\tif (found) i++\n\t\t}\n\n\t\trows.push([\n\t\t\t{ html: `<div class=\"sja_menuoption\">×<div>` },\n\t\t\t{ value: getName(i) },\n\t\t\t{ color: rgb(colorScale(`${i}`)).formatHex() }\n\t\t])\n\t}\n\n\trenderAddClassBtn(colorScale: any) {\n\t\tthis.dom.btnDiv\n\t\t\t.append('div')\n\t\t\t.text('Add Class')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin', '10px 0px 0px 0px')\n\t\t\t.on('click', () => {\n\t\t\t\tif (this.rows.length >= 9) {\n\t\t\t\t\talert('Maximum number of classes reached.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthis.getNewClass(colorScale, this.rows)\n\t\t\t\tthis.renderTable()\n\t\t\t})\n\t}\n}\n", "import { renderTable } from '#dom'\nimport type { AIProjectAdminInteractions } from '../interactions/AIProjectAdminInteractions'\nimport type { Elem, Div } from '../../../types/d3'\n\nexport class SelectorTableRender {\n\tdom: {\n\t\tholder: Elem\n\t\ttableDiv: Div | Elem\n\t\tbtnDiv: Div | Elem\n\t}\n\timages: { rows: any[]; cols: any[] } = { rows: [], cols: [] }\n\tinteractions: AIProjectAdminInteractions\n\tselectedRows: Set<number> = new Set<number>()\n\tsortedIndexMap: number[] = []\n\n\tconstructor(holder: Elem, interactions: AIProjectAdminInteractions, images: any) {\n\t\tthis.dom = {\n\t\t\tholder,\n\t\t\ttableDiv: holder\n\t\t\t\t.append('div')\n\t\t\t\t.attr('class', '.sjpp-deletable-ai-prjt-admin-div')\n\t\t\t\t.attr('id', 'sjpp-selector-table')\n\t\t\t\t.style('padding', '10px 0'),\n\t\t\tbtnDiv: holder.append('div').attr('class', '.sjpp-deletable-ai-prjt-admin-div').attr('id', 'sjpp-selector-btns')\n\t\t}\n\n\t\tthis.images = images\n\n\t\tthis.interactions = interactions\n\n\t\t// Collect selectedImages from any known location\n\t\tconst selectedList: string[] = images?.selectedImages as string[]\n\n\t\t// Normalize image helper: strip .svs and lowercase for robust comparison\n\t\tconst normalizeImageName = (s: any) =>\n\t\t\tString(s ?? '')\n\t\t\t\t.replace(/\\.svs$/i, '')\n\t\t\t\t.toLowerCase()\n\n\t\tconst selectedSet = new Set((selectedList || []).map(normalizeImageName))\n\n\t\t// Build set of selected row indices whose image (assumed in first column value) is in selectedSet\n\t\tthis.selectedRows = new Set<number>()\n\t\t;(this.images?.rows ?? []).forEach((row: any, i: number) => {\n\t\t\tconst candidate = row?.[0]?.value\n\t\t\tconst n = normalizeImageName(candidate)\n\t\t\tif (selectedSet.has(n)) this.selectedRows.add(i)\n\t\t})\n\n\t\tthis.render()\n\t}\n\n\tprivate render() {\n\t\tconst columns = this.images.cols.map(c => ({ ...c, sortable: true })) || []\n\n\t\t// If columns missing, show a friendly message instead of throwing\n\t\tif (!columns.length) {\n\t\t\tthis.dom.tableDiv.append('div').text('Missing columns data').style('color', 'red')\n\t\t\t// still render Apply button (disabled) so user can continue\n\t\t\tthis.renderApplyBtn(/*disable=*/ true)\n\t\t\treturn\n\t\t}\n\n\t\t// Build mapping of rows with original indices and selection flags\n\t\tconst rows = (this.images?.rows ?? []) as any[]\n\t\tconst mapped = rows.map((row, origIdx) => ({\n\t\t\trow,\n\t\t\torigIdx,\n\t\t\tselected: this.selectedRows.has(origIdx)\n\t\t}))\n\n\t\t// Sort so selected rows come first, stable by original index\n\t\tmapped.sort((a, b) => {\n\t\t\tconst selDiff = Number(b.selected) - Number(a.selected)\n\t\t\treturn selDiff || a.origIdx - b.origIdx\n\t\t})\n\n\t\t// Prepare sorted rows and a map from sorted index -> original index\n\t\tconst rowsSorted = mapped.map(m => m.row)\n\t\tthis.sortedIndexMap = mapped.map(m => m.origIdx)\n\n\t\t// Selected indices must be in terms of the sorted array for the renderer\n\t\tconst selectedRowsForRender = mapped.reduce<number[]>((acc, m, idx) => {\n\t\t\tif (m.selected) acc.push(idx)\n\t\t\treturn acc\n\t\t}, [])\n\n\t\trenderTable({\n\t\t\tdiv: this.dom.tableDiv,\n\t\t\tcolumns,\n\t\t\trows: rowsSorted,\n\t\t\tselectedRows: selectedRowsForRender,\n\t\t\tstriped: true,\n\t\t\theader: { allowSort: true },\n\t\t\tnoButtonCallback: (sortedIdx, node) => {\n\t\t\t\t// map back to original index when toggling selection\n\t\t\t\tconst orig = this.sortedIndexMap?.[sortedIdx]\n\t\t\t\tif (orig === undefined) return\n\t\t\t\tif (node.checked) {\n\t\t\t\t\tthis.selectedRows.add(orig)\n\t\t\t\t} else {\n\t\t\t\t\tthis.selectedRows.delete(orig)\n\t\t\t\t}\n\t\t\t\t// Re-render so selected rows move to the top immediately\n\t\t\t\t;(this.dom.tableDiv as any).selectAll('*').remove()\n\t\t\t\tthis.render()\n\t\t\t}\n\t\t})\n\n\t\tthis.renderApplyBtn(/*disable=*/ false)\n\t}\n\n\tprivate renderApplyBtn(disable = false) {\n\t\tconst btn = this.dom.btnDiv\n\t\t\t.append('div')\n\t\t\t.text('Apply')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'block')\n\t\t\t.style('width', 'fit-content')\n\t\t\t.style('margin-left', '5vw')\n\n\t\tif (disable) btn.attr('disabled', true)\n\n\t\tbtn.on('click', async () => {\n\t\t\tif (!this.selectedRows.size) {\n\t\t\t\talert(`No rows selected. Please select some rows.`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\t//Don't allow multiple clicks\n\t\t\tbtn.attr('disabled', true)\n\n\t\t\tconst images = Array.from(this.selectedRows).map(i => `${this.images.rows[i][0].value}.svs`)\n\t\t\tawait this.interactions.editProject({\n\t\t\t\tproject: {\n\t\t\t\t\timages\n\t\t\t\t}\n\t\t\t})\n\t\t\t;(this.dom.holder as any).selectAll('*').remove()\n\t\t\tawait this.interactions.launchViewer(this.dom.holder, images)\n\t\t})\n\t}\n}\n", "import { renderTable, sayerror } from '#dom'\n\nexport class UsersRender {\n\tdom: any\n\tusers: string[]\n\n\tconstructor(dom: any, users: string[] = []) {\n\t\tthis.dom = dom\n\t\tthis.users = users.slice()\n\t}\n\n\trender() {\n\t\t// TODO remove this if check after sso is enabled\n\t\tif (this.users.length > 0) {\n\t\t\t// container\n\t\t\tconst container = this.dom.holder\n\t\t\t\t.append('div')\n\t\t\t\t.attr('id', 'sjpp-users-render')\n\t\t\t\t.attr('class', 'sjpp-deletable-ai-prjt-admin-div')\n\t\t\t\t.style('padding', '10px')\n\n\t\t\tconst inputRow = container.append('div').attr('class', 'sjpp-users-input-row').style('margin-bottom', '10px')\n\n\t\t\tconst input = inputRow\n\t\t\t\t.append('input')\n\t\t\t\t.attr('type', 'text')\n\t\t\t\t.attr('placeholder', 'user@example.com')\n\t\t\t\t.attr('id', 'sjpp-user-email-input')\n\t\t\t\t.style('margin-right', '8px')\n\t\t\t\t.style('width', '300px')\n\n\t\t\tconst addBtn = inputRow\n\t\t\t\t.append('div')\n\t\t\t\t.text('Add')\n\t\t\t\t.classed('sja_menuoption', true)\n\t\t\t\t.style('display', 'inline-block')\n\t\t\t\t.property('disabled', true)\n\t\t\t\t.on('click', () => {\n\t\t\t\t\tconst email = input.property('value').trim()\n\t\t\t\t\tconst showError = (msg: string) => {\n\t\t\t\t\t\tsayerror(this.dom.errorDiv, msg)\n\t\t\t\t\t\t// clear after 3s\n\t\t\t\t\t\tsetTimeout(() => this.dom.errorDiv.selectAll('*').remove(), 3000)\n\t\t\t\t\t}\n\n\t\t\t\t\tif (email.length === 0) {\n\t\t\t\t\t\treturn showError('Email cannot be empty')\n\t\t\t\t\t}\n\n\t\t\t\t\tconst emailRe = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$/\n\n\t\t\t\t\tif (!emailRe.test(email)) {\n\t\t\t\t\t\treturn showError('Invalid email address')\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this.users.includes(email)) {\n\t\t\t\t\t\treturn showError('Email already added')\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.users.push(email)\n\t\t\t\t\tinput.property('value', '')\n\t\t\t\t\taddBtn.property('disabled', true)\n\t\t\t\t\tthis.renderTableArea(container)\n\t\t\t\t})\n\n\t\t\tinput.on('input', () => {\n\t\t\t\taddBtn.property('disabled', input.property('value').trim().length === 0)\n\t\t\t})\n\n\t\t\tthis.renderTableArea(container)\n\t\t}\n\t}\n\n\tprivate renderTableArea(container: any) {\n\t\tcontainer.select('.sjpp-users-table-area').remove()\n\n\t\tconst tableDiv = container.append('div').attr('class', 'sjpp-users-table-area').style('padding', '6px 0')\n\n\t\tif (!this.users.length) {\n\t\t\ttableDiv.append('div').text('No users added yet.').style('color', '#666')\n\t\t\treturn\n\t\t}\n\n\t\tconst columns = [{ label: 'Email', sortable: true }]\n\n\t\tconst columnButtons = [\n\t\t\t{\n\t\t\t\ttext: '\u00D7',\n\t\t\t\tclass: 'sja_menuoption',\n\t\t\t\tcallback: (_, idx: number) => {\n\t\t\t\t\t// remove user and re-render\n\t\t\t\t\tthis.users.splice(idx, 1)\n\t\t\t\t\t// clear and re-render table area\n\t\t\t\t\tcontainer.select('.sjpp-users-table-area').remove()\n\t\t\t\t\tthis.renderTableArea(container)\n\t\t\t\t}\n\t\t\t}\n\t\t]\n\n\t\trenderTable({\n\t\t\tdiv: tableDiv,\n\t\t\trows: this.users.map(u => [{ value: u }]),\n\t\t\tcolumns,\n\t\t\tcolumnButtons,\n\t\t\tsingleMode: false,\n\t\t\tstriped: false,\n\t\t\tshowLines: false,\n\t\t\tresize: true\n\t\t})\n\t\ttableDiv.selectAll('.sja_menuoption').html('\u00D7<div></div>')\n\t}\n}\n", "import { filterInit, getNormalRoot } from '#filter'\nimport { ClassesTableRender } from './ClassesTableRender'\nimport type { Elem } from '../../../types/d3'\nimport type { AIProjectAdminInteractions } from '../interactions/AIProjectAdminInteractions'\nimport { SelectorTableRender } from './SelectorTableRender'\nimport { UsersRender } from './UsersRender'\nimport type { AIProjectAdminResponse } from '@sjcrh/proteinpaint-types'\n\nexport class CreateProjectRender {\n\tdom: {\n\t\tholder: Elem\n\t\terrorDiv: Elem\n\t\tfilterDiv: Elem\n\t\tclassDiv: Elem\n\t\tusersDiv?: Elem\n\t}\n\tapp: any\n\tinteractions: AIProjectAdminInteractions\n\tfilter: any\n\tclassesTable?: ClassesTableRender\n\tusersRender?: UsersRender\n\n\tconstructor(dom: any, app: any, interactions: AIProjectAdminInteractions) {\n\t\tdom.holder.style('padding', '10px 20px').attr('class', 'sjpp-deletable-ai-prjt-admin-div')\n\n\t\tconst filterDiv = dom.holder.append('div').attr('id', 'sjpp-ai-prjt-admin-filter-div')\n\n\t\tconst wrapper = dom.holder\n\t\t\t.append('div')\n\t\t\t.attr('id', 'sjpp-ai-prjt-admin-classes-users-wrapper')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('gap', '20px')\n\t\t\t.style('align-items', 'flex-start')\n\t\t\t.style('padding', '20px 0px')\n\n\t\tconst left = wrapper.append('div').attr('id', 'sjpp-ai-prjt-admin-classes-table').style('flex', '0 1 auto')\n\n\t\tconst right = wrapper\n\t\t\t.append('div')\n\t\t\t.attr('id', 'sjpp-ai-prjt-admin-users')\n\t\t\t.style('width', '320px')\n\t\t\t.style('margin-left', '8px')\n\n\t\tthis.dom = {\n\t\t\tholder: dom.holder,\n\t\t\terrorDiv: dom.errorDiv,\n\t\t\tfilterDiv: filterDiv,\n\t\t\tclassDiv: left,\n\t\t\tusersDiv: right\n\t\t}\n\n\t\tthis.app = app\n\t\tthis.interactions = interactions\n\t\tthis.filter = null\n\t}\n\n\trender() {\n\t\tthis.renderFilter()\n\t\tthis.classesTable = new ClassesTableRender(this.dom.classDiv)\n\n\t\tthis.usersRender = new UsersRender({ holder: this.dom.usersDiv, errorDiv: this.dom.errorDiv }, [])\n\t\tthis.usersRender.render()\n\n\t\tthis.renderApplyBtn()\n\t}\n\n\tprivate renderFilter() {\n\t\tconst filter = filterInit({\n\t\t\tholder: this.dom.filterDiv,\n\t\t\temptyLabel: 'Add filter',\n\t\t\tvocabApi: this.app.vocabApi,\n\t\t\ttermdbConfig: this.app.vocabApi.termdbConfig,\n\t\t\tcallback: filter => {\n\t\t\t\tthis.filter = filter\n\t\t\t}\n\t\t})\n\n\t\tconst state = this.app.getState()\n\t\tconst root = getNormalRoot(state.termfilter.filter)\n\t\tfilter.main(root)\n\t}\n\n\tprivate renderApplyBtn() {\n\t\tconst btn = this.dom.classDiv\n\t\t\t.append('div')\n\t\t\t.text('Apply')\n\t\t\t.classed('sja_menuoption', true)\n\t\t\t.style('display', 'inline-block')\n\t\t\t.style('margin-left', '200px')\n\t\t\t.on('click', async () => {\n\t\t\t\t/**** Uncomment before production */\n\n\t\t\t\t// const invalidInfo = this.validateInput()\n\t\t\t\t// const numInvalid = invalidInfo.entries?.length\n\t\t\t\t// if (numInvalid) {\n\t\t\t\t// \t/** TODO: allow user to ignore filter error on second click */\n\t\t\t\t// \tif (numInvalid === 1) sayerror(this.dom.errorDiv, invalidInfo.entries[0].reason)\n\t\t\t\t// else InvalidDataUI.render(this.dom.errorDiv, invalidInfo)\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\t\t\t\tbtn.attr('disabled', true) //Don't allow multiple clicks\n\n\t\t\t\tconst selections: AIProjectAdminResponse = await this.interactions.getFilteredImages(this.filter)\n\t\t\t\tif (this.filter && (selections.status != 'ok' || selections.data?.length === 0)) {\n\t\t\t\t\talert('No images match your filter criteria.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// TODO: Enable user assignment after SSO is ready\n\t\t\t\t// if (!this.usersRender || !Array.isArray(this.usersRender.users) || this.usersRender.users.length === 0) {\n\t\t\t\t// \talert('Please add at least one user.')\n\t\t\t\t// \tbtn.attr('disabled', null)\n\t\t\t\t// \treturn\n\t\t\t\t// }\n\n\t\t\t\tawait this.interactions.addProject({\n\t\t\t\t\tproject: {\n\t\t\t\t\t\tfilter: this.filter,\n\t\t\t\t\t\tclasses: this.classesTable!.rows.map((row, i) => {\n\t\t\t\t\t\t\treturn { label: row[1].value, color: row[2].color, key_shortcut: `Digit${i + 1}` }\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tusers: this.usersRender?.users || []\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tthis.dom.holder.selectAll('*').remove()\n\t\t\t\tnew SelectorTableRender(this.dom.holder, this.interactions, selections.data)\n\t\t\t})\n\t}\n\n\t/**** Uncomment before production */\n\t// private validateInput() {\n\t// \tconst invalidInfo = {\n\t// \t\tentries: [] as { dataType: string; reason: string }[],\n\t// \t\terrorMsg: 'Please clear all \"Data type: Class\" errors before applying changes.'\n\t// \t}\n\n\t// \t//Show user error if no filter is defined.\n\t// \tif (!this.filter) {\n\t// \t\tinvalidInfo.entries.push({ dataType: 'Filter', reason: 'No filter defined. Did you mean to add a filter?' })\n\t// \t}\n\t// \t//Check if all classes were deleted\n\t// \tconst classes = this.classesTable?.rows.map(row => row[1].value) || []\n\t// \tif (classes.length === 0) {\n\t// \t\tinvalidInfo.entries.push({ dataType: 'Class', reason: 'No classes defined. Did you mean to add a class?' })\n\t// \t}\n\t// \t//Check to see if any class is still a default class\n\t// \tconst unchangedClasses =\n\t// \t\tthis.classesTable?.rows\n\t// \t\t\t.filter(row => (row[1]?.value as string)?.startsWith('New class'))\n\t// \t\t\t.map(r => r[1]?.value as string) || []\n\t// \tfor (const c of unchangedClasses) {\n\t// \t\tinvalidInfo.entries.push({ dataType: 'Class', reason: `${c} is the default class name. Please rename.` })\n\t// \t}\n\n\t// \treturn invalidInfo\n\t// }\n}\n", "import { getCompInit, copyMerge, type RxComponent } from '#rx'\nimport { PlotBase } from '../PlotBase'\nimport type { MassState } from '#mass/types/mass'\nimport { getDefaultAIProjectAdminSettings } from './defaults'\nimport { ProjectReposity } from './repo/ProjectReposity'\nimport { ProjectAdminRender } from './view/ProjectAdminRender'\nimport { AIProjectAdminInteractions } from './interactions/AIProjectAdminInteractions'\nimport { CreateProjectRender } from './view/CreateProjectRender'\nimport { sayerror } from '#dom'\n\n/** This plot supports training AI models.\n * The UI allows users to create and manage projects. */\n\nclass AIProjectAdmin extends PlotBase implements RxComponent {\n\tstatic type = 'AIProjectAdmin'\n\tpublic type = 'AIProjectAdmin'\n\tprjtRepo: ProjectReposity\n\tprojects?: any[]\n\tprjtAdminUI?: ProjectAdminRender\n\tinteractions?: AIProjectAdminInteractions\n\n\tdom!: {\n\t\t[name: string]: any\n\t}\n\n\tconstructor(opts: any, api) {\n\t\tsuper(opts, api)\n\t\tthis.opts = opts\n\t\tthis.dom = {\n\t\t\tholder: opts.holder,\n\t\t\terrorDiv: opts.holder.append('div').style('margin', '3px').attr('class', 'sjpp-ai-prjt-admin-error')\n\t\t}\n\t\tif (opts.header) this.dom.header = opts.header\n\n\t\tthis.prjtRepo = new ProjectReposity()\n\t}\n\n\tgetState(appState: MassState) {\n\t\tconst config = appState.plots.find((p: any) => 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\treturn {\n\t\t\tconfig,\n\t\t\tvocab: appState.vocab,\n\t\t\tfilter: appState.termfilter.filter\n\t\t}\n\t}\n\n\tasync init(appState: MassState) {\n\t\tthis.interactions = new AIProjectAdminInteractions(this.app, this.id, this.prjtRepo)\n\n\t\ttry {\n\t\t\tthis.projects = await this.prjtRepo.getProjects(appState.vocab.genome, appState.vocab.dslabel)\n\t\t} catch (e: any) {\n\t\t\tconsole.error('Error initializing AIProjectAdmin:', e)\n\t\t\tthrow e\n\t\t}\n\t\tthis.prjtAdminUI = new ProjectAdminRender(this.dom, this.projects, this.interactions)\n\t\tthis.prjtAdminUI.renderProjectAdmin()\n\t}\n\n\tasync main() {\n\t\tconst state = structuredClone(this.state)\n\t\tconst config = state.config\n\t\tif (config.chartType != this.type) return\n\t\tconst project = config.settings.project\n\t\tif (!project) return\n\n\t\tif (!this.interactions) throw new Error('AIProjectAdminInteractions not initialized')\n\n\t\tthis.dom.holder.selectAll('.sjpp-deletable-ai-prjt-admin-div').remove()\n\n\t\tif (project.type === 'new') {\n\t\t\tconst terms = await this.prjtRepo.getTerms(this.app)\n\t\t\tif (!terms || terms.length === 0) {\n\t\t\t\tsayerror(this.dom.errorDiv, 'No metadata found.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst createProjectRender = new CreateProjectRender(this.dom, this.app, this.interactions)\n\t\t\tcreateProjectRender.render()\n\t\t}\n\n\t\t//launching project from embedded runpp()\n\t\tif (project.type == 'existing') {\n\t\t\tif (!project.name) {\n\t\t\t\tsayerror(this.dom.errorDiv, 'Project name not provided.')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!project.id) {\n\t\t\t\tconst existingProject = this.projects?.find(p => p.name === project.name)\n\t\t\t\tif (!existingProject) {\n\t\t\t\t\tsayerror(this.dom.errorDiv, `Project ${project.name} not found.`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t//No need to call dispatch. Save to the state and call the wsi viewer.\n\t\t\t\tawait this.app.save({\n\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\tid: this.id,\n\t\t\t\t\tconfig: { settings: { project: { id: existingProject.id } } }\n\t\t\t\t})\n\t\t\t}\n\t\t\tawait this.interactions.launchViewer(this.dom.holder, [])\n\t\t}\n\t}\n}\n\nexport const aiProjectAdminInit = getCompInit(AIProjectAdmin)\nexport const componentInit = aiProjectAdminInit\n\nexport async function getPlotConfig(opts: any) {\n\tconst config = {\n\t\tchartType: 'AIProjectAdmin',\n\t\tsubfolder: 'aiProjectAdmin',\n\t\textension: 'ts',\n\t\thidePlotFilter: true, //Disable the filter in the sandbox header\n\t\tsettings: getDefaultAIProjectAdminSettings(opts.overrides)\n\t}\n\tif (opts.settings?.project && !opts.settings?.project?.type) {\n\t\t//If passing project from embedded runpp(), force type\n\t\topts.settings.project.type = 'existing'\n\t}\n\treturn copyMerge(config, opts)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["_", "i", "filter"]
|
|
7
7
|
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
makeButton,
|
|
3
3
|
openSandbox
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-DNZHE7FP.js";
|
|
5
5
|
import {
|
|
6
6
|
get_tklst
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-CAJJV4K2.js";
|
|
8
|
+
import "./chunk-JFQM7LYS.js";
|
|
9
|
+
import "./chunk-VCWFNXJ6.js";
|
|
10
10
|
import {
|
|
11
11
|
block_init_default
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-4JEN2Y3T.js";
|
|
13
13
|
import "./chunk-MKAF2BHB.js";
|
|
14
14
|
import {
|
|
15
15
|
urlmap_default
|
|
16
16
|
} from "./chunk-RS3G3HE7.js";
|
|
17
|
-
import "./chunk-
|
|
17
|
+
import "./chunk-RDMXKGKH.js";
|
|
18
18
|
import "./chunk-PRZWSBMA.js";
|
|
19
19
|
import {
|
|
20
20
|
InputSearch,
|
|
@@ -22,15 +22,15 @@ import {
|
|
|
22
22
|
newSandboxDiv,
|
|
23
23
|
sayerror,
|
|
24
24
|
throwMsgWithFilePathAndFnName
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-FLJ2GUHL.js";
|
|
26
26
|
import {
|
|
27
27
|
string2pos
|
|
28
28
|
} from "./chunk-HJ6L54YS.js";
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
29
|
+
import "./chunk-FSGEVTVI.js";
|
|
30
|
+
import "./chunk-QSSTMH7C.js";
|
|
31
31
|
import {
|
|
32
32
|
dofetch3
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-TR6EV3FG.js";
|
|
34
34
|
import "./chunk-3JH6BKPD.js";
|
|
35
35
|
import {
|
|
36
36
|
defaultcolor
|
|
@@ -38,7 +38,7 @@ import {
|
|
|
38
38
|
import "./chunk-IQIXGTQV.js";
|
|
39
39
|
import "./chunk-ITJ2SXU5.js";
|
|
40
40
|
import "./chunk-FN5XPUPH.js";
|
|
41
|
-
import "./chunk-
|
|
41
|
+
import "./chunk-MYBLQGD6.js";
|
|
42
42
|
import "./chunk-6LZYWV4K.js";
|
|
43
43
|
import {
|
|
44
44
|
getAppInit,
|
|
@@ -46,8 +46,7 @@ import {
|
|
|
46
46
|
getInitFxn,
|
|
47
47
|
getStoreInit
|
|
48
48
|
} from "./chunk-FIZCTRIV.js";
|
|
49
|
-
import "./chunk-
|
|
50
|
-
import "./chunk-DQC5FFGV.js";
|
|
49
|
+
import "./chunk-TPK3G44P.js";
|
|
51
50
|
import "./chunk-LD45BCVM.js";
|
|
52
51
|
import "./chunk-RA5EXEHB.js";
|
|
53
52
|
import "./chunk-2MN5JLZB.js";
|
|
@@ -62,6 +61,7 @@ import {
|
|
|
62
61
|
import {
|
|
63
62
|
select_default
|
|
64
63
|
} from "./chunk-NDWTN4U5.js";
|
|
64
|
+
import "./chunk-DQC5FFGV.js";
|
|
65
65
|
import "./chunk-HFNDKYVF.js";
|
|
66
66
|
|
|
67
67
|
// src/header/omniSearch.js
|
|
@@ -215,7 +215,7 @@ async function findgene2paint(str, app, genomename, jwt) {
|
|
|
215
215
|
debugmode: app.debugmode
|
|
216
216
|
};
|
|
217
217
|
first_genetrack_tolist(g, par2.tklst);
|
|
218
|
-
import("./block-
|
|
218
|
+
import("./block-HARZTSBZ.js").then((b) => new b.Block(par2)).catch((err) => {
|
|
219
219
|
app.error0(err);
|
|
220
220
|
});
|
|
221
221
|
return;
|
|
@@ -801,7 +801,7 @@ var AppHeader = class _AppHeader {
|
|
|
801
801
|
debugmode: app.debugmode
|
|
802
802
|
};
|
|
803
803
|
first_genetrack_tolist(g, par.tklst);
|
|
804
|
-
import("./block-
|
|
804
|
+
import("./block-HARZTSBZ.js").then((b) => new b.Block(par));
|
|
805
805
|
app.drawer.dispatch({ type: "is_apps_btn_active", value: false });
|
|
806
806
|
});
|
|
807
807
|
return g_browser_btn;
|
|
@@ -814,4 +814,4 @@ var AppHeader = class _AppHeader {
|
|
|
814
814
|
export {
|
|
815
815
|
AppHeader
|
|
816
816
|
};
|
|
817
|
-
//# sourceMappingURL=AppHeader-
|
|
817
|
+
//# sourceMappingURL=AppHeader-7JYXB4DY.js.map
|
|
@@ -17,13 +17,13 @@ import {
|
|
|
17
17
|
renderTable,
|
|
18
18
|
renderTerm1Label,
|
|
19
19
|
term0_term2_defaultQ
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-FLJ2GUHL.js";
|
|
21
21
|
import "./chunk-HJ6L54YS.js";
|
|
22
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-FSGEVTVI.js";
|
|
23
23
|
import {
|
|
24
24
|
Menu
|
|
25
|
-
} from "./chunk-
|
|
26
|
-
import "./chunk-
|
|
25
|
+
} from "./chunk-QSSTMH7C.js";
|
|
26
|
+
import "./chunk-TR6EV3FG.js";
|
|
27
27
|
import {
|
|
28
28
|
isNumericTerm
|
|
29
29
|
} from "./chunk-3JH6BKPD.js";
|
|
@@ -31,14 +31,13 @@ import "./chunk-6RC5V24O.js";
|
|
|
31
31
|
import "./chunk-IQIXGTQV.js";
|
|
32
32
|
import "./chunk-ITJ2SXU5.js";
|
|
33
33
|
import "./chunk-FN5XPUPH.js";
|
|
34
|
-
import "./chunk-
|
|
34
|
+
import "./chunk-MYBLQGD6.js";
|
|
35
35
|
import "./chunk-6LZYWV4K.js";
|
|
36
36
|
import {
|
|
37
37
|
copyMerge,
|
|
38
38
|
getCompInit
|
|
39
39
|
} from "./chunk-FIZCTRIV.js";
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-DQC5FFGV.js";
|
|
40
|
+
import "./chunk-TPK3G44P.js";
|
|
42
41
|
import "./chunk-LD45BCVM.js";
|
|
43
42
|
import "./chunk-RA5EXEHB.js";
|
|
44
43
|
import "./chunk-2MN5JLZB.js";
|
|
@@ -62,6 +61,7 @@ import {
|
|
|
62
61
|
import {
|
|
63
62
|
select_default
|
|
64
63
|
} from "./chunk-NDWTN4U5.js";
|
|
64
|
+
import "./chunk-DQC5FFGV.js";
|
|
65
65
|
import "./chunk-HFNDKYVF.js";
|
|
66
66
|
|
|
67
67
|
// plots/boxplot/model/Model.ts
|
|
@@ -1165,4 +1165,4 @@ export {
|
|
|
1165
1165
|
componentInit,
|
|
1166
1166
|
getPlotConfig
|
|
1167
1167
|
};
|
|
1168
|
-
//# sourceMappingURL=BoxPlot-
|
|
1168
|
+
//# sourceMappingURL=BoxPlot-RFW4FE7T.js.map
|