@apollo-annotation/jbrowse-plugin-apollo 0.3.11 → 0.3.12

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 (395) hide show
  1. package/dist/ApolloInternetAccount/components/AuthTypeSelector.d.ts +6 -0
  2. package/dist/ApolloInternetAccount/components/AuthTypeSelector.d.ts.map +1 -0
  3. package/dist/ApolloInternetAccount/components/LoginButtons.d.ts +5 -0
  4. package/dist/ApolloInternetAccount/components/LoginButtons.d.ts.map +1 -0
  5. package/dist/ApolloInternetAccount/components/LoginIcons.d.ts +4 -0
  6. package/dist/ApolloInternetAccount/components/LoginIcons.d.ts.map +1 -0
  7. package/dist/ApolloInternetAccount/index.d.ts +3 -0
  8. package/dist/ApolloInternetAccount/index.d.ts.map +1 -0
  9. package/dist/ApolloJobModel.d.ts +53 -0
  10. package/dist/ApolloJobModel.d.ts.map +1 -0
  11. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts +12 -0
  12. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts.map +1 -0
  13. package/dist/ApolloRefNameAliasAdapter/index.d.ts +3 -0
  14. package/dist/ApolloRefNameAliasAdapter/index.d.ts.map +1 -0
  15. package/dist/ApolloSequenceAdapter/ApolloSequenceAdapter.d.ts +27 -0
  16. package/dist/ApolloSequenceAdapter/ApolloSequenceAdapter.d.ts.map +1 -0
  17. package/dist/ApolloSequenceAdapter/index.d.ts +3 -0
  18. package/dist/ApolloSequenceAdapter/index.d.ts.map +1 -0
  19. package/dist/ApolloTextSearchAdapter/ApolloTextSearchAdapter.d.ts +13 -0
  20. package/dist/ApolloTextSearchAdapter/ApolloTextSearchAdapter.d.ts.map +1 -0
  21. package/dist/ApolloTextSearchAdapter/index.d.ts +3 -0
  22. package/dist/ApolloTextSearchAdapter/index.d.ts.map +1 -0
  23. package/dist/BackendDrivers/BackendDriver.d.ts +26 -0
  24. package/dist/BackendDrivers/BackendDriver.d.ts.map +1 -0
  25. package/dist/BackendDrivers/CollaborationServerDriver.d.ts +206 -0
  26. package/dist/BackendDrivers/CollaborationServerDriver.d.ts.map +1 -0
  27. package/dist/BackendDrivers/DesktopFileDriver.d.ts +160 -0
  28. package/dist/BackendDrivers/DesktopFileDriver.d.ts.map +1 -0
  29. package/dist/BackendDrivers/InMemoryFileDriver.d.ts +162 -0
  30. package/dist/BackendDrivers/InMemoryFileDriver.d.ts.map +1 -0
  31. package/dist/BackendDrivers/index.d.ts +5 -0
  32. package/dist/BackendDrivers/index.d.ts.map +1 -0
  33. package/dist/ChangeManager.d.ts +24 -0
  34. package/dist/ChangeManager.d.ts.map +1 -0
  35. package/dist/FeatureDetailsWidget/ApolloFeatureDetailsWidget.d.ts +6 -0
  36. package/dist/FeatureDetailsWidget/ApolloFeatureDetailsWidget.d.ts.map +1 -0
  37. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts +12 -0
  38. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts.map +1 -0
  39. package/dist/FeatureDetailsWidget/AttributeKey.d.ts +4 -0
  40. package/dist/FeatureDetailsWidget/AttributeKey.d.ts.map +1 -0
  41. package/dist/FeatureDetailsWidget/AttributeKeySelector.d.ts +6 -0
  42. package/dist/FeatureDetailsWidget/AttributeKeySelector.d.ts.map +1 -0
  43. package/dist/FeatureDetailsWidget/Attributes.d.ts +9 -0
  44. package/dist/FeatureDetailsWidget/Attributes.d.ts.map +1 -0
  45. package/dist/FeatureDetailsWidget/BasicInformation.d.ts +8 -0
  46. package/dist/FeatureDetailsWidget/BasicInformation.d.ts.map +1 -0
  47. package/dist/FeatureDetailsWidget/DefaultAttributeEditor.d.ts +9 -0
  48. package/dist/FeatureDetailsWidget/DefaultAttributeEditor.d.ts.map +1 -0
  49. package/dist/FeatureDetailsWidget/DefaultAttributeViewer.d.ts +5 -0
  50. package/dist/FeatureDetailsWidget/DefaultAttributeViewer.d.ts.map +1 -0
  51. package/dist/FeatureDetailsWidget/FeatureDetailsNavigation.d.ts +7 -0
  52. package/dist/FeatureDetailsWidget/FeatureDetailsNavigation.d.ts.map +1 -0
  53. package/dist/FeatureDetailsWidget/NumberTextField.d.ts +8 -0
  54. package/dist/FeatureDetailsWidget/NumberTextField.d.ts.map +1 -0
  55. package/dist/FeatureDetailsWidget/Sequence.d.ts +10 -0
  56. package/dist/FeatureDetailsWidget/Sequence.d.ts.map +1 -0
  57. package/dist/FeatureDetailsWidget/StringTextField.d.ts +8 -0
  58. package/dist/FeatureDetailsWidget/StringTextField.d.ts.map +1 -0
  59. package/dist/FeatureDetailsWidget/TranscriptSequence.d.ts +10 -0
  60. package/dist/FeatureDetailsWidget/TranscriptSequence.d.ts.map +1 -0
  61. package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts +9 -0
  62. package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts.map +1 -0
  63. package/dist/FeatureDetailsWidget/TranscriptWidgetSummary.d.ts +6 -0
  64. package/dist/FeatureDetailsWidget/TranscriptWidgetSummary.d.ts.map +1 -0
  65. package/dist/FeatureDetailsWidget/index.d.ts +5 -0
  66. package/dist/FeatureDetailsWidget/index.d.ts.map +1 -0
  67. package/dist/FeatureDetailsWidget/model.d.ts +123 -0
  68. package/dist/FeatureDetailsWidget/model.d.ts.map +1 -0
  69. package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts +5 -0
  70. package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts.map +1 -0
  71. package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts +7 -0
  72. package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts.map +1 -0
  73. package/dist/LinearApolloDisplay/components/index.d.ts +2 -0
  74. package/dist/LinearApolloDisplay/components/index.d.ts.map +1 -0
  75. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts +4 -0
  76. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts.map +1 -0
  77. package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts +3 -0
  78. package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts.map +1 -0
  79. package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts +3 -0
  80. package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts.map +1 -0
  81. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts +26 -0
  82. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts.map +1 -0
  83. package/dist/LinearApolloDisplay/glyphs/index.d.ts +4 -0
  84. package/dist/LinearApolloDisplay/glyphs/index.d.ts.map +1 -0
  85. package/dist/LinearApolloDisplay/glyphs/util.d.ts +12 -0
  86. package/dist/LinearApolloDisplay/glyphs/util.d.ts.map +1 -0
  87. package/dist/LinearApolloDisplay/index.d.ts +3 -0
  88. package/dist/LinearApolloDisplay/index.d.ts.map +1 -0
  89. package/dist/LinearApolloDisplay/stateModel/base.d.ts +254 -0
  90. package/dist/LinearApolloDisplay/stateModel/base.d.ts.map +1 -0
  91. package/dist/LinearApolloDisplay/stateModel/index.d.ts +349 -0
  92. package/dist/LinearApolloDisplay/stateModel/index.d.ts.map +1 -0
  93. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts +273 -0
  94. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts.map +1 -0
  95. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts +656 -0
  96. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts.map +1 -0
  97. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts +300 -0
  98. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts.map +1 -0
  99. package/dist/LinearApolloDisplay/types.d.ts +2 -0
  100. package/dist/LinearApolloDisplay/types.d.ts.map +1 -0
  101. package/dist/LinearApolloReferenceSequenceDisplay/components/LinearApolloReferenceSequenceDisplay.d.ts +7 -0
  102. package/dist/LinearApolloReferenceSequenceDisplay/components/LinearApolloReferenceSequenceDisplay.d.ts.map +1 -0
  103. package/dist/LinearApolloReferenceSequenceDisplay/components/index.d.ts +2 -0
  104. package/dist/LinearApolloReferenceSequenceDisplay/components/index.d.ts.map +1 -0
  105. package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.d.ts +6 -0
  106. package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.d.ts.map +1 -0
  107. package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceTrack.d.ts +5 -0
  108. package/dist/LinearApolloReferenceSequenceDisplay/drawSequenceTrack.d.ts.map +1 -0
  109. package/dist/LinearApolloReferenceSequenceDisplay/index.d.ts +4 -0
  110. package/dist/LinearApolloReferenceSequenceDisplay/index.d.ts.map +1 -0
  111. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts +236 -0
  112. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts.map +1 -0
  113. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts +245 -0
  114. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts.map +1 -0
  115. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts +246 -0
  116. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts.map +1 -0
  117. package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts +7 -0
  118. package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts.map +1 -0
  119. package/dist/LinearApolloSixFrameDisplay/components/TrackLines.d.ts +8 -0
  120. package/dist/LinearApolloSixFrameDisplay/components/TrackLines.d.ts.map +1 -0
  121. package/dist/LinearApolloSixFrameDisplay/components/index.d.ts +3 -0
  122. package/dist/LinearApolloSixFrameDisplay/components/index.d.ts.map +1 -0
  123. package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts +3 -0
  124. package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts.map +1 -0
  125. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts +20 -0
  126. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts.map +1 -0
  127. package/dist/LinearApolloSixFrameDisplay/glyphs/index.d.ts +2 -0
  128. package/dist/LinearApolloSixFrameDisplay/glyphs/index.d.ts.map +1 -0
  129. package/dist/LinearApolloSixFrameDisplay/index.d.ts +3 -0
  130. package/dist/LinearApolloSixFrameDisplay/index.d.ts.map +1 -0
  131. package/dist/LinearApolloSixFrameDisplay/stateModel/base.d.ts +257 -0
  132. package/dist/LinearApolloSixFrameDisplay/stateModel/base.d.ts.map +1 -0
  133. package/dist/LinearApolloSixFrameDisplay/stateModel/index.d.ts +355 -0
  134. package/dist/LinearApolloSixFrameDisplay/stateModel/index.d.ts.map +1 -0
  135. package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts +283 -0
  136. package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts.map +1 -0
  137. package/dist/LinearApolloSixFrameDisplay/stateModel/mouseEvents.d.ts +668 -0
  138. package/dist/LinearApolloSixFrameDisplay/stateModel/mouseEvents.d.ts.map +1 -0
  139. package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts +306 -0
  140. package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts.map +1 -0
  141. package/dist/LinearApolloSixFrameDisplay/types.d.ts +2 -0
  142. package/dist/LinearApolloSixFrameDisplay/types.d.ts.map +1 -0
  143. package/dist/OntologyManager/OntologyStore/fulltext-stopwords.d.ts +8 -0
  144. package/dist/OntologyManager/OntologyStore/fulltext-stopwords.d.ts.map +1 -0
  145. package/dist/OntologyManager/OntologyStore/fulltext.d.ts +27 -0
  146. package/dist/OntologyManager/OntologyStore/fulltext.d.ts.map +1 -0
  147. package/dist/OntologyManager/OntologyStore/index.d.ts +93 -0
  148. package/dist/OntologyManager/OntologyStore/index.d.ts.map +1 -0
  149. package/dist/OntologyManager/OntologyStore/indexeddb-schema.d.ts +71 -0
  150. package/dist/OntologyManager/OntologyStore/indexeddb-schema.d.ts.map +1 -0
  151. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts +11 -0
  152. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts.map +1 -0
  153. package/dist/OntologyManager/OntologyStore/obo-graph-json-schema.d.ts +107 -0
  154. package/dist/OntologyManager/OntologyStore/obo-graph-json-schema.d.ts.map +1 -0
  155. package/dist/OntologyManager/OntologyStore/prefixes.d.ts +20 -0
  156. package/dist/OntologyManager/OntologyStore/prefixes.d.ts.map +1 -0
  157. package/dist/OntologyManager/util.d.ts +4 -0
  158. package/dist/OntologyManager/util.d.ts.map +1 -0
  159. package/dist/TabularEditor/HybridGrid/ChangeHandling.d.ts +6 -0
  160. package/dist/TabularEditor/HybridGrid/ChangeHandling.d.ts.map +1 -0
  161. package/dist/TabularEditor/HybridGrid/Feature.d.ts +13 -0
  162. package/dist/TabularEditor/HybridGrid/Feature.d.ts.map +1 -0
  163. package/dist/TabularEditor/HybridGrid/FeatureAttributes.d.ts +6 -0
  164. package/dist/TabularEditor/HybridGrid/FeatureAttributes.d.ts.map +1 -0
  165. package/dist/TabularEditor/HybridGrid/Highlight.d.ts +6 -0
  166. package/dist/TabularEditor/HybridGrid/Highlight.d.ts.map +1 -0
  167. package/dist/TabularEditor/HybridGrid/HybridGrid.d.ts +14 -0
  168. package/dist/TabularEditor/HybridGrid/HybridGrid.d.ts.map +1 -0
  169. package/dist/TabularEditor/HybridGrid/NumberCell.d.ts +8 -0
  170. package/dist/TabularEditor/HybridGrid/NumberCell.d.ts.map +1 -0
  171. package/dist/TabularEditor/HybridGrid/ToolBar.d.ts +5 -0
  172. package/dist/TabularEditor/HybridGrid/ToolBar.d.ts.map +1 -0
  173. package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts +11 -0
  174. package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts.map +1 -0
  175. package/dist/TabularEditor/HybridGrid/index.d.ts +2 -0
  176. package/dist/TabularEditor/HybridGrid/index.d.ts.map +1 -0
  177. package/dist/TabularEditor/TabularEditorPane.d.ts +5 -0
  178. package/dist/TabularEditor/TabularEditorPane.d.ts.map +1 -0
  179. package/dist/TabularEditor/index.d.ts +3 -0
  180. package/dist/TabularEditor/index.d.ts.map +1 -0
  181. package/dist/TabularEditor/model.d.ts +17 -0
  182. package/dist/TabularEditor/model.d.ts.map +1 -0
  183. package/dist/TabularEditor/types.d.ts +4 -0
  184. package/dist/TabularEditor/types.d.ts.map +1 -0
  185. package/dist/components/AddAssembly.d.ts +10 -0
  186. package/dist/components/AddAssembly.d.ts.map +1 -0
  187. package/dist/components/AddAssemblyAliases.d.ts +10 -0
  188. package/dist/components/AddAssemblyAliases.d.ts.map +1 -0
  189. package/dist/components/AddChildFeature.d.ts +13 -0
  190. package/dist/components/AddChildFeature.d.ts.map +1 -0
  191. package/dist/components/AddFeature.d.ts +12 -0
  192. package/dist/components/AddFeature.d.ts.map +1 -0
  193. package/dist/components/AddRefSeqAliases.d.ts +10 -0
  194. package/dist/components/AddRefSeqAliases.d.ts.map +1 -0
  195. package/dist/components/CopyFeature.d.ts +13 -0
  196. package/dist/components/CopyFeature.d.ts.map +1 -0
  197. package/dist/components/CreateApolloAnnotation.d.ts +20 -0
  198. package/dist/components/CreateApolloAnnotation.d.ts.map +1 -0
  199. package/dist/components/DeleteAssembly.d.ts +10 -0
  200. package/dist/components/DeleteAssembly.d.ts.map +1 -0
  201. package/dist/components/DeleteFeature.d.ts +15 -0
  202. package/dist/components/DeleteFeature.d.ts.map +1 -0
  203. package/dist/components/Dialog.d.ts +7 -0
  204. package/dist/components/Dialog.d.ts.map +1 -0
  205. package/dist/components/DownloadGFF3.d.ts +8 -0
  206. package/dist/components/DownloadGFF3.d.ts.map +1 -0
  207. package/dist/components/DuplicateTranscript.d.ts +15 -0
  208. package/dist/components/DuplicateTranscript.d.ts.map +1 -0
  209. package/dist/components/EditZoomThresholdDialog.d.ts +11 -0
  210. package/dist/components/EditZoomThresholdDialog.d.ts.map +1 -0
  211. package/dist/components/FilterFeatures.d.ts +10 -0
  212. package/dist/components/FilterFeatures.d.ts.map +1 -0
  213. package/dist/components/FilterTranscripts.d.ts +10 -0
  214. package/dist/components/FilterTranscripts.d.ts.map +1 -0
  215. package/dist/components/ImportFeatures.d.ts +10 -0
  216. package/dist/components/ImportFeatures.d.ts.map +1 -0
  217. package/dist/components/LogOut.d.ts +8 -0
  218. package/dist/components/LogOut.d.ts.map +1 -0
  219. package/dist/components/ManageChecks.d.ts +8 -0
  220. package/dist/components/ManageChecks.d.ts.map +1 -0
  221. package/dist/components/ManageUsers.d.ts +10 -0
  222. package/dist/components/ManageUsers.d.ts.map +1 -0
  223. package/dist/components/MergeExons.d.ts +15 -0
  224. package/dist/components/MergeExons.d.ts.map +1 -0
  225. package/dist/components/MergeTranscripts.d.ts +15 -0
  226. package/dist/components/MergeTranscripts.d.ts.map +1 -0
  227. package/dist/components/OntologyTermAutocomplete.d.ts +25 -0
  228. package/dist/components/OntologyTermAutocomplete.d.ts.map +1 -0
  229. package/dist/components/OntologyTermMultiSelect.d.ts +12 -0
  230. package/dist/components/OntologyTermMultiSelect.d.ts.map +1 -0
  231. package/dist/components/OpenLocalFile.d.ts +15 -0
  232. package/dist/components/OpenLocalFile.d.ts.map +1 -0
  233. package/dist/components/SplitExon.d.ts +15 -0
  234. package/dist/components/SplitExon.d.ts.map +1 -0
  235. package/dist/components/ViewChangeLog.d.ts +8 -0
  236. package/dist/components/ViewChangeLog.d.ts.map +1 -0
  237. package/dist/components/ViewCheckResults.d.ts +8 -0
  238. package/dist/components/ViewCheckResults.d.ts.map +1 -0
  239. package/dist/components/index.d.ts +21 -0
  240. package/dist/components/index.d.ts.map +1 -0
  241. package/dist/extensions/annotationFromJBrowseFeature.d.ts +6 -0
  242. package/dist/extensions/annotationFromJBrowseFeature.d.ts.map +1 -0
  243. package/dist/extensions/annotationFromPileup.d.ts +3 -0
  244. package/dist/extensions/annotationFromPileup.d.ts.map +1 -0
  245. package/dist/extensions/index.d.ts +3 -0
  246. package/dist/extensions/index.d.ts.map +1 -0
  247. package/dist/index.esm.js +843 -1330
  248. package/dist/index.esm.js.map +1 -1
  249. package/dist/jbrowse-plugin-apollo.cjs.development.js +919 -1455
  250. package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
  251. package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
  252. package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
  253. package/dist/jbrowse-plugin-apollo.umd.development.js +46351 -63687
  254. package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
  255. package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
  256. package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
  257. package/dist/makeDisplayComponent.d.ts +9 -0
  258. package/dist/makeDisplayComponent.d.ts.map +1 -0
  259. package/dist/menus/index.d.ts +2 -0
  260. package/dist/menus/index.d.ts.map +1 -0
  261. package/dist/menus/topLevelMenu.d.ts +3 -0
  262. package/dist/menus/topLevelMenu.d.ts.map +1 -0
  263. package/dist/menus/topLevelMenuAdmin.d.ts +3 -0
  264. package/dist/menus/topLevelMenuAdmin.d.ts.map +1 -0
  265. package/dist/session/index.d.ts +2 -0
  266. package/dist/session/index.d.ts.map +1 -0
  267. package/dist/types.d.ts +10 -0
  268. package/dist/types.d.ts.map +1 -0
  269. package/dist/util/annotationFeatureUtils.d.ts +7 -0
  270. package/dist/util/annotationFeatureUtils.d.ts.map +1 -0
  271. package/dist/util/copyToClipboard.d.ts +2 -0
  272. package/dist/util/copyToClipboard.d.ts.map +1 -0
  273. package/dist/util/glyphUtils.d.ts +31 -0
  274. package/dist/util/glyphUtils.d.ts.map +1 -0
  275. package/dist/util/index.d.ts +10 -0
  276. package/dist/util/index.d.ts.map +1 -0
  277. package/dist/util/loadAssemblyIntoClient.d.ts +5 -0
  278. package/dist/util/loadAssemblyIntoClient.d.ts.map +1 -0
  279. package/dist/util/mouseEventsUtils.d.ts +25 -0
  280. package/dist/util/mouseEventsUtils.d.ts.map +1 -0
  281. package/package.json +48 -25
  282. package/src/ApolloInternetAccount/components/AuthTypeSelector.tsx +7 -2
  283. package/src/ApolloInternetAccount/components/LoginButtons.tsx +1 -1
  284. package/src/ApolloInternetAccount/configSchema.ts +1 -1
  285. package/src/ApolloInternetAccount/model.ts +13 -6
  286. package/src/ApolloJobModel.ts +3 -3
  287. package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +2 -2
  288. package/src/ApolloSequenceAdapter/ApolloSequenceAdapter.ts +2 -2
  289. package/src/ApolloTextSearchAdapter/ApolloTextSearchAdapter.ts +28 -5
  290. package/src/BackendDrivers/BackendDriver.ts +8 -8
  291. package/src/BackendDrivers/CollaborationServerDriver.ts +6 -6
  292. package/src/BackendDrivers/DesktopFileDriver.ts +4 -4
  293. package/src/BackendDrivers/InMemoryFileDriver.ts +5 -8
  294. package/src/ChangeManager.ts +8 -3
  295. package/src/FeatureDetailsWidget/ApolloFeatureDetailsWidget.tsx +3 -3
  296. package/src/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.tsx +7 -7
  297. package/src/FeatureDetailsWidget/AttributeKey.tsx +1 -1
  298. package/src/FeatureDetailsWidget/AttributeKeySelector.tsx +1 -1
  299. package/src/FeatureDetailsWidget/Attributes.tsx +4 -4
  300. package/src/FeatureDetailsWidget/BasicInformation.tsx +3 -3
  301. package/src/FeatureDetailsWidget/DefaultAttributeEditor.tsx +1 -1
  302. package/src/FeatureDetailsWidget/FeatureDetailsNavigation.tsx +2 -2
  303. package/src/FeatureDetailsWidget/Sequence.tsx +3 -3
  304. package/src/FeatureDetailsWidget/TranscriptSequence.tsx +2 -2
  305. package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +3 -6
  306. package/src/FeatureDetailsWidget/TranscriptWidgetSummary.tsx +1 -1
  307. package/src/FeatureDetailsWidget/model.ts +3 -3
  308. package/src/LinearApolloDisplay/components/CheckResultWarnings.tsx +2 -2
  309. package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +6 -4
  310. package/src/LinearApolloDisplay/glyphs/BoxGlyph.ts +7 -7
  311. package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +56 -30
  312. package/src/LinearApolloDisplay/glyphs/GenericChildGlyph.ts +6 -6
  313. package/src/LinearApolloDisplay/glyphs/Glyph.ts +7 -7
  314. package/src/LinearApolloDisplay/glyphs/util.ts +2 -2
  315. package/src/LinearApolloDisplay/stateModel/base.ts +17 -8
  316. package/src/LinearApolloDisplay/stateModel/index.ts +2 -2
  317. package/src/LinearApolloDisplay/stateModel/layouts.ts +4 -4
  318. package/src/LinearApolloDisplay/stateModel/mouseEvents.ts +6 -6
  319. package/src/LinearApolloDisplay/stateModel/rendering.ts +3 -3
  320. package/src/LinearApolloReferenceSequenceDisplay/components/LinearApolloReferenceSequenceDisplay.tsx +4 -2
  321. package/src/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.ts +4 -4
  322. package/src/LinearApolloReferenceSequenceDisplay/drawSequenceTrack.ts +3 -3
  323. package/src/LinearApolloReferenceSequenceDisplay/stateModel/base.ts +11 -8
  324. package/src/LinearApolloReferenceSequenceDisplay/stateModel/index.ts +2 -2
  325. package/src/LinearApolloReferenceSequenceDisplay/stateModel/rendering.ts +2 -2
  326. package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +17 -9
  327. package/src/LinearApolloSixFrameDisplay/components/TrackLines.tsx +1 -1
  328. package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +36 -23
  329. package/src/LinearApolloSixFrameDisplay/glyphs/Glyph.ts +6 -6
  330. package/src/LinearApolloSixFrameDisplay/stateModel/base.ts +17 -8
  331. package/src/LinearApolloSixFrameDisplay/stateModel/index.ts +2 -2
  332. package/src/LinearApolloSixFrameDisplay/stateModel/layouts.ts +12 -8
  333. package/src/LinearApolloSixFrameDisplay/stateModel/mouseEvents.ts +11 -10
  334. package/src/LinearApolloSixFrameDisplay/stateModel/rendering.ts +3 -3
  335. package/src/OntologyManager/OntologyStore/fulltext.test.ts +1 -1
  336. package/src/OntologyManager/OntologyStore/fulltext.ts +11 -4
  337. package/src/OntologyManager/OntologyStore/index.test.ts +3 -0
  338. package/src/OntologyManager/OntologyStore/indexeddb-schema.ts +6 -6
  339. package/src/OntologyManager/OntologyStore/indexeddb-storage.ts +2 -1
  340. package/src/OntologyManager/index.ts +4 -4
  341. package/src/OntologyManager/util.ts +1 -1
  342. package/src/TabularEditor/HybridGrid/ChangeHandling.ts +2 -2
  343. package/src/TabularEditor/HybridGrid/Feature.tsx +6 -6
  344. package/src/TabularEditor/HybridGrid/FeatureAttributes.tsx +2 -2
  345. package/src/TabularEditor/HybridGrid/Highlight.tsx +1 -1
  346. package/src/TabularEditor/HybridGrid/HybridGrid.tsx +2 -2
  347. package/src/TabularEditor/HybridGrid/NumberCell.tsx +1 -1
  348. package/src/TabularEditor/HybridGrid/ToolBar.tsx +3 -2
  349. package/src/TabularEditor/HybridGrid/featureContextMenuItems.ts +26 -4
  350. package/src/TabularEditor/TabularEditorPane.tsx +1 -1
  351. package/src/TabularEditor/model.ts +2 -2
  352. package/src/TabularEditor/types.ts +2 -2
  353. package/src/components/AddAssembly.tsx +61 -42
  354. package/src/components/AddAssemblyAliases.tsx +5 -5
  355. package/src/components/AddChildFeature.tsx +3 -3
  356. package/src/components/AddFeature.tsx +4 -4
  357. package/src/components/AddRefSeqAliases.tsx +7 -7
  358. package/src/components/CopyFeature.tsx +8 -8
  359. package/src/components/CreateApolloAnnotation.tsx +5 -5
  360. package/src/components/DeleteAssembly.tsx +8 -8
  361. package/src/components/DeleteFeature.tsx +4 -4
  362. package/src/components/Dialog.tsx +1 -1
  363. package/src/components/DownloadGFF3.tsx +8 -8
  364. package/src/components/DuplicateTranscript.tsx +132 -0
  365. package/src/components/FilterFeatures.tsx +1 -1
  366. package/src/components/FilterTranscripts.tsx +1 -1
  367. package/src/components/ImportFeatures.tsx +51 -33
  368. package/src/components/LogOut.tsx +4 -4
  369. package/src/components/ManageChecks.tsx +8 -8
  370. package/src/components/ManageUsers.tsx +18 -26
  371. package/src/components/MergeExons.tsx +4 -4
  372. package/src/components/MergeTranscripts.tsx +4 -4
  373. package/src/components/OntologyTermAutocomplete.tsx +14 -4
  374. package/src/components/OntologyTermMultiSelect.tsx +12 -5
  375. package/src/components/OpenLocalFile.tsx +2 -2
  376. package/src/components/SplitExon.tsx +6 -6
  377. package/src/components/ViewChangeLog.tsx +8 -8
  378. package/src/components/ViewCheckResults.tsx +4 -4
  379. package/src/components/index.ts +1 -0
  380. package/src/config.ts +1 -1
  381. package/src/extensions/annotationFromJBrowseFeature.ts +29 -24
  382. package/src/extensions/annotationFromPileup.ts +8 -6
  383. package/src/index.ts +25 -1
  384. package/src/makeDisplayComponent.tsx +8 -5
  385. package/src/menus/topLevelMenu.ts +4 -4
  386. package/src/menus/topLevelMenuAdmin.ts +4 -4
  387. package/src/session/ClientDataStore.ts +20 -15
  388. package/src/session/session.ts +30 -19
  389. package/src/types.ts +10 -4
  390. package/src/util/annotationFeatureUtils.ts +1 -1
  391. package/src/util/displayUtils.ts +3 -3
  392. package/src/util/glyphUtils.ts +10 -10
  393. package/src/util/index.ts +4 -4
  394. package/src/util/loadAssemblyIntoClient.ts +4 -4
  395. package/src/util/mouseEventsUtils.ts +2 -2
@@ -10,21 +10,22 @@ var pluggableElementTypes = require('@jbrowse/core/pluggableElementTypes');
10
10
  var util = require('@jbrowse/core/util');
11
11
  var AddIcon = require('@mui/icons-material/Add');
12
12
  var material = require('@mui/material');
13
+ var mobxStateTree = require('@jbrowse/mobx-state-tree');
13
14
  var mobx = require('mobx');
14
- var mobxStateTree = require('mobx-state-tree');
15
15
  var socket_ioClient = require('socket.io-client');
16
16
  var AdminPanelSettingsIcon = require('@mui/icons-material/AdminPanelSettings');
17
17
  var DeleteIcon = require('@mui/icons-material/Delete');
18
18
  var InputIcon = require('@mui/icons-material/Input');
19
19
  var PersonIcon = require('@mui/icons-material/Person');
20
20
  var RuleIcon = require('@mui/icons-material/Rule');
21
+ var jsxRuntime = require('react/jsx-runtime');
22
+ var tssReact = require('@jbrowse/core/util/tss-react');
21
23
  var InfoIcon = require('@mui/icons-material/Info');
22
24
  var LinkIcon = require('@mui/icons-material/Link');
23
25
  var RadioButtonCheckedIcon = require('@mui/icons-material/RadioButtonChecked');
24
26
  var RadioButtonUncheckedIcon = require('@mui/icons-material/RadioButtonUnchecked');
25
27
  var ObjectID = require('bson-objectid');
26
28
  var React = require('react');
27
- var mui = require('tss-react/mui');
28
29
  var gff = require('@gmod/gff');
29
30
  var SkipNextRoundedIcon = require('@mui/icons-material/SkipNextRounded');
30
31
  var SkipPreviousRoundedIcon = require('@mui/icons-material/SkipPreviousRounded');
@@ -39,9 +40,6 @@ var jsonpath = require('jsonpath');
39
40
  var io = require('@jbrowse/core/util/io');
40
41
  var equal = require('fast-deep-equal/es6');
41
42
  var fileSaver = require('file-saver');
42
- var Checkbox = require('@mui/material/Checkbox');
43
- var FormControlLabel = require('@mui/material/FormControlLabel');
44
- var LinearProgress = require('@mui/material/LinearProgress');
45
43
  var nanoid = require('nanoid');
46
44
  var AccountCircleIcon = require('@mui/icons-material/AccountCircle');
47
45
  var AdapterType = require('@jbrowse/core/pluggableElementTypes/AdapterType');
@@ -73,56 +71,7 @@ var TrackChangesIcon = require('@mui/icons-material/TrackChanges');
73
71
  var UndoIcon = require('@mui/icons-material/Undo');
74
72
  var SaveIcon = require('@mui/icons-material/Save');
75
73
 
76
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
77
-
78
- var Plugin__default = /*#__PURE__*/_interopDefaultLegacy(Plugin);
79
- var AddIcon__default = /*#__PURE__*/_interopDefaultLegacy(AddIcon);
80
- var AdminPanelSettingsIcon__default = /*#__PURE__*/_interopDefaultLegacy(AdminPanelSettingsIcon);
81
- var DeleteIcon__default = /*#__PURE__*/_interopDefaultLegacy(DeleteIcon);
82
- var InputIcon__default = /*#__PURE__*/_interopDefaultLegacy(InputIcon);
83
- var PersonIcon__default = /*#__PURE__*/_interopDefaultLegacy(PersonIcon);
84
- var RuleIcon__default = /*#__PURE__*/_interopDefaultLegacy(RuleIcon);
85
- var InfoIcon__default = /*#__PURE__*/_interopDefaultLegacy(InfoIcon);
86
- var LinkIcon__default = /*#__PURE__*/_interopDefaultLegacy(LinkIcon);
87
- var RadioButtonCheckedIcon__default = /*#__PURE__*/_interopDefaultLegacy(RadioButtonCheckedIcon);
88
- var RadioButtonUncheckedIcon__default = /*#__PURE__*/_interopDefaultLegacy(RadioButtonUncheckedIcon);
89
- var ObjectID__default = /*#__PURE__*/_interopDefaultLegacy(ObjectID);
90
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
91
- var SkipNextRoundedIcon__default = /*#__PURE__*/_interopDefaultLegacy(SkipNextRoundedIcon);
92
- var SkipPreviousRoundedIcon__default = /*#__PURE__*/_interopDefaultLegacy(SkipPreviousRoundedIcon);
93
- var CloseIcon__default = /*#__PURE__*/_interopDefaultLegacy(CloseIcon);
94
- var jsonpath__default = /*#__PURE__*/_interopDefaultLegacy(jsonpath);
95
- var equal__default = /*#__PURE__*/_interopDefaultLegacy(equal);
96
- var Checkbox__default = /*#__PURE__*/_interopDefaultLegacy(Checkbox);
97
- var FormControlLabel__default = /*#__PURE__*/_interopDefaultLegacy(FormControlLabel);
98
- var LinearProgress__default = /*#__PURE__*/_interopDefaultLegacy(LinearProgress);
99
- var AccountCircleIcon__default = /*#__PURE__*/_interopDefaultLegacy(AccountCircleIcon);
100
- var AdapterType__default = /*#__PURE__*/_interopDefaultLegacy(AdapterType);
101
- var SimpleFeature__default = /*#__PURE__*/_interopDefaultLegacy(SimpleFeature);
102
- var BaseResult__default = /*#__PURE__*/_interopDefaultLegacy(BaseResult);
103
- var ExpandMoreIcon__default = /*#__PURE__*/_interopDefaultLegacy(ExpandMoreIcon);
104
- var EditIcon__default = /*#__PURE__*/_interopDefaultLegacy(EditIcon);
105
- var MoreHorizIcon__default = /*#__PURE__*/_interopDefaultLegacy(MoreHorizIcon);
106
- var AddBoxIcon__default = /*#__PURE__*/_interopDefaultLegacy(AddBoxIcon);
107
- var styled__default = /*#__PURE__*/_interopDefaultLegacy(styled);
108
- var ContentCopyIcon__default = /*#__PURE__*/_interopDefaultLegacy(ContentCopyIcon);
109
- var ContentCutIcon__default = /*#__PURE__*/_interopDefaultLegacy(ContentCutIcon);
110
- var RemoveIcon__default = /*#__PURE__*/_interopDefaultLegacy(RemoveIcon);
111
- var ClearIcon__default = /*#__PURE__*/_interopDefaultLegacy(ClearIcon);
112
- var UnfoldLessIcon__default = /*#__PURE__*/_interopDefaultLegacy(UnfoldLessIcon);
113
- var ExpandLessIcon__default = /*#__PURE__*/_interopDefaultLegacy(ExpandLessIcon);
114
- var LockIcon__default = /*#__PURE__*/_interopDefaultLegacy(LockIcon);
115
- var ErrorIcon__default = /*#__PURE__*/_interopDefaultLegacy(ErrorIcon);
116
- var DownloadIcon__default = /*#__PURE__*/_interopDefaultLegacy(DownloadIcon);
117
- var FactCheckIcon__default = /*#__PURE__*/_interopDefaultLegacy(FactCheckIcon);
118
- var FileOpenIcon__default = /*#__PURE__*/_interopDefaultLegacy(FileOpenIcon);
119
- var LogoutIcon__default = /*#__PURE__*/_interopDefaultLegacy(LogoutIcon);
120
- var RedoIcon__default = /*#__PURE__*/_interopDefaultLegacy(RedoIcon);
121
- var TrackChangesIcon__default = /*#__PURE__*/_interopDefaultLegacy(TrackChangesIcon);
122
- var UndoIcon__default = /*#__PURE__*/_interopDefaultLegacy(UndoIcon);
123
- var SaveIcon__default = /*#__PURE__*/_interopDefaultLegacy(SaveIcon);
124
-
125
- var version = "0.3.11";
74
+ var version = "0.3.12";
126
75
 
127
76
  const ApolloConfigSchema = configuration.ConfigurationSchema('ApolloInternetAccount', {
128
77
  baseURL: {
@@ -405,21 +354,21 @@ function getAdjacentExons(currentExon, display, mousePosition, session) {
405
354
  function getStreamIcon(strand, isUpstream, isFlipped) {
406
355
  // This is the icon you would use for strand=1, downstream, straight
407
356
  // (non-flipped) view
408
- let icon = SkipNextRoundedIcon__default["default"];
357
+ let icon = SkipNextRoundedIcon;
409
358
  if (strand === -1) {
410
- icon = SkipPreviousRoundedIcon__default["default"];
359
+ icon = SkipPreviousRoundedIcon;
411
360
  }
412
361
  if (isUpstream) {
413
362
  icon =
414
- icon === SkipPreviousRoundedIcon__default["default"]
415
- ? SkipNextRoundedIcon__default["default"]
416
- : SkipPreviousRoundedIcon__default["default"];
363
+ icon === SkipPreviousRoundedIcon
364
+ ? SkipNextRoundedIcon
365
+ : SkipPreviousRoundedIcon;
417
366
  }
418
367
  if (isFlipped) {
419
368
  icon =
420
- icon === SkipPreviousRoundedIcon__default["default"]
421
- ? SkipNextRoundedIcon__default["default"]
422
- : SkipPreviousRoundedIcon__default["default"];
369
+ icon === SkipPreviousRoundedIcon
370
+ ? SkipNextRoundedIcon
371
+ : SkipPreviousRoundedIcon;
423
372
  }
424
373
  return icon;
425
374
  }
@@ -677,8 +626,7 @@ function getApolloInternetAccount(session) {
677
626
  return internetAccounts.find((ia) => ia.type === 'ApolloInternetAccount');
678
627
  }
679
628
 
680
- /* eslint-disable @typescript-eslint/unbound-method */
681
- const useStyles$g = mui.makeStyles()((theme) => ({
629
+ const useStyles$g = tssReact.makeStyles()((theme) => ({
682
630
  dialogTitle: {
683
631
  background: theme.palette.primary.main,
684
632
  color: theme.palette.primary.contrastText,
@@ -694,13 +642,9 @@ const useStyles$g = mui.makeStyles()((theme) => ({
694
642
  const Dialog = mobxReact.observer(function JBrowseDialog(props) {
695
643
  const { classes } = useStyles$g();
696
644
  const { handleClose, title, ...other } = props;
697
- return (React__default["default"].createElement(ui.Dialog, { ...other, header: React__default["default"].createElement(React__default["default"].Fragment, null,
698
- React__default["default"].createElement(material.DialogTitle, { className: classes.dialogTitle }, title),
699
- React__default["default"].createElement(material.IconButton, { "aria-label": "close", onClick: handleClose, className: classes.closeButton },
700
- React__default["default"].createElement(CloseIcon__default["default"], null))) }));
645
+ return (jsxRuntime.jsx(ui.Dialog, { ...other, header: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogTitle, { className: classes.dialogTitle, children: title }), jsxRuntime.jsx(material.IconButton, { "aria-label": "close", onClick: handleClose, className: classes.closeButton, children: jsxRuntime.jsx(CloseIcon, {}) })] }) }));
701
646
  });
702
647
 
703
- /* eslint-disable @typescript-eslint/unbound-method */
704
648
  var FileType;
705
649
  (function (FileType) {
706
650
  FileType["GFF3"] = "text/x-gff3";
@@ -710,7 +654,7 @@ var FileType;
710
654
  FileType["GZI"] = "application/x-gzi";
711
655
  FileType["EXTERNAL"] = "text/x-external";
712
656
  })(FileType || (FileType = {}));
713
- const useStyles$f = mui.makeStyles()((theme) => ({
657
+ const useStyles$f = tssReact.makeStyles()((theme) => ({
714
658
  accordion: {
715
659
  border: `1px solid ${theme.palette.divider}`,
716
660
  '&:not(:last-child)': {
@@ -766,6 +710,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
766
710
  const [importFeatures, setImportFeatures] = React.useState(true);
767
711
  const [sequenceIsEditable, setSequenceIsEditable] = React.useState(false);
768
712
  const [submitted, setSubmitted] = React.useState(false);
713
+ const [strict, setStrict] = React.useState(true);
769
714
  const [fastaFile, setFastaFile] = React.useState(null);
770
715
  const [fastaIndexFile, setFastaIndexFile] = React.useState(null);
771
716
  const [fastaGziIndexFile, setFastaGziIndexFile] = React.useState(null);
@@ -812,36 +757,33 @@ function AddAssembly({ changeManager, handleClose, session, }) {
812
757
  locationType: 'UriLocation',
813
758
  uri,
814
759
  });
815
- if (apolloFetchFile) {
816
- const job = {
817
- name: `UploadAssemblyFile for ${assemblyName}`,
818
- statusMessage: 'Pre-validating',
819
- progressPct: 0,
820
- cancelCallback: () => {
821
- controller.abort('AddAssembly');
822
- jobsManager.abortJob(job.name);
823
- },
824
- };
825
- jobsManager.runJob(job);
826
- jobsManager.update(job.name, `Uploading ${file.name}, this may take awhile`);
827
- const { signal } = controller;
828
- const response = await apolloFetchFile(uri, {
829
- method: 'POST',
830
- body: formData,
831
- signal,
832
- });
833
- if (!response.ok) {
834
- const newErrorMessage = await createFetchErrorMessage(response, 'Error when inserting new assembly (while uploading file)');
835
- jobsManager.abortJob(job.name, newErrorMessage);
836
- setErrorMessage(newErrorMessage);
837
- return '';
838
- }
839
- const result = await response.json();
840
- const fileId = result._id;
841
- jobsManager.done(job);
842
- return fileId;
760
+ const job = {
761
+ name: `UploadAssemblyFile for ${assemblyName}`,
762
+ statusMessage: 'Pre-validating',
763
+ progressPct: 0,
764
+ cancelCallback: () => {
765
+ controller.abort(new DOMException(`Canceling adding of assembly "${assemblyName}"`, 'AbortError'));
766
+ jobsManager.abortJob(job.name);
767
+ },
768
+ };
769
+ jobsManager.runJob(job);
770
+ jobsManager.update(job.name, `Uploading ${file.name}, this may take awhile`);
771
+ const { signal } = controller;
772
+ const response = await apolloFetchFile(uri, {
773
+ method: 'POST',
774
+ body: formData,
775
+ signal,
776
+ });
777
+ if (!response.ok) {
778
+ const newErrorMessage = await createFetchErrorMessage(response, 'Error when inserting new assembly (while uploading file)');
779
+ jobsManager.abortJob(job.name, newErrorMessage);
780
+ setErrorMessage(newErrorMessage);
781
+ return '';
843
782
  }
844
- throw new Error('Failed to fetch');
783
+ const result = await response.json();
784
+ const fileId = result._id;
785
+ jobsManager.done(job);
786
+ return fileId;
845
787
  }
846
788
  async function onSubmit(event) {
847
789
  event.preventDefault();
@@ -855,7 +797,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
855
797
  if (fileType === FileType.EXTERNAL) {
856
798
  change = new shared.AddAssemblyFromExternalChange({
857
799
  typeName: 'AddAssemblyFromExternalChange',
858
- assembly: new ObjectID__default["default"]().toHexString(),
800
+ assembly: new ObjectID().toHexString(),
859
801
  assemblyName,
860
802
  externalLocation: {
861
803
  fa: fastaUrl,
@@ -872,16 +814,17 @@ function AddAssembly({ changeManager, handleClose, session, }) {
872
814
  const faId = await uploadFile(fastaFile, FileType.GFF3);
873
815
  change = new shared.AddAssemblyAndFeaturesFromFileChange({
874
816
  typeName: 'AddAssemblyAndFeaturesFromFileChange',
875
- assembly: new ObjectID__default["default"]().toHexString(),
817
+ assembly: new ObjectID().toHexString(),
876
818
  assemblyName,
877
819
  fileIds: { fa: faId },
820
+ parseOptions: { strict },
878
821
  });
879
822
  }
880
823
  else if (fileType === FileType.GFF3) {
881
824
  const faId = await uploadFile(fastaFile, FileType.GFF3);
882
825
  change = new shared.AddAssemblyFromFileChange({
883
826
  typeName: 'AddAssemblyFromFileChange',
884
- assembly: new ObjectID__default["default"]().toHexString(),
827
+ assembly: new ObjectID().toHexString(),
885
828
  assemblyName,
886
829
  fileIds: {
887
830
  fa: faId,
@@ -892,7 +835,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
892
835
  const faId = await uploadFile(fastaFile, FileType.FASTA);
893
836
  change = new shared.AddAssemblyFromFileChange({
894
837
  typeName: 'AddAssemblyFromFileChange',
895
- assembly: new ObjectID__default["default"]().toHexString(),
838
+ assembly: new ObjectID().toHexString(),
896
839
  assemblyName,
897
840
  fileIds: {
898
841
  fa: faId,
@@ -908,7 +851,7 @@ function AddAssembly({ changeManager, handleClose, session, }) {
908
851
  const gziId = await uploadFile(fastaGziIndexFile, FileType.GZI);
909
852
  change = new shared.AddAssemblyFromFileChange({
910
853
  typeName: 'AddAssemblyFromFileChange',
911
- assembly: new ObjectID__default["default"]().toHexString(),
854
+ assembly: new ObjectID().toHexString(),
912
855
  assemblyName,
913
856
  fileIds: {
914
857
  fa: faId,
@@ -956,157 +899,82 @@ function AddAssembly({ changeManager, handleClose, session, }) {
956
899
  catch {
957
900
  // pass
958
901
  }
959
- const [expanded, setExpanded] = React__default["default"].useState('panelFastaInput');
902
+ const [expanded, setExpanded] = React.useState('panelFastaInput');
960
903
  const handleAccordionChange = (panel) => (event, newExpanded) => {
961
904
  if (newExpanded) {
962
905
  setExpanded(panel);
963
906
  }
964
907
  };
965
- return (React__default["default"].createElement(Dialog, { open: true, handleClose: handleClose, "data-testid": "add-assembly-dialog", title: "Add new assembly", maxWidth: false },
966
- React__default["default"].createElement("form", { onSubmit: onSubmit, "data-testid": "submit-form" },
967
- React__default["default"].createElement(material.DialogContent, { className: classes.dialog },
968
- loading ? React__default["default"].createElement(material.LinearProgress, null) : null,
969
- React__default["default"].createElement(material.TextField, { margin: "dense", id: "name", label: "Assembly name", type: "TextField", fullWidth: true, variant: "outlined", onChange: (e) => {
970
- setSubmitted(false);
971
- setAssemblyName(e.target.value);
972
- checkAssemblyName(e.target.value);
973
- }, disabled: submitted && !errorMessage }),
974
- React__default["default"].createElement(material.Accordion, { disableGutters: true, elevation: 0, square: true, className: classes.accordion, expanded: expanded === 'panelFastaInput', onChange: handleAccordionChange('panelFastaInput') },
975
- React__default["default"].createElement(material.AccordionSummary, { className: classes.accordionSummary, expandIcon: expanded === 'panelFastaInput' ? (React__default["default"].createElement(RadioButtonCheckedIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: '1.2rem', ml: 5 } })) : (React__default["default"].createElement(RadioButtonUncheckedIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: '1.2rem', mr: 5 } })), "aria-controls": "panelFastaInputd-content", id: "panelFastaInputd-header" },
976
- React__default["default"].createElement(material.Typography, { component: "span" }, "FASTA input")),
977
- React__default["default"].createElement(material.AccordionDetails, { className: classes.accordionDetails },
978
- React__default["default"].createElement(material.FormGroup, null,
979
- React__default["default"].createElement(material.FormControlLabel, { "data-testid": "files-on-url-checkbox", control: React__default["default"].createElement(material.Checkbox, { onChange: () => {
980
- setFileType(fileType === FileType.EXTERNAL
981
- ? FileType.BGZIP_FASTA
982
- : FileType.EXTERNAL);
983
- if (fileType === FileType.EXTERNAL) {
984
- setSequenceIsEditable(false);
985
- }
986
- }, checked: fileType === FileType.EXTERNAL, disabled: sequenceIsEditable && fileType !== FileType.GFF3 }), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
987
- "Use external URLs",
988
- React__default["default"].createElement(material.Tooltip, { title: "Use external URLs to provide FASTA and index files. Does not copy the files to the Apollo collaboration server, so ensure the URLs are stable.", placement: "top-start" },
989
- React__default["default"].createElement(material.IconButton, { size: "small" },
990
- React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } })))) }),
991
- React__default["default"].createElement(material.FormControlLabel, { "data-testid": "sequence-is-editable-checkbox", control: React__default["default"].createElement(material.Checkbox, { onChange: () => {
992
- setSequenceIsEditable(!sequenceIsEditable);
993
- } }), checked: sequenceIsEditable, disabled: fileType === FileType.EXTERNAL, label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
994
- "Store sequence in database",
995
- React__default["default"].createElement(material.Tooltip, { title: "Enables users to edit the genomic sequence, but comes with performance impacts. Use with care.", placement: "top-start" },
996
- React__default["default"].createElement(material.IconButton, { size: "small" },
997
- React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } })))) }),
998
- React__default["default"].createElement(material.FormControlLabel, { "data-testid": "fasta-is-gzip-checkbox", control: React__default["default"].createElement(material.Checkbox, { checked: !sequenceIsEditable || fastaGzipChecked, onChange: () => {
999
- if (sequenceIsEditable) {
1000
- setFastaGzipChecked(!fastaGzipChecked);
1001
- }
1002
- else {
1003
- setFastaGzipChecked(true);
1004
- }
1005
- }, disabled: !sequenceIsEditable }), label: "FASTA is gzip compressed" }),
1006
- fileType === FileType.BGZIP_FASTA ||
1007
- fileType === FileType.GFF3 ? (React__default["default"].createElement(material.Table, { size: "small", sx: { mt: 2 } },
1008
- React__default["default"].createElement(material.TableBody, null,
1009
- React__default["default"].createElement(material.TableRow, null,
1010
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1011
- React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
1012
- React__default["default"].createElement("span", null, "FASTA"),
1013
- React__default["default"].createElement(material.Tooltip, { title: 'Unless "Store sequence in database" enabled, FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent). Compression is optional for sequences stored in the database.' },
1014
- React__default["default"].createElement(material.IconButton, { size: "small" },
1015
- React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } }))))),
1016
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1017
- React__default["default"].createElement("input", { "data-testid": "fasta-input-file", type: "file", onChange: (e) => {
1018
- const file = e.target.files?.item(0);
1019
- if (file) {
1020
- setFastaFile(file);
1021
- if (file.name.endsWith('.gz')) {
1022
- setFastaGzipChecked(true);
908
+ return (jsxRuntime.jsxs(Dialog, { open: true, handleClose: handleClose, "data-testid": "add-assembly-dialog", title: "Add new assembly", maxWidth: false, children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, "data-testid": "submit-form", children: [jsxRuntime.jsxs(material.DialogContent, { className: classes.dialog, children: [loading ? jsxRuntime.jsx(material.LinearProgress, {}) : null, jsxRuntime.jsx(material.TextField, { margin: "dense", id: "name", label: "Assembly name", type: "TextField", fullWidth: true, variant: "outlined", onChange: (e) => {
909
+ setSubmitted(false);
910
+ setAssemblyName(e.target.value);
911
+ checkAssemblyName(e.target.value);
912
+ }, disabled: submitted && !errorMessage }), jsxRuntime.jsxs(material.Accordion, { disableGutters: true, elevation: 0, square: true, className: classes.accordion, expanded: expanded === 'panelFastaInput', onChange: handleAccordionChange('panelFastaInput'), children: [jsxRuntime.jsx(material.AccordionSummary, { className: classes.accordionSummary, expandIcon: expanded === 'panelFastaInput' ? (jsxRuntime.jsx(RadioButtonCheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', ml: 5 } })) : (jsxRuntime.jsx(RadioButtonUncheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', mr: 5 } })), "aria-controls": "panelFastaInputd-content", id: "panelFastaInputd-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "FASTA input" }) }), jsxRuntime.jsx(material.AccordionDetails, { className: classes.accordionDetails, children: jsxRuntime.jsxs(material.FormGroup, { children: [jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "files-on-url-checkbox", control: jsxRuntime.jsx(material.Checkbox, { onChange: () => {
913
+ setFileType(fileType === FileType.EXTERNAL
914
+ ? FileType.BGZIP_FASTA
915
+ : FileType.EXTERNAL);
916
+ if (fileType === FileType.EXTERNAL) {
917
+ setSequenceIsEditable(false);
918
+ }
919
+ }, checked: fileType === FileType.EXTERNAL, disabled: sequenceIsEditable && fileType !== FileType.GFF3 }), label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Use external URLs", jsxRuntime.jsx(material.Tooltip, { title: "Use external URLs to provide FASTA and index files. Does not copy the files to the Apollo collaboration server, so ensure the URLs are stable.", placement: "top-start", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "sequence-is-editable-checkbox", control: jsxRuntime.jsx(material.Checkbox, { onChange: () => {
920
+ setSequenceIsEditable(!sequenceIsEditable);
921
+ } }), checked: sequenceIsEditable, disabled: fileType === FileType.EXTERNAL, label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Store sequence in database", jsxRuntime.jsx(material.Tooltip, { title: "Enables users to edit the genomic sequence, but comes with performance impacts. Use with care.", placement: "top-start", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "fasta-is-gzip-checkbox", control: jsxRuntime.jsx(material.Checkbox, { checked: !sequenceIsEditable || fastaGzipChecked, onChange: () => {
922
+ if (sequenceIsEditable) {
923
+ setFastaGzipChecked(!fastaGzipChecked);
924
+ }
925
+ else {
926
+ setFastaGzipChecked(true);
927
+ }
928
+ }, disabled: !sequenceIsEditable }), label: "FASTA is gzip compressed" }), fileType === FileType.BGZIP_FASTA ||
929
+ fileType === FileType.GFF3 ? (jsxRuntime.jsx(material.Table, { size: "small", sx: { mt: 2 }, children: jsxRuntime.jsxs(material.TableBody, { children: [jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: [jsxRuntime.jsx("span", { children: "FASTA" }), jsxRuntime.jsx(material.Tooltip, { title: 'Unless "Store sequence in database" enabled, FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent). Compression is optional for sequences stored in the database.', children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx("input", { "data-testid": "fasta-input-file", type: "file", onChange: (e) => {
930
+ const file = e.target.files?.item(0);
931
+ if (file) {
932
+ setFastaFile(file);
933
+ if (file.name.endsWith('.gz')) {
934
+ setFastaGzipChecked(true);
935
+ }
936
+ }
937
+ }, disabled: submitted && !errorMessage }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA index (.fai)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx("input", { "data-testid": "fai-input-file", type: "file", onChange: (e) => {
938
+ setFastaIndexFile(e.target.files?.item(0) ?? null);
939
+ }, disabled: (submitted && !errorMessage) || sequenceIsEditable }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA binary index (.gzi)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx("input", { "data-testid": "gzi-input-file", type: "file", onChange: (e) => {
940
+ setFastaGziIndexFile(e.target.files?.item(0) ?? null);
941
+ }, disabled: (submitted && !errorMessage) || sequenceIsEditable }) })] })] }) })) : (jsxRuntime.jsx(material.Table, { size: "small", sx: { mt: 2 }, children: jsxRuntime.jsxs(material.TableBody, { children: [jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: [jsxRuntime.jsx("span", { children: "FASTA" }), jsxRuntime.jsx(material.Tooltip, { title: "Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx(material.TextField, { "data-testid": "fasta-input-url", variant: "outlined", value: fastaUrl, error: !validFastaUrl, onChange: (e) => {
942
+ const { value } = e.target;
943
+ setFastaUrl(value);
944
+ setFastaIndexUrl(value ? `${value}.fai` : '');
945
+ setFastaGziIndexUrl(value ? `${value}.gzi` : '');
946
+ }, disabled: submitted && !errorMessage, slotProps: {
947
+ input: {
948
+ startAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "start", children: jsxRuntime.jsx(LinkIcon, {}) })),
949
+ },
950
+ } }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA index (.fai)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx(material.TextField, { "data-testid": "fai-input-url", variant: "outlined", value: fastaIndexUrl, error: !validFastaIndexUrl, onChange: (e) => {
951
+ setFastaIndexUrl(e.target.value);
952
+ }, disabled: submitted && !errorMessage, slotProps: {
953
+ input: {
954
+ startAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "start", children: jsxRuntime.jsx(LinkIcon, {}) })),
955
+ },
956
+ } }) })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: "FASTA binary index (.gzi)" }), jsxRuntime.jsx(material.TableCell, { style: { borderBottomWidth: 0 }, children: jsxRuntime.jsx(material.TextField, { "data-testid": "gzi-input-url", variant: "outlined", value: fastaGziIndexUrl, error: !validFastaGziIndexUrl, onChange: (e) => {
957
+ setFastaGziIndexUrl(e.target.value);
958
+ }, disabled: submitted && !errorMessage, slotProps: {
959
+ input: {
960
+ startAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "start", children: jsxRuntime.jsx(LinkIcon, {}) })),
961
+ },
962
+ } }) })] })] }) }))] }) })] }), jsxRuntime.jsxs(material.Accordion, { disableGutters: true, elevation: 0, square: true, className: classes.accordion, expanded: expanded === 'panelGffInput', onChange: handleAccordionChange('panelGffInput'), children: [jsxRuntime.jsx(material.AccordionSummary, { className: classes.accordionSummary, expandIcon: expanded === 'panelGffInput' ? (jsxRuntime.jsx(RadioButtonCheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', ml: 5 } })) : (jsxRuntime.jsx(RadioButtonUncheckedIcon, { className: classes.radioIcon, sx: { fontSize: '1.2rem', mr: 5 } })), "aria-controls": "panelGffInputd-content", children: jsxRuntime.jsxs(material.Typography, { component: "span", children: ["GFF3 input", jsxRuntime.jsx(material.Tooltip, { title: "GFF3 must includes FASTA sequences. File can be gzip compressed.", children: jsxRuntime.jsx(InfoIcon, { className: classes.radioIcon, sx: { fontSize: 18 } }) })] }) }), jsxRuntime.jsx(material.AccordionDetails, { className: classes.accordionDetails, children: jsxRuntime.jsxs(material.Box, { style: { marginTop: 20 }, children: [jsxRuntime.jsx("input", { "data-testid": "gff3-input-file", type: "file", disabled: submitted && !errorMessage, onChange: (e) => {
963
+ const file = e.target.files?.item(0);
964
+ if (file) {
965
+ setFastaFile(file);
966
+ setFileType(FileType.GFF3);
967
+ if (file.name.endsWith('.gz')) {
968
+ setGff3GzipChecked(true);
969
+ }
1023
970
  }
1024
- }
1025
- }, disabled: submitted && !errorMessage }))),
1026
- React__default["default"].createElement(material.TableRow, null,
1027
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } }, "FASTA index (.fai)"),
1028
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1029
- React__default["default"].createElement("input", { "data-testid": "fai-input-file", type: "file", onChange: (e) => {
1030
- setFastaIndexFile(e.target.files?.item(0) ?? null);
1031
- }, disabled: (submitted && !errorMessage) || sequenceIsEditable }))),
1032
- React__default["default"].createElement(material.TableRow, null,
1033
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } }, "FASTA binary index (.gzi)"),
1034
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1035
- React__default["default"].createElement("input", { "data-testid": "gzi-input-file", type: "file", onChange: (e) => {
1036
- setFastaGziIndexFile(e.target.files?.item(0) ?? null);
1037
- }, disabled: (submitted && !errorMessage) || sequenceIsEditable })))))) : (React__default["default"].createElement(material.Table, { size: "small", sx: { mt: 2 } },
1038
- React__default["default"].createElement(material.TableBody, null,
1039
- React__default["default"].createElement(material.TableRow, null,
1040
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1041
- React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
1042
- React__default["default"].createElement("span", null, "FASTA"),
1043
- React__default["default"].createElement(material.Tooltip, { title: "Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)" },
1044
- React__default["default"].createElement(material.IconButton, { size: "small" },
1045
- React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } }))))),
1046
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1047
- React__default["default"].createElement(material.TextField, { "data-testid": "fasta-input-url", variant: "outlined", value: fastaUrl, error: !validFastaUrl, onChange: (e) => {
1048
- const { value } = e.target;
1049
- setFastaUrl(value);
1050
- setFastaIndexUrl(value ? `${value}.fai` : '');
1051
- setFastaGziIndexUrl(value ? `${value}.gzi` : '');
1052
- }, disabled: submitted && !errorMessage, slotProps: {
1053
- input: {
1054
- startAdornment: (React__default["default"].createElement(material.InputAdornment, { position: "start" },
1055
- React__default["default"].createElement(LinkIcon__default["default"], null))),
1056
- },
1057
- } }))),
1058
- React__default["default"].createElement(material.TableRow, null,
1059
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } }, "FASTA index (.fai)"),
1060
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1061
- React__default["default"].createElement(material.TextField, { "data-testid": "fai-input-url", variant: "outlined", value: fastaIndexUrl, error: !validFastaIndexUrl, onChange: (e) => {
1062
- setFastaIndexUrl(e.target.value);
1063
- }, disabled: submitted && !errorMessage, slotProps: {
1064
- input: {
1065
- startAdornment: (React__default["default"].createElement(material.InputAdornment, { position: "start" },
1066
- React__default["default"].createElement(LinkIcon__default["default"], null))),
1067
- },
1068
- } }))),
1069
- React__default["default"].createElement(material.TableRow, null,
1070
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } }, "FASTA binary index (.gzi)"),
1071
- React__default["default"].createElement(material.TableCell, { style: { borderBottomWidth: 0 } },
1072
- React__default["default"].createElement(material.TextField, { "data-testid": "gzi-input-url", variant: "outlined", value: fastaGziIndexUrl, error: !validFastaGziIndexUrl, onChange: (e) => {
1073
- setFastaGziIndexUrl(e.target.value);
1074
- }, disabled: submitted && !errorMessage, slotProps: {
1075
- input: {
1076
- startAdornment: (React__default["default"].createElement(material.InputAdornment, { position: "start" },
1077
- React__default["default"].createElement(LinkIcon__default["default"], null))),
1078
- },
1079
- } }))))))))),
1080
- React__default["default"].createElement(material.Accordion, { disableGutters: true, elevation: 0, square: true, className: classes.accordion, expanded: expanded === 'panelGffInput', onChange: handleAccordionChange('panelGffInput') },
1081
- React__default["default"].createElement(material.AccordionSummary, { className: classes.accordionSummary, expandIcon: expanded === 'panelGffInput' ? (React__default["default"].createElement(RadioButtonCheckedIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: '1.2rem', ml: 5 } })) : (React__default["default"].createElement(RadioButtonUncheckedIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: '1.2rem', mr: 5 } })), "aria-controls": "panelGffInputd-content" },
1082
- React__default["default"].createElement(material.Typography, { component: "span" },
1083
- "GFF3 input",
1084
- React__default["default"].createElement(material.Tooltip, { title: "GFF3 must includes FASTA sequences. File can be gzip compressed." },
1085
- React__default["default"].createElement(InfoIcon__default["default"], { className: classes.radioIcon, sx: { fontSize: 18 } })))),
1086
- React__default["default"].createElement(material.AccordionDetails, { className: classes.accordionDetails },
1087
- React__default["default"].createElement(material.Box, { style: { marginTop: 20 } },
1088
- React__default["default"].createElement("input", { "data-testid": "gff3-input-file", type: "file", disabled: submitted && !errorMessage, onChange: (e) => {
1089
- const file = e.target.files?.item(0);
1090
- if (file) {
1091
- setFastaFile(file);
1092
- setFileType(FileType.GFF3);
1093
- if (file.name.endsWith('.gz')) {
1094
- setGff3GzipChecked(true);
1095
- }
1096
- }
1097
- } }),
1098
- React__default["default"].createElement(material.FormGroup, { style: { display: 'grid' } },
1099
- React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: importFeatures, onChange: () => {
1100
- setImportFeatures(!importFeatures);
1101
- }, disabled: submitted && !errorMessage }), label: "Load features from GFF3 file" }),
1102
- React__default["default"].createElement(material.FormControlLabel, { "data-testid": "gff3-is-gzip-checkbox", control: React__default["default"].createElement(material.Checkbox, { checked: gff3GzipChecked, onChange: () => {
1103
- setGff3GzipChecked(!gff3GzipChecked);
1104
- }, disabled: submitted && !errorMessage }), label: "GFF3 is gzip compressed" })))))),
1105
- React__default["default"].createElement(material.DialogActions, null,
1106
- React__default["default"].createElement(material.Button, { disabled: !checkSumbission(validAsm, sequenceIsEditable, fileType, fastaFile, fastaIndexFile, fastaGziIndexFile, validFastaUrl, validFastaIndexUrl, validFastaGziIndexUrl) || submitted, variant: "contained", type: "submit", "data-testid": "submit-button" }, submitted ? 'Submitting...' : 'Submit'),
1107
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
1108
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
1109
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
971
+ } }), jsxRuntime.jsxs(material.FormGroup, { style: { display: 'grid' }, children: [jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: importFeatures, onChange: () => {
972
+ setImportFeatures(!importFeatures);
973
+ }, disabled: submitted && !errorMessage }), label: "Load features from GFF3 file" }), jsxRuntime.jsx(material.FormControlLabel, { label: "Strict parsing", disabled: !importFeatures || (submitted && !errorMessage), control: jsxRuntime.jsx(material.Checkbox, { checked: strict, onChange: (e) => {
974
+ setStrict(e.target.checked);
975
+ } }) }), jsxRuntime.jsx(material.FormHelperText, { children: "Don't import any features if any lines in the GFF3 are unable to be processed" }), jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "gff3-is-gzip-checkbox", control: jsxRuntime.jsx(material.Checkbox, { checked: gff3GzipChecked, onChange: () => {
976
+ setGff3GzipChecked(!gff3GzipChecked);
977
+ }, disabled: submitted && !errorMessage }), label: "GFF3 is gzip compressed" })] })] }) })] })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !checkSumbission(validAsm, sequenceIsEditable, fileType, fastaFile, fastaIndexFile, fastaGziIndexFile, validFastaUrl, validFastaIndexUrl, validFastaGziIndexUrl) || submitted, variant: "contained", type: "submit", "data-testid": "submit-button", children: submitted ? 'Submitting...' : 'Submit' }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
1110
978
  }
1111
979
 
1112
980
  const columns$1 = [
@@ -1134,7 +1002,7 @@ function AddAssemblyAliases({ changeManager, handleClose, session, }) {
1134
1002
  aliases: assembly.aliases.join(', '),
1135
1003
  };
1136
1004
  });
1137
- const [errorMessage, setErrorMessage] = React__default["default"].useState('');
1005
+ const [errorMessage, setErrorMessage] = React.useState('');
1138
1006
  const processRowUpdate = (newRow, _oldRow) => {
1139
1007
  const change = new shared.AddAssemblyAliasesChange({
1140
1008
  typeName: 'AddAssemblyAliasesChange',
@@ -1147,18 +1015,13 @@ function AddAssemblyAliases({ changeManager, handleClose, session, }) {
1147
1015
  handleClose();
1148
1016
  return newRow;
1149
1017
  };
1150
- return (React__default["default"].createElement(Dialog, { open: true, title: "Add assembly aliases", handleClose: handleClose, maxWidth: 'sm', "data-testid": "add-assembly-alias", fullWidth: true },
1151
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
1152
- React__default["default"].createElement(material.Box, { sx: { height: 400, width: '100%' } },
1153
- React__default["default"].createElement(xDataGrid.DataGrid, { rows: rows, columns: columns$1, initialState: {
1154
- pagination: {
1155
- paginationModel: {
1156
- pageSize: 5,
1018
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add assembly aliases", handleClose: handleClose, maxWidth: 'sm', "data-testid": "add-assembly-alias", fullWidth: true, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.Box, { sx: { height: 400, width: '100%' }, children: jsxRuntime.jsx(xDataGrid.DataGrid, { rows: rows, columns: columns$1, initialState: {
1019
+ pagination: {
1020
+ paginationModel: {
1021
+ pageSize: 5,
1022
+ },
1157
1023
  },
1158
- },
1159
- }, pageSizeOptions: [5], processRowUpdate: processRowUpdate, disableRowSelectionOnClick: true }))),
1160
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
1161
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
1024
+ }, pageSizeOptions: [5], processRowUpdate: processRowUpdate, disableRowSelectionOnClick: true }) }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
1162
1025
  }
1163
1026
 
1164
1027
  /** set of words that should be ignored by fulltext indexing */
@@ -1342,6 +1205,8 @@ function expandPrefixes(uri, prefixes) {
1342
1205
  }
1343
1206
 
1344
1207
  /* eslint-disable @typescript-eslint/no-unnecessary-condition */
1208
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
1209
+ // jsonpath triggers this rule for some reason. import { query } from 'jsonpath' does not work
1345
1210
  /** special value of jsonPath that gets the IRI (that is, ID) of the node with the configured prefixes applied */
1346
1211
  const PREFIXED_ID_PATH = '$PREFIXED_ID';
1347
1212
  /** small wrapper for jsonpath.query that intercepts requests for the special prefixed ID path */
@@ -1349,7 +1214,15 @@ function jsonPathQuery(node, path, prefixes) {
1349
1214
  if (path === PREFIXED_ID_PATH) {
1350
1215
  return [applyPrefixes(node.id, prefixes)];
1351
1216
  }
1352
- return jsonpath__default["default"].query(node, path);
1217
+ let response;
1218
+ try {
1219
+ response = jsonpath.query(node, path);
1220
+ }
1221
+ catch {
1222
+ // eslint-disable-next-line unicorn/prefer-structured-clone
1223
+ response = jsonpath.query(JSON.parse(JSON.stringify(node)), path);
1224
+ }
1225
+ return response;
1353
1226
  }
1354
1227
  function wordsInString(str) {
1355
1228
  return str
@@ -1372,7 +1245,7 @@ function* extractStrings(things) {
1372
1245
  yield thing;
1373
1246
  }
1374
1247
  else if (typeof thing === 'object') {
1375
- const members = jsonpath__default["default"].query(thing, '$..*');
1248
+ const members = jsonpath.query(thing, '$..*');
1376
1249
  yield* extractStrings(members);
1377
1250
  }
1378
1251
  }
@@ -1685,11 +1558,12 @@ async function isDatabaseCurrent(db) {
1685
1558
  return false;
1686
1559
  }
1687
1560
  // check that the index paths and prefixes are the same as our current ones
1688
- return (equal__default["default"](this.options.prefixes, meta.storeOptions.prefixes) &&
1689
- equal__default["default"](this.options.textIndexing, meta.storeOptions.textIndexing));
1561
+ return (equal(this.options.prefixes, meta.storeOptions.prefixes) &&
1562
+ equal(this.options.textIndexing, meta.storeOptions.textIndexing));
1690
1563
  }
1691
1564
 
1692
1565
  /* eslint-disable @typescript-eslint/only-throw-error */
1566
+ /* eslint-disable unicorn/no-await-expression-member */
1693
1567
  async function arrayFromAsync(iter) {
1694
1568
  const a = [];
1695
1569
  for await (const i of iter) {
@@ -2185,7 +2059,6 @@ async function fetchValidDescendantTerms(parentFeature, ontologyStore, _signal)
2185
2059
  return subpartTerms;
2186
2060
  }
2187
2061
 
2188
- /* eslint-disable @typescript-eslint/no-unnecessary-condition */
2189
2062
  function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsProp, includeDeprecated, onChange, ontologyName, ontologyVersion, renderInput, session, style, value: valueString, }) {
2190
2063
  const [open, setOpen] = React.useState(false);
2191
2064
  const [termChoices, setTermChoices] = React.useState();
@@ -2216,7 +2089,7 @@ function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsPro
2216
2089
  });
2217
2090
  }
2218
2091
  return () => {
2219
- controller.abort('OntologyTermAutocomplete matcher');
2092
+ controller.abort(new DOMException('Cancel getting current term from ontology store', 'AbortError'));
2220
2093
  };
2221
2094
  }, [session, valueString, filterTerms, ontologyStore, needToLoadCurrentTerm]);
2222
2095
  // effect for loading term autocompletions
@@ -2235,7 +2108,7 @@ function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsPro
2235
2108
  });
2236
2109
  }
2237
2110
  return () => {
2238
- controller.abort('OntologyTermAutocomplete loader');
2111
+ controller.abort(new DOMException('Canceling getting valid terms from ontology store', 'AbortError'));
2239
2112
  };
2240
2113
  }, [
2241
2114
  needToLoadTermChoices,
@@ -2263,14 +2136,14 @@ function OntologyTermAutocomplete({ fetchValidTerms, filterTerms: filterTermsPro
2263
2136
  extraTextFieldParams.error = true;
2264
2137
  extraTextFieldParams.helperText = currentOntologyTermInvalid;
2265
2138
  }
2266
- return (React__default["default"].createElement(material.Autocomplete, { style: style, autoComplete: true, filterSelectedOptions: true, disableClearable: true, selectOnFocus: true, clearOnBlur: true, handleHomeEndKeys: true, freeSolo: true, value: valueString, options: termChoices ?? [], onOpen: () => {
2139
+ return (jsxRuntime.jsx(material.Autocomplete, { style: style, autoComplete: true, filterSelectedOptions: true, disableClearable: true, selectOnFocus: true, clearOnBlur: true, handleHomeEndKeys: true, freeSolo: true, value: valueString, options: termChoices ?? [], onOpen: () => {
2267
2140
  setOpen(true);
2268
2141
  }, onClose: () => {
2269
2142
  setOpen(false);
2270
2143
  },
2271
2144
  // noOptionsText={valueString ? 'No matches' : 'Start typing to search'}
2272
2145
  loading: needToLoadTermChoices, renderInput: renderInput ??
2273
- ((params) => React__default["default"].createElement(material.TextField, { ...params, ...extraTextFieldParams })), getOptionLabel: (option) => {
2146
+ ((params) => jsxRuntime.jsx(material.TextField, { ...params, ...extraTextFieldParams })), getOptionLabel: (option) => {
2274
2147
  if (typeof option === 'string') {
2275
2148
  return option;
2276
2149
  }
@@ -2303,7 +2176,6 @@ async function getValidTerms(ontologyStore, fetchValidTerms, filterTerms, signal
2303
2176
  return filterTerms ? result.filter((element) => filterTerms(element)) : result;
2304
2177
  }
2305
2178
 
2306
- /* eslint-disable @typescript-eslint/unbound-method */
2307
2179
  function AddChildFeature({ changeManager, handleClose, session, sourceAssemblyId, sourceFeature, }) {
2308
2180
  const [end, setEnd] = React.useState(String(sourceFeature.max));
2309
2181
  const [start, setStart] = React.useState(String(sourceFeature.min + 1));
@@ -2321,7 +2193,7 @@ function AddChildFeature({ changeManager, handleClose, session, sourceAssemblyId
2321
2193
  function onSubmit(event) {
2322
2194
  event.preventDefault();
2323
2195
  setErrorMessage('');
2324
- const _id = new ObjectID__default["default"]().toHexString();
2196
+ const _id = new ObjectID().toHexString();
2325
2197
  const change = new shared.AddFeatureChange({
2326
2198
  changedIds: [sourceFeature._id],
2327
2199
  typeName: 'AddFeatureChange',
@@ -2346,25 +2218,15 @@ function AddChildFeature({ changeManager, handleClose, session, sourceAssemblyId
2346
2218
  setType(newType);
2347
2219
  }
2348
2220
  const error = Number(end) <= Number(start);
2349
- return (React__default["default"].createElement(Dialog, { open: true, title: "Add new child feature", handleClose: handleClose, maxWidth: false, "data-testid": "add-feature-dialog" },
2350
- React__default["default"].createElement("form", { onSubmit: onSubmit },
2351
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
2352
- React__default["default"].createElement(material.TextField, { margin: "dense", id: "start", label: "Start", type: "number", fullWidth: true, variant: "outlined", value: start, onChange: (e) => {
2353
- setStart(e.target.value);
2354
- } }),
2355
- React__default["default"].createElement(material.TextField, { margin: "dense", id: "end", label: "End", type: "number", fullWidth: true, variant: "outlined", value: end, onChange: (e) => {
2356
- setEnd(e.target.value);
2357
- }, error: error, helperText: error ? '"End" must be greater than "Start"' : null }),
2358
- React__default["default"].createElement(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTerms.bind(null, sourceFeature), renderInput: (params) => (React__default["default"].createElement(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true, error: Boolean(typeWarningText), helperText: typeWarningText })), onChange: (oldValue, newValue) => {
2359
- if (newValue) {
2360
- handleChangeType(newValue);
2361
- }
2362
- } })),
2363
- React__default["default"].createElement(material.DialogActions, null,
2364
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: error || !(start && end && type) }, "Submit"),
2365
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
2366
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
2367
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
2221
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add new child feature", handleClose: handleClose, maxWidth: false, "data-testid": "add-feature-dialog", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.TextField, { margin: "dense", id: "start", label: "Start", type: "number", fullWidth: true, variant: "outlined", value: start, onChange: (e) => {
2222
+ setStart(e.target.value);
2223
+ } }), jsxRuntime.jsx(material.TextField, { margin: "dense", id: "end", label: "End", type: "number", fullWidth: true, variant: "outlined", value: end, onChange: (e) => {
2224
+ setEnd(e.target.value);
2225
+ }, error: error, helperText: error ? '"End" must be greater than "Start"' : null }), jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTerms.bind(null, sourceFeature), renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true, error: Boolean(typeWarningText), helperText: typeWarningText })), onChange: (oldValue, newValue) => {
2226
+ if (newValue) {
2227
+ handleChangeType(newValue);
2228
+ }
2229
+ } })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: error || !(start && end && type), children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
2368
2230
  }
2369
2231
 
2370
2232
  class BackendDriver {
@@ -2375,6 +2237,8 @@ class BackendDriver {
2375
2237
  }
2376
2238
 
2377
2239
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2240
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
2241
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2378
2242
  class ChangeManager {
2379
2243
  dataStore;
2380
2244
  constructor(dataStore) {
@@ -2404,7 +2268,7 @@ class ChangeManager {
2404
2268
  statusMessage: 'Pre-validating',
2405
2269
  progressPct: 0,
2406
2270
  cancelCallback: () => {
2407
- controller.abort('ChangeManager');
2271
+ controller.abort(new DOMException(`Cancelling change "${change.typeName}"`, 'AbortError'));
2408
2272
  },
2409
2273
  };
2410
2274
  if (updateJobsManager) {
@@ -2519,6 +2383,11 @@ class ChangeManager {
2519
2383
  }
2520
2384
 
2521
2385
  /* eslint-disable @typescript-eslint/no-base-to-string */
2386
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2387
+ /* eslint-disable @typescript-eslint/no-unsafe-return */
2388
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
2389
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
2390
+ /* eslint-disable @typescript-eslint/no-unnecessary-condition */
2522
2391
  class CollaborationServerDriver extends BackendDriver {
2523
2392
  inFlight = new Map();
2524
2393
  refSeqMaps = new Map();
@@ -3016,7 +2885,6 @@ class DesktopFileDriver extends BackendDriver {
3016
2885
  }
3017
2886
  }
3018
2887
 
3019
- /* eslint-disable @typescript-eslint/unbound-method */
3020
2888
  var NewFeature;
3021
2889
  (function (NewFeature) {
3022
2890
  NewFeature["GENE_AND_SUBFEATURES"] = "GENE_AND_SUBFEATURES";
@@ -3025,7 +2893,7 @@ var NewFeature;
3025
2893
  })(NewFeature || (NewFeature = {}));
3026
2894
  function makeCodingMrna(refSeqId, strand, min, max) {
3027
2895
  const cds = {
3028
- _id: new ObjectID__default["default"]().toHexString(),
2896
+ _id: new ObjectID().toHexString(),
3029
2897
  refSeq: refSeqId,
3030
2898
  type: 'CDS',
3031
2899
  min,
@@ -3033,7 +2901,7 @@ function makeCodingMrna(refSeqId, strand, min, max) {
3033
2901
  strand,
3034
2902
  };
3035
2903
  const exon = {
3036
- _id: new ObjectID__default["default"]().toHexString(),
2904
+ _id: new ObjectID().toHexString(),
3037
2905
  refSeq: refSeqId,
3038
2906
  type: 'exon',
3039
2907
  min,
@@ -3044,7 +2912,7 @@ function makeCodingMrna(refSeqId, strand, min, max) {
3044
2912
  children[cds._id] = cds;
3045
2913
  children[exon._id] = exon;
3046
2914
  const mRNA = {
3047
- _id: new ObjectID__default["default"]().toHexString(),
2915
+ _id: new ObjectID().toHexString(),
3048
2916
  refSeq: refSeqId,
3049
2917
  type: 'mRNA',
3050
2918
  min,
@@ -3082,7 +2950,7 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
3082
2950
  const mRNA = makeCodingMrna(refSeqId, strand, Number(start) - 1, Number(end));
3083
2951
  const children = {};
3084
2952
  children[mRNA._id] = mRNA;
3085
- const id = new ObjectID__default["default"]().toHexString();
2953
+ const id = new ObjectID().toHexString();
3086
2954
  const change = new shared.AddFeatureChange({
3087
2955
  changedIds: [id],
3088
2956
  typeName: 'AddFeatureChange',
@@ -3121,7 +2989,7 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
3121
2989
  setErrorMessage('No type selected');
3122
2990
  return;
3123
2991
  }
3124
- const id = new ObjectID__default["default"]().toHexString();
2992
+ const id = new ObjectID().toHexString();
3125
2993
  const change = new shared.AddFeatureChange({
3126
2994
  changedIds: [id],
3127
2995
  typeName: 'AddFeatureChange',
@@ -3175,45 +3043,16 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
3175
3043
  (!strand && type === NewFeature.TRANSCRIPT_AND_SUBFEATURES)) {
3176
3044
  submitDisabled = true;
3177
3045
  }
3178
- return (React__default["default"].createElement(Dialog, { open: true, title: "Add new feature", handleClose: handleClose, maxWidth: false, "data-testid": "add-feature-dialog" },
3179
- React__default["default"].createElement("form", { onSubmit: onSubmit, "data-testid": "submit-form" },
3180
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
3181
- React__default["default"].createElement(material.TextField, { margin: "dense", id: "start", label: "Start", type: "number", fullWidth: true, variant: "outlined", value: Number(start), onChange: (e) => {
3182
- setStart(e.target.value);
3183
- } }),
3184
- React__default["default"].createElement(material.TextField, { margin: "dense", id: "end", label: "End", type: "number", fullWidth: true, variant: "outlined", value: end, onChange: (e) => {
3185
- setEnd(e.target.value);
3186
- }, error: error, helperText: error ? '"End" must be greater than "Start"' : null }),
3187
- React__default["default"].createElement(material.FormControl, null,
3188
- React__default["default"].createElement(material.InputLabel, { id: "demo-simple-select-label" }, "Strand"),
3189
- React__default["default"].createElement(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Strand", value: strand?.toString(), onChange: handleChangeStrand },
3190
- React__default["default"].createElement(material.MenuItem, { value: undefined }),
3191
- React__default["default"].createElement(material.MenuItem, { value: 1 }, "+"),
3192
- React__default["default"].createElement(material.MenuItem, { value: -1 }, "-"))),
3193
- React__default["default"].createElement(material.FormControl, { style: { marginTop: 20 } },
3194
- React__default["default"].createElement(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", defaultValue: NewFeature.GENE_AND_SUBFEATURES, name: "radio-buttons-group", value: type, onChange: handleTypeChange },
3195
- React__default["default"].createElement(material.FormControlLabel, { value: NewFeature.GENE_AND_SUBFEATURES, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
3196
- "Add gene and sub-features",
3197
- React__default["default"].createElement(material.Tooltip, { title: "This is a shortcut to create a gene with a single mRNA, exon, and CDS" },
3198
- React__default["default"].createElement(material.IconButton, { size: "small" },
3199
- React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } })))) }),
3200
- React__default["default"].createElement(material.FormControlLabel, { value: NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" },
3201
- "Add transcript and sub-features",
3202
- React__default["default"].createElement(material.Tooltip, { title: "This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene" },
3203
- React__default["default"].createElement(material.IconButton, { size: "small" },
3204
- React__default["default"].createElement(InfoIcon__default["default"], { sx: { fontSize: 18 } })))) }),
3205
- React__default["default"].createElement(material.FormControlLabel, { value: NewFeature.CUSTOM, checked: type !== NewFeature.GENE_AND_SUBFEATURES &&
3206
- type !== NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: React__default["default"].createElement(material.Radio, null), label: "Add feature with a sequence ontology type" }))),
3207
- type === NewFeature.CUSTOM ? (React__default["default"].createElement(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: customType, filterTerms: isOntologyClass, renderInput: (params) => (React__default["default"].createElement(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true })), onChange: (_oldValue, newValue) => {
3208
- if (newValue) {
3209
- handleChangeOntologyType(newValue);
3210
- }
3211
- } })) : null),
3212
- React__default["default"].createElement(material.DialogActions, null,
3213
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: submitDisabled }, "Submit"),
3214
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
3215
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
3216
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3046
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add new feature", handleClose: handleClose, maxWidth: false, "data-testid": "add-feature-dialog", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, "data-testid": "submit-form", children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.TextField, { margin: "dense", id: "start", label: "Start", type: "number", fullWidth: true, variant: "outlined", value: Number(start), onChange: (e) => {
3047
+ setStart(e.target.value);
3048
+ } }), jsxRuntime.jsx(material.TextField, { margin: "dense", id: "end", label: "End", type: "number", fullWidth: true, variant: "outlined", value: end, onChange: (e) => {
3049
+ setEnd(e.target.value);
3050
+ }, error: error, helperText: error ? '"End" must be greater than "Start"' : null }), jsxRuntime.jsxs(material.FormControl, { children: [jsxRuntime.jsx(material.InputLabel, { id: "demo-simple-select-label", children: "Strand" }), jsxRuntime.jsxs(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Strand", value: strand?.toString(), onChange: handleChangeStrand, children: [jsxRuntime.jsx(material.MenuItem, { value: undefined }), jsxRuntime.jsx(material.MenuItem, { value: 1, children: "+" }), jsxRuntime.jsx(material.MenuItem, { value: -1, children: "-" })] })] }), jsxRuntime.jsx(material.FormControl, { style: { marginTop: 20 }, children: jsxRuntime.jsxs(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", defaultValue: NewFeature.GENE_AND_SUBFEATURES, name: "radio-buttons-group", value: type, onChange: handleTypeChange, children: [jsxRuntime.jsx(material.FormControlLabel, { value: NewFeature.GENE_AND_SUBFEATURES, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Add gene and sub-features", jsxRuntime.jsx(material.Tooltip, { title: "This is a shortcut to create a gene with a single mRNA, exon, and CDS", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { value: NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsxs(material.Box, { display: "flex", alignItems: "center", children: ["Add transcript and sub-features", jsxRuntime.jsx(material.Tooltip, { title: "This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene", children: jsxRuntime.jsx(material.IconButton, { size: "small", children: jsxRuntime.jsx(InfoIcon, { sx: { fontSize: 18 } }) }) })] }) }), jsxRuntime.jsx(material.FormControlLabel, { value: NewFeature.CUSTOM, checked: type !== NewFeature.GENE_AND_SUBFEATURES &&
3051
+ type !== NewFeature.TRANSCRIPT_AND_SUBFEATURES, control: jsxRuntime.jsx(material.Radio, {}), label: "Add feature with a sequence ontology type" })] }) }), type === NewFeature.CUSTOM ? (jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: customType, filterTerms: isOntologyClass, renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true })), onChange: (_oldValue, newValue) => {
3052
+ if (newValue) {
3053
+ handleChangeOntologyType(newValue);
3054
+ }
3055
+ } })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: submitDisabled, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
3217
3056
  }
3218
3057
 
3219
3058
  /**
@@ -3224,7 +3063,7 @@ function AddFeature({ changeManager, handleClose, region, session, }) {
3224
3063
  function generateNewIds(
3225
3064
  // feature: AnnotationFeatureSnapshot,
3226
3065
  feature, featureIds) {
3227
- const newId = new ObjectID__default["default"]().toHexString();
3066
+ const newId = new ObjectID().toHexString();
3228
3067
  featureIds.push(newId);
3229
3068
  const children = {};
3230
3069
  if (feature.children) {
@@ -3379,27 +3218,13 @@ function CopyFeature({ changeManager, handleClose, session, sourceAssemblyId, so
3379
3218
  _id: id,
3380
3219
  };
3381
3220
  }
3382
- return (React__default["default"].createElement(Dialog, { open: true, title: "Copy features and annotations", handleClose: handleClose, maxWidth: false, "data-testid": "copy-feature" },
3383
- React__default["default"].createElement("form", { onSubmit: onSubmit },
3384
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
3385
- React__default["default"].createElement(material.DialogContentText, null, "Target assembly"),
3386
- React__default["default"].createElement(material.Select, { labelId: "label", value: selectedAssemblyId, onChange: handleChangeAssembly }, assemblies
3387
- .filter((option) => option.name !== sourceAssemblyId)
3388
- .map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, configuration.readConfObject(option, 'displayName'))))),
3389
- React__default["default"].createElement(material.DialogContentText, null, "Target reference sequence"),
3390
- React__default["default"].createElement(material.Select, { labelId: "label", value: selectedRefSeqId, onChange: handleChangeRefSeq }, refNames.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option._id, value: option._id }, option.name)))),
3391
- React__default["default"].createElement(material.DialogContentText, null, "Start position in target reference sequence"),
3392
- React__default["default"].createElement(material.TextField, { margin: "dense", type: "number", fullWidth: true, variant: "outlined", value: start, onChange: (e) => {
3393
- setStart(Number(e.target.value));
3394
- } })),
3395
- React__default["default"].createElement(material.DialogActions, null,
3396
- React__default["default"].createElement(material.Button, { disabled: !selectedAssemblyId || !selectedRefSeqId || !start, variant: "contained", type: "submit" }, "Submit"),
3397
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
3398
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
3399
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3221
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Copy features and annotations", handleClose: handleClose, maxWidth: false, "data-testid": "copy-feature", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Target assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssemblyId, onChange: handleChangeAssembly, children: assemblies
3222
+ .filter((option) => option.name !== sourceAssemblyId)
3223
+ .map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: configuration.readConfObject(option, 'displayName') }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Target reference sequence" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedRefSeqId, onChange: handleChangeRefSeq, children: refNames.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option._id, children: option.name }, option._id))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Start position in target reference sequence" }), jsxRuntime.jsx(material.TextField, { margin: "dense", type: "number", fullWidth: true, variant: "outlined", value: start, onChange: (e) => {
3224
+ setStart(Number(e.target.value));
3225
+ } })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedAssemblyId || !selectedRefSeqId || !start, variant: "contained", type: "submit", children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
3400
3226
  }
3401
3227
 
3402
- /* eslint-disable @typescript-eslint/unbound-method */
3403
3228
  function DeleteAssembly({ changeManager, handleClose, session, }) {
3404
3229
  const { internetAccounts } = mobxStateTree.getRoot(session);
3405
3230
  const [errorMessage, setErrorMessage] = React.useState('');
@@ -3443,28 +3268,11 @@ function DeleteAssembly({ changeManager, handleClose, session, }) {
3443
3268
  handleClose();
3444
3269
  event.preventDefault();
3445
3270
  }
3446
- return (React__default["default"].createElement(Dialog, { open: true, title: "Delete Assembly", handleClose: handleClose, maxWidth: false, "data-testid": "delete-assembly" },
3447
- React__default["default"].createElement("form", { onSubmit: onSubmit },
3448
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
3449
- apolloInternetAccounts.length > 1 ? (React__default["default"].createElement(React__default["default"].Fragment, null,
3450
- React__default["default"].createElement(material.DialogContentText, null, "Select account"),
3451
- React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
3452
- React__default["default"].createElement(material.DialogContentText, null, "Select assembly"),
3453
- React__default["default"].createElement(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0 }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName)))),
3454
- React__default["default"].createElement(material.DialogContentText, null,
3455
- React__default["default"].createElement("strong", { style: { color: 'red' } }, "NOTE: All assembly data will be deleted and this operation cannot be undone!")),
3456
- React__default["default"].createElement(material.FormGroup, null,
3457
- React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: confirmDelete, onChange: () => {
3458
- setconfirmDelete(!confirmDelete);
3459
- } }), label: "I understand that all assembly data will be deleted" }))),
3460
- React__default["default"].createElement(material.DialogActions, null,
3461
- React__default["default"].createElement(material.Button, { disabled: !selectedAssembly || !confirmDelete, variant: "contained", type: "submit" }, "Delete"),
3462
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
3463
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
3464
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3271
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Delete Assembly", handleClose: handleClose, maxWidth: false, "data-testid": "delete-assembly", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: jsxRuntime.jsx("strong", { style: { color: 'red' }, children: "NOTE: All assembly data will be deleted and this operation cannot be undone!" }) }), jsxRuntime.jsx(material.FormGroup, { children: jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: confirmDelete, onChange: () => {
3272
+ setconfirmDelete(!confirmDelete);
3273
+ } }), label: "I understand that all assembly data will be deleted" }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedAssembly || !confirmDelete, variant: "contained", type: "submit", children: "Delete" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
3465
3274
  }
3466
3275
 
3467
- /* eslint-disable @typescript-eslint/unbound-method */
3468
3276
  function lumpLocationChanges(changes, assembly) {
3469
3277
  if (changes.length === 0) {
3470
3278
  return;
@@ -3772,17 +3580,9 @@ function DeleteFeature({ changeManager, handleClose, selectedFeature, session, s
3772
3580
  handleClose();
3773
3581
  event.preventDefault();
3774
3582
  }
3775
- return (React__default["default"].createElement(Dialog, { open: true, title: "Delete feature", handleClose: handleClose, maxWidth: false, "data-testid": "delete-feature" },
3776
- React__default["default"].createElement("form", { onSubmit: (event) => {
3777
- void onSubmit(event);
3778
- } },
3779
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
3780
- React__default["default"].createElement(material.DialogContentText, null, "Are you sure you want to delete the selected feature?")),
3781
- React__default["default"].createElement(material.DialogActions, null,
3782
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit" }, "Yes"),
3783
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
3784
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
3785
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3583
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Delete feature", handleClose: handleClose, maxWidth: false, "data-testid": "delete-feature", children: [jsxRuntime.jsxs("form", { onSubmit: (event) => {
3584
+ void onSubmit(event);
3585
+ }, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.DialogContentText, { children: "Are you sure you want to delete the selected feature?" }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", children: "Yes" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
3786
3586
  }
3787
3587
 
3788
3588
  function DownloadGFF3({ handleClose, session }) {
@@ -3892,24 +3692,11 @@ function DownloadGFF3({ handleClose, session }) {
3892
3692
  const gff3Blob = new Blob([gff3], { type: 'text/plain;charset=utf-8' });
3893
3693
  fileSaver.saveAs(gff3Blob, `${selectedAssembly.displayName ?? selectedAssembly.name}.gff3`);
3894
3694
  }
3895
- return (React__default["default"].createElement(Dialog, { open: true, title: "Export GFF3", handleClose: handleClose, maxWidth: false, "data-testid": "download-gff3" },
3896
- React__default["default"].createElement("form", { onSubmit: onSubmit },
3897
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
3898
- React__default["default"].createElement(material.DialogContentText, null, "Select assembly"),
3899
- React__default["default"].createElement(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0 }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName ?? option.name)))),
3900
- React__default["default"].createElement(material.DialogContentText, null, "Select assembly to export to GFF3"),
3901
- React__default["default"].createElement(material.FormGroup, null,
3902
- React__default["default"].createElement(material.FormControlLabel, { "data-testid": "include-fasta-checkbox", control: React__default["default"].createElement(material.Checkbox, { checked: includeFASTA, onChange: () => {
3903
- setincludeFASTA(!includeFASTA);
3904
- } }), label: "Include fasta sequence in GFF output" }))),
3905
- React__default["default"].createElement(material.DialogActions, null,
3906
- React__default["default"].createElement(material.Button, { disabled: !selectedAssembly, variant: "contained", type: "submit" }, "Download"),
3907
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
3908
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
3909
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3910
- }
3911
-
3912
- /* eslint-disable @typescript-eslint/use-unknown-in-catch-callback-variable */
3695
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Export GFF3", handleClose: handleClose, maxWidth: false, "data-testid": "download-gff3", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName ?? option.name }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly to export to GFF3" }), jsxRuntime.jsx(material.FormGroup, { children: jsxRuntime.jsx(material.FormControlLabel, { "data-testid": "include-fasta-checkbox", control: jsxRuntime.jsx(material.Checkbox, { checked: includeFASTA, onChange: () => {
3696
+ setincludeFASTA(!includeFASTA);
3697
+ } }), label: "Include fasta sequence in GFF output" }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedAssembly, variant: "contained", type: "submit", children: "Download" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
3698
+ }
3699
+
3913
3700
  function ImportFeatures({ changeManager, handleClose, session, }) {
3914
3701
  const { apolloDataStore } = session;
3915
3702
  const [file, setFile] = React.useState();
@@ -3919,6 +3706,7 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
3919
3706
  // default is -1, submit button should be disabled until count is set
3920
3707
  const [featuresCount, setFeaturesCount] = React.useState();
3921
3708
  const [deleteFeatures, setDeleteFeatures] = React.useState(false);
3709
+ const [strict, setStrict] = React.useState(true);
3922
3710
  const [loading, setLoading] = React.useState(false);
3923
3711
  const { collaborationServerDriver, getInternetAccount } = apolloDataStore;
3924
3712
  const assemblies = collaborationServerDriver.getAssemblies();
@@ -3930,6 +3718,9 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
3930
3718
  function handleDeleteFeatures(e) {
3931
3719
  setDeleteFeatures(e.target.checked);
3932
3720
  }
3721
+ function handleSetStrict(e) {
3722
+ setStrict(e.target.checked);
3723
+ }
3933
3724
  // fetch and set features count for selected assembly
3934
3725
  React.useEffect(() => {
3935
3726
  if (!selectedAssembly) {
@@ -4019,7 +3810,7 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
4019
3810
  statusMessage: 'Uploading file, this may take awhile',
4020
3811
  progressPct: 0,
4021
3812
  cancelCallback: () => {
4022
- controller.abort('ImportFeatures');
3813
+ controller.abort(new DOMException(`Canceling importing of features to ${selectedAssembly.displayName}`, 'AbortError'));
4023
3814
  jobsManager.abortJob(job.name);
4024
3815
  },
4025
3816
  };
@@ -4046,35 +3837,16 @@ function ImportFeatures({ changeManager, handleClose, session, }) {
4046
3837
  typeName: 'AddFeaturesFromFileChange',
4047
3838
  assembly: selectedAssembly.name,
4048
3839
  fileId,
3840
+ parseOptions: { strict },
4049
3841
  deleteExistingFeatures: deleteFeatures,
4050
3842
  });
4051
3843
  jobsManager.done(job);
4052
3844
  await changeManager.submit(change, { updateJobsManager: true });
4053
3845
  }
4054
- return (React__default["default"].createElement(Dialog, { open: true, title: "Import Features from GFF3 file", handleClose: handleClose, maxWidth: false, "data-testid": "import-features-dialog" },
4055
- loading ? React__default["default"].createElement(LinearProgress__default["default"], null) : null,
4056
- React__default["default"].createElement("form", { onSubmit: onSubmit },
4057
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
4058
- React__default["default"].createElement(material.DialogContentText, null, "Select assembly"),
4059
- React__default["default"].createElement(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: submitted && !errorMessage }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName ?? option.name))))),
4060
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
4061
- React__default["default"].createElement(material.DialogContentText, null, "Upload GFF3 to load features"),
4062
- React__default["default"].createElement("input", { type: "file", onChange: handleChangeFile, disabled: submitted && !errorMessage })),
4063
- featuresCount && featuresCount > 0 ? (React__default["default"].createElement(material.DialogContent, null,
4064
- React__default["default"].createElement(material.DialogContentText, null,
4065
- "This assembly already has ",
4066
- featuresCount,
4067
- " features, would you like to delete the existing features before importing new ones?"),
4068
- React__default["default"].createElement(FormControlLabel__default["default"], { label: "Yes, delete existing features", disabled: submitted && !errorMessage, control: React__default["default"].createElement(Checkbox__default["default"], { checked: deleteFeatures, onChange: handleDeleteFeatures, slotProps: { input: { 'aria-label': 'controlled' } }, color: "warning" }) }))) : null,
4069
- React__default["default"].createElement(material.DialogActions, null,
4070
- React__default["default"].createElement(material.Button, { disabled: !(selectedAssembly && file && featuresCount !== undefined) ||
4071
- submitted, variant: "contained", type: "submit" }, submitted ? 'Submitting...' : 'Submit'),
4072
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close"))),
4073
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4074
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3846
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Import Features from GFF3 file", handleClose: handleClose, maxWidth: false, "data-testid": "import-features-dialog", children: [loading ? jsxRuntime.jsx(material.LinearProgress, {}) : null, jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: submitted && !errorMessage, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName ?? option.name }, option.name))) }), jsxRuntime.jsx(material.DialogContentText, { children: "Upload GFF3 to load features" }), jsxRuntime.jsx("input", { type: "file", onChange: handleChangeFile, disabled: submitted && !errorMessage }), jsxRuntime.jsx(material.FormControlLabel, { label: "Strict parsing", disabled: submitted && !errorMessage, control: jsxRuntime.jsx(material.Checkbox, { checked: strict, onChange: handleSetStrict }) }), jsxRuntime.jsx(material.FormHelperText, { children: "Don't import any features if any lines in the GFF3 are unable to be processed" }), featuresCount && featuresCount > 0 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.FormControlLabel, { label: "Delete existing features", disabled: submitted && !errorMessage, control: jsxRuntime.jsx(material.Checkbox, { checked: deleteFeatures, onChange: handleDeleteFeatures, slotProps: { input: { 'aria-label': 'controlled' } }, color: "warning" }) }), jsxRuntime.jsxs(material.FormHelperText, { children: ["This assembly has ", featuresCount, " features that will be deleted"] })] })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !(selectedAssembly && file && featuresCount !== undefined) ||
3847
+ submitted, variant: "contained", type: "submit", children: submitted ? 'Submitting...' : 'Submit' }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4075
3848
  }
4076
3849
 
4077
- /* eslint-disable @typescript-eslint/unbound-method */
4078
3850
  function LogOut({ handleClose, session }) {
4079
3851
  const { internetAccounts } = mobxStateTree.getRoot(session);
4080
3852
  const [errorMessage, setErrorMessage] = React.useState('');
@@ -4096,18 +3868,7 @@ function LogOut({ handleClose, session }) {
4096
3868
  selectedInternetAccount.removeToken();
4097
3869
  globalThis.location.reload();
4098
3870
  }
4099
- return (React__default["default"].createElement(Dialog, { open: true, title: "Log out", handleClose: handleClose, maxWidth: false, "data-testid": "log-out" },
4100
- React__default["default"].createElement("form", { onSubmit: onSubmit },
4101
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
4102
- apolloInternetAccounts.length > 1 ? (React__default["default"].createElement(React__default["default"].Fragment, null,
4103
- React__default["default"].createElement(material.DialogContentText, null, "Select account"),
4104
- React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
4105
- React__default["default"].createElement(material.DialogContentText, null, "Are you sure you want to log out?")),
4106
- React__default["default"].createElement(material.DialogActions, null,
4107
- React__default["default"].createElement(material.Button, { disabled: !selectedInternetAccount, variant: "contained", type: "submit" }, "Log Out"),
4108
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
4109
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4110
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3871
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Log out", handleClose: handleClose, maxWidth: false, "data-testid": "log-out", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx(material.DialogContentText, { children: "Are you sure you want to log out?" })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: !selectedInternetAccount, variant: "contained", type: "submit", children: "Log Out" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4111
3872
  }
4112
3873
 
4113
3874
  function ManageChecks({ handleClose, session }) {
@@ -4224,37 +3985,18 @@ function ManageChecks({ handleClose, session }) {
4224
3985
  }
4225
3986
  setSelectedInternetAccount(newlySelectedInternetAccount);
4226
3987
  }
4227
- return (React__default["default"].createElement(Dialog, { open: true, title: "Manage Checks", handleClose: handleClose, "data-testid": "manage-checks" },
4228
- React__default["default"].createElement("form", { onSubmit: onSubmit },
4229
- React__default["default"].createElement(material.DialogContent, null,
4230
- apolloInternetAccounts.length > 1 ? (React__default["default"].createElement(React__default["default"].Fragment, null,
4231
- React__default["default"].createElement(material.DialogContentText, null, "Select account"),
4232
- React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
4233
- React__default["default"].createElement(material.DialogContentText, null, "Select assembly"),
4234
- React__default["default"].createElement(material.Select, { style: { width: 300 }, labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0 }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName)))),
4235
- React__default["default"].createElement("br", null),
4236
- React__default["default"].createElement("br", null),
4237
- React__default["default"].createElement(material.TableContainer, { component: material.Paper },
4238
- React__default["default"].createElement(material.Table, null,
4239
- React__default["default"].createElement(material.TableHead, null,
4240
- React__default["default"].createElement(material.TableRow, null,
4241
- React__default["default"].createElement(material.TableCell, null, "Check name"),
4242
- React__default["default"].createElement(material.TableCell, null, "Use check"))),
4243
- React__default["default"].createElement(material.TableBody, null, checks.map((check) => (React__default["default"].createElement(material.TableRow, { key: check._id },
4244
- React__default["default"].createElement(material.TableCell, null, check.name),
4245
- React__default["default"].createElement(material.TableCell, null,
4246
- React__default["default"].createElement(material.Checkbox, { value: check._id, checked: selectedChecks.includes(check._id), onChange: handleCheckboxChange }))))))))),
4247
- React__default["default"].createElement(material.DialogActions, null,
4248
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit" }, "Submit"),
4249
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
4250
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4251
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
3988
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Manage Checks", handleClose: handleClose, "data-testid": "manage-checks", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: submitted && !errorMessage, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx(material.DialogContentText, { children: "Select assembly" }), jsxRuntime.jsx(material.Select, { style: { width: 300 }, labelId: "label", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) }), jsxRuntime.jsx("br", {}), jsxRuntime.jsx("br", {}), jsxRuntime.jsx(material.TableContainer, { component: material.Paper, children: jsxRuntime.jsxs(material.Table, { children: [jsxRuntime.jsx(material.TableHead, { children: jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { children: "Check name" }), jsxRuntime.jsx(material.TableCell, { children: "Use check" })] }) }), jsxRuntime.jsx(material.TableBody, { children: checks.map((check) => (jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(material.TableCell, { children: check.name }), jsxRuntime.jsx(material.TableCell, { children: jsxRuntime.jsx(material.Checkbox, { value: check._id, checked: selectedChecks.includes(check._id), onChange: handleCheckboxChange }) })] }, check._id))) })] }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
3989
+ }
3990
+
3991
+ function isApolloInternetAccount(internetAccount) {
3992
+ return internetAccount.type === 'ApolloInternetAccount';
4252
3993
  }
4253
3994
 
4254
- /* eslint-disable @typescript-eslint/unbound-method */
4255
3995
  function ManageUsers({ changeManager, handleClose, session, }) {
4256
3996
  const { internetAccounts } = mobxStateTree.getRoot(session);
4257
- const apolloInternetAccounts = internetAccounts.filter((ia) => ia.type === 'ApolloInternetAccount' && ia.role?.includes('admin'));
3997
+ const apolloInternetAccounts = internetAccounts
3998
+ .filter((ia) => isApolloInternetAccount(ia))
3999
+ .filter((ia) => ia.role?.includes('admin'));
4258
4000
  if (apolloInternetAccounts.length === 0) {
4259
4001
  throw new Error('No Apollo internet account found');
4260
4002
  }
@@ -4269,16 +4011,14 @@ function ManageUsers({ changeManager, handleClose, session, }) {
4269
4011
  locationType: 'UriLocation',
4270
4012
  uri,
4271
4013
  });
4272
- if (apolloFetch) {
4273
- const response = await apolloFetch(uri, { method: 'GET' });
4274
- if (!response.ok) {
4275
- const newErrorMessage = await createFetchErrorMessage(response, 'Error when getting user data from db');
4276
- setErrorMessage(newErrorMessage);
4277
- return;
4278
- }
4279
- const data = (await response.json());
4280
- setUsers(data.map((u) => (u.role === undefined ? { ...u, role: '' } : u)));
4014
+ const response = await apolloFetch(uri, { method: 'GET' });
4015
+ if (!response.ok) {
4016
+ const newErrorMessage = await createFetchErrorMessage(response, 'Error when getting user data from db');
4017
+ setErrorMessage(newErrorMessage);
4018
+ return;
4281
4019
  }
4020
+ const data = (await response.json());
4021
+ setUsers(data.map((u) => (u.role === undefined ? { ...u, role: '' } : u)));
4282
4022
  }
4283
4023
  getUsers().catch((error) => {
4284
4024
  setErrorMessage(String(error));
@@ -4334,11 +4074,11 @@ function ManageUsers({ changeManager, handleClose, session, }) {
4334
4074
  field: 'actions',
4335
4075
  type: 'actions',
4336
4076
  getActions: (params) => [
4337
- React__default["default"].createElement(xDataGrid.GridActionsCellItem, { key: `delete-${params.id}`, icon: React__default["default"].createElement(DeleteIcon__default["default"], null), onClick: async () => {
4077
+ jsxRuntime.jsx(xDataGrid.GridActionsCellItem, { icon: jsxRuntime.jsx(DeleteIcon, {}), onClick: async () => {
4338
4078
  if (globalThis.confirm('Delete this user?')) {
4339
4079
  await deleteUser(params.id);
4340
4080
  }
4341
- }, disabled: isCurrentUser(params.id), label: "Delete" }),
4081
+ }, disabled: isCurrentUser(params.id), label: "Delete" }, `delete-${params.id}`),
4342
4082
  ],
4343
4083
  },
4344
4084
  ];
@@ -4360,22 +4100,11 @@ function ManageUsers({ changeManager, handleClose, session, }) {
4360
4100
  });
4361
4101
  return newRow;
4362
4102
  }
4363
- return (React__default["default"].createElement(Dialog, { open: true, fullScreen: true, title: "Manage users", handleClose: handleClose, "data-testid": "manage-users" },
4364
- React__default["default"].createElement(material.DialogContent, null,
4365
- apolloInternetAccounts.length > 1 ? (React__default["default"].createElement(React__default["default"].Fragment, null,
4366
- React__default["default"].createElement(material.DialogContentText, null, "Select account"),
4367
- React__default["default"].createElement(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: !errorMessage }, internetAccounts.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.id, value: option.internetAccountId }, option.name)))))) : null,
4368
- React__default["default"].createElement("div", { style: { height: '100%', width: '100%' } },
4369
- React__default["default"].createElement(xDataGrid.DataGrid, { pagination: true, rows: users, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, getRowHeight: () => 'auto', isCellEditable: (params) => !isCurrentUser(params.id), processRowUpdate: processRowUpdate, onProcessRowUpdateError: (error) => {
4370
- setErrorMessage(String(error));
4371
- } }))),
4372
- React__default["default"].createElement(material.DialogActions, null,
4373
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
4374
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4375
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4103
+ return (jsxRuntime.jsxs(Dialog, { open: true, fullScreen: true, title: "Manage users", handleClose: handleClose, "data-testid": "manage-users", children: [jsxRuntime.jsxs(material.DialogContent, { children: [apolloInternetAccounts.length > 1 ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select account" }), jsxRuntime.jsx(material.Select, { value: selectedInternetAccount.internetAccountId, onChange: handleChangeInternetAccount, disabled: !errorMessage, children: internetAccounts.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.internetAccountId, children: option.name }, option.id))) })] })) : null, jsxRuntime.jsx("div", { style: { height: '100%', width: '100%' }, children: jsxRuntime.jsx(xDataGrid.DataGrid, { pagination: true, rows: users, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, getRowHeight: () => 'auto', isCellEditable: (params) => !isCurrentUser(params.id), processRowUpdate: processRowUpdate, onProcessRowUpdateError: (error) => {
4104
+ setErrorMessage(String(error));
4105
+ } }) })] }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4376
4106
  }
4377
4107
 
4378
- /* eslint-disable @typescript-eslint/unbound-method */
4379
4108
  function getNeighboringExons(referenceExon) {
4380
4109
  const neighboringExons = {};
4381
4110
  const tx = referenceExon.parent;
@@ -4459,20 +4188,10 @@ function MergeExons({ changeManager, handleClose, selectedFeature, setSelectedFe
4459
4188
  setSelectedExon(neighboringExons[value]);
4460
4189
  };
4461
4190
  const neighboringExons = getNeighboringExons(sourceFeature);
4462
- return (React__default["default"].createElement(Dialog, { open: true, title: "Merge exons", handleClose: handleClose, maxWidth: false, "data-testid": "merge-exons" },
4463
- React__default["default"].createElement("form", { onSubmit: onSubmit },
4464
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
4465
- Object.keys(neighboringExons).length === 0
4466
- ? 'There are no neighbouring exons to merge with'
4467
- : 'Merge with exon on:',
4468
- React__default["default"].createElement(material.FormControl, { style: { marginTop: 5 } },
4469
- React__default["default"].createElement(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedExon, onChange: handleTypeChange }, Object.keys(neighboringExons).map((key) => (React__default["default"].createElement(material.FormControlLabel, { value: key, key: key, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" }, makeRadioButtonName$1(key, neighboringExons)) })))))),
4470
- React__default["default"].createElement(material.DialogActions, null,
4471
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(neighboringExons).length === 0 ||
4472
- selectedExon === undefined }, "Submit"),
4473
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
4474
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4475
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4191
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Merge exons", handleClose: handleClose, maxWidth: false, "data-testid": "merge-exons", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [Object.keys(neighboringExons).length === 0
4192
+ ? 'There are no neighbouring exons to merge with'
4193
+ : 'Merge with exon on:', jsxRuntime.jsx(material.FormControl, { style: { marginTop: 5 }, children: jsxRuntime.jsx(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedExon, onChange: handleTypeChange, children: Object.keys(neighboringExons).map((key) => (jsxRuntime.jsx(material.FormControlLabel, { value: key, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsx(material.Box, { display: "flex", alignItems: "center", children: makeRadioButtonName$1(key, neighboringExons) }) }, key))) }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(neighboringExons).length === 0 ||
4194
+ selectedExon === undefined, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4476
4195
  }
4477
4196
 
4478
4197
  function getTranscripts(referenceTranscript, session) {
@@ -4542,23 +4261,12 @@ function MergeTranscripts({ changeManager, handleClose, selectedFeature, session
4542
4261
  const { value } = e.target;
4543
4262
  setSelectedTranscriptId(value);
4544
4263
  };
4545
- return (React__default["default"].createElement(Dialog, { open: true, title: "Merge transcripts", handleClose: handleClose, maxWidth: false, "data-testid": "merge-transcripts" },
4546
- React__default["default"].createElement("form", { onSubmit: onSubmit },
4547
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
4548
- Object.keys(transcripts).length === 0
4549
- ? 'There are no transcripts to merge with'
4550
- : 'Merge with transcript:',
4551
- React__default["default"].createElement(material.FormControl, { style: { marginTop: 5 } },
4552
- React__default["default"].createElement(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedTranscriptId, onChange: handleTypeChange }, Object.keys(transcripts).map((key) => (React__default["default"].createElement(material.FormControlLabel, { value: key, key: key, control: React__default["default"].createElement(material.Radio, null), label: React__default["default"].createElement(material.Box, { display: "flex", alignItems: "center" }, makeRadioButtonName(transcripts[key])) })))))),
4553
- React__default["default"].createElement(material.DialogActions, null,
4554
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(transcripts).length === 0 ||
4555
- selectedTranscriptId === undefined }, "Submit"),
4556
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
4557
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4558
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4264
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Merge transcripts", handleClose: handleClose, maxWidth: false, "data-testid": "merge-transcripts", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [Object.keys(transcripts).length === 0
4265
+ ? 'There are no transcripts to merge with'
4266
+ : 'Merge with transcript:', jsxRuntime.jsx(material.FormControl, { style: { marginTop: 5 }, children: jsxRuntime.jsx(material.RadioGroup, { "aria-labelledby": "demo-radio-buttons-group-label", name: "radio-buttons-group", value: selectedTranscriptId, onChange: handleTypeChange, children: Object.keys(transcripts).map((key) => (jsxRuntime.jsx(material.FormControlLabel, { value: key, control: jsxRuntime.jsx(material.Radio, {}), label: jsxRuntime.jsx(material.Box, { display: "flex", alignItems: "center", children: makeRadioButtonName(transcripts[key]) }) }, key))) }) })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: Object.keys(transcripts).length === 0 ||
4267
+ selectedTranscriptId === undefined, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4559
4268
  }
4560
4269
 
4561
- /* eslint-disable @typescript-eslint/no-unsafe-call */
4562
4270
  function OpenLocalFile({ handleClose, session }) {
4563
4271
  const { apolloDataStore } = session;
4564
4272
  const { addAssembly, addSessionAssembly, assemblyManager, notify } = session;
@@ -4640,26 +4348,10 @@ function OpenLocalFile({ handleClose, session }) {
4640
4348
  function handleAssemblyNameChange(event) {
4641
4349
  setAssemblyName(event.target.value);
4642
4350
  }
4643
- return (React__default["default"].createElement(Dialog, { open: true, title: "Open local GFF3 file", handleClose: handleClose, maxWidth: false, "data-testid": "open-local-file" },
4644
- React__default["default"].createElement("form", { onSubmit: onSubmit },
4645
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
4646
- React__default["default"].createElement(material.FormControl, null,
4647
- React__default["default"].createElement("div", { style: { flexDirection: 'row' } },
4648
- React__default["default"].createElement(material.Button, { variant: "contained", component: "label", style: { marginRight: theme.spacing() } },
4649
- "Choose File",
4650
- React__default["default"].createElement("input", { type: "file", required: true, hidden: true, onChange: handleChangeFile })),
4651
- file ? file.name : 'No file chosen'),
4652
- React__default["default"].createElement(material.FormHelperText, null, "Make sure your GFF3 has an embedded FASTA section")),
4653
- React__default["default"].createElement(material.TextField, { required: true, label: "Assembly name", value: assemblyName, onChange: handleAssemblyNameChange })),
4654
- React__default["default"].createElement(material.DialogActions, null,
4655
- React__default["default"].createElement(material.Button, { disabled: false, variant: "contained", type: "submit" }, submitted ? 'Submitting...' : 'Submit'),
4656
- React__default["default"].createElement(material.Button, { disabled: submitted, variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
4657
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4658
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4351
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Open local GFF3 file", handleClose: handleClose, maxWidth: false, "data-testid": "open-local-file", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsxs(material.FormControl, { children: [jsxRuntime.jsxs("div", { style: { flexDirection: 'row' }, children: [jsxRuntime.jsxs(material.Button, { variant: "contained", component: "label", style: { marginRight: theme.spacing() }, children: ["Choose File", jsxRuntime.jsx("input", { type: "file", required: true, hidden: true, onChange: handleChangeFile })] }), file ? file.name : 'No file chosen'] }), jsxRuntime.jsx(material.FormHelperText, { children: "Make sure your GFF3 has an embedded FASTA section" })] }), jsxRuntime.jsx(material.TextField, { required: true, label: "Assembly name", value: assemblyName, onChange: handleAssemblyNameChange })] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { disabled: false, variant: "contained", type: "submit", children: submitted ? 'Submitting...' : 'Submit' }), jsxRuntime.jsx(material.Button, { disabled: submitted, variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4659
4352
  }
4660
4353
 
4661
- /* eslint-disable @typescript-eslint/unbound-method */
4662
- const useStyles$e = mui.makeStyles()((theme) => ({
4354
+ const useStyles$e = tssReact.makeStyles()((theme) => ({
4663
4355
  changeTextarea: {
4664
4356
  fontFamily: 'monospace',
4665
4357
  width: 600,
@@ -4695,7 +4387,7 @@ function ViewChangeLog({ handleClose, session }) {
4695
4387
  field: 'changes',
4696
4388
  headerName: 'Change JSON',
4697
4389
  width: 600,
4698
- renderCell: ({ value }) => (React__default["default"].createElement("textarea", { className: classes.changeTextarea, value: JSON.stringify(value), readOnly: true })),
4390
+ renderCell: ({ value }) => (jsxRuntime.jsx("textarea", { className: classes.changeTextarea, value: JSON.stringify(value), readOnly: true })),
4699
4391
  },
4700
4392
  { field: 'user', headerName: 'User', width: 140 },
4701
4393
  {
@@ -4743,20 +4435,12 @@ function ViewChangeLog({ handleClose, session }) {
4743
4435
  const newAssembly = assemblies.find((asm) => asm.name === e.target.value);
4744
4436
  setSelectedAssembly(newAssembly);
4745
4437
  }
4746
- return (React__default["default"].createElement(Dialog, { open: true, fullScreen: true, title: "View change log", handleClose: handleClose, "data-testid": "view-changelog" },
4747
- React__default["default"].createElement(material.Select, { style: { width: 200, marginLeft: 40 }, value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName || option.name)))),
4748
- React__default["default"].createElement(material.DialogContent, null,
4749
- React__default["default"].createElement(xDataGrid.DataGrid, { pagination: true, rows: displayGridData, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, initialState: {
4750
- sorting: { sortModel: [{ field: 'sequence', sort: 'desc' }] },
4751
- columns: { columnVisibilityModel: { sequence: false } },
4752
- } })),
4753
- React__default["default"].createElement(material.DialogActions, null,
4754
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
4755
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4756
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4438
+ return (jsxRuntime.jsxs(Dialog, { open: true, fullScreen: true, title: "View change log", handleClose: handleClose, "data-testid": "view-changelog", children: [jsxRuntime.jsx(material.Select, { style: { width: 200, marginLeft: 40 }, value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName || option.name }, option.name))) }), jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(xDataGrid.DataGrid, { pagination: true, rows: displayGridData, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, initialState: {
4439
+ sorting: { sortModel: [{ field: 'sequence', sort: 'desc' }] },
4440
+ columns: { columnVisibilityModel: { sequence: false } },
4441
+ } }) }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4757
4442
  }
4758
4443
 
4759
- /* eslint-disable @typescript-eslint/unbound-method */
4760
4444
  const columns = [
4761
4445
  { field: 'refName', headerName: 'Ref Name' },
4762
4446
  { field: 'aliases', headerName: 'Aliases', editable: true, flex: 1 },
@@ -4900,31 +4584,13 @@ const AddRefSeqAliases = mobxReact.observer(function AddRefSeqAliases({ changeMa
4900
4584
  });
4901
4585
  handleClose();
4902
4586
  };
4903
- return (React__default["default"].createElement(Dialog, { open: true, title: "Add reference sequence aliases", handleClose: handleClose, maxWidth: 'sm', "data-testid": "add-refseq-alias", fullWidth: true },
4904
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
4905
- React__default["default"].createElement(material.Grid, { container: true, spacing: 2 },
4906
- React__default["default"].createElement(material.Grid, null,
4907
- React__default["default"].createElement(material.FormControl, { disabled: enableSubmit && !errorMessage, fullWidth: true },
4908
- React__default["default"].createElement(material.InputLabel, { id: "demo-simple-select-label" }, "Assembly"),
4909
- React__default["default"].createElement(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Assembly", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, style: { minWidth: 150 } }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName)))))),
4910
- React__default["default"].createElement(material.Grid, null,
4911
- React__default["default"].createElement(material.InputLabel, null, "Load RefName alias"),
4912
- React__default["default"].createElement("input", { type: "file", onChange: handleChangeFileHandler, ref: fileRef, disabled: (enableSubmit && !errorMessage) || !selectedAssembly }))),
4913
- selectedAssembly && refNameAliasMap.size > 0 ? (React__default["default"].createElement("div", { style: { height: 200, width: '100%', marginTop: 20 } },
4914
- React__default["default"].createElement(material.InputLabel, null, "Refname aliases found for selected assembly."),
4915
- React__default["default"].createElement(xDataGrid.DataGrid, { rows: getTableRows(), columns: columns, initialState: {
4916
- pagination: {
4917
- paginationModel: { page: 0, pageSize: 5 },
4918
- },
4919
- }, pageSizeOptions: [5, 10], onRowSelectionModelChange: rowSelectionChange, processRowUpdate: processRowUpdate, checkboxSelection: true, disableRowSelectionExcludeModel: true }))) : null),
4920
- React__default["default"].createElement(material.DialogActions, null,
4921
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: !enableSubmit, onClick: handleSubmit }, "Submit"),
4922
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
4923
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4924
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4587
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Add reference sequence aliases", handleClose: handleClose, maxWidth: 'sm', "data-testid": "add-refseq-alias", fullWidth: true, children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: [jsxRuntime.jsxs(material.Grid, { container: true, spacing: 2, children: [jsxRuntime.jsx(material.Grid, { children: jsxRuntime.jsxs(material.FormControl, { disabled: enableSubmit && !errorMessage, fullWidth: true, children: [jsxRuntime.jsx(material.InputLabel, { id: "demo-simple-select-label", children: "Assembly" }), jsxRuntime.jsx(material.Select, { labelId: "demo-simple-select-label", id: "demo-simple-select", label: "Assembly", value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, style: { minWidth: 150 }, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) })] }) }), jsxRuntime.jsxs(material.Grid, { children: [jsxRuntime.jsx(material.InputLabel, { children: "Load RefName alias" }), jsxRuntime.jsx("input", { type: "file", onChange: handleChangeFileHandler, ref: fileRef, disabled: (enableSubmit && !errorMessage) || !selectedAssembly })] })] }), selectedAssembly && refNameAliasMap.size > 0 ? (jsxRuntime.jsxs("div", { style: { height: 200, width: '100%', marginTop: 20 }, children: [jsxRuntime.jsx(material.InputLabel, { children: "Refname aliases found for selected assembly." }), jsxRuntime.jsx(xDataGrid.DataGrid, { rows: getTableRows(), columns: columns, initialState: {
4588
+ pagination: {
4589
+ paginationModel: { page: 0, pageSize: 5 },
4590
+ },
4591
+ }, pageSizeOptions: [5, 10], onRowSelectionModelChange: rowSelectionChange, processRowUpdate: processRowUpdate, checkboxSelection: true, disableRowSelectionExcludeModel: true })] })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: !enableSubmit, onClick: handleSubmit, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4925
4592
  });
4926
4593
 
4927
- /* eslint-disable @typescript-eslint/unbound-method */
4928
4594
  function ViewCheckResults({ handleClose, session, }) {
4929
4595
  const { internetAccounts } = mobxStateTree.getRoot(session);
4930
4596
  const { collaborationServerDriver } = session.apolloDataStore;
@@ -4983,20 +4649,12 @@ function ViewCheckResults({ handleClose, session, }) {
4983
4649
  const newAssembly = assemblies.find((asm) => asm.name === e.target.value);
4984
4650
  setSelectedAssembly(newAssembly);
4985
4651
  }
4986
- return (React__default["default"].createElement(Dialog, { open: true, fullScreen: true, title: "View check results", handleClose: handleClose, "data-testid": "view-check-results" },
4987
- React__default["default"].createElement(material.Select, { style: { width: 200, marginLeft: 40 }, value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0 }, assemblies.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option.name, value: option.name }, option.displayName)))),
4988
- React__default["default"].createElement(material.DialogContent, null,
4989
- React__default["default"].createElement(xDataGrid.DataGrid, { pagination: true, rows: displayGridData, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, initialState: {
4990
- sorting: { sortModel: [{ field: 'name', sort: 'asc' }] },
4991
- columns: { columnVisibilityModel: { name: true } },
4992
- } })),
4993
- React__default["default"].createElement(material.DialogActions, null,
4994
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Close")),
4995
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
4996
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4652
+ return (jsxRuntime.jsxs(Dialog, { open: true, fullScreen: true, title: "View check results", handleClose: handleClose, "data-testid": "view-check-results", children: [jsxRuntime.jsx(material.Select, { style: { width: 200, marginLeft: 40 }, value: selectedAssembly?.name ?? '', onChange: handleChangeAssembly, disabled: assemblies.length === 0, children: assemblies.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option.name, children: option.displayName }, option.name))) }), jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(xDataGrid.DataGrid, { pagination: true, rows: displayGridData, columns: gridColumns, getRowId: (row) => row._id, slots: { toolbar: xDataGrid.GridToolbar }, initialState: {
4653
+ sorting: { sortModel: [{ field: 'name', sort: 'asc' }] },
4654
+ columns: { columnVisibilityModel: { name: true } },
4655
+ } }) }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Close" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4997
4656
  }
4998
4657
 
4999
- /* eslint-disable @typescript-eslint/unbound-method */
5000
4658
  function exonIsSplittable(exonToBeSplit) {
5001
4659
  if (exonToBeSplit.max - exonToBeSplit.min < 2) {
5002
4660
  return {
@@ -5036,33 +4694,79 @@ function SplitExon({ changeManager, handleClose, selectedFeature, setSelectedFea
5036
4694
  parentFeatureId: sourceFeature.parent._id,
5037
4695
  upstreamCut,
5038
4696
  downstreamCut,
5039
- leftExonId: new ObjectID__default["default"]().toHexString(),
5040
- rightExonId: new ObjectID__default["default"]().toHexString(),
4697
+ leftExonId: new ObjectID().toHexString(),
4698
+ rightExonId: new ObjectID().toHexString(),
5041
4699
  });
5042
4700
  void changeManager.submit(change);
5043
4701
  handleClose();
5044
4702
  event.preventDefault();
5045
4703
  }
5046
- return (React__default["default"].createElement(Dialog, { open: true, title: "Split exon", handleClose: handleClose, maxWidth: false, "data-testid": "split-exon" },
5047
- React__default["default"].createElement("form", { onSubmit: onSubmit },
5048
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' } },
5049
- React__default["default"].createElement(material.DialogContentText, null, makeDialogText(exonToBeSplit))),
5050
- React__default["default"].createElement(material.DialogActions, null,
5051
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: !exonIsSplittable(exonToBeSplit).isSplittable }, "Yes"),
5052
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel"))),
5053
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
5054
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4704
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Split exon", handleClose: handleClose, maxWidth: false, "data-testid": "split-exon", children: [jsxRuntime.jsxs("form", { onSubmit: onSubmit, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.DialogContentText, { children: makeDialogText(exonToBeSplit) }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: !exonIsSplittable(exonToBeSplit).isSplittable, children: "Yes" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
4705
+ }
4706
+
4707
+ function DuplicateTranscript({ changeManager, handleClose, session, sourceAssemblyId, sourceFeature, setSelectedFeature, }) {
4708
+ const [errorMessage, setErrorMessage] = React.useState('');
4709
+ const { notify } = session;
4710
+ async function onSubmit(event) {
4711
+ event.preventDefault();
4712
+ setErrorMessage('');
4713
+ try {
4714
+ const parentGene = sourceFeature.parent;
4715
+ if (!parentGene) {
4716
+ setErrorMessage('No parent gene found for this transcript');
4717
+ return;
4718
+ }
4719
+ const transcriptSnapshot = mobxStateTree.getSnapshot(sourceFeature);
4720
+ const newTranscriptId = new ObjectID().toHexString();
4721
+ const duplicateTranscript = {
4722
+ ...transcriptSnapshot,
4723
+ _id: newTranscriptId,
4724
+ };
4725
+ if (duplicateTranscript.children) {
4726
+ const newChildren = {};
4727
+ for (const [, child] of Object.entries(duplicateTranscript.children)) {
4728
+ const newChildId = new ObjectID().toHexString();
4729
+ newChildren[newChildId] = {
4730
+ ...child,
4731
+ _id: newChildId,
4732
+ };
4733
+ }
4734
+ duplicateTranscript.children = newChildren;
4735
+ }
4736
+ const change = new shared.AddFeatureChange({
4737
+ parentFeatureId: parentGene._id,
4738
+ changedIds: [parentGene._id],
4739
+ typeName: 'AddFeatureChange',
4740
+ assembly: sourceAssemblyId,
4741
+ addedFeature: duplicateTranscript,
4742
+ });
4743
+ await changeManager.submit(change).then(() => {
4744
+ setSelectedFeature(undefined);
4745
+ session.apolloSetSelectedFeature(newTranscriptId);
4746
+ notify('Successfully duplicated transcript', 'success');
4747
+ });
4748
+ handleClose();
4749
+ }
4750
+ catch (error) {
4751
+ setErrorMessage(error instanceof Error
4752
+ ? error.message
4753
+ : 'Failed to duplicate transcript');
4754
+ }
4755
+ }
4756
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Duplicate transcript", handleClose: handleClose, maxWidth: false, "data-testid": "duplicate-transcript", children: [jsxRuntime.jsxs("form", { onSubmit: (event) => {
4757
+ void onSubmit(event);
4758
+ }, children: [jsxRuntime.jsx(material.DialogContent, { style: { display: 'flex', flexDirection: 'column' }, children: jsxRuntime.jsx(material.DialogContentText, { children: "Are you sure you want to create a duplicate of this transcript?" }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", children: "Yes" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "button", onClick: handleClose, children: "Cancel" })] })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
5055
4759
  }
5056
4760
 
5057
4761
  function addTopLevelAdminMenus(rootModel) {
5058
4762
  rootModel.appendToMenu('Apollo', {
5059
4763
  label: 'Admin',
5060
4764
  type: 'subMenu',
5061
- icon: AdminPanelSettingsIcon__default["default"],
4765
+ icon: AdminPanelSettingsIcon,
5062
4766
  subMenu: [
5063
4767
  {
5064
4768
  label: 'Add Assembly',
5065
- icon: AddIcon__default["default"],
4769
+ icon: AddIcon,
5066
4770
  onClick: (session) => {
5067
4771
  session.queueDialog((doneCallback) => [
5068
4772
  AddAssembly,
@@ -5078,7 +4782,7 @@ function addTopLevelAdminMenus(rootModel) {
5078
4782
  },
5079
4783
  {
5080
4784
  label: 'Delete Assembly',
5081
- icon: DeleteIcon__default["default"],
4785
+ icon: DeleteIcon,
5082
4786
  onClick: (session) => {
5083
4787
  session.queueDialog((doneCallback) => [
5084
4788
  DeleteAssembly,
@@ -5094,7 +4798,7 @@ function addTopLevelAdminMenus(rootModel) {
5094
4798
  },
5095
4799
  {
5096
4800
  label: 'Import Features',
5097
- icon: InputIcon__default["default"],
4801
+ icon: InputIcon,
5098
4802
  onClick: (session) => {
5099
4803
  session.queueDialog((doneCallback) => [
5100
4804
  ImportFeatures,
@@ -5140,7 +4844,7 @@ function addTopLevelAdminMenus(rootModel) {
5140
4844
  },
5141
4845
  {
5142
4846
  label: 'Manage Users',
5143
- icon: PersonIcon__default["default"],
4847
+ icon: PersonIcon,
5144
4848
  onClick: (session) => {
5145
4849
  session.queueDialog((doneCallback) => [
5146
4850
  ManageUsers,
@@ -5156,7 +4860,7 @@ function addTopLevelAdminMenus(rootModel) {
5156
4860
  },
5157
4861
  {
5158
4862
  label: 'Manage Checks',
5159
- icon: RuleIcon__default["default"],
4863
+ icon: RuleIcon,
5160
4864
  onClick: (session) => {
5161
4865
  session.queueDialog((doneCallback) => [
5162
4866
  ManageChecks,
@@ -5176,23 +4880,15 @@ function addTopLevelAdminMenus(rootModel) {
5176
4880
  // Icon source: https://developers.google.com/identity/branding-guidelines
5177
4881
  function Google(props) {
5178
4882
  const { color } = props;
5179
- return (React__default["default"].createElement(material.SvgIcon, { viewBox: "0 0 18 18", style: { fontSize: 18, marginRight: 4 }, ...props }, color === 'disabled' ? (React__default["default"].createElement("path", { d: "M9.001,10.71 l0,-3.348 l8.424,0 c0.126,0.567,0.225,1.098,0.225,1.845 c0,5.139,-3.447,8.793,-8.64,8.793 c-4.968,0,-9,-4.032,-9,-9 c0,-4.968,4.032,-9,9,-9 c2.43,0,4.464,0.891,6.021,2.349 l-2.556,2.484 c-0.648,-0.612,-1.782,-1.332,-3.465,-1.332 c-2.979,0,-5.409,2.475,-5.409,5.508 c0,3.033,2.43,5.508,5.409,5.508 c3.447,0,4.716,-2.385,4.95,-3.798 l-4.959,0 l0,-0.009 z" })) : (React__default["default"].createElement(React__default["default"].Fragment, null,
5180
- React__default["default"].createElement("path", { d: "M17.64,9.20454545 c0,-0.638,-0.057,-1.252,-0.164,-1.841 l-8.476,0 l0,3.481 l4.844,0 c-0.209,1.125,-0.843,2.079,-1.796,2.717 l0,2.258 l2.908,0 c1.702,-1.567,2.684,-3.874,2.684,-6.615 l0,0 z", fill: "#4285F4" }),
5181
- React__default["default"].createElement("path", { d: "M9,18 c2.43,0,4.467,-0.806,5.956,-2.18 l-2.908,-2.259 c-0.806,0.54,-1.837,0.859,-3.048,0.859 c-2.344,0,-4.328,-1.583,-5.036,-3.71 l-3.007,0 l0,2.332 c1.481,2.941,4.525,4.958,8.043,4.958 l0,0 z", fill: "#34A853" }),
5182
- React__default["default"].createElement("path", { d: "M3.96409091,10.71 c-0.18,-0.54,-0.282,-1.117,-0.282,-1.71 c0,-0.593,0.102,-1.17,0.282,-1.71 l0,-2.332 l-3.007,0 c-0.609,1.215,-0.957,2.59,-0.957,4.042 c0,1.452,0.348,2.827,0.957,4.042 l3.007,-2.332 l0,0 z", fill: "#FBBC05" }),
5183
- React__default["default"].createElement("path", { d: "M9,3.57954545 c1.321,0,2.508,0.454,3.44,1.346 l2.582,-2.581 c-1.559,-1.453,-3.596,-2.345,-6.022,-2.345 c-3.518,0,-6.562,2.017,-8.043,4.959 l3.007,2.331 c0.708,-2.127,2.692,-3.71,5.036,-3.71 l0,0 z", fill: "#EA4335" })))));
4883
+ return (jsxRuntime.jsx(material.SvgIcon, { viewBox: "0 0 18 18", style: { fontSize: 18, marginRight: 4 }, ...props, children: color === 'disabled' ? (jsxRuntime.jsx("path", { d: "M9.001,10.71 l0,-3.348 l8.424,0 c0.126,0.567,0.225,1.098,0.225,1.845 c0,5.139,-3.447,8.793,-8.64,8.793 c-4.968,0,-9,-4.032,-9,-9 c0,-4.968,4.032,-9,9,-9 c2.43,0,4.464,0.891,6.021,2.349 l-2.556,2.484 c-0.648,-0.612,-1.782,-1.332,-3.465,-1.332 c-2.979,0,-5.409,2.475,-5.409,5.508 c0,3.033,2.43,5.508,5.409,5.508 c3.447,0,4.716,-2.385,4.95,-3.798 l-4.959,0 l0,-0.009 z" })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M17.64,9.20454545 c0,-0.638,-0.057,-1.252,-0.164,-1.841 l-8.476,0 l0,3.481 l4.844,0 c-0.209,1.125,-0.843,2.079,-1.796,2.717 l0,2.258 l2.908,0 c1.702,-1.567,2.684,-3.874,2.684,-6.615 l0,0 z", fill: "#4285F4" }), jsxRuntime.jsx("path", { d: "M9,18 c2.43,0,4.467,-0.806,5.956,-2.18 l-2.908,-2.259 c-0.806,0.54,-1.837,0.859,-3.048,0.859 c-2.344,0,-4.328,-1.583,-5.036,-3.71 l-3.007,0 l0,2.332 c1.481,2.941,4.525,4.958,8.043,4.958 l0,0 z", fill: "#34A853" }), jsxRuntime.jsx("path", { d: "M3.96409091,10.71 c-0.18,-0.54,-0.282,-1.117,-0.282,-1.71 c0,-0.593,0.102,-1.17,0.282,-1.71 l0,-2.332 l-3.007,0 c-0.609,1.215,-0.957,2.59,-0.957,4.042 c0,1.452,0.348,2.827,0.957,4.042 l3.007,-2.332 l0,0 z", fill: "#FBBC05" }), jsxRuntime.jsx("path", { d: "M9,3.57954545 c1.321,0,2.508,0.454,3.44,1.346 l2.582,-2.581 c-1.559,-1.453,-3.596,-2.345,-6.022,-2.345 c-3.518,0,-6.562,2.017,-8.043,4.959 l3.007,2.331 c0.708,-2.127,2.692,-3.71,5.036,-3.71 l0,0 z", fill: "#EA4335" })] })) }));
5184
4884
  }
5185
4885
  // Icon source: https://learn.microsoft.com/en-us/azure/active-directory/develop/howto-add-branding-in-azure-ad-apps
5186
4886
  function Microsoft(props) {
5187
4887
  const { color } = props;
5188
- return (React__default["default"].createElement(material.SvgIcon, { viewBox: "0 0 21 21", style: { fontSize: 21 }, ...props },
5189
- React__default["default"].createElement("rect", { x: "1", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#F25022' }),
5190
- React__default["default"].createElement("rect", { x: "1", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#00A4EF' }),
5191
- React__default["default"].createElement("rect", { x: "11", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#939393' : '#7FBA00' }),
5192
- React__default["default"].createElement("rect", { x: "11", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#B9B9B9' : '#FFB900' })));
4888
+ return (jsxRuntime.jsxs(material.SvgIcon, { viewBox: "0 0 21 21", style: { fontSize: 21 }, ...props, children: [jsxRuntime.jsx("rect", { x: "1", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#F25022' }), jsxRuntime.jsx("rect", { x: "1", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#7B7B7B' : '#00A4EF' }), jsxRuntime.jsx("rect", { x: "11", y: "1", width: "9", height: "9", fill: color === 'disabled' ? '#939393' : '#7FBA00' }), jsxRuntime.jsx("rect", { x: "11", y: "11", width: "9", height: "9", fill: color === 'disabled' ? '#B9B9B9' : '#FFB900' })] }));
5193
4889
  }
5194
4890
 
5195
- const useStyles$d = mui.makeStyles()((theme) => ({
4891
+ const useStyles$d = tssReact.makeStyles()((theme) => ({
5196
4892
  loginButton: {
5197
4893
  marginBottom: theme.spacing(1),
5198
4894
  width: '220px',
@@ -5206,20 +4902,19 @@ const useStyles$d = mui.makeStyles()((theme) => ({
5206
4902
  function GoogleButton(props) {
5207
4903
  const { classes } = useStyles$d();
5208
4904
  const { disabled } = props;
5209
- return (React__default["default"].createElement(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: React__default["default"].createElement(Google, { color: disabled ? 'disabled' : undefined }), ...props }, "Sign in with Google"));
4905
+ return (jsxRuntime.jsx(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: jsxRuntime.jsx(Google, { color: disabled ? 'disabled' : undefined }), ...props, children: "Sign in with Google" }));
5210
4906
  }
5211
4907
  function MicrosoftButton(props) {
5212
4908
  const { classes } = useStyles$d();
5213
4909
  const { disabled } = props;
5214
- return (React__default["default"].createElement(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: React__default["default"].createElement(Microsoft, { color: disabled ? 'disabled' : undefined }), ...props }, "Sign in with Microsoft"));
4910
+ return (jsxRuntime.jsx(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: jsxRuntime.jsx(Microsoft, { color: disabled ? 'disabled' : undefined }), ...props, children: "Sign in with Microsoft" }));
5215
4911
  }
5216
4912
  function GuestButton(props) {
5217
4913
  const { classes } = useStyles$d();
5218
- return (React__default["default"].createElement(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: React__default["default"].createElement(AccountCircleIcon__default["default"], { fontSize: "small" }), ...props }, "Continue as Guest"));
4914
+ return (jsxRuntime.jsx(material.Button, { className: classes.loginButton, variant: "outlined", startIcon: jsxRuntime.jsx(AccountCircleIcon, { fontSize: "small" }), ...props, children: "Continue as Guest" }));
5219
4915
  }
5220
4916
 
5221
- /* eslint-disable @typescript-eslint/use-unknown-in-catch-callback-variable */
5222
- const useStyles$c = mui.makeStyles()((theme) => ({
4917
+ const useStyles$c = tssReact.makeStyles()((theme) => ({
5223
4918
  divider: {
5224
4919
  marginTop: theme.spacing(4),
5225
4920
  marginBottom: theme.spacing(5),
@@ -5249,7 +4944,7 @@ const AuthTypeSelector = ({ baseURL, handleClose, name, }) => {
5249
4944
  }
5250
4945
  });
5251
4946
  return () => {
5252
- controller.abort('AuthTypeSelector');
4947
+ controller.abort(new DOMException('Error retrieving valid authentication types', 'AbortError'));
5253
4948
  };
5254
4949
  }, [baseURL]);
5255
4950
  function handleClick(authType) {
@@ -5266,28 +4961,24 @@ const AuthTypeSelector = ({ baseURL, handleClose, name, }) => {
5266
4961
  const allowGoogle = loginTypes.includes('google');
5267
4962
  const allowMicrosoft = loginTypes.includes('microsoft');
5268
4963
  const allowGuest = loginTypes.includes('guest');
5269
- return (React__default["default"].createElement(Dialog, { open: true, title: `Log in to ${name}`, handleClose: handleClose, maxWidth: false, "data-testid": "login-apollo" },
5270
- React__default["default"].createElement(material.DialogContent, { style: { display: 'flex', flexDirection: 'column', paddingTop: 8 } },
5271
- allowGoogle ? (React__default["default"].createElement(GoogleButton, { disabled: !allowGoogle, onClick: () => {
5272
- handleClick('google');
5273
- } })) : null,
5274
- allowMicrosoft ? (React__default["default"].createElement(MicrosoftButton, { disabled: !allowMicrosoft, onClick: () => {
5275
- handleClick('microsoft');
5276
- } })) : null,
5277
- allowGuest ? (React__default["default"].createElement(React__default["default"].Fragment, null,
5278
- React__default["default"].createElement(material.Divider, { className: classes.divider }),
5279
- React__default["default"].createElement(GuestButton, { onClick: () => {
5280
- handleClick('guest');
5281
- } }))) : null),
5282
- React__default["default"].createElement(material.DialogActions, null,
5283
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: () => {
5284
- handleClose();
5285
- } }, "Cancel")),
5286
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
5287
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
4964
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: `Log in to ${name}`, handleClose: handleClose, maxWidth: false, "data-testid": "login-apollo", children: [jsxRuntime.jsxs(material.DialogContent, { style: { display: 'flex', flexDirection: 'column', paddingTop: 8 }, children: [allowGoogle ? (jsxRuntime.jsx(GoogleButton, { disabled: !allowGoogle, onClick: () => {
4965
+ handleClick('google');
4966
+ } })) : null, allowMicrosoft ? (jsxRuntime.jsx(MicrosoftButton, { disabled: !allowMicrosoft, onClick: () => {
4967
+ handleClick('microsoft');
4968
+ } })) : null, allowGuest ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.Divider, { className: classes.divider }), jsxRuntime.jsx(GuestButton, { onClick: () => {
4969
+ handleClick('guest');
4970
+ } })] })) : null] }), jsxRuntime.jsx(material.DialogActions, { children: jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: () => {
4971
+ handleClose();
4972
+ }, children: "Cancel" }) }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
5288
4973
  };
5289
4974
 
5290
4975
  /* eslint-disable @typescript-eslint/no-unsafe-return */
4976
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
4977
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
4978
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
4979
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
4980
+ /* eslint-disable @typescript-eslint/unbound-method */
4981
+ /* eslint-disable @typescript-eslint/no-misused-promises */
5291
4982
  const inWebWorker$1 = typeof sessionStorage === 'undefined';
5292
4983
  const stateModelFactory$3 = (configSchema) => {
5293
4984
  return pluggableElementTypes.InternetAccount.named('ApolloInternetAccount')
@@ -5340,7 +5031,6 @@ const stateModelFactory$3 = (configSchema) => {
5340
5031
  },
5341
5032
  finishOAuthWindow(event, resolve, reject) {
5342
5033
  if (event.data.name !== `JBrowseAuthWindow-${self.internetAccountId}`) {
5343
- this.deleteMessageChannel();
5344
5034
  return;
5345
5035
  }
5346
5036
  const redirectUriWithInfo = event.data.redirectUri;
@@ -5699,7 +5389,7 @@ const stateModelFactory$3 = (configSchema) => {
5699
5389
  beforeDestroy() {
5700
5390
  self.removeBeforeUnloadListener();
5701
5391
  self.removeVisibilityChangeListener();
5702
- self.controller.abort('internet account beforeDestroy');
5392
+ self.controller.abort(new DOMException('Cleaning up Apollo connection', 'AbortError'));
5703
5393
  self.socket.close();
5704
5394
  },
5705
5395
  }));
@@ -5770,7 +5460,7 @@ var configSchema$5 = configuration.ConfigurationSchema('ApolloRefNameAliasAdapte
5770
5460
  }, { explicitlyTyped: true });
5771
5461
 
5772
5462
  function installApolloRefNameAliasAdapter(pluginManager) {
5773
- pluginManager.addAdapterType(() => new AdapterType__default["default"]({
5463
+ pluginManager.addAdapterType(() => new AdapterType({
5774
5464
  name: 'ApolloRefNameAliasAdapter',
5775
5465
  configSchema: configSchema$5,
5776
5466
  adapterMetadata: {
@@ -5783,6 +5473,10 @@ function installApolloRefNameAliasAdapter(pluginManager) {
5783
5473
  }
5784
5474
 
5785
5475
  /* eslint-disable @typescript-eslint/prefer-promise-reject-errors */
5476
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
5477
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
5478
+ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5479
+ /* eslint-disable @typescript-eslint/no-unsafe-call */
5786
5480
  function isApolloMessageData$1(data) {
5787
5481
  return (typeof data === 'object' &&
5788
5482
  data !== null &&
@@ -5874,7 +5568,7 @@ class ApolloSequenceAdapter extends BaseAdapter.BaseSequenceAdapter {
5874
5568
  regionWithAssemblyName.end = region.end;
5875
5569
  }
5876
5570
  const { seq } = await backendDriver.getSequence(regionWithAssemblyName);
5877
- observer.next(new SimpleFeature__default["default"]({
5571
+ observer.next(new SimpleFeature({
5878
5572
  id: `${refName} ${start}-${end}`,
5879
5573
  data: { refName, start, end, seq },
5880
5574
  }));
@@ -5907,7 +5601,7 @@ class ApolloSequenceAdapter extends BaseAdapter.BaseSequenceAdapter {
5907
5601
  messageId,
5908
5602
  });
5909
5603
  });
5910
- observer.next(new SimpleFeature__default["default"]({
5604
+ observer.next(new SimpleFeature({
5911
5605
  id: `${refName} ${start}-${end}`,
5912
5606
  data: { refName, start, end, seq },
5913
5607
  }));
@@ -5931,7 +5625,7 @@ var configSchema$4 = configuration.ConfigurationSchema('ApolloSequenceAdapter',
5931
5625
  }, { explicitlyTyped: true });
5932
5626
 
5933
5627
  function installApolloSequenceAdapter(pluginManager) {
5934
- pluginManager.addAdapterType(() => new AdapterType__default["default"]({
5628
+ pluginManager.addAdapterType(() => new AdapterType({
5935
5629
  name: 'ApolloSequenceAdapter',
5936
5630
  configSchema: configSchema$4,
5937
5631
  adapterMetadata: {
@@ -5943,6 +5637,23 @@ function installApolloSequenceAdapter(pluginManager) {
5943
5637
  }));
5944
5638
  }
5945
5639
 
5640
+ function getMatchedFeature(query, feature) {
5641
+ // @ts-expect-error this actually has a bit more info that a plain snapshot
5642
+ const { children, indexedIds, ...featureWithoutChildren } = feature;
5643
+ const featureString = JSON.stringify(featureWithoutChildren);
5644
+ if (featureString.includes(query)) {
5645
+ return feature;
5646
+ }
5647
+ if (!children) {
5648
+ return undefined;
5649
+ }
5650
+ for (const subFeature of Object.values(children)) {
5651
+ const matchedFeature = getMatchedFeature(query, subFeature);
5652
+ if (matchedFeature) {
5653
+ return matchedFeature;
5654
+ }
5655
+ }
5656
+ }
5946
5657
  class ApolloTextSearchAdapter extends BaseAdapter.BaseAdapter {
5947
5658
  get baseURL() {
5948
5659
  return configuration.readConfObject(this.config, 'baseURL').uri;
@@ -5955,11 +5666,13 @@ class ApolloTextSearchAdapter extends BaseAdapter.BaseAdapter {
5955
5666
  }
5956
5667
  mapBaseResult(features, assembly, query) {
5957
5668
  return features.map((feature) => {
5669
+ const matchedObject = getMatchedFeature(query, feature) ?? feature;
5958
5670
  const refName = assembly.getCanonicalRefName(feature.refSeq);
5959
- return new BaseResult__default["default"]({
5671
+ return new BaseResult({
5960
5672
  label: query,
5961
5673
  trackId: this.trackId,
5962
- locString: `${refName}:${feature.min + 1}..${feature.max}`,
5674
+ locString: `${refName}:${matchedObject.min + 1}..${matchedObject.max}`,
5675
+ matchedObject,
5963
5676
  });
5964
5677
  });
5965
5678
  }
@@ -6018,7 +5731,7 @@ function installApolloTextSearchAdapter(pluginManager) {
6018
5731
  }));
6019
5732
  }
6020
5733
 
6021
- const useStyles$b = mui.makeStyles()((theme) => ({
5734
+ const useStyles$b = tssReact.makeStyles()((theme) => ({
6022
5735
  attributeKey: {
6023
5736
  fontWeight: 'bold',
6024
5737
  marginRight: theme.spacing(2),
@@ -6041,10 +5754,7 @@ function AttributeKey({ attributeKey: key }) {
6041
5754
  titleText =
6042
5755
  'On GFF3 export, this attribute will be changed to start with a lower-case letter because attributes starting with an upper-case letter are reserved in GFF3';
6043
5756
  }
6044
- return (React__default["default"].createElement("div", { style: { display: 'flex' } },
6045
- React__default["default"].createElement(material.Typography, { className: classes.attributeKey }, displayKey),
6046
- titleText ? (React__default["default"].createElement(material.Tooltip, { title: titleText },
6047
- React__default["default"].createElement(material.Chip, { icon: React__default["default"].createElement(InfoIcon__default["default"], null), label: "GFF3", size: "small", variant: "outlined" }))) : null));
5757
+ return (jsxRuntime.jsxs("div", { style: { display: 'flex' }, children: [jsxRuntime.jsx(material.Typography, { className: classes.attributeKey, children: displayKey }), titleText ? (jsxRuntime.jsx(material.Tooltip, { title: titleText, children: jsxRuntime.jsx(material.Chip, { icon: jsxRuntime.jsx(InfoIcon, {}), label: "GFF3", size: "small", variant: "outlined" }) })) : null] }));
6048
5758
  }
6049
5759
 
6050
5760
  const customKeyName = 'Custom';
@@ -6075,22 +5785,13 @@ const AttributeKeySelector = mobxReact.observer(function AttributeKeySelector({
6075
5785
  function handleCancel() {
6076
5786
  setKey();
6077
5787
  }
6078
- return (React__default["default"].createElement("form", { onSubmit: handleSubmit },
6079
- React__default["default"].createElement("div", { style: { display: 'flex', flexDirection: 'column', margin: 8 } },
6080
- React__default["default"].createElement(material.FormControl, { variant: "outlined" },
6081
- React__default["default"].createElement(material.InputLabel, { id: "attribute-key-select-label" }, "Key"),
6082
- React__default["default"].createElement(material.Select, { labelId: "attribute-key-select-label", value: selectedKey, label: "Key", onChange: (event) => {
6083
- setSelectedKey(event.target.value);
6084
- } }, Object.keys(reservedKeys).map((val) => (React__default["default"].createElement(material.MenuItem, { key: val, value: val }, val))))),
6085
- isCustom ? (React__default["default"].createElement(material.TextField, { label: "Attribute key", variant: "outlined", id: "attributeKey", onChange: (event) => {
6086
- setCustomKey(event.target.value);
6087
- } })) : null),
6088
- React__default["default"].createElement(material.DialogActions, null,
6089
- React__default["default"].createElement(material.Button, { color: "primary", variant: "contained", type: "submit", disabled: isCustom && !customKey }, "Add"),
6090
- React__default["default"].createElement(material.Button, { variant: "outlined", onClick: handleCancel }, "Cancel"))));
5788
+ return (jsxRuntime.jsxs("form", { onSubmit: handleSubmit, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', flexDirection: 'column', margin: 8 }, children: [jsxRuntime.jsxs(material.FormControl, { variant: "outlined", children: [jsxRuntime.jsx(material.InputLabel, { id: "attribute-key-select-label", children: "Key" }), jsxRuntime.jsx(material.Select, { labelId: "attribute-key-select-label", value: selectedKey, label: "Key", onChange: (event) => {
5789
+ setSelectedKey(event.target.value);
5790
+ }, children: Object.keys(reservedKeys).map((val) => (jsxRuntime.jsx(material.MenuItem, { value: val, children: val }, val))) })] }), isCustom ? (jsxRuntime.jsx(material.TextField, { label: "Attribute key", variant: "outlined", id: "attributeKey", onChange: (event) => {
5791
+ setCustomKey(event.target.value);
5792
+ } })) : null] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { color: "primary", variant: "contained", type: "submit", disabled: isCustom && !customKey, children: "Add" }), jsxRuntime.jsx(material.Button, { variant: "outlined", onClick: handleCancel, children: "Cancel" })] })] }));
6091
5793
  });
6092
5794
 
6093
- /* eslint-disable @typescript-eslint/unbound-method */
6094
5795
  const StringTextField = mobxReact.observer(function StringTextField({ onChangeCommitted, value: initialValue, ...props }) {
6095
5796
  const [value, setValue] = React.useState(String(initialValue));
6096
5797
  const [blur, setBlur] = React.useState(false);
@@ -6107,7 +5808,7 @@ const StringTextField = mobxReact.observer(function StringTextField({ onChangeCo
6107
5808
  function onChange(event) {
6108
5809
  setValue(event.target.value);
6109
5810
  }
6110
- return (React__default["default"].createElement(material.TextField, { ...props, type: "text", onChange: onChange, value: value, onKeyDown: (event) => {
5811
+ return (jsxRuntime.jsx(material.TextField, { ...props, type: "text", onChange: onChange, value: value, onKeyDown: (event) => {
6111
5812
  if (event.key === 'Enter') {
6112
5813
  inputNode?.blur();
6113
5814
  }
@@ -6147,31 +5848,22 @@ const DefaultAttributeEditor = mobxReact.observer(function DefaultAttributeEdito
6147
5848
  return newValues;
6148
5849
  });
6149
5850
  }
6150
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
6151
- newValues.map((value, idx) => (React__default["default"].createElement("div", { key: `${idx}-${value}`, style: { display: 'flex' } },
6152
- React__default["default"].createElement(StringTextField, { value: value, onChangeCommitted: (editedValue) => {
6153
- updateValue(idx, editedValue);
6154
- }, variant: "outlined", fullWidth: true }),
6155
- React__default["default"].createElement(material.IconButton, { "aria-label": "delete", size: "medium", edge: "end", onClick: () => {
6156
- deleteValue(idx);
6157
- } },
6158
- React__default["default"].createElement(DeleteIcon__default["default"], { fontSize: "inherit" }))))),
6159
- React__default["default"].createElement(material.IconButton, { "aria-label": "add", size: "medium", color: "secondary", edge: "start", onClick: addValue },
6160
- React__default["default"].createElement(AddBoxIcon__default["default"], { fontSize: "inherit" })),
6161
- React__default["default"].createElement(material.DialogActions, null,
6162
- React__default["default"].createElement(material.Button, { color: "primary", variant: "contained", onClick: () => {
6163
- setAttribute(newValues.filter(Boolean));
6164
- } }, isNew ? 'Add' : 'Update'),
6165
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: () => {
6166
- setAttribute();
6167
- } }, "Cancel"))));
5851
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [newValues.map((value, idx) => (jsxRuntime.jsxs("div", { style: { display: 'flex' }, children: [jsxRuntime.jsx(StringTextField, { value: value, onChangeCommitted: (editedValue) => {
5852
+ updateValue(idx, editedValue);
5853
+ }, variant: "outlined", fullWidth: true }), jsxRuntime.jsx(material.IconButton, { "aria-label": "delete", size: "medium", edge: "end", onClick: () => {
5854
+ deleteValue(idx);
5855
+ }, children: jsxRuntime.jsx(DeleteIcon, { fontSize: "inherit" }) })] }, `${idx}-${value}`))), jsxRuntime.jsx(material.IconButton, { "aria-label": "add", size: "medium", color: "secondary", edge: "start", onClick: addValue, children: jsxRuntime.jsx(AddBoxIcon, { fontSize: "inherit" }) }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { color: "primary", variant: "contained", onClick: () => {
5856
+ setAttribute(newValues.filter(Boolean));
5857
+ }, children: isNew ? 'Add' : 'Update' }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: () => {
5858
+ setAttribute();
5859
+ }, children: "Cancel" })] })] }));
6168
5860
  });
6169
5861
 
6170
5862
  function DefaultAttributeViewer({ values }) {
6171
- return (React__default["default"].createElement(React__default["default"].Fragment, null, values?.map((value, idx) => (React__default["default"].createElement(material.Typography, { key: `${idx}.${value}`, variant: "body2", color: "textSecondary" }, value)))));
5863
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: values?.map((value, idx) => (jsxRuntime.jsx(material.Typography, { variant: "body2", color: "textSecondary", children: value }, `${idx}.${value}`))) }));
6172
5864
  }
6173
5865
 
6174
- const useStyles$a = mui.makeStyles()((theme) => ({
5866
+ const useStyles$a = tssReact.makeStyles()((theme) => ({
6175
5867
  list: {
6176
5868
  'li:nth-of-type(odd)': {
6177
5869
  backgroundColor: theme.palette.action.focus,
@@ -6267,49 +5959,30 @@ const Attributes = mobxReact.observer(function Attributes({ assembly, editable,
6267
5959
  void changeManager.submit(change);
6268
5960
  }
6269
5961
  const NewKeyAttributeEditor = pluginManager.evaluateExtensionPoint('Apollo-AttributeEditorComponent', DefaultAttributeEditor, { key: newKey });
6270
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
6271
- React__default["default"].createElement(material.List, { className: classes.list },
6272
- mobx.entries(attributes).map(([key, values]) => {
6273
- const AttributeEditor = pluginManager.evaluateExtensionPoint('Apollo-AttributeEditorComponent', DefaultAttributeEditor, { key });
6274
- const AttributeViewer = pluginManager.evaluateExtensionPoint('Apollo-AttributeViewerComponent', DefaultAttributeViewer, { key });
6275
- return (React__default["default"].createElement(material.ListItem, { key: key, secondaryAction: editable && !editingKey ? (React__default["default"].createElement(material.IconButton, { edge: "end", onClick: (event) => {
6276
- handleListMenuClick(event, key);
6277
- } },
6278
- React__default["default"].createElement(MoreHorizIcon__default["default"], null))) : null },
6279
- React__default["default"].createElement(material.ListItemText, { disableTypography: true, primary: React__default["default"].createElement(AttributeKey, { attributeKey: key }), secondary: editingKey === key ? (React__default["default"].createElement(AttributeEditor, { session: session, attributeValues: values, setAttribute: (newValues) => {
6280
- setEditingKey(null);
6281
- if (newValues) {
6282
- modifyFeatureAttribute(key, newValues);
6283
- }
6284
- } })) : (React__default["default"].createElement(AttributeViewer, { values: values })) })));
6285
- }),
6286
- newKey ? (React__default["default"].createElement(material.ListItem, null,
6287
- React__default["default"].createElement(material.ListItemText, { disableTypography: true, primary: React__default["default"].createElement(AttributeKey, { attributeKey: newKey }), secondary: React__default["default"].createElement(NewKeyAttributeEditor, { session: session, attributeValues: [], setAttribute: (newValues) => {
6288
- if (newValues) {
6289
- addFeatureAttribute(newKey, newValues);
6290
- }
6291
- setNewKey(undefined);
6292
- }, isNew: true }) }))) : null),
6293
- editable ? (React__default["default"].createElement(material.Button, { color: "primary", variant: "contained", disabled: showAddNewForm || Boolean(newKey), onClick: () => {
6294
- setShowAddNewForm(true);
6295
- } }, "Add new")) : null,
6296
- showAddNewForm ? (React__default["default"].createElement(material.Paper, { variant: "outlined", style: { marginTop: 8 } },
6297
- React__default["default"].createElement(AttributeKeySelector, { session: session, setKey: (newKey) => {
6298
- setNewKey(newKey);
6299
- setShowAddNewForm(false);
6300
- } }))) : null,
6301
- React__default["default"].createElement(material.Menu, { anchorEl: anchorEl, open: open, onClose: handleClose },
6302
- React__default["default"].createElement(material.MenuItem, { onClick: handleDelete },
6303
- React__default["default"].createElement(material.ListItemIcon, null,
6304
- React__default["default"].createElement(DeleteIcon__default["default"], { fontSize: "small" })),
6305
- React__default["default"].createElement(material.Typography, { variant: "inherit" }, "Delete")),
6306
- React__default["default"].createElement(material.MenuItem, { onClick: handleEdit },
6307
- React__default["default"].createElement(material.ListItemIcon, null,
6308
- React__default["default"].createElement(EditIcon__default["default"], { fontSize: "small" })),
6309
- React__default["default"].createElement(material.Typography, { variant: "inherit" }, "Edit")))));
5962
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs(material.List, { className: classes.list, children: [mobx.entries(attributes).map(([key, values]) => {
5963
+ const AttributeEditor = pluginManager.evaluateExtensionPoint('Apollo-AttributeEditorComponent', DefaultAttributeEditor, { key });
5964
+ const AttributeViewer = pluginManager.evaluateExtensionPoint('Apollo-AttributeViewerComponent', DefaultAttributeViewer, { key });
5965
+ return (jsxRuntime.jsx(material.ListItem, { secondaryAction: editable && !editingKey ? (jsxRuntime.jsx(material.IconButton, { edge: "end", onClick: (event) => {
5966
+ handleListMenuClick(event, key);
5967
+ }, children: jsxRuntime.jsx(MoreHorizIcon, {}) })) : null, children: jsxRuntime.jsx(material.ListItemText, { disableTypography: true, primary: jsxRuntime.jsx(AttributeKey, { attributeKey: key }), secondary: editingKey === key ? (jsxRuntime.jsx(AttributeEditor, { session: session, attributeValues: values, setAttribute: (newValues) => {
5968
+ setEditingKey(null);
5969
+ if (newValues) {
5970
+ modifyFeatureAttribute(key, newValues);
5971
+ }
5972
+ } })) : (jsxRuntime.jsx(AttributeViewer, { values: values })) }) }, key));
5973
+ }), newKey ? (jsxRuntime.jsx(material.ListItem, { children: jsxRuntime.jsx(material.ListItemText, { disableTypography: true, primary: jsxRuntime.jsx(AttributeKey, { attributeKey: newKey }), secondary: jsxRuntime.jsx(NewKeyAttributeEditor, { session: session, attributeValues: [], setAttribute: (newValues) => {
5974
+ if (newValues) {
5975
+ addFeatureAttribute(newKey, newValues);
5976
+ }
5977
+ setNewKey(undefined);
5978
+ }, isNew: true }) }) })) : null] }), editable ? (jsxRuntime.jsx(material.Button, { color: "primary", variant: "contained", disabled: showAddNewForm || Boolean(newKey), onClick: () => {
5979
+ setShowAddNewForm(true);
5980
+ }, children: "Add new" })) : null, showAddNewForm ? (jsxRuntime.jsx(material.Paper, { variant: "outlined", style: { marginTop: 8 }, children: jsxRuntime.jsx(AttributeKeySelector, { session: session, setKey: (newKey) => {
5981
+ setNewKey(newKey);
5982
+ setShowAddNewForm(false);
5983
+ } }) })) : null, jsxRuntime.jsxs(material.Menu, { anchorEl: anchorEl, open: open, onClose: handleClose, children: [jsxRuntime.jsxs(material.MenuItem, { onClick: handleDelete, children: [jsxRuntime.jsx(material.ListItemIcon, { children: jsxRuntime.jsx(DeleteIcon, { fontSize: "small" }) }), jsxRuntime.jsx(material.Typography, { variant: "inherit", children: "Delete" })] }), jsxRuntime.jsxs(material.MenuItem, { onClick: handleEdit, children: [jsxRuntime.jsx(material.ListItemIcon, { children: jsxRuntime.jsx(EditIcon, { fontSize: "small" }) }), jsxRuntime.jsx(material.Typography, { variant: "inherit", children: "Edit" })] })] })] }));
6310
5984
  });
6311
5985
 
6312
- /* eslint-disable @typescript-eslint/unbound-method */
6313
5986
  const NumberTextField = mobxReact.observer(function NumberTextField({ onChangeCommitted, value: initialValue, ...props }) {
6314
5987
  const [value, setValue] = React.useState(String(initialValue));
6315
5988
  const [blur, setBlur] = React.useState(false);
@@ -6327,7 +6000,7 @@ const NumberTextField = mobxReact.observer(function NumberTextField({ onChangeCo
6327
6000
  setValue(event.target.value);
6328
6001
  }
6329
6002
  const error = Number.isNaN(Number(value));
6330
- return (React__default["default"].createElement(material.TextField, { ...props, type: "text", onChange: onChange, value: value, onKeyDown: (event) => {
6003
+ return (jsxRuntime.jsx(material.TextField, { ...props, type: "text", onChange: onChange, value: value, onKeyDown: (event) => {
6331
6004
  if (event.key === 'Enter') {
6332
6005
  inputNode?.blur();
6333
6006
  }
@@ -6420,24 +6093,11 @@ const BasicInformation = mobxReact.observer(function BasicInformation({ assembly
6420
6093
  }
6421
6094
  return terms;
6422
6095
  }
6423
- return (React__default["default"].createElement("div", { "data-testid": "basic_information" },
6424
- React__default["default"].createElement(NumberTextField, { margin: "dense", id: "start", label: "Start", fullWidth: true, variant: "outlined", value: min + 1, onChangeCommitted: handleStartChange }),
6425
- React__default["default"].createElement(NumberTextField, { margin: "dense", id: "end", label: "End", fullWidth: true, variant: "outlined", value: max, onChangeCommitted: handleEndChange }),
6426
- React__default["default"].createElement(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTerms.bind(null, feature), renderInput: (params) => (React__default["default"].createElement(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true, error: Boolean(typeWarningText), helperText: typeWarningText })), onChange: (oldValue, newValue) => {
6427
- if (newValue) {
6428
- handleTypeChange(newValue).catch(notifyError);
6429
- }
6430
- } }),
6431
- React__default["default"].createElement("label", null,
6432
- React__default["default"].createElement("input", { type: "radio", value: "1", checked: strand === 1, onChange: handleStrandChange }),
6433
- "Positive Strand (+)"),
6434
- React__default["default"].createElement("label", null,
6435
- React__default["default"].createElement("input", { type: "radio", value: "-1", checked: strand === -1, onChange: handleStrandChange }),
6436
- "Negative Strand (-)"),
6437
- React__default["default"].createElement("label", null,
6438
- React__default["default"].createElement("input", { type: "radio", value: "", checked: strand === undefined, onChange: handleStrandChange }),
6439
- "No Strand Information"),
6440
- errorMessage ? (React__default["default"].createElement(material.Typography, { color: "error" }, errorMessage)) : null));
6096
+ return (jsxRuntime.jsxs("div", { "data-testid": "basic_information", children: [jsxRuntime.jsx(NumberTextField, { margin: "dense", id: "start", label: "Start", fullWidth: true, variant: "outlined", value: min + 1, onChangeCommitted: handleStartChange }), jsxRuntime.jsx(NumberTextField, { margin: "dense", id: "end", label: "End", fullWidth: true, variant: "outlined", value: max, onChangeCommitted: handleEndChange }), jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTerms.bind(null, feature), renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Type", variant: "outlined", fullWidth: true, error: Boolean(typeWarningText), helperText: typeWarningText })), onChange: (oldValue, newValue) => {
6097
+ if (newValue) {
6098
+ handleTypeChange(newValue).catch(notifyError);
6099
+ }
6100
+ } }), jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: "radio", value: "1", checked: strand === 1, onChange: handleStrandChange }), "Positive Strand (+)"] }), jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: "radio", value: "-1", checked: strand === -1, onChange: handleStrandChange }), "Negative Strand (-)"] }), jsxRuntime.jsxs("label", { children: [jsxRuntime.jsx("input", { type: "radio", value: "", checked: strand === undefined, onChange: handleStrandChange }), "No Strand Information"] }), errorMessage ? (jsxRuntime.jsx(material.Typography, { color: "error", children: errorMessage })) : null] }));
6441
6101
  });
6442
6102
 
6443
6103
  const FeatureDetailsNavigation = mobxReact.observer(function FeatureDetailsNavigation(props) {
@@ -6452,42 +6112,19 @@ const FeatureDetailsNavigation = mobxReact.observer(function FeatureDetailsNavig
6452
6112
  if (!(parent ?? childFeatures.length > 0)) {
6453
6113
  return null;
6454
6114
  }
6455
- return (React__default["default"].createElement("div", { style: { marginTop: 10 } },
6456
- parent && (React__default["default"].createElement("div", null,
6457
- React__default["default"].createElement(material.Typography, { variant: "h6" }, "Parent:"),
6458
- React__default["default"].createElement(material.Button, { variant: "contained", onClick: () => {
6459
- model.setFeature(parent);
6460
- } },
6461
- parent.type,
6462
- getFeatureNameOrId$1(parent),
6463
- " (",
6464
- parent.min,
6465
- "..",
6466
- parent.max,
6467
- ")"))),
6468
- childFeatures.length > 0 && (React__default["default"].createElement("div", null,
6469
- React__default["default"].createElement(material.Typography, { variant: "h6" },
6470
- childFeatures.length === 1 ? 'Child' : 'Children',
6471
- ":"),
6472
- childFeatures.map((child) => (React__default["default"].createElement("div", { key: child._id, style: { marginBottom: 5 } },
6473
- React__default["default"].createElement(material.Button, { variant: "contained", onClick: () => {
6474
- model.setFeature(child);
6475
- } },
6476
- child.type,
6477
- getFeatureNameOrId$1(child),
6478
- " (",
6479
- child.min,
6480
- "..",
6481
- child.max,
6482
- ")"))))))));
6115
+ return (jsxRuntime.jsxs("div", { style: { marginTop: 10 }, children: [parent && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx(material.Typography, { variant: "h6", children: "Parent:" }), jsxRuntime.jsxs(material.Button, { variant: "contained", onClick: () => {
6116
+ model.setFeature(parent);
6117
+ }, children: [parent.type, getFeatureNameOrId$1(parent), " (", parent.min, "..", parent.max, ")"] })] })), childFeatures.length > 0 && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs(material.Typography, { variant: "h6", children: [childFeatures.length === 1 ? 'Child' : 'Children', ":"] }), childFeatures.map((child) => (jsxRuntime.jsx("div", { style: { marginBottom: 5 }, children: jsxRuntime.jsxs(material.Button, { variant: "contained", onClick: () => {
6118
+ model.setFeature(child);
6119
+ }, children: [child.type, getFeatureNameOrId$1(child), " (", child.min, "..", child.max, ")"] }) }, child._id)))] }))] }));
6483
6120
  });
6484
6121
 
6485
6122
  function formatSequence(seq, refName, start, end, wrap) {
6486
6123
  const header = `>${refName}:${start + 1}–${end}\n`;
6487
- const body = wrap === undefined ? seq : shared.splitStringIntoChunks(seq, wrap).join('\n');
6124
+ const body = seq ;
6488
6125
  return `${header}${body}`;
6489
6126
  }
6490
- const useStyles$9 = mui.makeStyles()({
6127
+ const useStyles$9 = tssReact.makeStyles()({
6491
6128
  sequence: {
6492
6129
  width: '100%',
6493
6130
  resize: 'vertical',
@@ -6513,11 +6150,10 @@ const Sequence = mobxReact.observer(function Sequence({ assembly, feature, refNa
6513
6150
  { assemblyName: assembly, refName, start: min, end: max },
6514
6151
  ]);
6515
6152
  }
6516
- return (React__default["default"].createElement("div", null,
6517
- React__default["default"].createElement("textarea", { readOnly: true, rows: 20, className: classes.sequence, value: sequence })));
6153
+ return (jsxRuntime.jsx("div", { children: jsxRuntime.jsx("textarea", { readOnly: true, rows: 20, className: classes.sequence, value: sequence }) }));
6518
6154
  });
6519
6155
 
6520
- const useStyles$8 = mui.makeStyles()((theme) => ({
6156
+ const useStyles$8 = tssReact.makeStyles()((theme) => ({
6521
6157
  root: {
6522
6158
  padding: theme.spacing(2),
6523
6159
  },
@@ -6554,31 +6190,17 @@ const ApolloFeatureDetailsWidget = mobxReact.observer(function ApolloFeatureDeta
6554
6190
  setPanelState(panelState.filter((p) => p !== panel));
6555
6191
  }
6556
6192
  }
6557
- return (React__default["default"].createElement("div", { className: classes.root },
6558
- React__default["default"].createElement(BasicInformation, { feature: feature, session: session, assembly: currentAssembly._id }),
6559
- React__default["default"].createElement(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('attributes'), onChange: (e, expanded) => {
6560
- handlePanelChange(expanded, 'attributes');
6561
- } },
6562
- React__default["default"].createElement(material.AccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header" },
6563
- React__default["default"].createElement(material.Typography, { component: "span" }, "Attributes")),
6564
- React__default["default"].createElement(material.AccordionDetails, null,
6565
- React__default["default"].createElement(Attributes, { feature: feature, session: session, assembly: currentAssembly._id, editable: true }))),
6566
- React__default["default"].createElement(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
6567
- handlePanelChange(expanded, 'sequence');
6568
- } },
6569
- React__default["default"].createElement(material.AccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header" },
6570
- React__default["default"].createElement(material.Typography, { component: "span" }, "Sequence")),
6571
- React__default["default"].createElement(material.AccordionDetails, null, panelState.includes('sequence') && (React__default["default"].createElement(Sequence, { feature: feature, session: session, assembly: currentAssembly._id, refName: refName })))),
6572
- React__default["default"].createElement(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('related_features'), onChange: (e, expanded) => {
6573
- handlePanelChange(expanded, 'related_features');
6574
- } },
6575
- React__default["default"].createElement(material.AccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header" },
6576
- React__default["default"].createElement(material.Typography, { component: "span" }, "Related features")),
6577
- React__default["default"].createElement(material.AccordionDetails, null,
6578
- React__default["default"].createElement(FeatureDetailsNavigation, { model: model, feature: feature })))));
6193
+ return (jsxRuntime.jsxs("div", { className: classes.root, children: [jsxRuntime.jsx(BasicInformation, { feature: feature, session: session, assembly: currentAssembly._id }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('attributes'), onChange: (e, expanded) => {
6194
+ handlePanelChange(expanded, 'attributes');
6195
+ }, children: [jsxRuntime.jsx(material.AccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "Attributes" }) }), jsxRuntime.jsx(material.AccordionDetails, { children: jsxRuntime.jsx(Attributes, { feature: feature, session: session, assembly: currentAssembly._id, editable: true }) })] }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
6196
+ handlePanelChange(expanded, 'sequence');
6197
+ }, children: [jsxRuntime.jsx(material.AccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "Sequence" }) }), jsxRuntime.jsx(material.AccordionDetails, { children: panelState.includes('sequence') && (jsxRuntime.jsx(Sequence, { feature: feature, session: session, assembly: currentAssembly._id, refName: refName })) })] }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 10 }, expanded: panelState.includes('related_features'), onChange: (e, expanded) => {
6198
+ handlePanelChange(expanded, 'related_features');
6199
+ }, children: [jsxRuntime.jsx(material.AccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header", children: jsxRuntime.jsx(material.Typography, { component: "span", children: "Related features" }) }), jsxRuntime.jsx(material.AccordionDetails, { children: jsxRuntime.jsx(FeatureDetailsNavigation, { model: model, feature: feature }) })] })] }));
6579
6200
  });
6580
6201
 
6581
6202
  /* eslint-disable @typescript-eslint/no-unsafe-call */
6203
+ /* eslint-disable @typescript-eslint/no-unnecessary-condition */
6582
6204
  const ApolloFeatureDetailsWidgetModel = mobxStateTree.types
6583
6205
  .model('ApolloFeatureDetailsWidget', {
6584
6206
  id: mst.ElementId,
@@ -6888,41 +6510,27 @@ const TranscriptSequence = mobxReact.observer(function TranscriptSequence({ asse
6888
6510
  segment.sequence.slice(0, sequenceWrapLength - lastLineLength);
6889
6511
  const remainingLines = shared.splitStringIntoChunks(segment.sequence.slice(firstLine.length), sequenceWrapLength);
6890
6512
  const printLines = [firstLine, ...remainingLines];
6891
- const span = (React__default["default"].createElement("span", { key: `${segment.type}-${index}`, style: {
6513
+ const span = (jsxRuntime.jsx("span", { style: {
6892
6514
  background: getSegmentColor(segment.type),
6893
6515
  color: theme.palette.getContrastText(getSegmentColor(segment.type)),
6894
6516
  whiteSpace: 'pre-line',
6895
- } }, printLines.join('\n')));
6517
+ }, children: printLines.join('\n') }, `${segment.type}-${index}`));
6896
6518
  seqElements.push(span);
6897
6519
  }
6898
6520
  return seqElements;
6899
6521
  }
6900
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
6901
- React__default["default"].createElement(material.Select, { defaultValue: "genomic", value: selectedOption, onChange: handleChangeSeqOption, size: "small", "data-testid": "sequenceOptionSelector" }, sequenceOptions.map((option) => (React__default["default"].createElement(material.MenuItem, { key: option, value: option, "data-testid": `sequenceOption-${option}` }, option)))),
6902
- React__default["default"].createElement(material.Button, { variant: "contained", onClick: onCopyClick, style: { marginLeft: 10 }, size: "medium" }, "Copy sequence"),
6903
- React__default["default"].createElement(material.Paper, { style: {
6904
- fontFamily: 'monospace',
6905
- padding: theme.spacing(),
6906
- overflowX: 'auto',
6907
- }, ref: seqRef },
6908
- ">",
6909
- refSeq.name,
6910
- ":",
6911
- locationIntervals
6912
- .map((interval) => feature.strand === 1
6913
- ? `${interval.min + 1}-${interval.max}`
6914
- : `${interval.max}-${interval.min + 1}`)
6915
- .join(';'),
6916
- "(strand=",
6917
- feature.strand === 1 ? '+' : '-',
6918
- ";length=",
6919
- getSequenceLength(sequenceSegments),
6920
- ")",
6921
- React__default["default"].createElement("br", null),
6922
- wrapSequence(sequenceSegments, SEQUENCE_WRAP_LENGTH))));
6522
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(material.Select, { defaultValue: "genomic", value: selectedOption, onChange: handleChangeSeqOption, size: "small", "data-testid": "sequenceOptionSelector", children: sequenceOptions.map((option) => (jsxRuntime.jsx(material.MenuItem, { value: option, "data-testid": `sequenceOption-${option}`, children: option }, option))) }), jsxRuntime.jsx(material.Button, { variant: "contained", onClick: onCopyClick, style: { marginLeft: 10 }, size: "medium", children: "Copy sequence" }), jsxRuntime.jsxs(material.Paper, { style: {
6523
+ fontFamily: 'monospace',
6524
+ padding: theme.spacing(),
6525
+ overflowX: 'auto',
6526
+ }, ref: seqRef, children: [">", refSeq.name, ":", locationIntervals
6527
+ .map((interval) => feature.strand === 1
6528
+ ? `${interval.min + 1}-${interval.max}`
6529
+ : `${interval.max}-${interval.min + 1}`)
6530
+ .join(';'), "(strand=", feature.strand === 1 ? '+' : '-', ";length=", getSequenceLength(sequenceSegments), ")", jsxRuntime.jsx("br", {}), wrapSequence(sequenceSegments, SEQUENCE_WRAP_LENGTH)] })] }));
6923
6531
  });
6924
6532
 
6925
- const StyledTextField = styled__default["default"](NumberTextField)(() => ({
6533
+ const StyledTextField = styled(NumberTextField)(() => ({
6926
6534
  '&.MuiFormControl-root': {
6927
6535
  marginTop: 0,
6928
6536
  marginBottom: 0,
@@ -6935,7 +6543,7 @@ const StyledTextField = styled__default["default"](NumberTextField)(() => ({
6935
6543
  paddingLeft: 10,
6936
6544
  },
6937
6545
  }));
6938
- const SequenceContainer = styled__default["default"]('div')({
6546
+ const SequenceContainer = styled('div')({
6939
6547
  display: 'flex',
6940
6548
  justifyContent: 'center',
6941
6549
  alignItems: 'center',
@@ -6950,7 +6558,7 @@ const SequenceContainer = styled__default["default"]('div')({
6950
6558
  });
6951
6559
  const Strand = (props) => {
6952
6560
  const { strand } = props;
6953
- return (React__default["default"].createElement("div", null, strand === 1 ? (React__default["default"].createElement(AddIcon__default["default"], null)) : strand === -1 ? (React__default["default"].createElement(RemoveIcon__default["default"], null)) : (React__default["default"].createElement(material.Typography, { component: 'span' }, "N/A"))));
6561
+ return (jsxRuntime.jsx("div", { children: strand === 1 ? (jsxRuntime.jsx(AddIcon, {})) : strand === -1 ? (jsxRuntime.jsx(RemoveIcon, {})) : (jsxRuntime.jsx(material.Typography, { component: 'span', children: "N/A" })) }));
6954
6562
  };
6955
6563
  const minMaxExonTranscriptLocation = (transcript, featureTypeOntology) => {
6956
6564
  const { transcriptExonParts } = transcript;
@@ -7414,11 +7022,11 @@ const TranscriptWidgetEditLocation = mobxReact.observer(function TranscriptWidge
7414
7022
  const protein = util.defaultCodonTable[codonSeq] || '&';
7415
7023
  // highlight start codon and stop codons
7416
7024
  if (codonSeq === 'ATG') {
7417
- elements.push(React__default["default"].createElement(material.Typography, { component: 'span', style: {
7025
+ elements.push(jsxRuntime.jsx(material.Typography, { component: 'span', style: {
7418
7026
  backgroundColor: changeInProgress ? 'lightgray' : 'yellow',
7419
7027
  cursor: 'pointer',
7420
7028
  border: '1px solid black',
7421
- }, key: codonGenomicPos, onClick: () => {
7029
+ }, onClick: () => {
7422
7030
  if (changeInProgress) {
7423
7031
  return;
7424
7032
  }
@@ -7432,17 +7040,15 @@ const TranscriptWidgetEditLocation = mobxReact.observer(function TranscriptWidge
7432
7040
  if (startCodonGenomicLocation !== cdsMax && strand === -1) {
7433
7041
  updateCDSLocation(cdsMax, startCodonGenomicLocation, feature, false);
7434
7042
  }
7435
- } }, protein));
7043
+ }, children: protein }, codonGenomicPos));
7436
7044
  }
7437
7045
  else if (['TAA', 'TAG', 'TGA'].includes(codonSeq)) {
7438
- elements.push(React__default["default"].createElement(material.Typography, { style: { backgroundColor: 'red', color: 'white' }, component: 'span',
7439
- // Pass the codonGenomicPos as the key to maintain the genomic position of the codon
7440
- key: codonGenomicPos }, protein));
7046
+ elements.push(jsxRuntime.jsx(material.Typography, { style: { backgroundColor: 'red', color: 'white' }, component: 'span', children: protein }, codonGenomicPos));
7441
7047
  }
7442
7048
  else {
7443
7049
  elements.push(
7444
7050
  // Pass the codonGenomicPos as the key to maintain the genomic position of the codon
7445
- React__default["default"].createElement(material.Typography, { component: 'span', key: codonGenomicPos }, protein));
7051
+ jsxRuntime.jsx(material.Typography, { component: 'span', children: protein }, codonGenomicPos));
7446
7052
  }
7447
7053
  }
7448
7054
  return elements;
@@ -7573,108 +7179,51 @@ const TranscriptWidgetEditLocation = mobxReact.observer(function TranscriptWidge
7573
7179
  }
7574
7180
  void copyToClipboard(seqDiv);
7575
7181
  };
7576
- return (React__default["default"].createElement("div", null,
7577
- cdsPresent && (React__default["default"].createElement("div", null,
7578
- React__default["default"].createElement(material.Accordion, null,
7579
- React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header" },
7580
- React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' }, "Translation")),
7581
- React__default["default"].createElement(material.AccordionDetails, null,
7582
- React__default["default"].createElement(SequenceContainer, null,
7583
- React__default["default"].createElement(material.Typography, { component: 'span', ref: seqRef, style: { maxHeight: 120, overflowY: 'scroll' } }, getTranslationSequence())),
7584
- React__default["default"].createElement("div", { style: {
7585
- marginTop: 10,
7586
- display: 'flex',
7587
- flexDirection: 'row',
7588
- alignItems: 'center',
7589
- gap: 10,
7590
- } },
7591
- React__default["default"].createElement(material.Tooltip, { title: "Copy" },
7592
- React__default["default"].createElement("button", { onClick: onCopyClick, style: { border: 'none', background: 'none', padding: 0 }, disabled: changeInProgress },
7593
- React__default["default"].createElement(ContentCopyIcon__default["default"], { style: { fontSize: 15 } }))),
7594
- React__default["default"].createElement(material.Tooltip, { title: "Trim" },
7595
- React__default["default"].createElement("button", { onClick: trimTranslationSequence, style: { border: 'none', background: 'none', padding: 0 }, disabled: changeInProgress },
7596
- React__default["default"].createElement(ContentCutIcon__default["default"], { style: { fontSize: 15 } })))))),
7597
- React__default["default"].createElement(material.Grid, { container: true, justifyContent: "center", alignItems: "center", style: { textAlign: 'center', marginTop: 10 } },
7598
- React__default["default"].createElement(material.Grid, { size: 1 }),
7599
- strand === 1 ? (React__default["default"].createElement(material.Grid, { size: 4 },
7600
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMin + 1, onChangeCommitted: (newLocation) => {
7601
- return updateCDSLocation(cdsMin, newLocation - 1, feature, true);
7602
- }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }))) : (React__default["default"].createElement(material.Grid, { size: 4 },
7603
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
7604
- return updateCDSLocation(cdsMax, newLocation, feature, false);
7605
- }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }))),
7606
- React__default["default"].createElement(material.Grid, { size: 2 },
7607
- React__default["default"].createElement(material.Typography, { component: 'span' }, "CDS")),
7608
- strand === 1 ? (React__default["default"].createElement(material.Grid, { size: 4 },
7609
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
7610
- return updateCDSLocation(cdsMax, newLocation, feature, false);
7611
- }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }))) : (React__default["default"].createElement(material.Grid, { size: 4 },
7612
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMin + 1, onChangeCommitted: (newLocation) => {
7613
- return updateCDSLocation(cdsMin, newLocation - 1, feature, true);
7614
- }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }))),
7615
- React__default["default"].createElement(material.Grid, { size: 1 })))),
7616
- React__default["default"].createElement("div", { style: { marginTop: 5 } }, transcriptExonParts.map((loc, index) => {
7617
- return (React__default["default"].createElement("div", { key: index }, loc.type === 'exon' && (React__default["default"].createElement(material.Grid, { container: true, justifyContent: "center", alignItems: "center", style: { textAlign: 'center' } },
7618
- React__default["default"].createElement(material.Grid, { size: 1 }, index !== 0 &&
7619
- getFivePrimeSpliceSite(loc, index).map((site, idx) => (React__default["default"].createElement(material.Typography, { key: idx, component: 'span', color: site.color }, site.spliceSite)))),
7620
- strand === 1 ? (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
7621
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
7622
- return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
7623
- }, disabled: changeInProgress }))) : (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
7624
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
7625
- return handleExonLocationChange(loc.max, newLocation, feature, false);
7626
- }, disabled: changeInProgress }))),
7627
- React__default["default"].createElement(material.Grid, { size: 2 },
7628
- React__default["default"].createElement(Strand, { strand: feature.strand })),
7629
- strand === 1 ? (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
7630
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
7631
- return handleExonLocationChange(loc.max, newLocation, feature, false);
7632
- }, disabled: changeInProgress }))) : (React__default["default"].createElement(material.Grid, { size: 4, style: { padding: 0 } },
7633
- React__default["default"].createElement(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
7634
- return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
7635
- }, disabled: changeInProgress }))),
7636
- React__default["default"].createElement(material.Grid, { size: 1 }, index !== transcriptExonParts.length - 1 &&
7637
- getThreePrimeSpliceSite(loc, index).map((site, idx) => (React__default["default"].createElement(material.Typography, { key: idx, component: 'span', color: site.color }, site.spliceSite))))))));
7638
- }))));
7182
+ return (jsxRuntime.jsxs("div", { children: [cdsPresent && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs(material.Accordion, { children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Translation" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(SequenceContainer, { children: jsxRuntime.jsx(material.Typography, { component: 'span', ref: seqRef, style: { maxHeight: 120, overflowY: 'scroll' }, children: getTranslationSequence() }) }), jsxRuntime.jsxs("div", { style: {
7183
+ marginTop: 10,
7184
+ display: 'flex',
7185
+ flexDirection: 'row',
7186
+ alignItems: 'center',
7187
+ gap: 10,
7188
+ }, children: [jsxRuntime.jsx(material.Tooltip, { title: "Copy", children: jsxRuntime.jsx("button", { onClick: onCopyClick, style: { border: 'none', background: 'none', padding: 0 }, disabled: changeInProgress, children: jsxRuntime.jsx(ContentCopyIcon, { style: { fontSize: 15 } }) }) }), jsxRuntime.jsx(material.Tooltip, { title: "Trim", children: jsxRuntime.jsx("button", { onClick: trimTranslationSequence, style: { border: 'none', background: 'none', padding: 0 }, disabled: changeInProgress, children: jsxRuntime.jsx(ContentCutIcon, { style: { fontSize: 15 } }) }) })] })] })] }), jsxRuntime.jsxs(material.Grid, { container: true, justifyContent: "center", alignItems: "center", style: { textAlign: 'center', marginTop: 10 }, children: [jsxRuntime.jsx(material.Grid, { size: 1 }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMin + 1, onChangeCommitted: (newLocation) => {
7189
+ return updateCDSLocation(cdsMin, newLocation - 1, feature, true);
7190
+ }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
7191
+ return updateCDSLocation(cdsMax, newLocation, feature, false);
7192
+ }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 2, children: jsxRuntime.jsx(material.Typography, { component: 'span', children: "CDS" }) }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMax, onChangeCommitted: (newLocation) => {
7193
+ return updateCDSLocation(cdsMax, newLocation, feature, false);
7194
+ }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: cdsMin + 1, onChangeCommitted: (newLocation) => {
7195
+ return updateCDSLocation(cdsMin, newLocation - 1, feature, true);
7196
+ }, style: { border: '1px solid black', borderRadius: 5 }, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 1 })] })] })), jsxRuntime.jsx("div", { style: { marginTop: 5 }, children: transcriptExonParts.map((loc, index) => {
7197
+ return (jsxRuntime.jsx("div", { children: loc.type === 'exon' && (jsxRuntime.jsxs(material.Grid, { container: true, justifyContent: "center", alignItems: "center", style: { textAlign: 'center' }, children: [jsxRuntime.jsx(material.Grid, { size: 1, children: index !== 0 &&
7198
+ getFivePrimeSpliceSite(loc, index).map((site, idx) => (jsxRuntime.jsx(material.Typography, { component: 'span', color: site.color, children: site.spliceSite }, idx))) }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
7199
+ return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
7200
+ }, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
7201
+ return handleExonLocationChange(loc.max, newLocation, feature, false);
7202
+ }, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 2, children: jsxRuntime.jsx(Strand, { strand: feature.strand }) }), strand === 1 ? (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.max, onChangeCommitted: (newLocation) => {
7203
+ return handleExonLocationChange(loc.max, newLocation, feature, false);
7204
+ }, disabled: changeInProgress }) })) : (jsxRuntime.jsx(material.Grid, { size: 4, style: { padding: 0 }, children: jsxRuntime.jsx(StyledTextField, { margin: "dense", variant: "outlined", value: loc.min + 1, onChangeCommitted: (newLocation) => {
7205
+ return handleExonLocationChange(loc.min, newLocation - 1, feature, true);
7206
+ }, disabled: changeInProgress }) })), jsxRuntime.jsx(material.Grid, { size: 1, children: index !== transcriptExonParts.length - 1 &&
7207
+ getThreePrimeSpliceSite(loc, index).map((site, idx) => (jsxRuntime.jsx(material.Typography, { component: 'span', color: site.color, children: site.spliceSite }, idx))) })] })) }, index));
7208
+ }) })] }));
7639
7209
  });
7640
7210
 
7641
- const HeaderTableCell = styled__default["default"](material.TableCell)(() => ({
7211
+ const HeaderTableCell = styled(material.TableCell)(() => ({
7642
7212
  fontWeight: 'bold',
7643
7213
  }));
7644
7214
  const TranscriptWidgetSummary = mobxReact.observer(function TranscriptWidgetSummary(props) {
7645
7215
  const { feature } = props;
7646
7216
  const name = getFeatureName$1(feature);
7647
7217
  const id = getFeatureId$1(feature);
7648
- return (React__default["default"].createElement(material.Table, { size: "small", sx: { fontSize: '0.75rem', '& .MuiTableCell-root': { padding: '4px' } } },
7649
- React__default["default"].createElement(material.TableBody, null,
7650
- name !== '' && (React__default["default"].createElement(material.TableRow, null,
7651
- React__default["default"].createElement(HeaderTableCell, null, "Name"),
7652
- React__default["default"].createElement(material.TableCell, null, getFeatureName$1(feature)))),
7653
- id !== '' && (React__default["default"].createElement(material.TableRow, null,
7654
- React__default["default"].createElement(HeaderTableCell, null, "ID"),
7655
- React__default["default"].createElement(material.TableCell, null, getFeatureId$1(feature)))),
7656
- React__default["default"].createElement(material.TableRow, null,
7657
- React__default["default"].createElement(HeaderTableCell, null, "Type"),
7658
- React__default["default"].createElement(material.TableCell, null, feature.type)),
7659
- React__default["default"].createElement(material.TableRow, null,
7660
- React__default["default"].createElement(HeaderTableCell, null, "Location"),
7661
- React__default["default"].createElement(material.TableCell, null,
7662
- props.refName,
7663
- ":",
7664
- feature.min,
7665
- "..",
7666
- feature.max)),
7667
- React__default["default"].createElement(material.TableRow, null,
7668
- React__default["default"].createElement(HeaderTableCell, null, "Strand"),
7669
- React__default["default"].createElement(material.TableCell, null, getStrand(feature.strand))))));
7218
+ return (jsxRuntime.jsx(material.Table, { size: "small", sx: { fontSize: '0.75rem', '& .MuiTableCell-root': { padding: '4px' } }, children: jsxRuntime.jsxs(material.TableBody, { children: [name !== '' && (jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Name" }), jsxRuntime.jsx(material.TableCell, { children: getFeatureName$1(feature) })] })), id !== '' && (jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "ID" }), jsxRuntime.jsx(material.TableCell, { children: getFeatureId$1(feature) })] })), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Type" }), jsxRuntime.jsx(material.TableCell, { children: feature.type })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Location" }), jsxRuntime.jsxs(material.TableCell, { children: [props.refName, ":", feature.min, "..", feature.max] })] }), jsxRuntime.jsxs(material.TableRow, { children: [jsxRuntime.jsx(HeaderTableCell, { children: "Strand" }), jsxRuntime.jsx(material.TableCell, { children: getStrand(feature.strand) })] })] }) }));
7670
7219
  });
7671
7220
 
7672
- const useStyles$7 = mui.makeStyles()((theme) => ({
7221
+ const useStyles$7 = tssReact.makeStyles()((theme) => ({
7673
7222
  root: {
7674
7223
  padding: theme.spacing(2),
7675
7224
  },
7676
7225
  }));
7677
- const StyledAccordionSummary = styled__default["default"](material.AccordionSummary)(() => ({
7226
+ const StyledAccordionSummary = styled(material.AccordionSummary)(() => ({
7678
7227
  minHeight: 30,
7679
7228
  maxHeight: 30,
7680
7229
  '&.Mui-expanded': {
@@ -7733,48 +7282,15 @@ const ApolloTranscriptDetailsWidget = mobxReact.observer(function ApolloTranscri
7733
7282
  const CustomComponentAfterAttributes = pluginManager.evaluateExtensionPoint('Apollo-TranscriptDetailsCustomComponent-AfterAttributes', NoOpCustomComponent, { feature, session });
7734
7283
  const CustomComponentInsideSequence = pluginManager.evaluateExtensionPoint('Apollo-TranscriptDetailsCustomComponent-InsideSequence', NoOpCustomComponent, { feature, session });
7735
7284
  const CustomComponentAfterSequence = pluginManager.evaluateExtensionPoint('Apollo-TranscriptDetailsCustomComponent-AfterSequence', NoOpCustomComponent, { feature, session });
7736
- return (React__default["default"].createElement("div", { className: classes.root },
7737
- React__default["default"].createElement(material.Accordion, { expanded: panelState.includes('summary'), onChange: (e, expanded) => {
7738
- handlePanelChange(expanded, 'summary');
7739
- } },
7740
- React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header" },
7741
- React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' }, "Summary")),
7742
- React__default["default"].createElement(material.AccordionDetails, null,
7743
- React__default["default"].createElement(TranscriptWidgetSummary, { feature: feature, refName: refName }),
7744
- React__default["default"].createElement(CustomComponentInsideSummary, { session: session, feature: feature }))),
7745
- React__default["default"].createElement(CustomComponentAfterSummary, { session: session, feature: feature }),
7746
- React__default["default"].createElement(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('location'), onChange: (e, expanded) => {
7747
- handlePanelChange(expanded, 'location');
7748
- } },
7749
- React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header" },
7750
- React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' }, "Location")),
7751
- React__default["default"].createElement(material.AccordionDetails, null,
7752
- React__default["default"].createElement(TranscriptWidgetEditLocation, { feature: feature, refName: refName, session: apolloSession, assembly: currentAssembly._id || '' }),
7753
- React__default["default"].createElement(CustomComponentInsideLocation, { session: session, feature: feature }))),
7754
- React__default["default"].createElement(CustomComponentAfterLocation, { session: session, feature: feature }),
7755
- React__default["default"].createElement(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('attrs'), onChange: (e, expanded) => {
7756
- handlePanelChange(expanded, 'attrs');
7757
- } },
7758
- React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header" },
7759
- React__default["default"].createElement("div", { style: { display: 'flex', alignItems: 'center' } },
7760
- React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' },
7761
- "Attributes",
7762
- ' '),
7763
- React__default["default"].createElement(material.Tooltip, { title: "Separate multiple values for the attribute with commas" },
7764
- React__default["default"].createElement(InfoIcon__default["default"], { style: { color: 'white', fontSize: 15, marginLeft: 10 } })))),
7765
- React__default["default"].createElement(material.AccordionDetails, null,
7766
- React__default["default"].createElement(Attributes, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', editable: editable }),
7767
- React__default["default"].createElement(CustomComponentInsideAttributes, { session: session, feature: feature }))),
7768
- React__default["default"].createElement(CustomComponentAfterAttributes, { session: session, feature: feature }),
7769
- React__default["default"].createElement(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
7770
- handlePanelChange(expanded, 'sequence');
7771
- } },
7772
- React__default["default"].createElement(StyledAccordionSummary, { expandIcon: React__default["default"].createElement(ExpandMoreIcon__default["default"], { style: { color: 'white' } }), "aria-controls": "panel4-content", id: "panel4-header" },
7773
- React__default["default"].createElement(material.Typography, { component: "span", fontWeight: 'bold' }, "Sequence")),
7774
- React__default["default"].createElement(material.AccordionDetails, null,
7775
- panelState.includes('sequence') && (React__default["default"].createElement(TranscriptSequence, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', refName: refName })),
7776
- React__default["default"].createElement(CustomComponentInsideSequence, { session: session, feature: feature }))),
7777
- React__default["default"].createElement(CustomComponentAfterSequence, { feature: feature, session: session })));
7285
+ return (jsxRuntime.jsxs("div", { className: classes.root, children: [jsxRuntime.jsxs(material.Accordion, { expanded: panelState.includes('summary'), onChange: (e, expanded) => {
7286
+ handlePanelChange(expanded, 'summary');
7287
+ }, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel1-content", id: "panel1-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Summary" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(TranscriptWidgetSummary, { feature: feature, refName: refName }), jsxRuntime.jsx(CustomComponentInsideSummary, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterSummary, { session: session, feature: feature }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('location'), onChange: (e, expanded) => {
7288
+ handlePanelChange(expanded, 'location');
7289
+ }, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel2-content", id: "panel2-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Location" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(TranscriptWidgetEditLocation, { feature: feature, refName: refName, session: apolloSession, assembly: currentAssembly._id || '' }), jsxRuntime.jsx(CustomComponentInsideLocation, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterLocation, { session: session, feature: feature }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('attrs'), onChange: (e, expanded) => {
7290
+ handlePanelChange(expanded, 'attrs');
7291
+ }, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel3-content", id: "panel3-header", children: jsxRuntime.jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [jsxRuntime.jsxs(material.Typography, { component: "span", fontWeight: 'bold', children: ["Attributes", ' '] }), jsxRuntime.jsx(material.Tooltip, { title: "Separate multiple values for the attribute with commas", children: jsxRuntime.jsx(InfoIcon, { style: { color: 'white', fontSize: 15, marginLeft: 10 } }) })] }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [jsxRuntime.jsx(Attributes, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', editable: editable }), jsxRuntime.jsx(CustomComponentInsideAttributes, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterAttributes, { session: session, feature: feature }), jsxRuntime.jsxs(material.Accordion, { style: { marginTop: 5 }, expanded: panelState.includes('sequence'), onChange: (e, expanded) => {
7292
+ handlePanelChange(expanded, 'sequence');
7293
+ }, children: [jsxRuntime.jsx(StyledAccordionSummary, { expandIcon: jsxRuntime.jsx(ExpandMoreIcon, { style: { color: 'white' } }), "aria-controls": "panel4-content", id: "panel4-header", children: jsxRuntime.jsx(material.Typography, { component: "span", fontWeight: 'bold', children: "Sequence" }) }), jsxRuntime.jsxs(material.AccordionDetails, { children: [panelState.includes('sequence') && (jsxRuntime.jsx(TranscriptSequence, { feature: feature, session: apolloSession, assembly: currentAssembly._id || '', refName: refName })), jsxRuntime.jsx(CustomComponentInsideSequence, { session: session, feature: feature })] })] }), jsxRuntime.jsx(CustomComponentAfterSequence, { feature: feature, session: session })] }));
7778
7294
  });
7779
7295
 
7780
7296
  const configSchema$2 = configuration.ConfigurationSchema('LinearApolloDisplay', {}, { explicitIdentifier: 'displayId', explicitlyTyped: true });
@@ -7816,7 +7332,7 @@ function handleFeatureEndChange(changeManager, feature, oldEnd, newEnd) {
7816
7332
  return changeManager.submit(change);
7817
7333
  }
7818
7334
 
7819
- const useStyles$6 = mui.makeStyles()({
7335
+ const useStyles$6 = tssReact.makeStyles()({
7820
7336
  highlighted: {
7821
7337
  background: 'orange',
7822
7338
  },
@@ -7824,19 +7340,17 @@ const useStyles$6 = mui.makeStyles()({
7824
7340
  const Highlight = ({ highlight, text, }) => {
7825
7341
  const { classes } = useStyles$6();
7826
7342
  if (!highlight) {
7827
- return React__default["default"].createElement(React__default["default"].Fragment, null, text);
7343
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
7828
7344
  }
7829
7345
  const split = text.split(highlight);
7830
7346
  if (split.length === 1) {
7831
- return React__default["default"].createElement(React__default["default"].Fragment, null, text);
7347
+ return jsxRuntime.jsx(jsxRuntime.Fragment, { children: text });
7832
7348
  }
7833
7349
  const highlighted = [];
7834
7350
  for (let i = 0; i < split.length - 1; i++) {
7835
- highlighted.push(split[i], React__default["default"].createElement("span", { className: classes.highlighted }, highlight));
7351
+ highlighted.push(split[i], jsxRuntime.jsx("span", { className: classes.highlighted, children: highlight }));
7836
7352
  }
7837
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
7838
- highlighted,
7839
- split.at(-1)));
7353
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [highlighted, split.at(-1)] }));
7840
7354
  };
7841
7355
 
7842
7356
  const FeatureAttributes = mobxReact.observer(function FeatureAttributes({ feature, filterText, }) {
@@ -7855,11 +7369,10 @@ const FeatureAttributes = mobxReact.observer(function FeatureAttributes({ featur
7855
7369
  .filter(([key]) => key) // Leave empty keys off
7856
7370
  .map(([key, values]) => `${key}=${Array.isArray(values) ? values.join(', ') : values}`)
7857
7371
  .join(', ');
7858
- return React__default["default"].createElement(Highlight, { text: attrString, highlight: filterText });
7372
+ return jsxRuntime.jsx(Highlight, { text: attrString, highlight: filterText });
7859
7373
  });
7860
7374
 
7861
- /* eslint-disable @typescript-eslint/unbound-method */
7862
- const useStyles$5 = mui.makeStyles()((theme) => ({
7375
+ const useStyles$5 = tssReact.makeStyles()((theme) => ({
7863
7376
  inputWrapper: {
7864
7377
  position: 'relative',
7865
7378
  },
@@ -7899,23 +7412,21 @@ const NumberCell = mobxReact.observer(function NumberCell({ initialValue, notify
7899
7412
  setValue(newValue);
7900
7413
  }
7901
7414
  }
7902
- return (React__default["default"].createElement("span", { className: classes.inputWrapper },
7903
- React__default["default"].createElement("span", { className: classes.hiddenWidthSpan, "aria-hidden": true }, value),
7904
- React__default["default"].createElement("input", { type: "text", value: value, className: classes.numberTextInput, onChange: onChange, onKeyDown: (event) => {
7905
- if (event.key === 'Enter') {
7906
- inputNode?.blur();
7907
- }
7908
- else if (event.key === 'Escape') {
7909
- setValue(initialValue);
7910
- setBlur(true);
7911
- }
7912
- }, onBlur: () => {
7913
- if (value !== initialValue) {
7914
- onChangeCommitted(value).catch(notifyError);
7915
- }
7916
- }, ref: (node) => {
7917
- setInputNode(node);
7918
- } })));
7415
+ return (jsxRuntime.jsxs("span", { className: classes.inputWrapper, children: [jsxRuntime.jsx("span", { className: classes.hiddenWidthSpan, "aria-hidden": true, children: value }), jsxRuntime.jsx("input", { type: "text", value: value, className: classes.numberTextInput, onChange: onChange, onKeyDown: (event) => {
7416
+ if (event.key === 'Enter') {
7417
+ inputNode?.blur();
7418
+ }
7419
+ else if (event.key === 'Escape') {
7420
+ setValue(initialValue);
7421
+ setBlur(true);
7422
+ }
7423
+ }, onBlur: () => {
7424
+ if (value !== initialValue) {
7425
+ onChangeCommitted(value).catch(notifyError);
7426
+ }
7427
+ }, ref: (node) => {
7428
+ setInputNode(node);
7429
+ } })] }));
7919
7430
  });
7920
7431
 
7921
7432
  function featureContextMenuItems(feature, region, getAssemblyId, selectedFeature, setSelectedFeature, session, changeManager, filteredTranscripts, updateFilteredTranscripts) {
@@ -8068,6 +7579,24 @@ function featureContextMenuItems(feature, region, getAssemblyId, selectedFeature
8068
7579
  });
8069
7580
  session.showWidget(apolloTranscriptWidget);
8070
7581
  },
7582
+ }, {
7583
+ label: 'Duplicate feature',
7584
+ onClick: () => {
7585
+ session.queueDialog((doneCallback) => [
7586
+ DuplicateTranscript,
7587
+ {
7588
+ session,
7589
+ handleClose: () => {
7590
+ doneCallback();
7591
+ },
7592
+ changeManager,
7593
+ sourceFeature: feature,
7594
+ sourceAssemblyId: currentAssemblyId,
7595
+ selectedFeature,
7596
+ setSelectedFeature,
7597
+ },
7598
+ ]);
7599
+ },
8071
7600
  }, {
8072
7601
  label: 'Visible',
8073
7602
  type: 'checkbox',
@@ -8086,8 +7615,7 @@ function featureContextMenuItems(feature, region, getAssemblyId, selectedFeature
8086
7615
  return menuItems;
8087
7616
  }
8088
7617
 
8089
- /* eslint-disable unicorn/no-nested-ternary */
8090
- const useStyles$4 = mui.makeStyles()((theme) => ({
7618
+ const useStyles$4 = tssReact.makeStyles()((theme) => ({
8091
7619
  typeContent: {
8092
7620
  display: 'inline-block',
8093
7621
  width: '174px',
@@ -8142,70 +7670,55 @@ const Feature = mobxReact.observer(function Feature({ depth, feature, isHovered,
8142
7670
  const notifyError = (e) => {
8143
7671
  session.notify(e.message, 'error');
8144
7672
  };
8145
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
8146
- React__default["default"].createElement("tr", { onMouseEnter: (_e) => {
8147
- displayState.setHoveredFeature({ feature, bp: min });
8148
- }, className: classes.feature +
8149
- (isSelected
8150
- ? ` ${selectedFeatureClass}`
8151
- : isHovered
8152
- ? ` ${classes.hoveredFeature}`
8153
- : ''), onClick: (e) => {
8154
- e.stopPropagation();
8155
- displayState.setSelectedFeature(feature);
8156
- }, onDoubleClick: () => {
8157
- displayState.setSelectedFeature(feature);
8158
- navigateHere(displayState, feature);
8159
- }, onContextMenu: (e) => {
8160
- e.preventDefault();
8161
- setContextMenu({
8162
- position: { left: e.clientX + 2, top: e.clientY - 6 },
8163
- items: makeContextMenuItems(displayState, feature),
8164
- });
8165
- return false;
8166
- } },
8167
- React__default["default"].createElement("td", { style: {
8168
- whiteSpace: 'nowrap',
8169
- borderLeft: `${depth * 2}em solid transparent`,
8170
- } },
8171
- children?.size ? (
8172
- // TODO: a11y
8173
- // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
8174
- React__default["default"].createElement("div", { onClick: toggleExpanded, className: classes.arrow + (expanded ? ` ${classes.arrowExpanded}` : '') }, "\u276F")) : null,
8175
- React__default["default"].createElement("div", { className: classes.typeContent },
8176
- React__default["default"].createElement(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTypeTerms.bind(null, feature), renderInput: (params) => {
8177
- return (React__default["default"].createElement("div", { ref: params.InputProps.ref },
8178
- React__default["default"].createElement("input", { type: "text", ...params.inputProps, className: classes.typeInputElement, style: { width: 170 } }),
8179
- params.error ? (React__default["default"].createElement("div", { className: classes.typeErrorMessage }, params.errorMessage ?? 'unknown error')) : null));
8180
- }, onChange: (oldValue, newValue) => {
8181
- if (newValue) {
8182
- handleFeatureTypeChange(changeManager, feature, oldValue, newValue).catch(notifyError);
8183
- }
8184
- } }))),
8185
- React__default["default"].createElement("td", null,
8186
- React__default["default"].createElement(NumberCell, { initialValue: min + 1, notifyError: notifyError, onChangeCommitted: (newStart) => handleFeatureStartChange(changeManager, feature, min, newStart - 1) })),
8187
- React__default["default"].createElement("td", null,
8188
- React__default["default"].createElement(NumberCell, { initialValue: max, notifyError: notifyError, onChangeCommitted: (newEnd) => handleFeatureEndChange(changeManager, feature, max, newEnd) })),
8189
- React__default["default"].createElement("td", null, strand === 1 ? '+' : strand === -1 ? '-' : undefined),
8190
- React__default["default"].createElement("td", null,
8191
- React__default["default"].createElement(FeatureAttributes, { filterText: filterText, feature: feature }))),
8192
- expanded && children
8193
- ? [...children.entries()]
8194
- .filter((entry) => {
8195
- if (!filterText) {
8196
- return true;
8197
- }
8198
- const [, childFeature] = entry;
8199
- // search feature and its subfeatures for the text
8200
- const text = JSON.stringify(childFeature);
8201
- return text.includes(filterText);
8202
- })
8203
- .map(([featureId, childFeature]) => {
8204
- const childHovered = hoveredFeature?.feature._id === childFeature._id;
8205
- const childSelected = selectedFeature?._id === childFeature._id;
8206
- return (React__default["default"].createElement(Feature, { isHovered: childHovered, isSelected: childSelected, selectedFeatureClass: selectedFeatureClass, key: featureId, depth: (depth || 0) + 1, feature: childFeature, model: displayState, setContextMenu: setContextMenu }));
8207
- })
8208
- : null));
7673
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("tr", { onMouseEnter: (_e) => {
7674
+ displayState.setHoveredFeature({ feature, bp: min });
7675
+ }, className: classes.feature +
7676
+ (isSelected
7677
+ ? ` ${selectedFeatureClass}`
7678
+ : isHovered
7679
+ ? ` ${classes.hoveredFeature}`
7680
+ : ''), onClick: (e) => {
7681
+ e.stopPropagation();
7682
+ displayState.setSelectedFeature(feature);
7683
+ }, onDoubleClick: () => {
7684
+ displayState.setSelectedFeature(feature);
7685
+ navigateHere(displayState, feature);
7686
+ }, onContextMenu: (e) => {
7687
+ e.preventDefault();
7688
+ setContextMenu({
7689
+ position: { left: e.clientX + 2, top: e.clientY - 6 },
7690
+ items: makeContextMenuItems(displayState, feature),
7691
+ });
7692
+ return false;
7693
+ }, children: [jsxRuntime.jsxs("td", { style: {
7694
+ whiteSpace: 'nowrap',
7695
+ borderLeft: `${depth * 2}em solid transparent`,
7696
+ }, children: [children?.size ? (
7697
+ // TODO: a11y
7698
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
7699
+ jsxRuntime.jsx("div", { onClick: toggleExpanded, className: classes.arrow + (expanded ? ` ${classes.arrowExpanded}` : ''), children: "\u276F" })) : null, jsxRuntime.jsx("div", { className: classes.typeContent, children: jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: 170 }, value: type, filterTerms: isOntologyClass, fetchValidTerms: fetchValidTypeTerms.bind(null, feature), renderInput: (params) => {
7700
+ return (jsxRuntime.jsxs("div", { ref: params.InputProps.ref, children: [jsxRuntime.jsx("input", { type: "text", ...params.inputProps, className: classes.typeInputElement, style: { width: 170 } }), params.error ? (jsxRuntime.jsx("div", { className: classes.typeErrorMessage, children: params.errorMessage ?? 'unknown error' })) : null] }));
7701
+ }, onChange: (oldValue, newValue) => {
7702
+ if (newValue) {
7703
+ handleFeatureTypeChange(changeManager, feature, oldValue, newValue).catch(notifyError);
7704
+ }
7705
+ } }) })] }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx(NumberCell, { initialValue: min + 1, notifyError: notifyError, onChangeCommitted: (newStart) => handleFeatureStartChange(changeManager, feature, min, newStart - 1) }) }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx(NumberCell, { initialValue: max, notifyError: notifyError, onChangeCommitted: (newEnd) => handleFeatureEndChange(changeManager, feature, max, newEnd) }) }), jsxRuntime.jsx("td", { children: strand === 1 ? '+' : strand === -1 ? '-' : undefined }), jsxRuntime.jsx("td", { children: jsxRuntime.jsx(FeatureAttributes, { filterText: filterText, feature: feature }) })] }), expanded && children
7706
+ ? [...children.entries()]
7707
+ .filter((entry) => {
7708
+ if (!filterText) {
7709
+ return true;
7710
+ }
7711
+ const [, childFeature] = entry;
7712
+ // search feature and its subfeatures for the text
7713
+ const text = JSON.stringify(childFeature);
7714
+ return text.includes(filterText);
7715
+ })
7716
+ .map(([featureId, childFeature]) => {
7717
+ const childHovered = hoveredFeature?.feature._id === childFeature._id;
7718
+ const childSelected = selectedFeature?._id === childFeature._id;
7719
+ return (jsxRuntime.jsx(Feature, { isHovered: childHovered, isSelected: childSelected, selectedFeatureClass: selectedFeatureClass, depth: (depth || 0) + 1, feature: childFeature, model: displayState, setContextMenu: setContextMenu }, featureId));
7720
+ })
7721
+ : null] }));
8209
7722
  });
8210
7723
  async function fetchValidTypeTerms(feature, ontologyStore, _signal) {
8211
7724
  const { parent: parentFeature } = feature;
@@ -8223,7 +7736,7 @@ async function fetchValidTypeTerms(feature, ontologyStore, _signal) {
8223
7736
  return;
8224
7737
  }
8225
7738
 
8226
- const useStyles$3 = mui.makeStyles()((theme) => ({
7739
+ const useStyles$3 = tssReact.makeStyles()((theme) => ({
8227
7740
  scrollableTable: {
8228
7741
  width: '100%',
8229
7742
  height: '100%',
@@ -8264,49 +7777,38 @@ const HybridGrid = mobxReact.observer(function HybridGrid({ model, }) {
8264
7777
  }
8265
7778
  }
8266
7779
  }, [selectedFeature, seenFeatures, classes.selectedFeature]);
8267
- return (React__default["default"].createElement("div", { ref: scrollContainerRef, style: { width: '100%', overflowY: 'auto', height: '100%' } },
8268
- React__default["default"].createElement("table", { className: classes.scrollableTable },
8269
- React__default["default"].createElement("thead", null,
8270
- React__default["default"].createElement("tr", null,
8271
- React__default["default"].createElement("th", null, "Type"),
8272
- React__default["default"].createElement("th", null, "Start"),
8273
- React__default["default"].createElement("th", null, "End"),
8274
- React__default["default"].createElement("th", null, "Strand"),
8275
- React__default["default"].createElement("th", null, "Attributes"))),
8276
- React__default["default"].createElement("tbody", null, [...seenFeatures.entries()]
8277
- .filter((entry) => {
8278
- if (!filterText) {
8279
- return true;
8280
- }
8281
- const [, feature] = entry;
8282
- // search feature and its subfeatures for the text
8283
- const text = JSON.stringify(feature);
8284
- return text.includes(filterText);
8285
- })
8286
- .sort((a, b) => {
8287
- return a[1].min - b[1].min;
8288
- })
8289
- .map(([featureId, feature]) => {
8290
- const isSelected = selectedFeature?._id === featureId;
8291
- const isHovered = hoveredFeature?.feature._id === featureId;
8292
- return (React__default["default"].createElement(Feature, { key: featureId, isSelected: isSelected, isHovered: isHovered, selectedFeatureClass: classes.selectedFeature, feature: feature, model: model, depth: 0, setContextMenu: setContextMenu }));
8293
- }))),
8294
- React__default["default"].createElement(ui.Menu, { open: Boolean(contextMenu), onMenuItemClick: (_, callback) => {
8295
- callback();
8296
- setContextMenu(null);
8297
- }, onClose: () => {
8298
- setContextMenu(null);
8299
- }, slotProps: {
8300
- transition: {
8301
- onExit: () => {
8302
- setContextMenu(null);
7780
+ return (jsxRuntime.jsxs("div", { ref: scrollContainerRef, style: { width: '100%', overflowY: 'auto', height: '100%' }, children: [jsxRuntime.jsxs("table", { className: classes.scrollableTable, children: [jsxRuntime.jsx("thead", { children: jsxRuntime.jsxs("tr", { children: [jsxRuntime.jsx("th", { children: "Type" }), jsxRuntime.jsx("th", { children: "Start" }), jsxRuntime.jsx("th", { children: "End" }), jsxRuntime.jsx("th", { children: "Strand" }), jsxRuntime.jsx("th", { children: "Attributes" })] }) }), jsxRuntime.jsx("tbody", { children: [...seenFeatures.entries()]
7781
+ .filter((entry) => {
7782
+ if (!filterText) {
7783
+ return true;
7784
+ }
7785
+ const [, feature] = entry;
7786
+ // search feature and its subfeatures for the text
7787
+ const text = JSON.stringify(feature);
7788
+ return text.includes(filterText);
7789
+ })
7790
+ .sort((a, b) => {
7791
+ return a[1].min - b[1].min;
7792
+ })
7793
+ .map(([featureId, feature]) => {
7794
+ const isSelected = selectedFeature?._id === featureId;
7795
+ const isHovered = hoveredFeature?.feature._id === featureId;
7796
+ return (jsxRuntime.jsx(Feature, { isSelected: isSelected, isHovered: isHovered, selectedFeatureClass: classes.selectedFeature, feature: feature, model: model, depth: 0, setContextMenu: setContextMenu }, featureId));
7797
+ }) })] }), jsxRuntime.jsx(ui.Menu, { open: Boolean(contextMenu), onMenuItemClick: (_, callback) => {
7798
+ callback();
7799
+ setContextMenu(null);
7800
+ }, onClose: () => {
7801
+ setContextMenu(null);
7802
+ }, slotProps: {
7803
+ transition: {
7804
+ onExit: () => {
7805
+ setContextMenu(null);
7806
+ },
8303
7807
  },
8304
- },
8305
- }, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenu?.items ?? [], anchorReference: "anchorPosition", anchorPosition: contextMenu?.position })));
7808
+ }, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenu?.items ?? [], anchorReference: "anchorPosition", anchorPosition: contextMenu?.position })] }));
8306
7809
  });
8307
7810
 
8308
- /* eslint-disable @typescript-eslint/unbound-method */
8309
- const useStyles$2 = mui.makeStyles()({
7811
+ const useStyles$2 = tssReact.makeStyles()({
8310
7812
  toolbar: {
8311
7813
  width: '100%',
8312
7814
  display: 'flex',
@@ -8321,21 +7823,15 @@ const useStyles$2 = mui.makeStyles()({
8321
7823
  const ToolBar = mobxReact.observer(function ToolBar({ model: displayState, }) {
8322
7824
  const model = displayState.tabularEditor;
8323
7825
  const { classes } = useStyles$2();
8324
- return (React__default["default"].createElement("div", { className: classes.toolbar },
8325
- React__default["default"].createElement(material.Tooltip, { title: "Collapse all" },
8326
- React__default["default"].createElement(material.IconButton, { "aria-label": "collapse", sx: { marginTop: 0 }, onClick: model.collapseAllFeatures },
8327
- React__default["default"].createElement(UnfoldLessIcon__default["default"], null))),
8328
- React__default["default"].createElement(material.TextField, { className: classes.filterText, label: "Filter features", value: model.filterText, sx: { marginTop: 0 }, variant: "outlined", onChange: (event) => {
8329
- model.setFilterText(event.target.value);
8330
- }, slotProps: {
8331
- input: {
8332
- endAdornment: (React__default["default"].createElement(material.InputAdornment, { position: "end" },
8333
- React__default["default"].createElement(material.IconButton, { onClick: () => {
8334
- model.clearFilterText();
8335
- } },
8336
- React__default["default"].createElement(ClearIcon__default["default"], null)))),
8337
- },
8338
- } })));
7826
+ return (jsxRuntime.jsxs("div", { className: classes.toolbar, children: [jsxRuntime.jsx(material.Tooltip, { title: "Collapse all", children: jsxRuntime.jsx(material.IconButton, { "aria-label": "collapse", sx: { marginTop: 0 }, onClick: model.collapseAllFeatures, children: jsxRuntime.jsx(UnfoldLessIcon, {}) }) }), jsxRuntime.jsx(material.TextField, { className: classes.filterText, label: "Filter features", value: model.filterText, sx: { marginTop: 0 }, variant: "outlined", onChange: (event) => {
7827
+ model.setFilterText(event.target.value);
7828
+ }, slotProps: {
7829
+ input: {
7830
+ endAdornment: (jsxRuntime.jsx(material.InputAdornment, { position: "end", children: jsxRuntime.jsx(material.IconButton, { onClick: () => {
7831
+ model.clearFilterText();
7832
+ }, children: jsxRuntime.jsx(ClearIcon, {}) }) })),
7833
+ },
7834
+ } })] }));
8339
7835
  });
8340
7836
 
8341
7837
  function stopPropagation(e) {
@@ -8349,9 +7845,7 @@ const TabularEditorPane = mobxReact.observer(function TabularEditorPane({ model:
8349
7845
  return (
8350
7846
  // TODO: a11y
8351
7847
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
8352
- React__default["default"].createElement("div", { onMouseDown: stopPropagation, onClick: stopPropagation, style: { width: '100%', height: '100%', position: 'relative' } },
8353
- React__default["default"].createElement(ToolBar, { model: displayState }),
8354
- React__default["default"].createElement(HybridGrid, { model: displayState })));
7848
+ jsxRuntime.jsxs("div", { onMouseDown: stopPropagation, onClick: stopPropagation, style: { width: '100%', height: '100%', position: 'relative' }, children: [jsxRuntime.jsx(ToolBar, { model: displayState }), jsxRuntime.jsx(HybridGrid, { model: displayState })] }));
8355
7849
  });
8356
7850
 
8357
7851
  const TabularEditorStateModelType = mobxStateTree.types
@@ -8705,10 +8199,7 @@ function drawBackground(ctx, feature, stateModel, displayedRegionIndex, row, col
8705
8199
  const topLevelFeatureTop = row * apolloRowHeight;
8706
8200
  const topLevelFeatureHeight = getRowCount$1(feature, featureTypeOntology) * apolloRowHeight;
8707
8201
  let selectedColor;
8708
- if (color) {
8709
- selectedColor = color;
8710
- }
8711
- else {
8202
+ {
8712
8203
  selectedColor = configuration.readConfObject(session.getPluginConfiguration(), 'geneBackgroundColor', { featureType: feature.type });
8713
8204
  if (!selectedColor) {
8714
8205
  selectedColor = material.alpha(theme.palette.background.paper, 0.6);
@@ -9299,6 +8790,26 @@ function getContextMenuItems$2(display, mousePosition) {
9299
8790
  },
9300
8791
  ]);
9301
8792
  },
8793
+ }, {
8794
+ label: 'Duplicate feature',
8795
+ onClick: () => {
8796
+ session.queueDialog((doneCallback) => [
8797
+ DuplicateTranscript,
8798
+ {
8799
+ session,
8800
+ handleClose: () => {
8801
+ doneCallback();
8802
+ },
8803
+ changeManager,
8804
+ sourceFeature: feature,
8805
+ sourceAssemblyId: currentAssemblyId,
8806
+ selectedFeature,
8807
+ setSelectedFeature: (feature) => {
8808
+ display.setSelectedFeature(feature);
8809
+ },
8810
+ },
8811
+ ]);
8812
+ },
9302
8813
  });
9303
8814
  if (util.isSessionModelWithWidgets(session)) {
9304
8815
  contextMenuItemsForFeature.splice(1, 0, {
@@ -9505,48 +9016,30 @@ const FilterFeatures = mobxReact.observer(function FilterFeatures({ featureTypes
9505
9016
  onUpdate(newTypes);
9506
9017
  setSelectedFeatureTypes(newTypes);
9507
9018
  };
9508
- return (React__default["default"].createElement(Dialog, { open: true, maxWidth: false, "data-testid": "filter-features-dialog", title: "Filter features by type", handleClose: handleClose },
9509
- React__default["default"].createElement(material.DialogContent, null,
9510
- React__default["default"].createElement(material.DialogContentText, null, "Select the feature types you want to display in the apollo track"),
9511
- React__default["default"].createElement(material.Grid, { container: true, spacing: 2 },
9512
- React__default["default"].createElement(material.Grid, { size: 8 },
9513
- React__default["default"].createElement(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: '100%' }, value: type, filterTerms: isOntologyClass, renderInput: (params) => (React__default["default"].createElement(material.TextField, { ...params, label: "Feature type", variant: "outlined", fullWidth: true })), onChange: (oldValue, newValue) => {
9514
- if (newValue) {
9515
- handleChange(newValue);
9516
- }
9517
- } })),
9518
- React__default["default"].createElement(material.Grid, { size: 4 },
9519
- React__default["default"].createElement(material.Button, { variant: "contained", onClick: handleAddFeatureType, disabled: !type, style: { marginTop: 9 }, size: "medium" }, "Add"))),
9520
- selectedFeatureTypes.length > 0 && (React__default["default"].createElement("div", null,
9521
- React__default["default"].createElement("hr", null),
9522
- React__default["default"].createElement("div", { style: { width: 300 } },
9523
- React__default["default"].createElement(material.DialogContentText, null, "Selected feature types:"),
9524
- React__default["default"].createElement(material.Box, { sx: { display: 'flex', flexWrap: 'wrap', gap: 0.5 } }, selectedFeatureTypes.map((value) => (React__default["default"].createElement(material.Chip, { key: value, label: value, onDelete: () => {
9525
- handleFeatureTypeDelete(value);
9526
- } }))))))))));
9019
+ return (jsxRuntime.jsx(Dialog, { open: true, maxWidth: false, "data-testid": "filter-features-dialog", title: "Filter features by type", handleClose: handleClose, children: jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select the feature types you want to display in the apollo track" }), jsxRuntime.jsxs(material.Grid, { container: true, spacing: 2, children: [jsxRuntime.jsx(material.Grid, { size: 8, children: jsxRuntime.jsx(OntologyTermAutocomplete, { session: session, ontologyName: "Sequence Ontology", style: { width: '100%' }, value: type, filterTerms: isOntologyClass, renderInput: (params) => (jsxRuntime.jsx(material.TextField, { ...params, label: "Feature type", variant: "outlined", fullWidth: true })), onChange: (oldValue, newValue) => {
9020
+ if (newValue) {
9021
+ handleChange(newValue);
9022
+ }
9023
+ } }) }), jsxRuntime.jsx(material.Grid, { size: 4, children: jsxRuntime.jsx(material.Button, { variant: "contained", onClick: handleAddFeatureType, disabled: !type, style: { marginTop: 9 }, size: "medium", children: "Add" }) })] }), selectedFeatureTypes.length > 0 && (jsxRuntime.jsxs("div", { children: [jsxRuntime.jsx("hr", {}), jsxRuntime.jsxs("div", { style: { width: 300 }, children: [jsxRuntime.jsx(material.DialogContentText, { children: "Selected feature types:" }), jsxRuntime.jsx(material.Box, { sx: { display: 'flex', flexWrap: 'wrap', gap: 0.5 }, children: selectedFeatureTypes.map((value) => (jsxRuntime.jsx(material.Chip, { label: value, onDelete: () => {
9024
+ handleFeatureTypeDelete(value);
9025
+ } }, value))) })] })] }))] }) }));
9527
9026
  });
9528
9027
 
9529
9028
  const EditZoomThresholdDialog = mobxReact.observer(function ({ model, handleClose, }) {
9530
9029
  const [zoomThreshold, setZoomThreshold] = React.useState(`${model.zoomThresholdSetting}`);
9531
- return (React__default["default"].createElement(ui.Dialog, { open: true, onClose: handleClose, title: "Edit zoom threshold setting" },
9532
- React__default["default"].createElement(material.DialogContent, null,
9533
- React__default["default"].createElement(material.Typography, null, "The zoom level in base pairs (bp) per pixel at which features are rendered in this Annotations track. Increasing the value will allow features to render when zooming out, but might impact performance."),
9534
- React__default["default"].createElement(material.TextField, { label: "Threshold value (bpPerPx)", value: zoomThreshold, onChange: (event) => {
9535
- setZoomThreshold(event.target.value);
9536
- } }),
9537
- React__default["default"].createElement(material.DialogActions, null,
9538
- React__default["default"].createElement(material.Button, { variant: "contained", onClick: () => {
9539
- model.setZoomThresholdSetting({
9540
- zoomThreshold: +zoomThreshold,
9541
- });
9542
- handleClose();
9543
- } }, "Submit"),
9544
- React__default["default"].createElement(material.Button, { variant: "contained", color: "secondary", onClick: () => {
9545
- handleClose();
9546
- } }, "Cancel")))));
9030
+ return (jsxRuntime.jsx(ui.Dialog, { open: true, onClose: handleClose, title: "Edit zoom threshold setting", children: jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsx(material.Typography, { children: "The zoom level in base pairs (bp) per pixel at which features are rendered in this Annotations track. Increasing the value will allow features to render when zooming out, but might impact performance." }), jsxRuntime.jsx(material.TextField, { label: "Threshold value (bpPerPx)", value: zoomThreshold, onChange: (event) => {
9031
+ setZoomThreshold(event.target.value);
9032
+ } }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", onClick: () => {
9033
+ model.setZoomThresholdSetting({
9034
+ zoomThreshold: +zoomThreshold,
9035
+ });
9036
+ handleClose();
9037
+ }, children: "Submit" }), jsxRuntime.jsx(material.Button, { variant: "contained", color: "secondary", onClick: () => {
9038
+ handleClose();
9039
+ }, children: "Cancel" })] })] }) }));
9547
9040
  });
9548
9041
 
9549
- const useStyles$1 = mui.makeStyles()((theme) => ({
9042
+ const useStyles$1 = tssReact.makeStyles()((theme) => ({
9550
9043
  canvasContainer: {
9551
9044
  position: 'relative',
9552
9045
  left: 0,
@@ -9600,7 +9093,7 @@ function clusterResultByMessage(items, width, touchesAsOverlap) {
9600
9093
  (byMsg.get(it.message) ?? byMsg.set(it.message, []).get(it.message)).push(it);
9601
9094
  }
9602
9095
  const clusters = [];
9603
- const overlaps = (aEnd, bStart) => touchesAsOverlap ? bStart <= aEnd : bStart < aEnd;
9096
+ const overlaps = (aEnd, bStart) => bStart <= aEnd ;
9604
9097
  for (const [message, arr] of byMsg.entries()) {
9605
9098
  if (arr.length === 0) {
9606
9099
  continue;
@@ -10974,7 +10467,6 @@ function stateModelFactory$1(pluginManager, configSchema) {
10974
10467
  return renderingModelFactory$1(pluginManager, configSchema).named('LinearApolloReferenceSequenceDisplay');
10975
10468
  }
10976
10469
 
10977
- /* eslint-disable @typescript-eslint/unbound-method */
10978
10470
  const LinearApolloReferenceSequenceDisplay = mobxReact.observer(function LinearApolloReferenceSequenceDisplay(props) {
10979
10471
  const theme = material.useTheme();
10980
10472
  const { model } = props;
@@ -10985,24 +10477,21 @@ const LinearApolloReferenceSequenceDisplay = mobxReact.observer(function LinearA
10985
10477
  }, [theme, setTheme]);
10986
10478
  const lgv = util.getContainingView(model);
10987
10479
  const message = regionCannotBeRendered();
10480
+ // This type is wrong in @jbrowse/core
10988
10481
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
10989
10482
  if (message) {
10990
- return (React__default["default"].createElement(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } } },
10991
- React__default["default"].createElement(material.Tooltip, { title: message },
10992
- React__default["default"].createElement("div", null, message))));
10993
- }
10994
- return (React__default["default"].createElement(React__default["default"].Fragment, null, 3 / lgv.bpPerPx >= 1 ? (React__default["default"].createElement("div", { className: classes.canvasContainer, style: {
10995
- width: lgv.dynamicBlocks.totalWidthPx,
10996
- height,
10997
- } },
10998
- React__default["default"].createElement("canvas", { ref: async (node) => {
10999
- await Promise.resolve();
11000
- setSeqTrackCanvas(node);
11001
- }, width: lgv.dynamicBlocks.totalWidthPx, height: height, className: classes.canvas, "data-testid": "seqTrackCanvas" }),
11002
- React__default["default"].createElement("canvas", { ref: async (node) => {
11003
- await Promise.resolve();
11004
- setSeqTrackOverlayCanvas(node);
11005
- }, width: lgv.dynamicBlocks.totalWidthPx, height: height, className: classes.canvas, "data-testid": "seqTrackOverlayCanvas" }))) : null));
10483
+ return (jsxRuntime.jsx(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } }, children: jsxRuntime.jsx(material.Tooltip, { title: message, children: jsxRuntime.jsx("div", { children: message }) }) }));
10484
+ }
10485
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: 3 / lgv.bpPerPx >= 1 ? (jsxRuntime.jsxs("div", { className: classes.canvasContainer, style: {
10486
+ width: lgv.dynamicBlocks.totalWidthPx,
10487
+ height,
10488
+ }, children: [jsxRuntime.jsx("canvas", { ref: async (node) => {
10489
+ await Promise.resolve();
10490
+ setSeqTrackCanvas(node);
10491
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: height, className: classes.canvas, "data-testid": "seqTrackCanvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
10492
+ await Promise.resolve();
10493
+ setSeqTrackOverlayCanvas(node);
10494
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: height, className: classes.canvas, "data-testid": "seqTrackOverlayCanvas" })] })) : null }));
11006
10495
  });
11007
10496
 
11008
10497
  const configSchema = configuration.ConfigurationSchema('LinearApolloSixFrameDisplay', {}, { explicitIdentifier: 'displayId', explicitlyTyped: true });
@@ -11027,16 +10516,11 @@ const FilterTranscripts = mobxReact.observer(function FilterTranscripts({ source
11027
10516
  onUpdate(newForms);
11028
10517
  setExcludedTranscripts(newForms);
11029
10518
  };
11030
- return (React__default["default"].createElement(Dialog, { open: true, maxWidth: false, "data-testid": "filter-transcripts-dialog", title: "Filter transcripts by ID", handleClose: handleClose },
11031
- React__default["default"].createElement(material.DialogContent, null,
11032
- React__default["default"].createElement(material.DialogContentText, null, "Select the alternate transcripts you want to display in the apollo track"),
11033
- React__default["default"].createElement(material.Grid, { container: true, spacing: 2 },
11034
- React__default["default"].createElement(material.Grid, { size: 8 },
11035
- React__default["default"].createElement(material.FormGroup, null, allTranscripts.map((item) => (
11036
- // eslint-disable-next-line react/jsx-key
11037
- React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: !excludedTranscripts.includes(item), onChange: () => {
11038
- handleChange(item);
11039
- }, slotProps: { input: { 'aria-label': 'controlled' } } }), label: item })))))))));
10519
+ return (jsxRuntime.jsx(Dialog, { open: true, maxWidth: false, "data-testid": "filter-transcripts-dialog", title: "Filter transcripts by ID", handleClose: handleClose, children: jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsx(material.DialogContentText, { children: "Select the alternate transcripts you want to display in the apollo track" }), jsxRuntime.jsx(material.Grid, { container: true, spacing: 2, children: jsxRuntime.jsx(material.Grid, { size: 8, children: jsxRuntime.jsx(material.FormGroup, { children: allTranscripts.map((item) => (
10520
+ // eslint-disable-next-line react/jsx-key
10521
+ jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: !excludedTranscripts.includes(item), onChange: () => {
10522
+ handleChange(item);
10523
+ }, slotProps: { input: { 'aria-label': 'controlled' } } }), label: item }))) }) }) })] }) }));
11040
10524
  });
11041
10525
 
11042
10526
  let forwardFillLight = null;
@@ -11091,7 +10575,7 @@ if (canvas?.getContext) {
11091
10575
  }
11092
10576
  function deepSetHas(set, item) {
11093
10577
  for (const elem of set) {
11094
- if (equal__default["default"](elem, item)) {
10578
+ if (equal(elem, item)) {
11095
10579
  return true;
11096
10580
  }
11097
10581
  }
@@ -11263,8 +10747,14 @@ function draw(ctx, topLevelFeature, _row, stateModel, displayedRegionIndex) {
11263
10747
  cdsStartPx = reversed ? minX - cdsWidthPx : minX;
11264
10748
  ctx.fillStyle = theme.palette.text.primary;
11265
10749
  const frame = util.getFrame(cds.min, cds.max, child.strand ?? 1, cds.phase);
11266
- const frameAdjust = (frame < 0 ? -1 * frame + 5 : frame) * featureLabelSpacer;
11267
- cdsTop = (frameAdjust - featureLabelSpacer) * rowHeight;
10750
+ const frameOffsets = showFeatureLabels
10751
+ ? [0, 4, 2, 0, 14, 12, 10]
10752
+ : [0, 2, 1, 0, 7, 6, 5];
10753
+ const row = frameOffsets.at(frame);
10754
+ if (row === undefined) {
10755
+ continue;
10756
+ }
10757
+ cdsTop = row * rowHeight;
11268
10758
  ctx.fillRect(cdsStartPx, cdsTop, cdsWidthPx, cdsHeight);
11269
10759
  // Draw lines to connect CDS features with shared mRNA parent
11270
10760
  if (counter > 1) {
@@ -11397,8 +10887,14 @@ function drawHover(stateModel, ctx) {
11397
10887
  })?.offsetPx ?? 0) - offsetPx;
11398
10888
  const cdsStartPx = reversed ? minX - cdsWidthPx : minX;
11399
10889
  const frame = util.getFrame(cds.min, cds.max, strand ?? 1, cds.phase);
11400
- const frameAdjust = (frame < 0 ? -1 * frame + 5 : frame) * featureLabelSpacer;
11401
- const cdsTop = (frameAdjust - featureLabelSpacer) * rowHeight;
10890
+ const frameOffsets = showFeatureLabels
10891
+ ? [0, 4, 2, 0, 14, 12, 10]
10892
+ : [0, 2, 1, 0, 7, 6, 5];
10893
+ const row = frameOffsets.at(frame);
10894
+ if (row === undefined) {
10895
+ continue;
10896
+ }
10897
+ const cdsTop = row * rowHeight;
11402
10898
  if (counter > 1) {
11403
10899
  // Mid-point for intron line "hat"
11404
10900
  const midPoint = [
@@ -11578,8 +11074,6 @@ function drawTooltip(display, context) {
11578
11074
  const displayedRegion = displayedRegions[layoutIndex];
11579
11075
  const { refName, reversed } = displayedRegion;
11580
11076
  const rowHeight = apolloRowHeight;
11581
- const cdsHeight = Math.round(0.7 * rowHeight);
11582
- const featureLabelSpacer = showFeatureLabels ? 2 : 1;
11583
11077
  let location = 'Loc: ';
11584
11078
  let cds = undefined;
11585
11079
  for (const loc of feature.cdsLocations) {
@@ -11601,8 +11095,14 @@ function drawTooltip(display, context) {
11601
11095
  regionNumber: layoutIndex,
11602
11096
  })?.offsetPx ?? 0) - offsetPx;
11603
11097
  const frame = util.getFrame(min, max, strand ?? 1, phase);
11604
- const frameAdjust = (frame < 0 ? -1 * frame + 5 : frame) * featureLabelSpacer;
11605
- const cdsTop = (frameAdjust - featureLabelSpacer) * rowHeight + (rowHeight - cdsHeight) / 2;
11098
+ const frameOffsets = showFeatureLabels
11099
+ ? [0, 4, 2, 0, 14, 12, 10]
11100
+ : [0, 2, 1, 0, 7, 6, 5];
11101
+ const row = frameOffsets.at(frame);
11102
+ if (row === undefined) {
11103
+ return;
11104
+ }
11105
+ const cdsTop = row * rowHeight;
11606
11106
  const cdsWidthPx = (max - min) / bpPerPx;
11607
11107
  const featureType = `Type: ${cds.type}`;
11608
11108
  const featureName = attributes.get('gff_name')?.find((name) => name !== '');
@@ -12190,8 +11690,14 @@ function layoutsModelFactory(pluginManager, configSchema) {
12190
11690
  }
12191
11691
  for (const cdsRow of cdsLocations) {
12192
11692
  for (const cds of cdsRow) {
12193
- let rowNum = util.getFrame(cds.min, cds.max, strand ?? 1, cds.phase);
12194
- rowNum = self.featureLabelSpacer(rowNum < 0 ? -1 * rowNum + 5 : rowNum);
11693
+ const frame = util.getFrame(cds.min, cds.max, strand ?? 1, cds.phase);
11694
+ const frameOffsets = self.showFeatureLabels
11695
+ ? [0, 5, 3, 1, 15, 13, 11]
11696
+ : [0, 2, 1, 0, 8, 7, 6];
11697
+ const rowNum = frameOffsets.at(frame);
11698
+ if (!rowNum) {
11699
+ continue;
11700
+ }
12195
11701
  if (!featureLayout.get(rowNum)) {
12196
11702
  featureLayout.set(rowNum, []);
12197
11703
  }
@@ -12462,8 +11968,11 @@ function mouseEventsModelIntermediateFactory(pluginManager, configSchema) {
12462
11968
  }
12463
11969
  for (const loc of feature.cdsLocations) {
12464
11970
  for (const cds of loc) {
12465
- let rowNum = util.getFrame(cds.min, cds.max, feature.strand ?? 1, cds.phase);
12466
- rowNum = self.featureLabelSpacer(rowNum < 0 ? -1 * rowNum + 5 : rowNum);
11971
+ const frame = util.getFrame(cds.min, cds.max, feature.strand ?? 1, cds.phase);
11972
+ const frameOffsets = self.showFeatureLabels
11973
+ ? [0, 5, 3, 1, 15, 13, 11]
11974
+ : [0, 2, 1, 0, 8, 7, 6];
11975
+ const rowNum = frameOffsets.at(frame);
12467
11976
  if (row === rowNum && bp >= cds.min && bp <= cds.max) {
12468
11977
  return (featureID === undefined ||
12469
11978
  !self.filteredTranscripts.includes(featureID));
@@ -12691,7 +12200,6 @@ const ApolloPluginConfigurationSchema = configuration.ConfigurationSchema('Apoll
12691
12200
  },
12692
12201
  });
12693
12202
 
12694
- /* eslint-disable react-hooks/exhaustive-deps */
12695
12203
  const isGeneOrTranscript = (annotationFeature, apolloSessionModel) => {
12696
12204
  const { featureTypeOntology } = apolloSessionModel.apolloDataStore.ontologyManager;
12697
12205
  if (!featureTypeOntology) {
@@ -12948,7 +12456,7 @@ function CreateApolloAnnotation({ annotationFeature, assembly, handleClose, refS
12948
12456
  }
12949
12457
  };
12950
12458
  const createNewGeneFeatureWithTranscripts = async (childrens) => {
12951
- const newGeneId = new ObjectID__default["default"]().toHexString();
12459
+ const newGeneId = new ObjectID().toHexString();
12952
12460
  const min = Math.min(...Object.values(childrens).map((child) => child.min));
12953
12461
  const max = Math.max(...Object.values(childrens).map((child) => child.max));
12954
12462
  const change = new shared.AddFeatureChange({
@@ -13011,40 +12519,22 @@ function CreateApolloAnnotation({ annotationFeature, assembly, handleClose, refS
13011
12519
  const handleCreateNewGeneChange = (e) => {
13012
12520
  setCreateNewGene(e.target.checked);
13013
12521
  };
13014
- return (React__default["default"].createElement(Dialog, { open: true, title: "Create Apollo Annotation", handleClose: handleClose, fullWidth: true, maxWidth: "sm" },
13015
- React__default["default"].createElement(material.DialogTitle, { fontSize: 15 }, "Select the feature to be copied to apollo track"),
13016
- React__default["default"].createElement(material.DialogContent, null,
13017
- React__default["default"].createElement(material.Box, { sx: { ml: 3 } },
13018
- isGeneOrTranscript(annotationFeature, apolloSessionModel) && (React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { size: "small", checked: parentFeatureChecked, onChange: handleParentFeatureCheck }), label: `${getFeatureNameOrId(annotationFeature)} (${annotationFeature.min + 1}..${annotationFeature.max})` })),
13019
- annotationFeature.children && (React__default["default"].createElement(material.Box, { sx: { display: 'flex', flexDirection: 'column', ml: 3 } }, Object.values(annotationFeature.children)
13020
- .filter((child) => isTranscript(child, apolloSessionModel))
13021
- .map((child) => (React__default["default"].createElement(material.FormControlLabel, { key: child._id, control: React__default["default"].createElement(material.Checkbox, { size: "small", checked: checkedChildrens.includes(child._id), onChange: (e) => {
13022
- handleChildFeatureCheck(e, child);
13023
- } }), label: `${getFeatureNameOrId(child)} (${child.min + 1}..${child.max})` })))))),
13024
- destinationFeatures.length > 0 &&
13025
- ((!parentFeatureChecked && checkedChildrens.length > 0) ||
13026
- (parentFeatureChecked &&
13027
- isTranscript(annotationFeature, apolloSessionModel))) && (React__default["default"].createElement("div", { style: {
13028
- border: '1px solid #ccc',
13029
- marginTop: 20,
13030
- padding: 10,
13031
- borderRadius: 5,
13032
- } },
13033
- React__default["default"].createElement(material.Box, { sx: { ml: 3 } },
13034
- React__default["default"].createElement(material.Typography, { variant: "caption", fontSize: 12 }, "Select the destination feature to copy the selected features"),
13035
- React__default["default"].createElement(material.Box, { sx: { mt: 1 } },
13036
- React__default["default"].createElement(material.Select, { labelId: "label", style: { width: '100%' }, value: selectedDestinationFeature?._id ?? '', onChange: handleDestinationFeatureChange, disabled: createNewGene }, destinationFeatures.map((f) => (React__default["default"].createElement(material.MenuItem, { key: f._id, value: f._id }, `${getFeatureNameOrId(f)} (${f.min + 1}..${f.max})`)))))),
13037
- React__default["default"].createElement(material.Box, { sx: { ml: 3 } },
13038
- React__default["default"].createElement(material.FormGroup, null,
13039
- React__default["default"].createElement(material.FormControlLabel, { control: React__default["default"].createElement(material.Checkbox, { checked: createNewGene, onChange: handleCreateNewGeneChange }), label: "Create new gene" })))))),
13040
- React__default["default"].createElement(material.DialogActions, null,
13041
- React__default["default"].createElement(material.Button, { variant: "contained", type: "submit", disabled: checkedChildrens.length === 0 ||
13042
- (!parentFeatureChecked &&
13043
- checkedChildrens.length > 0 &&
13044
- !selectedDestinationFeature), onClick: handleCreateApolloAnnotation }, "Create"),
13045
- React__default["default"].createElement(material.Button, { variant: "outlined", type: "submit", onClick: handleClose }, "Cancel")),
13046
- errorMessage ? (React__default["default"].createElement(material.DialogContent, null,
13047
- React__default["default"].createElement(material.DialogContentText, { color: "error" }, errorMessage))) : null));
12522
+ return (jsxRuntime.jsxs(Dialog, { open: true, title: "Create Apollo Annotation", handleClose: handleClose, fullWidth: true, maxWidth: "sm", children: [jsxRuntime.jsx(material.DialogTitle, { fontSize: 15, children: "Select the feature to be copied to apollo track" }), jsxRuntime.jsxs(material.DialogContent, { children: [jsxRuntime.jsxs(material.Box, { sx: { ml: 3 }, children: [isGeneOrTranscript(annotationFeature, apolloSessionModel) && (jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { size: "small", checked: parentFeatureChecked, onChange: handleParentFeatureCheck }), label: `${getFeatureNameOrId(annotationFeature)} (${annotationFeature.min + 1}..${annotationFeature.max})` })), annotationFeature.children && (jsxRuntime.jsx(material.Box, { sx: { display: 'flex', flexDirection: 'column', ml: 3 }, children: Object.values(annotationFeature.children)
12523
+ .filter((child) => isTranscript(child, apolloSessionModel))
12524
+ .map((child) => (jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { size: "small", checked: checkedChildrens.includes(child._id), onChange: (e) => {
12525
+ handleChildFeatureCheck(e, child);
12526
+ } }), label: `${getFeatureNameOrId(child)} (${child.min + 1}..${child.max})` }, child._id))) }))] }), destinationFeatures.length > 0 &&
12527
+ ((!parentFeatureChecked && checkedChildrens.length > 0) ||
12528
+ (parentFeatureChecked &&
12529
+ isTranscript(annotationFeature, apolloSessionModel))) && (jsxRuntime.jsxs("div", { style: {
12530
+ border: '1px solid #ccc',
12531
+ marginTop: 20,
12532
+ padding: 10,
12533
+ borderRadius: 5,
12534
+ }, children: [jsxRuntime.jsxs(material.Box, { sx: { ml: 3 }, children: [jsxRuntime.jsx(material.Typography, { variant: "caption", fontSize: 12, children: "Select the destination feature to copy the selected features" }), jsxRuntime.jsx(material.Box, { sx: { mt: 1 }, children: jsxRuntime.jsx(material.Select, { labelId: "label", style: { width: '100%' }, value: selectedDestinationFeature?._id ?? '', onChange: handleDestinationFeatureChange, disabled: createNewGene, children: destinationFeatures.map((f) => (jsxRuntime.jsx(material.MenuItem, { value: f._id, children: `${getFeatureNameOrId(f)} (${f.min + 1}..${f.max})` }, f._id))) }) })] }), jsxRuntime.jsx(material.Box, { sx: { ml: 3 }, children: jsxRuntime.jsx(material.FormGroup, { children: jsxRuntime.jsx(material.FormControlLabel, { control: jsxRuntime.jsx(material.Checkbox, { checked: createNewGene, onChange: handleCreateNewGeneChange }), label: "Create new gene" }) }) })] }))] }), jsxRuntime.jsxs(material.DialogActions, { children: [jsxRuntime.jsx(material.Button, { variant: "contained", type: "submit", disabled: checkedChildrens.length === 0 ||
12535
+ (!parentFeatureChecked &&
12536
+ checkedChildrens.length > 0 &&
12537
+ !selectedDestinationFeature), onClick: handleCreateApolloAnnotation, children: "Create" }), jsxRuntime.jsx(material.Button, { variant: "outlined", type: "submit", onClick: handleClose, children: "Cancel" })] }), errorMessage ? (jsxRuntime.jsx(material.DialogContent, { children: jsxRuntime.jsx(material.DialogContentText, { color: "error", children: errorMessage }) })) : null] }));
13048
12538
  }
13049
12539
 
13050
12540
  function parseCigar(cigar) {
@@ -13161,7 +12651,7 @@ function annotationFromPileup(pluggableElement) {
13161
12651
  });
13162
12652
  }
13163
12653
  const newFeature = {
13164
- _id: ObjectID__default["default"]().toHexString(),
12654
+ _id: ObjectID().toHexString(),
13165
12655
  refSeq: refSeqId,
13166
12656
  min: start,
13167
12657
  max: end,
@@ -13178,7 +12668,7 @@ function annotationFromPileup(pluggableElement) {
13178
12668
  newFeature.children = children;
13179
12669
  for (const exon of exons) {
13180
12670
  const newExon = {
13181
- _id: ObjectID__default["default"]().toHexString(),
12671
+ _id: ObjectID().toHexString(),
13182
12672
  refSeq: refSeqId,
13183
12673
  min: exon.start,
13184
12674
  max: exon.end,
@@ -13205,7 +12695,7 @@ function annotationFromPileup(pluggableElement) {
13205
12695
  ...superContextMenuItems(),
13206
12696
  {
13207
12697
  label: 'Create Apollo annotation',
13208
- icon: AddIcon__default["default"],
12698
+ icon: AddIcon,
13209
12699
  onClick: () => {
13210
12700
  session.queueDialog((doneCallback) => [
13211
12701
  CreateApolloAnnotation,
@@ -13231,22 +12721,25 @@ function annotationFromPileup(pluggableElement) {
13231
12721
  }
13232
12722
 
13233
12723
  function simpleFeatureToGFF3Feature(feature, refSeqId) {
13234
- // eslint-disable-next-line unicorn/prefer-structured-clone
13235
- const xfeature = JSON.parse(JSON.stringify(feature));
13236
- const children = xfeature.subfeatures;
12724
+ const children = feature.get('subfeatures');
13237
12725
  const gff3Feature = [
13238
12726
  {
13239
- start: xfeature.start + 1,
13240
- end: xfeature.end,
12727
+ start: feature.get('start') + 1,
12728
+ end: feature.get('end'),
13241
12729
  seq_id: refSeqId,
13242
- source: xfeature.source ?? null,
13243
- type: xfeature.type ?? null,
13244
- score: xfeature.score ?? null,
13245
- strand: xfeature.strand ? (xfeature.strand === 1 ? '+' : '-') : null,
13246
- phase: xfeature.phase !== null || xfeature.phase !== undefined
13247
- ? xfeature.phase
12730
+ source: feature.get('source') ?? null,
12731
+ type: feature.get('type') ?? null,
12732
+ score: feature.get('score') ?? null,
12733
+ strand: feature.get('strand')
12734
+ ? // eslint-disable-next-line unicorn/no-nested-ternary
12735
+ feature.get('strand') === 1
12736
+ ? '+'
12737
+ : '-'
13248
12738
  : null,
13249
- attributes: convertFeatureAttributes(xfeature),
12739
+ phase: feature.get('phase') !== null || feature.get('phase') !== undefined
12740
+ ? feature.get('phase')
12741
+ : null,
12742
+ attributes: convertFeatureAttributes(feature),
13250
12743
  derived_features: [],
13251
12744
  child_features: children
13252
12745
  ? children.map((x) => simpleFeatureToGFF3Feature(x, refSeqId))
@@ -13272,7 +12765,7 @@ function convertFeatureAttributes(feature) {
13272
12765
  'source',
13273
12766
  'score',
13274
12767
  ]);
13275
- for (const [key, value] of Object.entries(feature)) {
12768
+ for (const [key, value] of Object.entries(feature.toJSON())) {
13276
12769
  if (defaultFields.has(key)) {
13277
12770
  continue;
13278
12771
  }
@@ -13321,10 +12814,9 @@ function annotationFromJBrowseFeature(pluggableElement) {
13321
12814
  }
13322
12815
  return refSeqId;
13323
12816
  },
13324
- getAnnotationFeature(assembly) {
12817
+ getAnnotationFeature(assembly, feature) {
13325
12818
  const refSeqId = self.getRefSeqId(assembly);
13326
- const sfeature = self.contextMenuFeature.data;
13327
- return jbrowseFeatureToAnnotationFeature(sfeature, refSeqId);
12819
+ return jbrowseFeatureToAnnotationFeature(feature, refSeqId);
13328
12820
  },
13329
12821
  }))
13330
12822
  .views((self) => {
@@ -13342,7 +12834,7 @@ function annotationFromJBrowseFeature(pluggableElement) {
13342
12834
  ...superContextMenuItems(),
13343
12835
  {
13344
12836
  label: 'Create Apollo annotation',
13345
- icon: AddIcon__default["default"],
12837
+ icon: AddIcon,
13346
12838
  onClick: () => {
13347
12839
  session.queueDialog((doneCallback) => [
13348
12840
  CreateApolloAnnotation,
@@ -13351,7 +12843,7 @@ function annotationFromJBrowseFeature(pluggableElement) {
13351
12843
  handleClose: () => {
13352
12844
  doneCallback();
13353
12845
  },
13354
- annotationFeature: self.getAnnotationFeature(assembly),
12846
+ annotationFeature: self.getAnnotationFeature(assembly, feature),
13355
12847
  assembly,
13356
12848
  refSeqId: self.getRefSeqId(assembly),
13357
12849
  region,
@@ -13385,7 +12877,7 @@ const CheckResultWarnings = mobxReact.observer(function CheckResultWarnings({ di
13385
12877
  ].filter((checkResult) => assembly.isValidRefName(checkResult.refSeq) &&
13386
12878
  assembly.getCanonicalRefName(checkResult.refSeq) === block.refName &&
13387
12879
  util.doesIntersect2(block.start, block.end, checkResult.start, checkResult.end));
13388
- const checkResults = clusterResultByMessage(filteredCheckResults, widthBp, true);
12880
+ const checkResults = clusterResultByMessage(filteredCheckResults, widthBp);
13389
12881
  return checkResults.map((checkResult) => {
13390
12882
  const left = Math.round(getLeftPx(display, checkResult.range, block));
13391
12883
  const [feature] = checkResult.featureIds;
@@ -13399,22 +12891,17 @@ const CheckResultWarnings = mobxReact.observer(function CheckResultWarnings({ di
13399
12891
  }
13400
12892
  const top = row * apolloRowHeight;
13401
12893
  const height = apolloRowHeight;
13402
- return (React__default["default"].createElement(material.Tooltip, { key: checkResult._id, title: checkResult.message },
13403
- React__default["default"].createElement(material.Box, { className: classes.box, style: {
12894
+ return (jsxRuntime.jsx(material.Tooltip, { title: checkResult.message, children: jsxRuntime.jsx(material.Box, { className: classes.box, style: {
13404
12895
  top,
13405
12896
  left,
13406
12897
  height,
13407
12898
  width: height,
13408
12899
  pointerEvents: apolloDragging ? 'none' : 'auto',
13409
- } },
13410
- React__default["default"].createElement(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, invisible: checkResult.count <= 1 },
13411
- React__default["default"].createElement(material.Avatar, { className: classes.avatar },
13412
- React__default["default"].createElement(ErrorIcon__default["default"], { "data-testid": `ErrorIcon-${checkResult.start}` }))))));
12900
+ }, children: jsxRuntime.jsx(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: { vertical: 'bottom', horizontal: 'right' }, invisible: checkResult.count <= 1, children: jsxRuntime.jsx(material.Avatar, { className: classes.avatar, children: jsxRuntime.jsx(ErrorIcon, { "data-testid": `ErrorIcon-${checkResult.start}` }) }) }) }) }, checkResult._id));
13413
12901
  });
13414
12902
  });
13415
12903
  });
13416
12904
 
13417
- /* eslint-disable @typescript-eslint/unbound-method */
13418
12905
  // Lock icon when isLocked === true
13419
12906
  const LinearApolloDisplay = mobxReact.observer(function LinearApolloDisplay(props) {
13420
12907
  const theme = material.useTheme();
@@ -13431,8 +12918,7 @@ const LinearApolloDisplay = mobxReact.observer(function LinearApolloDisplay(prop
13431
12918
  if (!isShown) {
13432
12919
  return null;
13433
12920
  }
13434
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
13435
- React__default["default"].createElement("div", { className: classes.canvasContainer, style: {
12921
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: classes.canvasContainer, style: {
13436
12922
  width: lgv.dynamicBlocks.totalWidthPx,
13437
12923
  height: featuresHeight,
13438
12924
  }, onContextMenu: (event) => {
@@ -13446,63 +12932,50 @@ const LinearApolloDisplay = mobxReact.observer(function LinearApolloDisplay(prop
13446
12932
  setContextCoord(coord);
13447
12933
  setContextMenuItems(getContextMenuItems(event));
13448
12934
  }
13449
- } },
13450
- session.isLocked ? (React__default["default"].createElement("div", { className: classes.locked, "data-testid": "lock-icon" },
13451
- React__default["default"].createElement(LockIcon__default["default"], null))) : null,
13452
- loading ? (React__default["default"].createElement("div", { className: classes.loading },
13453
- React__default["default"].createElement(material.CircularProgress, { size: "18px" }))) : null,
13454
- message ? (React__default["default"].createElement(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } } },
13455
- React__default["default"].createElement(material.Tooltip, { title: message },
13456
- React__default["default"].createElement("div", null, message)))) : (
13457
- // Promise.resolve() in these 3 callbacks is to avoid infinite rendering loop
13458
- // https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
13459
- React__default["default"].createElement(React__default["default"].Fragment, null,
13460
- React__default["default"].createElement("canvas", { ref: async (node) => {
13461
- await Promise.resolve();
13462
- setCollaboratorCanvas(node);
13463
- }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "collaboratorCanvas" }),
13464
- React__default["default"].createElement("canvas", { ref: async (node) => {
13465
- await Promise.resolve();
13466
- setCanvas(node);
13467
- }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "canvas" }),
13468
- React__default["default"].createElement("canvas", { ref: async (node) => {
13469
- await Promise.resolve();
13470
- setOverlayCanvas(node);
13471
- }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, onMouseMove: onMouseMove, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, className: classes.canvas, style: { cursor: cursor ?? 'default' }, "data-testid": "overlayCanvas" }),
13472
- React__default["default"].createElement(CheckResultWarnings, { display: model }),
13473
- React__default["default"].createElement(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
13474
- callback();
13475
- setContextMenuItems([]);
13476
- }, onClose: () => {
13477
- setContextMenuItems([]);
13478
- }, slotProps: {
13479
- transition: {
13480
- onExit: () => {
12935
+ }, children: [session.isLocked ? (jsxRuntime.jsx("div", { className: classes.locked, "data-testid": "lock-icon", children: jsxRuntime.jsx(LockIcon, {}) })) : null, loading ? (jsxRuntime.jsx("div", { className: classes.loading, children: jsxRuntime.jsx(material.CircularProgress, { size: "18px" }) })) : null, message ? (jsxRuntime.jsx(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } }, children: jsxRuntime.jsx(material.Tooltip, { title: message, children: jsxRuntime.jsx("div", { children: message }) }) })) : (
12936
+ // Promise.resolve() in these 3 callbacks is to avoid infinite rendering loop
12937
+ // https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
12938
+ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("canvas", { ref: async (node) => {
12939
+ await Promise.resolve();
12940
+ setCollaboratorCanvas(node);
12941
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "collaboratorCanvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
12942
+ await Promise.resolve();
12943
+ setCanvas(node);
12944
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "canvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
12945
+ await Promise.resolve();
12946
+ setOverlayCanvas(node);
12947
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, onMouseMove: onMouseMove, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, className: classes.canvas, style: { cursor: cursor ?? 'default' }, "data-testid": "overlayCanvas" }), jsxRuntime.jsx(CheckResultWarnings, { display: model }), jsxRuntime.jsx(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
12948
+ callback();
13481
12949
  setContextMenuItems([]);
13482
- },
13483
- },
13484
- }, anchorReference: "anchorPosition", anchorPosition: contextCoord
13485
- ? { top: contextCoord[1], left: contextCoord[0] }
13486
- : undefined, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenuItems }))))));
12950
+ }, onClose: () => {
12951
+ setContextMenuItems([]);
12952
+ }, slotProps: {
12953
+ transition: {
12954
+ onExit: () => {
12955
+ setContextMenuItems([]);
12956
+ },
12957
+ },
12958
+ }, anchorReference: "anchorPosition", anchorPosition: contextCoord
12959
+ ? { top: contextCoord[1], left: contextCoord[0] }
12960
+ : undefined, menuItems: contextMenuItems })] }))] }) }));
13487
12961
  });
13488
12962
 
13489
12963
  const TrackLines = mobxReact.observer(function TrackLines({ model, hrStyle = { margin: 0, top: 0, color: 'black' }, idx = 0, }) {
13490
12964
  const { apolloRowHeight, highestRow, showFeatureLabels } = model;
13491
12965
  const featureLabelSpacer = showFeatureLabels ? 2 : 1;
13492
- return (React__default["default"].createElement("div", { style: {
12966
+ return (jsxRuntime.jsx("div", { style: {
13493
12967
  position: 'absolute',
13494
12968
  left: 0,
13495
12969
  top: (apolloRowHeight * featureLabelSpacer * (highestRow + 1)) / 2 +
13496
12970
  idx * featureLabelSpacer * apolloRowHeight,
13497
12971
  width: '100%',
13498
- } },
13499
- React__default["default"].createElement("hr", { style: hrStyle })));
12972
+ }, children: jsxRuntime.jsx("hr", { style: hrStyle }) }));
13500
12973
  });
13501
12974
 
13502
12975
  const LinearApolloSixFrameDisplay = mobxReact.observer(function LinearApolloSixFrameDisplay(props, apolloDragging) {
13503
12976
  const theme = material.useTheme();
13504
12977
  const { model } = props;
13505
- const { apolloRowHeight, contextMenuItems: getContextMenuItems, cursor, featuresHeight, featureLabelSpacer, geneTrackRowNums, isShown, onMouseDown, onMouseLeave, onMouseMove, onMouseUp, regionCannotBeRendered, session, setCanvas, setCollaboratorCanvas, setOverlayCanvas, setTheme, showCheckResults, } = model;
12978
+ const { apolloRowHeight, contextMenuItems: getContextMenuItems, cursor, featuresHeight, geneTrackRowNums, isShown, onMouseDown, onMouseLeave, onMouseMove, onMouseUp, regionCannotBeRendered, session, setCanvas, setCollaboratorCanvas, setOverlayCanvas, setTheme, showCheckResults, showFeatureLabels, } = model;
13506
12979
  const { classes } = useStyles$1();
13507
12980
  const lgv = util.getContainingView(model);
13508
12981
  React.useEffect(() => {
@@ -13515,8 +12988,7 @@ const LinearApolloSixFrameDisplay = mobxReact.observer(function LinearApolloSixF
13515
12988
  return null;
13516
12989
  }
13517
12990
  const { assemblyManager } = session;
13518
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
13519
- React__default["default"].createElement("div", { className: classes.canvasContainer, style: {
12991
+ return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs("div", { className: classes.canvasContainer, style: {
13520
12992
  width: lgv.dynamicBlocks.totalWidthPx,
13521
12993
  height: featuresHeight,
13522
12994
  }, onContextMenu: (event) => {
@@ -13530,108 +13002,96 @@ const LinearApolloSixFrameDisplay = mobxReact.observer(function LinearApolloSixF
13530
13002
  setContextCoord(coord);
13531
13003
  setContextMenuItems(getContextMenuItems(event));
13532
13004
  }
13533
- } },
13534
- session.isLocked ? (React__default["default"].createElement("div", { className: classes.locked, "data-testid": "lock-icon" },
13535
- React__default["default"].createElement(LockIcon__default["default"], null))) : null,
13536
- message ? (React__default["default"].createElement(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } } },
13537
- React__default["default"].createElement(material.Tooltip, { title: message },
13538
- React__default["default"].createElement("div", null, message)))) : (
13539
- // Promise.resolve() in these 3 callbacks is to avoid infinite rendering loop
13540
- // https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
13541
- React__default["default"].createElement(React__default["default"].Fragment, null,
13542
- React__default["default"].createElement(TrackLines, { model: model, idx: 0 }),
13543
- React__default["default"].createElement(TrackLines, { model: model, hrStyle: { margin: 0, top: 0, color: 'grey', opacity: 0.4 }, idx: 1 }),
13544
- React__default["default"].createElement(TrackLines, { model: model, idx: 2 }),
13545
- React__default["default"].createElement("canvas", { ref: async (node) => {
13546
- await Promise.resolve();
13547
- setCollaboratorCanvas(node);
13548
- }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "collaboratorCanvas" }),
13549
- React__default["default"].createElement("canvas", { ref: async (node) => {
13550
- await Promise.resolve();
13551
- setCanvas(node);
13552
- }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "canvas" }),
13553
- React__default["default"].createElement("canvas", { ref: async (node) => {
13554
- await Promise.resolve();
13555
- setOverlayCanvas(node);
13556
- }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, onMouseMove: onMouseMove, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, className: classes.canvas, style: { cursor: cursor ?? 'default' }, "data-testid": "overlayCanvas" }),
13557
- lgv.displayedRegions.flatMap((region, idx) => {
13558
- const widthBp = lgv.bpPerPx * apolloRowHeight;
13559
- const assembly = assemblyManager.get(region.assemblyName);
13560
- if (showCheckResults) {
13561
- const filteredCheckResults = [
13562
- ...session.apolloDataStore.checkResults.values(),
13563
- ].filter((checkResult) => assembly?.isValidRefName(checkResult.refSeq) &&
13564
- assembly.getCanonicalRefName(checkResult.refSeq) ===
13565
- region.refName &&
13566
- util.doesIntersect2(region.start, region.end, checkResult.start, checkResult.end));
13567
- const checkResults = clusterResultByMessage(filteredCheckResults, widthBp, true);
13568
- return checkResults.map((checkResult) => {
13569
- const left = (lgv.bpToPx({
13570
- refName: region.refName,
13571
- coord: checkResult.start,
13572
- regionNumber: idx,
13573
- })?.offsetPx ?? 0) - lgv.offsetPx;
13574
- const [feature] = checkResult.featureIds;
13575
- if (!feature || !feature.parent?.looksLikeGene) {
13576
- return null;
13577
- }
13578
- let row;
13579
- for (const loc of feature.cdsLocations) {
13580
- for (const cds of loc) {
13581
- let rowNum = util.getFrame(cds.min, cds.max, feature.strand ?? 1, cds.phase);
13582
- rowNum = featureLabelSpacer(rowNum < 0 ? -1 * rowNum + 5 : rowNum);
13583
- if (checkResult.start >= cds.min &&
13584
- checkResult.start <= cds.max) {
13005
+ }, children: [session.isLocked ? (jsxRuntime.jsx("div", { className: classes.locked, "data-testid": "lock-icon", children: jsxRuntime.jsx(LockIcon, {}) })) : null, message ? (jsxRuntime.jsx(material.Alert, { severity: "warning", classes: { message: classes.ellipses }, slotProps: { root: { className: classes.center } }, children: jsxRuntime.jsx(material.Tooltip, { title: message, children: jsxRuntime.jsx("div", { children: message }) }) })) : (
13006
+ // Promise.resolve() in these 3 callbacks is to avoid infinite rendering loop
13007
+ // https://github.com/mobxjs/mobx/issues/3728#issuecomment-1715400931
13008
+ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(TrackLines, { model: model, idx: 0 }), jsxRuntime.jsx(TrackLines, { model: model, hrStyle: { margin: 0, top: 0, color: 'grey', opacity: 0.4 }, idx: 1 }), jsxRuntime.jsx(TrackLines, { model: model, idx: 2 }), jsxRuntime.jsx("canvas", { ref: async (node) => {
13009
+ await Promise.resolve();
13010
+ setCollaboratorCanvas(node);
13011
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "collaboratorCanvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
13012
+ await Promise.resolve();
13013
+ setCanvas(node);
13014
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, className: classes.canvas, "data-testid": "canvas" }), jsxRuntime.jsx("canvas", { ref: async (node) => {
13015
+ await Promise.resolve();
13016
+ setOverlayCanvas(node);
13017
+ }, width: lgv.dynamicBlocks.totalWidthPx, height: featuresHeight, onMouseMove: onMouseMove, onMouseLeave: onMouseLeave, onMouseDown: onMouseDown, onMouseUp: onMouseUp, className: classes.canvas, style: { cursor: cursor ?? 'default' }, "data-testid": "overlayCanvas" }), lgv.displayedRegions.flatMap((region, idx) => {
13018
+ const widthBp = lgv.bpPerPx * apolloRowHeight;
13019
+ const assembly = assemblyManager.get(region.assemblyName);
13020
+ if (showCheckResults) {
13021
+ const filteredCheckResults = [
13022
+ ...session.apolloDataStore.checkResults.values(),
13023
+ ].filter((checkResult) => assembly?.isValidRefName(checkResult.refSeq) &&
13024
+ assembly.getCanonicalRefName(checkResult.refSeq) ===
13025
+ region.refName &&
13026
+ util.doesIntersect2(region.start, region.end, checkResult.start, checkResult.end));
13027
+ const checkResults = clusterResultByMessage(filteredCheckResults, widthBp);
13028
+ return checkResults.map((checkResult) => {
13029
+ const left = (lgv.bpToPx({
13030
+ refName: region.refName,
13031
+ coord: checkResult.start,
13032
+ regionNumber: idx,
13033
+ })?.offsetPx ?? 0) - lgv.offsetPx;
13034
+ const [feature] = checkResult.featureIds;
13035
+ if (!feature || !feature.parent?.looksLikeGene) {
13036
+ return null;
13037
+ }
13038
+ let row;
13039
+ for (const loc of feature.cdsLocations) {
13040
+ for (const cds of loc) {
13041
+ const frame = util.getFrame(cds.min, cds.max, feature.strand ?? 1, cds.phase);
13042
+ const frameOffsets = showFeatureLabels
13043
+ ? [0, 5, 3, 1, 15, 13, 11]
13044
+ : [0, 2, 1, 0, 8, 7, 6];
13045
+ const rowNum = frameOffsets.at(frame);
13046
+ if (!rowNum) {
13047
+ continue;
13048
+ }
13049
+ if (checkResult.start >= cds.min &&
13050
+ checkResult.start <= cds.max) {
13051
+ row = rowNum - 1;
13052
+ break;
13053
+ }
13054
+ }
13055
+ }
13056
+ if (row === undefined) {
13057
+ const rowNum = feature.strand == 1
13058
+ ? geneTrackRowNums[0]
13059
+ : geneTrackRowNums[1];
13585
13060
  row = rowNum - 1;
13586
- break;
13587
13061
  }
13588
- }
13589
- }
13590
- if (row === undefined) {
13591
- const rowNum = feature.strand == 1
13592
- ? geneTrackRowNums[0]
13593
- : geneTrackRowNums[1];
13594
- row = rowNum - 1;
13062
+ const top = row * apolloRowHeight;
13063
+ const height = apolloRowHeight;
13064
+ return (jsxRuntime.jsx(material.Tooltip, { title: checkResult.message, children: jsxRuntime.jsx(material.Box, { className: classes.box, style: {
13065
+ top,
13066
+ left,
13067
+ height,
13068
+ width: height,
13069
+ pointerEvents: apolloDragging ? 'none' : 'auto',
13070
+ }, children: jsxRuntime.jsx(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: {
13071
+ vertical: 'bottom',
13072
+ horizontal: 'right',
13073
+ }, invisible: checkResult.count <= 1, children: jsxRuntime.jsx(material.Avatar, { className: classes.avatar, children: jsxRuntime.jsx(ErrorIcon, { "data-testid": `ErrorIcon-${checkResult.start}` }) }) }) }) }, checkResult._id));
13074
+ });
13595
13075
  }
13596
- const top = row * apolloRowHeight;
13597
- const height = apolloRowHeight;
13598
- return (React__default["default"].createElement(material.Tooltip, { key: checkResult._id, title: checkResult.message },
13599
- React__default["default"].createElement(material.Box, { className: classes.box, style: {
13600
- top,
13601
- left,
13602
- height,
13603
- width: height,
13604
- pointerEvents: apolloDragging ? 'none' : 'auto',
13605
- } },
13606
- React__default["default"].createElement(material.Badge, { className: classes.badge, badgeContent: checkResult.count, color: "primary", overlap: "circular", anchorOrigin: {
13607
- vertical: 'bottom',
13608
- horizontal: 'right',
13609
- }, invisible: checkResult.count <= 1 },
13610
- React__default["default"].createElement(material.Avatar, { className: classes.avatar },
13611
- React__default["default"].createElement(ErrorIcon__default["default"], { "data-testid": `ErrorIcon-${checkResult.start}` }))))));
13612
- });
13613
- }
13614
- return null;
13615
- }),
13616
- React__default["default"].createElement(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
13617
- callback();
13618
- setContextMenuItems([]);
13619
- }, onClose: () => {
13620
- setContextMenuItems([]);
13621
- }, slotProps: {
13622
- transition: {
13623
- onExit: () => {
13076
+ return null;
13077
+ }), jsxRuntime.jsx(ui.Menu, { open: contextMenuItems.length > 0, onMenuItemClick: (_, callback) => {
13078
+ callback();
13624
13079
  setContextMenuItems([]);
13625
- },
13626
- },
13627
- }, anchorReference: "anchorPosition", anchorPosition: contextCoord
13628
- ? { top: contextCoord[1], left: contextCoord[0] }
13629
- : undefined, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenuItems }))))));
13080
+ }, onClose: () => {
13081
+ setContextMenuItems([]);
13082
+ }, slotProps: {
13083
+ transition: {
13084
+ onExit: () => {
13085
+ setContextMenuItems([]);
13086
+ },
13087
+ },
13088
+ }, anchorReference: "anchorPosition", anchorPosition: contextCoord
13089
+ ? { top: contextCoord[1], left: contextCoord[0] }
13090
+ : undefined, style: { zIndex: theme.zIndex.tooltip }, menuItems: contextMenuItems })] }))] }) }));
13630
13091
  });
13631
13092
 
13632
- /* eslint-disable @typescript-eslint/unbound-method */
13633
13093
  const accordionControlHeight = 12;
13634
- const useStyles = mui.makeStyles()((theme) => ({
13094
+ const useStyles = tssReact.makeStyles()((theme) => ({
13635
13095
  shading: {
13636
13096
  background: material.alpha(theme.palette.primary.main, 0.2),
13637
13097
  overflowX: 'hidden',
@@ -13693,12 +13153,12 @@ const ResizeHandle = ({ onResize, }) => {
13693
13153
  return (
13694
13154
  // TODO: a11y
13695
13155
  // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
13696
- React__default["default"].createElement("div", { onMouseDown: (event) => {
13156
+ jsxRuntime.jsx("div", { onMouseDown: (event) => {
13697
13157
  event.stopPropagation();
13698
13158
  const controller = new AbortController();
13699
13159
  const { signal } = controller;
13700
13160
  function abortDrag() {
13701
- controller.abort('makeDisplayComponent');
13161
+ controller.abort(new DOMException('Canceling drag event listener', 'AbortError'));
13702
13162
  }
13703
13163
  globalThis.addEventListener('mousemove', mouseMove, { signal });
13704
13164
  globalThis.addEventListener('mouseup', abortDrag, { signal });
@@ -13710,11 +13170,7 @@ const ResizeHandle = ({ onResize, }) => {
13710
13170
  };
13711
13171
  const AccordionControl = mobxReact.observer(function AccordionControl({ onClick, onResize, open, title, }) {
13712
13172
  const { classes } = useStyles();
13713
- return (React__default["default"].createElement("div", { className: classes.accordionRoot },
13714
- open && onResize ? React__default["default"].createElement(ResizeHandle, { onResize: onResize }) : null,
13715
- React__default["default"].createElement("div", { className: classes.accordionControl, onClick: onClick },
13716
- open ? (React__default["default"].createElement(ExpandLessIcon__default["default"], { className: classes.expandIcon })) : (React__default["default"].createElement(ExpandMoreIcon__default["default"], { className: classes.expandIcon })),
13717
- title ? (React__default["default"].createElement(material.Typography, { className: classes.title, variant: "caption", component: "span" }, title)) : null)));
13173
+ return (jsxRuntime.jsxs("div", { className: classes.accordionRoot, children: [open && onResize ? jsxRuntime.jsx(ResizeHandle, { onResize: onResize }) : null, jsxRuntime.jsxs("div", { className: classes.accordionControl, onClick: onClick, children: [open ? (jsxRuntime.jsx(ExpandLessIcon, { className: classes.expandIcon })) : (jsxRuntime.jsx(ExpandMoreIcon, { className: classes.expandIcon })), title ? (jsxRuntime.jsx(material.Typography, { className: classes.title, variant: "caption", component: "span", children: title })) : null] })] }));
13718
13174
  });
13719
13175
  const LinearApolloDisplayComponent = mobxReact.observer(function DisplayComponent({ model, ...other }) {
13720
13176
  const session = util.getSession(model);
@@ -13731,28 +13187,19 @@ const LinearApolloDisplayComponent = mobxReact.observer(function DisplayComponen
13731
13187
  model.setDetailsHeight(model.detailsHeight - delta);
13732
13188
  };
13733
13189
  if (!ontologyStore) {
13734
- return (React__default["default"].createElement("div", { className: classes.alertContainer },
13735
- React__default["default"].createElement(material.Alert, { severity: "error" }, "Could not load feature type ontology.")));
13190
+ return (jsxRuntime.jsx("div", { className: classes.alertContainer, children: jsxRuntime.jsx(material.Alert, { severity: "error", children: "Could not load feature type ontology." }) }));
13736
13191
  }
13737
13192
  if (graphical && table) {
13738
13193
  const tabularHeight = tabularEditor.isShown ? model.detailsHeight : 0;
13739
13194
  const featureAreaHeight = isShown
13740
13195
  ? overallHeight - model.detailsHeight - accordionControlHeight * 2
13741
13196
  : 0;
13742
- return (React__default["default"].createElement("div", { style: { height: overallHeight } },
13743
- React__default["default"].createElement(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }),
13744
- React__default["default"].createElement("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight } },
13745
- React__default["default"].createElement(LinearApolloDisplay, { model: model, ...other })),
13746
- React__default["default"].createElement(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }),
13747
- React__default["default"].createElement("div", { className: classes.details, style: { height: tabularHeight } },
13748
- React__default["default"].createElement(TabularEditorPane, { model: model }))));
13197
+ return (jsxRuntime.jsxs("div", { style: { height: overallHeight }, children: [jsxRuntime.jsx(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }), jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight }, children: jsxRuntime.jsx(LinearApolloDisplay, { model: model, ...other }) }), jsxRuntime.jsx(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }), jsxRuntime.jsx("div", { className: classes.details, style: { height: tabularHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) })] }));
13749
13198
  }
13750
13199
  if (graphical) {
13751
- return (React__default["default"].createElement("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: overallHeight } },
13752
- React__default["default"].createElement(LinearApolloDisplay, { model: model, ...other })));
13200
+ return (jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: overallHeight }, children: jsxRuntime.jsx(LinearApolloDisplay, { model: model, ...other }) }));
13753
13201
  }
13754
- return (React__default["default"].createElement("div", { className: classes.details, style: { height: overallHeight } },
13755
- React__default["default"].createElement(TabularEditorPane, { model: model })));
13202
+ return (jsxRuntime.jsx("div", { className: classes.details, style: { height: overallHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) }));
13756
13203
  });
13757
13204
  const LinearApolloSixFrameDisplayComponent = mobxReact.observer(function DisplayComponent({ model, ...other }) {
13758
13205
  const session = util.getSession(model);
@@ -13769,34 +13216,25 @@ const LinearApolloSixFrameDisplayComponent = mobxReact.observer(function Display
13769
13216
  model.setDetailsHeight(detailsHeight - delta);
13770
13217
  };
13771
13218
  if (!ontologyStore) {
13772
- return (React__default["default"].createElement("div", { className: classes.alertContainer },
13773
- React__default["default"].createElement(material.Alert, { severity: "error" }, "Could not load feature type ontology.")));
13219
+ return (jsxRuntime.jsx("div", { className: classes.alertContainer, children: jsxRuntime.jsx(material.Alert, { severity: "error", children: "Could not load feature type ontology." }) }));
13774
13220
  }
13775
13221
  if (graphical && table) {
13776
13222
  const tabularHeight = tabularEditor.isShown ? detailsHeight : 0;
13777
13223
  const featureAreaHeight = isShown
13778
13224
  ? overallHeight - detailsHeight - accordionControlHeight * 2
13779
13225
  : 0;
13780
- return (React__default["default"].createElement("div", { style: { height: overallHeight } },
13781
- React__default["default"].createElement(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }),
13782
- React__default["default"].createElement("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight } },
13783
- React__default["default"].createElement(LinearApolloSixFrameDisplay, { model: model, ...other })),
13784
- React__default["default"].createElement(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }),
13785
- React__default["default"].createElement("div", { className: classes.details, style: { height: tabularHeight } },
13786
- React__default["default"].createElement(TabularEditorPane, { model: model }))));
13226
+ return (jsxRuntime.jsxs("div", { style: { height: overallHeight }, children: [jsxRuntime.jsx(AccordionControl, { open: isShown, title: "Graphical", onClick: toggleShown }), jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: featureAreaHeight }, children: jsxRuntime.jsx(LinearApolloSixFrameDisplay, { model: model, ...other }) }), jsxRuntime.jsx(AccordionControl, { title: "Table", open: tabularEditor.isShown, onClick: tabularEditor.togglePane, onResize: onDetailsResize }), jsxRuntime.jsx("div", { className: classes.details, style: { height: tabularHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) })] }));
13787
13227
  }
13788
13228
  if (graphical) {
13789
- return (React__default["default"].createElement("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: overallHeight } },
13790
- React__default["default"].createElement(LinearApolloSixFrameDisplay, { model: model, ...other })));
13229
+ return (jsxRuntime.jsx("div", { className: classes.shading, ref: canvasScrollContainerRef, style: { height: overallHeight }, children: jsxRuntime.jsx(LinearApolloSixFrameDisplay, { model: model, ...other }) }));
13791
13230
  }
13792
- return (React__default["default"].createElement("div", { className: classes.details, style: { height: overallHeight } },
13793
- React__default["default"].createElement(TabularEditorPane, { model: model })));
13231
+ return (jsxRuntime.jsx("div", { className: classes.details, style: { height: overallHeight }, children: jsxRuntime.jsx(TabularEditorPane, { model: model }) }));
13794
13232
  });
13795
13233
 
13796
13234
  function addTopLevelMenus(rootModel) {
13797
13235
  rootModel.insertInMenu('Apollo', {
13798
13236
  label: 'Redo',
13799
- icon: RedoIcon__default["default"],
13237
+ icon: RedoIcon,
13800
13238
  onClick(session) {
13801
13239
  const { apolloDataStore } = session;
13802
13240
  void apolloDataStore.changeManager.redoLastChange();
@@ -13804,7 +13242,7 @@ function addTopLevelMenus(rootModel) {
13804
13242
  }, 0);
13805
13243
  rootModel.insertInMenu('Apollo', {
13806
13244
  label: 'Undo',
13807
- icon: UndoIcon__default["default"],
13245
+ icon: UndoIcon,
13808
13246
  onClick(session) {
13809
13247
  const { apolloDataStore } = session;
13810
13248
  void apolloDataStore.changeManager.undoLastChange();
@@ -13812,7 +13250,7 @@ function addTopLevelMenus(rootModel) {
13812
13250
  }, 0);
13813
13251
  rootModel.appendToMenu('Apollo', {
13814
13252
  label: 'Download GFF3',
13815
- icon: DownloadIcon__default["default"],
13253
+ icon: DownloadIcon,
13816
13254
  onClick: (session) => {
13817
13255
  session.queueDialog((doneCallback) => [
13818
13256
  DownloadGFF3,
@@ -13827,7 +13265,7 @@ function addTopLevelMenus(rootModel) {
13827
13265
  });
13828
13266
  rootModel.appendToMenu('Apollo', {
13829
13267
  label: 'View Change Log',
13830
- icon: TrackChangesIcon__default["default"],
13268
+ icon: TrackChangesIcon,
13831
13269
  onClick: (session) => {
13832
13270
  session.queueDialog((doneCallback) => [
13833
13271
  ViewChangeLog,
@@ -13842,7 +13280,7 @@ function addTopLevelMenus(rootModel) {
13842
13280
  });
13843
13281
  rootModel.appendToMenu('Apollo', {
13844
13282
  label: 'Open local GFF3 file',
13845
- icon: FileOpenIcon__default["default"],
13283
+ icon: FileOpenIcon,
13846
13284
  onClick: (session) => {
13847
13285
  session.queueDialog((doneCallback) => [
13848
13286
  OpenLocalFile,
@@ -13858,7 +13296,7 @@ function addTopLevelMenus(rootModel) {
13858
13296
  });
13859
13297
  rootModel.appendToMenu('Apollo', {
13860
13298
  label: 'View check results',
13861
- icon: FactCheckIcon__default["default"],
13299
+ icon: FactCheckIcon,
13862
13300
  onClick: (session) => {
13863
13301
  session.queueDialog((doneCallback) => [
13864
13302
  ViewCheckResults,
@@ -13879,7 +13317,7 @@ function addTopLevelMenus(rootModel) {
13879
13317
  });
13880
13318
  rootModel.appendToMenu('Apollo', {
13881
13319
  label: 'Log out',
13882
- icon: LogoutIcon__default["default"],
13320
+ icon: LogoutIcon,
13883
13321
  onClick: (session) => {
13884
13322
  session.queueDialog((doneCallback) => [
13885
13323
  LogOut,
@@ -13895,6 +13333,7 @@ function addTopLevelMenus(rootModel) {
13895
13333
  }
13896
13334
 
13897
13335
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
13336
+ /* eslint-disable @typescript-eslint/no-confusing-void-expression */
13898
13337
  const ApolloJobModel = mobxStateTree.types
13899
13338
  .model('JobsManager', {})
13900
13339
  .views((self) => ({
@@ -14102,7 +13541,7 @@ function clientDataStoreFactory(AnnotationFeatureExtended) {
14102
13541
  statusMessage: `Loading ontology "${name}", version "${version}", this may take a while`,
14103
13542
  progressPct: 0,
14104
13543
  cancelCallback: () => {
14105
- controller.abort('ClientDataStore');
13544
+ controller.abort(new DOMException(`Canceling loading of ontology "${name}"`, 'AbortError'));
14106
13545
  jobsManager.abortJob(job.name);
14107
13546
  },
14108
13547
  };
@@ -14358,6 +13797,12 @@ function extendSession(pluginManager, sessionModel) {
14358
13797
  }
14359
13798
  }
14360
13799
  },
13800
+ }))
13801
+ .actions((self) => ({
13802
+ apolloSetEventualSelectedFeature: mobx.flow(function* apolloSetEventualSelectedFeature(featureId) {
13803
+ yield mobx.when(() => Boolean(self.apolloDataStore.getFeature(featureId)));
13804
+ self.apolloSetSelectedFeature(featureId);
13805
+ }),
14361
13806
  }))
14362
13807
  .volatile((self) => ({
14363
13808
  previousSnapshot: mobxStateTree.getSnapshot(self),
@@ -14463,6 +13908,10 @@ function extendSession(pluginManager, sessionModel) {
14463
13908
  console.error(error);
14464
13909
  continue;
14465
13910
  }
13911
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
13912
+ if (!jbrowseConfig.configuration.ApolloPlugin.hasRole) {
13913
+ continue;
13914
+ }
14466
13915
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call
14467
13916
  reloadPluginManagerCallback(jbrowseConfig, self.previousSnapshot);
14468
13917
  reaction.dispose();
@@ -14470,7 +13919,7 @@ function extendSession(pluginManager, sessionModel) {
14470
13919
  }, { name: 'ApolloSessionLoadConfig' }));
14471
13920
  },
14472
13921
  beforeDestroy() {
14473
- self.abortController.abort('destroying session model');
13922
+ self.abortController.abort(new DOMException('Clean up Apollo session', 'AbortError'));
14474
13923
  },
14475
13924
  }))
14476
13925
  .views((self) => {
@@ -14512,6 +13961,7 @@ function extendSession(pluginManager, sessionModel) {
14512
13961
  oldJBrowseConfig: filteredConfig,
14513
13962
  newJBrowseConfig: {
14514
13963
  ...filteredConfig,
13964
+ // @ts-expect-error The track types are in the snapshot
14515
13965
  tracks: filteredConfig?.tracks && [
14516
13966
  ...filteredConfig.tracks,
14517
13967
  newTrackConfigSnapshot,
@@ -14530,7 +13980,7 @@ function extendSession(pluginManager, sessionModel) {
14530
13980
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call
14531
13981
  jbrowse.addTrackConf(newTrackConfigSnapshot);
14532
13982
  },
14533
- icon: SaveIcon__default["default"],
13983
+ icon: SaveIcon,
14534
13984
  },
14535
13985
  ]
14536
13986
  : [
@@ -14570,7 +14020,7 @@ function extendSession(pluginManager, sessionModel) {
14570
14020
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call
14571
14021
  jbrowse.deleteTrackConf(conf);
14572
14022
  },
14573
- icon: SaveIcon__default["default"],
14023
+ icon: SaveIcon,
14574
14024
  },
14575
14025
  ];
14576
14026
  },
@@ -14607,6 +14057,9 @@ function extendSession(pluginManager, sessionModel) {
14607
14057
  }
14608
14058
 
14609
14059
  /* eslint-disable @typescript-eslint/unbound-method */
14060
+ /* eslint-disable @typescript-eslint/no-unnecessary-condition */
14061
+ /* eslint-disable @typescript-eslint/no-misused-promises */
14062
+ /* eslint-disable @typescript-eslint/no-explicit-any */
14610
14063
  function isApolloMessageData(data) {
14611
14064
  return (typeof data === 'object' &&
14612
14065
  data !== null &&
@@ -14623,7 +14076,7 @@ const transcriptCheck = new shared.TranscriptCheck();
14623
14076
  common.checkRegistry.registerCheck(transcriptCheck.name, transcriptCheck);
14624
14077
  shared.validationRegistry.registerValidation(new shared.CoreValidation());
14625
14078
  shared.validationRegistry.registerValidation(new shared.ParentChildValidation());
14626
- class ApolloPlugin extends Plugin__default["default"] {
14079
+ class ApolloPlugin extends Plugin {
14627
14080
  name = 'ApolloPlugin';
14628
14081
  version = version;
14629
14082
  configurationSchema = ApolloPluginConfigurationSchema;
@@ -14720,7 +14173,7 @@ class ApolloPlugin extends Plugin__default["default"] {
14720
14173
  ...superRubberBandMenuItems(),
14721
14174
  {
14722
14175
  label: 'Add new feature',
14723
- icon: AddIcon__default["default"],
14176
+ icon: AddIcon,
14724
14177
  onClick: () => {
14725
14178
  const session = util.getSession(self);
14726
14179
  const { leftOffset, rightOffset } = self;
@@ -14748,6 +14201,17 @@ class ApolloPlugin extends Plugin__default["default"] {
14748
14201
  });
14749
14202
  pluginManager.addToExtensionPoint('Core-extendPluggableElement', annotationFromPileup);
14750
14203
  pluginManager.addToExtensionPoint('Core-extendPluggableElement', annotationFromJBrowseFeature);
14204
+ pluginManager.addToExtensionPoint('LinearGenomeView-searchResultSelected', (_, props) => {
14205
+ const { session, result } = props;
14206
+ const trackId = result.getTrackId();
14207
+ const matchedFeature = result.matchedObject;
14208
+ if (trackId?.startsWith('apollo_track_') && matchedFeature) {
14209
+ const geneFeature = matchedFeature;
14210
+ void session.apolloSetEventualSelectedFeature(geneFeature._id);
14211
+ }
14212
+ /* eslint-disable-next-line @typescript-eslint/no-unsafe-return */
14213
+ return _;
14214
+ });
14751
14215
  if (!inWebWorker) {
14752
14216
  pluginManager.addToExtensionPoint('Core-extendWorker', (handle) => {
14753
14217
  if (!('on' in handle && handle.on)) {
@@ -14836,5 +14300,5 @@ class ApolloPlugin extends Plugin__default["default"] {
14836
14300
  }
14837
14301
  }
14838
14302
 
14839
- exports["default"] = ApolloPlugin;
14303
+ exports.default = ApolloPlugin;
14840
14304
  //# sourceMappingURL=jbrowse-plugin-apollo.cjs.development.js.map