@sjcrh/proteinpaint-client 2.219.1 → 2.221.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (983) hide show
  1. package/dist/2dmaf-7YU3SNKL.js +1362 -0
  2. package/dist/AggMatrixInput-73CDR5FS.js +402 -0
  3. package/dist/AggregateMatrix-NNULVFBM.js +37 -0
  4. package/dist/AppHeader-EZDDLLXU.js +826 -0
  5. package/dist/BoxPlot-463E7CRY.js +1229 -0
  6. package/dist/CorrelationVolcano-LHIIMBPP.js +613 -0
  7. package/dist/Cuminc-UL2TCIKV.js +1217 -0
  8. package/dist/DE-VRFSKFDW.js +85 -0
  9. package/dist/DEinput-FZTQRWVC.js +479 -0
  10. package/dist/DM-PO7CQZNT.js +86 -0
  11. package/dist/DifferentialAnalysis-WK6HE3YH.js +236 -0
  12. package/dist/Disco-YBNQJQFG.js +3384 -0
  13. package/dist/Disco.UI-HC5XYBFV.js +239 -0
  14. package/dist/DmrPlot-7VJ5C66D.js +361 -0
  15. package/dist/GB-VPFQRDRO.js +1388 -0
  16. package/dist/GSEA-ZEJB3QZQ.js +870 -0
  17. package/dist/GeneExpInput-SBDDIY6G.js +38 -0
  18. package/dist/Geomap-23AHGP2V.js +80 -0
  19. package/dist/HicApp-7AQQE4CM.js +2240 -0
  20. package/dist/IDCViewer-NO5Q6VOB.js +10808 -0
  21. package/dist/NumBinaryEditor-DSRP4OOU.js +274 -0
  22. package/dist/NumBinaryEditor.unit.spec-TT666YL4.js +308 -0
  23. package/dist/NumContEditor-6CURFOCH.js +100 -0
  24. package/dist/NumContEditor.unit.spec-MNVCFCMP.js +160 -0
  25. package/dist/NumCustomBinEditor-SQRR5EFL.js +29 -0
  26. package/dist/NumCustomBinEditor.unit.spec-F7BZWGGT.js +393 -0
  27. package/dist/NumDiscreteEditor-U7Z2QNYP.js +165 -0
  28. package/dist/NumDiscreteEditor.unit.spec-EIEBUZCX.js +229 -0
  29. package/dist/NumRegularBinEditor-CVZSWN6Y.js +29 -0
  30. package/dist/NumRegularBinEditor.unit.spec-ZMAJOIHL.js +274 -0
  31. package/dist/NumSplineEditor-U43D5NBJ.js +205 -0
  32. package/dist/NumSplineEditor.unit.spec-C52AADTS.js +220 -0
  33. package/dist/NumericDensity-PUKDZOVI.js +29 -0
  34. package/dist/NumericDensity.unit.spec-2347S76D.js +414 -0
  35. package/dist/NumericHandler-3RT32PTR.js +30 -0
  36. package/dist/NumericHandler.unit.spec-4PADL4KZ.js +225 -0
  37. package/dist/ProteomeInput-NFV4FW4U.js +610 -0
  38. package/dist/Regression-N7M7N6G4.js +1412 -0
  39. package/dist/RunChart2-UPQ7C6QE.js +744 -0
  40. package/dist/SC-KBW2NHUV.js +1290 -0
  41. package/dist/Violin-GWCOP3ZF.js +1092 -0
  42. package/dist/Volcano-X3HT32GQ.js +2661 -0
  43. package/dist/Volcano-X3HT32GQ.js.map +7 -0
  44. package/dist/Wsi-NXAEOYIS.js +636 -0
  45. package/dist/aboutSunburst-5EKXZV2A.js +86 -0
  46. package/dist/aboutSunburst-5EKXZV2A.js.map +7 -0
  47. package/dist/adSandbox-RPEWEEW7.js +29 -0
  48. package/dist/animatedBubbleChart-ILDMZRBX.js +542 -0
  49. package/dist/app-LOUC4J47.js +28 -0
  50. package/dist/app-MRKXZ6AZ.js +38 -0
  51. package/dist/app.js +15 -15
  52. package/dist/bam-SQWPHCZZ.js +872 -0
  53. package/dist/bam-SQWPHCZZ.js.map +7 -0
  54. package/dist/barchart-CJR37234.js +38 -0
  55. package/dist/barchart2-QQYLTHWR.js +305 -0
  56. package/dist/block-GLF6QNKY.js +6203 -0
  57. package/dist/block-GLF6QNKY.js.map +7 -0
  58. package/dist/block.init-YJQTJIDO.js +29 -0
  59. package/dist/block.mds.expressionrank-GBMEI5KQ.js +350 -0
  60. package/dist/block.mds.geneboxplot-XWE3E5IW.js +819 -0
  61. package/dist/block.mds.junction-QLEHFVPE.js +1534 -0
  62. package/dist/block.mds.svcnv-53DTOPBC.js +6413 -0
  63. package/dist/block.svg-57T37ABS.js +155 -0
  64. package/dist/block.tk.aicheck-6DXJTS3H.js +274 -0
  65. package/dist/block.tk.bam-CJFFQDNX.js +1906 -0
  66. package/dist/block.tk.bam-CJFFQDNX.js.map +7 -0
  67. package/dist/block.tk.bigwig.ui-OYIVXE2L.js +202 -0
  68. package/dist/block.tk.hicstraw-UKTGEBWT.js +814 -0
  69. package/dist/block.tk.junction-ZU5KPFQ3.js +2353 -0
  70. package/dist/block.tk.junction.textmatrixui-P4WXTAZR.js +190 -0
  71. package/dist/block.tk.ld-3PQ4O2AE.js +90 -0
  72. package/dist/block.tk.menu-LLITB6UA.js +1050 -0
  73. package/dist/block.tk.pgv-Y3FBXUO3.js +934 -0
  74. package/dist/brainImaging-4B3WXLNP.js +550 -0
  75. package/dist/brainRegions-7VLONUWN.js +213 -0
  76. package/dist/bubbleHeatmap-DI6GJRR6.js +374 -0
  77. package/dist/cellTypeBubbleHeatmap-HJY53DB2.js +274 -0
  78. package/dist/chunk-226MNBZ2.js +240 -0
  79. package/dist/chunk-2CDFU4MQ.js +536 -0
  80. package/dist/chunk-2CDFU4MQ.js.map +7 -0
  81. package/dist/chunk-2CNFGVHU.js +257 -0
  82. package/dist/chunk-2MC3RNKA.js +2685 -0
  83. package/dist/chunk-2OMX5AYB.js +195 -0
  84. package/dist/chunk-2SL4QWUS.js +50 -0
  85. package/dist/chunk-3KGBC5MK.js +692 -0
  86. package/dist/chunk-3PCRAPUV.js +56 -0
  87. package/dist/chunk-4DBOMSKP.js +102 -0
  88. package/dist/chunk-4TJO2DGU.js +2297 -0
  89. package/dist/chunk-4TJO2DGU.js.map +7 -0
  90. package/dist/chunk-57BS6KNI.js +466 -0
  91. package/dist/chunk-5AXS5G4A.js +2334 -0
  92. package/dist/chunk-5DI4UNH5.js +562 -0
  93. package/dist/chunk-5HJG6ECV.js +237 -0
  94. package/dist/chunk-5ZYANHGX.js +550 -0
  95. package/dist/chunk-6T4MN7LV.js +397 -0
  96. package/dist/chunk-75MRUW2K.js +103 -0
  97. package/dist/chunk-7J3W3KCN.js +255 -0
  98. package/dist/chunk-7SFK32JP.js +398 -0
  99. package/dist/chunk-7SFK32JP.js.map +7 -0
  100. package/dist/chunk-AIZYAKIE.js +182 -0
  101. package/dist/chunk-AJNFI6GA.js +2008 -0
  102. package/dist/chunk-BJAWDZBL.js +2799 -0
  103. package/dist/chunk-C6PVZVIH.js +379 -0
  104. package/dist/chunk-C77X5ZUV.js +176 -0
  105. package/dist/chunk-C7KUMZQM.js +59 -0
  106. package/dist/chunk-C7ROKWV2.js +140 -0
  107. package/dist/chunk-CAH6LJ5Z.js +31 -0
  108. package/dist/chunk-CUCP2GMT.js +102 -0
  109. package/dist/chunk-DTGAMBRJ.js +134 -0
  110. package/dist/chunk-DXT7GDHY.js +55 -0
  111. package/dist/chunk-ENPMWVWG.js +5214 -0
  112. package/dist/chunk-EYKJQJ7R.js +382 -0
  113. package/dist/chunk-FE5TCBIT.js +30 -0
  114. package/dist/chunk-FJ2JV2VK.js +217 -0
  115. package/dist/chunk-FPMJJBLV.js +4389 -0
  116. package/dist/chunk-FPMJJBLV.js.map +7 -0
  117. package/dist/chunk-FZYVPRVQ.js +38 -0
  118. package/dist/chunk-GBKQHVKJ.js +274 -0
  119. package/dist/chunk-GUW7VTUL.js +281 -0
  120. package/dist/chunk-H7F6DMJA.js +70 -0
  121. package/dist/chunk-HH3NUAR2.js +96 -0
  122. package/dist/chunk-HRTPGNOG.js +159 -0
  123. package/dist/chunk-IFPRYTS7.js +848 -0
  124. package/dist/chunk-IJSFSUI4.js +302 -0
  125. package/dist/chunk-IRQKX6DL.js +263 -0
  126. package/dist/chunk-JHLF2ZC2.js +472 -0
  127. package/dist/chunk-JNZL7HKB.js +1219 -0
  128. package/dist/chunk-K2ARLT2A.js +26 -0
  129. package/dist/chunk-K3G56J5R.js +299 -0
  130. package/dist/chunk-KKUCG2QE.js +516 -0
  131. package/dist/chunk-KPXCXBNU.js +626 -0
  132. package/dist/chunk-LF5WBI27.js +418 -0
  133. package/dist/chunk-LF5WBI27.js.map +7 -0
  134. package/dist/chunk-MANAUI7R.js +54 -0
  135. package/dist/chunk-MEUSRAOE.js +170 -0
  136. package/dist/chunk-MHWYRNGA.js +348 -0
  137. package/dist/chunk-MSTYU3QO.js +14 -0
  138. package/dist/chunk-MWARRQT4.js +141 -0
  139. package/dist/chunk-MXKYPTZ7.js +203 -0
  140. package/dist/chunk-NX5IB4IY.js +37 -0
  141. package/dist/chunk-OZUF7O2S.js +133 -0
  142. package/dist/chunk-PRTLCJYF.js +2941 -0
  143. package/dist/chunk-PRTLCJYF.js.map +7 -0
  144. package/dist/chunk-PWYMHUXY.js +116 -0
  145. package/dist/chunk-PWYMHUXY.js.map +7 -0
  146. package/dist/chunk-QNCE6EOK.js +82 -0
  147. package/dist/chunk-RIHO7ZD5.js +119 -0
  148. package/dist/chunk-RV335DF2.js +266 -0
  149. package/dist/chunk-SFPZUBPM.js +2102 -0
  150. package/dist/chunk-SFPZUBPM.js.map +7 -0
  151. package/dist/chunk-THAUD62Q.js +1253 -0
  152. package/dist/chunk-VBTBUXXX.js +6375 -0
  153. package/dist/chunk-VHWJK2MP.js +56 -0
  154. package/dist/chunk-VLIOMJDR.js +276 -0
  155. package/dist/chunk-VMK4RHV5.js +54 -0
  156. package/dist/chunk-WD7FZ5EE.js +26536 -0
  157. package/dist/chunk-WD7FZ5EE.js.map +7 -0
  158. package/dist/chunk-WJLRU5OF.js +5786 -0
  159. package/dist/chunk-WJLRU5OF.js.map +7 -0
  160. package/dist/chunk-WKT7RF3C.js +468 -0
  161. package/dist/chunk-WXSMUSU7.js +184 -0
  162. package/dist/chunk-WXSX5OQJ.js +296 -0
  163. package/dist/chunk-WY3IORKG.js +194 -0
  164. package/dist/chunk-WYSOOKFJ.js +480 -0
  165. package/dist/chunk-XBBFFOLS.js +123 -0
  166. package/dist/chunk-XSRQGX5H.js +340 -0
  167. package/dist/chunk-YLL6CTBL.js +54 -0
  168. package/dist/chunk-YPBY37KD.js +1339 -0
  169. package/dist/chunk-YUNJBIK4.js +243 -0
  170. package/dist/chunk-Z5ECCUNG.js +444 -0
  171. package/dist/chunk-ZAC34BZQ.js +35 -0
  172. package/dist/chunk-ZAC34BZQ.js.map +7 -0
  173. package/dist/cohort-5WL6UJOS.js +66 -0
  174. package/dist/cohortSunburst-R3Z5KJQL.js +402 -0
  175. package/dist/condition-2IILUMVB.js +323 -0
  176. package/dist/controls-G3JITZF5.js +30 -0
  177. package/dist/controls.config-BO7KPPET.js +30 -0
  178. package/dist/correlation-CZILLVEM.js +91 -0
  179. package/dist/customdata.inputui-BXFQAMTR.js +280 -0
  180. package/dist/dataDownload-QTWR4IW7.js +326 -0
  181. package/dist/dataDownload-QTWR4IW7.js.map +7 -0
  182. package/dist/databrowser.ui-V2NJQF3U.js +421 -0
  183. package/dist/dictionary-OVAQX6R3.js +109 -0
  184. package/dist/dnaMethylation-DHPFRXB2.js +29 -0
  185. package/dist/dnaMethylation.integration.spec-PJLIRGN5.js +194 -0
  186. package/dist/dofetch-KBTN6OW4.js +49 -0
  187. package/dist/e2pca-O7SNMJGB.js +340 -0
  188. package/dist/ep-NIVLKG4S.js +1247 -0
  189. package/dist/expclust.gdc.spec-LVCD6C43.js +298 -0
  190. package/dist/facet-LB4SCXE4.js +556 -0
  191. package/dist/gb-3IJ4NCPO.js +77 -0
  192. package/dist/geneExpClustering-SIAC7CMA.js +240 -0
  193. package/dist/geneExpression-KPUOZ4PT.js +309 -0
  194. package/dist/geneExpression-P2TTZXN2.js +29 -0
  195. package/dist/geneExpression.unit.spec-Q5D6XHUF.js +151 -0
  196. package/dist/geneORA-PKUIJKTL.js +269 -0
  197. package/dist/geneRanking-ZGT5MHBV.js +544 -0
  198. package/dist/geneVariant-24YNANTT.js +289 -0
  199. package/dist/geneVariant-CDGENHWQ.js +32 -0
  200. package/dist/geneVariant.integration.spec-7QW4C2WO.js +672 -0
  201. package/dist/genefusion.ui-NVXGSBXD.js +299 -0
  202. package/dist/geneset-7STL6UDD.js +199 -0
  203. package/dist/genomeBrowser.spec-OE2CIP7I.js +272 -0
  204. package/dist/grin2-2HXUIY5O.js +66 -0
  205. package/dist/grin2-32IIJR5E.js +945 -0
  206. package/dist/hierCluster-MDZEI2KB.js +51 -0
  207. package/dist/hierCluster-T3PZUGBI.js +55 -0
  208. package/dist/hierCluster.config-7UN6AYGB.js +32 -0
  209. package/dist/hierCluster.integration.spec-DWOYVK6T.js +479 -0
  210. package/dist/hierCluster.interactivity-5OM6XNFG.js +45 -0
  211. package/dist/hierCluster.renderers-YGX6MZZW.js +18 -0
  212. package/dist/imagePlot-KBRXDV5G.js +152 -0
  213. package/dist/importPlot-DJMIC22L.js +8 -0
  214. package/dist/isoformExpression-SWDWADRC.js +31 -0
  215. package/dist/isoformExpression.unit.spec-2U5KCYBP.js +233 -0
  216. package/dist/junction-NMXVVGRG.js +32 -0
  217. package/dist/junction.customTerm-3R2GNE3A.js +15 -0
  218. package/dist/junction.unit.spec-JTGBPPN7.js +178 -0
  219. package/dist/launch.adhoc-YB5SKMNY.js +33 -0
  220. package/dist/leftlabel.sample-QKXIODCS.js +253 -0
  221. package/dist/lollipop-TSZ62PBH.js +162 -0
  222. package/dist/maf-4L5YN4CG.js +451 -0
  223. package/dist/maftimeline-VOYB3NY3.js +583 -0
  224. package/dist/matrix-IWJECVTF.js +55 -0
  225. package/dist/matrix-MMJAJZA7.js +50 -0
  226. package/dist/matrix.cells-5RTZUJVN.js +25 -0
  227. package/dist/matrix.config-DZGOZWJS.js +33 -0
  228. package/dist/matrix.data-Y5TPRGMW.js +22 -0
  229. package/dist/matrix.groups-6DXCAY4P.js +25 -0
  230. package/dist/matrix.integration.spec-2N237E7T.js +3156 -0
  231. package/dist/matrix.interactivity-FL33UUKR.js +33 -0
  232. package/dist/matrix.layout-7SYHV3KJ.js +35 -0
  233. package/dist/matrix.legend-S3E76TVO.js +19 -0
  234. package/dist/matrix.renderers-3SIBT2RP.js +30 -0
  235. package/dist/matrix.serieses-3UGLZW25.js +18 -0
  236. package/dist/matrix.sort-A7CNLDUJ.js +25 -0
  237. package/dist/matrix.sort.unit.spec-L3H44T6I.js +464 -0
  238. package/dist/matrix.sorterUi-6PZR3YOD.js +15 -0
  239. package/dist/matrix.sorterUi.unit.spec-2NRU5UFH.js +334 -0
  240. package/dist/matrix.unit.spec-HRZIJB6T.js +146 -0
  241. package/dist/mavb-ZVRQSDPS.js +726 -0
  242. package/dist/mds.fimo-ZKETTET7.js +509 -0
  243. package/dist/mds.samplescatterplot-ZV3UNRLP.js +1545 -0
  244. package/dist/mds.survivalplot-OVXZRTU4.js +472 -0
  245. package/dist/multivalue-6BE5IA4F.js +79 -0
  246. package/dist/numericDictTermCluster-6XDVVWLE.js +62 -0
  247. package/dist/oncomatrix-XK62NEOO.js +286 -0
  248. package/dist/oncomatrix.spec-YVTCHOPS.js +439 -0
  249. package/dist/plot.2dvaf-NUOBWMNX.js +368 -0
  250. package/dist/plot.app-G6IQWXTV.js +32 -0
  251. package/dist/plot.barplot-6QJ6HEJR.js +93 -0
  252. package/dist/plot.boxplot-XKQJSW2O.js +142 -0
  253. package/dist/plot.brainImaging-UTHFJFXU.js +51 -0
  254. package/dist/plot.disco-3MSCX7TM.js +98 -0
  255. package/dist/plot.ssgq-4KBVHF42.js +130 -0
  256. package/dist/plot.vaf2cov-OGUQSSDS.js +249 -0
  257. package/dist/polar2-V7M56GTZ.js +228 -0
  258. package/dist/profileForms-TS3BJLHH.js +937 -0
  259. package/dist/profilePlot-DP5272HR.js +45 -0
  260. package/dist/proteinView-K4K4SP3L.js +1346 -0
  261. package/dist/proteomeCohortCompare-SFWVGLFK.js +866 -0
  262. package/dist/pseudbulk.unit.spec-NFOA7J2C.js +82 -0
  263. package/dist/pseudobulk-XKZQEZ4I.js +31 -0
  264. package/dist/qualitative-7OSFNVI5.js +241 -0
  265. package/dist/qualitative-OIIN6E4Y.js +34 -0
  266. package/dist/radar2-AHZJKX7S.js +323 -0
  267. package/dist/radarFacility2-OUW6D5E7.js +331 -0
  268. package/dist/rememberedGvQ.unit.spec-SHTMMZGG.js +210 -0
  269. package/dist/render-7UZSGX3Q.js +29 -0
  270. package/dist/report-J7HKTXZ2.js +213 -0
  271. package/dist/sampleView-6547OUIM.js +39 -0
  272. package/dist/samplelst-UHF23UEB.js +114 -0
  273. package/dist/samplematrix-OOKS3TMR.js +2188 -0
  274. package/dist/sc-WF2BLGNG.js +77 -0
  275. package/dist/scatter-ABCVFGRV.js +84 -0
  276. package/dist/scatter-WF7XM3IA.js +919 -0
  277. package/dist/selectGenomeWithTklst-67HU5KRB.js +125 -0
  278. package/dist/singleCellCellType-3FZPJ25V.js +29 -0
  279. package/dist/singleCellCellType.unit.spec-TOMREHWK.js +150 -0
  280. package/dist/singleCellGeneExpression-NQTJ5KJQ.js +29 -0
  281. package/dist/singleCellGeneExpression.unit.spec-ZWUQTU2N.js +144 -0
  282. package/dist/singleCellNumericValue-VI7H722L.js +29 -0
  283. package/dist/singleCellNumericValue.unit.spec-QGLHES7H.js +412 -0
  284. package/dist/singleCellPlot-RU5T6SJK.js +44 -0
  285. package/dist/singlecell-C3CJVNXP.js +1562 -0
  286. package/dist/singlecell-NRQZ7KC6.js +77 -0
  287. package/dist/snp-X6XY65VS.js +29 -0
  288. package/dist/snp.unit.spec-6EENK7GQ.js +167 -0
  289. package/dist/snplocus-R4JA6TFT.js +200 -0
  290. package/dist/snplst-SOWVHSXH.js +36 -0
  291. package/dist/spliceevent.a53ss.diagram-IRLCCVQZ.js +142 -0
  292. package/dist/spliceevent.exonskip.diagram-4KG7LE5D.js +274 -0
  293. package/dist/spliceevent.noeventdiagram-OWXAJJX7.js +451 -0
  294. package/dist/ssGSEA-EMOKPLMP.js +29 -0
  295. package/dist/ssGSEA.unit.spec-KXQ7R5WH.js +79 -0
  296. package/dist/stattable-H2G7MOZG.js +112 -0
  297. package/dist/studyCatalog-3ITQXWFL.js +457 -0
  298. package/dist/summarizeCnvGeneexp-ZIPU6YDY.js +154 -0
  299. package/dist/summarizeGeneexpSurvival-3RYU226R.js +101 -0
  300. package/dist/summarizeMutationCnv-RGDBUB22.js +155 -0
  301. package/dist/summarizeMutationDiagnosis-Z4MZE6Y4.js +31 -0
  302. package/dist/summarizeMutationSurvival-Z5CNRH7E.js +95 -0
  303. package/dist/summary-6QQCNX3B.js +40 -0
  304. package/dist/summary.integration.spec-3ULXTZUP.js +405 -0
  305. package/dist/summaryInput-4QKR34QB.js +238 -0
  306. package/dist/sunburst-KB3BWC72.js +34 -0
  307. package/dist/sunburst-XTFBHZNH.js +274 -0
  308. package/dist/survival-7O6ZK63E.js +49 -0
  309. package/dist/survival-NNCY4K6C.js +1248 -0
  310. package/dist/survival.integration.spec-ZYZHZAXA.js +609 -0
  311. package/dist/svgraph-ZLSFFEAC.js +1377 -0
  312. package/dist/svmr-REBBDEYM.js +3834 -0
  313. package/dist/swimmer-NUBRIWLI.js +993 -0
  314. package/dist/swimmer-NUBRIWLI.js.map +7 -0
  315. package/dist/table-CWIQQESJ.js +192 -0
  316. package/dist/termCollection-7TYJSQ45.js +29 -0
  317. package/dist/termCollection-7Z55QNL7.js +247 -0
  318. package/dist/termCollection.unit.spec-LQ5MIBDH.js +295 -0
  319. package/dist/termCollectionFractionSelection-24DZYVDU.js +38 -0
  320. package/dist/termCollectionFractionSelection.unit.spec-DCV2CFS5.js +184 -0
  321. package/dist/tk-2WZFPRCP.js +37 -0
  322. package/dist/tk-QTLEYIP7.js +1193 -0
  323. package/dist/tk-QTLEYIP7.js.map +7 -0
  324. package/dist/tp.ui-HXQX2UH4.js +1453 -0
  325. package/dist/tvs.categorical-4D3JI2ER.js +28 -0
  326. package/dist/tvs.condition-62FXFHZ5.js +160 -0
  327. package/dist/tvs.density-IGO4I4T2.js +19 -0
  328. package/dist/tvs.dt-FZSVMJOO.js +34 -0
  329. package/dist/tvs.dtcnv.categorical-PPFQIC42.js +31 -0
  330. package/dist/tvs.dtcnv.continuous-TV2IGHY4.js +72 -0
  331. package/dist/tvs.dtfusion-ON4BA4XJ.js +31 -0
  332. package/dist/tvs.dtitd-VFNROOWQ.js +31 -0
  333. package/dist/tvs.dtsnvindel-ZXOP37T5.js +31 -0
  334. package/dist/tvs.dtsv-EUHPTW7J.js +31 -0
  335. package/dist/tvs.multivalue-NHVXZNDI.js +84 -0
  336. package/dist/tvs.numeric-FPWDPO3J.js +32 -0
  337. package/dist/tvs.samplelst-ZZHRNUP4.js +95 -0
  338. package/dist/tvs.survival-F3KSG3U6.js +110 -0
  339. package/dist/tvs.termCollection-B37DZLDY.js +118 -0
  340. package/dist/vocabulary-XNE5FFDK.js +32 -0
  341. package/dist/vocabulary-XNE5FFDK.js.map +7 -0
  342. package/dist/wsi.direct-3YH3QGQD.js +11514 -0
  343. package/package.json +4 -4
  344. package/dist/2dmaf-O2SQ5RGD.js +0 -1362
  345. package/dist/AggMatrixInput-LUCTWXHU.js +0 -402
  346. package/dist/AggregateMatrix-JVMF27YL.js +0 -37
  347. package/dist/AppHeader-DJU6HRKO.js +0 -826
  348. package/dist/BoxPlot-22RXMPRL.js +0 -1229
  349. package/dist/CorrelationVolcano-PBZWPFSN.js +0 -613
  350. package/dist/Cuminc-EL74X5GY.js +0 -1217
  351. package/dist/DE-W5SAMMRW.js +0 -85
  352. package/dist/DEinput-ZKEFJZQU.js +0 -479
  353. package/dist/DM-ABKDXMDG.js +0 -86
  354. package/dist/DifferentialAnalysis-3JTZ5WCQ.js +0 -236
  355. package/dist/Disco-ME53U25C.js +0 -3384
  356. package/dist/Disco.UI-F7XKJMKR.js +0 -239
  357. package/dist/DmrPlot-OWBXUTON.js +0 -361
  358. package/dist/GB-7X6DBWKS.js +0 -1388
  359. package/dist/GSEA-GAZIEGD7.js +0 -870
  360. package/dist/GeneExpInput-BAOC6ICV.js +0 -38
  361. package/dist/Geomap-OZERLL7V.js +0 -80
  362. package/dist/HicApp-WDH5LVTD.js +0 -2240
  363. package/dist/IDCViewer-XBZFU3BU.js +0 -10808
  364. package/dist/NumBinaryEditor-5R4EUQOZ.js +0 -274
  365. package/dist/NumBinaryEditor.unit.spec-ULBXMOYY.js +0 -308
  366. package/dist/NumContEditor-EN6V4FLQ.js +0 -100
  367. package/dist/NumContEditor.unit.spec-VDWKNIFN.js +0 -160
  368. package/dist/NumCustomBinEditor-UB34ALNZ.js +0 -29
  369. package/dist/NumCustomBinEditor.unit.spec-WZXJ7GEC.js +0 -393
  370. package/dist/NumDiscreteEditor-H6J67YEL.js +0 -165
  371. package/dist/NumDiscreteEditor.unit.spec-KJ7YU22W.js +0 -229
  372. package/dist/NumRegularBinEditor-R5JVUG7J.js +0 -29
  373. package/dist/NumRegularBinEditor.unit.spec-RZ73FMNO.js +0 -274
  374. package/dist/NumSplineEditor-AOR6OAJA.js +0 -205
  375. package/dist/NumSplineEditor.unit.spec-Z6ZEI3UO.js +0 -220
  376. package/dist/NumericDensity-SRTFTDQA.js +0 -29
  377. package/dist/NumericDensity.unit.spec-MRREBAYU.js +0 -414
  378. package/dist/NumericHandler-7RALUACA.js +0 -30
  379. package/dist/NumericHandler.unit.spec-MDO23WRB.js +0 -225
  380. package/dist/ProteomeInput-MOBXHRD5.js +0 -610
  381. package/dist/Regression-XWT4NNTG.js +0 -1412
  382. package/dist/RunChart2-Q7W5MWJS.js +0 -744
  383. package/dist/SC-MM3JTEVL.js +0 -1290
  384. package/dist/Violin-XNTBDUPG.js +0 -1092
  385. package/dist/Volcano-GRKXU3WL.js +0 -2619
  386. package/dist/Volcano-GRKXU3WL.js.map +0 -7
  387. package/dist/Wsi-22KJSFVH.js +0 -636
  388. package/dist/adSandbox-TLYWQOOA.js +0 -29
  389. package/dist/animatedBubbleChart-67SY5JGP.js +0 -542
  390. package/dist/app-FG3KPE4R.js +0 -28
  391. package/dist/app-VK5LYO6B.js +0 -38
  392. package/dist/bam-TNLNISLV.js +0 -872
  393. package/dist/bam-TNLNISLV.js.map +0 -7
  394. package/dist/barchart-IGWRVB6W.js +0 -38
  395. package/dist/barchart2-TT6OBJJP.js +0 -305
  396. package/dist/block-5PV2TYWJ.js +0 -6232
  397. package/dist/block-5PV2TYWJ.js.map +0 -7
  398. package/dist/block.init-2Y6CNK7H.js +0 -29
  399. package/dist/block.mds.expressionrank-VZ4JVPTG.js +0 -350
  400. package/dist/block.mds.geneboxplot-NYMS32JP.js +0 -819
  401. package/dist/block.mds.junction-3R6C3B5W.js +0 -1534
  402. package/dist/block.mds.svcnv-SO5CYYIQ.js +0 -6413
  403. package/dist/block.svg-R4ASXXNW.js +0 -155
  404. package/dist/block.tk.aicheck-LYRTDZRA.js +0 -274
  405. package/dist/block.tk.bam-GR7CHGGQ.js +0 -1897
  406. package/dist/block.tk.bam-GR7CHGGQ.js.map +0 -7
  407. package/dist/block.tk.bedgraphdot-GERXK2O6.js +0 -375
  408. package/dist/block.tk.bedgraphdot-GERXK2O6.js.map +0 -7
  409. package/dist/block.tk.bigwig.ui-3KMMZX2M.js +0 -202
  410. package/dist/block.tk.hicstraw-7HH4PGFY.js +0 -814
  411. package/dist/block.tk.junction-BPEKLYS2.js +0 -2353
  412. package/dist/block.tk.junction.textmatrixui-2QU5DL2X.js +0 -190
  413. package/dist/block.tk.ld-TJREYPNY.js +0 -90
  414. package/dist/block.tk.menu-HDBZK4YP.js +0 -1050
  415. package/dist/block.tk.pgv-G5GCYBK2.js +0 -934
  416. package/dist/brainImaging-ODWHF7WZ.js +0 -550
  417. package/dist/brainRegions-DC7DEA7N.js +0 -213
  418. package/dist/bubbleHeatmap-T5ACULRL.js +0 -374
  419. package/dist/cellTypeBubbleHeatmap-RQINXXTK.js +0 -274
  420. package/dist/chunk-24ZS2XWC.js +0 -176
  421. package/dist/chunk-2EPEWVKQ.js +0 -4378
  422. package/dist/chunk-2EPEWVKQ.js.map +0 -7
  423. package/dist/chunk-2PHFY3VP.js +0 -195
  424. package/dist/chunk-2QFMKWNS.js +0 -281
  425. package/dist/chunk-2UB6JZ3I.js +0 -466
  426. package/dist/chunk-3GQ54XTJ.js +0 -70
  427. package/dist/chunk-3IE6FDVA.js +0 -1253
  428. package/dist/chunk-4ENIOXIT.js +0 -133
  429. package/dist/chunk-4OOQ52ET.js +0 -182
  430. package/dist/chunk-5NI77Z3O.js +0 -119
  431. package/dist/chunk-5TPWMYBG.js +0 -274
  432. package/dist/chunk-64JHE3GV.js +0 -50
  433. package/dist/chunk-6MUJGVOH.js +0 -140
  434. package/dist/chunk-6XKAOSQE.js +0 -116
  435. package/dist/chunk-6XKAOSQE.js.map +0 -7
  436. package/dist/chunk-6YGSVJJD.js +0 -54
  437. package/dist/chunk-7PQVNQFR.js +0 -255
  438. package/dist/chunk-7XW4JWMJ.js +0 -170
  439. package/dist/chunk-7ZEJKFGW.js +0 -55
  440. package/dist/chunk-A6ZUYQHO.js +0 -159
  441. package/dist/chunk-ALIMVUHR.js +0 -1219
  442. package/dist/chunk-ANBGNYNP.js +0 -1339
  443. package/dist/chunk-ATZNXW5F.js +0 -237
  444. package/dist/chunk-AUPTEHV7.js +0 -257
  445. package/dist/chunk-B2KYLEYM.js +0 -30
  446. package/dist/chunk-BJCET6RU.js +0 -263
  447. package/dist/chunk-BKW35Z4U.js +0 -26619
  448. package/dist/chunk-BKW35Z4U.js.map +0 -7
  449. package/dist/chunk-CJHNPYFQ.js +0 -2292
  450. package/dist/chunk-CJHNPYFQ.js.map +0 -7
  451. package/dist/chunk-CTVPW77S.js +0 -194
  452. package/dist/chunk-D6U65W7Q.js +0 -626
  453. package/dist/chunk-DJMDETVU.js +0 -2685
  454. package/dist/chunk-DKPAOVJH.js +0 -243
  455. package/dist/chunk-DRESQF33.js +0 -38
  456. package/dist/chunk-DXM5MQCZ.js +0 -382
  457. package/dist/chunk-ETXOEP4N.js +0 -184
  458. package/dist/chunk-FOUMNTII.js +0 -134
  459. package/dist/chunk-FTGLS763.js +0 -56
  460. package/dist/chunk-GN2A5NL5.js +0 -472
  461. package/dist/chunk-GWNCQ5YI.js +0 -468
  462. package/dist/chunk-GX6G2SSW.js +0 -26
  463. package/dist/chunk-H3YF55ZI.js +0 -848
  464. package/dist/chunk-IANE75G3.js +0 -444
  465. package/dist/chunk-IKZQST6E.js +0 -5213
  466. package/dist/chunk-IPRYYK26.js +0 -96
  467. package/dist/chunk-JL3PYV5F.js +0 -6375
  468. package/dist/chunk-K6VYSDB5.js +0 -276
  469. package/dist/chunk-KSS26PXB.js +0 -54
  470. package/dist/chunk-LO2QBHP6.js +0 -418
  471. package/dist/chunk-LO2QBHP6.js.map +0 -7
  472. package/dist/chunk-LSRFRZNP.js +0 -59
  473. package/dist/chunk-LYX4S6WA.js +0 -266
  474. package/dist/chunk-ME3HB3V6.js +0 -5787
  475. package/dist/chunk-ME3HB3V6.js.map +0 -7
  476. package/dist/chunk-MP7BA3GK.js +0 -14
  477. package/dist/chunk-MVSUESEV.js +0 -141
  478. package/dist/chunk-NQMS7WV3.js +0 -2799
  479. package/dist/chunk-NR6WFCPF.js +0 -348
  480. package/dist/chunk-NS2MZN3C.js +0 -562
  481. package/dist/chunk-NUA66GW7.js +0 -37
  482. package/dist/chunk-NYEFSOKD.js +0 -550
  483. package/dist/chunk-OVHQFZAE.js +0 -34
  484. package/dist/chunk-OVHQFZAE.js.map +0 -7
  485. package/dist/chunk-QM724EG2.js +0 -103
  486. package/dist/chunk-RIL33JCW.js +0 -102
  487. package/dist/chunk-RJAJG5KN.js +0 -2954
  488. package/dist/chunk-RJAJG5KN.js.map +0 -7
  489. package/dist/chunk-SLHXR4BZ.js +0 -82
  490. package/dist/chunk-SO76DLSZ.js +0 -299
  491. package/dist/chunk-T7CKGRGP.js +0 -398
  492. package/dist/chunk-T7CKGRGP.js.map +0 -7
  493. package/dist/chunk-TUO5I6LP.js +0 -123
  494. package/dist/chunk-TWTPWEYL.js +0 -240
  495. package/dist/chunk-U2GHNZ4N.js +0 -54
  496. package/dist/chunk-UAB5PGOP.js +0 -56
  497. package/dist/chunk-UCB3W3OT.js +0 -217
  498. package/dist/chunk-UJIB7QM3.js +0 -2334
  499. package/dist/chunk-UYQGTW7I.js +0 -1857
  500. package/dist/chunk-UYQGTW7I.js.map +0 -7
  501. package/dist/chunk-VBDJG6GZ.js +0 -2008
  502. package/dist/chunk-VOXUMZMG.js +0 -379
  503. package/dist/chunk-WCNMP54T.js +0 -516
  504. package/dist/chunk-WETOH7YW.js +0 -692
  505. package/dist/chunk-WKGKKM6F.js +0 -480
  506. package/dist/chunk-WV44DGEJ.js +0 -397
  507. package/dist/chunk-XVEEMQAT.js +0 -31
  508. package/dist/chunk-YBOHXANC.js +0 -302
  509. package/dist/chunk-YNQFOPS6.js +0 -203
  510. package/dist/chunk-YVQ4USPP.js +0 -340
  511. package/dist/chunk-ZWLT5QS3.js +0 -102
  512. package/dist/chunk-ZYAZHJPZ.js +0 -296
  513. package/dist/cohort-QSLKB4ZO.js +0 -66
  514. package/dist/cohortSunburst-AQFSNJ5K.js +0 -402
  515. package/dist/condition-MLS6TJHV.js +0 -323
  516. package/dist/controls-ZT3GZ667.js +0 -30
  517. package/dist/controls.config-F7NIPLKB.js +0 -30
  518. package/dist/correlation-ZEIQJGSQ.js +0 -91
  519. package/dist/customdata.inputui-6PJSAJK2.js +0 -280
  520. package/dist/dataDownload-CHMPXHBY.js +0 -325
  521. package/dist/dataDownload-CHMPXHBY.js.map +0 -7
  522. package/dist/databrowser.ui-EMZ5L2Y7.js +0 -421
  523. package/dist/dictionary-U2BWGY6B.js +0 -109
  524. package/dist/dnaMethylation-R34E2XNC.js +0 -29
  525. package/dist/dnaMethylation.integration.spec-4Z2AJHWY.js +0 -194
  526. package/dist/dofetch-JY4A7BYI.js +0 -47
  527. package/dist/e2pca-WSSCXX6A.js +0 -340
  528. package/dist/ep-ATUWEHDJ.js +0 -1247
  529. package/dist/expclust.gdc.spec-QRIRRPO7.js +0 -298
  530. package/dist/facet-5VDCSP3S.js +0 -556
  531. package/dist/gb-Y4UG6LFA.js +0 -77
  532. package/dist/geneExpClustering-OO67JNJ2.js +0 -240
  533. package/dist/geneExpression-5KGV3MAA.js +0 -29
  534. package/dist/geneExpression-KPRFXKU7.js +0 -309
  535. package/dist/geneExpression.unit.spec-YV45EZ5O.js +0 -151
  536. package/dist/geneORA-R74JPUTC.js +0 -269
  537. package/dist/geneRanking-IJTXNMHV.js +0 -544
  538. package/dist/geneVariant-HBAHT6LU.js +0 -32
  539. package/dist/geneVariant-JT3EGAIH.js +0 -289
  540. package/dist/geneVariant.integration.spec-TFQYPUAS.js +0 -672
  541. package/dist/genefusion.ui-MMTQMTHC.js +0 -299
  542. package/dist/geneset-VMBICNCZ.js +0 -199
  543. package/dist/genomeBrowser.spec-2XLLIYGA.js +0 -272
  544. package/dist/grin2-2RYPEUWV.js +0 -66
  545. package/dist/grin2-Y6KAFVV2.js +0 -945
  546. package/dist/hierCluster-EKGFBQT4.js +0 -51
  547. package/dist/hierCluster-Z4PVNMGS.js +0 -55
  548. package/dist/hierCluster.config-Q6WUNK2K.js +0 -32
  549. package/dist/hierCluster.integration.spec-2LHSHNFC.js +0 -479
  550. package/dist/hierCluster.interactivity-OGQ3KUY6.js +0 -45
  551. package/dist/hierCluster.renderers-3GJZXG75.js +0 -18
  552. package/dist/imagePlot-ZJEZPBX7.js +0 -152
  553. package/dist/importPlot-GFEFYEHZ.js +0 -8
  554. package/dist/isoformExpression-A2X3DSR6.js +0 -31
  555. package/dist/isoformExpression.unit.spec-VKMEGCL4.js +0 -233
  556. package/dist/junction-HWIHLQU2.js +0 -32
  557. package/dist/junction.customTerm-C3VWXEYH.js +0 -15
  558. package/dist/junction.unit.spec-ZYJGDOXJ.js +0 -178
  559. package/dist/launch.adhoc-HW5AZM4T.js +0 -33
  560. package/dist/leftlabel.sample-MTW2HRRQ.js +0 -253
  561. package/dist/lollipop-VWW5H6CR.js +0 -162
  562. package/dist/maf-KEJYO3H4.js +0 -451
  563. package/dist/maftimeline-MJZDSGSR.js +0 -583
  564. package/dist/matrix-3UJW6LOA.js +0 -50
  565. package/dist/matrix-W4AX5OBM.js +0 -55
  566. package/dist/matrix.cells-5DAIZ3E5.js +0 -25
  567. package/dist/matrix.config-PK26VPQT.js +0 -33
  568. package/dist/matrix.data-UK5DGKBK.js +0 -22
  569. package/dist/matrix.groups-NM4Q5YDN.js +0 -25
  570. package/dist/matrix.integration.spec-FGWNBCRR.js +0 -3156
  571. package/dist/matrix.interactivity-4C37PII5.js +0 -33
  572. package/dist/matrix.layout-ODV7WXUP.js +0 -35
  573. package/dist/matrix.legend-5MY7OXWN.js +0 -19
  574. package/dist/matrix.renderers-QA7W7ZUL.js +0 -30
  575. package/dist/matrix.serieses-4FSFJPCK.js +0 -18
  576. package/dist/matrix.sort-3QLFMBJ5.js +0 -25
  577. package/dist/matrix.sort.unit.spec-HVOC6IYT.js +0 -464
  578. package/dist/matrix.sorterUi-EY3SA6CG.js +0 -15
  579. package/dist/matrix.sorterUi.unit.spec-OAXWPZZI.js +0 -334
  580. package/dist/matrix.unit.spec-RAL7AU22.js +0 -146
  581. package/dist/mavb-KIM63AC4.js +0 -726
  582. package/dist/mds.fimo-DMAVM56P.js +0 -509
  583. package/dist/mds.samplescatterplot-KILTR2C7.js +0 -1545
  584. package/dist/mds.survivalplot-PV76ANBP.js +0 -472
  585. package/dist/multivalue-2V5LMQY7.js +0 -79
  586. package/dist/numericDictTermCluster-TGL4X6UC.js +0 -62
  587. package/dist/oncomatrix-2O7SLXHX.js +0 -286
  588. package/dist/oncomatrix.spec-HZJKOF5G.js +0 -439
  589. package/dist/plot.2dvaf-424NNMMA.js +0 -368
  590. package/dist/plot.app-YBZDNST2.js +0 -32
  591. package/dist/plot.barplot-YZQBYJUY.js +0 -93
  592. package/dist/plot.boxplot-5OW6IBQL.js +0 -142
  593. package/dist/plot.brainImaging-H3ABPPD3.js +0 -51
  594. package/dist/plot.disco-X7KCDWGX.js +0 -98
  595. package/dist/plot.ssgq-GYRVHTC7.js +0 -130
  596. package/dist/plot.vaf2cov-B2TELPHL.js +0 -249
  597. package/dist/polar2-5KNZRLXY.js +0 -228
  598. package/dist/profileForms-FY34KXCL.js +0 -937
  599. package/dist/profilePlot-3FX2TPYC.js +0 -45
  600. package/dist/proteinView-WSEO3LD3.js +0 -1346
  601. package/dist/proteomeCohortCompare-KA2DF3EE.js +0 -866
  602. package/dist/pseudbulk.unit.spec-AT3TFCOW.js +0 -82
  603. package/dist/pseudobulk-4ZRHUC7W.js +0 -31
  604. package/dist/qualitative-3OBGJRP6.js +0 -241
  605. package/dist/qualitative-FHJD44OA.js +0 -34
  606. package/dist/radar2-X757WR6V.js +0 -323
  607. package/dist/radarFacility2-GUBAK4Y3.js +0 -331
  608. package/dist/rememberedGvQ.unit.spec-ADO4Y2OE.js +0 -210
  609. package/dist/render-MZEPNEMU.js +0 -29
  610. package/dist/report-TUAFDGAE.js +0 -213
  611. package/dist/sampleView-X6YKCBE7.js +0 -39
  612. package/dist/samplelst-UPNRALBH.js +0 -114
  613. package/dist/samplematrix-W3HZK3IS.js +0 -2188
  614. package/dist/sc-UL7233UR.js +0 -77
  615. package/dist/scatter-FTJ77NUM.js +0 -919
  616. package/dist/scatter-VQQRIW6N.js +0 -84
  617. package/dist/selectGenomeWithTklst-HPYPSPFI.js +0 -125
  618. package/dist/singleCellCellType-XTKGOH6H.js +0 -29
  619. package/dist/singleCellCellType.unit.spec-A62GT72A.js +0 -150
  620. package/dist/singleCellGeneExpression-X7H5GTU3.js +0 -29
  621. package/dist/singleCellGeneExpression.unit.spec-2KQBHG7O.js +0 -144
  622. package/dist/singleCellNumericValue-6YS42PZ2.js +0 -29
  623. package/dist/singleCellNumericValue.unit.spec-DNVXQFKI.js +0 -412
  624. package/dist/singleCellPlot-MGOQ7EQV.js +0 -44
  625. package/dist/singlecell-CIOB5XON.js +0 -77
  626. package/dist/singlecell-QW3SLQD6.js +0 -1562
  627. package/dist/snp-6B4MIPKL.js +0 -29
  628. package/dist/snp.unit.spec-HNILS56E.js +0 -167
  629. package/dist/snplocus-DDFLYZ2Y.js +0 -200
  630. package/dist/snplst-JYKOV73J.js +0 -36
  631. package/dist/spliceevent.a53ss.diagram-IBD5ITXR.js +0 -142
  632. package/dist/spliceevent.exonskip.diagram-ZJGEVUYW.js +0 -274
  633. package/dist/spliceevent.noeventdiagram-RNLNTFOW.js +0 -451
  634. package/dist/ssGSEA-42VQLAXL.js +0 -29
  635. package/dist/ssGSEA.unit.spec-FBJANIKG.js +0 -79
  636. package/dist/stattable-FROSNTJY.js +0 -112
  637. package/dist/studyCatalog-XIYNJ24U.js +0 -457
  638. package/dist/summarizeCnvGeneexp-N3OFI24L.js +0 -154
  639. package/dist/summarizeGeneexpSurvival-J4DO2AL4.js +0 -101
  640. package/dist/summarizeMutationCnv-Y43BBSI4.js +0 -155
  641. package/dist/summarizeMutationDiagnosis-JAEAUFCA.js +0 -31
  642. package/dist/summarizeMutationSurvival-4QZDDXDV.js +0 -95
  643. package/dist/summary-DTJZ7NNA.js +0 -40
  644. package/dist/summary.integration.spec-HRRE3J45.js +0 -405
  645. package/dist/summaryInput-WCADUZBK.js +0 -238
  646. package/dist/sunburst-BGXSCB63.js +0 -274
  647. package/dist/sunburst-DSFFFP33.js +0 -504
  648. package/dist/sunburst-DSFFFP33.js.map +0 -7
  649. package/dist/survival-LFXQIWRT.js +0 -49
  650. package/dist/survival-ONWZ5RFM.js +0 -1248
  651. package/dist/survival.integration.spec-ZP7XWHQH.js +0 -609
  652. package/dist/svgraph-2SL2SJVU.js +0 -1377
  653. package/dist/svmr-ONIPMLC2.js +0 -3834
  654. package/dist/swimmer-2EJZH5PP.js +0 -785
  655. package/dist/swimmer-2EJZH5PP.js.map +0 -7
  656. package/dist/table-LLCFO4KK.js +0 -192
  657. package/dist/termCollection-DAHJGR5P.js +0 -247
  658. package/dist/termCollection-QIN53TIL.js +0 -29
  659. package/dist/termCollection.unit.spec-FQOX2IVP.js +0 -295
  660. package/dist/termCollectionFractionSelection-UKEVVZXL.js +0 -38
  661. package/dist/termCollectionFractionSelection.unit.spec-URGEYBU2.js +0 -184
  662. package/dist/tk-4PYQ6WJQ.js +0 -1116
  663. package/dist/tk-4PYQ6WJQ.js.map +0 -7
  664. package/dist/tk-GM7CJ2LU.js +0 -37
  665. package/dist/tp.ui-TRUHW6GP.js +0 -1453
  666. package/dist/tvs.categorical-IY6YSFVN.js +0 -28
  667. package/dist/tvs.condition-YTD7GOPW.js +0 -160
  668. package/dist/tvs.density-CB24PXDE.js +0 -19
  669. package/dist/tvs.dt-AQQIZD5Z.js +0 -34
  670. package/dist/tvs.dtcnv.categorical-WOAOGJSW.js +0 -31
  671. package/dist/tvs.dtcnv.continuous-TJBEPJGO.js +0 -72
  672. package/dist/tvs.dtfusion-SFMZQKKU.js +0 -31
  673. package/dist/tvs.dtitd-Q5RQTCLD.js +0 -31
  674. package/dist/tvs.dtsnvindel-UEK4O6WI.js +0 -31
  675. package/dist/tvs.dtsv-ECS4KEYG.js +0 -31
  676. package/dist/tvs.multivalue-CJIZ3I54.js +0 -84
  677. package/dist/tvs.numeric-UFAOJR2B.js +0 -32
  678. package/dist/tvs.samplelst-BVFY2P7Q.js +0 -95
  679. package/dist/tvs.survival-L56B3I55.js +0 -110
  680. package/dist/tvs.termCollection-BFIBVBSA.js +0 -118
  681. package/dist/vocabulary-MTKDDDGB.js +0 -32
  682. package/dist/wsi.direct-OSHY7VL4.js +0 -11514
  683. /package/dist/{2dmaf-O2SQ5RGD.js.map → 2dmaf-7YU3SNKL.js.map} +0 -0
  684. /package/dist/{AggMatrixInput-LUCTWXHU.js.map → AggMatrixInput-73CDR5FS.js.map} +0 -0
  685. /package/dist/{AggregateMatrix-JVMF27YL.js.map → AggregateMatrix-NNULVFBM.js.map} +0 -0
  686. /package/dist/{AppHeader-DJU6HRKO.js.map → AppHeader-EZDDLLXU.js.map} +0 -0
  687. /package/dist/{BoxPlot-22RXMPRL.js.map → BoxPlot-463E7CRY.js.map} +0 -0
  688. /package/dist/{CorrelationVolcano-PBZWPFSN.js.map → CorrelationVolcano-LHIIMBPP.js.map} +0 -0
  689. /package/dist/{Cuminc-EL74X5GY.js.map → Cuminc-UL2TCIKV.js.map} +0 -0
  690. /package/dist/{DE-W5SAMMRW.js.map → DE-VRFSKFDW.js.map} +0 -0
  691. /package/dist/{DEinput-ZKEFJZQU.js.map → DEinput-FZTQRWVC.js.map} +0 -0
  692. /package/dist/{DM-ABKDXMDG.js.map → DM-PO7CQZNT.js.map} +0 -0
  693. /package/dist/{DifferentialAnalysis-3JTZ5WCQ.js.map → DifferentialAnalysis-WK6HE3YH.js.map} +0 -0
  694. /package/dist/{Disco-ME53U25C.js.map → Disco-YBNQJQFG.js.map} +0 -0
  695. /package/dist/{Disco.UI-F7XKJMKR.js.map → Disco.UI-HC5XYBFV.js.map} +0 -0
  696. /package/dist/{DmrPlot-OWBXUTON.js.map → DmrPlot-7VJ5C66D.js.map} +0 -0
  697. /package/dist/{GB-7X6DBWKS.js.map → GB-VPFQRDRO.js.map} +0 -0
  698. /package/dist/{GSEA-GAZIEGD7.js.map → GSEA-ZEJB3QZQ.js.map} +0 -0
  699. /package/dist/{GeneExpInput-BAOC6ICV.js.map → GeneExpInput-SBDDIY6G.js.map} +0 -0
  700. /package/dist/{Geomap-OZERLL7V.js.map → Geomap-23AHGP2V.js.map} +0 -0
  701. /package/dist/{HicApp-WDH5LVTD.js.map → HicApp-7AQQE4CM.js.map} +0 -0
  702. /package/dist/{IDCViewer-XBZFU3BU.js.map → IDCViewer-NO5Q6VOB.js.map} +0 -0
  703. /package/dist/{NumBinaryEditor-5R4EUQOZ.js.map → NumBinaryEditor-DSRP4OOU.js.map} +0 -0
  704. /package/dist/{NumBinaryEditor.unit.spec-ULBXMOYY.js.map → NumBinaryEditor.unit.spec-TT666YL4.js.map} +0 -0
  705. /package/dist/{NumContEditor-EN6V4FLQ.js.map → NumContEditor-6CURFOCH.js.map} +0 -0
  706. /package/dist/{NumContEditor.unit.spec-VDWKNIFN.js.map → NumContEditor.unit.spec-MNVCFCMP.js.map} +0 -0
  707. /package/dist/{NumCustomBinEditor-UB34ALNZ.js.map → NumCustomBinEditor-SQRR5EFL.js.map} +0 -0
  708. /package/dist/{NumCustomBinEditor.unit.spec-WZXJ7GEC.js.map → NumCustomBinEditor.unit.spec-F7BZWGGT.js.map} +0 -0
  709. /package/dist/{NumDiscreteEditor-H6J67YEL.js.map → NumDiscreteEditor-U7Z2QNYP.js.map} +0 -0
  710. /package/dist/{NumDiscreteEditor.unit.spec-KJ7YU22W.js.map → NumDiscreteEditor.unit.spec-EIEBUZCX.js.map} +0 -0
  711. /package/dist/{NumRegularBinEditor-R5JVUG7J.js.map → NumRegularBinEditor-CVZSWN6Y.js.map} +0 -0
  712. /package/dist/{NumRegularBinEditor.unit.spec-RZ73FMNO.js.map → NumRegularBinEditor.unit.spec-ZMAJOIHL.js.map} +0 -0
  713. /package/dist/{NumSplineEditor-AOR6OAJA.js.map → NumSplineEditor-U43D5NBJ.js.map} +0 -0
  714. /package/dist/{NumSplineEditor.unit.spec-Z6ZEI3UO.js.map → NumSplineEditor.unit.spec-C52AADTS.js.map} +0 -0
  715. /package/dist/{NumericDensity-SRTFTDQA.js.map → NumericDensity-PUKDZOVI.js.map} +0 -0
  716. /package/dist/{NumericDensity.unit.spec-MRREBAYU.js.map → NumericDensity.unit.spec-2347S76D.js.map} +0 -0
  717. /package/dist/{NumericHandler-7RALUACA.js.map → NumericHandler-3RT32PTR.js.map} +0 -0
  718. /package/dist/{NumericHandler.unit.spec-MDO23WRB.js.map → NumericHandler.unit.spec-4PADL4KZ.js.map} +0 -0
  719. /package/dist/{ProteomeInput-MOBXHRD5.js.map → ProteomeInput-NFV4FW4U.js.map} +0 -0
  720. /package/dist/{Regression-XWT4NNTG.js.map → Regression-N7M7N6G4.js.map} +0 -0
  721. /package/dist/{RunChart2-Q7W5MWJS.js.map → RunChart2-UPQ7C6QE.js.map} +0 -0
  722. /package/dist/{SC-MM3JTEVL.js.map → SC-KBW2NHUV.js.map} +0 -0
  723. /package/dist/{Violin-XNTBDUPG.js.map → Violin-GWCOP3ZF.js.map} +0 -0
  724. /package/dist/{Wsi-22KJSFVH.js.map → Wsi-NXAEOYIS.js.map} +0 -0
  725. /package/dist/{adSandbox-TLYWQOOA.js.map → adSandbox-RPEWEEW7.js.map} +0 -0
  726. /package/dist/{animatedBubbleChart-67SY5JGP.js.map → animatedBubbleChart-ILDMZRBX.js.map} +0 -0
  727. /package/dist/{app-FG3KPE4R.js.map → app-LOUC4J47.js.map} +0 -0
  728. /package/dist/{app-VK5LYO6B.js.map → app-MRKXZ6AZ.js.map} +0 -0
  729. /package/dist/{barchart-IGWRVB6W.js.map → barchart-CJR37234.js.map} +0 -0
  730. /package/dist/{barchart2-TT6OBJJP.js.map → barchart2-QQYLTHWR.js.map} +0 -0
  731. /package/dist/{block.init-2Y6CNK7H.js.map → block.init-YJQTJIDO.js.map} +0 -0
  732. /package/dist/{block.mds.expressionrank-VZ4JVPTG.js.map → block.mds.expressionrank-GBMEI5KQ.js.map} +0 -0
  733. /package/dist/{block.mds.geneboxplot-NYMS32JP.js.map → block.mds.geneboxplot-XWE3E5IW.js.map} +0 -0
  734. /package/dist/{block.mds.junction-3R6C3B5W.js.map → block.mds.junction-QLEHFVPE.js.map} +0 -0
  735. /package/dist/{block.mds.svcnv-SO5CYYIQ.js.map → block.mds.svcnv-53DTOPBC.js.map} +0 -0
  736. /package/dist/{block.svg-R4ASXXNW.js.map → block.svg-57T37ABS.js.map} +0 -0
  737. /package/dist/{block.tk.aicheck-LYRTDZRA.js.map → block.tk.aicheck-6DXJTS3H.js.map} +0 -0
  738. /package/dist/{block.tk.bigwig.ui-3KMMZX2M.js.map → block.tk.bigwig.ui-OYIVXE2L.js.map} +0 -0
  739. /package/dist/{block.tk.hicstraw-7HH4PGFY.js.map → block.tk.hicstraw-UKTGEBWT.js.map} +0 -0
  740. /package/dist/{block.tk.junction-BPEKLYS2.js.map → block.tk.junction-ZU5KPFQ3.js.map} +0 -0
  741. /package/dist/{block.tk.junction.textmatrixui-2QU5DL2X.js.map → block.tk.junction.textmatrixui-P4WXTAZR.js.map} +0 -0
  742. /package/dist/{block.tk.ld-TJREYPNY.js.map → block.tk.ld-3PQ4O2AE.js.map} +0 -0
  743. /package/dist/{block.tk.menu-HDBZK4YP.js.map → block.tk.menu-LLITB6UA.js.map} +0 -0
  744. /package/dist/{block.tk.pgv-G5GCYBK2.js.map → block.tk.pgv-Y3FBXUO3.js.map} +0 -0
  745. /package/dist/{brainImaging-ODWHF7WZ.js.map → brainImaging-4B3WXLNP.js.map} +0 -0
  746. /package/dist/{brainRegions-DC7DEA7N.js.map → brainRegions-7VLONUWN.js.map} +0 -0
  747. /package/dist/{bubbleHeatmap-T5ACULRL.js.map → bubbleHeatmap-DI6GJRR6.js.map} +0 -0
  748. /package/dist/{cellTypeBubbleHeatmap-RQINXXTK.js.map → cellTypeBubbleHeatmap-HJY53DB2.js.map} +0 -0
  749. /package/dist/{chunk-TWTPWEYL.js.map → chunk-226MNBZ2.js.map} +0 -0
  750. /package/dist/{chunk-AUPTEHV7.js.map → chunk-2CNFGVHU.js.map} +0 -0
  751. /package/dist/{chunk-DJMDETVU.js.map → chunk-2MC3RNKA.js.map} +0 -0
  752. /package/dist/{chunk-2PHFY3VP.js.map → chunk-2OMX5AYB.js.map} +0 -0
  753. /package/dist/{chunk-64JHE3GV.js.map → chunk-2SL4QWUS.js.map} +0 -0
  754. /package/dist/{chunk-WETOH7YW.js.map → chunk-3KGBC5MK.js.map} +0 -0
  755. /package/dist/{chunk-UAB5PGOP.js.map → chunk-3PCRAPUV.js.map} +0 -0
  756. /package/dist/{chunk-ZWLT5QS3.js.map → chunk-4DBOMSKP.js.map} +0 -0
  757. /package/dist/{chunk-2UB6JZ3I.js.map → chunk-57BS6KNI.js.map} +0 -0
  758. /package/dist/{chunk-UJIB7QM3.js.map → chunk-5AXS5G4A.js.map} +0 -0
  759. /package/dist/{chunk-NS2MZN3C.js.map → chunk-5DI4UNH5.js.map} +0 -0
  760. /package/dist/{chunk-ATZNXW5F.js.map → chunk-5HJG6ECV.js.map} +0 -0
  761. /package/dist/{chunk-NYEFSOKD.js.map → chunk-5ZYANHGX.js.map} +0 -0
  762. /package/dist/{chunk-WV44DGEJ.js.map → chunk-6T4MN7LV.js.map} +0 -0
  763. /package/dist/{chunk-QM724EG2.js.map → chunk-75MRUW2K.js.map} +0 -0
  764. /package/dist/{chunk-7PQVNQFR.js.map → chunk-7J3W3KCN.js.map} +0 -0
  765. /package/dist/{chunk-4OOQ52ET.js.map → chunk-AIZYAKIE.js.map} +0 -0
  766. /package/dist/{chunk-VBDJG6GZ.js.map → chunk-AJNFI6GA.js.map} +0 -0
  767. /package/dist/{chunk-NQMS7WV3.js.map → chunk-BJAWDZBL.js.map} +0 -0
  768. /package/dist/{chunk-VOXUMZMG.js.map → chunk-C6PVZVIH.js.map} +0 -0
  769. /package/dist/{chunk-24ZS2XWC.js.map → chunk-C77X5ZUV.js.map} +0 -0
  770. /package/dist/{chunk-LSRFRZNP.js.map → chunk-C7KUMZQM.js.map} +0 -0
  771. /package/dist/{chunk-6MUJGVOH.js.map → chunk-C7ROKWV2.js.map} +0 -0
  772. /package/dist/{chunk-XVEEMQAT.js.map → chunk-CAH6LJ5Z.js.map} +0 -0
  773. /package/dist/{chunk-RIL33JCW.js.map → chunk-CUCP2GMT.js.map} +0 -0
  774. /package/dist/{chunk-FOUMNTII.js.map → chunk-DTGAMBRJ.js.map} +0 -0
  775. /package/dist/{chunk-7ZEJKFGW.js.map → chunk-DXT7GDHY.js.map} +0 -0
  776. /package/dist/{chunk-IKZQST6E.js.map → chunk-ENPMWVWG.js.map} +0 -0
  777. /package/dist/{chunk-DXM5MQCZ.js.map → chunk-EYKJQJ7R.js.map} +0 -0
  778. /package/dist/{chunk-B2KYLEYM.js.map → chunk-FE5TCBIT.js.map} +0 -0
  779. /package/dist/{chunk-UCB3W3OT.js.map → chunk-FJ2JV2VK.js.map} +0 -0
  780. /package/dist/{chunk-DRESQF33.js.map → chunk-FZYVPRVQ.js.map} +0 -0
  781. /package/dist/{chunk-5TPWMYBG.js.map → chunk-GBKQHVKJ.js.map} +0 -0
  782. /package/dist/{chunk-2QFMKWNS.js.map → chunk-GUW7VTUL.js.map} +0 -0
  783. /package/dist/{chunk-3GQ54XTJ.js.map → chunk-H7F6DMJA.js.map} +0 -0
  784. /package/dist/{chunk-IPRYYK26.js.map → chunk-HH3NUAR2.js.map} +0 -0
  785. /package/dist/{chunk-A6ZUYQHO.js.map → chunk-HRTPGNOG.js.map} +0 -0
  786. /package/dist/{chunk-H3YF55ZI.js.map → chunk-IFPRYTS7.js.map} +0 -0
  787. /package/dist/{chunk-YBOHXANC.js.map → chunk-IJSFSUI4.js.map} +0 -0
  788. /package/dist/{chunk-BJCET6RU.js.map → chunk-IRQKX6DL.js.map} +0 -0
  789. /package/dist/{chunk-GN2A5NL5.js.map → chunk-JHLF2ZC2.js.map} +0 -0
  790. /package/dist/{chunk-ALIMVUHR.js.map → chunk-JNZL7HKB.js.map} +0 -0
  791. /package/dist/{chunk-GX6G2SSW.js.map → chunk-K2ARLT2A.js.map} +0 -0
  792. /package/dist/{chunk-SO76DLSZ.js.map → chunk-K3G56J5R.js.map} +0 -0
  793. /package/dist/{chunk-WCNMP54T.js.map → chunk-KKUCG2QE.js.map} +0 -0
  794. /package/dist/{chunk-D6U65W7Q.js.map → chunk-KPXCXBNU.js.map} +0 -0
  795. /package/dist/{chunk-6YGSVJJD.js.map → chunk-MANAUI7R.js.map} +0 -0
  796. /package/dist/{chunk-7XW4JWMJ.js.map → chunk-MEUSRAOE.js.map} +0 -0
  797. /package/dist/{chunk-NR6WFCPF.js.map → chunk-MHWYRNGA.js.map} +0 -0
  798. /package/dist/{chunk-MP7BA3GK.js.map → chunk-MSTYU3QO.js.map} +0 -0
  799. /package/dist/{chunk-MVSUESEV.js.map → chunk-MWARRQT4.js.map} +0 -0
  800. /package/dist/{chunk-YNQFOPS6.js.map → chunk-MXKYPTZ7.js.map} +0 -0
  801. /package/dist/{chunk-NUA66GW7.js.map → chunk-NX5IB4IY.js.map} +0 -0
  802. /package/dist/{chunk-4ENIOXIT.js.map → chunk-OZUF7O2S.js.map} +0 -0
  803. /package/dist/{chunk-SLHXR4BZ.js.map → chunk-QNCE6EOK.js.map} +0 -0
  804. /package/dist/{chunk-5NI77Z3O.js.map → chunk-RIHO7ZD5.js.map} +0 -0
  805. /package/dist/{chunk-LYX4S6WA.js.map → chunk-RV335DF2.js.map} +0 -0
  806. /package/dist/{chunk-3IE6FDVA.js.map → chunk-THAUD62Q.js.map} +0 -0
  807. /package/dist/{chunk-JL3PYV5F.js.map → chunk-VBTBUXXX.js.map} +0 -0
  808. /package/dist/{chunk-FTGLS763.js.map → chunk-VHWJK2MP.js.map} +0 -0
  809. /package/dist/{chunk-K6VYSDB5.js.map → chunk-VLIOMJDR.js.map} +0 -0
  810. /package/dist/{chunk-U2GHNZ4N.js.map → chunk-VMK4RHV5.js.map} +0 -0
  811. /package/dist/{chunk-GWNCQ5YI.js.map → chunk-WKT7RF3C.js.map} +0 -0
  812. /package/dist/{chunk-ETXOEP4N.js.map → chunk-WXSMUSU7.js.map} +0 -0
  813. /package/dist/{chunk-ZYAZHJPZ.js.map → chunk-WXSX5OQJ.js.map} +0 -0
  814. /package/dist/{chunk-CTVPW77S.js.map → chunk-WY3IORKG.js.map} +0 -0
  815. /package/dist/{chunk-WKGKKM6F.js.map → chunk-WYSOOKFJ.js.map} +0 -0
  816. /package/dist/{chunk-TUO5I6LP.js.map → chunk-XBBFFOLS.js.map} +0 -0
  817. /package/dist/{chunk-YVQ4USPP.js.map → chunk-XSRQGX5H.js.map} +0 -0
  818. /package/dist/{chunk-KSS26PXB.js.map → chunk-YLL6CTBL.js.map} +0 -0
  819. /package/dist/{chunk-ANBGNYNP.js.map → chunk-YPBY37KD.js.map} +0 -0
  820. /package/dist/{chunk-DKPAOVJH.js.map → chunk-YUNJBIK4.js.map} +0 -0
  821. /package/dist/{chunk-IANE75G3.js.map → chunk-Z5ECCUNG.js.map} +0 -0
  822. /package/dist/{cohort-QSLKB4ZO.js.map → cohort-5WL6UJOS.js.map} +0 -0
  823. /package/dist/{cohortSunburst-AQFSNJ5K.js.map → cohortSunburst-R3Z5KJQL.js.map} +0 -0
  824. /package/dist/{condition-MLS6TJHV.js.map → condition-2IILUMVB.js.map} +0 -0
  825. /package/dist/{controls-ZT3GZ667.js.map → controls-G3JITZF5.js.map} +0 -0
  826. /package/dist/{controls.config-F7NIPLKB.js.map → controls.config-BO7KPPET.js.map} +0 -0
  827. /package/dist/{correlation-ZEIQJGSQ.js.map → correlation-CZILLVEM.js.map} +0 -0
  828. /package/dist/{customdata.inputui-6PJSAJK2.js.map → customdata.inputui-BXFQAMTR.js.map} +0 -0
  829. /package/dist/{databrowser.ui-EMZ5L2Y7.js.map → databrowser.ui-V2NJQF3U.js.map} +0 -0
  830. /package/dist/{dictionary-U2BWGY6B.js.map → dictionary-OVAQX6R3.js.map} +0 -0
  831. /package/dist/{dnaMethylation-R34E2XNC.js.map → dnaMethylation-DHPFRXB2.js.map} +0 -0
  832. /package/dist/{dnaMethylation.integration.spec-4Z2AJHWY.js.map → dnaMethylation.integration.spec-PJLIRGN5.js.map} +0 -0
  833. /package/dist/{dofetch-JY4A7BYI.js.map → dofetch-KBTN6OW4.js.map} +0 -0
  834. /package/dist/{e2pca-WSSCXX6A.js.map → e2pca-O7SNMJGB.js.map} +0 -0
  835. /package/dist/{ep-ATUWEHDJ.js.map → ep-NIVLKG4S.js.map} +0 -0
  836. /package/dist/{expclust.gdc.spec-QRIRRPO7.js.map → expclust.gdc.spec-LVCD6C43.js.map} +0 -0
  837. /package/dist/{facet-5VDCSP3S.js.map → facet-LB4SCXE4.js.map} +0 -0
  838. /package/dist/{gb-Y4UG6LFA.js.map → gb-3IJ4NCPO.js.map} +0 -0
  839. /package/dist/{geneExpClustering-OO67JNJ2.js.map → geneExpClustering-SIAC7CMA.js.map} +0 -0
  840. /package/dist/{geneExpression-KPRFXKU7.js.map → geneExpression-KPUOZ4PT.js.map} +0 -0
  841. /package/dist/{geneExpression-5KGV3MAA.js.map → geneExpression-P2TTZXN2.js.map} +0 -0
  842. /package/dist/{geneExpression.unit.spec-YV45EZ5O.js.map → geneExpression.unit.spec-Q5D6XHUF.js.map} +0 -0
  843. /package/dist/{geneORA-R74JPUTC.js.map → geneORA-PKUIJKTL.js.map} +0 -0
  844. /package/dist/{geneRanking-IJTXNMHV.js.map → geneRanking-ZGT5MHBV.js.map} +0 -0
  845. /package/dist/{geneVariant-JT3EGAIH.js.map → geneVariant-24YNANTT.js.map} +0 -0
  846. /package/dist/{geneVariant-HBAHT6LU.js.map → geneVariant-CDGENHWQ.js.map} +0 -0
  847. /package/dist/{geneVariant.integration.spec-TFQYPUAS.js.map → geneVariant.integration.spec-7QW4C2WO.js.map} +0 -0
  848. /package/dist/{genefusion.ui-MMTQMTHC.js.map → genefusion.ui-NVXGSBXD.js.map} +0 -0
  849. /package/dist/{geneset-VMBICNCZ.js.map → geneset-7STL6UDD.js.map} +0 -0
  850. /package/dist/{genomeBrowser.spec-2XLLIYGA.js.map → genomeBrowser.spec-OE2CIP7I.js.map} +0 -0
  851. /package/dist/{grin2-2RYPEUWV.js.map → grin2-2HXUIY5O.js.map} +0 -0
  852. /package/dist/{grin2-Y6KAFVV2.js.map → grin2-32IIJR5E.js.map} +0 -0
  853. /package/dist/{hierCluster-EKGFBQT4.js.map → hierCluster-MDZEI2KB.js.map} +0 -0
  854. /package/dist/{hierCluster-Z4PVNMGS.js.map → hierCluster-T3PZUGBI.js.map} +0 -0
  855. /package/dist/{hierCluster.config-Q6WUNK2K.js.map → hierCluster.config-7UN6AYGB.js.map} +0 -0
  856. /package/dist/{hierCluster.integration.spec-2LHSHNFC.js.map → hierCluster.integration.spec-DWOYVK6T.js.map} +0 -0
  857. /package/dist/{hierCluster.interactivity-OGQ3KUY6.js.map → hierCluster.interactivity-5OM6XNFG.js.map} +0 -0
  858. /package/dist/{hierCluster.renderers-3GJZXG75.js.map → hierCluster.renderers-YGX6MZZW.js.map} +0 -0
  859. /package/dist/{imagePlot-ZJEZPBX7.js.map → imagePlot-KBRXDV5G.js.map} +0 -0
  860. /package/dist/{importPlot-GFEFYEHZ.js.map → importPlot-DJMIC22L.js.map} +0 -0
  861. /package/dist/{isoformExpression-A2X3DSR6.js.map → isoformExpression-SWDWADRC.js.map} +0 -0
  862. /package/dist/{isoformExpression.unit.spec-VKMEGCL4.js.map → isoformExpression.unit.spec-2U5KCYBP.js.map} +0 -0
  863. /package/dist/{junction-HWIHLQU2.js.map → junction-NMXVVGRG.js.map} +0 -0
  864. /package/dist/{junction.customTerm-C3VWXEYH.js.map → junction.customTerm-3R2GNE3A.js.map} +0 -0
  865. /package/dist/{junction.unit.spec-ZYJGDOXJ.js.map → junction.unit.spec-JTGBPPN7.js.map} +0 -0
  866. /package/dist/{launch.adhoc-HW5AZM4T.js.map → launch.adhoc-YB5SKMNY.js.map} +0 -0
  867. /package/dist/{leftlabel.sample-MTW2HRRQ.js.map → leftlabel.sample-QKXIODCS.js.map} +0 -0
  868. /package/dist/{lollipop-VWW5H6CR.js.map → lollipop-TSZ62PBH.js.map} +0 -0
  869. /package/dist/{maf-KEJYO3H4.js.map → maf-4L5YN4CG.js.map} +0 -0
  870. /package/dist/{maftimeline-MJZDSGSR.js.map → maftimeline-VOYB3NY3.js.map} +0 -0
  871. /package/dist/{matrix-3UJW6LOA.js.map → matrix-IWJECVTF.js.map} +0 -0
  872. /package/dist/{matrix-W4AX5OBM.js.map → matrix-MMJAJZA7.js.map} +0 -0
  873. /package/dist/{matrix.cells-5DAIZ3E5.js.map → matrix.cells-5RTZUJVN.js.map} +0 -0
  874. /package/dist/{matrix.config-PK26VPQT.js.map → matrix.config-DZGOZWJS.js.map} +0 -0
  875. /package/dist/{matrix.data-UK5DGKBK.js.map → matrix.data-Y5TPRGMW.js.map} +0 -0
  876. /package/dist/{matrix.groups-NM4Q5YDN.js.map → matrix.groups-6DXCAY4P.js.map} +0 -0
  877. /package/dist/{matrix.integration.spec-FGWNBCRR.js.map → matrix.integration.spec-2N237E7T.js.map} +0 -0
  878. /package/dist/{matrix.interactivity-4C37PII5.js.map → matrix.interactivity-FL33UUKR.js.map} +0 -0
  879. /package/dist/{matrix.layout-ODV7WXUP.js.map → matrix.layout-7SYHV3KJ.js.map} +0 -0
  880. /package/dist/{matrix.legend-5MY7OXWN.js.map → matrix.legend-S3E76TVO.js.map} +0 -0
  881. /package/dist/{matrix.renderers-QA7W7ZUL.js.map → matrix.renderers-3SIBT2RP.js.map} +0 -0
  882. /package/dist/{matrix.serieses-4FSFJPCK.js.map → matrix.serieses-3UGLZW25.js.map} +0 -0
  883. /package/dist/{matrix.sort-3QLFMBJ5.js.map → matrix.sort-A7CNLDUJ.js.map} +0 -0
  884. /package/dist/{matrix.sort.unit.spec-HVOC6IYT.js.map → matrix.sort.unit.spec-L3H44T6I.js.map} +0 -0
  885. /package/dist/{matrix.sorterUi-EY3SA6CG.js.map → matrix.sorterUi-6PZR3YOD.js.map} +0 -0
  886. /package/dist/{matrix.sorterUi.unit.spec-OAXWPZZI.js.map → matrix.sorterUi.unit.spec-2NRU5UFH.js.map} +0 -0
  887. /package/dist/{matrix.unit.spec-RAL7AU22.js.map → matrix.unit.spec-HRZIJB6T.js.map} +0 -0
  888. /package/dist/{mavb-KIM63AC4.js.map → mavb-ZVRQSDPS.js.map} +0 -0
  889. /package/dist/{mds.fimo-DMAVM56P.js.map → mds.fimo-ZKETTET7.js.map} +0 -0
  890. /package/dist/{mds.samplescatterplot-KILTR2C7.js.map → mds.samplescatterplot-ZV3UNRLP.js.map} +0 -0
  891. /package/dist/{mds.survivalplot-PV76ANBP.js.map → mds.survivalplot-OVXZRTU4.js.map} +0 -0
  892. /package/dist/{multivalue-2V5LMQY7.js.map → multivalue-6BE5IA4F.js.map} +0 -0
  893. /package/dist/{numericDictTermCluster-TGL4X6UC.js.map → numericDictTermCluster-6XDVVWLE.js.map} +0 -0
  894. /package/dist/{oncomatrix-2O7SLXHX.js.map → oncomatrix-XK62NEOO.js.map} +0 -0
  895. /package/dist/{oncomatrix.spec-HZJKOF5G.js.map → oncomatrix.spec-YVTCHOPS.js.map} +0 -0
  896. /package/dist/{plot.2dvaf-424NNMMA.js.map → plot.2dvaf-NUOBWMNX.js.map} +0 -0
  897. /package/dist/{plot.app-YBZDNST2.js.map → plot.app-G6IQWXTV.js.map} +0 -0
  898. /package/dist/{plot.barplot-YZQBYJUY.js.map → plot.barplot-6QJ6HEJR.js.map} +0 -0
  899. /package/dist/{plot.boxplot-5OW6IBQL.js.map → plot.boxplot-XKQJSW2O.js.map} +0 -0
  900. /package/dist/{plot.brainImaging-H3ABPPD3.js.map → plot.brainImaging-UTHFJFXU.js.map} +0 -0
  901. /package/dist/{plot.disco-X7KCDWGX.js.map → plot.disco-3MSCX7TM.js.map} +0 -0
  902. /package/dist/{plot.ssgq-GYRVHTC7.js.map → plot.ssgq-4KBVHF42.js.map} +0 -0
  903. /package/dist/{plot.vaf2cov-B2TELPHL.js.map → plot.vaf2cov-OGUQSSDS.js.map} +0 -0
  904. /package/dist/{polar2-5KNZRLXY.js.map → polar2-V7M56GTZ.js.map} +0 -0
  905. /package/dist/{profileForms-FY34KXCL.js.map → profileForms-TS3BJLHH.js.map} +0 -0
  906. /package/dist/{profilePlot-3FX2TPYC.js.map → profilePlot-DP5272HR.js.map} +0 -0
  907. /package/dist/{proteinView-WSEO3LD3.js.map → proteinView-K4K4SP3L.js.map} +0 -0
  908. /package/dist/{proteomeCohortCompare-KA2DF3EE.js.map → proteomeCohortCompare-SFWVGLFK.js.map} +0 -0
  909. /package/dist/{pseudbulk.unit.spec-AT3TFCOW.js.map → pseudbulk.unit.spec-NFOA7J2C.js.map} +0 -0
  910. /package/dist/{pseudobulk-4ZRHUC7W.js.map → pseudobulk-XKZQEZ4I.js.map} +0 -0
  911. /package/dist/{qualitative-3OBGJRP6.js.map → qualitative-7OSFNVI5.js.map} +0 -0
  912. /package/dist/{qualitative-FHJD44OA.js.map → qualitative-OIIN6E4Y.js.map} +0 -0
  913. /package/dist/{radar2-X757WR6V.js.map → radar2-AHZJKX7S.js.map} +0 -0
  914. /package/dist/{radarFacility2-GUBAK4Y3.js.map → radarFacility2-OUW6D5E7.js.map} +0 -0
  915. /package/dist/{rememberedGvQ.unit.spec-ADO4Y2OE.js.map → rememberedGvQ.unit.spec-SHTMMZGG.js.map} +0 -0
  916. /package/dist/{render-MZEPNEMU.js.map → render-7UZSGX3Q.js.map} +0 -0
  917. /package/dist/{report-TUAFDGAE.js.map → report-J7HKTXZ2.js.map} +0 -0
  918. /package/dist/{sampleView-X6YKCBE7.js.map → sampleView-6547OUIM.js.map} +0 -0
  919. /package/dist/{samplelst-UPNRALBH.js.map → samplelst-UHF23UEB.js.map} +0 -0
  920. /package/dist/{samplematrix-W3HZK3IS.js.map → samplematrix-OOKS3TMR.js.map} +0 -0
  921. /package/dist/{sc-UL7233UR.js.map → sc-WF2BLGNG.js.map} +0 -0
  922. /package/dist/{scatter-VQQRIW6N.js.map → scatter-ABCVFGRV.js.map} +0 -0
  923. /package/dist/{scatter-FTJ77NUM.js.map → scatter-WF7XM3IA.js.map} +0 -0
  924. /package/dist/{selectGenomeWithTklst-HPYPSPFI.js.map → selectGenomeWithTklst-67HU5KRB.js.map} +0 -0
  925. /package/dist/{singleCellCellType-XTKGOH6H.js.map → singleCellCellType-3FZPJ25V.js.map} +0 -0
  926. /package/dist/{singleCellCellType.unit.spec-A62GT72A.js.map → singleCellCellType.unit.spec-TOMREHWK.js.map} +0 -0
  927. /package/dist/{singleCellGeneExpression-X7H5GTU3.js.map → singleCellGeneExpression-NQTJ5KJQ.js.map} +0 -0
  928. /package/dist/{singleCellGeneExpression.unit.spec-2KQBHG7O.js.map → singleCellGeneExpression.unit.spec-ZWUQTU2N.js.map} +0 -0
  929. /package/dist/{singleCellNumericValue-6YS42PZ2.js.map → singleCellNumericValue-VI7H722L.js.map} +0 -0
  930. /package/dist/{singleCellNumericValue.unit.spec-DNVXQFKI.js.map → singleCellNumericValue.unit.spec-QGLHES7H.js.map} +0 -0
  931. /package/dist/{singleCellPlot-MGOQ7EQV.js.map → singleCellPlot-RU5T6SJK.js.map} +0 -0
  932. /package/dist/{singlecell-QW3SLQD6.js.map → singlecell-C3CJVNXP.js.map} +0 -0
  933. /package/dist/{singlecell-CIOB5XON.js.map → singlecell-NRQZ7KC6.js.map} +0 -0
  934. /package/dist/{snp-6B4MIPKL.js.map → snp-X6XY65VS.js.map} +0 -0
  935. /package/dist/{snp.unit.spec-HNILS56E.js.map → snp.unit.spec-6EENK7GQ.js.map} +0 -0
  936. /package/dist/{snplocus-DDFLYZ2Y.js.map → snplocus-R4JA6TFT.js.map} +0 -0
  937. /package/dist/{snplst-JYKOV73J.js.map → snplst-SOWVHSXH.js.map} +0 -0
  938. /package/dist/{spliceevent.a53ss.diagram-IBD5ITXR.js.map → spliceevent.a53ss.diagram-IRLCCVQZ.js.map} +0 -0
  939. /package/dist/{spliceevent.exonskip.diagram-ZJGEVUYW.js.map → spliceevent.exonskip.diagram-4KG7LE5D.js.map} +0 -0
  940. /package/dist/{spliceevent.noeventdiagram-RNLNTFOW.js.map → spliceevent.noeventdiagram-OWXAJJX7.js.map} +0 -0
  941. /package/dist/{ssGSEA-42VQLAXL.js.map → ssGSEA-EMOKPLMP.js.map} +0 -0
  942. /package/dist/{ssGSEA.unit.spec-FBJANIKG.js.map → ssGSEA.unit.spec-KXQ7R5WH.js.map} +0 -0
  943. /package/dist/{stattable-FROSNTJY.js.map → stattable-H2G7MOZG.js.map} +0 -0
  944. /package/dist/{studyCatalog-XIYNJ24U.js.map → studyCatalog-3ITQXWFL.js.map} +0 -0
  945. /package/dist/{summarizeCnvGeneexp-N3OFI24L.js.map → summarizeCnvGeneexp-ZIPU6YDY.js.map} +0 -0
  946. /package/dist/{summarizeGeneexpSurvival-J4DO2AL4.js.map → summarizeGeneexpSurvival-3RYU226R.js.map} +0 -0
  947. /package/dist/{summarizeMutationCnv-Y43BBSI4.js.map → summarizeMutationCnv-RGDBUB22.js.map} +0 -0
  948. /package/dist/{summarizeMutationDiagnosis-JAEAUFCA.js.map → summarizeMutationDiagnosis-Z4MZE6Y4.js.map} +0 -0
  949. /package/dist/{summarizeMutationSurvival-4QZDDXDV.js.map → summarizeMutationSurvival-Z5CNRH7E.js.map} +0 -0
  950. /package/dist/{summary-DTJZ7NNA.js.map → summary-6QQCNX3B.js.map} +0 -0
  951. /package/dist/{summary.integration.spec-HRRE3J45.js.map → summary.integration.spec-3ULXTZUP.js.map} +0 -0
  952. /package/dist/{summaryInput-WCADUZBK.js.map → summaryInput-4QKR34QB.js.map} +0 -0
  953. /package/dist/{termCollection-QIN53TIL.js.map → sunburst-KB3BWC72.js.map} +0 -0
  954. /package/dist/{sunburst-BGXSCB63.js.map → sunburst-XTFBHZNH.js.map} +0 -0
  955. /package/dist/{survival-LFXQIWRT.js.map → survival-7O6ZK63E.js.map} +0 -0
  956. /package/dist/{survival-ONWZ5RFM.js.map → survival-NNCY4K6C.js.map} +0 -0
  957. /package/dist/{survival.integration.spec-ZP7XWHQH.js.map → survival.integration.spec-ZYZHZAXA.js.map} +0 -0
  958. /package/dist/{svgraph-2SL2SJVU.js.map → svgraph-ZLSFFEAC.js.map} +0 -0
  959. /package/dist/{svmr-ONIPMLC2.js.map → svmr-REBBDEYM.js.map} +0 -0
  960. /package/dist/{table-LLCFO4KK.js.map → table-CWIQQESJ.js.map} +0 -0
  961. /package/dist/{termCollectionFractionSelection-UKEVVZXL.js.map → termCollection-7TYJSQ45.js.map} +0 -0
  962. /package/dist/{termCollection-DAHJGR5P.js.map → termCollection-7Z55QNL7.js.map} +0 -0
  963. /package/dist/{termCollection.unit.spec-FQOX2IVP.js.map → termCollection.unit.spec-LQ5MIBDH.js.map} +0 -0
  964. /package/dist/{tk-GM7CJ2LU.js.map → termCollectionFractionSelection-24DZYVDU.js.map} +0 -0
  965. /package/dist/{termCollectionFractionSelection.unit.spec-URGEYBU2.js.map → termCollectionFractionSelection.unit.spec-DCV2CFS5.js.map} +0 -0
  966. /package/dist/{tvs.categorical-IY6YSFVN.js.map → tk-2WZFPRCP.js.map} +0 -0
  967. /package/dist/{tp.ui-TRUHW6GP.js.map → tp.ui-HXQX2UH4.js.map} +0 -0
  968. /package/dist/{tvs.density-CB24PXDE.js.map → tvs.categorical-4D3JI2ER.js.map} +0 -0
  969. /package/dist/{tvs.condition-YTD7GOPW.js.map → tvs.condition-62FXFHZ5.js.map} +0 -0
  970. /package/dist/{tvs.dt-AQQIZD5Z.js.map → tvs.density-IGO4I4T2.js.map} +0 -0
  971. /package/dist/{tvs.numeric-UFAOJR2B.js.map → tvs.dt-FZSVMJOO.js.map} +0 -0
  972. /package/dist/{tvs.dtcnv.categorical-WOAOGJSW.js.map → tvs.dtcnv.categorical-PPFQIC42.js.map} +0 -0
  973. /package/dist/{tvs.dtcnv.continuous-TJBEPJGO.js.map → tvs.dtcnv.continuous-TV2IGHY4.js.map} +0 -0
  974. /package/dist/{tvs.dtfusion-SFMZQKKU.js.map → tvs.dtfusion-ON4BA4XJ.js.map} +0 -0
  975. /package/dist/{tvs.dtitd-Q5RQTCLD.js.map → tvs.dtitd-VFNROOWQ.js.map} +0 -0
  976. /package/dist/{tvs.dtsnvindel-UEK4O6WI.js.map → tvs.dtsnvindel-ZXOP37T5.js.map} +0 -0
  977. /package/dist/{tvs.dtsv-ECS4KEYG.js.map → tvs.dtsv-EUHPTW7J.js.map} +0 -0
  978. /package/dist/{tvs.multivalue-CJIZ3I54.js.map → tvs.multivalue-NHVXZNDI.js.map} +0 -0
  979. /package/dist/{vocabulary-MTKDDDGB.js.map → tvs.numeric-FPWDPO3J.js.map} +0 -0
  980. /package/dist/{tvs.samplelst-BVFY2P7Q.js.map → tvs.samplelst-ZZHRNUP4.js.map} +0 -0
  981. /package/dist/{tvs.survival-L56B3I55.js.map → tvs.survival-F3KSG3U6.js.map} +0 -0
  982. /package/dist/{tvs.termCollection-BFIBVBSA.js.map → tvs.termCollection-B37DZLDY.js.map} +0 -0
  983. /package/dist/{wsi.direct-OSHY7VL4.js.map → wsi.direct-3YH3QGQD.js.map} +0 -0
@@ -0,0 +1,2102 @@
1
+ import {
2
+ recoverInit
3
+ } from "./chunk-4E2F26CC.js";
4
+ import {
5
+ getSavedStateRefusal,
6
+ markSavedState,
7
+ parentCorsMessage
8
+ } from "./chunk-O6T4SDC7.js";
9
+ import {
10
+ chartsInit,
11
+ escapeHtml,
12
+ fillTermWrapper,
13
+ filterRxCompInit,
14
+ first_genetrack_tolist,
15
+ getDNAMethUnit,
16
+ getFilterItemByTag,
17
+ getSampleFilter,
18
+ groupsInit,
19
+ keyupEnter,
20
+ renderTable,
21
+ sayerror,
22
+ table2col,
23
+ to_textfile
24
+ } from "./chunk-WD7FZ5EE.js";
25
+ import {
26
+ importPlot
27
+ } from "./chunk-WXSMUSU7.js";
28
+ import {
29
+ Menu
30
+ } from "./chunk-CNFTQSNE.js";
31
+ import {
32
+ icons
33
+ } from "./chunk-3CIL7KH7.js";
34
+ import {
35
+ dofetch3
36
+ } from "./chunk-4TJO2DGU.js";
37
+ import {
38
+ trimGvTermsForSave
39
+ } from "./chunk-JHLF2ZC2.js";
40
+ import {
41
+ DNA_METHYLATION,
42
+ dtcnv,
43
+ dtfusionrna,
44
+ dtsnvindel,
45
+ dtsv
46
+ } from "./chunk-WJLRU5OF.js";
47
+ import {
48
+ getCompInit,
49
+ multiInit
50
+ } from "./chunk-HBNB5TRH.js";
51
+ import {
52
+ select_default
53
+ } from "./chunk-I6Y4O3RR.js";
54
+
55
+ // mass/about.ts
56
+ var cohortTableActiveColor = "yellow";
57
+ var MassAbout = class _MassAbout {
58
+ constructor(opts) {
59
+ this.initCohort = (appState) => {
60
+ if (this.selectCohort == null) return;
61
+ if (!this.selectCohort.values) return;
62
+ const instanceNum2 = this.instanceNum;
63
+ const activeCohort = appState.activeCohort;
64
+ const app = this.app;
65
+ this.dom.cohortOpts.append("table").attr("data-testid", "sjpp-about-cohort-options-table").selectAll("tr").data(this.selectCohort.values).enter().append("tr").each(function(d, i, nodes) {
66
+ const tr = select_default(nodes[i]);
67
+ const td0 = tr.append("td");
68
+ const radioName = "sja-termdb-cohort-" + instanceNum2;
69
+ const radioId = radioName + "-" + i;
70
+ td0.append("input").style("scale", "1.2").attr("type", "radio").attr("name", radioName).attr("id", radioId).attr("value", i).property("checked", i === activeCohort).style("margin-right", "5px").style("margin-left", "0px").on("click", async (event) => {
71
+ const state = app.getState();
72
+ const clearOnChange = state.termdbConfig.selectCohort.clearOnChange;
73
+ if (clearOnChange) {
74
+ const subactions = [];
75
+ const toBeCleared = [];
76
+ const plots = state.plots;
77
+ const filter = state.termfilter.filter.lst.find((f) => f.tag == "filterUiRoot")?.lst;
78
+ const groups = state.groups;
79
+ if (clearOnChange.plots && plots?.length) toBeCleared.push("plots");
80
+ for (const plot of plots) {
81
+ subactions.push({
82
+ type: "plot_delete",
83
+ id: plot.id
84
+ });
85
+ }
86
+ if (clearOnChange.filter && filter?.length) toBeCleared.push("filters");
87
+ subactions.push({
88
+ type: "filter_replace",
89
+ filter: {
90
+ type: "tvslst",
91
+ in: true,
92
+ join: "",
93
+ tag: "filterUiRoot",
94
+ lst: []
95
+ }
96
+ });
97
+ if (clearOnChange.groups && groups?.length) {
98
+ toBeCleared.push("groups");
99
+ for (const group of groups) {
100
+ subactions.push({
101
+ type: "delete_group",
102
+ name: group.name
103
+ });
104
+ }
105
+ for (const term of state.customTerms) {
106
+ subactions.push({
107
+ type: "delete_customTerm",
108
+ name: term.name
109
+ });
110
+ }
111
+ }
112
+ subactions.push({ type: "cohort_set", activeCohort: i });
113
+ if (toBeCleared.length) {
114
+ const confirm = window.confirm(
115
+ `Changing the cohort will clear all ${joinByComma(
116
+ toBeCleared
117
+ )}. To proceed, click "OK". To save the session, click "Cancel" and then click the "Session" button at the top of the page.`
118
+ );
119
+ if (!confirm) {
120
+ event.preventDefault();
121
+ return;
122
+ }
123
+ }
124
+ app.dispatch({
125
+ type: "app_refresh",
126
+ subactions
127
+ });
128
+ } else app.dispatch({ type: "cohort_set", activeCohort: i });
129
+ });
130
+ td0.append("label").style("font-size", "1.4em").attr("for", radioId).attr("colspan", 2).style("cursor", "pointer").html((d2) => d2.label);
131
+ tr.selectAll("td").style("max-width", "600px").style("padding-bottom", "10px").style("padding-right", "20px").style("vertical-align", "top");
132
+ });
133
+ this.dom.cohortTable = this.subheader.append("div").attr("data-testid", "sjpp-about-cohort-table").style("margin-left", "12px");
134
+ if (this.selectCohort.asterisk) {
135
+ this.dom.cohortAsterisk = this.subheader.append("div").attr("data-testid", "sjpp-about-cohort-asterisk").style("margin", "10px").style("font-size", ".8em").text(this.selectCohort.asterisk);
136
+ }
137
+ };
138
+ this.renderCohortsTable = async () => {
139
+ if (!this.dom.cohortTable) return;
140
+ this.dom.cohortTable.selectAll("*").remove();
141
+ const columns = [{ label: "Feature" }];
142
+ const rows = [];
143
+ const result = await this.app.vocabApi.getCohortsData();
144
+ if ("error" in result) throw result.error;
145
+ if (this.selectCohort?.values) {
146
+ const values = this.selectCohort.values;
147
+ result.cohorts.sort((a, b) => {
148
+ const aIndex = values.findIndex((v) => v.keys.toString() == a.cohort);
149
+ const bIndex = values.findIndex((v) => v.keys.toString() == b.cohort);
150
+ if (aIndex < bIndex) return -1;
151
+ if (aIndex > bIndex) return 1;
152
+ return 0;
153
+ });
154
+ }
155
+ if (!result.cfeatures.length) return;
156
+ for (const feature of result.features) rows.push([{ value: feature.name }]);
157
+ for (const cohort of result.cohorts) {
158
+ if (cohort.subcohorts?.length) continue;
159
+ columns.push({ label: cohort.name });
160
+ for (const [i, feature] of result.features.entries()) {
161
+ const cf = result.cfeatures.find((cf2) => cf2.idfeature === feature.idfeature && cf2.cohort === cohort.cohort);
162
+ if (cf) rows[i].push({ value: cf.value });
163
+ }
164
+ }
165
+ renderTable({
166
+ rows,
167
+ columns,
168
+ div: this.dom.cohortTable,
169
+ showLines: false,
170
+ maxHeight: "60vh",
171
+ header: { style: { "font-size": "1.2em", "font-weight": "bold" } }
172
+ });
173
+ this.dom.cohortTable.select("table").style("border-collapse", "collapse");
174
+ this.dom.cohortTable.selectAll(`tbody > tr > td`).style("background-color", "transparent").style("padding", "6px");
175
+ const state = this.app.getState();
176
+ const selectCohort = state.termdbConfig.selectCohort;
177
+ const activeCohort = state.activeCohort;
178
+ const keys = selectCohort.values[activeCohort].keys;
179
+ let selector = `tbody > tr > td:nth-child(${activeCohort + 2})`;
180
+ const combined = keys.length > 1;
181
+ if (combined) {
182
+ selector = "";
183
+ for (const key of keys) {
184
+ const i = result.cohorts.map((c) => c.cohort).indexOf(key);
185
+ if (selector !== "") selector += ",";
186
+ selector += `tbody > tr > td:nth-child(${i + 2})`;
187
+ }
188
+ }
189
+ const activeColumns = this.dom.cohortTable.selectAll(selector);
190
+ const color = state.termdbConfig.massNav?.activeColor || cohortTableActiveColor;
191
+ activeColumns.style("background-color", color);
192
+ };
193
+ this.initCustomHtml = () => {
194
+ if (this.selectCohort != null) return;
195
+ if (!this.aboutOverrides?.html) return;
196
+ this.subheader.append("div").attr("data-testid", "sjpp-custom-about-content").style("padding", "10px").html(this.aboutOverrides.html);
197
+ };
198
+ // render the world map (from termdbConfig.geomap) directly on the landing tab when the dataset opts in.
199
+ // the renderer (and its ~170KB world.json basemap) is dynamically imported so it never loads for
200
+ // datasets that don't enable the map.
201
+ this.initGeomap = async (appState) => {
202
+ if (!this.aboutOverrides?.showGeomap) return;
203
+ const geomap = appState.termdbConfig?.geomap;
204
+ if (!geomap?.sites?.length) return;
205
+ const holder = this.subheader.append("div").attr("data-testid", "sjpp-about-geomap").style("padding", "10px");
206
+ const { renderGeomap } = await import("./render-7UZSGX3Q.js");
207
+ renderGeomap(holder, geomap);
208
+ };
209
+ // render the sunburst of the dataset's default rings when the dataset opts in. like the geomap,
210
+ // its module is dynamically imported so it only loads for datasets that show it; main() draws it
211
+ this.initSunburst = (appState) => {
212
+ if (!this.aboutOverrides?.showSunburst) return;
213
+ if (!appState.termdbConfig?.sunburst?.twLst?.length) return;
214
+ const s = this.aboutOverrides.showSunburst;
215
+ const placed = typeof s == "object" ? this.getSectionHolder(s.holderSelector, "showSunburst") : void 0;
216
+ const section = (placed || this.subheader.append("div")).style("padding", "10px");
217
+ if (typeof s == "object") this.sectionHeading(section, s.title, s.description);
218
+ const holder = section.append("div").style("display", "flex").style("justify-content", "center").style("margin-bottom", "32px");
219
+ const onOpen = () => this.launchActiveItem({ plot: { chartType: "sunburst" } }, holder.node());
220
+ this.sunburst = import("./aboutSunburst-5EKXZV2A.js").then((_) => new _.AboutSunburst(holder, this.app, onOpen)).catch((e) => {
221
+ holder.append("div").attr("class", "sja_errorbar").text(e?.message || String(e));
222
+ console.error(e);
223
+ });
224
+ };
225
+ // the element of the custom html that a section's holderSelector (a css selector from the dataset)
226
+ // selects; undefined without one, or when it selects nothing, and then the section follows the content above
227
+ this.getSectionHolder = (selector, section) => {
228
+ if (!selector) return;
229
+ let el;
230
+ try {
231
+ el = this.subheader.select(selector);
232
+ } catch (_) {
233
+ }
234
+ if (el && !el.empty()) return el;
235
+ console.error(`about tab: ${section}.holderSelector '${selector}' selects no element of the html; shown at the end`);
236
+ };
237
+ // a section's centered heading and text, from the dataset; nothing if neither is given
238
+ this.sectionHeading = (holder, title, description) => {
239
+ if (!title && !description) return;
240
+ const div = holder.append("div").style("text-align", "center").style("margin", "24px 0 12px 0");
241
+ if (title)
242
+ div.append("div").attr("data-testid", "sjpp-about-section-title").style("font-size", "1.4em").style("font-weight", "600").style("color", "#243b53").html(title);
243
+ if (description)
244
+ div.append("div").style("margin-top", "6px").style("font-size", ".95em").style("color", "#4b5563").html(description);
245
+ };
246
+ this.initActiveItems = () => {
247
+ if (!this.aboutOverrides?.activeItems) return;
248
+ const placed = this.getSectionHolder(this.aboutOverrides.activeItems.holderSelector, "activeItems");
249
+ const holder = placed || this.subheader;
250
+ const { title, description } = this.aboutOverrides.activeItems;
251
+ this.sectionHeading(holder, title, description);
252
+ if (this.aboutOverrides.activeItems.layout == "cards") {
253
+ this.initActiveItemCards(holder);
254
+ return;
255
+ }
256
+ const div = holder.append("div").attr("data-testid", "sjpp-custom-about-activeItems").style("padding", placed ? "0px 0px 10px 0px" : "0px 0px 10px 20px");
257
+ for (const item of this.aboutOverrides.activeItems.items) {
258
+ const btn = div.append("div").style("display", "inline-block").style("margin", "5px").attr("class", "sja_menuoption").attr("data-testid", "sjpp-custom-active-item-btn").html(item.title);
259
+ this.makeActivatable(btn, () => this.launchActiveItem(item, btn.node()));
260
+ }
261
+ };
262
+ // render activeItems as large square tiles (homepage style) that lift on hover
263
+ this.initActiveItemCards = (parent) => {
264
+ const items = this.aboutOverrides.activeItems.items;
265
+ const holder = parent.append("div").attr("data-testid", "sjpp-custom-about-activeItems").style("display", "flex").style("flex-wrap", "wrap").style("justify-content", "center").style("gap", "24px").style("padding", "20px 20px 30px 20px");
266
+ for (const item of items) {
267
+ const card = holder.append("div").attr("class", "sjpp-about-card").attr("data-testid", "sjpp-custom-active-item-card");
268
+ if (item.icon) card.append("div").attr("class", "sjpp-about-card-icon").html(item.icon);
269
+ card.append("div").attr("class", "sjpp-about-card-title").html(item.title);
270
+ card.append("div").attr("class", "sjpp-about-card-subtitle").text(item.subtitle || "");
271
+ this.makeActivatable(card, () => this.launchActiveItem(item, card.node()));
272
+ }
273
+ };
274
+ // make a non-native clickable element (a styled <div>) operable like a button:
275
+ this.makeActivatable = (sel, onActivate) => {
276
+ sel.attr("role", "button").attr("tabindex", 0).on("click", () => onActivate()).on("keydown", (event) => {
277
+ if (event.key == "Enter" || event.key == " ") {
278
+ event.preventDefault();
279
+ onActivate();
280
+ }
281
+ });
282
+ };
283
+ // launch behavior shared by button and card layouts
284
+ this.launchActiveItem = async (item, anchorEl) => {
285
+ if (item.menu) {
286
+ this.openItemMenu(item.menu, anchorEl);
287
+ return;
288
+ }
289
+ if (item.openChartMenu) {
290
+ await this.openChartMenu(item.openChartMenu, anchorEl);
291
+ return;
292
+ }
293
+ if (!item.plot) {
294
+ console.error("about activeItem has neither .plot nor .openChartMenu", item);
295
+ return;
296
+ }
297
+ await this.app.dispatch({
298
+ type: "tab_set",
299
+ activeTab: 1
300
+ });
301
+ this.app.dispatch({
302
+ type: "plot_create",
303
+ id: getId(),
304
+ config: structuredClone(item.plot)
305
+ });
306
+ };
307
+ // menu of launch items in labelled groups, anchored to the tile. An entry with its own
308
+ // chart menu (e.g. a gene search) replaces this menu's content in place; other entries
309
+ // hide the menu and launch their plot.
310
+ this.openItemMenu = (groups, anchorEl) => {
311
+ const menu = this.chartMenu || (this.chartMenu = new Menu({ padding: "0px" }));
312
+ menu.clear();
313
+ const holder = menu.d.append("div").style("padding", "6px 0").style("min-width", "260px");
314
+ for (const group of groups) {
315
+ if (group.label) {
316
+ holder.append("div").style("padding", "6px 14px 2px").style("font-size", "0.75em").style("font-weight", "bold").style("letter-spacing", "0.05em").style("text-transform", "uppercase").style("color", "#777").text(group.label);
317
+ }
318
+ for (const entry of group.items || []) {
319
+ const row = holder.append("div").attr("class", "sja_menuoption").style("padding", "6px 14px");
320
+ row.append("div").style("font-weight", "600").html(entry.title);
321
+ if (entry.subtitle) row.append("div").style("font-size", "0.8em").style("color", "#666").text(entry.subtitle);
322
+ this.makeActivatable(row, async () => {
323
+ if (!entry.openChartMenu && !entry.menu) menu.hide();
324
+ await this.launchActiveItem(entry, anchorEl);
325
+ });
326
+ }
327
+ }
328
+ menu.showunder(anchorEl);
329
+ };
330
+ // open a chart-specific launch menu (e.g. gene search for proteinView) anchored to the tile.
331
+ // the chart module is dynamically imported so its code only loads when the tile is clicked.
332
+ this.openChartMenu = async (chartType, anchorEl) => {
333
+ const menu = this.chartMenu || (this.chartMenu = new Menu({ padding: "0px" }));
334
+ menu.clear();
335
+ const shimApp = {
336
+ opts: this.app.opts,
337
+ dispatch: async (action) => {
338
+ if (action.type == "plot_create") await this.app.dispatch({ type: "tab_set", activeTab: 1 });
339
+ return this.app.dispatch(action);
340
+ }
341
+ };
342
+ const chartsInstanceShim = { app: shimApp, dom: { tip: menu } };
343
+ const _ = await importPlot(chartType);
344
+ if (typeof _.makeChartBtnMenu != "function")
345
+ throw `about activeItem openChartMenu: chart '${chartType}' has no makeChartBtnMenu`;
346
+ _.makeChartBtnMenu(menu.d.append("div"), chartsInstanceShim, chartType);
347
+ menu.showunder(anchorEl);
348
+ };
349
+ this.initDisclaimer = () => {
350
+ const d = this.aboutOverrides?.disclaimer;
351
+ if (!d) return;
352
+ const div = this.subheader.append("div").attr("data-testid", "sjpp-custom-about-disclaimer").style("margin", "10px 0 20px 10px").style("opacity", 0.7).style("padding", "10px").style("background-color", "#f8f9fa").style("border-left", "4px solid #6c757d").style("font-size", "0.8em");
353
+ div.append("div").style("margin-bottom", "8px").style("font-weight", "bold").text("DISCLAIMER");
354
+ div.append("div").text(d.text);
355
+ };
356
+ this.showServerInfo = () => {
357
+ const state = this.app.getState();
358
+ const about = state.termdbConfig.massNav?.tabs?.about;
359
+ if (!about && !this.app.opts.pkgver && !this.app.opts.launchDate) return;
360
+ const dataRelease = about?.dataRelease;
361
+ const additionalInfo = about?.additionalInfo;
362
+ const div = this.subheader.append("div").attr("data-testid", "sjpp-about-server-info").style("margin", "10px").style("font-size", ".8em");
363
+ const htmlArr = [];
364
+ if (dataRelease) {
365
+ htmlArr.push(`Data Release: <a href=${dataRelease.link} target=_blank>${dataRelease.version}</a>`);
366
+ }
367
+ if (this.app.opts.pkgver) {
368
+ htmlArr.push(
369
+ `Software Release: <a href=https://github.com/stjude/proteinpaint/pkgs/container/ppfull target=_blank>${this.app.opts.pkgver}</a>`
370
+ );
371
+ }
372
+ if (this.app.opts.launchDate) {
373
+ htmlArr.push(`Server Launched: ${this.app.opts.launchDate}`);
374
+ }
375
+ if (additionalInfo) {
376
+ htmlArr.push(additionalInfo);
377
+ }
378
+ div.append("div").html(htmlArr.join("; "));
379
+ };
380
+ this.opts = opts;
381
+ this.type = _MassAbout.type;
382
+ this.app = opts.app;
383
+ this.subheader = opts.subheader;
384
+ this.instanceNum = opts.instanceNum;
385
+ this.aboutOverrides = opts.aboutOverrides;
386
+ this.selectCohort = opts.selectCohort;
387
+ this.dom = {
388
+ cohortDescription: this.subheader.append("div").attr("data-testid", "sjpp-about-cohort-desc").style("margin-left", "10px")
389
+ };
390
+ if (opts?.selectCohort?.title) {
391
+ this.dom.cohortTitle = opts.subheader.append("h2").attr("data-testid", "sjpp-about-cohort-title").style("margin-left", "10px").text(opts.selectCohort.title);
392
+ }
393
+ if (opts.selectCohort?.prompt) {
394
+ this.dom.cohortPrompt = this.subheader.append("div").attr("data-testid", "sjpp-about-cohort-prompt").style("margin-left", "10px").style("padding-top", "30px").style("padding-bottom", "10px").style("font-weight", "bold").style("font-size", "1.2em").text(opts.selectCohort.prompt);
395
+ }
396
+ if (opts.selectCohort) {
397
+ this.dom.cohortOpts = this.subheader.append("div").style("margin-bottom", "30px").style("margin-left", "10px");
398
+ }
399
+ }
400
+ static {
401
+ this.type = "about";
402
+ }
403
+ /* render all contents into this.subheader
404
+ do it through init() means that contents are rendered just once on launching mass ui and won't be rerendered or updated
405
+ since there's no reason to update about tab contents while user is interacting with mass ui
406
+ */
407
+ init(appState) {
408
+ this.initCohort(appState);
409
+ this.initCustomHtml();
410
+ this.initGeomap(appState);
411
+ this.initSunburst(appState);
412
+ this.initActiveItems();
413
+ this.initDisclaimer();
414
+ this.showServerInfo();
415
+ }
416
+ async main() {
417
+ if (this.state.nav.activeTab !== 0) return;
418
+ await this.renderCohortsTable();
419
+ if (this.sunburst) await (await this.sunburst)?.update(this.state);
420
+ if (this.opts.selectCohort) {
421
+ if (this.opts.selectCohort.description) {
422
+ this.dom.cohortDescription.html(this.opts.selectCohort.description);
423
+ } else if (this.opts.selectCohort.descriptionByCohort) {
424
+ this.dom.cohortDescription.html(
425
+ this.opts.selectCohort.descriptionByCohort[this.state.termdbConfig.selectCohort.values[this.state.activeCohort].keys.join(",")]
426
+ );
427
+ }
428
+ }
429
+ }
430
+ destroy() {
431
+ void this.sunburst?.then((sunburst) => sunburst?.chart.destroy());
432
+ }
433
+ };
434
+ var aboutInit = getCompInit(MassAbout);
435
+ function joinByComma(arr) {
436
+ if (!arr.length) return "";
437
+ else if (arr.length == 1) return arr[0];
438
+ else if (arr.length == 2) return arr.join(" and ");
439
+ else return `${arr.slice(0, -1).join(", ")}, and ${arr.slice(-1)}`;
440
+ }
441
+
442
+ // mass/search.ts
443
+ var MIN_PROMPT_LENGTH_FOR_GENE_SEARCH = 1;
444
+ var MIN_PROMPT_LENGTH_FOR_OTHER_SEARCH = 3;
445
+ var MAX_PROMPT_LENGTH_FOR_OMNISEARCH = 20;
446
+ function makeMethylationRegionTerm(opts, vocabApi) {
447
+ const { chr, start, stop } = opts;
448
+ if (!chr || !Number.isInteger(start) || !Number.isInteger(stop)) throw new Error("invalid coordinate");
449
+ return {
450
+ chr,
451
+ start,
452
+ stop,
453
+ type: DNA_METHYLATION,
454
+ unit: getDNAMethUnit("region", vocabApi),
455
+ genomicFeatureType: "region"
456
+ };
457
+ }
458
+ async function embedMethylationRegionPicker(opts) {
459
+ const { holder, genomeObj, vocabApi, chr, start, stop, callback } = opts;
460
+ if (!chr || !Number.isInteger(start) || !Number.isInteger(stop)) throw new Error("unable to retrieve gene coordinate");
461
+ holder.selectAll("*").remove();
462
+ holder.style("display", "block");
463
+ holder.append("div").style("opacity", 0.6).text("Navigate genome browser to desired region");
464
+ const arg = {
465
+ holder,
466
+ genome: genomeObj,
467
+ // genome obj
468
+ chr,
469
+ start,
470
+ stop,
471
+ tklst: [],
472
+ nobox: true,
473
+ width: 500,
474
+ hidegenelegend: true,
475
+ debugmode: opts.debug
476
+ };
477
+ first_genetrack_tolist(genomeObj, arg.tklst);
478
+ const _ = await import("./block-GLF6QNKY.js");
479
+ const blockInstance = new _.Block(arg);
480
+ holder.append("div").attr("data-testid", "sjpp-dnaMethylation-submitDiv").style("margin", "10px 0px").append("button").style("border", "none").style("border-radius", "20px").style("padding", "10px 15px").text("Submit Region").on("click", async () => {
481
+ const { chr: chr2, start: start2, stop: stop2 } = blockInstance.rglst[0];
482
+ await callback(makeMethylationRegionTerm({ chr: chr2, start: start2, stop: stop2 }, vocabApi));
483
+ });
484
+ return blockInstance;
485
+ }
486
+ function parseCoordCandidates(prompt2) {
487
+ const m = /^\s*(\w+)\s*:\s*([\d,]+)\s*-\s*([\d,]+)\s*$/.exec(prompt2);
488
+ if (!m) return null;
489
+ const [, chrToken, start, stop] = m;
490
+ const chrCandidates = /^chr/i.test(chrToken) ? [chrToken, chrToken.replace(/^chr/i, "")] : [chrToken, "chr" + chrToken];
491
+ return chrCandidates.map((chr) => `${chr}:${start}-${stop}`);
492
+ }
493
+ async function handleOmnisearchKeyup(self, event) {
494
+ if (keyupEnter(event)) return;
495
+ const prompt2 = event.target.value.trim();
496
+ if (!prompt2) {
497
+ self.dom.noMatchShown = false;
498
+ self.clear({ hide: true });
499
+ return;
500
+ }
501
+ const coordCandidates = parseCoordCandidates(prompt2);
502
+ if (coordCandidates || MIN_PROMPT_LENGTH_FOR_GENE_SEARCH <= prompt2.length && prompt2.length <= MAX_PROMPT_LENGTH_FOR_OMNISEARCH) {
503
+ try {
504
+ await doSearch(self, prompt2, coordCandidates);
505
+ } catch (e) {
506
+ if (e.stack) console.log(e.stack);
507
+ sayerror(self.dom.resultDiv, "Error: " + (e.message || e));
508
+ }
509
+ } else {
510
+ self.dom.noMatchShown = false;
511
+ self.clear({ hide: true });
512
+ }
513
+ }
514
+ async function fetchOmnisearch(opts) {
515
+ const data = await dofetch3("termdb/chat", {
516
+ body: {
517
+ genome: opts.genome,
518
+ dslabel: opts.dslabel,
519
+ omnisearch: true,
520
+ prompt: opts.prompt,
521
+ cohortStr: opts.cohortStr,
522
+ usecase: opts.usecase,
523
+ treeFilter: opts.treeFilter,
524
+ coordCandidates: opts.coordCandidates || void 0,
525
+ // gene search runs from 1 char; dictionary + sample search only once the prompt reaches the
526
+ // longer cutoff, so the server skips them (and their all-samples scan) for short prompts
527
+ includeDictAndSampleSearch: opts.prompt.trim().length >= MIN_PROMPT_LENGTH_FOR_OTHER_SEARCH
528
+ }
529
+ });
530
+ if (data.error) throw data.error;
531
+ return data;
532
+ }
533
+ function renderOmnisearchResults(self, data) {
534
+ const coord = data.coord || null;
535
+ const dictItems = Array.isArray(data.dictionaryTerms) ? data.dictionaryTerms : [];
536
+ const genes = Array.isArray(data.genes) ? data.genes : [];
537
+ const dictNames = new Set(dictItems.map((t) => t.name?.toUpperCase()));
538
+ const geneMap = /* @__PURE__ */ new Map();
539
+ for (const g of genes) {
540
+ const gene = g?.gene;
541
+ if (!gene || dictNames.has(gene.toUpperCase())) continue;
542
+ const dt = g.dataTypes || {};
543
+ const geneVariantTypes = [];
544
+ if (dt.snvindel) geneVariantTypes.push({ label: "SNV/indel", testid: "snvindel", dtCandidates: [dtsnvindel] });
545
+ if (dt.cnv) geneVariantTypes.push({ label: "CNV", testid: "cnv", dtCandidates: [dtcnv] });
546
+ if (dt.svfusion)
547
+ geneVariantTypes.push({ label: "SV/fusion", testid: "svfusion", dtCandidates: [dtsv, dtfusionrna] });
548
+ const entry = { name: gene, gene, isGene: true };
549
+ if (dt.geneExpression) entry.isGeneExpression = true;
550
+ if (geneVariantTypes.length) {
551
+ entry.isGeneVariant = true;
552
+ entry.geneVariantTypes = geneVariantTypes;
553
+ }
554
+ if (dt.genomeBrowser) {
555
+ entry.isGenomeBrowser = true;
556
+ entry.coord = g.coord;
557
+ }
558
+ if (dt.dnaMethylation) {
559
+ entry.isMethylation = true;
560
+ entry.coord = g.coord;
561
+ }
562
+ if (entry.isGeneExpression || entry.isGeneVariant || entry.isGenomeBrowser || entry.isMethylation) {
563
+ geneMap.set(gene.toUpperCase(), entry);
564
+ }
565
+ }
566
+ const geneItems = [...geneMap.values()];
567
+ const sampleItems = (Array.isArray(data.samples) ? data.samples : []).filter((s) => s?.name).map((s) => ({
568
+ isSample: true,
569
+ name: s.name,
570
+ sampleId: s.id,
571
+ singleCell: s.singleCell,
572
+ facetTracks: s.assays,
573
+ wsimages: s.wsimages
574
+ }));
575
+ const coordItems = coord ? [{ isCoord: true, name: `${coord.chr}:${coord.start.toLocaleString()}-${coord.stop.toLocaleString()}`, coord }] : [];
576
+ const totals = data.totals || {};
577
+ const lst = [];
578
+ for (const group of [
579
+ {
580
+ key: "dictionary",
581
+ heading: "Dictionary",
582
+ noun: "dictionary variable",
583
+ items: dictItems,
584
+ returned: dictItems.length,
585
+ total: totals.dictionaryTerms
586
+ },
587
+ {
588
+ key: "genes",
589
+ heading: "Genes",
590
+ noun: "gene",
591
+ items: geneItems,
592
+ returned: Array.isArray(data.genes) ? data.genes.length : 0,
593
+ total: totals.genes
594
+ },
595
+ {
596
+ key: "samples",
597
+ heading: "Samples",
598
+ noun: "sample",
599
+ items: sampleItems,
600
+ returned: sampleItems.length,
601
+ total: totals.samples
602
+ },
603
+ {
604
+ key: "coord",
605
+ heading: "Genomic region",
606
+ noun: "",
607
+ items: coordItems,
608
+ returned: coordItems.length,
609
+ total: void 0
610
+ }
611
+ ]) {
612
+ if (!group.items.length) continue;
613
+ lst.push({ isHeading: true, name: group.heading });
614
+ for (const item of group.items) lst.push(item);
615
+ if (typeof group.total == "number" && group.total > group.returned) {
616
+ lst.push({
617
+ isNote: true,
618
+ testid: `sjpp-mass-chat-note-${group.key}`,
619
+ name: `Displaying ${group.items.length} out of a total of ${group.total} ${group.noun} matches`
620
+ });
621
+ }
622
+ }
623
+ if (!lst.length) {
624
+ if (!self.dom.noMatchShown) {
625
+ self.dom.noMatchShown = true;
626
+ self.noResult();
627
+ }
628
+ } else {
629
+ self.dom.noMatchShown = false;
630
+ self.showTerms({ lst });
631
+ }
632
+ }
633
+ async function doSearch(self, prompt2, coordCandidates) {
634
+ if (!prompt2) {
635
+ self.clear({ hide: true });
636
+ return;
637
+ }
638
+ const seq = self.omnisearchSeq = (self.omnisearchSeq || 0) + 1;
639
+ const data = await fetchOmnisearch({
640
+ genome: self.app.vocabApi.vocab.genome,
641
+ dslabel: self.app.vocabApi.vocab.dslabel,
642
+ prompt: prompt2,
643
+ cohortStr: self.getState(self.app.getState()).cohortStr,
644
+ usecase: self.opts.usecase,
645
+ treeFilter: self.app.vocabApi.state?.treeFilter,
646
+ coordCandidates
647
+ });
648
+ if (seq !== self.omnisearchSeq) return;
649
+ renderOmnisearchResults(self, data);
650
+ }
651
+ function setSearchRenderers(self) {
652
+ let text = "No match";
653
+ if (self.isChat) {
654
+ text = "No match. Using the chatbot...";
655
+ }
656
+ self.noResult = () => {
657
+ self.clear();
658
+ self.dom.resultDiv.append("div").text(text).style("padding", "3px 3px 3px 0px").style("opacity", 0.5);
659
+ clearTimeout(self.noResultTimer);
660
+ self.noResultTimer = setTimeout(() => {
661
+ self.clear({ hide: true });
662
+ }, 1500);
663
+ };
664
+ self.showTerms = (data) => {
665
+ clearTimeout(self.noResultTimer);
666
+ if (self.opts.disable_terms)
667
+ data.lst.forEach((t) => {
668
+ if (t.disabled) self.opts.disable_terms.push(t);
669
+ });
670
+ self.clear({ hide: !data.lst.length });
671
+ if (data.lst.length) {
672
+ self.dom.resultDiv.append("table").selectAll().data(data.lst).enter().append("tr").each(self.showTerm);
673
+ }
674
+ };
675
+ self.launchPlot = async (config) => {
676
+ if (self.state?.nav?.activeTab == 0) {
677
+ await self.app.dispatch({ type: "tab_set", activeTab: 1 });
678
+ }
679
+ self.app.dispatch({ type: "plot_create", config });
680
+ self.dom.inputNode.value = "";
681
+ self.clear({ hide: true });
682
+ };
683
+ self.launchGeneVariantPlot = async (gene, dtCandidates) => {
684
+ let tw;
685
+ let lastErr;
686
+ for (const dt of dtCandidates) {
687
+ const candidate = {
688
+ term: {
689
+ id: gene,
690
+ name: gene,
691
+ genes: [{ kind: "gene", id: gene, gene, name: gene, type: "geneVariant" }],
692
+ type: "geneVariant"
693
+ },
694
+ q: { type: "predefined-groupset", dtLst: [dt] }
695
+ };
696
+ try {
697
+ await fillTermWrapper(candidate, self.app.vocabApi);
698
+ tw = candidate;
699
+ break;
700
+ } catch (e) {
701
+ lastErr = e;
702
+ }
703
+ }
704
+ if (!tw) throw lastErr;
705
+ await self.launchPlot({ chartType: "summary", term: tw });
706
+ };
707
+ self.launchGenomeBrowserView = async (mode, opts) => {
708
+ if (mode == "protein") {
709
+ if (!opts.gene) throw new Error("gene symbol required for protein view");
710
+ await self.launchPlot({
711
+ chartType: "genomeBrowser",
712
+ geneSearchResult: { geneSymbol: opts.gene },
713
+ blockIsProteinMode: true
714
+ });
715
+ return;
716
+ }
717
+ if (!opts.coord) throw new Error("coordinate required for genomic view");
718
+ await self.launchPlot({
719
+ chartType: "genomeBrowser",
720
+ geneSearchResult: { chr: opts.coord.chr, start: opts.coord.start, stop: opts.coord.stop },
721
+ blockIsProteinMode: false
722
+ });
723
+ };
724
+ self.launchGenomeBrowser = async (gene, coord) => {
725
+ const gbRestrictMode = self.app.getState().termdbConfig?.queries?.gbRestrictMode;
726
+ if (gbRestrictMode == "protein") {
727
+ await self.launchGenomeBrowserView("protein", { gene });
728
+ return;
729
+ }
730
+ if (gbRestrictMode == "genomic") {
731
+ if (!coord) throw new Error(`Unable to resolve genomic coordinates for gene "${gene}".`);
732
+ await self.launchGenomeBrowserView("genomic", { coord });
733
+ return;
734
+ }
735
+ self.dom.tip.clear();
736
+ self.dom.tip.showunder(self.dom.inputNode);
737
+ const holder = self.dom.resultDiv.append("div").style("margin", "10px");
738
+ holder.append("div").style("margin-bottom", "5px").text(gene);
739
+ const btndiv = holder.append("div");
740
+ const addViewBtn = (label, testid, mode) => {
741
+ btndiv.append("button").attr("data-testid", testid).style("margin-right", "10px").text(label).on(
742
+ "click",
743
+ () => void self.launchGenomeBrowserView(mode, { gene, coord }).catch((e) => sayerror(self.dom.resultDiv, "Error: " + (e?.message || e)))
744
+ );
745
+ };
746
+ addViewBtn(`Protein view of ${gene}`, `sjpp-mass-chat-gb-protein-${gene}`, "protein");
747
+ if (coord) addViewBtn(`Genomic view of ${gene}`, `sjpp-mass-chat-gb-genomic-${gene}`, "genomic");
748
+ };
749
+ self.launchMethylationPlot = async (gene, coord) => {
750
+ if (!coord) throw new Error(`Could not resolve coordinates for gene "${gene}"`);
751
+ self.dom.tip.clear();
752
+ self.dom.tip.showunder(self.dom.inputNode);
753
+ const holder = self.dom.resultDiv.append("div").style("margin", "10px");
754
+ holder.append("div").style("margin-bottom", "5px").text(gene);
755
+ await embedMethylationRegionPicker({
756
+ holder: holder.append("div"),
757
+ genomeObj: self.app.opts.genome,
758
+ vocabApi: self.app.vocabApi,
759
+ chr: coord.chr,
760
+ start: coord.start,
761
+ stop: coord.stop,
762
+ callback: async (term) => {
763
+ await self.launchPlot({ chartType: "summary", term: { term } });
764
+ }
765
+ });
766
+ };
767
+ self.launchSurvivalWithCovariate = async (covariateField, covariateTw) => {
768
+ self.dom.tip.clear();
769
+ self.dom.tip.showunder(self.dom.inputNode);
770
+ const action = { type: "plot_create", config: { chartType: "survival", [covariateField]: covariateTw } };
771
+ const termdb = await import("./app-LOUC4J47.js");
772
+ termdb.appInit({
773
+ vocabApi: self.app.vocabApi,
774
+ holder: self.dom.tip.d.append("div"),
775
+ state: { nav: { header_mode: "search_only" }, tree: { usecase: { target: "survival", detail: "term" } } },
776
+ tree: {
777
+ click_term: (term) => {
778
+ action.config.term = term.term ? term : { term };
779
+ self.dom.tip.hide();
780
+ self.app.dispatch(action);
781
+ }
782
+ }
783
+ });
784
+ };
785
+ self.renderGeneCategories = (holder, item) => {
786
+ const hasSurvival = self.app.vocabApi.termdbConfig?.allowedTermTypes?.includes("survival");
787
+ const addRow = (label) => {
788
+ const row = holder.append("div").style("margin", "4px 0");
789
+ row.append("span").style("font-weight", "bold").style("margin-right", "8px").text(label + ":");
790
+ return row;
791
+ };
792
+ const addBtn = (row, label, testid, onClick) => {
793
+ row.append("span").attr("class", "sja_menuoption").attr("data-testid", testid).style("display", "inline-block").style("margin", "0px 3px").style("padding", "5px 10px").style("border-radius", "5px").style("cursor", "pointer").text(label).on("click", () => void onClick().catch((e) => sayerror(self.dom.resultDiv, "Error: " + (e?.message || e))));
794
+ };
795
+ if (item.isGeneExpression) {
796
+ const row = addRow("Gene Expression");
797
+ addBtn(row, "Summary", `sjpp-mass-chat-gene-exp-${item.gene}`, async () => {
798
+ await self.launchPlot({
799
+ chartType: "summary",
800
+ term: { term: { gene: item.gene, name: item.name, type: "geneExpression" } }
801
+ });
802
+ });
803
+ if (hasSurvival) {
804
+ addBtn(row, "Survival", `sjpp-mass-chat-gene-exp-survival-${item.gene}`, async () => {
805
+ await self.launchSurvivalWithCovariate("term2", {
806
+ term: { gene: item.gene, name: item.name, type: "geneExpression" }
807
+ });
808
+ });
809
+ }
810
+ }
811
+ if (item.isGeneVariant) {
812
+ const label = (item.geneVariantTypes || []).map((vt) => vt.label).join("/");
813
+ const allDtCandidates = (item.geneVariantTypes || []).flatMap((vt) => vt.dtCandidates);
814
+ const row = addRow(label);
815
+ addBtn(row, "Summary", `sjpp-mass-chat-gene-variant-${item.gene}`, async () => {
816
+ await self.launchGeneVariantPlot(item.gene, allDtCandidates);
817
+ });
818
+ addBtn(row, "Protein view", `sjpp-mass-chat-gene-protein-${item.gene}`, async () => {
819
+ await self.launchGenomeBrowserView("protein", { gene: item.gene });
820
+ });
821
+ addBtn(row, "Genome view", `sjpp-mass-chat-gene-genomic-${item.gene}`, async () => {
822
+ await self.launchGenomeBrowserView("genomic", { coord: item.coord });
823
+ });
824
+ }
825
+ if (item.isMethylation) {
826
+ const row = addRow("DNA methylation");
827
+ addBtn(row, "Summary", `sjpp-mass-chat-gene-methylation-${item.gene}`, async () => {
828
+ await self.launchMethylationPlot(item.gene, item.coord);
829
+ });
830
+ }
831
+ };
832
+ self.showTerm = function(item) {
833
+ const tr = select_default(this);
834
+ if (item.isHeading) {
835
+ tr.append("td").attr("colspan", 2).attr("data-testid", `sjpp-mass-chat-heading-${item.name.toLowerCase().replace(/\s+/g, "-")}`).text(item.name).style("padding", "6px 10px 2px").style("font-weight", "bold").style("font-size", "0.85em").style("text-transform", "uppercase").style("opacity", 0.5);
836
+ return;
837
+ }
838
+ if (item.isNote) {
839
+ tr.append("td").attr("colspan", 2).attr("data-testid", item.testid || "sjpp-mass-chat-note").text(item.name).style("padding", "2px 10px 6px").style("font-size", "0.8em").style("font-style", "italic").style("opacity", 0.6);
840
+ return;
841
+ }
842
+ if (item.isCoord) {
843
+ tr.append("td").text(item.name).style("padding", "5px 10px");
844
+ tr.append("td").append("span").attr("class", "sja_menuoption").attr("data-testid", "sjpp-mass-chat-coord-genomebrowser").style("display", "inline-block").style("margin", "0px 3px").style("padding", "5px 10px").style("border-radius", "5px").style("cursor", "pointer").text("Genome Browser").on(
845
+ "click",
846
+ () => void self.launchGenomeBrowserView("genomic", { coord: item.coord }).catch((e) => sayerror(self.dom.resultDiv, "Error: " + (e?.message || e)))
847
+ );
848
+ return;
849
+ }
850
+ if (item.isSample) {
851
+ tr.append("td").text(item.name).style("padding", "5px 10px");
852
+ tr.append("td").append("span").attr("class", "sja_menuoption").attr("data-testid", `sjpp-mass-chat-sample-view-${item.sampleId}`).style("display", "inline-block").style("margin", "0px 3px").style("padding", "5px 10px").style("border-radius", "5px").style("cursor", "pointer").text("Sample View").on(
853
+ "click",
854
+ () => void self.launchPlot({
855
+ chartType: "sampleView",
856
+ sample: { sampleId: item.sampleId, sampleName: item.name }
857
+ }).catch((e) => sayerror(self.dom.resultDiv, "Error: " + (e?.message || e)))
858
+ );
859
+ if (item.singleCell) {
860
+ tr.select("td:nth-child(2)").append("button").attr("type", "button").attr("class", "sja_menuoption").attr("data-testid", `sjpp-mass-chat-single-cell-${item.sampleId}`).style("display", "inline-block").style("margin", "0px 3px").style("padding", "5px 10px").style("border-radius", "5px").style("border", "0").style("cursor", "pointer").text("Single cell").on(
861
+ "click",
862
+ () => void self.launchPlot({
863
+ chartType: "sc",
864
+ settings: { sc: { item: item.singleCell } }
865
+ }).catch((e) => sayerror(self.dom.resultDiv, "Error: " + (e?.message || e)))
866
+ );
867
+ }
868
+ if (item.wsimages) {
869
+ tr.select("td:nth-child(2)").append("button").attr("type", "button").attr("class", "sja_menuoption").attr("data-testid", `sjpp-mass-chat-wsimages-${item.sampleId}`).style("display", "inline-block").style("margin", "0px 3px").style("padding", "5px 10px").style("border-radius", "5px").style("border", "0").style("cursor", "pointer").text("Whole Slide Images").on(
870
+ "click",
871
+ () => void self.launchPlot({
872
+ chartType: "wsi",
873
+ sample: { sID: item.name },
874
+ imageType: "wsi"
875
+ }).catch((e) => sayerror(self.dom.resultDiv, "Error: " + (e?.message || e)))
876
+ );
877
+ }
878
+ if (item.facetTracks?.length) {
879
+ tr.select("td:nth-child(2)").append("button").attr("type", "button").attr("class", "sja_menuoption").attr("data-testid", `sjpp-mass-chat-assays-${item.sampleId}`).style("display", "inline-block").style("margin", "0px 3px").style("padding", "5px 10px").style("border-radius", "5px").style("cursor", "pointer").text("Facet Table").on(
880
+ "click",
881
+ () => void self.launchPlot({
882
+ chartType: "genomeBrowser",
883
+ hidePlotFilter: true,
884
+ filter: getSampleFilter(item.sampleId)
885
+ }).catch((e) => sayerror(self.dom.resultDiv, "Error: " + (e?.message || e)))
886
+ );
887
+ }
888
+ return;
889
+ }
890
+ if (item.isGene) {
891
+ tr.append("td").text(item.name).style("padding", "5px 10px").style("cursor", "pointer").attr("class", "sja_menuoption").attr("data-testid", `sjpp-mass-chat-gene-select-${item.gene}`).on("click", () => {
892
+ self.dom.inputNode.value = "";
893
+ self.clear({ hide: true });
894
+ self.addBubble({ msg: escapeHtml(item.name) + " (gene)", me: 1 });
895
+ const holder = self.addBubble({ msg: "" });
896
+ self.renderGeneCategories(holder, item);
897
+ });
898
+ return;
899
+ }
900
+ const button = tr.append("td").text(item.name);
901
+ if (item.type) {
902
+ button.style("cursor", "pointer").attr("class", "sja_menuoption").attr("data-testid", `sjpp-mass-chat-term-${item.id}`).on("click", async () => {
903
+ self.addBubble({ msg: escapeHtml(item.name) + " (dictionary variable)", me: 1 });
904
+ await self.launchPlot({
905
+ chartType: item.type == "survival" ? "survival" : "summary",
906
+ term: { term: item }
907
+ });
908
+ });
909
+ } else {
910
+ button.style("padding", "5px 10px").style("opacity", 0.5);
911
+ }
912
+ tr.append("td").text((item.__ancestorNames || []).join(" > ")).style("opacity", 0.5).style("font-size", ".7em");
913
+ };
914
+ self.clear = (opts = {}) => {
915
+ self.dom.tip.clear();
916
+ if (opts.hide) self.dom.tip.hide();
917
+ else self.dom.tip.showunder(self.dom.inputNode);
918
+ };
919
+ }
920
+
921
+ // mass/chat.ts
922
+ var MIN_PROMPT_LENGTH_FOR_CHAT = 5;
923
+ var MassAiChatBot = class _MassAiChatBot {
924
+ static {
925
+ this.type = "chat";
926
+ }
927
+ constructor(opts) {
928
+ this.type = _MassAiChatBot.type;
929
+ this.opts = opts;
930
+ this.app = opts.app;
931
+ this.opts.usecase = this.opts.usecase || { target: "dictionary", detail: "term" };
932
+ this.opts.targetType = this.opts.targetType ? this.opts.targetType : "Dictionary Variables";
933
+ this.isChat = this.app.getState().termdbConfig?.queries?.chat;
934
+ setSearchRenderers(this);
935
+ }
936
+ getState(appState) {
937
+ return {
938
+ cohortStr: appState.activeCohort == -1 || !appState.termdbConfig.selectCohort ? "" : appState.termdbConfig.selectCohort.values[appState.activeCohort].keys.slice().sort().join(","),
939
+ search: appState.search,
940
+ nav: appState.nav
941
+ };
942
+ }
943
+ async init() {
944
+ this.initDom();
945
+ }
946
+ initDom() {
947
+ let text = "Search an item";
948
+ let height = "auto";
949
+ if (this.isChat) {
950
+ text = "Ask a question";
951
+ height = "200px";
952
+ }
953
+ this.dom = {
954
+ tip: new Menu({ padding: "5px" }),
955
+ div: this.opts.subheader,
956
+ error: this.opts.subheader.append("div").attr("id", "sjpp-corrVolcano-error").style("opacity", 0.75),
957
+ bubbleDiv: this.opts.subheader.append("div").attr("class", "sjpp_show_scrollbar").style("margin", "5px 20px 0px 20px").style("height", height).style("max-height", "200px").style("overflow", "auto").style("scroll-behavior", "smooth")
958
+ };
959
+ const inputSel = this.dom.div.append("input").attr("type", "search").attr("data-testid", "sjpp-mass-omnisearch-input").style("margin", "15px").style("padding", "17px").style("border-radius", "34px").attr("size", 70).attr("placeholder", text);
960
+ this.dom.inputNode = inputSel.node();
961
+ this.dom.resultDiv = this.dom.tip.d.style("border-left", "solid 1px rgb(133,182,225)").style("padding-left", "5px").attr("tabindex", -1);
962
+ inputSel.on("keyup.search", (event) => handleOmnisearchKeyup(this, event)).on("keyup.submit", async (event) => {
963
+ if (!keyupEnter(event)) return;
964
+ if (!this.isChat) {
965
+ return;
966
+ }
967
+ const prompt2 = event.target.value.trim();
968
+ if (!prompt2) return;
969
+ this.addBubble({ msg: escapeHtml(prompt2), me: 1 });
970
+ event.target.value = "";
971
+ const serverBubble = this.addBubble({ msg: "..." });
972
+ if (prompt2.length <= MIN_PROMPT_LENGTH_FOR_CHAT) {
973
+ serverBubble.text("Your prompt is too short. Enter a longer prompt.");
974
+ return;
975
+ }
976
+ const body = {
977
+ genome: this.app.vocabApi.vocab.genome,
978
+ dslabel: this.app.vocabApi.vocab.dslabel,
979
+ filter: this.app.vocabApi.state.termfilter?.filter,
980
+ prompt: prompt2
981
+ };
982
+ try {
983
+ const data = await dofetch3("termdb/chat", { body });
984
+ if (data.error) throw data.error;
985
+ const result = data;
986
+ if (result.type === "text") {
987
+ serverBubble.text(result.text);
988
+ } else if (result.type === "html") {
989
+ serverBubble.html(result.html);
990
+ } else if (result.type === "plot") {
991
+ const optionField = findPossibleOptionsField(result.plot);
992
+ if (optionField) {
993
+ this.showPossibleOptions(serverBubble, result.plot, optionField, result.msg);
994
+ } else {
995
+ this.app.dispatch({
996
+ type: "plot_create",
997
+ config: result.plot
998
+ });
999
+ serverBubble.text(`${result.msg ? result.msg + ". " : ""}Please refer to the plot generated below.`);
1000
+ }
1001
+ }
1002
+ } catch (e) {
1003
+ if (e.stack) console.log(e.stack);
1004
+ serverBubble.html(`Error: ${e.message || e}`);
1005
+ }
1006
+ }).node().focus();
1007
+ }
1008
+ addBubble(arg) {
1009
+ const bubble = this.dom.bubbleDiv.append("div").style("padding", "10px").html(`${arg.me ? '<span style="font-size:.7em">[ME]</span> ' : ""}${arg.msg}`);
1010
+ if (arg.me) bubble.style("background", "#f1f1f1");
1011
+ const n = this.dom.bubbleDiv.node();
1012
+ n.scrollTop = n.scrollHeight;
1013
+ return bubble;
1014
+ }
1015
+ // Render click boxes for an incomplete plot state. `fieldKey` is the field of `plot` whose
1016
+ // value holds `possible_options`. Clicking a box completes the plot state and dispatches plot_create.
1017
+ // Each option completes the plot in one of two ways:
1018
+ // - opt.config: a config patch merged into the plot (the incomplete field is dropped). Used when the
1019
+ // choice sets other fields, e.g. the genome browser view sets blockIsProteinMode: true|false.
1020
+ // - otherwise: the incomplete field is set to { id: opt.id }, e.g. survival term selection -> term:{id}.
1021
+ showPossibleOptions(bubble, plot, fieldKey, msg) {
1022
+ const options = plot[fieldKey].possible_options || [];
1023
+ bubble.text(`${msg ? msg + ". " : ""}Multiple options are available. Please select one:`);
1024
+ const boxDiv = bubble.append("div").style("margin-top", "5px");
1025
+ for (const opt of options) {
1026
+ boxDiv.append("div").attr("class", "sja_menuoption").attr("data-testid", `sjpp-mass-chat-option-${opt.id}`).style("display", "inline-block").style("margin", "3px").style("padding", "5px 10px").style("border-radius", "5px").style("cursor", "pointer").text(opt.name).on("click", () => {
1027
+ const config = JSON.parse(JSON.stringify(plot));
1028
+ if (opt.config) {
1029
+ delete config[fieldKey];
1030
+ Object.assign(config, opt.config);
1031
+ } else {
1032
+ config[fieldKey] = { id: opt.id };
1033
+ }
1034
+ this.app.dispatch({
1035
+ type: "plot_create",
1036
+ config
1037
+ });
1038
+ bubble.selectAll("*").remove();
1039
+ bubble.text(`Selected "${opt.name}". Please refer to the plot generated below.`);
1040
+ });
1041
+ }
1042
+ }
1043
+ main() {
1044
+ if (this.opts.subheader.style("display") == "none") {
1045
+ this.dom.inputNode.blur();
1046
+ this.dom.tip.hide();
1047
+ return;
1048
+ }
1049
+ if (this.opts?.focus != "off") this.dom.inputNode.focus();
1050
+ }
1051
+ };
1052
+ var chatInit = getCompInit(MassAiChatBot);
1053
+ function findPossibleOptionsField(plot) {
1054
+ if (!plot || typeof plot !== "object") return null;
1055
+ for (const key of Object.keys(plot)) {
1056
+ const val = plot[key];
1057
+ if (val && typeof val === "object" && Array.isArray(val.possible_options)) return key;
1058
+ }
1059
+ return null;
1060
+ }
1061
+
1062
+ // mass/user.ts
1063
+ function datasetRequiresAuth(termdbConfig) {
1064
+ return !!termdbConfig?.requiredAuth?.length;
1065
+ }
1066
+ function getUserTabContent(userTab2, activeCohort) {
1067
+ return activeCohort != null && userTab2?.byCohort?.[activeCohort] || userTab2;
1068
+ }
1069
+ function getAuthStatus(signedIn, isPublic) {
1070
+ if (!signedIn) return "Requires sign-in";
1071
+ return isPublic === true ? "Public access" : "You are signed in.";
1072
+ }
1073
+ function getDaysLeft(days) {
1074
+ if (typeof days != "number" || !Number.isFinite(days)) return;
1075
+ return {
1076
+ text: `${days} ${days == 1 ? "day" : "days"} left`,
1077
+ tip: 'The server keeps a session opened from a link for a limited time, and removes it when the days run out. To keep your work, select "Save" in this tab to create a new session, then use "Share" to get its link.'
1078
+ };
1079
+ }
1080
+ var MassUser = class _MassUser {
1081
+ constructor(opts) {
1082
+ /** The termdb route that is checked for a required credential */
1083
+ this.route = "termdb";
1084
+ /** Sessions saved in this browser, by session name. Mirrors localStorage 'savedMassSessions' */
1085
+ this.savedSessions = {};
1086
+ /** Whether the user was signed in at the last check, to detect a sign-in after the launch */
1087
+ this.signedIn = false;
1088
+ this.type = _MassUser.type;
1089
+ this.opts = opts;
1090
+ this.app = opts.app;
1091
+ this.subheader = opts.subheader;
1092
+ const sessionDiv = this.subheader.append("div").attr("data-testid", "sjpp-massnav-user-session");
1093
+ sessionDiv.append("span").attr("data-testid", "sjpp-massnav-user-session-label").style("margin", "0 10px").style("font-weight", "bold").style("opacity", 0.65).text("SESSION");
1094
+ this.dom = {
1095
+ authDiv: this.subheader.append("div").attr("data-testid", "sjpp-massnav-user-auth").style("margin", "10px"),
1096
+ sessionDiv,
1097
+ // inline-flex, to be on the same row as the label, with the same gap between the buttons
1098
+ optionsDiv: sessionDiv.append("div").attr("data-testid", "sjpp-massnav-user-session-options").style("display", "inline-flex").style("vertical-align", "middle").style("gap", "10px"),
1099
+ // aligned with the edge of the option buttons, which have a 10px margin
1100
+ contentDiv: sessionDiv.append("div").attr("id", "sjpp-massnav-user-session-menu").attr("data-testid", "sjpp-massnav-user-session-content").style("margin", "0 10px"),
1101
+ copytip: new Menu({ padding: "5px" })
1102
+ };
1103
+ this.sessionOptions = [
1104
+ { label: `Open`, icon: "&#x23CF;&#xFE0E;", title: "Recover a saved session", callback: () => this.open() },
1105
+ { label: `Save`, icon: "&#x2B07;&#xFE0E;", title: "Save the current view", callback: () => this.save() },
1106
+ {
1107
+ label: `Share`,
1108
+ icon: "&#x26D3;&#xFE0E;",
1109
+ title: "Share the current view",
1110
+ callback: () => this.getSessionUrl()
1111
+ }
1112
+ ];
1113
+ this.embedderOrigin = window.location.origin;
1114
+ this.hostURL = sessionStorage.getItem("hostURL") || this.embedderOrigin;
1115
+ }
1116
+ static {
1117
+ this.type = "user";
1118
+ }
1119
+ /**
1120
+ * By default, only what this component renders from. rx compares the returned object with the previous state
1121
+ * on every dispatch, so it must not include the whole termdbConfig, which can be very large.
1122
+ *
1123
+ * forSession=true: the parts of the app state that make up a saved session instead, copied so that the app
1124
+ * state, which is deeply frozen and shared, is not changed. app_refresh merges a reopened session into the
1125
+ * current state, so what is not saved, such as the dataset config that init() in mass/store.ts fetches
1126
+ * again, keeps its current value. The derived properties of a geneVariant term are re-filled by every path
1127
+ * that opens a session, see trimGvTermsForSave().
1128
+ */
1129
+ getState(appState, forSession = false) {
1130
+ if (forSession) {
1131
+ const { vocab, activeCohort, termfilter, plots, groups, customTerms, reuse, nav } = appState;
1132
+ const state = structuredClone({ vocab, activeCohort, termfilter, plots, groups, customTerms, reuse, nav });
1133
+ return markSavedState(trimGvTermsForSave(state));
1134
+ }
1135
+ return {
1136
+ activeCohort: appState.activeCohort,
1137
+ termdbConfig: {
1138
+ requiredAuth: appState.termdbConfig?.requiredAuth,
1139
+ massNav: { tabs: { user: appState.termdbConfig?.massNav?.tabs?.user } }
1140
+ }
1141
+ };
1142
+ }
1143
+ /** Adds the methods that nav.ts calls on the api, since only the api is available outside the component */
1144
+ preApiFreeze(api) {
1145
+ api.showDaysLeftTip = (e) => {
1146
+ const tip = getDaysLeft(this.opts.sessionDaysLeft)?.tip;
1147
+ if (!tip) return;
1148
+ this.dom.copytip.clear().d.append("div").style("max-width", "300px").text(tip);
1149
+ const p = e.getBoundingClientRect();
1150
+ this.dom.copytip.show2(p.left, p.bottom + 5);
1151
+ };
1152
+ api.hideDaysLeftTip = () => this.dom?.copytip?.hide();
1153
+ }
1154
+ async init(appState) {
1155
+ this.dslabel = appState.vocab.dslabel;
1156
+ this.savedSessions = JSON.parse(localStorage.getItem("savedMassSessions") || `{}`);
1157
+ this.setRequiredAuth(appState.termdbConfig);
1158
+ this.initSessionOptions();
1159
+ }
1160
+ async main() {
1161
+ this.setRequiredAuth(this.state.termdbConfig);
1162
+ this.renderAuthInfo();
1163
+ this.mayLookupAfterSignIn();
1164
+ }
1165
+ /**
1166
+ * The sessions on the server are not looked up while the user is not signed in. So when the user signs in
1167
+ * after the launch, look them up then. Only a change to signed in triggers this, so that a lookup that keeps
1168
+ * failing is not repeated on every update of the app.
1169
+ */
1170
+ mayLookupAfterSignIn() {
1171
+ const signedIn = !!this.app.vocabApi.hasVerifiedToken();
1172
+ const justSignedIn = signedIn && !this.signedIn;
1173
+ this.signedIn = signedIn;
1174
+ if (justSignedIn && this.requiredAuth && !this.serverCachedSessions) {
1175
+ this.setServerCachedSessions();
1176
+ }
1177
+ }
1178
+ setRequiredAuth(termdbConfig) {
1179
+ this.requiredAuth = termdbConfig?.requiredAuth?.find((a) => a.route == this.route && a.type == "jwt");
1180
+ }
1181
+ /** Show the sign-in status when the dataset requires authorization. Hidden for a public dataset */
1182
+ renderAuthInfo() {
1183
+ const div = this.dom.authDiv;
1184
+ div.selectAll("*").remove();
1185
+ if (!datasetRequiresAuth(this.state.termdbConfig)) {
1186
+ div.style("display", "none");
1187
+ return;
1188
+ }
1189
+ div.style("display", "block");
1190
+ const vocabApi = this.app.vocabApi;
1191
+ const signedIn = vocabApi.hasVerifiedToken();
1192
+ const userTab2 = getUserTabContent(this.state.termdbConfig.massNav?.tabs?.user, this.state.activeCohort);
1193
+ const row = div.append("div");
1194
+ row.append("span").attr("data-testid", "sjpp-massnav-user-auth-label").style("font-weight", "bold").style("opacity", 0.65).text("ACCESS");
1195
+ row.append("span").attr("data-testid", "sjpp-massnav-user-auth-status").style("margin-left", "10px").text(userTab2?.status || getAuthStatus(signedIn, userTab2?.isPublic));
1196
+ const msg = vocabApi.tokenVerificationMessage;
1197
+ if (!signedIn && msg) row.append("span").style("margin-left", "5px").style("opacity", 0.65).text(msg);
1198
+ if (userTab2?.msgs?.length) {
1199
+ const table = table2col({ holder: div, margin: "2px 8px", testid: "sjpp-massnav-user-auth-info" });
1200
+ for (const m of userTab2.msgs) {
1201
+ const [td1, td2] = table.addRow(m.label);
1202
+ const target = m.email ? `mailto:${m.email}` : m.link;
1203
+ if (target) {
1204
+ const a = td2.append("a").attr("href", target).text(m.email || m.link);
1205
+ if (m.link) a.attr("target", "_blank");
1206
+ } else if (m.label) {
1207
+ td2.text(m.txt);
1208
+ } else {
1209
+ td2.remove();
1210
+ td1.attr("colspan", 2).style("color", null).text(m.txt);
1211
+ }
1212
+ }
1213
+ }
1214
+ if (userTab2?.list) {
1215
+ const listDiv = div.append("div").attr("data-testid", "sjpp-massnav-user-auth-list").style("margin", "5px 0 0 8px").style("font-size", "0.95em");
1216
+ listDiv.append("div").style("font-weight", "bold").text(userTab2.list.label);
1217
+ const ul = listDiv.append("ul").style("margin", "3px 0");
1218
+ for (const item of userTab2.list.items) ul.append("li").text(item);
1219
+ }
1220
+ }
1221
+ /**
1222
+ * Renders the session options right away. The lookup of the sessions on the server is optional, so it
1223
+ * is not awaited, since it must not delay or block the launch of the mass ui. The options are
1224
+ * rendered again when any lookup is done, since Delete is only shown when there is a session to delete.
1225
+ */
1226
+ initSessionOptions() {
1227
+ this.signedIn = !!this.app.vocabApi.hasVerifiedToken();
1228
+ this.renderSessionOptions();
1229
+ if (!this.serverCachedSessions) this.setServerCachedSessions();
1230
+ }
1231
+ /** The Open, Save, Share, Delete, and Download options. Delete is only available if there is something to delete */
1232
+ getSessionOptions() {
1233
+ const options = this.sessionOptions.slice();
1234
+ if (Object.keys(this.savedSessions).length || this.serverCachedSessions?.length) {
1235
+ options.push({
1236
+ label: `Delete`,
1237
+ icon: "&#x2715;",
1238
+ title: "Delete a saved session",
1239
+ callback: () => this.delete()
1240
+ });
1241
+ }
1242
+ if (this.opts.sessionDaysLeft != null && this.opts.sessionId) {
1243
+ options.push({
1244
+ label: `Download`,
1245
+ icon: "&#x2913;",
1246
+ title: "Download this session as a file",
1247
+ callback: () => this.download(this.opts.sessionId.replace(/[^\w-]/g, "_"), this.getState(this.app.getState(), true))
1248
+ });
1249
+ }
1250
+ return options;
1251
+ }
1252
+ /** Render the buttons of the session options */
1253
+ renderSessionOptions() {
1254
+ if (!this.dom?.optionsDiv) return;
1255
+ const options = this.getSessionOptions();
1256
+ this.dom.optionsDiv.selectAll("*").remove();
1257
+ this.dom.optionsDiv.selectAll("button").data(options).enter().append("button").style("margin", "10px 0").style("padding", "10px 15px").style("border-radius", "20px").style("border-color", "#ededed").attr(
1258
+ "data-testid",
1259
+ (d) => `sjpp-massnav-user-session-btn-${d.label.toLowerCase().replace(/\s/g, "-")}`
1260
+ ).attr("aria-label", (d) => d.title).attr("title", (d) => d.title).html((d) => `${d.icon} ${d.label}`).on("click", async (event, d) => {
1261
+ event.stopPropagation();
1262
+ this.clearContent();
1263
+ await d.callback();
1264
+ if (this.dom?.contentDiv?.node()?.hasChildNodes()) this.dom.contentDiv.style("padding-bottom", "10px");
1265
+ });
1266
+ }
1267
+ clearContent() {
1268
+ clearTimeout(this.confirmationTimer);
1269
+ this.confirmationTimer = void 0;
1270
+ this.dom.contentDiv.interrupt();
1271
+ this.dom.contentDiv.selectAll("*").remove();
1272
+ this.dom.contentDiv.style("opacity", 1).style("padding-bottom", null);
1273
+ }
1274
+ /**
1275
+ * Removes what is not under this.dom of the component, which ComponentApi.destroy() removes. The copytip
1276
+ * Menu is in the document body, with a listener on the body, so it must be destroyed here.
1277
+ */
1278
+ destroy() {
1279
+ clearTimeout(this.copyTipTimer);
1280
+ this.clearContent();
1281
+ this.dom.copytip.destroy();
1282
+ }
1283
+ async open() {
1284
+ const radioName = `sjpp-massnav-user-session-open-radio-` + Math.random().toString().slice(-6);
1285
+ const div = this.dom.contentDiv;
1286
+ div.append("div").style("display", "none").style("padding", "3px 9px").html(`
1287
+ <b>Open in</b>
1288
+ <label>
1289
+ <input type='radio' name='${radioName}' value='new' style='margin-right: 0; vertical-align: bottom'/>
1290
+ <span>a new tab</span>
1291
+ </label>
1292
+ <label style='margin-left: 5px'>
1293
+ <input type='radio' name='${radioName}' value='current' checked=checked style='margin-right: 0; vertical-align: bottom'/>
1294
+ <span>current tab</span>
1295
+ </label>
1296
+ `);
1297
+ const getTargetWindow = () => div.node().querySelector(`[name="${radioName}"]:checked`).value;
1298
+ const t = await this.listSessions({
1299
+ trClickHandler: async (_event, d) => {
1300
+ const { loc, id: id2 } = d;
1301
+ if (!id2) return;
1302
+ if (loc == "browser") {
1303
+ this.sessionName = id2;
1304
+ const state = structuredClone(this.savedSessions[id2]);
1305
+ if (this.refuses(state)) return;
1306
+ await preprocessState(state, this.app);
1307
+ const targetWindow = getTargetWindow();
1308
+ if (targetWindow == "current") {
1309
+ this.app.dispatch({ type: "app_refresh", state });
1310
+ } else if (window.location.origin == this.hostURL) {
1311
+ window.open(`/?mass-session-id=${encodeURIComponent(id2)}&src=browser`);
1312
+ } else {
1313
+ if (state.embedder) parentCorsMessage({ state });
1314
+ else {
1315
+ const { protocol, host, search, origin, href } = window.location;
1316
+ const embedder = { protocol, host, search, origin, href };
1317
+ parentCorsMessage({ state: Object.assign({ embedder }, state) });
1318
+ }
1319
+ }
1320
+ this.clearContent();
1321
+ } else if (loc == "server") {
1322
+ const headers = await this.app.vocabApi.mayGetAuthHeaders(this.route);
1323
+ const body = { id: id2, route: this.route, dslabel: this.dslabel, embedder: window.location.hostname };
1324
+ const res = await dofetch3(`/massSession?`, { headers, body });
1325
+ if (!res.state) throw res.error || "unable to get the cached session from the server";
1326
+ if (this.refuses(res.state)) return;
1327
+ await preprocessState(res.state, this.app);
1328
+ this.savedSessions[id2] = res.state;
1329
+ const targetWindow = getTargetWindow();
1330
+ if (targetWindow == "current") {
1331
+ this.app.dispatch({ type: "app_refresh", state: res.state });
1332
+ } else if (window.location.origin == this.hostURL) {
1333
+ window.open(
1334
+ `/?mass-session-id=${encodeURIComponent(id2)}&src=cred&dslabel=${encodeURIComponent(
1335
+ this.dslabel
1336
+ )}&route=${encodeURIComponent(this.route)}`
1337
+ );
1338
+ } else {
1339
+ parentCorsMessage(res);
1340
+ }
1341
+ this.clearContent();
1342
+ }
1343
+ }
1344
+ });
1345
+ t.headtr.select("th").text("Open from");
1346
+ const tr1 = t.tbody.insert("tr", "tr");
1347
+ tr1.append("td").style("text-align", "center").style("padding", "3px 9px").text("Local file");
1348
+ const label = tr1.append("td").style("text-align", "left").append("label");
1349
+ label.append("span").style("padding", "3px 9px").style("text-decoration", "underline").style("cursor", "pointer").text("Choose File");
1350
+ label.append("input").attr("type", "file").attr("placeholder", "file name").style("opacity", 0).style("width", "0.1px").style("height", "0.1px").style("position", "absolute").on("change", async (event) => {
1351
+ const file = event.target.files.item(0);
1352
+ const json = await file.text();
1353
+ let sessionName = file.name;
1354
+ if (this.savedSessions[sessionName]) {
1355
+ sessionName = prompt(
1356
+ `Leave as-is to overwrite a session with the same name, or enter a different session name.`,
1357
+ sessionName
1358
+ );
1359
+ if (!sessionName) return;
1360
+ }
1361
+ this.sessionName = sessionName;
1362
+ const state = JSON.parse(json);
1363
+ if (this.refuses(state)) return;
1364
+ await preprocessState(state, this.app);
1365
+ this.savedSessions[sessionName] = state;
1366
+ localStorage.setItem("savedMassSessions", JSON.stringify(this.savedSessions));
1367
+ const targetWindow = getTargetWindow();
1368
+ if (targetWindow == "current") {
1369
+ this.app.dispatch({ type: "app_refresh", state });
1370
+ } else if (window.location.origin == this.hostURL) {
1371
+ window.open(`/?mass-session-id=${encodeURIComponent(sessionName)}&src=browser`);
1372
+ } else {
1373
+ if (state.embedder) parentCorsMessage({ state });
1374
+ else {
1375
+ const { protocol, host, search, origin, href } = window.location;
1376
+ const embedder = { protocol, host, search, origin, href };
1377
+ parentCorsMessage({ state: Object.assign({ embedder }, state) });
1378
+ }
1379
+ }
1380
+ this.clearContent();
1381
+ });
1382
+ }
1383
+ async listSessions(opts = {}) {
1384
+ const table = this.dom.contentDiv.append("table").attr("class", "sjpp-controls-table");
1385
+ const headtr = table.append("thead").append("tr");
1386
+ headtr.selectAll("th").data(["Cache Location", "Session ID"]).enter().append("th").style("text-align", (_, i) => i === 0 ? "center" : "left").style("padding", "3px 9px").text((d) => d);
1387
+ const sessionIds = Object.keys(this.savedSessions).map((id2) => ({
1388
+ loc: "browser",
1389
+ id: id2
1390
+ }));
1391
+ if (!this.serverCachedSessions) await this.setServerCachedSessions();
1392
+ sessionIds.push(...(this.serverCachedSessions || []).map((id2) => ({ loc: "server", id: id2 })));
1393
+ const tbody = table.append("tbody");
1394
+ const trs = tbody.selectAll("tr").data(sessionIds).enter().append("tr").on("click", opts.trClickHandler || null);
1395
+ trs.selectAll("td").data((d) => [d, d]).enter().append("td").style("text-align", (_, i) => i === 0 ? "center" : "left").style("padding", "3px 9px").style("cursor", "pointer").text((d, i) => i === 0 ? d.loc : d.id);
1396
+ if (!this.serverCachedSessions?.length && this.requiredAuth && !this.app.vocabApi.hasVerifiedToken()) {
1397
+ table.append("tbody").append("tr").selectAll("td").data(["server", "requires sign-in"]).enter().append("td").style("text-align", (_, i) => i === 0 ? "center" : "left").style("padding", "3px 9px").text((d) => d);
1398
+ }
1399
+ return { table, headtr, tbody, trs };
1400
+ }
1401
+ /**
1402
+ * Looks up the ids of the sessions that the user saved on the server. This never throws, since the
1403
+ * sessions on the server are optional: the sessions of the browser, and everything else in the mass ui,
1404
+ * must work when the lookup fails, for example from a network error or a failure to get a token.
1405
+ *
1406
+ * Only a successful lookup is kept in serverCachedSessions. It stays undefined when the lookup is not made
1407
+ * because the user is not signed in, or when it fails, so that it is tried again on the next use.
1408
+ * Callers that arrive while a lookup is in progress share it instead of sending another request.
1409
+ */
1410
+ setServerCachedSessions() {
1411
+ if (this.serverSessionsRequest) return this.serverSessionsRequest;
1412
+ if (!this.mayLookupSessions()) return Promise.resolve();
1413
+ this.serverSessionsRequest = this.lookupServerSessions().finally(() => {
1414
+ this.serverSessionsRequest = void 0;
1415
+ this.renderSessionOptions();
1416
+ });
1417
+ return this.serverSessionsRequest;
1418
+ }
1419
+ /**
1420
+ * Returns true when the sessions on the server should be looked up now. A dataset without a jwt
1421
+ * credential has none, and the lookup is not made, so serverCachedSessions is an empty list.
1422
+ * It is also not made before the user is signed in, when the server would reject the request.
1423
+ */
1424
+ mayLookupSessions() {
1425
+ try {
1426
+ const state = this.app.getState();
1427
+ this.requiredAuth = state.termdbConfig?.requiredAuth?.find((a) => a.route == this.route && a.type == "jwt");
1428
+ if (!this.requiredAuth) {
1429
+ this.serverCachedSessions = [];
1430
+ return false;
1431
+ }
1432
+ return !!this.app.vocabApi.hasVerifiedToken();
1433
+ } catch (e) {
1434
+ console.warn(`unable to get the sessions saved on the server: ${e?.message || e}`);
1435
+ return false;
1436
+ }
1437
+ }
1438
+ async lookupServerSessions() {
1439
+ try {
1440
+ const headers = await this.app.vocabApi.mayGetAuthHeaders(this.route);
1441
+ const body = { route: this.route, dslabel: this.dslabel, embedder: window.location.hostname };
1442
+ const res = await dofetch3("/sessionIds", { headers, body });
1443
+ if (!Array.isArray(res?.sessionIds)) throw res?.error || "unexpected response";
1444
+ this.serverCachedSessions = res.sessionIds;
1445
+ } catch (e) {
1446
+ console.warn(`unable to get the sessions saved on the server: ${e?.message || e}`);
1447
+ }
1448
+ }
1449
+ async save() {
1450
+ const div = this.dom.contentDiv;
1451
+ const inputDiv = div.append("div");
1452
+ inputDiv.append("span").text("Save as");
1453
+ const sessionNames = Object.keys(this.savedSessions);
1454
+ if (!this.serverCachedSessions) await this.setServerCachedSessions();
1455
+ sessionNames.push(...(this.serverCachedSessions || []).filter((d) => !sessionNames.includes(d)));
1456
+ const placeholder = this.sessionName || "unnamed-session";
1457
+ const input = inputDiv.append("input").attr("type", "text").attr("placeholder", placeholder).style("width", "220px").on("input", () => {
1458
+ searchResultDiv.selectAll("*").remove();
1459
+ const value = input.property("value");
1460
+ const exactMatch = sessionNames.filter((s) => s === value);
1461
+ const startsWith = sessionNames.filter((s) => s.startsWith(value));
1462
+ const includes = sessionNames.filter((s) => s.includes(value) && s !== value && !startsWith.includes(s));
1463
+ searchResultDiv.selectAll("div").data([...exactMatch, ...startsWith, ...includes]).enter().append("div").attr("class", "sja_menuoption").attr("data-testid", `sjpp-massnav-user-session-save-option`).text((d) => d).on("click", (_, d) => {
1464
+ input.property("value", d);
1465
+ searchResultDiv.selectAll("*").remove();
1466
+ });
1467
+ });
1468
+ const searchResultDiv = div.append("div");
1469
+ const submitDiv = div.append("div");
1470
+ submitDiv.append("span").html("Save to&nbsp;");
1471
+ submitDiv.append("button").style("min-width", "80px").text("Browser").attr(
1472
+ "title",
1473
+ `Save the session in your current browser's cache. The session can be easily recovered, but not shared among your other devices`
1474
+ ).on("click", () => {
1475
+ this.sessionName = input.property("value") || placeholder;
1476
+ this.savedSessions[this.sessionName] = this.getState(this.app.getState(), true);
1477
+ localStorage.setItem("savedMassSessions", JSON.stringify(this.savedSessions));
1478
+ this.renderSessionOptions();
1479
+ this.confirmAction(`Cached '${this.sessionName}' in browser`);
1480
+ });
1481
+ submitDiv.append("button").style("min-width", "80px").text("File").attr(
1482
+ "title",
1483
+ `Save the session into a local file. The session can be easily recoved using the 'Open from local file' option.`
1484
+ ).on("click", () => {
1485
+ const name = input.property("value") || placeholder;
1486
+ this.download(name, this.getState(this.app.getState(), true));
1487
+ this.confirmAction(`Downloaded '${name}'`);
1488
+ });
1489
+ if (this.requiredAuth) {
1490
+ const requiresSignIn = this.app.vocabApi.hasVerifiedToken() ? "" : "Requires sign-in. ";
1491
+ submitDiv.append("button").style("min-width", "80px").text("Server").attr(
1492
+ "title",
1493
+ `${requiresSignIn}Save the session into a remote server. The session can be easily shared across your different devices and recovered using the 'Open from server' option.`
1494
+ ).property("disabled", !this.app.vocabApi.hasVerifiedToken()).on("click", async () => {
1495
+ if (!this.app.vocabApi.hasVerifiedToken()) {
1496
+ alert("Requires sign-in");
1497
+ return;
1498
+ }
1499
+ const name = input.property("value") || placeholder;
1500
+ const res = await this.getSessionUrl(name);
1501
+ if (res.error || res.id != name) {
1502
+ sayerror(submitDiv, `Unable to save '${name}' on the server: ${res.error || "unexpected session id"}`);
1503
+ return;
1504
+ }
1505
+ if (this.serverCachedSessions && !this.serverCachedSessions.includes(name))
1506
+ this.serverCachedSessions.push(name);
1507
+ this.renderSessionOptions();
1508
+ this.confirmAction(`Saved '${name}' on the server`);
1509
+ });
1510
+ }
1511
+ }
1512
+ // true when a saved state is not opened, see sessionForm.ts. the reason is shown
1513
+ refuses(state) {
1514
+ const reason = getSavedStateRefusal(state);
1515
+ if (!reason) return false;
1516
+ this.clearContent();
1517
+ this.app.printError(reason);
1518
+ return true;
1519
+ }
1520
+ download(name, state) {
1521
+ const ext = name.endsWith(".txt") ? "" : ".txt";
1522
+ to_textfile(`${name}${ext}`, JSON.stringify(state));
1523
+ }
1524
+ /** With a filename, saves the session on the server under that name and returns the response.
1525
+ Without one, creates a shareable link and renders it. */
1526
+ async getSessionUrl(filename = "") {
1527
+ const headers = await this.app.vocabApi.mayGetAuthHeaders(this.route);
1528
+ const state = this.getState(this.app.getState(), true);
1529
+ const { protocol, host, search, origin, href } = window.location;
1530
+ state.embedder = { protocol, host, search, origin, href };
1531
+ if (filename) {
1532
+ state.__sessionFor__ = {
1533
+ route: this.route,
1534
+ filename,
1535
+ dslabel: this.dslabel,
1536
+ embedder: window.location.hostname
1537
+ };
1538
+ }
1539
+ const res = await dofetch3("/massSession", {
1540
+ headers,
1541
+ method: "POST",
1542
+ body: JSON.stringify(state)
1543
+ });
1544
+ if (filename) return res;
1545
+ const div = this.dom.contentDiv;
1546
+ if (res.error || !res.id) {
1547
+ sayerror(div.append("div"), `Unable to create a session link: ${res.error || "missing session id"}`);
1548
+ return;
1549
+ }
1550
+ const url = `${this.hostURL}/?mass-session-id=${encodeURIComponent(res.id)}&noheader=1`;
1551
+ const linkDiv = div.append("div").style("margin", "10px");
1552
+ const a = linkDiv.append("a").style("display", "none").attr("href", url).attr("target", "_blank").text(res.id);
1553
+ linkDiv.append("button").style("cursor", "pointer").text("Open link").on("click", () => {
1554
+ a.node().click();
1555
+ });
1556
+ linkDiv.append("button").style("cursor", "pointer").style("margin-left", "10px").text("Copy link").on("click", async (event) => {
1557
+ await navigator.clipboard.writeText(url);
1558
+ if (!this.dom?.copytip) return;
1559
+ this.dom.copytip.clear().showunder(event.target);
1560
+ this.dom.copytip.d.append("div").html("&#10003;");
1561
+ clearTimeout(this.copyTipTimer);
1562
+ this.copyTipTimer = setTimeout(() => this.dom?.copytip?.hide(), 1e3);
1563
+ });
1564
+ if (this.hostURL != window.location.origin) {
1565
+ a.on("click", (event) => {
1566
+ event.preventDefault();
1567
+ parentCorsMessage({ state }, "noredirect");
1568
+ return false;
1569
+ });
1570
+ }
1571
+ linkDiv.append("div").html(`
1572
+ <br>
1573
+ <div style="font-size: 1em; opacity:.6">
1574
+ <span>NOTES</span>
1575
+ <ul>
1576
+ <li>A recovered session may hide data or views to users that are not authorized to access the saved datasets or features.</li>
1577
+ <li>This session will be saved for ${this.opts.massSessionDuration} days.</li>
1578
+ </ul>
1579
+ </div>`);
1580
+ }
1581
+ async delete() {
1582
+ const t = await this.listSessions({
1583
+ trClickHandler: function(event) {
1584
+ const input = this.lastChild.querySelector("input");
1585
+ const checked = event.target == input ? input.checked : !input.checked;
1586
+ select_default(this).style("text-decoration", checked ? "line-through" : "");
1587
+ if (event.target != input) input.checked = checked;
1588
+ const checkedRows = t.table.node().querySelectorAll("input:checked");
1589
+ submitBtn.property("disabled", checkedRows.length ? false : true);
1590
+ }
1591
+ });
1592
+ t.headtr.append("th").text("Delete");
1593
+ t.trs.each(function(d) {
1594
+ select_default(this).append("td").style("text-align", "center").append("input").attr("type", "checkbox").attr("value", d.id);
1595
+ });
1596
+ const submitBtn = this.dom.contentDiv.append("div").style("margin-top", "10px").append("button").text("Delete selected sessions").property("disabled", true).on("click", async () => {
1597
+ errorDiv.selectAll("*").remove();
1598
+ const inputs = t.table.node().querySelectorAll("input");
1599
+ const sessionIdsDeletedFromServer = [];
1600
+ for (const input of inputs) {
1601
+ if (select_default(input).property("checked")) {
1602
+ const d = input.parentNode.parentNode.__data__;
1603
+ if (d.loc == "browser") {
1604
+ delete this.savedSessions[input.value];
1605
+ } else if (d.loc == "server") {
1606
+ sessionIdsDeletedFromServer.push(input.value);
1607
+ } else throw `unknown cache location=${d.loc}`;
1608
+ }
1609
+ }
1610
+ localStorage.setItem("savedMassSessions", JSON.stringify(this.savedSessions));
1611
+ if (sessionIdsDeletedFromServer.length) {
1612
+ submitBtn.property("disabled", true);
1613
+ let error, failedIds;
1614
+ try {
1615
+ const headers = await this.app.vocabApi.mayGetAuthHeaders(this.route);
1616
+ const errors = [];
1617
+ failedIds = [];
1618
+ for (const ids of getDeletionBatches(sessionIdsDeletedFromServer)) {
1619
+ const body = { ids, route: this.route, dslabel: this.dslabel, embedder: window.location.hostname };
1620
+ try {
1621
+ const res = await dofetch3(`/massSession?`, { method: "DELETE", headers, body });
1622
+ if (res.error) {
1623
+ errors.push(res.error);
1624
+ failedIds.push(...res.failedIds || ids);
1625
+ }
1626
+ } catch (e) {
1627
+ errors.push(e.message || e);
1628
+ failedIds.push(...ids);
1629
+ }
1630
+ }
1631
+ if (errors.length) error = errors.join("; ");
1632
+ } catch (e) {
1633
+ error = e.message || e;
1634
+ failedIds = sessionIdsDeletedFromServer;
1635
+ }
1636
+ const deletedIds = sessionIdsDeletedFromServer.filter((id2) => !failedIds?.includes(id2));
1637
+ this.serverCachedSessions = this.serverCachedSessions?.filter((id2) => !deletedIds.includes(id2));
1638
+ if (error) {
1639
+ t.trs.filter((d) => d.loc == "browser" ? !this.savedSessions[d.id] : deletedIds.includes(d.id)).remove();
1640
+ const checkedRows = t.table.node().querySelectorAll("input:checked");
1641
+ submitBtn.property("disabled", !checkedRows.length);
1642
+ sayerror(errorDiv, `Error deleting server session(s): ${error}`);
1643
+ this.renderSessionOptions();
1644
+ return;
1645
+ }
1646
+ }
1647
+ this.renderSessionOptions();
1648
+ this.clearContent();
1649
+ });
1650
+ const errorDiv = this.dom.contentDiv.append("div");
1651
+ }
1652
+ /** Show a message that fades out, then clear the content */
1653
+ confirmAction(message) {
1654
+ this.clearContent();
1655
+ this.dom.contentDiv.append("div").text(message);
1656
+ this.dom.contentDiv.transition().delay(3e3).duration(1e3).style("opacity", 0);
1657
+ this.confirmationTimer = setTimeout(() => this.clearContent(), 4e3);
1658
+ }
1659
+ };
1660
+ function getDeletionBatches(ids) {
1661
+ const maxEncodedIdsLength = 1e3;
1662
+ const batches = [];
1663
+ let batch = [];
1664
+ for (const id2 of ids) {
1665
+ if (batch.length && encodeURIComponent(JSON.stringify([...batch, id2])).length > maxEncodedIdsLength) {
1666
+ batches.push(batch);
1667
+ batch = [];
1668
+ }
1669
+ batch.push(id2);
1670
+ }
1671
+ if (batch.length) batches.push(batch);
1672
+ return batches;
1673
+ }
1674
+ async function preprocessState(state, app) {
1675
+ delete state.termdbConfig;
1676
+ if (state.plots) {
1677
+ const promises = [];
1678
+ for (const plot of state.plots) {
1679
+ promises.push(
1680
+ (async () => {
1681
+ const _ = await importPlot(plot.chartType);
1682
+ return await _.getPlotConfig(plot, app);
1683
+ })()
1684
+ );
1685
+ }
1686
+ try {
1687
+ await Promise.all(promises);
1688
+ } catch (e) {
1689
+ console.error(e);
1690
+ app.printError(e);
1691
+ }
1692
+ }
1693
+ }
1694
+ var userInit = getCompInit(MassUser);
1695
+
1696
+ // mass/nav.ts
1697
+ var activeTabBgColor = "#ececec";
1698
+ var activeTabBgColorHover = "#e0e0e0";
1699
+ var activeTabTextColor = "black";
1700
+ var inactiveTabBgColorHover = "#fcfced";
1701
+ var inactiveTabTextColor = "gray";
1702
+ var instanceNum = 0;
1703
+ var idPrefix = "_MASS_AUTOID_" + Math.random().toString().slice(-6);
1704
+ var id = Number((+/* @__PURE__ */ new Date()).toString().slice(-8));
1705
+ var headtip = new Menu({ padding: "0px", offsetX: 0, offsetY: 0 });
1706
+ headtip.d.style("z-index", 5555);
1707
+ var aboutTab = { top: "ABOUT", mid: "", btm: "", subheader: "about" };
1708
+ var chartTab = { top: "CHARTS", mid: "NONE", btm: "", subheader: "charts" };
1709
+ var groupsTab = { top: "GROUPS", mid: "NONE", btm: "", subheader: "groups" };
1710
+ var filterTab = { top: "FILTER", mid: "NONE", btm: "", subheader: "filter" };
1711
+ var userTab = { top: "SESSION", mid: "", btm: "", subheader: "user" };
1712
+ function getUserTabMid(termdbConfig, activeCohort = -1) {
1713
+ if (!termdbConfig?.requiredAuth?.length) return "";
1714
+ const auth = termdbConfig.clientAuthResult;
1715
+ const keys = termdbConfig.selectCohort?.values?.[activeCohort]?.keys || [];
1716
+ const role = [auth?.role, ...keys.map((k) => auth?.[k]?.role)].find((r) => typeof r === "string" && r);
1717
+ return role ? role.toUpperCase() : "";
1718
+ }
1719
+ function getId() {
1720
+ return idPrefix + "_" + id++;
1721
+ }
1722
+ var TdbNav = class _TdbNav {
1723
+ static {
1724
+ this.type = "nav";
1725
+ }
1726
+ constructor(opts) {
1727
+ this.type = _TdbNav.type;
1728
+ this.instanceNum = instanceNum++;
1729
+ this.tabs = [];
1730
+ this.activeTab = 0;
1731
+ this.activeCohort = 0;
1732
+ this.samplecounts = {};
1733
+ this.searching = false;
1734
+ this.massSessionDuration = opts.massSessionDuration;
1735
+ this.pkgver = opts.pkgver || null;
1736
+ setInteractivity(this);
1737
+ setRenderers(this);
1738
+ }
1739
+ async init(appState) {
1740
+ this.cohortFilter = getFilterItemByTag(appState.termfilter.filter, "cohortFilter");
1741
+ this.initUI(appState);
1742
+ if (appState?.termdbConfig?.selectCohort) {
1743
+ this.dom.tds.filter((d) => d.colNum === 0).style("display", "");
1744
+ this.cohortNames = appState.termdbConfig.selectCohort.values.map((d) => d.keys.slice().sort().join(","));
1745
+ }
1746
+ this.components = await multiInit({
1747
+ filter: filterRxCompInit({
1748
+ app: this.app,
1749
+ vocabApi: this.app.vocabApi,
1750
+ holder: this.dom.subheader.filter.append("div").style("margin", "5px"),
1751
+ hideLabel: this.opts.header_mode === "with_tabs",
1752
+ emptyLabel: "+Add new filter",
1753
+ callback: (filter) => {
1754
+ this.app.dispatch({
1755
+ type: "filter_replace",
1756
+ filter
1757
+ });
1758
+ }
1759
+ }),
1760
+ charts: chartsInit({
1761
+ app: this.app,
1762
+ holder: this.dom.subheader.charts,
1763
+ vocab: this.opts.vocab
1764
+ }),
1765
+ groups: groupsInit({
1766
+ app: this.app,
1767
+ holder: this.dom.subheader.groups,
1768
+ vocab: this.opts.vocab
1769
+ }),
1770
+ recover: recoverInit({
1771
+ app: this.app,
1772
+ holder: this.dom.recoverDiv,
1773
+ // TODO: ???? may limit the tracked state to only the filter, activeCohort ???
1774
+ getState: (appState2) => appState2,
1775
+ reactsTo: (action) => action.type != "plot_edit",
1776
+ maxHistoryLen: 5
1777
+ }),
1778
+ about: aboutInit({
1779
+ app: this.app,
1780
+ subheader: this.dom.subheader.about,
1781
+ instanceNum: this.instanceNum,
1782
+ aboutOverrides: appState?.termdbConfig?.massNav?.tabs?.about || null,
1783
+ selectCohort: appState?.termdbConfig?.selectCohort || null
1784
+ }),
1785
+ chat: chatInit({
1786
+ app: this.app,
1787
+ subheader: this.dom.subheader.chat
1788
+ }),
1789
+ user: userInit({
1790
+ app: this.app,
1791
+ subheader: this.dom.subheader.user,
1792
+ massSessionDuration: this.opts.massSessionDuration,
1793
+ sessionDaysLeft: this.app.opts.sessionDaysLeft ?? null,
1794
+ sessionId: this.app.opts.sessionId || null
1795
+ })
1796
+ });
1797
+ }
1798
+ reactsTo(action) {
1799
+ if (action.type.startsWith("filter")) return true;
1800
+ if (action.type.startsWith("cohort")) return true;
1801
+ if (action.type.startsWith("tab")) return true;
1802
+ if (action.type == "plot_prep") return true;
1803
+ if (action.type == "plot_create") return true;
1804
+ if (action.type == "plot_delete") return true;
1805
+ if (action.type == "app_refresh") return true;
1806
+ if (action.type.endsWith("_customTerm")) return true;
1807
+ if (action.type.endsWith("_group")) return true;
1808
+ }
1809
+ getState(appState) {
1810
+ return {
1811
+ searching: this.searching,
1812
+ // for detection of internal state change
1813
+ nav: appState.nav,
1814
+ activeCohort: appState.activeCohort,
1815
+ termdbConfig: appState.termdbConfig,
1816
+ filter: appState.termfilter.filter,
1817
+ plots: appState.plots,
1818
+ groups: appState.groups
1819
+ };
1820
+ }
1821
+ async main() {
1822
+ this.dom.tabDiv.style("display", this.state.nav.header_mode === "with_tabs" ? "inline-block" : "none");
1823
+ this.dom.tip.hide();
1824
+ this.activeTab = this.state.nav.activeTab;
1825
+ this.prevCohort = this.activeCohort;
1826
+ this.activeCohort = +this.state.activeCohort;
1827
+ this.filterUiRoot = getFilterItemByTag(this.state.filter, "filterUiRoot");
1828
+ this.cohortFilter = getFilterItemByTag(this.state.filter, "cohortFilter");
1829
+ if (this.cohortNames) {
1830
+ this.activeCohortName = this.cohortNames[this.activeCohort];
1831
+ if (this.activeCohort !== -1)
1832
+ this.activeCohortLabel = this.state.termdbConfig.selectCohort.values[this.activeCohort].shortLabel;
1833
+ }
1834
+ this.filterJSON = JSON.stringify(this.state.filter);
1835
+ this.cohortsData = await this.app.vocabApi.getCohortsData();
1836
+ if (this.state.nav.header_mode === "with_tabs") {
1837
+ if (!(this.activeCohort in this.samplecounts)) {
1838
+ this.samplecounts[this.activeCohort] = await this.app.vocabApi.getCohortSampleCount(this.activeCohortName);
1839
+ }
1840
+ if (!(this.filterJSON in this.samplecounts)) {
1841
+ if (!this.filterUiRoot || !this.filterUiRoot.lst.length) {
1842
+ this.samplecounts[this.filterJSON] = this.samplecounts[this.activeCohort];
1843
+ } else {
1844
+ const n = await this.app.vocabApi.getFilteredSampleCount(this.filterJSON);
1845
+ this.samplecounts[this.filterJSON] = n;
1846
+ }
1847
+ }
1848
+ }
1849
+ this.updateUI();
1850
+ }
1851
+ };
1852
+ var navInit = getCompInit(TdbNav);
1853
+ function setRenderers(self) {
1854
+ self.initUI = (appState) => {
1855
+ const verifiedToken = self.app.vocabApi.verifiedToken;
1856
+ const invalidTokenErrorHandling = appState.termdbConfig.invalidTokenErrorHandling;
1857
+ if (!verifiedToken && invalidTokenErrorHandling?.affectedCharts?.includes("*"))
1858
+ throw new Error(appState.termdbConfig.invalidTokenErrorHandling.errorMessage);
1859
+ const header = self.opts.holder.append("div").style("white-space", "nowrap").style("display", "flex").style("align-items", "stretch");
1860
+ const massNav = appState.termdbConfig?.massNav || {};
1861
+ const titleDiv = header.append("div").style("order", "2").style("align-self", "flex-start").style("font-size", "1.1em").style("margin", "50px 10px 0 0").text(massNav?.title?.text);
1862
+ const tabDiv = header.append("div").style("display", "none").style("vertical-align", "bottom");
1863
+ const controlsDiv = header.append("div").style("order", "1").style("margin", "10px 10px 10px auto").style("text-align", "right");
1864
+ if (self.opts.header_mode === "only_buttons") {
1865
+ tabDiv.style("display", "none");
1866
+ titleDiv.style("display", "none");
1867
+ controlsDiv.style("display", "none");
1868
+ }
1869
+ self.opts.holder.attr("class", "sjpp-nav");
1870
+ self.dom = {
1871
+ holder: self.opts.holder,
1872
+ header,
1873
+ tabDiv,
1874
+ controlsDiv,
1875
+ searchDiv: controlsDiv.append("div").style("margin", "10px"),
1876
+ recoverDiv: controlsDiv.append("div").style("display", "inline-block"),
1877
+ pdfDiv: controlsDiv.append("div").style("display", "inline-block").style("padding", "4px").style("vertical-align", "middle"),
1878
+ deleteAllDiv: controlsDiv.append("div").style("display", "inline-block").style("padding", "4px").style("vertical-align", "middle"),
1879
+ helpDiv: controlsDiv.append("div").style("display", "none"),
1880
+ subheaderDiv: self.opts.holder.append("div").style("display", "block").style("border-bottom", "1px solid #000"),
1881
+ messageDiv: self.opts.holder.append("div").style("margin", "30px").style("display", "none"),
1882
+ titleDiv,
1883
+ tip: new Menu({ padding: "5px" })
1884
+ };
1885
+ icons["trash"](self.dom.deleteAllDiv, {
1886
+ handler: self.deletePlots,
1887
+ title: "Delete all plots. To revert, click Undo button"
1888
+ });
1889
+ icons["pdf"](self.dom.pdfDiv, {
1890
+ handler: self.opts.downloadPlots,
1891
+ title: "Generate a PDF of all the plots opened"
1892
+ });
1893
+ if (self.opts.header_mode === "with_cohortHtmlSelect") {
1894
+ self.dom.cohortStandaloneDiv = header.append("div").style("display", "inline-block").style("margin", "10px").style("vertical-align", "top");
1895
+ self.dom.cohortStandaloneDiv.append("label").html("Cohort: ");
1896
+ self.dom.cohortSelect = self.dom.cohortStandaloneDiv.append("select").on("change", async function() {
1897
+ self.app.dispatch({ type: "cohort_set", activeCohort: +this.value });
1898
+ });
1899
+ self.dom.cohortSelect.selectAll("option").data(appState.termdbConfig.selectCohort.values).enter().append("option").attr("value", (d, i) => i).property("selected", (d, i) => i === appState.activeCohort).html((d) => d.shortLabel);
1900
+ }
1901
+ self.dom.subheader = Object.freeze({
1902
+ // For either the COHORT or ABOUT tab
1903
+ about: self.dom.subheaderDiv.append("div").attr("data-testid", "sjpp-mass-nav-subheader-about").style("display", "none"),
1904
+ search: self.dom.subheaderDiv.append("div").attr("data-testid", "sjpp-mass-nav-subheader-search").style("display", "none"),
1905
+ groups: self.dom.subheaderDiv.append("div").attr("data-testid", "sjpp-mass-nav-subheader-groups").style("display", "none"),
1906
+ charts: self.dom.subheaderDiv.append("div").attr("data-testid", "sjpp-mass-nav-subheader-charts").style("display", "none"),
1907
+ filter: self.dom.subheaderDiv.append("div").attr("data-testid", "sjpp-mass-nav-subheader-filter").style("display", "none"),
1908
+ chat: self.dom.subheaderDiv.append("div").attr("data-testid", "sjpp-mass-nav-subheader-chat").style("display", "none"),
1909
+ user: self.dom.subheaderDiv.append("div").attr("data-testid", "sjpp-mass-nav-subheader-user").style("display", "none")
1910
+ // cart: self.dom.subheaderDiv.append('div').style('display', 'none').html('<br/>Cart feature under construction - work in progress<br/>&nbsp;<br/>'),
1911
+ });
1912
+ if (!massNav.tabs?.about?.hide) {
1913
+ self.tabs.push(aboutTab);
1914
+ const override = Object.assign({}, massNav.tabs?.about);
1915
+ if (appState.termdbConfig?.selectCohort) {
1916
+ if (!override.top) override.top = "COHORT";
1917
+ } else {
1918
+ if (!override.mid) override.mid = self.pickDatasetLabel(appState);
1919
+ }
1920
+ Object.assign(aboutTab, override);
1921
+ }
1922
+ if (!massNav.tabs?.charts?.hide) {
1923
+ self.tabs.push(chartTab);
1924
+ Object.assign(chartTab, massNav.tabs?.charts);
1925
+ }
1926
+ if (!massNav.tabs?.groups?.hide) {
1927
+ self.tabs.push(groupsTab);
1928
+ Object.assign(groupsTab, massNav.tabs?.groups);
1929
+ }
1930
+ if (!massNav.tabs?.filter?.hide) {
1931
+ self.tabs.push(filterTab);
1932
+ Object.assign(filterTab, massNav.tabs?.filter);
1933
+ }
1934
+ if (!massNav.tabs?.chat?.hide) {
1935
+ if (appState.termdbConfig?.queries?.chat) {
1936
+ const chatTab = { top: "CHAT", mid: "", btm: "", subheader: "chat" };
1937
+ Object.assign(chatTab, massNav.tabs?.chat);
1938
+ chatTab.top = "CHAT";
1939
+ self.tabs.push(chatTab);
1940
+ } else {
1941
+ const searchTab = { top: "SEARCH", mid: "", btm: "", subheader: "chat" };
1942
+ Object.assign(searchTab, massNav.tabs?.chat);
1943
+ searchTab.top = "SEARCH";
1944
+ self.tabs.push(searchTab);
1945
+ }
1946
+ }
1947
+ if (!massNav.tabs?.user?.hide) {
1948
+ const override = Object.assign({}, massNav.tabs?.user);
1949
+ if (!override.mid) override.mid = getUserTabMid(appState.termdbConfig, appState.activeCohort);
1950
+ self.tabs.push(Object.assign({}, userTab, override));
1951
+ }
1952
+ const table = self.dom.tabDiv.append("table").attr("data-testid", "sjpp-nav-tabs-table").style("border-collapse", "collapse").style("height", "100%");
1953
+ table.selectAll("tr").data(["top", "mid", "btm"]).enter().append("tr").attr("class", (d, i) => `sjpp-nav-tabs-row-${i}`).style("font-size", (d, i) => i == 1 ? "20px" : "12px").selectAll("td").data(
1954
+ (key, i) => self.tabs.map((row, colNum) => {
1955
+ return {
1956
+ rowNum: i,
1957
+ key,
1958
+ colNum,
1959
+ label: row[key],
1960
+ subheader: row.subheader,
1961
+ disabled: row.disabled,
1962
+ disabledMessage: row.disabledMessage
1963
+ };
1964
+ })
1965
+ ).enter().append("td").attr("class", (d) => `sjpp-nav-tab-col-${d.colNum}`).attr("data-testid", (d) => `sjpp-nav-tab-col-${d.label}`).style("display", "none").style("width", "100px").style("padding", (d) => d.rowNum === 0 ? "12px 12px 3px 12px" : "3px 12px").style("text-align", "center").style("border-left", "1px solid #ccc").style("border-right", "1px solid #ccc").style("color", "#aaa").style("opacity", (d) => d.disabled ? 0.5 : 1).style("cursor", (d) => d.disabled ? "not-allowed" : "pointer").attr("title", (d) => d.disabledMessage || "").html((d) => d.label).on("click", (event, d) => {
1966
+ self.setTab(event, d);
1967
+ }).on("mouseover", (event, d) => {
1968
+ self.mouseover(event, d);
1969
+ }).on("mouseout", (event, d) => {
1970
+ self.mouseout(d);
1971
+ });
1972
+ self.dom.trs = table.selectAll("tr");
1973
+ self.dom.tds = table.selectAll("td");
1974
+ self.subheaderKeys = self.tabs.map((d) => d.subheader);
1975
+ };
1976
+ self.deletePlots = () => {
1977
+ const state = self.app.getState();
1978
+ const subactions = [];
1979
+ for (const plot of state.plots) subactions.push({ type: "plot_delete", id: plot.id });
1980
+ self.app.dispatch({ type: "app_refresh", subactions });
1981
+ };
1982
+ self.updateUI = async () => {
1983
+ if (!self.dom.subheaderDiv) return;
1984
+ const isUserTab = self.tabs[self.activeTab]?.subheader === "user";
1985
+ if (self.activeTab && !isUserTab && self.state.termdbConfig.selectCohort && self.activeCohort == -1) {
1986
+ self.dom.subheaderDiv.style("display", "none");
1987
+ self.dom.messageDiv.selectAll("text").remove();
1988
+ self.dom.messageDiv.style("display", "").text('No cohort selected. Please select a cohort in the "COHORT" tab.');
1989
+ } else {
1990
+ if (self.dom.subheaderDiv) self.dom.subheaderDiv.style("display", self.activeTab != -1 ? "block" : "none");
1991
+ if (self.dom.messageDiv) self.dom.messageDiv.style("display", "none");
1992
+ }
1993
+ const selectCohort = self.state.termdbConfig.selectCohort;
1994
+ const massNav = self.state.termdbConfig.massNav;
1995
+ self.dom.searchDiv.style("display", selectCohort && self.activeCohort == -1 ? "none" : "inline-block");
1996
+ self.dom.header.style("border-bottom", self.state.nav.header_mode === "with_tabs" ? "1px solid #000" : "");
1997
+ self.dom.tds.style("display", "").style("color", (d) => d.colNum == self.activeTab ? activeTabTextColor : inactiveTabTextColor).style(
1998
+ "background-color",
1999
+ (d) => d.colNum == self.activeTab && self.dom.subheaderDiv.style("display") != "none" ? self.state.termdbConfig.massNav?.activeColor || activeTabBgColor : "transparent"
2000
+ ).html(function(d) {
2001
+ if (d.key == "top") return this.innerHTML;
2002
+ if (d.subheader == "groups") {
2003
+ if (d.key == "mid") return self.state.groups.length || "NONE";
2004
+ return "";
2005
+ }
2006
+ if (d.subheader === "charts") {
2007
+ const n = self.state.plots.filter((p) => !p.parentId).length;
2008
+ if (d.key == "mid") return !n ? "NONE" : n;
2009
+ else return "";
2010
+ } else if (d.subheader === "about") {
2011
+ if (self.activeCohort != -1 && self.activeCohort in self.samplecounts) {
2012
+ const aboutMap = {
2013
+ top: this.innerHTML,
2014
+ mid: self.activeCohortLabel,
2015
+ btm: self.samplecounts[self.activeCohort]
2016
+ };
2017
+ return aboutMap[d.key] || "";
2018
+ } else if (!selectCohort) {
2019
+ const aboutMap = {
2020
+ top: massNav?.tabs?.about?.top || "ABOUT",
2021
+ mid: massNav?.tabs?.about?.mid || this.innerHTML,
2022
+ btm: massNav?.tabs?.about?.btm || self.samplecounts[self.activeCohort]
2023
+ };
2024
+ return aboutMap[d.key] || "";
2025
+ } else {
2026
+ return d.key === "mid" ? "NONE" : this.innerHTML;
2027
+ }
2028
+ } else if (d.subheader === "filter") {
2029
+ const filter = self.filterUiRoot ? self.filterUiRoot : { lst: [] };
2030
+ if (filter.lst.length === 0) {
2031
+ return d.key === "mid" ? "NONE" : "";
2032
+ } else {
2033
+ const n = self.samplecounts[self.filterJSON] != void 0 ? "" + self.samplecounts[self.filterJSON] : "";
2034
+ return d.key === "mid" ? filter.lst.length : n;
2035
+ }
2036
+ } else if (d.subheader === "user" && d.key == "btm") {
2037
+ return getDaysLeft(self.app.opts.sessionDaysLeft)?.text || "&nbsp;";
2038
+ } else if (d.subheader === "user" && d.key == "mid" && !massNav?.tabs?.user?.mid) {
2039
+ return getUserTabMid(self.state.termdbConfig, self.activeCohort);
2040
+ } else {
2041
+ return d.key === "mid" ? this.innerHTML : "&nbsp;";
2042
+ }
2043
+ });
2044
+ for (const key in self.dom.subheader) {
2045
+ self.dom.subheader[key].style(
2046
+ "display",
2047
+ self.activeTab == -1 ? "none" : self.tabs[self.activeTab].subheader === key ? "block" : "none"
2048
+ );
2049
+ }
2050
+ if (self.opts.header_mode === "with_cohortHtmlSelect") {
2051
+ self.dom.cohortSelect.selectAll("option").property("value", self.activeCohort);
2052
+ }
2053
+ };
2054
+ }
2055
+ function setInteractivity(self) {
2056
+ self.setTab = async (event, d) => {
2057
+ if (d.disabled) return;
2058
+ if (d.colNum === self.activeTab && !self.searching) {
2059
+ if (self.activeTab == 0) return;
2060
+ self.prevCohort = self.activeCohort;
2061
+ await self.updateUI();
2062
+ self.app.dispatch({ type: "tab_set", activeTab: -1 });
2063
+ return;
2064
+ }
2065
+ self.activeTab = d.colNum;
2066
+ self.searching = false;
2067
+ self.app.dispatch({ type: "tab_set", activeTab: self.activeTab });
2068
+ const chartsIdx = self.subheaderKeys.indexOf("charts");
2069
+ if (self.activeTab == chartsIdx && self.activeCohort != -1 && !self.state.plots.length) {
2070
+ const defaultChartType = self.state.termdbConfig.defaultChartType || "dictionary";
2071
+ self.app.dispatch({
2072
+ type: "plot_create",
2073
+ id: getId(),
2074
+ config: { chartType: defaultChartType }
2075
+ });
2076
+ }
2077
+ };
2078
+ self.mouseover = (event, d) => {
2079
+ const defaultActiveColor = self.state.termdbConfig.massNav?.activeColor || activeTabBgColor;
2080
+ if (d.subheader == "user" && d.key == "btm") self.components.user?.showDaysLeftTip(event.currentTarget);
2081
+ self.dom.tds.style("background-color", (t) => {
2082
+ if (t.colNum === d.colNum)
2083
+ return self.activeTab == t.colNum ? self.state.termdbConfig.massNav?.activeColorHover || activeTabBgColorHover : inactiveTabBgColorHover;
2084
+ return self.activeTab == t.colNum ? defaultActiveColor : "transparent";
2085
+ });
2086
+ };
2087
+ self.mouseout = (d) => {
2088
+ if (d.subheader == "user" && d.key == "btm") self.components.user?.hideDaysLeftTip();
2089
+ const defaultActiveColor = self.state.termdbConfig.massNav?.activeColor || activeTabBgColor;
2090
+ self.dom.tds.style("background-color", (t) => self.activeTab == t.colNum ? defaultActiveColor : "transparent");
2091
+ };
2092
+ self.pickDatasetLabel = (appState) => {
2093
+ const dslabel = appState.vocab.dslabel.toUpperCase();
2094
+ return dslabel.length > 10 ? `${dslabel.slice(0, 10)}...` : dslabel;
2095
+ };
2096
+ }
2097
+
2098
+ export {
2099
+ getId,
2100
+ navInit
2101
+ };
2102
+ //# sourceMappingURL=chunk-SFPZUBPM.js.map