@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.
Files changed (555) hide show
  1. package/dist/{2dmaf-TRTL5RIT.js → 2dmaf-NULVBOXA.js} +8 -8
  2. package/dist/{AIProjectAdmin-YQEZDLTR.js → AIProjectAdmin-CFBJXRDX.js} +71 -26
  3. package/dist/{AIProjectAdmin-YQEZDLTR.js.map → AIProjectAdmin-CFBJXRDX.js.map} +2 -2
  4. package/dist/{AppHeader-UWDROFOQ.js → AppHeader-7JYXB4DY.js} +16 -16
  5. package/dist/{BoxPlot-6YBOOOMT.js → BoxPlot-RFW4FE7T.js} +8 -8
  6. package/dist/{BoxPlot-6YBOOOMT.js.map → BoxPlot-RFW4FE7T.js.map} +2 -2
  7. package/dist/{CorrelationVolcano-HQVOSKB3.js → CorrelationVolcano-KMBRCL7V.js} +8 -8
  8. package/dist/{DifferentialAnalysis-PYO2CH5P.js → DifferentialAnalysis-QMZAHDUY.js} +10 -10
  9. package/dist/{Disco-D52FVUEO.js → Disco-Y7SGKJ6O.js} +71 -34
  10. package/dist/Disco-Y7SGKJ6O.js.map +7 -0
  11. package/dist/{Disco.UI-IYLN42SN.js → Disco.UI-XV547I36.js} +11 -11
  12. package/dist/{GB-ZAMWKKEW.js → GB-PP6V7Q5Q.js} +10 -10
  13. package/dist/{HicApp-NDWHBLJR.js → HicApp-U3FSL5IQ.js} +10 -10
  14. package/dist/{NumBinaryEditor-ENCJVC3Q.js → NumBinaryEditor-QX6XP55J.js} +8 -8
  15. package/dist/{NumBinaryEditor.unit.spec-27PMZBYI.js → NumBinaryEditor.unit.spec-4WULZW4X.js} +9 -9
  16. package/dist/{NumContEditor-KMZ6TPHX.js → NumContEditor-U6TP4JUK.js} +8 -8
  17. package/dist/{NumContEditor.unit.spec-I4G3X5XV.js → NumContEditor.unit.spec-YV6VJSSF.js} +9 -9
  18. package/dist/{NumCustomBinEditor-YZF67LOQ.js → NumCustomBinEditor-QYGSDTAO.js} +9 -9
  19. package/dist/{NumCustomBinEditor.unit.spec-WC6LQDGJ.js → NumCustomBinEditor.unit.spec-Q6EURCRN.js} +9 -9
  20. package/dist/{NumDiscreteEditor-PRWHOR4D.js → NumDiscreteEditor-S3AIKKVE.js} +12 -12
  21. package/dist/{NumDiscreteEditor.unit.spec-F4RUC5XQ.js → NumDiscreteEditor.unit.spec-X4P2WCWA.js} +9 -9
  22. package/dist/{NumRegularBinEditor-SGJ64KAG.js → NumRegularBinEditor-KEY7EYOZ.js} +9 -9
  23. package/dist/{NumRegularBinEditor.unit.spec-4GGUHTIQ.js → NumRegularBinEditor.unit.spec-P6OZIF67.js} +9 -9
  24. package/dist/{NumSplineEditor-3YD2LY66.js → NumSplineEditor-KLSQQZZM.js} +8 -8
  25. package/dist/{NumSplineEditor.unit.spec-MY5VM6CN.js → NumSplineEditor.unit.spec-D7H4N5YN.js} +9 -9
  26. package/dist/{NumericDensity-FWSZV7TD.js → NumericDensity-JPTAN3DG.js} +8 -8
  27. package/dist/{NumericDensity.unit.spec-MMBSYCHJ.js → NumericDensity.unit.spec-4KZPLVD3.js} +8 -8
  28. package/dist/{NumericHandler-TJVMR232.js → NumericHandler-U2QBQS7T.js} +9 -9
  29. package/dist/{NumericHandler.unit.spec-XEJRRORV.js → NumericHandler.unit.spec-AWMQMBSC.js} +9 -9
  30. package/dist/{SC-GGN7UVLX.js → SC-J3PVK4Q5.js} +8 -8
  31. package/dist/{Volcano-2WPXXICL.js → Volcano-75ZAK5VI.js} +9 -9
  32. package/dist/{WSIViewer-PZW4NQB6.js → WSIViewer-6QJPUMKA.js} +28 -20
  33. package/dist/{WSIViewer-PZW4NQB6.js.map → WSIViewer-6QJPUMKA.js.map} +2 -2
  34. package/dist/{WsiSamplesPlot-25VDFJX3.js → WsiSamplesPlot-ZMV7ILUV.js} +9 -9
  35. package/dist/{adSandbox-CPZBFRYS.js → adSandbox-ORRNN4M7.js} +9 -9
  36. package/dist/{alphaGenome-RI7WM5JR.js → alphaGenome-TLQHWR5H.js} +8 -8
  37. package/dist/{app-KHGVOGCA.js → app-6EHQG2LS.js} +18 -18
  38. package/dist/{app-HQIYQFAQ.js → app-HVS47MKD.js} +8 -8
  39. package/dist/app.js +14 -14
  40. package/dist/{bam-VORHBA6P.js → bam-EXBX3IJY.js} +10 -10
  41. package/dist/{barchart-7A6QUYMI.js → barchart-CCYIYLAK.js} +8 -8
  42. package/dist/{barchart.data-RUKFEDLG.js → barchart.data-V757AO73.js} +8 -8
  43. package/dist/{barchart.events-X5MR77JP.js → barchart.events-MSKITZZN.js} +8 -8
  44. package/dist/{barchart.integration.spec-LKTHIRKC.js → barchart.integration.spec-4NI3OMFT.js} +18 -17
  45. package/dist/{barchart.integration.spec-LKTHIRKC.js.map → barchart.integration.spec-4NI3OMFT.js.map} +2 -2
  46. package/dist/{block-XJNR427G.js → block-HARZTSBZ.js} +29 -29
  47. package/dist/{block.init-K6IYQCVG.js → block.init-5TGIIXLK.js} +9 -9
  48. package/dist/{block.mds.expressionrank-G4YT3ITI.js → block.mds.expressionrank-L6LF5OGC.js} +10 -10
  49. package/dist/{block.mds.geneboxplot-2VFCOY4F.js → block.mds.geneboxplot-2LGE36IG.js} +9 -9
  50. package/dist/{block.mds.junction-3RADQYBR.js → block.mds.junction-GQA3H7WZ.js} +15 -15
  51. package/dist/{block.mds.svcnv-G7UTUOIX.js → block.mds.svcnv-UCR4S2LF.js} +22 -22
  52. package/dist/{block.svg-W2CR4CTT.js → block.svg-OXWF3HSA.js} +8 -8
  53. package/dist/{block.tk.aicheck-W7N2FBKE.js → block.tk.aicheck-SDZPT3PF.js} +8 -8
  54. package/dist/{block.tk.ase-OHVIYASE.js → block.tk.ase-4O5LJPTL.js} +10 -10
  55. package/dist/{block.tk.bam-GYDBKELJ.js → block.tk.bam-LRMNMFCJ.js} +8 -8
  56. package/dist/{block.tk.bedgraphdot-335OUZDX.js → block.tk.bedgraphdot-MBBCR4NC.js} +8 -8
  57. package/dist/{block.tk.bigwig.ui-UEIKD46U.js → block.tk.bigwig.ui-FL5UUQVN.js} +8 -8
  58. package/dist/{block.tk.hicstraw-JQYWZTBW.js → block.tk.hicstraw-KTTJDPGS.js} +9 -9
  59. package/dist/{block.tk.junction-WPGJ7APU.js → block.tk.junction-VMPDXHQR.js} +12 -12
  60. package/dist/{block.tk.junction.textmatrixui-MY4FCKK5.js → block.tk.junction.textmatrixui-6IUZRTGV.js} +9 -9
  61. package/dist/{block.tk.ld-W6S2DEOS.js → block.tk.ld-HN7TITP4.js} +11 -11
  62. package/dist/{block.tk.menu-KI65FAQC.js → block.tk.menu-5S2VJJKZ.js} +8 -8
  63. package/dist/{block.tk.pgv-E5BSB22L.js → block.tk.pgv-KFM6VQEA.js} +11 -11
  64. package/dist/{brainImaging-4NPWW63N.js → brainImaging-LAJPH266.js} +8 -8
  65. package/dist/{chat-IV67D3I3.js → chat-B7MJ6MXM.js} +9 -9
  66. package/dist/{chunk-DQNHLS6Y.js → chunk-34RYIRTD.js} +3 -3
  67. package/dist/{chunk-RERIGX7D.js → chunk-3Q5HK4N4.js} +2 -2
  68. package/dist/{chunk-HD5BRUXL.js → chunk-4JEN2Y3T.js} +5 -5
  69. package/dist/{chunk-MQFFZOYH.js → chunk-5AHDD454.js} +5 -5
  70. package/dist/{chunk-CSMHADZL.js → chunk-5UXFNBWZ.js} +7 -7
  71. package/dist/{chunk-GHI75432.js → chunk-67QJQ4MT.js} +8 -2
  72. package/dist/chunk-67QJQ4MT.js.map +7 -0
  73. package/dist/{chunk-CBH7E4CZ.js → chunk-6XZ4QG2S.js} +3 -3
  74. package/dist/{chunk-UMD43EU7.js → chunk-77OHO7EA.js} +2 -2
  75. package/dist/{chunk-GOSADDSN.js → chunk-7RXIGX5P.js} +12 -12
  76. package/dist/{chunk-NLS7X5LY.js → chunk-AY73FQLU.js} +9 -9
  77. package/dist/{chunk-XNNPS7PL.js → chunk-BH5G6JKX.js} +11 -11
  78. package/dist/{chunk-OKAXAC5U.js → chunk-BTYRXZZL.js} +6 -6
  79. package/dist/{chunk-5K6L3WGS.js → chunk-CAJJV4K2.js} +31 -31
  80. package/dist/{chunk-BUXS26F4.js → chunk-CNW6OLYY.js} +4 -4
  81. package/dist/{chunk-HISAS5OU.js → chunk-CTDY2CMT.js} +2 -2
  82. package/dist/{chunk-B4YNT4QW.js → chunk-CXW25G2T.js} +7 -7
  83. package/dist/{chunk-6IH5W6UC.js → chunk-D3PQH6RE.js} +3 -3
  84. package/dist/{chunk-4XAAGRWA.js → chunk-D6VZESYY.js} +7 -7
  85. package/dist/{chunk-MUCRBG5F.js → chunk-DNZHE7FP.js} +4 -4
  86. package/dist/{chunk-RU7NM2HO.js → chunk-F5BTEQEW.js} +3 -3
  87. package/dist/{chunk-ZJFQ5N4A.js → chunk-F6XCNNS6.js} +5 -5
  88. package/dist/{chunk-WTNMUTHT.js → chunk-FIZ4S7AN.js} +8 -8
  89. package/dist/{chunk-K4LI3NKS.js → chunk-FLJ2GUHL.js} +227 -162
  90. package/dist/chunk-FLJ2GUHL.js.map +7 -0
  91. package/dist/chunk-FSGEVTVI.js +168 -0
  92. package/dist/{chunk-7FCA4KIE.js → chunk-FVTQMCMG.js} +3 -3
  93. package/dist/{chunk-3VA4MJQQ.js → chunk-GSRQZE6V.js} +2 -2
  94. package/dist/{chunk-7575UK54.js → chunk-HHFK426A.js} +2 -2
  95. package/dist/{chunk-JTGDV7NZ.js → chunk-HX2U4DFY.js} +7 -7
  96. package/dist/chunk-HX2U4DFY.js.map +7 -0
  97. package/dist/{chunk-WNBJMVEE.js → chunk-IAMFJMMC.js} +2 -2
  98. package/dist/{chunk-6BV2ZBNU.js → chunk-JFQM7LYS.js} +8 -8
  99. package/dist/{chunk-WIEKWIQY.js → chunk-JINNBHDF.js} +3 -3
  100. package/dist/chunk-JINNBHDF.js.map +7 -0
  101. package/dist/{chunk-T3U2GVSC.js → chunk-KAXBZQW3.js} +3 -3
  102. package/dist/{chunk-TLZJXDZZ.js → chunk-KDVM3AVQ.js} +11 -11
  103. package/dist/chunk-KDVM3AVQ.js.map +7 -0
  104. package/dist/{chunk-4ANV7WKU.js → chunk-KZXEXB3K.js} +2 -2
  105. package/dist/{chunk-BJ2UYDYL.js → chunk-L435EWEI.js} +5 -6
  106. package/dist/chunk-L435EWEI.js.map +7 -0
  107. package/dist/{chunk-52DOAUEG.js → chunk-MUN6WCMX.js} +5 -5
  108. package/dist/{chunk-2WPIXNJD.js → chunk-MYBLQGD6.js} +3 -2
  109. package/dist/{chunk-2WPIXNJD.js.map → chunk-MYBLQGD6.js.map} +2 -2
  110. package/dist/{chunk-EHMNO46L.js → chunk-N7BE3ZF5.js} +2 -2
  111. package/dist/{chunk-EIMOBM5J.js → chunk-NL7WRKHQ.js} +6 -6
  112. package/dist/{chunk-L7YF2J27.js → chunk-NTH4X4ZX.js} +14 -14
  113. package/dist/{chunk-QAC4K4S6.js → chunk-OUKTVVOI.js} +3 -3
  114. package/dist/{chunk-S7FUDZD5.js → chunk-PJEIREMJ.js} +2 -2
  115. package/dist/{chunk-32LUIEDR.js → chunk-PLPYDZS7.js} +11 -16
  116. package/dist/chunk-PLPYDZS7.js.map +7 -0
  117. package/dist/{chunk-VJUB2TUE.js → chunk-PNVVKQJV.js} +2 -2
  118. package/dist/{chunk-DEUI26GX.js → chunk-PO22RN6V.js} +9 -9
  119. package/dist/{chunk-DFBQHO4T.js → chunk-QSSTMH7C.js} +23 -3
  120. package/dist/chunk-QSSTMH7C.js.map +7 -0
  121. package/dist/{chunk-LNKVNRRR.js → chunk-RDMXKGKH.js} +2 -2
  122. package/dist/{chunk-DWE42LXW.js → chunk-RGNJKYXM.js} +2 -2
  123. package/dist/{chunk-7EUKSBAJ.js → chunk-ROY5OATX.js} +5 -5
  124. package/dist/{chunk-PJ376FKI.js → chunk-SEEKAG6E.js} +2 -2
  125. package/dist/{chunk-IJPAGSZN.js → chunk-SPCZQRRQ.js} +5 -5
  126. package/dist/{chunk-JJECYRIX.js → chunk-SZOQJ5NV.js} +6 -6
  127. package/dist/{chunk-F7KC4VGP.js → chunk-TKNO4Y2X.js} +2 -2
  128. package/dist/{chunk-NCT2SONQ.js → chunk-TMYG3EWX.js} +3 -3
  129. package/dist/{chunk-LSEFWW72.js → chunk-TPK3G44P.js} +3 -3
  130. package/dist/{chunk-OLU24OY5.js → chunk-TR6EV3FG.js} +1 -5
  131. package/dist/{chunk-OLU24OY5.js.map → chunk-TR6EV3FG.js.map} +3 -3
  132. package/dist/{chunk-NFUK32U5.js → chunk-U4TQ2HA6.js} +2 -2
  133. package/dist/{chunk-OH5HST4D.js → chunk-UVJS2AS7.js} +2 -2
  134. package/dist/{chunk-IQ3AZ4GW.js → chunk-VCWFNXJ6.js} +2 -2
  135. package/dist/{chunk-RDQKNQYT.js → chunk-WF4GYH5G.js} +2 -2
  136. package/dist/{chunk-N7JXPFLR.js → chunk-XBALT3QM.js} +39 -39
  137. package/dist/{chunk-QJPJZQEQ.js → chunk-XKL4CBO4.js} +10 -4
  138. package/dist/chunk-XKL4CBO4.js.map +7 -0
  139. package/dist/{chunk-3YJYBZIJ.js → chunk-XKMTTIU6.js} +3 -2
  140. package/dist/chunk-XKMTTIU6.js.map +7 -0
  141. package/dist/{chunk-4RQZE32U.js → chunk-ZES5HYNU.js} +5 -5
  142. package/dist/{chunk-622K7HUV.js → chunk-ZPCPRN4P.js} +2 -2
  143. package/dist/{chunk-BWKM4SGN.js → chunk-ZZOURNNY.js} +4 -4
  144. package/dist/{condition-OV5LAKLC.js → condition-MXP7ZZJA.js} +8 -8
  145. package/dist/{controls-VU4ZKU6P.js → controls-NOPNWCWP.js} +8 -8
  146. package/dist/{controls.btns-HOYT3NHX.js → controls.btns-QJI3KHUO.js} +2 -2
  147. package/dist/{controls.config-Y4ABH4KN.js → controls.config-2FG63Z7P.js} +8 -8
  148. package/dist/{correlation-ONQEZZP5.js → correlation-G5KHUFPN.js} +18 -18
  149. package/dist/{cuminc-ZVFVJZOP.js → cuminc-M5VZA3M5.js} +9 -9
  150. package/dist/{cuminc.integration.spec-G33322YH.js → cuminc.integration.spec-7GRBB7SM.js} +16 -16
  151. package/dist/{customdata.inputui-N7QJ3US3.js → customdata.inputui-UF2FWEXK.js} +8 -8
  152. package/dist/{dataDownload-QEZSVVGK.js → dataDownload-NLSMLL2P.js} +8 -8
  153. package/dist/{dataDownload.integration.spec-B7BYKLZ4.js → dataDownload.integration.spec-BVHNEKY2.js} +16 -16
  154. package/dist/{databrowser.ui-CK4GJYKG.js → databrowser.ui-D7LBOQH3.js} +18 -18
  155. package/dist/{dictionary-7SKULO7G.js → dictionary-NFZ5TJMD.js} +8 -8
  156. package/dist/{e2pca-FWCP5KPK.js → e2pca-4ZZMZYLO.js} +8 -8
  157. package/dist/{ep-DC6Q7DUI.js → ep-HJKT323Q.js} +8 -8
  158. package/dist/{expclust.gdc.spec-N25HZEDL.js → expclust.gdc.spec-2DNCZGRP.js} +16 -16
  159. package/dist/{facet-S7XUSJWD.js → facet-BLY52PGL.js} +8 -8
  160. package/dist/{frequencyChart-6DQVTXVX.js → frequencyChart-2XZFQNZC.js} +13 -13
  161. package/dist/{frequencyChart.integration.spec-NEGNBLSZ.js → frequencyChart.integration.spec-GVJ2OZ52.js} +16 -16
  162. package/dist/{geneExpClustering-ZAFWKTBV.js → geneExpClustering-YKXQ2JCT.js} +10 -10
  163. package/dist/{geneExpression-V7AK7EMP.js → geneExpression-3RE5NMZL.js} +2 -2
  164. package/dist/{geneExpression-3RNMGWS4.js → geneExpression-UJCKOE5D.js} +8 -8
  165. package/dist/{geneORA-HYOP6FZB.js → geneORA-CM5ORPVR.js} +8 -8
  166. package/dist/{geneVariant-664QBH6K.js → geneVariant-JIW5GGOY.js} +8 -8
  167. package/dist/{geneVariant-3QMO5W7L.js → geneVariant-S3RFTETK.js} +29 -13
  168. package/dist/geneVariant-S3RFTETK.js.map +7 -0
  169. package/dist/{genefusion.ui-65T7HWCP.js → genefusion.ui-UVVG7TLG.js} +8 -8
  170. package/dist/{geneset-RLF2QY3Q.js → geneset-YUBHI7I4.js} +8 -8
  171. package/dist/{genomeBrowser.spec-THSMBWSH.js → genomeBrowser.spec-ZOUFAGFU.js} +16 -16
  172. package/dist/{grin2-DLON3V6G.js → grin2-XFLJN3GN.js} +41 -14
  173. package/dist/grin2-XFLJN3GN.js.map +7 -0
  174. package/dist/{grin2-YCLS7BTZ.js → grin2-ZLNP6D6C.js} +8 -8
  175. package/dist/{gsea-ILVHCEGZ.js → gsea-3LW6XJS5.js} +10 -10
  176. package/dist/{hierCluster-HWGEOUI6.js → hierCluster-CCZVW5OF.js} +23 -23
  177. package/dist/{hierCluster-G34AJU7M.js → hierCluster-GX2WYV4Z.js} +24 -24
  178. package/dist/{hierCluster.config-4MKGOKX3.js → hierCluster.config-VFWPURDQ.js} +11 -11
  179. package/dist/{hierCluster.integration.spec-Y5CFAATW.js → hierCluster.integration.spec-Z4FVRPUS.js} +18 -18
  180. package/dist/{hierCluster.interactivity-4TOA3DI4.js → hierCluster.interactivity-OXZNJ7MJ.js} +9 -9
  181. package/dist/{imagePlot-NTYHGNQC.js → imagePlot-CSCIBTHV.js} +9 -9
  182. package/dist/importPlot-IW6SLCS6.js +8 -0
  183. package/dist/{launch.adhoc-NZBQY7PN.js → launch.adhoc-JQW25MWJ.js} +11 -11
  184. package/dist/{leftlabel.sample-4C7KG3K7.js → leftlabel.sample-CVAXEIGU.js} +12 -12
  185. package/dist/{lollipop-5HPH542E.js → lollipop-ZJOQSYUJ.js} +10 -10
  186. package/dist/{maf-QBMGGLED.js → maf-5KRAV3A6.js} +8 -8
  187. package/dist/{maftimeline-THWK7TLK.js → maftimeline-VMM3ZKBN.js} +8 -8
  188. package/dist/{matrix-WWJIS7D5.js → matrix-CLZDLAOP.js} +21 -21
  189. package/dist/{matrix-CHTKEBFW.js → matrix-LFEJ34H5.js} +21 -21
  190. package/dist/{matrix.cells-M5CPM7ZI.js → matrix.cells-YWNMLSFC.js} +2 -2
  191. package/dist/{matrix.config-SVUETO7Z.js → matrix.config-OKPQCMWE.js} +10 -10
  192. package/dist/{matrix.controls-MDGMUAAL.js → matrix.controls-Z2VGWKYP.js} +10 -10
  193. package/dist/{matrix.data-TOZOWWM4.js → matrix.data-N32LBVPR.js} +9 -9
  194. package/dist/{matrix.dom-Z7QTJAII.js → matrix.dom-A4TQOINQ.js} +3 -3
  195. package/dist/{matrix.groups-IP32LHZJ.js → matrix.groups-DDVCI2NY.js} +3 -3
  196. package/dist/{matrix.integration.spec-YQ324UVF.js → matrix.integration.spec-EANYKW4Q.js} +17 -17
  197. package/dist/{matrix.interactivity-ZZ76OJ6T.js → matrix.interactivity-SIIZP4OJ.js} +9 -9
  198. package/dist/{matrix.layout-BP53ZLXC.js → matrix.layout-5HB2A5ZD.js} +9 -9
  199. package/dist/{matrix.renderers-XJY7D2QZ.js → matrix.renderers-ENBCBB6K.js} +9 -9
  200. package/dist/{matrix.serieses-F4FILQSZ.js → matrix.serieses-NKLZCLCX.js} +3 -3
  201. package/dist/{matrix.sort-7E37JVSG.js → matrix.sort-ARDUX4LO.js} +2 -2
  202. package/dist/{matrix.sort.unit.spec-CJXECJKF.js → matrix.sort.unit.spec-O3QJGKYQ.js} +13 -13
  203. package/dist/matrix.sort.unit.spec-O3QJGKYQ.js.map +7 -0
  204. package/dist/{matrix.sorterUi-W5WSBIK3.js → matrix.sorterUi-QLE77DQJ.js} +3 -3
  205. package/dist/{matrix.sorterUi.unit.spec-SV2ERK3O.js → matrix.sorterUi.unit.spec-SNQJWIYP.js} +11 -11
  206. package/dist/{mavb-J3HZ7UPM.js → mavb-EPO6A3T3.js} +9 -9
  207. package/dist/{mds.fimo-VDAO6SM6.js → mds.fimo-UQZF6XBC.js} +8 -8
  208. package/dist/{mds.samplescatterplot-LG2WMXDN.js → mds.samplescatterplot-HH5UDW5M.js} +10 -10
  209. package/dist/{mds.survivalplot-DYBON35O.js → mds.survivalplot-NFOGOIDJ.js} +8 -8
  210. package/dist/{oncomatrix-U55ZZCEC.js → oncomatrix-6OYUBYSH.js} +10 -10
  211. package/dist/{oncomatrix.spec-MU3TKNDB.js → oncomatrix.spec-4LSAMP7J.js} +16 -16
  212. package/dist/{plot.2dvaf-NPQZEVER.js → plot.2dvaf-4BULS5KC.js} +8 -8
  213. package/dist/{plot.app-QOFQXUHZ.js → plot.app-DBLPSEPU.js} +10 -10
  214. package/dist/{plot.barplot-KT7OCAEH.js → plot.barplot-RZG6XWV6.js} +8 -8
  215. package/dist/{plot.boxplot-WUHHDDM6.js → plot.boxplot-EPLLF7BQ.js} +8 -8
  216. package/dist/{plot.brainImaging-UQAIXNZU.js → plot.brainImaging-GAU5OM35.js} +2 -2
  217. package/dist/{plot.disco-JNGIOXPR.js → plot.disco-YRSGKRFR.js} +3 -3
  218. package/dist/{plot.dzi-EEJWLNPJ.js → plot.dzi-EGT7BQL4.js} +2 -2
  219. package/dist/{plot.ssgq-EWESEOHV.js → plot.ssgq-H2HKABFX.js} +9 -9
  220. package/dist/{plot.vaf2cov-5WXKJ6GX.js → plot.vaf2cov-C3AOQHNQ.js} +8 -8
  221. package/dist/{plot.wsi-F7EYLIPZ.js → plot.wsi-6AV6EBAB.js} +2 -2
  222. package/dist/{polar-LHEB7JBA.js → polar-CBDHRCYP.js} +9 -9
  223. package/dist/{profile.spec-JB2Y7COH.js → profile.spec-TW22RJ3B.js} +16 -16
  224. package/dist/{profileBarchart-M4MHZGMF.js → profileBarchart-3EIN4G7G.js} +9 -9
  225. package/dist/{profileForms-N4MGO7JR.js → profileForms-6QN6ZR63.js} +9 -9
  226. package/dist/{profilePlot-5TWNY3BY.js → profilePlot-KI2O7AO7.js} +9 -9
  227. package/dist/{profileRadar-35DX3H4S.js → profileRadar-4FRECZBQ.js} +9 -9
  228. package/dist/{profileRadarFacility-42VHQ6H3.js → profileRadarFacility-ET55BLVY.js} +9 -9
  229. package/dist/{qualitative-7XEX7QZP.js → qualitative-5GZNYRZK.js} +2 -2
  230. package/dist/{qualitative-VFV3PZ73.js → qualitative-Y4SOI3NG.js} +8 -8
  231. package/dist/{regression-UBWBXUX7.js → regression-5X24WGFI.js} +16 -16
  232. package/dist/{regression.inputs-JRKFOOAS.js → regression.inputs-JRDHMRTI.js} +16 -16
  233. package/dist/{regression.inputs.term-XK336S56.js → regression.inputs.term-FPNBMBD6.js} +16 -16
  234. package/dist/{regression.inputs.values.table-VNAS2CYH.js → regression.inputs.values.table-JWHXLNEH.js} +14 -14
  235. package/dist/{regression.integration.spec-K24LWLJQ.js → regression.integration.spec-V6AR7TGG.js} +16 -16
  236. package/dist/{regression.results-JYJIFBF5.js → regression.results-U5DCIZH6.js} +9 -9
  237. package/dist/{regression.spec-2IGOGZOI.js → regression.spec-2KAC4RYW.js} +16 -16
  238. package/dist/{report-U6C6KH23.js → report-M54QTHDN.js} +8 -8
  239. package/dist/{runChart-2AU5V7YZ.js → runChart-2HEBZSNA.js} +13 -13
  240. package/dist/{runchart.integration.spec-26ECFMW6.js → runchart.integration.spec-EENJZO6G.js} +16 -16
  241. package/dist/{sampleScatter.spec-HJOFRGXF.js → sampleScatter.spec-B7BYCA5G.js} +16 -16
  242. package/dist/{sampleView-LNMGHP2S.js → sampleView-IBTJXOLP.js} +9 -9
  243. package/dist/{samplelst-NHV3L7VQ.js → samplelst-KTYW33VS.js} +8 -8
  244. package/dist/{samplematrix-UZJCQNX6.js → samplematrix-HKAHNAQO.js} +10 -10
  245. package/dist/{scatter-TX4LFLWA.js → scatter-LX6I77IQ.js} +12 -12
  246. package/dist/{scatter.integration.spec-MII4PEEA.js → scatter.integration.spec-CIOYCGEZ.js} +18 -18
  247. package/dist/{scatter.integration.spec-MII4PEEA.js.map → scatter.integration.spec-CIOYCGEZ.js.map} +1 -1
  248. package/dist/{selectGenomeWithTklst-DWOXKTKK.js → selectGenomeWithTklst-XK5LOKVG.js} +9 -9
  249. package/dist/{singleCellPlot-ZN63SGRK.js → singleCellPlot-JXHU7UQB.js} +10 -10
  250. package/dist/{singlecell-R4EZ64MN.js → singlecell-2MDKWQU6.js} +10 -10
  251. package/dist/{singlecell-R5JL7Y3S.js → singlecell-EPRGSEYW.js} +11 -11
  252. package/dist/{snp-EMO5QUTM.js → snp-I7PXNT72.js} +8 -8
  253. package/dist/{snplocus-OPRWGUNV.js → snplocus-AHE63KVG.js} +8 -8
  254. package/dist/{spliceevent.a53ss.diagram-R3EGNK2H.js → spliceevent.a53ss.diagram-E5XJJGBR.js} +8 -8
  255. package/dist/{spliceevent.exonskip.diagram-VNQ3LMIR.js → spliceevent.exonskip.diagram-WIOUHVF4.js} +9 -9
  256. package/dist/{spliceevent.noeventdiagram-PE7ZFCX5.js → spliceevent.noeventdiagram-PET4MAN6.js} +8 -8
  257. package/dist/{ssGSEA-EHMVZRLT.js → ssGSEA-Z7D4KGMJ.js} +8 -8
  258. package/dist/{summarizeCnvGeneexp-DPC46KRO.js → summarizeCnvGeneexp-2N5DFIY6.js} +9 -9
  259. package/dist/{summarizeGeneexpSurvival-IKLETOG6.js → summarizeGeneexpSurvival-PHIZRHPP.js} +9 -9
  260. package/dist/{summarizeMutationCnv-JWHFPBWD.js → summarizeMutationCnv-ERXRGOCB.js} +9 -9
  261. package/dist/{summarizeMutationCnv-JWHFPBWD.js.map → summarizeMutationCnv-ERXRGOCB.js.map} +1 -1
  262. package/dist/{summarizeMutationDiagnosis-UKEYFSXO.js → summarizeMutationDiagnosis-JKM3D5E4.js} +9 -9
  263. package/dist/{summarizeMutationSurvival-PIQ7ARNQ.js → summarizeMutationSurvival-ID6IEX3P.js} +9 -9
  264. package/dist/{summary-IQ7KTGHL.js → summary-CFSGPVQP.js} +16 -16
  265. package/dist/{summary.integration.spec-45ZW4VZK.js → summary.integration.spec-LIXRGLJK.js} +16 -16
  266. package/dist/{summaryInput-XHSRKMKN.js → summaryInput-TVI2YO5X.js} +10 -10
  267. package/dist/{sunburst-L44YEEXE.js → sunburst-ZNEMRBYL.js} +8 -8
  268. package/dist/{survival-XPREV45R.js → survival-GWK746XM.js} +8 -8
  269. package/dist/{survival-HMZ7YKVF.js → survival-WDLZPIUA.js} +10 -10
  270. package/dist/{survival.integration.spec-35CXQT47.js → survival.integration.spec-VAXMDKVX.js} +16 -16
  271. package/dist/{svgraph-5XUKZTD2.js → svgraph-MGGDOCRI.js} +8 -8
  272. package/dist/{svmr-CWUV45FJ.js → svmr-OWCDZEHH.js} +11 -11
  273. package/dist/{table-T3BDLKKZ.js → table-SGZTBKE5.js} +8 -8
  274. package/dist/{termCollection-6AJEDX6T.js → termCollection-352FUO52.js} +8 -8
  275. package/dist/{termCollection-EQHZHAP7.js → termCollection-MF4OMB6J.js} +8 -8
  276. package/dist/{tk-ZRFTYEFW.js → tk-ZRD7LHV5.js} +12 -12
  277. package/dist/{tp.ui-KW4NTQ74.js → tp.ui-I7KWGUNS.js} +17 -17
  278. package/dist/{tvs.dt-XJ2JQ6NU.js → tvs.dt-3BDSNMWN.js} +8 -8
  279. package/dist/{tvs.dtcnv.categorical-7ZH6MGF4.js → tvs.dtcnv.categorical-FDTJEVL6.js} +8 -8
  280. package/dist/{tvs.dtcnv.continuous-FEFX55VN.js → tvs.dtcnv.continuous-ZUFI3KJZ.js} +8 -8
  281. package/dist/{tvs.dtfusion-NRJWR2MX.js → tvs.dtfusion-T6H3TQTI.js} +8 -8
  282. package/dist/{tvs.dtsnvindel-BEVOQG7X.js → tvs.dtsnvindel-VIA7G6RX.js} +8 -8
  283. package/dist/{tvs.dtsv-O7HDJCV2.js → tvs.dtsv-K5MFTD4O.js} +8 -8
  284. package/dist/{tvs.numeric-MKU7IL3X.js → tvs.numeric-PA5UOKZL.js} +3 -3
  285. package/dist/{tvs.samplelst-3JLHTKTG.js → tvs.samplelst-X3ZXYF4C.js} +8 -8
  286. package/dist/{tvs.termCollection-YGVKC6ZZ.js → tvs.termCollection-RY45Q374.js} +12 -12
  287. package/dist/{violin-6RJ3566I.js → violin-GFMXHEHZ.js} +11 -11
  288. package/dist/{violin.integration.spec-AS4IAZDO.js → violin.integration.spec-7BX4T4G5.js} +25 -21
  289. package/dist/violin.integration.spec-7BX4T4G5.js.map +7 -0
  290. package/dist/{violin.interactivity-MDBS4ZKL.js → violin.interactivity-5XIJRFC2.js} +9 -9
  291. package/dist/{violin.renderer-PHUNX2QD.js → violin.renderer-OAJJKCMF.js} +9 -9
  292. package/dist/{vocabulary-OGJQIIHW.js → vocabulary-O7NLLQLC.js} +8 -8
  293. package/package.json +3 -3
  294. package/dist/Disco-D52FVUEO.js.map +0 -7
  295. package/dist/chunk-32LUIEDR.js.map +0 -7
  296. package/dist/chunk-3YJYBZIJ.js.map +0 -7
  297. package/dist/chunk-BJ2UYDYL.js.map +0 -7
  298. package/dist/chunk-DFBQHO4T.js.map +0 -7
  299. package/dist/chunk-GHI75432.js.map +0 -7
  300. package/dist/chunk-JTGDV7NZ.js.map +0 -7
  301. package/dist/chunk-K4LI3NKS.js.map +0 -7
  302. package/dist/chunk-QJPJZQEQ.js.map +0 -7
  303. package/dist/chunk-SNSSSEK7.js +0 -168
  304. package/dist/chunk-TLZJXDZZ.js.map +0 -7
  305. package/dist/chunk-WIEKWIQY.js.map +0 -7
  306. package/dist/geneVariant-3QMO5W7L.js.map +0 -7
  307. package/dist/grin2-DLON3V6G.js.map +0 -7
  308. package/dist/importPlot-4TORYPBO.js +0 -8
  309. package/dist/matrix.sort.unit.spec-CJXECJKF.js.map +0 -7
  310. package/dist/violin.integration.spec-AS4IAZDO.js.map +0 -7
  311. /package/dist/{2dmaf-TRTL5RIT.js.map → 2dmaf-NULVBOXA.js.map} +0 -0
  312. /package/dist/{AppHeader-UWDROFOQ.js.map → AppHeader-7JYXB4DY.js.map} +0 -0
  313. /package/dist/{CorrelationVolcano-HQVOSKB3.js.map → CorrelationVolcano-KMBRCL7V.js.map} +0 -0
  314. /package/dist/{DifferentialAnalysis-PYO2CH5P.js.map → DifferentialAnalysis-QMZAHDUY.js.map} +0 -0
  315. /package/dist/{Disco.UI-IYLN42SN.js.map → Disco.UI-XV547I36.js.map} +0 -0
  316. /package/dist/{GB-ZAMWKKEW.js.map → GB-PP6V7Q5Q.js.map} +0 -0
  317. /package/dist/{HicApp-NDWHBLJR.js.map → HicApp-U3FSL5IQ.js.map} +0 -0
  318. /package/dist/{NumBinaryEditor-ENCJVC3Q.js.map → NumBinaryEditor-QX6XP55J.js.map} +0 -0
  319. /package/dist/{NumBinaryEditor.unit.spec-27PMZBYI.js.map → NumBinaryEditor.unit.spec-4WULZW4X.js.map} +0 -0
  320. /package/dist/{NumContEditor-KMZ6TPHX.js.map → NumContEditor-U6TP4JUK.js.map} +0 -0
  321. /package/dist/{NumContEditor.unit.spec-I4G3X5XV.js.map → NumContEditor.unit.spec-YV6VJSSF.js.map} +0 -0
  322. /package/dist/{NumCustomBinEditor-YZF67LOQ.js.map → NumCustomBinEditor-QYGSDTAO.js.map} +0 -0
  323. /package/dist/{NumCustomBinEditor.unit.spec-WC6LQDGJ.js.map → NumCustomBinEditor.unit.spec-Q6EURCRN.js.map} +0 -0
  324. /package/dist/{NumDiscreteEditor-PRWHOR4D.js.map → NumDiscreteEditor-S3AIKKVE.js.map} +0 -0
  325. /package/dist/{NumDiscreteEditor.unit.spec-F4RUC5XQ.js.map → NumDiscreteEditor.unit.spec-X4P2WCWA.js.map} +0 -0
  326. /package/dist/{NumRegularBinEditor-SGJ64KAG.js.map → NumRegularBinEditor-KEY7EYOZ.js.map} +0 -0
  327. /package/dist/{NumRegularBinEditor.unit.spec-4GGUHTIQ.js.map → NumRegularBinEditor.unit.spec-P6OZIF67.js.map} +0 -0
  328. /package/dist/{NumSplineEditor-3YD2LY66.js.map → NumSplineEditor-KLSQQZZM.js.map} +0 -0
  329. /package/dist/{NumSplineEditor.unit.spec-MY5VM6CN.js.map → NumSplineEditor.unit.spec-D7H4N5YN.js.map} +0 -0
  330. /package/dist/{NumericDensity-FWSZV7TD.js.map → NumericDensity-JPTAN3DG.js.map} +0 -0
  331. /package/dist/{NumericDensity.unit.spec-MMBSYCHJ.js.map → NumericDensity.unit.spec-4KZPLVD3.js.map} +0 -0
  332. /package/dist/{NumericHandler-TJVMR232.js.map → NumericHandler-U2QBQS7T.js.map} +0 -0
  333. /package/dist/{NumericHandler.unit.spec-XEJRRORV.js.map → NumericHandler.unit.spec-AWMQMBSC.js.map} +0 -0
  334. /package/dist/{SC-GGN7UVLX.js.map → SC-J3PVK4Q5.js.map} +0 -0
  335. /package/dist/{Volcano-2WPXXICL.js.map → Volcano-75ZAK5VI.js.map} +0 -0
  336. /package/dist/{WsiSamplesPlot-25VDFJX3.js.map → WsiSamplesPlot-ZMV7ILUV.js.map} +0 -0
  337. /package/dist/{adSandbox-CPZBFRYS.js.map → adSandbox-ORRNN4M7.js.map} +0 -0
  338. /package/dist/{alphaGenome-RI7WM5JR.js.map → alphaGenome-TLQHWR5H.js.map} +0 -0
  339. /package/dist/{app-HQIYQFAQ.js.map → app-6EHQG2LS.js.map} +0 -0
  340. /package/dist/{app-KHGVOGCA.js.map → app-HVS47MKD.js.map} +0 -0
  341. /package/dist/{bam-VORHBA6P.js.map → bam-EXBX3IJY.js.map} +0 -0
  342. /package/dist/{barchart-7A6QUYMI.js.map → barchart-CCYIYLAK.js.map} +0 -0
  343. /package/dist/{barchart.data-RUKFEDLG.js.map → barchart.data-V757AO73.js.map} +0 -0
  344. /package/dist/{barchart.events-X5MR77JP.js.map → barchart.events-MSKITZZN.js.map} +0 -0
  345. /package/dist/{block-XJNR427G.js.map → block-HARZTSBZ.js.map} +0 -0
  346. /package/dist/{block.init-K6IYQCVG.js.map → block.init-5TGIIXLK.js.map} +0 -0
  347. /package/dist/{block.mds.expressionrank-G4YT3ITI.js.map → block.mds.expressionrank-L6LF5OGC.js.map} +0 -0
  348. /package/dist/{block.mds.geneboxplot-2VFCOY4F.js.map → block.mds.geneboxplot-2LGE36IG.js.map} +0 -0
  349. /package/dist/{block.mds.junction-3RADQYBR.js.map → block.mds.junction-GQA3H7WZ.js.map} +0 -0
  350. /package/dist/{block.mds.svcnv-G7UTUOIX.js.map → block.mds.svcnv-UCR4S2LF.js.map} +0 -0
  351. /package/dist/{block.svg-W2CR4CTT.js.map → block.svg-OXWF3HSA.js.map} +0 -0
  352. /package/dist/{block.tk.aicheck-W7N2FBKE.js.map → block.tk.aicheck-SDZPT3PF.js.map} +0 -0
  353. /package/dist/{block.tk.ase-OHVIYASE.js.map → block.tk.ase-4O5LJPTL.js.map} +0 -0
  354. /package/dist/{block.tk.bam-GYDBKELJ.js.map → block.tk.bam-LRMNMFCJ.js.map} +0 -0
  355. /package/dist/{block.tk.bedgraphdot-335OUZDX.js.map → block.tk.bedgraphdot-MBBCR4NC.js.map} +0 -0
  356. /package/dist/{block.tk.bigwig.ui-UEIKD46U.js.map → block.tk.bigwig.ui-FL5UUQVN.js.map} +0 -0
  357. /package/dist/{block.tk.hicstraw-JQYWZTBW.js.map → block.tk.hicstraw-KTTJDPGS.js.map} +0 -0
  358. /package/dist/{block.tk.junction-WPGJ7APU.js.map → block.tk.junction-VMPDXHQR.js.map} +0 -0
  359. /package/dist/{block.tk.junction.textmatrixui-MY4FCKK5.js.map → block.tk.junction.textmatrixui-6IUZRTGV.js.map} +0 -0
  360. /package/dist/{block.tk.ld-W6S2DEOS.js.map → block.tk.ld-HN7TITP4.js.map} +0 -0
  361. /package/dist/{block.tk.menu-KI65FAQC.js.map → block.tk.menu-5S2VJJKZ.js.map} +0 -0
  362. /package/dist/{block.tk.pgv-E5BSB22L.js.map → block.tk.pgv-KFM6VQEA.js.map} +0 -0
  363. /package/dist/{brainImaging-4NPWW63N.js.map → brainImaging-LAJPH266.js.map} +0 -0
  364. /package/dist/{chat-IV67D3I3.js.map → chat-B7MJ6MXM.js.map} +0 -0
  365. /package/dist/{chunk-DQNHLS6Y.js.map → chunk-34RYIRTD.js.map} +0 -0
  366. /package/dist/{chunk-RERIGX7D.js.map → chunk-3Q5HK4N4.js.map} +0 -0
  367. /package/dist/{chunk-HD5BRUXL.js.map → chunk-4JEN2Y3T.js.map} +0 -0
  368. /package/dist/{chunk-MQFFZOYH.js.map → chunk-5AHDD454.js.map} +0 -0
  369. /package/dist/{chunk-CSMHADZL.js.map → chunk-5UXFNBWZ.js.map} +0 -0
  370. /package/dist/{chunk-CBH7E4CZ.js.map → chunk-6XZ4QG2S.js.map} +0 -0
  371. /package/dist/{chunk-UMD43EU7.js.map → chunk-77OHO7EA.js.map} +0 -0
  372. /package/dist/{chunk-GOSADDSN.js.map → chunk-7RXIGX5P.js.map} +0 -0
  373. /package/dist/{chunk-NLS7X5LY.js.map → chunk-AY73FQLU.js.map} +0 -0
  374. /package/dist/{chunk-XNNPS7PL.js.map → chunk-BH5G6JKX.js.map} +0 -0
  375. /package/dist/{chunk-OKAXAC5U.js.map → chunk-BTYRXZZL.js.map} +0 -0
  376. /package/dist/{chunk-5K6L3WGS.js.map → chunk-CAJJV4K2.js.map} +0 -0
  377. /package/dist/{chunk-BUXS26F4.js.map → chunk-CNW6OLYY.js.map} +0 -0
  378. /package/dist/{chunk-HISAS5OU.js.map → chunk-CTDY2CMT.js.map} +0 -0
  379. /package/dist/{chunk-B4YNT4QW.js.map → chunk-CXW25G2T.js.map} +0 -0
  380. /package/dist/{chunk-6IH5W6UC.js.map → chunk-D3PQH6RE.js.map} +0 -0
  381. /package/dist/{chunk-4XAAGRWA.js.map → chunk-D6VZESYY.js.map} +0 -0
  382. /package/dist/{chunk-MUCRBG5F.js.map → chunk-DNZHE7FP.js.map} +0 -0
  383. /package/dist/{chunk-RU7NM2HO.js.map → chunk-F5BTEQEW.js.map} +0 -0
  384. /package/dist/{chunk-ZJFQ5N4A.js.map → chunk-F6XCNNS6.js.map} +0 -0
  385. /package/dist/{chunk-WTNMUTHT.js.map → chunk-FIZ4S7AN.js.map} +0 -0
  386. /package/dist/{chunk-SNSSSEK7.js.map → chunk-FSGEVTVI.js.map} +0 -0
  387. /package/dist/{chunk-7FCA4KIE.js.map → chunk-FVTQMCMG.js.map} +0 -0
  388. /package/dist/{chunk-3VA4MJQQ.js.map → chunk-GSRQZE6V.js.map} +0 -0
  389. /package/dist/{chunk-7575UK54.js.map → chunk-HHFK426A.js.map} +0 -0
  390. /package/dist/{chunk-WNBJMVEE.js.map → chunk-IAMFJMMC.js.map} +0 -0
  391. /package/dist/{chunk-6BV2ZBNU.js.map → chunk-JFQM7LYS.js.map} +0 -0
  392. /package/dist/{chunk-T3U2GVSC.js.map → chunk-KAXBZQW3.js.map} +0 -0
  393. /package/dist/{chunk-4ANV7WKU.js.map → chunk-KZXEXB3K.js.map} +0 -0
  394. /package/dist/{chunk-52DOAUEG.js.map → chunk-MUN6WCMX.js.map} +0 -0
  395. /package/dist/{chunk-EHMNO46L.js.map → chunk-N7BE3ZF5.js.map} +0 -0
  396. /package/dist/{chunk-EIMOBM5J.js.map → chunk-NL7WRKHQ.js.map} +0 -0
  397. /package/dist/{chunk-L7YF2J27.js.map → chunk-NTH4X4ZX.js.map} +0 -0
  398. /package/dist/{chunk-QAC4K4S6.js.map → chunk-OUKTVVOI.js.map} +0 -0
  399. /package/dist/{chunk-S7FUDZD5.js.map → chunk-PJEIREMJ.js.map} +0 -0
  400. /package/dist/{chunk-VJUB2TUE.js.map → chunk-PNVVKQJV.js.map} +0 -0
  401. /package/dist/{chunk-DEUI26GX.js.map → chunk-PO22RN6V.js.map} +0 -0
  402. /package/dist/{chunk-LNKVNRRR.js.map → chunk-RDMXKGKH.js.map} +0 -0
  403. /package/dist/{chunk-DWE42LXW.js.map → chunk-RGNJKYXM.js.map} +0 -0
  404. /package/dist/{chunk-7EUKSBAJ.js.map → chunk-ROY5OATX.js.map} +0 -0
  405. /package/dist/{chunk-PJ376FKI.js.map → chunk-SEEKAG6E.js.map} +0 -0
  406. /package/dist/{chunk-IJPAGSZN.js.map → chunk-SPCZQRRQ.js.map} +0 -0
  407. /package/dist/{chunk-JJECYRIX.js.map → chunk-SZOQJ5NV.js.map} +0 -0
  408. /package/dist/{chunk-F7KC4VGP.js.map → chunk-TKNO4Y2X.js.map} +0 -0
  409. /package/dist/{chunk-NCT2SONQ.js.map → chunk-TMYG3EWX.js.map} +0 -0
  410. /package/dist/{chunk-LSEFWW72.js.map → chunk-TPK3G44P.js.map} +0 -0
  411. /package/dist/{chunk-NFUK32U5.js.map → chunk-U4TQ2HA6.js.map} +0 -0
  412. /package/dist/{chunk-OH5HST4D.js.map → chunk-UVJS2AS7.js.map} +0 -0
  413. /package/dist/{chunk-IQ3AZ4GW.js.map → chunk-VCWFNXJ6.js.map} +0 -0
  414. /package/dist/{chunk-RDQKNQYT.js.map → chunk-WF4GYH5G.js.map} +0 -0
  415. /package/dist/{chunk-N7JXPFLR.js.map → chunk-XBALT3QM.js.map} +0 -0
  416. /package/dist/{chunk-4RQZE32U.js.map → chunk-ZES5HYNU.js.map} +0 -0
  417. /package/dist/{chunk-622K7HUV.js.map → chunk-ZPCPRN4P.js.map} +0 -0
  418. /package/dist/{chunk-BWKM4SGN.js.map → chunk-ZZOURNNY.js.map} +0 -0
  419. /package/dist/{condition-OV5LAKLC.js.map → condition-MXP7ZZJA.js.map} +0 -0
  420. /package/dist/{controls-VU4ZKU6P.js.map → controls-NOPNWCWP.js.map} +0 -0
  421. /package/dist/{controls.btns-HOYT3NHX.js.map → controls.btns-QJI3KHUO.js.map} +0 -0
  422. /package/dist/{controls.config-Y4ABH4KN.js.map → controls.config-2FG63Z7P.js.map} +0 -0
  423. /package/dist/{correlation-ONQEZZP5.js.map → correlation-G5KHUFPN.js.map} +0 -0
  424. /package/dist/{cuminc-ZVFVJZOP.js.map → cuminc-M5VZA3M5.js.map} +0 -0
  425. /package/dist/{cuminc.integration.spec-G33322YH.js.map → cuminc.integration.spec-7GRBB7SM.js.map} +0 -0
  426. /package/dist/{customdata.inputui-N7QJ3US3.js.map → customdata.inputui-UF2FWEXK.js.map} +0 -0
  427. /package/dist/{dataDownload-QEZSVVGK.js.map → dataDownload-NLSMLL2P.js.map} +0 -0
  428. /package/dist/{dataDownload.integration.spec-B7BYKLZ4.js.map → dataDownload.integration.spec-BVHNEKY2.js.map} +0 -0
  429. /package/dist/{databrowser.ui-CK4GJYKG.js.map → databrowser.ui-D7LBOQH3.js.map} +0 -0
  430. /package/dist/{dictionary-7SKULO7G.js.map → dictionary-NFZ5TJMD.js.map} +0 -0
  431. /package/dist/{e2pca-FWCP5KPK.js.map → e2pca-4ZZMZYLO.js.map} +0 -0
  432. /package/dist/{ep-DC6Q7DUI.js.map → ep-HJKT323Q.js.map} +0 -0
  433. /package/dist/{expclust.gdc.spec-N25HZEDL.js.map → expclust.gdc.spec-2DNCZGRP.js.map} +0 -0
  434. /package/dist/{facet-S7XUSJWD.js.map → facet-BLY52PGL.js.map} +0 -0
  435. /package/dist/{frequencyChart-6DQVTXVX.js.map → frequencyChart-2XZFQNZC.js.map} +0 -0
  436. /package/dist/{frequencyChart.integration.spec-NEGNBLSZ.js.map → frequencyChart.integration.spec-GVJ2OZ52.js.map} +0 -0
  437. /package/dist/{geneExpClustering-ZAFWKTBV.js.map → geneExpClustering-YKXQ2JCT.js.map} +0 -0
  438. /package/dist/{geneExpression-V7AK7EMP.js.map → geneExpression-3RE5NMZL.js.map} +0 -0
  439. /package/dist/{geneExpression-3RNMGWS4.js.map → geneExpression-UJCKOE5D.js.map} +0 -0
  440. /package/dist/{geneORA-HYOP6FZB.js.map → geneORA-CM5ORPVR.js.map} +0 -0
  441. /package/dist/{geneVariant-664QBH6K.js.map → geneVariant-JIW5GGOY.js.map} +0 -0
  442. /package/dist/{genefusion.ui-65T7HWCP.js.map → genefusion.ui-UVVG7TLG.js.map} +0 -0
  443. /package/dist/{geneset-RLF2QY3Q.js.map → geneset-YUBHI7I4.js.map} +0 -0
  444. /package/dist/{genomeBrowser.spec-THSMBWSH.js.map → genomeBrowser.spec-ZOUFAGFU.js.map} +0 -0
  445. /package/dist/{grin2-YCLS7BTZ.js.map → grin2-ZLNP6D6C.js.map} +0 -0
  446. /package/dist/{gsea-ILVHCEGZ.js.map → gsea-3LW6XJS5.js.map} +0 -0
  447. /package/dist/{hierCluster-G34AJU7M.js.map → hierCluster-CCZVW5OF.js.map} +0 -0
  448. /package/dist/{hierCluster-HWGEOUI6.js.map → hierCluster-GX2WYV4Z.js.map} +0 -0
  449. /package/dist/{hierCluster.config-4MKGOKX3.js.map → hierCluster.config-VFWPURDQ.js.map} +0 -0
  450. /package/dist/{hierCluster.integration.spec-Y5CFAATW.js.map → hierCluster.integration.spec-Z4FVRPUS.js.map} +0 -0
  451. /package/dist/{hierCluster.interactivity-4TOA3DI4.js.map → hierCluster.interactivity-OXZNJ7MJ.js.map} +0 -0
  452. /package/dist/{imagePlot-NTYHGNQC.js.map → imagePlot-CSCIBTHV.js.map} +0 -0
  453. /package/dist/{importPlot-4TORYPBO.js.map → importPlot-IW6SLCS6.js.map} +0 -0
  454. /package/dist/{launch.adhoc-NZBQY7PN.js.map → launch.adhoc-JQW25MWJ.js.map} +0 -0
  455. /package/dist/{leftlabel.sample-4C7KG3K7.js.map → leftlabel.sample-CVAXEIGU.js.map} +0 -0
  456. /package/dist/{lollipop-5HPH542E.js.map → lollipop-ZJOQSYUJ.js.map} +0 -0
  457. /package/dist/{maf-QBMGGLED.js.map → maf-5KRAV3A6.js.map} +0 -0
  458. /package/dist/{maftimeline-THWK7TLK.js.map → maftimeline-VMM3ZKBN.js.map} +0 -0
  459. /package/dist/{matrix-CHTKEBFW.js.map → matrix-CLZDLAOP.js.map} +0 -0
  460. /package/dist/{matrix-WWJIS7D5.js.map → matrix-LFEJ34H5.js.map} +0 -0
  461. /package/dist/{matrix.cells-M5CPM7ZI.js.map → matrix.cells-YWNMLSFC.js.map} +0 -0
  462. /package/dist/{matrix.config-SVUETO7Z.js.map → matrix.config-OKPQCMWE.js.map} +0 -0
  463. /package/dist/{matrix.controls-MDGMUAAL.js.map → matrix.controls-Z2VGWKYP.js.map} +0 -0
  464. /package/dist/{matrix.data-TOZOWWM4.js.map → matrix.data-N32LBVPR.js.map} +0 -0
  465. /package/dist/{matrix.dom-Z7QTJAII.js.map → matrix.dom-A4TQOINQ.js.map} +0 -0
  466. /package/dist/{matrix.groups-IP32LHZJ.js.map → matrix.groups-DDVCI2NY.js.map} +0 -0
  467. /package/dist/{matrix.integration.spec-YQ324UVF.js.map → matrix.integration.spec-EANYKW4Q.js.map} +0 -0
  468. /package/dist/{matrix.interactivity-ZZ76OJ6T.js.map → matrix.interactivity-SIIZP4OJ.js.map} +0 -0
  469. /package/dist/{matrix.layout-BP53ZLXC.js.map → matrix.layout-5HB2A5ZD.js.map} +0 -0
  470. /package/dist/{matrix.renderers-XJY7D2QZ.js.map → matrix.renderers-ENBCBB6K.js.map} +0 -0
  471. /package/dist/{matrix.serieses-F4FILQSZ.js.map → matrix.serieses-NKLZCLCX.js.map} +0 -0
  472. /package/dist/{matrix.sort-7E37JVSG.js.map → matrix.sort-ARDUX4LO.js.map} +0 -0
  473. /package/dist/{matrix.sorterUi-W5WSBIK3.js.map → matrix.sorterUi-QLE77DQJ.js.map} +0 -0
  474. /package/dist/{matrix.sorterUi.unit.spec-SV2ERK3O.js.map → matrix.sorterUi.unit.spec-SNQJWIYP.js.map} +0 -0
  475. /package/dist/{mavb-J3HZ7UPM.js.map → mavb-EPO6A3T3.js.map} +0 -0
  476. /package/dist/{mds.fimo-VDAO6SM6.js.map → mds.fimo-UQZF6XBC.js.map} +0 -0
  477. /package/dist/{mds.samplescatterplot-LG2WMXDN.js.map → mds.samplescatterplot-HH5UDW5M.js.map} +0 -0
  478. /package/dist/{mds.survivalplot-DYBON35O.js.map → mds.survivalplot-NFOGOIDJ.js.map} +0 -0
  479. /package/dist/{oncomatrix-U55ZZCEC.js.map → oncomatrix-6OYUBYSH.js.map} +0 -0
  480. /package/dist/{oncomatrix.spec-MU3TKNDB.js.map → oncomatrix.spec-4LSAMP7J.js.map} +0 -0
  481. /package/dist/{plot.2dvaf-NPQZEVER.js.map → plot.2dvaf-4BULS5KC.js.map} +0 -0
  482. /package/dist/{plot.app-QOFQXUHZ.js.map → plot.app-DBLPSEPU.js.map} +0 -0
  483. /package/dist/{plot.barplot-KT7OCAEH.js.map → plot.barplot-RZG6XWV6.js.map} +0 -0
  484. /package/dist/{plot.boxplot-WUHHDDM6.js.map → plot.boxplot-EPLLF7BQ.js.map} +0 -0
  485. /package/dist/{plot.brainImaging-UQAIXNZU.js.map → plot.brainImaging-GAU5OM35.js.map} +0 -0
  486. /package/dist/{plot.disco-JNGIOXPR.js.map → plot.disco-YRSGKRFR.js.map} +0 -0
  487. /package/dist/{plot.dzi-EEJWLNPJ.js.map → plot.dzi-EGT7BQL4.js.map} +0 -0
  488. /package/dist/{plot.ssgq-EWESEOHV.js.map → plot.ssgq-H2HKABFX.js.map} +0 -0
  489. /package/dist/{plot.vaf2cov-5WXKJ6GX.js.map → plot.vaf2cov-C3AOQHNQ.js.map} +0 -0
  490. /package/dist/{plot.wsi-F7EYLIPZ.js.map → plot.wsi-6AV6EBAB.js.map} +0 -0
  491. /package/dist/{polar-LHEB7JBA.js.map → polar-CBDHRCYP.js.map} +0 -0
  492. /package/dist/{profile.spec-JB2Y7COH.js.map → profile.spec-TW22RJ3B.js.map} +0 -0
  493. /package/dist/{profileBarchart-M4MHZGMF.js.map → profileBarchart-3EIN4G7G.js.map} +0 -0
  494. /package/dist/{profileForms-N4MGO7JR.js.map → profileForms-6QN6ZR63.js.map} +0 -0
  495. /package/dist/{profilePlot-5TWNY3BY.js.map → profilePlot-KI2O7AO7.js.map} +0 -0
  496. /package/dist/{profileRadar-35DX3H4S.js.map → profileRadar-4FRECZBQ.js.map} +0 -0
  497. /package/dist/{profileRadarFacility-42VHQ6H3.js.map → profileRadarFacility-ET55BLVY.js.map} +0 -0
  498. /package/dist/{qualitative-7XEX7QZP.js.map → qualitative-5GZNYRZK.js.map} +0 -0
  499. /package/dist/{qualitative-VFV3PZ73.js.map → qualitative-Y4SOI3NG.js.map} +0 -0
  500. /package/dist/{regression-UBWBXUX7.js.map → regression-5X24WGFI.js.map} +0 -0
  501. /package/dist/{regression.inputs-JRKFOOAS.js.map → regression.inputs-JRDHMRTI.js.map} +0 -0
  502. /package/dist/{regression.inputs.term-XK336S56.js.map → regression.inputs.term-FPNBMBD6.js.map} +0 -0
  503. /package/dist/{regression.inputs.values.table-VNAS2CYH.js.map → regression.inputs.values.table-JWHXLNEH.js.map} +0 -0
  504. /package/dist/{regression.integration.spec-K24LWLJQ.js.map → regression.integration.spec-V6AR7TGG.js.map} +0 -0
  505. /package/dist/{regression.results-JYJIFBF5.js.map → regression.results-U5DCIZH6.js.map} +0 -0
  506. /package/dist/{regression.spec-2IGOGZOI.js.map → regression.spec-2KAC4RYW.js.map} +0 -0
  507. /package/dist/{report-U6C6KH23.js.map → report-M54QTHDN.js.map} +0 -0
  508. /package/dist/{runChart-2AU5V7YZ.js.map → runChart-2HEBZSNA.js.map} +0 -0
  509. /package/dist/{runchart.integration.spec-26ECFMW6.js.map → runchart.integration.spec-EENJZO6G.js.map} +0 -0
  510. /package/dist/{sampleScatter.spec-HJOFRGXF.js.map → sampleScatter.spec-B7BYCA5G.js.map} +0 -0
  511. /package/dist/{sampleView-LNMGHP2S.js.map → sampleView-IBTJXOLP.js.map} +0 -0
  512. /package/dist/{samplelst-NHV3L7VQ.js.map → samplelst-KTYW33VS.js.map} +0 -0
  513. /package/dist/{samplematrix-UZJCQNX6.js.map → samplematrix-HKAHNAQO.js.map} +0 -0
  514. /package/dist/{scatter-TX4LFLWA.js.map → scatter-LX6I77IQ.js.map} +0 -0
  515. /package/dist/{selectGenomeWithTklst-DWOXKTKK.js.map → selectGenomeWithTklst-XK5LOKVG.js.map} +0 -0
  516. /package/dist/{singleCellPlot-ZN63SGRK.js.map → singleCellPlot-JXHU7UQB.js.map} +0 -0
  517. /package/dist/{singlecell-R4EZ64MN.js.map → singlecell-2MDKWQU6.js.map} +0 -0
  518. /package/dist/{singlecell-R5JL7Y3S.js.map → singlecell-EPRGSEYW.js.map} +0 -0
  519. /package/dist/{snp-EMO5QUTM.js.map → snp-I7PXNT72.js.map} +0 -0
  520. /package/dist/{snplocus-OPRWGUNV.js.map → snplocus-AHE63KVG.js.map} +0 -0
  521. /package/dist/{spliceevent.a53ss.diagram-R3EGNK2H.js.map → spliceevent.a53ss.diagram-E5XJJGBR.js.map} +0 -0
  522. /package/dist/{spliceevent.exonskip.diagram-VNQ3LMIR.js.map → spliceevent.exonskip.diagram-WIOUHVF4.js.map} +0 -0
  523. /package/dist/{spliceevent.noeventdiagram-PE7ZFCX5.js.map → spliceevent.noeventdiagram-PET4MAN6.js.map} +0 -0
  524. /package/dist/{ssGSEA-EHMVZRLT.js.map → ssGSEA-Z7D4KGMJ.js.map} +0 -0
  525. /package/dist/{summarizeCnvGeneexp-DPC46KRO.js.map → summarizeCnvGeneexp-2N5DFIY6.js.map} +0 -0
  526. /package/dist/{summarizeGeneexpSurvival-IKLETOG6.js.map → summarizeGeneexpSurvival-PHIZRHPP.js.map} +0 -0
  527. /package/dist/{summarizeMutationDiagnosis-UKEYFSXO.js.map → summarizeMutationDiagnosis-JKM3D5E4.js.map} +0 -0
  528. /package/dist/{summarizeMutationSurvival-PIQ7ARNQ.js.map → summarizeMutationSurvival-ID6IEX3P.js.map} +0 -0
  529. /package/dist/{summary-IQ7KTGHL.js.map → summary-CFSGPVQP.js.map} +0 -0
  530. /package/dist/{summary.integration.spec-45ZW4VZK.js.map → summary.integration.spec-LIXRGLJK.js.map} +0 -0
  531. /package/dist/{summaryInput-XHSRKMKN.js.map → summaryInput-TVI2YO5X.js.map} +0 -0
  532. /package/dist/{sunburst-L44YEEXE.js.map → sunburst-ZNEMRBYL.js.map} +0 -0
  533. /package/dist/{survival-XPREV45R.js.map → survival-GWK746XM.js.map} +0 -0
  534. /package/dist/{survival-HMZ7YKVF.js.map → survival-WDLZPIUA.js.map} +0 -0
  535. /package/dist/{survival.integration.spec-35CXQT47.js.map → survival.integration.spec-VAXMDKVX.js.map} +0 -0
  536. /package/dist/{svgraph-5XUKZTD2.js.map → svgraph-MGGDOCRI.js.map} +0 -0
  537. /package/dist/{svmr-CWUV45FJ.js.map → svmr-OWCDZEHH.js.map} +0 -0
  538. /package/dist/{table-T3BDLKKZ.js.map → table-SGZTBKE5.js.map} +0 -0
  539. /package/dist/{termCollection-6AJEDX6T.js.map → termCollection-352FUO52.js.map} +0 -0
  540. /package/dist/{termCollection-EQHZHAP7.js.map → termCollection-MF4OMB6J.js.map} +0 -0
  541. /package/dist/{tk-ZRFTYEFW.js.map → tk-ZRD7LHV5.js.map} +0 -0
  542. /package/dist/{tp.ui-KW4NTQ74.js.map → tp.ui-I7KWGUNS.js.map} +0 -0
  543. /package/dist/{tvs.dt-XJ2JQ6NU.js.map → tvs.dt-3BDSNMWN.js.map} +0 -0
  544. /package/dist/{tvs.dtcnv.categorical-7ZH6MGF4.js.map → tvs.dtcnv.categorical-FDTJEVL6.js.map} +0 -0
  545. /package/dist/{tvs.dtcnv.continuous-FEFX55VN.js.map → tvs.dtcnv.continuous-ZUFI3KJZ.js.map} +0 -0
  546. /package/dist/{tvs.dtfusion-NRJWR2MX.js.map → tvs.dtfusion-T6H3TQTI.js.map} +0 -0
  547. /package/dist/{tvs.dtsnvindel-BEVOQG7X.js.map → tvs.dtsnvindel-VIA7G6RX.js.map} +0 -0
  548. /package/dist/{tvs.dtsv-O7HDJCV2.js.map → tvs.dtsv-K5MFTD4O.js.map} +0 -0
  549. /package/dist/{tvs.numeric-MKU7IL3X.js.map → tvs.numeric-PA5UOKZL.js.map} +0 -0
  550. /package/dist/{tvs.samplelst-3JLHTKTG.js.map → tvs.samplelst-X3ZXYF4C.js.map} +0 -0
  551. /package/dist/{tvs.termCollection-YGVKC6ZZ.js.map → tvs.termCollection-RY45Q374.js.map} +0 -0
  552. /package/dist/{violin-6RJ3566I.js.map → violin-GFMXHEHZ.js.map} +0 -0
  553. /package/dist/{violin.interactivity-MDBS4ZKL.js.map → violin.interactivity-5XIJRFC2.js.map} +0 -0
  554. /package/dist/{violin.renderer-PHUNX2QD.js.map → violin.renderer-OAJJKCMF.js.map} +0 -0
  555. /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-K4LI3NKS.js";
11
+ } from "./chunk-FLJ2GUHL.js";
12
12
  import "./chunk-HJ6L54YS.js";
13
- import "./chunk-SNSSSEK7.js";
13
+ import "./chunk-FSGEVTVI.js";
14
14
  import {
15
15
  Menu
16
- } from "./chunk-DFBQHO4T.js";
17
- import "./chunk-OLU24OY5.js";
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-2WPIXNJD.js";
26
+ import "./chunk-MYBLQGD6.js";
27
27
  import "./chunk-6LZYWV4K.js";
28
28
  import "./chunk-FIZCTRIV.js";
29
- import "./chunk-LSEFWW72.js";
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-TRTL5RIT.js.map
1368
+ //# sourceMappingURL=2dmaf-NULVBOXA.js.map
@@ -7,14 +7,14 @@ import {
7
7
  getNormalRoot,
8
8
  renderTable,
9
9
  sayerror
10
- } from "./chunk-K4LI3NKS.js";
10
+ } from "./chunk-FLJ2GUHL.js";
11
11
  import "./chunk-HJ6L54YS.js";
12
- import "./chunk-SNSSSEK7.js";
13
- import "./chunk-DFBQHO4T.js";
12
+ import "./chunk-FSGEVTVI.js";
13
+ import "./chunk-QSSTMH7C.js";
14
14
  import {
15
15
  dofetch2,
16
16
  dofetch3
17
- } from "./chunk-OLU24OY5.js";
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-2WPIXNJD.js";
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-LSEFWW72.js";
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-F7EYLIPZ.js");
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
- this.selectedRows = new Set(
486
- this.images.rows.filter((_, i) => {
487
- if (i < 50) return true;
488
- }).map((_, i) => i)
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: this.images.cols.map((c) => ({ ...c, sortable: true })),
496
- rows: this.images.rows,
497
- selectedRows: Array.from(this.selectedRows),
527
+ columns,
528
+ rows: rowsSorted,
529
+ selectedRows: selectedRowsForRender,
498
530
  striped: true,
499
531
  header: { allowSort: true },
500
- noButtonCallback: (i, node) => {
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(i);
536
+ this.selectedRows.add(orig);
503
537
  } else {
504
- this.selectedRows.delete(i);
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").on("click", async () => {
512
- if (!this.selectedRows.size) alert(`No rows selected. Please select some rows.`);
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.length === 0)) {
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-YQEZDLTR.js.map
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\">&times;<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\">&times;<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-MUCRBG5F.js";
4
+ } from "./chunk-DNZHE7FP.js";
5
5
  import {
6
6
  get_tklst
7
- } from "./chunk-5K6L3WGS.js";
8
- import "./chunk-6BV2ZBNU.js";
9
- import "./chunk-IQ3AZ4GW.js";
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-HD5BRUXL.js";
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-LNKVNRRR.js";
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-K4LI3NKS.js";
25
+ } from "./chunk-FLJ2GUHL.js";
26
26
  import {
27
27
  string2pos
28
28
  } from "./chunk-HJ6L54YS.js";
29
- import "./chunk-SNSSSEK7.js";
30
- import "./chunk-DFBQHO4T.js";
29
+ import "./chunk-FSGEVTVI.js";
30
+ import "./chunk-QSSTMH7C.js";
31
31
  import {
32
32
  dofetch3
33
- } from "./chunk-OLU24OY5.js";
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-2WPIXNJD.js";
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-LSEFWW72.js";
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-XJNR427G.js").then((b) => new b.Block(par2)).catch((err) => {
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-XJNR427G.js").then((b) => new b.Block(par));
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-UWDROFOQ.js.map
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-K4LI3NKS.js";
20
+ } from "./chunk-FLJ2GUHL.js";
21
21
  import "./chunk-HJ6L54YS.js";
22
- import "./chunk-SNSSSEK7.js";
22
+ import "./chunk-FSGEVTVI.js";
23
23
  import {
24
24
  Menu
25
- } from "./chunk-DFBQHO4T.js";
26
- import "./chunk-OLU24OY5.js";
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-2WPIXNJD.js";
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-LSEFWW72.js";
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-6YBOOOMT.js.map
1168
+ //# sourceMappingURL=BoxPlot-RFW4FE7T.js.map