@sjcrh/proteinpaint-client 2.162.0 → 2.163.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (518) hide show
  1. package/dist/{2dmaf-CC7BK3ZP.js → 2dmaf-I6WQUYPR.js} +3 -3
  2. package/dist/{AIProjectAdmin-PH4FM5SP.js → AIProjectAdmin-VQ4JD75C.js} +91 -9
  3. package/dist/{AIProjectAdmin-PH4FM5SP.js.map → AIProjectAdmin-VQ4JD75C.js.map} +3 -3
  4. package/dist/{AppHeader-AYYXWP5W.js → AppHeader-M3UEZL47.js} +11 -11
  5. package/dist/{BoxPlot-PZJAPMVT.js → BoxPlot-SQMAIQZM.js} +9 -9
  6. package/dist/{CorrelationVolcano-AHVPEECE.js → CorrelationVolcano-HCW6LQRF.js} +6 -6
  7. package/dist/{DifferentialAnalysis-7KNOEZ3M.js → DifferentialAnalysis-XQ3SQ6TG.js} +9 -9
  8. package/dist/{Disco-QVQCMWIQ.js → Disco-6TM5UG4F.js} +6 -6
  9. package/dist/{Disco.UI-RLXB5FDX.js → Disco.UI-JW5ID57Z.js} +8 -8
  10. package/dist/{GB-ZBOWSGUU.js → GB-QBKOIRPQ.js} +6 -6
  11. package/dist/{HicApp-CUU7PSFK.js → HicApp-CN44ERMV.js} +5 -5
  12. package/dist/{NumBinaryEditor-VFWF63GO.js → NumBinaryEditor-PLJWFPEY.js} +3 -3
  13. package/dist/{NumBinaryEditor.unit.spec-WELIN5HR.js → NumBinaryEditor.unit.spec-D3CZPMLR.js} +4 -4
  14. package/dist/{NumContEditor-HYKGC3P6.js → NumContEditor-2MOK5TRZ.js} +3 -3
  15. package/dist/{NumContEditor.unit.spec-X3UP3MX6.js → NumContEditor.unit.spec-2PSEPPJV.js} +4 -4
  16. package/dist/{NumCustomBinEditor-2NMGRTED.js → NumCustomBinEditor-J2JAHJTY.js} +4 -4
  17. package/dist/{NumCustomBinEditor.unit.spec-WOJ7XRMJ.js → NumCustomBinEditor.unit.spec-HWA7YUM6.js} +4 -4
  18. package/dist/{NumDiscreteEditor-V47ICE55.js → NumDiscreteEditor-LZDFD3OQ.js} +5 -5
  19. package/dist/{NumDiscreteEditor.unit.spec-27QLI7IV.js → NumDiscreteEditor.unit.spec-FXVIKKJW.js} +4 -4
  20. package/dist/{NumRegularBinEditor-TUZTXFNM.js → NumRegularBinEditor-XNGZGF6Y.js} +4 -4
  21. package/dist/{NumRegularBinEditor.unit.spec-LBZBSOIG.js → NumRegularBinEditor.unit.spec-OSEXN24D.js} +4 -4
  22. package/dist/{NumSplineEditor-JANVSKM6.js → NumSplineEditor-ZT6JHJTK.js} +3 -3
  23. package/dist/{NumSplineEditor.unit.spec-V637HKEB.js → NumSplineEditor.unit.spec-6MO42MI6.js} +4 -4
  24. package/dist/{NumericDensity-4GEBEKSB.js → NumericDensity-PUN5FXQA.js} +3 -3
  25. package/dist/{NumericDensity.unit.spec-IVPLRVL4.js → NumericDensity.unit.spec-I2L3UXFS.js} +3 -3
  26. package/dist/{NumericHandler-GSWU4ZX2.js → NumericHandler-EIYSBDHO.js} +4 -4
  27. package/dist/{NumericHandler.unit.spec-PDZ3JNBW.js → NumericHandler.unit.spec-AAWDFOWL.js} +4 -4
  28. package/dist/{SC-UHPEY7DU.js → SC-DVQXOH4W.js} +5 -5
  29. package/dist/{Volcano-AFRI5ZYM.js → Volcano-HWQBAB5H.js} +7 -7
  30. package/dist/{WSIViewer-TFH5MYJZ.js → WSIViewer-S3O5LR5K.js} +4 -4
  31. package/dist/{WsiSamplesPlot-N6APEBQ4.js → WsiSamplesPlot-PP6WMQLP.js} +4 -4
  32. package/dist/{adSandbox-4EZV3GVR.js → adSandbox-FKDPFNDC.js} +4 -4
  33. package/dist/{alphaGenome-TCI42FN6.js → alphaGenome-A5PIFBQE.js} +6 -6
  34. package/dist/{app-GV5UZUTY.js → app-MMYAQ2NW.js} +19 -19
  35. package/dist/{app-N2M2SNHB.js → app-Y7BMGOPO.js} +3 -3
  36. package/dist/app.js +9 -9
  37. package/dist/{bam-OZN2DS2D.js → bam-LY5QNO6L.js} +5 -5
  38. package/dist/{barchart-DU75G5SC.js → barchart-4RK6BP2H.js} +9 -9
  39. package/dist/{barchart.data-NSIIXZEH.js → barchart.data-D43GEIDA.js} +3 -3
  40. package/dist/{barchart.events-JJNTUJD6.js → barchart.events-HZ5SQBWB.js} +9 -9
  41. package/dist/{barchart.integration.spec-IEWEFTPZ.js → barchart.integration.spec-YJRA5NUQ.js} +17 -17
  42. package/dist/{block-RO75RNZQ.js → block-SE6H35TV.js} +24 -24
  43. package/dist/{block.init-FY2LGFGI.js → block.init-5BOM6MCL.js} +4 -4
  44. package/dist/{block.mds.expressionrank-5LCQGU2Y.js → block.mds.expressionrank-XJU43HU2.js} +5 -5
  45. package/dist/{block.mds.geneboxplot-CQOD6R76.js → block.mds.geneboxplot-2AGSRUN6.js} +4 -4
  46. package/dist/{block.mds.junction-OX6IEJB5.js → block.mds.junction-JVICAJE3.js} +10 -10
  47. package/dist/{block.mds.svcnv-BNN5EE4U.js → block.mds.svcnv-VBY3ZURA.js} +17 -17
  48. package/dist/{block.svg-U2NJ53GB.js → block.svg-O2MAOVTS.js} +3 -3
  49. package/dist/{block.tk.aicheck-L25HQPAQ.js → block.tk.aicheck-354HY346.js} +3 -3
  50. package/dist/{block.tk.ase-JHEEVX55.js → block.tk.ase-2YUWHKPB.js} +5 -5
  51. package/dist/{block.tk.bam-A57FP22A.js → block.tk.bam-JDV2LNL3.js} +3 -3
  52. package/dist/{block.tk.bedgraphdot-U2WMKHIA.js → block.tk.bedgraphdot-D7BKBV2F.js} +3 -3
  53. package/dist/{block.tk.bigwig.ui-DUKV3W4Z.js → block.tk.bigwig.ui-KPTQS2JF.js} +3 -3
  54. package/dist/{block.tk.hicstraw-YCNJFHKG.js → block.tk.hicstraw-TELWNXGM.js} +4 -4
  55. package/dist/{block.tk.junction-CA2ZCMGO.js → block.tk.junction-AOVX534X.js} +7 -7
  56. package/dist/{block.tk.junction.textmatrixui-ZVW77ZKH.js → block.tk.junction.textmatrixui-YIHXR75O.js} +4 -4
  57. package/dist/{block.tk.ld-7C4WAB4Z.js → block.tk.ld-7XXMGXLW.js} +6 -6
  58. package/dist/{block.tk.menu-R43SO3ZH.js → block.tk.menu-YTY2F7PA.js} +3 -3
  59. package/dist/{block.tk.pgv-VI4HHAZH.js → block.tk.pgv-N54ETBYI.js} +6 -6
  60. package/dist/{brainImaging-RCTJC5AF.js → brainImaging-GSDBZZHE.js} +5 -5
  61. package/dist/{chat-L7PETE4N.js → chat-TQM2AGCG.js} +4 -4
  62. package/dist/{chunk-K3NVPJQJ.js → chunk-25RIOOMM.js} +12 -12
  63. package/dist/{chunk-75BNAQES.js → chunk-2EO4IS5N.js} +170 -106
  64. package/dist/chunk-2EO4IS5N.js.map +7 -0
  65. package/dist/{chunk-D67OSYCI.js → chunk-2K4FQMFC.js} +4 -4
  66. package/dist/{chunk-T6Q7IITL.js → chunk-33PB57HN.js} +48 -43
  67. package/dist/chunk-33PB57HN.js.map +7 -0
  68. package/dist/{chunk-KB3TW2FN.js → chunk-3B7AALZO.js} +3 -3
  69. package/dist/{chunk-4HCLIQUT.js → chunk-3YP67QCM.js} +2 -2
  70. package/dist/{chunk-KNEWBLKV.js → chunk-4G5DIBW2.js} +3 -3
  71. package/dist/{chunk-5JUDUFIH.js → chunk-4SJSJWEJ.js} +5 -5
  72. package/dist/{chunk-PEEPH6P3.js → chunk-4TXNHHYE.js} +2 -2
  73. package/dist/{chunk-PGE64VT4.js → chunk-53GDUYO7.js} +3 -3
  74. package/dist/{chunk-CREGAMNA.js → chunk-55UVGWSY.js} +5 -5
  75. package/dist/{chunk-4XDLUNTJ.js → chunk-7A4BCYW2.js} +38 -38
  76. package/dist/{chunk-AAPFVWQE.js → chunk-7CMMRQNR.js} +3 -3
  77. package/dist/{chunk-7JHAH2H2.js → chunk-7VR34ZI2.js} +4 -4
  78. package/dist/{chunk-UNTLY4BQ.js → chunk-A7X5STQK.js} +8 -10
  79. package/dist/chunk-A7X5STQK.js.map +7 -0
  80. package/dist/{chunk-AOQ3INTL.js → chunk-AQBGWP7H.js} +2 -2
  81. package/dist/{chunk-OUBHQYCE.js → chunk-B77X5QZM.js} +3 -3
  82. package/dist/{chunk-FLVYM3QM.js → chunk-BBJWY4W3.js} +2 -2
  83. package/dist/{chunk-EP2JLKC4.js → chunk-CLZM6JZP.js} +3 -3
  84. package/dist/{chunk-DJ7KWL2N.js → chunk-D5WT6TIW.js} +4 -4
  85. package/dist/{chunk-L6H6O6ZH.js → chunk-D6352YQT.js} +5 -1
  86. package/dist/{chunk-L6H6O6ZH.js.map → chunk-D6352YQT.js.map} +2 -2
  87. package/dist/{chunk-KJMPZ2CY.js → chunk-DK6QUFW6.js} +5 -5
  88. package/dist/{chunk-5PN24SLJ.js → chunk-ECM7ZJNB.js} +24 -2
  89. package/dist/{chunk-5PN24SLJ.js.map → chunk-ECM7ZJNB.js.map} +2 -2
  90. package/dist/{chunk-ECSHLTXZ.js → chunk-EG6FQ64B.js} +11 -14
  91. package/dist/chunk-EG6FQ64B.js.map +7 -0
  92. package/dist/{chunk-2LFK5JAD.js → chunk-FOEWFXWH.js} +11 -11
  93. package/dist/{chunk-VHQUCKCU.js → chunk-HHB5B55N.js} +10 -10
  94. package/dist/{chunk-UZ4NDMU3.js → chunk-HNGZC2KC.js} +49 -9
  95. package/dist/chunk-HNGZC2KC.js.map +7 -0
  96. package/dist/{chunk-MYNWKXSX.js → chunk-I5RCPDOQ.js} +5 -5
  97. package/dist/{chunk-NJU5XLCY.js → chunk-IFCRZ3ZF.js} +31 -31
  98. package/dist/{chunk-HBN3EZZ6.js → chunk-IMWV7FDX.js} +5 -5
  99. package/dist/{chunk-2FMX2IIF.js → chunk-IOPEUV4K.js} +102 -102
  100. package/dist/{chunk-6PJU2RVQ.js → chunk-IWVUWJD7.js} +5 -5
  101. package/dist/{chunk-V6XCTC64.js → chunk-JGRG5TJU.js} +4 -3
  102. package/dist/{chunk-V6XCTC64.js.map → chunk-JGRG5TJU.js.map} +2 -2
  103. package/dist/{chunk-VEVLTWXQ.js → chunk-JWVXJQ2J.js} +5 -5
  104. package/dist/{chunk-7Q5EVV5Y.js → chunk-K7PMMPJM.js} +2 -2
  105. package/dist/{chunk-2ZIMTMPT.js → chunk-KAQ7D4ZC.js} +8 -8
  106. package/dist/{chunk-YVBJBKZ4.js → chunk-KF6MPY63.js} +3 -3
  107. package/dist/{chunk-HP5TCHJB.js → chunk-KJZ757L4.js} +3 -3
  108. package/dist/{chunk-OLDZF36U.js → chunk-LFMSLWLV.js} +9 -9
  109. package/dist/{chunk-OK7ETRK6.js → chunk-LQJLKAVM.js} +2 -2
  110. package/dist/{chunk-5WL4R2Z3.js → chunk-NI6DJ7TC.js} +6 -6
  111. package/dist/{chunk-KMIG5RCZ.js → chunk-NTLRCEC2.js} +6 -6
  112. package/dist/{chunk-QHV5ICRK.js → chunk-OFI7MMJR.js} +11 -2
  113. package/dist/chunk-OFI7MMJR.js.map +7 -0
  114. package/dist/{chunk-GX4EMXRK.js → chunk-PF7UFVF4.js} +13 -12
  115. package/dist/{chunk-GX4EMXRK.js.map → chunk-PF7UFVF4.js.map} +2 -2
  116. package/dist/{chunk-LWDWR4RS.js → chunk-QLSAPY4Y.js} +3 -3
  117. package/dist/{chunk-WLKUCS2F.js → chunk-R2ZYQLIS.js} +2 -2
  118. package/dist/{chunk-KIDENCOF.js → chunk-SHZVWJLR.js} +3 -3
  119. package/dist/{chunk-TFEYY4TY.js → chunk-TMNCMJHX.js} +2 -2
  120. package/dist/{chunk-ZX66SKUU.js → chunk-TMO22TT3.js} +2 -2
  121. package/dist/{chunk-HCSLUIJ2.js → chunk-UARVZOP5.js} +6 -6
  122. package/dist/{chunk-7NVZXDA6.js → chunk-UFPB3XJJ.js} +2 -2
  123. package/dist/{chunk-YWGQOSWK.js → chunk-V63OBZK7.js} +54 -2
  124. package/dist/chunk-V63OBZK7.js.map +7 -0
  125. package/dist/{chunk-SAUASV5Y.js → chunk-VBVYR6CU.js} +8 -6
  126. package/dist/{chunk-SAUASV5Y.js.map → chunk-VBVYR6CU.js.map} +2 -2
  127. package/dist/{survival-PYFKKF2U.js → chunk-VUNA7RNG.js} +8 -21
  128. package/dist/chunk-VUNA7RNG.js.map +7 -0
  129. package/dist/{chunk-MPJGCKOV.js → chunk-WHSQBVJR.js} +6 -6
  130. package/dist/{chunk-T34JF35T.js → chunk-XEQ65P3X.js} +6 -4
  131. package/dist/chunk-XEQ65P3X.js.map +7 -0
  132. package/dist/{chunk-C2HMVL4G.js → chunk-XJ6QTSRG.js} +2 -2
  133. package/dist/{chunk-FYY5FIB3.js → chunk-XYEEKDS5.js} +9 -9
  134. package/dist/{chunk-SRSC2DTF.js → chunk-YOHHLKWJ.js} +3 -3
  135. package/dist/{chunk-M3SQXLWF.js → chunk-YUJ3DBOU.js} +2 -2
  136. package/dist/{chunk-DXRJ4MWC.js → chunk-Z5FIAOM7.js} +2 -2
  137. package/dist/{chunk-UQ6UJB7J.js → chunk-ZOIQ53ZV.js} +6 -6
  138. package/dist/{chunk-XGOUVSPK.js → chunk-ZZ3OCPZP.js} +2 -2
  139. package/dist/{condition-QDCIAET3.js → condition-FHIGNAZZ.js} +3 -3
  140. package/dist/{controls-I56RP7X7.js → controls-7SZZWGHC.js} +5 -5
  141. package/dist/{controls.config-SPR6WYNE.js → controls.config-JAR5CO2Q.js} +4 -4
  142. package/dist/{correlation-Y7BYZMMU.js → correlation-6ETUKPLF.js} +19 -19
  143. package/dist/{cuminc-JZGQ7RWD.js → cuminc-PFP3NLAB.js} +6 -6
  144. package/dist/{cuminc.integration.spec-GHM3F7GY.js → cuminc.integration.spec-AHEM2QNO.js} +11 -11
  145. package/dist/{customdata.inputui-IC7RRK2J.js → customdata.inputui-UP7D3EHY.js} +3 -3
  146. package/dist/{dataDownload-USVRCLD4.js → dataDownload-2KBS4L7C.js} +3 -3
  147. package/dist/{dataDownload.integration.spec-VR3W4TZV.js → dataDownload.integration.spec-5THAF6NN.js} +11 -11
  148. package/dist/{databrowser.ui-J7SVWP22.js → databrowser.ui-ZVJVR5UY.js} +19 -19
  149. package/dist/{dictionary-243WACB7.js → dictionary-CJQYTJDH.js} +3 -3
  150. package/dist/{e2pca-IICUGAE2.js → e2pca-JNVDL7E5.js} +3 -3
  151. package/dist/{ep-Q2VZIZA4.js → ep-4FL7LGOR.js} +3 -3
  152. package/dist/{expclust.gdc.spec-6IKEUD7J.js → expclust.gdc.spec-6SRZKLOC.js} +11 -11
  153. package/dist/{facet-IB4GGPSF.js → facet-TUJ56Z4R.js} +8 -8
  154. package/dist/{frequencyChart-2OHEWVV2.js → frequencyChart-MCU3CPWJ.js} +12 -12
  155. package/dist/{frequencyChart.integration.spec-3DDPWM6V.js → frequencyChart.integration.spec-OPR2EARJ.js} +11 -11
  156. package/dist/{geneExpClustering-Z33CKIT7.js → geneExpClustering-65FO26VP.js} +7 -7
  157. package/dist/{geneExpression-KGU6RRQ5.js → geneExpression-APHSZAVL.js} +3 -3
  158. package/dist/{geneExpression-UM6SYBNK.js → geneExpression-PSXNOOHM.js} +2 -2
  159. package/dist/{geneORA-YLAOAL77.js → geneORA-7IOSRIP7.js} +5 -5
  160. package/dist/{geneVariant-UIOPHKTW.js → geneVariant-MQTIP7YO.js} +4 -4
  161. package/dist/{geneVariant-AE76UCZ5.js → geneVariant-QKAIN5Z4.js} +3 -3
  162. package/dist/{genefusion.ui-KIIQZVOU.js → genefusion.ui-QHO3QMU2.js} +3 -3
  163. package/dist/{geneset-BR2TTFIO.js → geneset-P23X6XSA.js} +3 -3
  164. package/dist/{genomeBrowser.spec-PMUHGGI7.js → genomeBrowser.spec-UYBPNVXD.js} +11 -11
  165. package/dist/{grin2-JH25NWGJ.js → grin2-EBFVUV4V.js} +3 -3
  166. package/dist/grin2-EBFVUV4V.js.map +7 -0
  167. package/dist/{grin2-ULN4GPMZ.js → grin2-UMG4Z7VP.js} +15 -11
  168. package/dist/grin2-UMG4Z7VP.js.map +7 -0
  169. package/dist/{gsea-VQJ2GIOC.js → gsea-NSD3S6RR.js} +8 -8
  170. package/dist/{hierCluster-3CXJL4PC.js → hierCluster-AUA4XPHW.js} +20 -20
  171. package/dist/{hierCluster-QULTAFXC.js → hierCluster-JBMMEHH5.js} +19 -19
  172. package/dist/{hierCluster.config-7VO7WO5S.js → hierCluster.config-DA3WXFM5.js} +6 -6
  173. package/dist/{hierCluster.integration.spec-EUD3SMTQ.js → hierCluster.integration.spec-JH6F2H5D.js} +15 -15
  174. package/dist/{hierCluster.interactivity-3WD6CIOQ.js → hierCluster.interactivity-JKE3R36K.js} +4 -4
  175. package/dist/{imagePlot-VAO3WIRO.js → imagePlot-4AK3Z3WW.js} +6 -6
  176. package/dist/importPlot-5HCAW4WD.js +8 -0
  177. package/dist/{launch.adhoc-KSUG572Y.js → launch.adhoc-GUFQ2XIQ.js} +8 -8
  178. package/dist/{leftlabel.sample-J76U3ZDF.js → leftlabel.sample-5ZWGA5T6.js} +7 -7
  179. package/dist/{lollipop-FPN5OKIN.js → lollipop-AEKC7JHI.js} +5 -5
  180. package/dist/{maf-46GHM6CQ.js → maf-G376BJSN.js} +3 -3
  181. package/dist/{maftimeline-7S35A433.js → maftimeline-X5IT4H2I.js} +3 -3
  182. package/dist/{matrix-AFPMJMZS.js → matrix-JBV5CNAW.js} +17 -17
  183. package/dist/{matrix-DEZZHAUH.js → matrix-ZCETR53V.js} +17 -17
  184. package/dist/{matrix.cells-IQDQKYGT.js → matrix.cells-LBARMN7P.js} +4 -2
  185. package/dist/{matrix.config-HQFIKOQE.js → matrix.config-LD3DNDCR.js} +5 -5
  186. package/dist/{matrix.controls-6ANJVGJJ.js → matrix.controls-4PXN5YA2.js} +5 -5
  187. package/dist/{matrix.data-HNGZMB3W.js → matrix.data-IAHC7YZG.js} +4 -4
  188. package/dist/{matrix.groups-GAHEIKNF.js → matrix.groups-PB662HQQ.js} +4 -2
  189. package/dist/{matrix.integration.spec-54RYCMS4.js → matrix.integration.spec-VTFQ4VAI.js} +11 -11
  190. package/dist/{matrix.interactivity-UARFZNDK.js → matrix.interactivity-FKEGS6NK.js} +6 -6
  191. package/dist/{matrix.layout-MGKLYQRL.js → matrix.layout-EATVK2AS.js} +4 -4
  192. package/dist/{matrix.renderers-7GZP4NXY.js → matrix.renderers-VUV4SOJW.js} +4 -4
  193. package/dist/{matrix.serieses-PFTDYFQU.js → matrix.serieses-BKBCUAHZ.js} +3 -3
  194. package/dist/{matrix.sort.unit.spec-DCXVSMHM.js → matrix.sort.unit.spec-JUFI6GQC.js} +5 -5
  195. package/dist/{matrix.sorterUi.unit.spec-FPWBPYOF.js → matrix.sorterUi.unit.spec-ASOVESXI.js} +6 -6
  196. package/dist/{mavb-U4V7YBTC.js → mavb-LLDFUAX5.js} +4 -4
  197. package/dist/{mds.fimo-XDN2P73S.js → mds.fimo-JTBK427B.js} +3 -3
  198. package/dist/{mds.samplescatterplot-USWT46U3.js → mds.samplescatterplot-GJJSCOM7.js} +5 -5
  199. package/dist/{mds.survivalplot-5BD3DXUG.js → mds.survivalplot-T3RL3IYY.js} +3 -3
  200. package/dist/{oncomatrix-FWIG5TIS.js → oncomatrix-4VXWTUYK.js} +14 -12
  201. package/dist/oncomatrix-4VXWTUYK.js.map +7 -0
  202. package/dist/{oncomatrix.spec-BVDTKKRK.js → oncomatrix.spec-3EX576XR.js} +11 -11
  203. package/dist/{plot.2dvaf-TTK4UKFW.js → plot.2dvaf-67JGGLJQ.js} +3 -3
  204. package/dist/{plot.app-XSO6GOX3.js → plot.app-ANPEWKOD.js} +7 -7
  205. package/dist/{plot.barplot-RRBASZJK.js → plot.barplot-MXVZ2TY6.js} +3 -3
  206. package/dist/{plot.boxplot-554J63RV.js → plot.boxplot-ZFMLQ37K.js} +3 -3
  207. package/dist/{plot.brainImaging-LNHFCNHN.js → plot.brainImaging-OTU222DM.js} +2 -2
  208. package/dist/{plot.disco-ET53DU6I.js → plot.disco-XAWVIYPT.js} +3 -3
  209. package/dist/{plot.dzi-FAY4IDBH.js → plot.dzi-A4CZVKZK.js} +2 -2
  210. package/dist/{plot.ssgq-6LVEVDUA.js → plot.ssgq-64HDTBKI.js} +4 -4
  211. package/dist/{plot.vaf2cov-FBMPR5FF.js → plot.vaf2cov-5UXGZUB4.js} +3 -3
  212. package/dist/{plot.wsi-FAZ2GC4U.js → plot.wsi-OA5TLP3B.js} +2 -2
  213. package/dist/{polar-PN3M73U4.js → polar-DL6Q37CW.js} +8 -8
  214. package/dist/{profile.spec-23HJPNOW.js → profile.spec-KTT3B7DW.js} +11 -11
  215. package/dist/{profileBarchart-2HGYQMVY.js → profileBarchart-6PSCZ7ZI.js} +8 -8
  216. package/dist/{profileForms-XZ3CCTTS.js → profileForms-BDGKX5V5.js} +8 -8
  217. package/dist/profileForms-BDGKX5V5.js.map +7 -0
  218. package/dist/{profilePlot-CMOV5UJO.js → profilePlot-YVQCOJWD.js} +8 -8
  219. package/dist/{profileRadar-HEUJWMUE.js → profileRadar-AIJKVE5U.js} +8 -8
  220. package/dist/{profileRadarFacility-VYV3YABK.js → profileRadarFacility-SAPQNLNH.js} +8 -8
  221. package/dist/{qualitative-EWCS7A2B.js → qualitative-22WPLCE6.js} +3 -3
  222. package/dist/{qualitative-3MPTNBLV.js → qualitative-JF26GKFF.js} +2 -3
  223. package/dist/qualitative-JF26GKFF.js.map +7 -0
  224. package/dist/{regression-DAKKMYEJ.js → regression-KE2NEZTO.js} +17 -17
  225. package/dist/{regression.inputs-LR6UVO3L.js → regression.inputs-EQBBLL45.js} +17 -17
  226. package/dist/{regression.inputs.term-IWSCQHXD.js → regression.inputs.term-Q2MUIRCA.js} +17 -17
  227. package/dist/{regression.inputs.values.table-Z7SEZIYK.js → regression.inputs.values.table-JKB65GXF.js} +15 -15
  228. package/dist/{regression.integration.spec-AOWZXYSW.js → regression.integration.spec-U2EOFXMQ.js} +11 -11
  229. package/dist/{regression.results-2SOTS4FV.js → regression.results-AIXYMICG.js} +4 -4
  230. package/dist/{regression.spec-5GW2JQ3T.js → regression.spec-76RS5CI7.js} +11 -11
  231. package/dist/{report-CXPBFL3T.js → report-DXNYK72T.js} +7 -7
  232. package/dist/{runChart-5RHOL5PX.js → runChart-CJX7AYJ5.js} +12 -12
  233. package/dist/{runchart.integration.spec-RBHZKFHQ.js → runchart.integration.spec-XNACABPB.js} +11 -11
  234. package/dist/{sampleScatter.spec-3LCQ6ZE6.js → sampleScatter.spec-KWMNDNED.js} +11 -11
  235. package/dist/{sampleView-G3WJW4X7.js → sampleView-ZHPCNUCG.js} +6 -6
  236. package/dist/{samplelst-4E35CBSV.js → samplelst-2FXN3XYN.js} +3 -3
  237. package/dist/{samplematrix-FQ7UG5SX.js → samplematrix-UCFVSCHK.js} +5 -5
  238. package/dist/{scatter-EOULQLG5.js → scatter-LRBVDLZ4.js} +11 -11
  239. package/dist/{scatter.integration.spec-K6VV7BW2.js → scatter.integration.spec-TX6UOEKK.js} +13 -13
  240. package/dist/{selectGenomeWithTklst-VU64XABP.js → selectGenomeWithTklst-TKCOKIFG.js} +4 -4
  241. package/dist/{singleCellPlot-6YIC6OBT.js → singleCellPlot-JA6YIJAC.js} +8 -8
  242. package/dist/{singlecell-EUVDTSKE.js → singlecell-PAF7AW3G.js} +7 -7
  243. package/dist/{singlecell-FJVNGE47.js → singlecell-TJQU5UIX.js} +6 -6
  244. package/dist/{snp-HSQOHVVV.js → snp-EX4HC7CT.js} +3 -3
  245. package/dist/{snplocus-BBWJPSXL.js → snplocus-5EATAXVB.js} +3 -3
  246. package/dist/{spliceevent.a53ss.diagram-BKDYOEWM.js → spliceevent.a53ss.diagram-3LJEFM3T.js} +3 -3
  247. package/dist/{spliceevent.exonskip.diagram-4OAJTUV4.js → spliceevent.exonskip.diagram-UIDVBBKI.js} +4 -4
  248. package/dist/{spliceevent.noeventdiagram-N2YYCIJ2.js → spliceevent.noeventdiagram-MPAPOVLN.js} +3 -3
  249. package/dist/{ssGSEA-JXNQ3EUW.js → ssGSEA-SXUTBVGF.js} +3 -3
  250. package/dist/{summarizeCnvGeneexp-UQKOWAKT.js → summarizeCnvGeneexp-6QDDUQEB.js} +5 -5
  251. package/dist/{summarizeGeneexpSurvival-PBAGB6WI.js → summarizeGeneexpSurvival-DDE3VHQU.js} +5 -5
  252. package/dist/{summarizeMutationDiagnosis-S4XJF4KX.js → summarizeMutationDiagnosis-I53HATRO.js} +5 -5
  253. package/dist/{summarizeMutationSurvival-ZPCP7WOO.js → summarizeMutationSurvival-WDV5B3VT.js} +5 -5
  254. package/dist/{summary-X2ECAZNH.js → summary-ZF4QUXWQ.js} +17 -17
  255. package/dist/{summary.integration.spec-NXVO2Y5N.js → summary.integration.spec-AHGKH2NW.js} +11 -11
  256. package/dist/{summaryInput-4D4GRIAC.js → summaryInput-Z2L247XK.js} +41 -19
  257. package/dist/summaryInput-Z2L247XK.js.map +7 -0
  258. package/dist/{sunburst-FWHUOPXX.js → sunburst-2OKBPJJO.js} +3 -3
  259. package/dist/survival-C22K6HVW.js +41 -0
  260. package/dist/{survival-J3DO4ZJB.js → survival-O7PUZJ4B.js} +3 -3
  261. package/dist/{survival.integration.spec-DDTLUPRC.js → survival.integration.spec-R366JFDL.js} +11 -11
  262. package/dist/{svgraph-2IZJXZWR.js → svgraph-GT6MK7G6.js} +3 -3
  263. package/dist/{svmr-ICVQBOYM.js → svmr-Z67UOQF5.js} +6 -6
  264. package/dist/{table-NK43IVPT.js → table-ZN6GRTTH.js} +5 -5
  265. package/dist/{tk-5Z3PLZZS.js → tk-XCBNAHDB.js} +7 -7
  266. package/dist/{tp.ui-CVOP6ZT2.js → tp.ui-7TY6EZ27.js} +12 -12
  267. package/dist/{tvs.samplelst-QNRO6AOG.js → tvs.samplelst-7GJAMJFA.js} +3 -3
  268. package/dist/{violin-ZDC7MC3B.js → violin-K6OWKYJ4.js} +12 -12
  269. package/dist/{violin.integration.spec-L4IGCNKH.js → violin.integration.spec-IE6W7EQJ.js} +11 -11
  270. package/dist/{violin.interactivity-WKTFEJDE.js → violin.interactivity-PXDYYTJL.js} +10 -10
  271. package/dist/{violin.renderer-2P5RWRJQ.js → violin.renderer-CJEE7JK6.js} +4 -4
  272. package/dist/{vocabulary-UATKQX3V.js → vocabulary-6WFLGIU4.js} +3 -3
  273. package/dist/vocabulary-6WFLGIU4.js.map +7 -0
  274. package/package.json +4 -3
  275. package/dist/chunk-75BNAQES.js.map +0 -7
  276. package/dist/chunk-ECSHLTXZ.js.map +0 -7
  277. package/dist/chunk-QHV5ICRK.js.map +0 -7
  278. package/dist/chunk-T34JF35T.js.map +0 -7
  279. package/dist/chunk-T6Q7IITL.js.map +0 -7
  280. package/dist/chunk-UNTLY4BQ.js.map +0 -7
  281. package/dist/chunk-UZ4NDMU3.js.map +0 -7
  282. package/dist/chunk-YWGQOSWK.js.map +0 -7
  283. package/dist/grin2-JH25NWGJ.js.map +0 -7
  284. package/dist/grin2-ULN4GPMZ.js.map +0 -7
  285. package/dist/importPlot-AHACT2NU.js +0 -8
  286. package/dist/oncomatrix-FWIG5TIS.js.map +0 -7
  287. package/dist/profileForms-XZ3CCTTS.js.map +0 -7
  288. package/dist/qualitative-3MPTNBLV.js.map +0 -7
  289. package/dist/summaryInput-4D4GRIAC.js.map +0 -7
  290. package/dist/survival-PYFKKF2U.js.map +0 -7
  291. /package/dist/{2dmaf-CC7BK3ZP.js.map → 2dmaf-I6WQUYPR.js.map} +0 -0
  292. /package/dist/{AppHeader-AYYXWP5W.js.map → AppHeader-M3UEZL47.js.map} +0 -0
  293. /package/dist/{BoxPlot-PZJAPMVT.js.map → BoxPlot-SQMAIQZM.js.map} +0 -0
  294. /package/dist/{CorrelationVolcano-AHVPEECE.js.map → CorrelationVolcano-HCW6LQRF.js.map} +0 -0
  295. /package/dist/{DifferentialAnalysis-7KNOEZ3M.js.map → DifferentialAnalysis-XQ3SQ6TG.js.map} +0 -0
  296. /package/dist/{Disco-QVQCMWIQ.js.map → Disco-6TM5UG4F.js.map} +0 -0
  297. /package/dist/{Disco.UI-RLXB5FDX.js.map → Disco.UI-JW5ID57Z.js.map} +0 -0
  298. /package/dist/{GB-ZBOWSGUU.js.map → GB-QBKOIRPQ.js.map} +0 -0
  299. /package/dist/{HicApp-CUU7PSFK.js.map → HicApp-CN44ERMV.js.map} +0 -0
  300. /package/dist/{NumBinaryEditor-VFWF63GO.js.map → NumBinaryEditor-PLJWFPEY.js.map} +0 -0
  301. /package/dist/{NumBinaryEditor.unit.spec-WELIN5HR.js.map → NumBinaryEditor.unit.spec-D3CZPMLR.js.map} +0 -0
  302. /package/dist/{NumContEditor-HYKGC3P6.js.map → NumContEditor-2MOK5TRZ.js.map} +0 -0
  303. /package/dist/{NumContEditor.unit.spec-X3UP3MX6.js.map → NumContEditor.unit.spec-2PSEPPJV.js.map} +0 -0
  304. /package/dist/{NumCustomBinEditor-2NMGRTED.js.map → NumCustomBinEditor-J2JAHJTY.js.map} +0 -0
  305. /package/dist/{NumCustomBinEditor.unit.spec-WOJ7XRMJ.js.map → NumCustomBinEditor.unit.spec-HWA7YUM6.js.map} +0 -0
  306. /package/dist/{NumDiscreteEditor-V47ICE55.js.map → NumDiscreteEditor-LZDFD3OQ.js.map} +0 -0
  307. /package/dist/{NumDiscreteEditor.unit.spec-27QLI7IV.js.map → NumDiscreteEditor.unit.spec-FXVIKKJW.js.map} +0 -0
  308. /package/dist/{NumRegularBinEditor-TUZTXFNM.js.map → NumRegularBinEditor-XNGZGF6Y.js.map} +0 -0
  309. /package/dist/{NumRegularBinEditor.unit.spec-LBZBSOIG.js.map → NumRegularBinEditor.unit.spec-OSEXN24D.js.map} +0 -0
  310. /package/dist/{NumSplineEditor-JANVSKM6.js.map → NumSplineEditor-ZT6JHJTK.js.map} +0 -0
  311. /package/dist/{NumSplineEditor.unit.spec-V637HKEB.js.map → NumSplineEditor.unit.spec-6MO42MI6.js.map} +0 -0
  312. /package/dist/{NumericDensity-4GEBEKSB.js.map → NumericDensity-PUN5FXQA.js.map} +0 -0
  313. /package/dist/{NumericDensity.unit.spec-IVPLRVL4.js.map → NumericDensity.unit.spec-I2L3UXFS.js.map} +0 -0
  314. /package/dist/{NumericHandler-GSWU4ZX2.js.map → NumericHandler-EIYSBDHO.js.map} +0 -0
  315. /package/dist/{NumericHandler.unit.spec-PDZ3JNBW.js.map → NumericHandler.unit.spec-AAWDFOWL.js.map} +0 -0
  316. /package/dist/{SC-UHPEY7DU.js.map → SC-DVQXOH4W.js.map} +0 -0
  317. /package/dist/{Volcano-AFRI5ZYM.js.map → Volcano-HWQBAB5H.js.map} +0 -0
  318. /package/dist/{WSIViewer-TFH5MYJZ.js.map → WSIViewer-S3O5LR5K.js.map} +0 -0
  319. /package/dist/{WsiSamplesPlot-N6APEBQ4.js.map → WsiSamplesPlot-PP6WMQLP.js.map} +0 -0
  320. /package/dist/{adSandbox-4EZV3GVR.js.map → adSandbox-FKDPFNDC.js.map} +0 -0
  321. /package/dist/{alphaGenome-TCI42FN6.js.map → alphaGenome-A5PIFBQE.js.map} +0 -0
  322. /package/dist/{app-GV5UZUTY.js.map → app-MMYAQ2NW.js.map} +0 -0
  323. /package/dist/{app-N2M2SNHB.js.map → app-Y7BMGOPO.js.map} +0 -0
  324. /package/dist/{bam-OZN2DS2D.js.map → bam-LY5QNO6L.js.map} +0 -0
  325. /package/dist/{barchart-DU75G5SC.js.map → barchart-4RK6BP2H.js.map} +0 -0
  326. /package/dist/{barchart.data-NSIIXZEH.js.map → barchart.data-D43GEIDA.js.map} +0 -0
  327. /package/dist/{barchart.events-JJNTUJD6.js.map → barchart.events-HZ5SQBWB.js.map} +0 -0
  328. /package/dist/{barchart.integration.spec-IEWEFTPZ.js.map → barchart.integration.spec-YJRA5NUQ.js.map} +0 -0
  329. /package/dist/{block-RO75RNZQ.js.map → block-SE6H35TV.js.map} +0 -0
  330. /package/dist/{block.init-FY2LGFGI.js.map → block.init-5BOM6MCL.js.map} +0 -0
  331. /package/dist/{block.mds.expressionrank-5LCQGU2Y.js.map → block.mds.expressionrank-XJU43HU2.js.map} +0 -0
  332. /package/dist/{block.mds.geneboxplot-CQOD6R76.js.map → block.mds.geneboxplot-2AGSRUN6.js.map} +0 -0
  333. /package/dist/{block.mds.junction-OX6IEJB5.js.map → block.mds.junction-JVICAJE3.js.map} +0 -0
  334. /package/dist/{block.mds.svcnv-BNN5EE4U.js.map → block.mds.svcnv-VBY3ZURA.js.map} +0 -0
  335. /package/dist/{block.svg-U2NJ53GB.js.map → block.svg-O2MAOVTS.js.map} +0 -0
  336. /package/dist/{block.tk.aicheck-L25HQPAQ.js.map → block.tk.aicheck-354HY346.js.map} +0 -0
  337. /package/dist/{block.tk.ase-JHEEVX55.js.map → block.tk.ase-2YUWHKPB.js.map} +0 -0
  338. /package/dist/{block.tk.bam-A57FP22A.js.map → block.tk.bam-JDV2LNL3.js.map} +0 -0
  339. /package/dist/{block.tk.bedgraphdot-U2WMKHIA.js.map → block.tk.bedgraphdot-D7BKBV2F.js.map} +0 -0
  340. /package/dist/{block.tk.bigwig.ui-DUKV3W4Z.js.map → block.tk.bigwig.ui-KPTQS2JF.js.map} +0 -0
  341. /package/dist/{block.tk.hicstraw-YCNJFHKG.js.map → block.tk.hicstraw-TELWNXGM.js.map} +0 -0
  342. /package/dist/{block.tk.junction-CA2ZCMGO.js.map → block.tk.junction-AOVX534X.js.map} +0 -0
  343. /package/dist/{block.tk.junction.textmatrixui-ZVW77ZKH.js.map → block.tk.junction.textmatrixui-YIHXR75O.js.map} +0 -0
  344. /package/dist/{block.tk.ld-7C4WAB4Z.js.map → block.tk.ld-7XXMGXLW.js.map} +0 -0
  345. /package/dist/{block.tk.menu-R43SO3ZH.js.map → block.tk.menu-YTY2F7PA.js.map} +0 -0
  346. /package/dist/{block.tk.pgv-VI4HHAZH.js.map → block.tk.pgv-N54ETBYI.js.map} +0 -0
  347. /package/dist/{brainImaging-RCTJC5AF.js.map → brainImaging-GSDBZZHE.js.map} +0 -0
  348. /package/dist/{chat-L7PETE4N.js.map → chat-TQM2AGCG.js.map} +0 -0
  349. /package/dist/{chunk-K3NVPJQJ.js.map → chunk-25RIOOMM.js.map} +0 -0
  350. /package/dist/{chunk-D67OSYCI.js.map → chunk-2K4FQMFC.js.map} +0 -0
  351. /package/dist/{chunk-KB3TW2FN.js.map → chunk-3B7AALZO.js.map} +0 -0
  352. /package/dist/{chunk-4HCLIQUT.js.map → chunk-3YP67QCM.js.map} +0 -0
  353. /package/dist/{chunk-KNEWBLKV.js.map → chunk-4G5DIBW2.js.map} +0 -0
  354. /package/dist/{chunk-5JUDUFIH.js.map → chunk-4SJSJWEJ.js.map} +0 -0
  355. /package/dist/{chunk-PEEPH6P3.js.map → chunk-4TXNHHYE.js.map} +0 -0
  356. /package/dist/{chunk-PGE64VT4.js.map → chunk-53GDUYO7.js.map} +0 -0
  357. /package/dist/{chunk-CREGAMNA.js.map → chunk-55UVGWSY.js.map} +0 -0
  358. /package/dist/{chunk-4XDLUNTJ.js.map → chunk-7A4BCYW2.js.map} +0 -0
  359. /package/dist/{chunk-AAPFVWQE.js.map → chunk-7CMMRQNR.js.map} +0 -0
  360. /package/dist/{chunk-7JHAH2H2.js.map → chunk-7VR34ZI2.js.map} +0 -0
  361. /package/dist/{chunk-AOQ3INTL.js.map → chunk-AQBGWP7H.js.map} +0 -0
  362. /package/dist/{chunk-OUBHQYCE.js.map → chunk-B77X5QZM.js.map} +0 -0
  363. /package/dist/{chunk-FLVYM3QM.js.map → chunk-BBJWY4W3.js.map} +0 -0
  364. /package/dist/{chunk-EP2JLKC4.js.map → chunk-CLZM6JZP.js.map} +0 -0
  365. /package/dist/{chunk-DJ7KWL2N.js.map → chunk-D5WT6TIW.js.map} +0 -0
  366. /package/dist/{chunk-KJMPZ2CY.js.map → chunk-DK6QUFW6.js.map} +0 -0
  367. /package/dist/{chunk-2LFK5JAD.js.map → chunk-FOEWFXWH.js.map} +0 -0
  368. /package/dist/{chunk-VHQUCKCU.js.map → chunk-HHB5B55N.js.map} +0 -0
  369. /package/dist/{chunk-MYNWKXSX.js.map → chunk-I5RCPDOQ.js.map} +0 -0
  370. /package/dist/{chunk-NJU5XLCY.js.map → chunk-IFCRZ3ZF.js.map} +0 -0
  371. /package/dist/{chunk-HBN3EZZ6.js.map → chunk-IMWV7FDX.js.map} +0 -0
  372. /package/dist/{chunk-2FMX2IIF.js.map → chunk-IOPEUV4K.js.map} +0 -0
  373. /package/dist/{chunk-6PJU2RVQ.js.map → chunk-IWVUWJD7.js.map} +0 -0
  374. /package/dist/{chunk-VEVLTWXQ.js.map → chunk-JWVXJQ2J.js.map} +0 -0
  375. /package/dist/{chunk-7Q5EVV5Y.js.map → chunk-K7PMMPJM.js.map} +0 -0
  376. /package/dist/{chunk-2ZIMTMPT.js.map → chunk-KAQ7D4ZC.js.map} +0 -0
  377. /package/dist/{chunk-YVBJBKZ4.js.map → chunk-KF6MPY63.js.map} +0 -0
  378. /package/dist/{chunk-HP5TCHJB.js.map → chunk-KJZ757L4.js.map} +0 -0
  379. /package/dist/{chunk-OLDZF36U.js.map → chunk-LFMSLWLV.js.map} +0 -0
  380. /package/dist/{chunk-OK7ETRK6.js.map → chunk-LQJLKAVM.js.map} +0 -0
  381. /package/dist/{chunk-5WL4R2Z3.js.map → chunk-NI6DJ7TC.js.map} +0 -0
  382. /package/dist/{chunk-KMIG5RCZ.js.map → chunk-NTLRCEC2.js.map} +0 -0
  383. /package/dist/{chunk-LWDWR4RS.js.map → chunk-QLSAPY4Y.js.map} +0 -0
  384. /package/dist/{chunk-WLKUCS2F.js.map → chunk-R2ZYQLIS.js.map} +0 -0
  385. /package/dist/{chunk-KIDENCOF.js.map → chunk-SHZVWJLR.js.map} +0 -0
  386. /package/dist/{chunk-TFEYY4TY.js.map → chunk-TMNCMJHX.js.map} +0 -0
  387. /package/dist/{chunk-ZX66SKUU.js.map → chunk-TMO22TT3.js.map} +0 -0
  388. /package/dist/{chunk-HCSLUIJ2.js.map → chunk-UARVZOP5.js.map} +0 -0
  389. /package/dist/{chunk-7NVZXDA6.js.map → chunk-UFPB3XJJ.js.map} +0 -0
  390. /package/dist/{chunk-MPJGCKOV.js.map → chunk-WHSQBVJR.js.map} +0 -0
  391. /package/dist/{chunk-C2HMVL4G.js.map → chunk-XJ6QTSRG.js.map} +0 -0
  392. /package/dist/{chunk-FYY5FIB3.js.map → chunk-XYEEKDS5.js.map} +0 -0
  393. /package/dist/{chunk-SRSC2DTF.js.map → chunk-YOHHLKWJ.js.map} +0 -0
  394. /package/dist/{chunk-M3SQXLWF.js.map → chunk-YUJ3DBOU.js.map} +0 -0
  395. /package/dist/{chunk-DXRJ4MWC.js.map → chunk-Z5FIAOM7.js.map} +0 -0
  396. /package/dist/{chunk-UQ6UJB7J.js.map → chunk-ZOIQ53ZV.js.map} +0 -0
  397. /package/dist/{chunk-XGOUVSPK.js.map → chunk-ZZ3OCPZP.js.map} +0 -0
  398. /package/dist/{condition-QDCIAET3.js.map → condition-FHIGNAZZ.js.map} +0 -0
  399. /package/dist/{controls-I56RP7X7.js.map → controls-7SZZWGHC.js.map} +0 -0
  400. /package/dist/{controls.config-SPR6WYNE.js.map → controls.config-JAR5CO2Q.js.map} +0 -0
  401. /package/dist/{correlation-Y7BYZMMU.js.map → correlation-6ETUKPLF.js.map} +0 -0
  402. /package/dist/{cuminc-JZGQ7RWD.js.map → cuminc-PFP3NLAB.js.map} +0 -0
  403. /package/dist/{cuminc.integration.spec-GHM3F7GY.js.map → cuminc.integration.spec-AHEM2QNO.js.map} +0 -0
  404. /package/dist/{customdata.inputui-IC7RRK2J.js.map → customdata.inputui-UP7D3EHY.js.map} +0 -0
  405. /package/dist/{dataDownload-USVRCLD4.js.map → dataDownload-2KBS4L7C.js.map} +0 -0
  406. /package/dist/{dataDownload.integration.spec-VR3W4TZV.js.map → dataDownload.integration.spec-5THAF6NN.js.map} +0 -0
  407. /package/dist/{databrowser.ui-J7SVWP22.js.map → databrowser.ui-ZVJVR5UY.js.map} +0 -0
  408. /package/dist/{dictionary-243WACB7.js.map → dictionary-CJQYTJDH.js.map} +0 -0
  409. /package/dist/{e2pca-IICUGAE2.js.map → e2pca-JNVDL7E5.js.map} +0 -0
  410. /package/dist/{ep-Q2VZIZA4.js.map → ep-4FL7LGOR.js.map} +0 -0
  411. /package/dist/{expclust.gdc.spec-6IKEUD7J.js.map → expclust.gdc.spec-6SRZKLOC.js.map} +0 -0
  412. /package/dist/{facet-IB4GGPSF.js.map → facet-TUJ56Z4R.js.map} +0 -0
  413. /package/dist/{frequencyChart-2OHEWVV2.js.map → frequencyChart-MCU3CPWJ.js.map} +0 -0
  414. /package/dist/{frequencyChart.integration.spec-3DDPWM6V.js.map → frequencyChart.integration.spec-OPR2EARJ.js.map} +0 -0
  415. /package/dist/{geneExpClustering-Z33CKIT7.js.map → geneExpClustering-65FO26VP.js.map} +0 -0
  416. /package/dist/{geneExpression-KGU6RRQ5.js.map → geneExpression-APHSZAVL.js.map} +0 -0
  417. /package/dist/{geneExpression-UM6SYBNK.js.map → geneExpression-PSXNOOHM.js.map} +0 -0
  418. /package/dist/{geneORA-YLAOAL77.js.map → geneORA-7IOSRIP7.js.map} +0 -0
  419. /package/dist/{geneVariant-AE76UCZ5.js.map → geneVariant-MQTIP7YO.js.map} +0 -0
  420. /package/dist/{geneVariant-UIOPHKTW.js.map → geneVariant-QKAIN5Z4.js.map} +0 -0
  421. /package/dist/{genefusion.ui-KIIQZVOU.js.map → genefusion.ui-QHO3QMU2.js.map} +0 -0
  422. /package/dist/{geneset-BR2TTFIO.js.map → geneset-P23X6XSA.js.map} +0 -0
  423. /package/dist/{genomeBrowser.spec-PMUHGGI7.js.map → genomeBrowser.spec-UYBPNVXD.js.map} +0 -0
  424. /package/dist/{gsea-VQJ2GIOC.js.map → gsea-NSD3S6RR.js.map} +0 -0
  425. /package/dist/{hierCluster-3CXJL4PC.js.map → hierCluster-AUA4XPHW.js.map} +0 -0
  426. /package/dist/{hierCluster-QULTAFXC.js.map → hierCluster-JBMMEHH5.js.map} +0 -0
  427. /package/dist/{hierCluster.config-7VO7WO5S.js.map → hierCluster.config-DA3WXFM5.js.map} +0 -0
  428. /package/dist/{hierCluster.integration.spec-EUD3SMTQ.js.map → hierCluster.integration.spec-JH6F2H5D.js.map} +0 -0
  429. /package/dist/{hierCluster.interactivity-3WD6CIOQ.js.map → hierCluster.interactivity-JKE3R36K.js.map} +0 -0
  430. /package/dist/{imagePlot-VAO3WIRO.js.map → imagePlot-4AK3Z3WW.js.map} +0 -0
  431. /package/dist/{importPlot-AHACT2NU.js.map → importPlot-5HCAW4WD.js.map} +0 -0
  432. /package/dist/{launch.adhoc-KSUG572Y.js.map → launch.adhoc-GUFQ2XIQ.js.map} +0 -0
  433. /package/dist/{leftlabel.sample-J76U3ZDF.js.map → leftlabel.sample-5ZWGA5T6.js.map} +0 -0
  434. /package/dist/{lollipop-FPN5OKIN.js.map → lollipop-AEKC7JHI.js.map} +0 -0
  435. /package/dist/{maf-46GHM6CQ.js.map → maf-G376BJSN.js.map} +0 -0
  436. /package/dist/{maftimeline-7S35A433.js.map → maftimeline-X5IT4H2I.js.map} +0 -0
  437. /package/dist/{matrix-AFPMJMZS.js.map → matrix-JBV5CNAW.js.map} +0 -0
  438. /package/dist/{matrix-DEZZHAUH.js.map → matrix-ZCETR53V.js.map} +0 -0
  439. /package/dist/{matrix.cells-IQDQKYGT.js.map → matrix.cells-LBARMN7P.js.map} +0 -0
  440. /package/dist/{matrix.config-HQFIKOQE.js.map → matrix.config-LD3DNDCR.js.map} +0 -0
  441. /package/dist/{matrix.controls-6ANJVGJJ.js.map → matrix.controls-4PXN5YA2.js.map} +0 -0
  442. /package/dist/{matrix.data-HNGZMB3W.js.map → matrix.data-IAHC7YZG.js.map} +0 -0
  443. /package/dist/{matrix.groups-GAHEIKNF.js.map → matrix.groups-PB662HQQ.js.map} +0 -0
  444. /package/dist/{matrix.integration.spec-54RYCMS4.js.map → matrix.integration.spec-VTFQ4VAI.js.map} +0 -0
  445. /package/dist/{matrix.interactivity-UARFZNDK.js.map → matrix.interactivity-FKEGS6NK.js.map} +0 -0
  446. /package/dist/{matrix.layout-MGKLYQRL.js.map → matrix.layout-EATVK2AS.js.map} +0 -0
  447. /package/dist/{matrix.renderers-7GZP4NXY.js.map → matrix.renderers-VUV4SOJW.js.map} +0 -0
  448. /package/dist/{matrix.serieses-PFTDYFQU.js.map → matrix.serieses-BKBCUAHZ.js.map} +0 -0
  449. /package/dist/{matrix.sort.unit.spec-DCXVSMHM.js.map → matrix.sort.unit.spec-JUFI6GQC.js.map} +0 -0
  450. /package/dist/{matrix.sorterUi.unit.spec-FPWBPYOF.js.map → matrix.sorterUi.unit.spec-ASOVESXI.js.map} +0 -0
  451. /package/dist/{mavb-U4V7YBTC.js.map → mavb-LLDFUAX5.js.map} +0 -0
  452. /package/dist/{mds.fimo-XDN2P73S.js.map → mds.fimo-JTBK427B.js.map} +0 -0
  453. /package/dist/{mds.samplescatterplot-USWT46U3.js.map → mds.samplescatterplot-GJJSCOM7.js.map} +0 -0
  454. /package/dist/{mds.survivalplot-5BD3DXUG.js.map → mds.survivalplot-T3RL3IYY.js.map} +0 -0
  455. /package/dist/{oncomatrix.spec-BVDTKKRK.js.map → oncomatrix.spec-3EX576XR.js.map} +0 -0
  456. /package/dist/{plot.2dvaf-TTK4UKFW.js.map → plot.2dvaf-67JGGLJQ.js.map} +0 -0
  457. /package/dist/{plot.app-XSO6GOX3.js.map → plot.app-ANPEWKOD.js.map} +0 -0
  458. /package/dist/{plot.barplot-RRBASZJK.js.map → plot.barplot-MXVZ2TY6.js.map} +0 -0
  459. /package/dist/{plot.boxplot-554J63RV.js.map → plot.boxplot-ZFMLQ37K.js.map} +0 -0
  460. /package/dist/{plot.brainImaging-LNHFCNHN.js.map → plot.brainImaging-OTU222DM.js.map} +0 -0
  461. /package/dist/{plot.disco-ET53DU6I.js.map → plot.disco-XAWVIYPT.js.map} +0 -0
  462. /package/dist/{plot.dzi-FAY4IDBH.js.map → plot.dzi-A4CZVKZK.js.map} +0 -0
  463. /package/dist/{plot.ssgq-6LVEVDUA.js.map → plot.ssgq-64HDTBKI.js.map} +0 -0
  464. /package/dist/{plot.vaf2cov-FBMPR5FF.js.map → plot.vaf2cov-5UXGZUB4.js.map} +0 -0
  465. /package/dist/{plot.wsi-FAZ2GC4U.js.map → plot.wsi-OA5TLP3B.js.map} +0 -0
  466. /package/dist/{polar-PN3M73U4.js.map → polar-DL6Q37CW.js.map} +0 -0
  467. /package/dist/{profile.spec-23HJPNOW.js.map → profile.spec-KTT3B7DW.js.map} +0 -0
  468. /package/dist/{profileBarchart-2HGYQMVY.js.map → profileBarchart-6PSCZ7ZI.js.map} +0 -0
  469. /package/dist/{profilePlot-CMOV5UJO.js.map → profilePlot-YVQCOJWD.js.map} +0 -0
  470. /package/dist/{profileRadar-HEUJWMUE.js.map → profileRadar-AIJKVE5U.js.map} +0 -0
  471. /package/dist/{profileRadarFacility-VYV3YABK.js.map → profileRadarFacility-SAPQNLNH.js.map} +0 -0
  472. /package/dist/{qualitative-EWCS7A2B.js.map → qualitative-22WPLCE6.js.map} +0 -0
  473. /package/dist/{regression-DAKKMYEJ.js.map → regression-KE2NEZTO.js.map} +0 -0
  474. /package/dist/{regression.inputs-LR6UVO3L.js.map → regression.inputs-EQBBLL45.js.map} +0 -0
  475. /package/dist/{regression.inputs.term-IWSCQHXD.js.map → regression.inputs.term-Q2MUIRCA.js.map} +0 -0
  476. /package/dist/{regression.inputs.values.table-Z7SEZIYK.js.map → regression.inputs.values.table-JKB65GXF.js.map} +0 -0
  477. /package/dist/{regression.integration.spec-AOWZXYSW.js.map → regression.integration.spec-U2EOFXMQ.js.map} +0 -0
  478. /package/dist/{regression.results-2SOTS4FV.js.map → regression.results-AIXYMICG.js.map} +0 -0
  479. /package/dist/{regression.spec-5GW2JQ3T.js.map → regression.spec-76RS5CI7.js.map} +0 -0
  480. /package/dist/{report-CXPBFL3T.js.map → report-DXNYK72T.js.map} +0 -0
  481. /package/dist/{runChart-5RHOL5PX.js.map → runChart-CJX7AYJ5.js.map} +0 -0
  482. /package/dist/{runchart.integration.spec-RBHZKFHQ.js.map → runchart.integration.spec-XNACABPB.js.map} +0 -0
  483. /package/dist/{sampleScatter.spec-3LCQ6ZE6.js.map → sampleScatter.spec-KWMNDNED.js.map} +0 -0
  484. /package/dist/{sampleView-G3WJW4X7.js.map → sampleView-ZHPCNUCG.js.map} +0 -0
  485. /package/dist/{samplelst-4E35CBSV.js.map → samplelst-2FXN3XYN.js.map} +0 -0
  486. /package/dist/{samplematrix-FQ7UG5SX.js.map → samplematrix-UCFVSCHK.js.map} +0 -0
  487. /package/dist/{scatter-EOULQLG5.js.map → scatter-LRBVDLZ4.js.map} +0 -0
  488. /package/dist/{scatter.integration.spec-K6VV7BW2.js.map → scatter.integration.spec-TX6UOEKK.js.map} +0 -0
  489. /package/dist/{selectGenomeWithTklst-VU64XABP.js.map → selectGenomeWithTklst-TKCOKIFG.js.map} +0 -0
  490. /package/dist/{singleCellPlot-6YIC6OBT.js.map → singleCellPlot-JA6YIJAC.js.map} +0 -0
  491. /package/dist/{singlecell-EUVDTSKE.js.map → singlecell-PAF7AW3G.js.map} +0 -0
  492. /package/dist/{singlecell-FJVNGE47.js.map → singlecell-TJQU5UIX.js.map} +0 -0
  493. /package/dist/{snp-HSQOHVVV.js.map → snp-EX4HC7CT.js.map} +0 -0
  494. /package/dist/{snplocus-BBWJPSXL.js.map → snplocus-5EATAXVB.js.map} +0 -0
  495. /package/dist/{spliceevent.a53ss.diagram-BKDYOEWM.js.map → spliceevent.a53ss.diagram-3LJEFM3T.js.map} +0 -0
  496. /package/dist/{spliceevent.exonskip.diagram-4OAJTUV4.js.map → spliceevent.exonskip.diagram-UIDVBBKI.js.map} +0 -0
  497. /package/dist/{spliceevent.noeventdiagram-N2YYCIJ2.js.map → spliceevent.noeventdiagram-MPAPOVLN.js.map} +0 -0
  498. /package/dist/{ssGSEA-JXNQ3EUW.js.map → ssGSEA-SXUTBVGF.js.map} +0 -0
  499. /package/dist/{summarizeCnvGeneexp-UQKOWAKT.js.map → summarizeCnvGeneexp-6QDDUQEB.js.map} +0 -0
  500. /package/dist/{summarizeGeneexpSurvival-PBAGB6WI.js.map → summarizeGeneexpSurvival-DDE3VHQU.js.map} +0 -0
  501. /package/dist/{summarizeMutationDiagnosis-S4XJF4KX.js.map → summarizeMutationDiagnosis-I53HATRO.js.map} +0 -0
  502. /package/dist/{summarizeMutationSurvival-ZPCP7WOO.js.map → summarizeMutationSurvival-WDV5B3VT.js.map} +0 -0
  503. /package/dist/{summary-X2ECAZNH.js.map → summary-ZF4QUXWQ.js.map} +0 -0
  504. /package/dist/{summary.integration.spec-NXVO2Y5N.js.map → summary.integration.spec-AHGKH2NW.js.map} +0 -0
  505. /package/dist/{sunburst-FWHUOPXX.js.map → sunburst-2OKBPJJO.js.map} +0 -0
  506. /package/dist/{tk-5Z3PLZZS.js.map → survival-C22K6HVW.js.map} +0 -0
  507. /package/dist/{survival-J3DO4ZJB.js.map → survival-O7PUZJ4B.js.map} +0 -0
  508. /package/dist/{survival.integration.spec-DDTLUPRC.js.map → survival.integration.spec-R366JFDL.js.map} +0 -0
  509. /package/dist/{svgraph-2IZJXZWR.js.map → svgraph-GT6MK7G6.js.map} +0 -0
  510. /package/dist/{svmr-ICVQBOYM.js.map → svmr-Z67UOQF5.js.map} +0 -0
  511. /package/dist/{table-NK43IVPT.js.map → table-ZN6GRTTH.js.map} +0 -0
  512. /package/dist/{violin-ZDC7MC3B.js.map → tk-XCBNAHDB.js.map} +0 -0
  513. /package/dist/{tp.ui-CVOP6ZT2.js.map → tp.ui-7TY6EZ27.js.map} +0 -0
  514. /package/dist/{tvs.samplelst-QNRO6AOG.js.map → tvs.samplelst-7GJAMJFA.js.map} +0 -0
  515. /package/dist/{violin.interactivity-WKTFEJDE.js.map → violin-K6OWKYJ4.js.map} +0 -0
  516. /package/dist/{violin.integration.spec-L4IGCNKH.js.map → violin.integration.spec-IE6W7EQJ.js.map} +0 -0
  517. /package/dist/{violin.renderer-2P5RWRJQ.js.map → violin.interactivity-PXDYYTJL.js.map} +0 -0
  518. /package/dist/{vocabulary-UATKQX3V.js.map → violin.renderer-CJEE7JK6.js.map} +0 -0
@@ -8,9 +8,9 @@ import {
8
8
  renderSandboxFormDiv,
9
9
  sayerror,
10
10
  to_svg
11
- } from "./chunk-75BNAQES.js";
11
+ } from "./chunk-2EO4IS5N.js";
12
12
  import "./chunk-HJ6L54YS.js";
13
- import "./chunk-L6H6O6ZH.js";
13
+ import "./chunk-D6352YQT.js";
14
14
  import "./chunk-GS2VLJGG.js";
15
15
  import {
16
16
  mclass,
@@ -1361,4 +1361,4 @@ export {
1361
1361
  d2mafparseinput,
1362
1362
  d2mafui
1363
1363
  };
1364
- //# sourceMappingURL=2dmaf-CC7BK3ZP.js.map
1364
+ //# sourceMappingURL=2dmaf-I6WQUYPR.js.map
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  PlotBase
3
- } from "./chunk-FLVYM3QM.js";
3
+ } from "./chunk-BBJWY4W3.js";
4
4
  import {
5
5
  filterInit,
6
6
  getNormalRoot,
7
7
  renderTable,
8
8
  sayerror
9
- } from "./chunk-75BNAQES.js";
9
+ } from "./chunk-2EO4IS5N.js";
10
10
  import "./chunk-HJ6L54YS.js";
11
11
  import {
12
12
  dofetch2,
13
13
  dofetch3
14
- } from "./chunk-L6H6O6ZH.js";
14
+ } from "./chunk-D6352YQT.js";
15
15
  import "./chunk-GS2VLJGG.js";
16
16
  import {
17
17
  getColors
@@ -286,7 +286,7 @@ var AIProjectAdminInteractions = class {
286
286
  );
287
287
  images = response.images;
288
288
  }
289
- const wsiViewer = await import("./plot.wsi-FAZ2GC4U.js");
289
+ const wsiViewer = await import("./plot.wsi-OA5TLP3B.js");
290
290
  wsiViewer.default(this.dslabel, holder, { name: this.genome }, null, config.settings.project.id, images, true);
291
291
  }
292
292
  async appDispatchEdit(settings, config = {}) {
@@ -444,15 +444,89 @@ var SelectorTableRender = class {
444
444
  }
445
445
  };
446
446
 
447
+ // plots/aiProjectAdmin/view/UsersRender.ts
448
+ var UsersRender = class {
449
+ constructor(dom, users = []) {
450
+ this.dom = dom;
451
+ this.users = users.slice();
452
+ }
453
+ render() {
454
+ const container = this.dom.holder.append("div").attr("id", "sjpp-users-render").attr("class", "sjpp-deletable-ai-prjt-admin-div").style("padding", "10px");
455
+ const inputRow = container.append("div").attr("class", "sjpp-users-input-row").style("margin-bottom", "10px");
456
+ const input = inputRow.append("input").attr("type", "text").attr("placeholder", "user@example.com").attr("id", "sjpp-user-email-input").style("margin-right", "8px").style("width", "300px");
457
+ const addBtn = inputRow.append("div").text("Add").classed("sja_menuoption", true).style("display", "inline-block").property("disabled", true).on("click", () => {
458
+ const email = input.property("value").trim();
459
+ const showError = (msg) => {
460
+ sayerror(this.dom.errorDiv, msg);
461
+ setTimeout(() => this.dom.errorDiv.selectAll("*").remove(), 3e3);
462
+ };
463
+ if (email.length === 0) {
464
+ return showError("Email cannot be empty");
465
+ }
466
+ const emailRe = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
467
+ if (!emailRe.test(email)) {
468
+ return showError("Invalid email address");
469
+ }
470
+ if (this.users.includes(email)) {
471
+ return showError("Email already added");
472
+ }
473
+ this.users.push(email);
474
+ input.property("value", "");
475
+ addBtn.property("disabled", true);
476
+ this.renderTableArea(container);
477
+ });
478
+ input.on("input", () => {
479
+ addBtn.property("disabled", input.property("value").trim().length === 0);
480
+ });
481
+ this.renderTableArea(container);
482
+ }
483
+ renderTableArea(container) {
484
+ container.select(".sjpp-users-table-area").remove();
485
+ const tableDiv = container.append("div").attr("class", "sjpp-users-table-area").style("padding", "6px 0");
486
+ if (!this.users.length) {
487
+ tableDiv.append("div").text("No users added yet.").style("color", "#666");
488
+ return;
489
+ }
490
+ const columns = [{ label: "Email", sortable: true }];
491
+ const columnButtons = [
492
+ {
493
+ text: "\xD7",
494
+ class: "sja_menuoption",
495
+ callback: (_, idx) => {
496
+ this.users.splice(idx, 1);
497
+ container.select(".sjpp-users-table-area").remove();
498
+ this.renderTableArea(container);
499
+ }
500
+ }
501
+ ];
502
+ renderTable({
503
+ div: tableDiv,
504
+ rows: this.users.map((u) => [{ value: u }]),
505
+ columns,
506
+ columnButtons,
507
+ singleMode: false,
508
+ striped: false,
509
+ showLines: false,
510
+ resize: true
511
+ });
512
+ tableDiv.selectAll(".sja_menuoption").html("\xD7<div></div>");
513
+ }
514
+ };
515
+
447
516
  // plots/aiProjectAdmin/view/CreateProjectRender.ts
448
517
  var CreateProjectRender = class {
449
518
  constructor(dom, app, interactions) {
450
519
  dom.holder.style("padding", "10px 20px").attr("class", "sjpp-deletable-ai-prjt-admin-div");
520
+ const filterDiv = dom.holder.append("div").attr("id", "sjpp-ai-prjt-admin-filter-div");
521
+ const wrapper = dom.holder.append("div").attr("id", "sjpp-ai-prjt-admin-classes-users-wrapper").style("display", "flex").style("gap", "20px").style("align-items", "flex-start").style("padding", "20px 0px");
522
+ const left = wrapper.append("div").attr("id", "sjpp-ai-prjt-admin-classes-table").style("flex", "0 1 auto");
523
+ const right = wrapper.append("div").attr("id", "sjpp-ai-prjt-admin-users").style("width", "320px").style("margin-left", "8px");
451
524
  this.dom = {
452
525
  holder: dom.holder,
453
526
  errorDiv: dom.errorDiv,
454
- filterDiv: dom.holder.append("div").attr("id", "sjpp-ai-prjt-admin-filter-div"),
455
- classDiv: dom.holder.append("div").attr("id", "sjpp-ai-prjt-admin-classes-table").style("padding", "20px 0px")
527
+ filterDiv,
528
+ classDiv: left,
529
+ usersDiv: right
456
530
  };
457
531
  this.app = app;
458
532
  this.interactions = interactions;
@@ -461,6 +535,8 @@ var CreateProjectRender = class {
461
535
  render() {
462
536
  this.renderFilter();
463
537
  this.classesTable = new ClassesTableRender(this.dom.classDiv);
538
+ this.usersRender = new UsersRender({ holder: this.dom.usersDiv, errorDiv: this.dom.errorDiv }, []);
539
+ this.usersRender.render();
464
540
  this.renderApplyBtn();
465
541
  }
466
542
  renderFilter() {
@@ -485,12 +561,18 @@ var CreateProjectRender = class {
485
561
  alert("No images match your filter criteria.");
486
562
  return;
487
563
  }
564
+ if (!this.usersRender || !Array.isArray(this.usersRender.users) || this.usersRender.users.length === 0) {
565
+ alert("Please add at least one user.");
566
+ btn.attr("disabled", null);
567
+ return;
568
+ }
488
569
  await this.interactions.addProject({
489
570
  project: {
490
571
  filter: this.filter,
491
572
  classes: this.classesTable.rows.map((row, i) => {
492
573
  return { label: row[1].value, color: row[2].color, key_shortcut: `Digit${i + 1}` };
493
- })
574
+ }),
575
+ users: this.usersRender.users
494
576
  }
495
577
  });
496
578
  this.dom.holder.selectAll("*").remove();
@@ -596,7 +678,7 @@ var AIProjectAdmin = class extends PlotBase {
596
678
  config: { settings: { project: { id: existingProject.id } } }
597
679
  });
598
680
  }
599
- this.interactions.launchViewer(this.dom.holder, []);
681
+ await this.interactions.launchViewer(this.dom.holder, []);
600
682
  }
601
683
  }
602
684
  };
@@ -621,4 +703,4 @@ export {
621
703
  componentInit,
622
704
  getPlotConfig
623
705
  };
624
- //# sourceMappingURL=AIProjectAdmin-PH4FM5SP.js.map
706
+ //# sourceMappingURL=AIProjectAdmin-VQ4JD75C.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 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/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", "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//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'\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", "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 { filterInit, getNormalRoot } from '#filter'\nimport { ClassesTableRender } from './ClassesTableRender'\nimport type { Elem } from '../../../types/d3'\n// import { InvalidDataUI, sayerror } from '#dom'\nimport type { AIProjectAdminInteractions } from '../interactions/AIProjectAdminInteractions'\nimport { SelectorTableRender } from './SelectorTableRender'\n\nexport class CreateProjectRender {\n\tdom: {\n\t\tholder: Elem\n\t\terrorDiv: Elem\n\t\tfilterDiv: Elem\n\t\tclassDiv: Elem\n\t}\n\tapp: any\n\tinteractions: AIProjectAdminInteractions\n\tfilter: any\n\tclassesTable?: ClassesTableRender\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\tthis.dom = {\n\t\t\tholder: dom.holder,\n\t\t\terrorDiv: dom.errorDiv,\n\t\t\tfilterDiv: dom.holder.append('div').attr('id', 'sjpp-ai-prjt-admin-filter-div'),\n\t\t\tclassDiv: dom.holder.append('div').attr('id', 'sjpp-ai-prjt-admin-classes-table').style('padding', '20px 0px')\n\t\t}\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\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\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}\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\tthis.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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",
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", "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//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'\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", "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// container\n\t\tconst container = this.dom.holder\n\t\t\t.append('div')\n\t\t\t.attr('id', 'sjpp-users-render')\n\t\t\t.attr('class', 'sjpp-deletable-ai-prjt-admin-div')\n\t\t\t.style('padding', '10px')\n\n\t\tconst inputRow = container.append('div').attr('class', 'sjpp-users-input-row').style('margin-bottom', '10px')\n\n\t\tconst input = inputRow\n\t\t\t.append('input')\n\t\t\t.attr('type', 'text')\n\t\t\t.attr('placeholder', 'user@example.com')\n\t\t\t.attr('id', 'sjpp-user-email-input')\n\t\t\t.style('margin-right', '8px')\n\t\t\t.style('width', '300px')\n\n\t\tconst addBtn = inputRow\n\t\t\t.append('div')\n\t\t\t.text('Add')\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', () => {\n\t\t\t\tconst email = input.property('value').trim()\n\t\t\t\tconst showError = (msg: string) => {\n\t\t\t\t\tsayerror(this.dom.errorDiv, msg)\n\t\t\t\t\t// clear after 3s\n\t\t\t\t\tsetTimeout(() => this.dom.errorDiv.selectAll('*').remove(), 3000)\n\t\t\t\t}\n\n\t\t\t\tif (email.length === 0) {\n\t\t\t\t\treturn showError('Email cannot be empty')\n\t\t\t\t}\n\n\t\t\t\tconst emailRe = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$/\n\n\t\t\t\tif (!emailRe.test(email)) {\n\t\t\t\t\treturn showError('Invalid email address')\n\t\t\t\t}\n\n\t\t\t\tif (this.users.includes(email)) {\n\t\t\t\t\treturn showError('Email already added')\n\t\t\t\t}\n\n\t\t\t\tthis.users.push(email)\n\t\t\t\tinput.property('value', '')\n\t\t\t\taddBtn.property('disabled', true)\n\t\t\t\tthis.renderTableArea(container)\n\t\t\t})\n\n\t\tinput.on('input', () => {\n\t\t\taddBtn.property('disabled', input.property('value').trim().length === 0)\n\t\t})\n\n\t\tthis.renderTableArea(container)\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'\n// import { InvalidDataUI, sayerror } from '#dom'\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\n\t\t\t\tif (!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,34 +1,34 @@
1
1
  import {
2
2
  makeButton,
3
3
  openSandbox
4
- } from "./chunk-EP2JLKC4.js";
4
+ } from "./chunk-CLZM6JZP.js";
5
5
  import {
6
6
  get_tklst
7
- } from "./chunk-NJU5XLCY.js";
8
- import "./chunk-2ZIMTMPT.js";
9
- import "./chunk-DXRJ4MWC.js";
7
+ } from "./chunk-IFCRZ3ZF.js";
8
+ import "./chunk-KAQ7D4ZC.js";
9
+ import "./chunk-Z5FIAOM7.js";
10
10
  import "./chunk-PRZWSBMA.js";
11
11
  import "./chunk-MKAF2BHB.js";
12
12
  import {
13
13
  urlmap_default
14
14
  } from "./chunk-RS3G3HE7.js";
15
- import "./chunk-AOQ3INTL.js";
15
+ import "./chunk-AQBGWP7H.js";
16
16
  import {
17
17
  block_init_default
18
- } from "./chunk-VEVLTWXQ.js";
18
+ } from "./chunk-JWVXJQ2J.js";
19
19
  import {
20
20
  InputSearch,
21
21
  first_genetrack_tolist,
22
22
  newSandboxDiv,
23
23
  sayerror,
24
24
  throwMsgWithFilePathAndFnName
25
- } from "./chunk-75BNAQES.js";
25
+ } from "./chunk-2EO4IS5N.js";
26
26
  import {
27
27
  string2pos
28
28
  } from "./chunk-HJ6L54YS.js";
29
29
  import {
30
30
  dofetch3
31
- } from "./chunk-L6H6O6ZH.js";
31
+ } from "./chunk-D6352YQT.js";
32
32
  import "./chunk-GS2VLJGG.js";
33
33
  import {
34
34
  defaultcolor
@@ -211,7 +211,7 @@ async function findgene2paint(str, app, genomename, jwt) {
211
211
  debugmode: app.debugmode
212
212
  };
213
213
  first_genetrack_tolist(g, par2.tklst);
214
- import("./block-RO75RNZQ.js").then((b) => new b.Block(par2)).catch((err) => {
214
+ import("./block-SE6H35TV.js").then((b) => new b.Block(par2)).catch((err) => {
215
215
  app.error0(err);
216
216
  });
217
217
  return;
@@ -797,7 +797,7 @@ var AppHeader = class _AppHeader {
797
797
  debugmode: app.debugmode
798
798
  };
799
799
  first_genetrack_tolist(g, par.tklst);
800
- import("./block-RO75RNZQ.js").then((b) => new b.Block(par));
800
+ import("./block-SE6H35TV.js").then((b) => new b.Block(par));
801
801
  app.drawer.dispatch({ type: "is_apps_btn_active", value: false });
802
802
  });
803
803
  return g_browser_btn;
@@ -810,4 +810,4 @@ var AppHeader = class _AppHeader {
810
810
  export {
811
811
  AppHeader
812
812
  };
813
- //# sourceMappingURL=AppHeader-AYYXWP5W.js.map
813
+ //# sourceMappingURL=AppHeader-M3UEZL47.js.map
@@ -4,17 +4,17 @@ import {
4
4
  componentInit,
5
5
  getDefaultBoxplotSettings,
6
6
  getPlotConfig
7
- } from "./chunk-6PJU2RVQ.js";
8
- import "./chunk-UQ6UJB7J.js";
9
- import "./chunk-2FMX2IIF.js";
7
+ } from "./chunk-IWVUWJD7.js";
8
+ import "./chunk-ZOIQ53ZV.js";
9
+ import "./chunk-IOPEUV4K.js";
10
10
  import "./chunk-62MOBW7X.js";
11
- import "./chunk-FLVYM3QM.js";
12
- import "./chunk-OK7ETRK6.js";
13
- import "./chunk-QHV5ICRK.js";
11
+ import "./chunk-BBJWY4W3.js";
12
+ import "./chunk-LQJLKAVM.js";
13
+ import "./chunk-OFI7MMJR.js";
14
14
  import "./chunk-GZ2B634M.js";
15
- import "./chunk-75BNAQES.js";
15
+ import "./chunk-2EO4IS5N.js";
16
16
  import "./chunk-HJ6L54YS.js";
17
- import "./chunk-L6H6O6ZH.js";
17
+ import "./chunk-D6352YQT.js";
18
18
  import "./chunk-GS2VLJGG.js";
19
19
  import "./chunk-FWKK7FTI.js";
20
20
  import "./chunk-5MWX5HUZ.js";
@@ -41,4 +41,4 @@ export {
41
41
  getDefaultBoxplotSettings,
42
42
  getPlotConfig
43
43
  };
44
- //# sourceMappingURL=BoxPlot-PZJAPMVT.js.map
44
+ //# sourceMappingURL=BoxPlot-SQMAIQZM.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  PlotBase
3
- } from "./chunk-FLVYM3QM.js";
3
+ } from "./chunk-BBJWY4W3.js";
4
4
  import {
5
5
  controlsInit
6
- } from "./chunk-OK7ETRK6.js";
7
- import "./chunk-QHV5ICRK.js";
6
+ } from "./chunk-LQJLKAVM.js";
7
+ import "./chunk-OFI7MMJR.js";
8
8
  import "./chunk-GZ2B634M.js";
9
9
  import {
10
10
  LegendCircleReference,
@@ -14,9 +14,9 @@ import {
14
14
  fillTwLst,
15
15
  table2col,
16
16
  to_svg
17
- } from "./chunk-75BNAQES.js";
17
+ } from "./chunk-2EO4IS5N.js";
18
18
  import "./chunk-HJ6L54YS.js";
19
- import "./chunk-L6H6O6ZH.js";
19
+ import "./chunk-D6352YQT.js";
20
20
  import {
21
21
  termType2label
22
22
  } from "./chunk-GS2VLJGG.js";
@@ -613,4 +613,4 @@ export {
613
613
  getDefaultCorrVolcanoSettings,
614
614
  getPlotConfig
615
615
  };
616
- //# sourceMappingURL=CorrelationVolcano-AHVPEECE.js.map
616
+ //# sourceMappingURL=CorrelationVolcano-HCW6LQRF.js.map
@@ -1,25 +1,25 @@
1
1
  import {
2
2
  getDefaultGseaSettings
3
- } from "./chunk-KMIG5RCZ.js";
4
- import "./chunk-ZX66SKUU.js";
3
+ } from "./chunk-NTLRCEC2.js";
4
+ import "./chunk-TMO22TT3.js";
5
5
  import {
6
6
  importPlot
7
- } from "./chunk-2FMX2IIF.js";
7
+ } from "./chunk-IOPEUV4K.js";
8
8
  import {
9
9
  getDefaultVolcanoSettings,
10
10
  validateVolcanoSettings
11
11
  } from "./chunk-62MOBW7X.js";
12
12
  import {
13
13
  PlotBase
14
- } from "./chunk-FLVYM3QM.js";
15
- import "./chunk-OK7ETRK6.js";
16
- import "./chunk-QHV5ICRK.js";
14
+ } from "./chunk-BBJWY4W3.js";
15
+ import "./chunk-LQJLKAVM.js";
16
+ import "./chunk-OFI7MMJR.js";
17
17
  import "./chunk-GZ2B634M.js";
18
18
  import {
19
19
  Tabs
20
- } from "./chunk-75BNAQES.js";
20
+ } from "./chunk-2EO4IS5N.js";
21
21
  import "./chunk-HJ6L54YS.js";
22
- import "./chunk-L6H6O6ZH.js";
22
+ import "./chunk-D6352YQT.js";
23
23
  import {
24
24
  TermTypes,
25
25
  termType2label
@@ -234,4 +234,4 @@ export {
234
234
  componentInit,
235
235
  getPlotConfig
236
236
  };
237
- //# sourceMappingURL=DifferentialAnalysis-7KNOEZ3M.js.map
237
+ //# sourceMappingURL=DifferentialAnalysis-XQ3SQ6TG.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  configUiInit
3
- } from "./chunk-QHV5ICRK.js";
3
+ } from "./chunk-OFI7MMJR.js";
4
4
  import {
5
5
  topBarInit
6
6
  } from "./chunk-GZ2B634M.js";
@@ -10,11 +10,11 @@ import {
10
10
  renderTable,
11
11
  svgLegend,
12
12
  table2col
13
- } from "./chunk-75BNAQES.js";
13
+ } from "./chunk-2EO4IS5N.js";
14
14
  import "./chunk-HJ6L54YS.js";
15
15
  import {
16
16
  dofetch3
17
- } from "./chunk-L6H6O6ZH.js";
17
+ } from "./chunk-D6352YQT.js";
18
18
  import "./chunk-GS2VLJGG.js";
19
19
  import {
20
20
  bplen,
@@ -178,7 +178,7 @@ async function makeSvgraph(fusion, div, genome) {
178
178
  await getGm(svpair.a, genome.name, fusion.source.gene);
179
179
  await getGm(svpair.b, genome.name, fusion.target.gene);
180
180
  wait.remove();
181
- const _ = await import("./svgraph-2IZJXZWR.js");
181
+ const _ = await import("./svgraph-GT6MK7G6.js");
182
182
  _.default({
183
183
  pairlst: [svpair],
184
184
  genome,
@@ -277,7 +277,7 @@ var DiscoInteractions = class {
277
277
  }
278
278
  ]
279
279
  };
280
- const _ = await import("./block.init-FY2LGFGI.js");
280
+ const _ = await import("./block.init-5BOM6MCL.js");
281
281
  await _.default(arg);
282
282
  };
283
283
  this.colorScaleNumericInputsCallback = async (obj) => {
@@ -3086,4 +3086,4 @@ export {
3086
3086
  discoInit,
3087
3087
  getPlotConfig
3088
3088
  };
3089
- //# sourceMappingURL=Disco-QVQCMWIQ.js.map
3089
+ //# sourceMappingURL=Disco-6TM5UG4F.js.map