@apollo-annotation/jbrowse-plugin-apollo 0.3.13 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts +1 -1
  2. package/dist/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.d.ts.map +1 -1
  3. package/dist/BackendDrivers/BackendDriver.d.ts +29 -4
  4. package/dist/BackendDrivers/BackendDriver.d.ts.map +1 -1
  5. package/dist/BackendDrivers/CollaborationServerDriver.d.ts +3 -1
  6. package/dist/BackendDrivers/CollaborationServerDriver.d.ts.map +1 -1
  7. package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts +22 -0
  8. package/dist/BackendDrivers/LocalDriver/LocalDriver.d.ts.map +1 -0
  9. package/dist/BackendDrivers/LocalDriver/db.d.ts +4 -0
  10. package/dist/BackendDrivers/LocalDriver/db.d.ts.map +1 -0
  11. package/dist/BackendDrivers/index.d.ts +1 -2
  12. package/dist/BackendDrivers/index.d.ts.map +1 -1
  13. package/dist/ChangeManager.d.ts +3 -3
  14. package/dist/ChangeManager.d.ts.map +1 -1
  15. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts +0 -6
  16. package/dist/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.d.ts.map +1 -1
  17. package/dist/FeatureDetailsWidget/TranscriptWidgetEditLocation.d.ts.map +1 -1
  18. package/dist/FeatureDetailsWidget/model.d.ts +0 -2
  19. package/dist/FeatureDetailsWidget/model.d.ts.map +1 -1
  20. package/dist/LinearApolloDisplay/components/CheckResultWarnings.d.ts.map +1 -1
  21. package/dist/LinearApolloDisplay/components/LinearApolloDisplay.d.ts.map +1 -1
  22. package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts +7 -0
  23. package/dist/LinearApolloDisplay/components/OverlayCanvas.d.ts.map +1 -0
  24. package/dist/LinearApolloDisplay/components/Tooltip.d.ts +10 -0
  25. package/dist/LinearApolloDisplay/components/Tooltip.d.ts.map +1 -0
  26. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts +0 -1
  27. package/dist/LinearApolloDisplay/glyphs/BoxGlyph.d.ts.map +1 -1
  28. package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts +3 -0
  29. package/dist/LinearApolloDisplay/glyphs/CDSGlyph.d.ts.map +1 -0
  30. package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts +3 -0
  31. package/dist/LinearApolloDisplay/glyphs/ExonGlyph.d.ts.map +1 -0
  32. package/dist/LinearApolloDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
  33. package/dist/LinearApolloDisplay/glyphs/GenericChildGlyph.d.ts.map +1 -1
  34. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts +26 -20
  35. package/dist/LinearApolloDisplay/glyphs/Glyph.d.ts.map +1 -1
  36. package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts +3 -0
  37. package/dist/LinearApolloDisplay/glyphs/TranscriptGlyph.d.ts.map +1 -0
  38. package/dist/LinearApolloDisplay/glyphs/util.d.ts +13 -0
  39. package/dist/LinearApolloDisplay/glyphs/util.d.ts.map +1 -1
  40. package/dist/LinearApolloDisplay/stateModel/base.d.ts +17 -0
  41. package/dist/LinearApolloDisplay/stateModel/base.d.ts.map +1 -1
  42. package/dist/LinearApolloDisplay/stateModel/index.d.ts +35 -17
  43. package/dist/LinearApolloDisplay/stateModel/index.d.ts.map +1 -1
  44. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts +29 -7
  45. package/dist/LinearApolloDisplay/stateModel/layouts.d.ts.map +1 -1
  46. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts +69 -23
  47. package/dist/LinearApolloDisplay/stateModel/mouseEvents.d.ts.map +1 -1
  48. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts +26 -9
  49. package/dist/LinearApolloDisplay/stateModel/rendering.d.ts.map +1 -1
  50. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts +6 -0
  51. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/base.d.ts.map +1 -1
  52. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts +6 -0
  53. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/index.d.ts.map +1 -1
  54. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts +6 -0
  55. package/dist/LinearApolloReferenceSequenceDisplay/stateModel/rendering.d.ts.map +1 -1
  56. package/dist/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.d.ts.map +1 -1
  57. package/dist/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.d.ts.map +1 -1
  58. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts +1 -1
  59. package/dist/LinearApolloSixFrameDisplay/glyphs/Glyph.d.ts.map +1 -1
  60. package/dist/LinearApolloSixFrameDisplay/stateModel/layouts.d.ts.map +1 -1
  61. package/dist/LinearApolloSixFrameDisplay/stateModel/rendering.d.ts.map +1 -1
  62. package/dist/OntologyManager/OntologyStore/fulltext.d.ts +1 -1
  63. package/dist/OntologyManager/OntologyStore/fulltext.d.ts.map +1 -1
  64. package/dist/OntologyManager/OntologyStore/index.d.ts +2 -2
  65. package/dist/OntologyManager/OntologyStore/index.d.ts.map +1 -1
  66. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts +1 -1
  67. package/dist/OntologyManager/OntologyStore/indexeddb-storage.d.ts.map +1 -1
  68. package/dist/OntologyManager/OntologyStore/types.d.ts +18 -0
  69. package/dist/OntologyManager/OntologyStore/types.d.ts.map +1 -0
  70. package/dist/TabularEditor/HybridGrid/featureContextMenuItems.d.ts.map +1 -1
  71. package/dist/components/AddChildFeature.d.ts.map +1 -1
  72. package/dist/components/ColorFeature.d.ts +13 -0
  73. package/dist/components/ColorFeature.d.ts.map +1 -0
  74. package/dist/components/CreateApolloAnnotation.d.ts.map +1 -1
  75. package/dist/components/DownloadGFF3.d.ts +4 -1
  76. package/dist/components/DownloadGFF3.d.ts.map +1 -1
  77. package/dist/components/DuplicateTranscript.d.ts.map +1 -1
  78. package/dist/components/ViewChangeLog.d.ts +2 -1
  79. package/dist/components/ViewChangeLog.d.ts.map +1 -1
  80. package/dist/components/ViewCheckResults.d.ts +2 -1
  81. package/dist/components/ViewCheckResults.d.ts.map +1 -1
  82. package/dist/components/index.d.ts +1 -1
  83. package/dist/components/index.d.ts.map +1 -1
  84. package/dist/config.d.ts +4 -0
  85. package/dist/config.d.ts.map +1 -0
  86. package/dist/extensions/annotationFromJBrowseFeature.d.ts.map +1 -1
  87. package/dist/extensions/annotationFromPileup.d.ts.map +1 -1
  88. package/dist/index.d.ts +11 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.esm.js +6325 -5997
  91. package/dist/index.esm.js.map +1 -1
  92. package/dist/jbrowse-plugin-apollo.cjs.development.js +5869 -5541
  93. package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
  94. package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
  95. package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
  96. package/dist/jbrowse-plugin-apollo.umd.development.js +16782 -25897
  97. package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
  98. package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
  99. package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
  100. package/dist/makeDisplayComponent.d.ts.map +1 -1
  101. package/dist/menus/Icons.d.ts +3 -0
  102. package/dist/menus/Icons.d.ts.map +1 -0
  103. package/dist/menus/topLevelMenu.d.ts.map +1 -1
  104. package/dist/session/changeHandlers.d.ts +9 -0
  105. package/dist/session/changeHandlers.d.ts.map +1 -0
  106. package/dist/util/annotationFeatureUtils.d.ts +2 -1
  107. package/dist/util/annotationFeatureUtils.d.ts.map +1 -1
  108. package/dist/util/glyphUtils.d.ts +3 -3
  109. package/dist/util/glyphUtils.d.ts.map +1 -1
  110. package/dist/util/index.d.ts +0 -1
  111. package/dist/util/index.d.ts.map +1 -1
  112. package/package.json +4 -4
  113. package/src/ApolloInternetAccount/model.ts +68 -4
  114. package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +6 -3
  115. package/src/ApolloTextSearchAdapter/ApolloTextSearchAdapter.ts +1 -1
  116. package/src/BackendDrivers/BackendDriver.ts +36 -3
  117. package/src/BackendDrivers/CollaborationServerDriver.ts +78 -23
  118. package/src/BackendDrivers/LocalDriver/LocalDriver.ts +367 -0
  119. package/src/BackendDrivers/LocalDriver/db.ts +37 -0
  120. package/src/BackendDrivers/index.ts +1 -2
  121. package/src/ChangeManager.ts +27 -25
  122. package/src/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.tsx +1 -1
  123. package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +69 -53
  124. package/src/LinearApolloDisplay/components/CheckResultWarnings.tsx +1 -5
  125. package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +95 -115
  126. package/src/LinearApolloDisplay/components/OverlayCanvas.tsx +76 -0
  127. package/src/LinearApolloDisplay/components/Tooltip.tsx +42 -0
  128. package/src/LinearApolloDisplay/glyphs/BoxGlyph.ts +60 -302
  129. package/src/LinearApolloDisplay/glyphs/CDSGlyph.ts +145 -0
  130. package/src/LinearApolloDisplay/glyphs/ExonGlyph.ts +212 -0
  131. package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +65 -999
  132. package/src/LinearApolloDisplay/glyphs/GenericChildGlyph.ts +71 -181
  133. package/src/LinearApolloDisplay/glyphs/Glyph.ts +42 -66
  134. package/src/LinearApolloDisplay/glyphs/TranscriptGlyph.ts +291 -0
  135. package/src/LinearApolloDisplay/glyphs/util.ts +87 -0
  136. package/src/LinearApolloDisplay/stateModel/base.ts +83 -0
  137. package/src/LinearApolloDisplay/stateModel/layouts.ts +198 -138
  138. package/src/LinearApolloDisplay/stateModel/mouseEvents.ts +252 -158
  139. package/src/LinearApolloDisplay/stateModel/rendering.ts +103 -21
  140. package/src/LinearApolloReferenceSequenceDisplay/drawSequenceOverlay.ts +3 -3
  141. package/src/LinearApolloReferenceSequenceDisplay/stateModel/base.ts +20 -2
  142. package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +7 -2
  143. package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +8 -13
  144. package/src/LinearApolloSixFrameDisplay/glyphs/Glyph.ts +1 -1
  145. package/src/LinearApolloSixFrameDisplay/stateModel/layouts.ts +4 -3
  146. package/src/LinearApolloSixFrameDisplay/stateModel/mouseEvents.ts +1 -1
  147. package/src/LinearApolloSixFrameDisplay/stateModel/rendering.ts +2 -1
  148. package/src/OntologyManager/OntologyStore/__snapshots__/index.test.ts.snap +18262 -8519
  149. package/src/OntologyManager/OntologyStore/fulltext.ts +1 -2
  150. package/src/OntologyManager/OntologyStore/index.test.ts +5 -2
  151. package/src/OntologyManager/OntologyStore/index.ts +7 -8
  152. package/src/OntologyManager/OntologyStore/indexeddb-storage.ts +2 -2
  153. package/src/OntologyManager/OntologyStore/types.ts +27 -0
  154. package/src/OntologyManager/index.ts +15 -26
  155. package/src/TabularEditor/HybridGrid/featureContextMenuItems.ts +4 -5
  156. package/src/components/AddChildFeature.tsx +15 -8
  157. package/src/components/ColorFeature.tsx +167 -0
  158. package/src/components/CreateApolloAnnotation.tsx +35 -9
  159. package/src/components/DownloadGFF3.tsx +92 -121
  160. package/src/components/DuplicateTranscript.tsx +10 -0
  161. package/src/components/ViewChangeLog.tsx +123 -83
  162. package/src/components/ViewCheckResults.tsx +15 -73
  163. package/src/components/index.ts +1 -1
  164. package/src/config.ts +37 -19
  165. package/src/extensions/annotationFromJBrowseFeature.test.ts +1 -1
  166. package/src/extensions/annotationFromJBrowseFeature.ts +91 -63
  167. package/src/extensions/annotationFromPileup.ts +40 -40
  168. package/src/index.ts +45 -1
  169. package/src/makeDisplayComponent.tsx +10 -3
  170. package/src/menus/Icons.tsx +49 -0
  171. package/src/menus/topLevelMenu.ts +24 -96
  172. package/src/session/ClientDataStore.ts +16 -17
  173. package/src/session/changeHandlers.ts +261 -0
  174. package/src/session/session.ts +77 -46
  175. package/src/util/annotationFeatureUtils.ts +29 -1
  176. package/src/util/glyphUtils.ts +74 -31
  177. package/src/util/index.ts +0 -1
  178. package/dist/BackendDrivers/DesktopFileDriver.d.ts +0 -160
  179. package/dist/BackendDrivers/DesktopFileDriver.d.ts.map +0 -1
  180. package/dist/BackendDrivers/InMemoryFileDriver.d.ts +0 -162
  181. package/dist/BackendDrivers/InMemoryFileDriver.d.ts.map +0 -1
  182. package/dist/LinearApolloDisplay/glyphs/index.d.ts +0 -4
  183. package/dist/LinearApolloDisplay/glyphs/index.d.ts.map +0 -1
  184. package/dist/components/OpenLocalFile.d.ts +0 -15
  185. package/dist/components/OpenLocalFile.d.ts.map +0 -1
  186. package/dist/util/loadAssemblyIntoClient.d.ts +0 -5
  187. package/dist/util/loadAssemblyIntoClient.d.ts.map +0 -1
  188. package/src/BackendDrivers/DesktopFileDriver.ts +0 -184
  189. package/src/BackendDrivers/InMemoryFileDriver.ts +0 -107
  190. package/src/LinearApolloDisplay/glyphs/index.ts +0 -3
  191. package/src/components/OpenLocalFile.tsx +0 -189
  192. package/src/util/loadAssemblyIntoClient.ts +0 -94
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@apollo-annotation/common"),t=require("@apollo-annotation/shared"),n=require("@jbrowse/core/Plugin"),o=require("@jbrowse/core/configuration"),a=require("@jbrowse/core/pluggableElementTypes"),s=require("@jbrowse/core/util"),r=require("@mui/icons-material/Add"),i=require("@mui/material"),l=require("@jbrowse/mobx-state-tree"),c=require("mobx"),d=require("socket.io-client"),u=require("@mui/icons-material/AdminPanelSettings"),f=require("@mui/icons-material/Delete"),g=require("@mui/icons-material/Input"),h=require("@mui/icons-material/Person"),p=require("@mui/icons-material/Rule"),m=require("react/jsx-runtime"),y=require("@jbrowse/core/util/tss-react"),b=require("@mui/icons-material/Info"),x=require("@mui/icons-material/Link"),S=require("@mui/icons-material/RadioButtonChecked"),w=require("@mui/icons-material/RadioButtonUnchecked"),C=require("bson-objectid"),v=require("react"),j=require("@gmod/gff"),T=require("@mui/icons-material/SkipNextRounded"),A=require("@mui/icons-material/SkipPreviousRounded"),F=require("@mui/x-data-grid"),D=require("@jbrowse/core/ui"),k=require("@mui/icons-material/Close"),N=require("mobx-react"),R=require("@jbrowse/core/util/types/mst"),I=require("idb/with-async-ittr"),M=require("@jbrowse/core/util/aborting"),L=require("jsonpath"),E=require("@jbrowse/core/util/io"),q=require("fast-deep-equal/es6"),P=require("file-saver"),O=require("nanoid"),_=require("@mui/icons-material/AccountCircle"),B=require("@jbrowse/core/pluggableElementTypes/AdapterType"),U=require("@jbrowse/core/data_adapters/BaseAdapter"),$=require("@jbrowse/core/util/rxjs"),G=require("@jbrowse/core/util/simpleFeature"),W=require("@jbrowse/core/TextSearch/BaseResults"),z=require("@mui/icons-material/ExpandMore"),H=require("@mui/icons-material/Edit"),V=require("@mui/icons-material/MoreHoriz"),J=require("@mui/icons-material/AddBox"),X=require("@apollo-annotation/mst"),K=require("@emotion/styled"),Z=require("@mui/icons-material/ContentCopy"),Y=require("@mui/icons-material/ContentCut"),Q=require("@mui/icons-material/Remove"),ee=require("@mui/icons-material/Clear"),te=require("@mui/icons-material/UnfoldLess"),ne=require("@jbrowse/core/util/tracks"),oe=require("@mui/icons-material/ExpandLess"),ae=require("@mui/icons-material/Lock"),se=require("@mui/icons-material/Error"),re=require("@mui/icons-material/Download"),ie=require("@mui/icons-material/FactCheck"),le=require("@mui/icons-material/FileOpen"),ce=require("@mui/icons-material/Logout"),de=require("@mui/icons-material/Redo"),ue=require("@mui/icons-material/TrackChanges"),fe=require("@mui/icons-material/Undo"),ge=require("@mui/icons-material/Save");const he=o.ConfigurationSchema("ApolloInternetAccount",{baseURL:{description:"Location of Apollo server",type:"string",defaultValue:""},tokenType:{description:"A custom name for a token to include in the header",type:"string",defaultValue:"Bearer"}},{baseConfiguration:a.BaseInternetAccountConfig,explicitlyTyped:!0});async function pe(e,n,o){const a=j.parseStringSync(n,{parseSequences:!0,parseComments:!0,parseDirectives:!1,parseFeatures:!0});if(0===a.length)throw new Error("No features found in GFF3 file");let s=0,r=o.assemblies.get(e);r||(r=o.addAssembly(e,"InMemoryFileDriver"));for(const e of a)if(Array.isArray(e)){const n=t.gff3ToAnnotationFeature(e),o=r.refSeqs.get(n.refSeq)??r.addRefSeq(n.refSeq,n.refSeq);o.features.has(n._id)||o.addFeature(n)}else if("comment"in e)r.addComment(e.comment);else{s++;let t=r.refSeqs.get(e.id);t||(t=r.addRefSeq(e.id,e.id,e.description)),e.description&&!t.description&&t.setDescription(e.description),t.addSequence({start:0,stop:e.sequence.length,sequence:e.sequence})}if(0===s)throw new Error("No embedded FASTA section found in GFF3");const i=await me(r);return o.addCheckResults(i),r}async function me(t){const n=[];for(const o of t.refSeqs.values())for(const t of o.features.values())for(const a of e.checkRegistry.getChecks().values()){const e=await a.checkFeature(l.getSnapshot(t),((e,t)=>Promise.resolve(o.getSequence(e,t))));n.push(...e)}return n}function ye(e){const{attributes:t}=e,n=t.get("gff_name");return n?n[0]:""}function be(e){const{attributes:t}=e,n=t.get("gff_id"),o=t.get("transcript_id"),a=t.get("exon_id"),s=t.get("protein_id");return n?n[0]:o?o[0]:a?a[0]:s?s[0]:""}function xe(e){const t=ye(e),n=be(e);return t?`: ${t}`:n?`: ${n}`:""}function Se(e,t,n=!1){const o=[];o.push(e);for(const t of function(e){const t=[];let{parent:n}=e;for(;n;)t.push(n),({parent:n}=n);return t}(e))o.push(t);const a=function(e){const t=[];if(e.children)for(const[,n]of e.children)t.push(n);return t}(e);for(const e of a)e.min<t&&e.max>=t&&o.push(e);if(!n)return o;if(e.parent){const n=e.parent.children;if(n)for(const[,a]of n)a._id!=e._id&&a.min<t&&a.max>=t&&o.push(a)}return o}function we(e,t){if(e.apolloDragging)return;e.setSelectedFeature(t);const{session:n}=e,{apolloDataStore:o}=n,{featureTypeOntology:a}=o.ontologyManager;if(!a)throw new Error("featureTypeOntology is undefined");let s=!1;for(const[,e]of t.children??[])if(a.isTypeOf(e.type,"CDS")||a.isTypeOf(e.type,"exon")){s=!0;break}(a.isTypeOf(t.type,"transcript")||a.isTypeOf(t.type,"pseudogenic_transcript"))&&s?e.showFeatureDetailsWidget(t,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(t)}function Ce(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")}function ve(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"exon")}function je(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"CDS")}function Te(e,t,n,o){const a=s.getContainingView(t),r=n.bp-a.bpPerPx*n.x,i=r+a.coarseTotalBp;if(!e.parent)return{upstream:void 0,downstream:void 0};const l=e.parent;if(!l.children)throw new Error(`Error getting children of ${l._id}`);const{featureTypeOntology:c}=o.apolloDataStore.ontologyManager;if(!c)throw new Error("featureTypeOntology is undefined");let d=[];for(const[,e]of l.children)c.isTypeOf(e.type,"exon")&&d.push(e);const u={upstream:void 0,downstream:void 0};d=d.sort(((e,t)=>e.min<t.min?-1:1));for(const e of d)if(e.min>i){u.downstream=e;break}d=d.sort(((e,t)=>e.min>t.min?-1:1));for(const e of d)if(e.max<r){u.upstream=e;break}if(-1===l.strand){const e=u.downstream;u.downstream=u.upstream,u.upstream=e}return u}function Ae(e,t,n){let o=T;return-1===e&&(o=A),t&&(o=o===A?T:A),n&&(o=o===A?T:A),o}function Fe(e,t,n,o){const a=o.bpToPx({refName:t,coord:e.min,regionNumber:n}),s=o.bpToPx({refName:t,coord:e.max,regionNumber:n});if(void 0===a||void 0===s)return;const{offsetPx:r}=o;return[a.offsetPx-r,s.offsetPx-r]}function De(e,t,n){const[o,a]=n;if(!(Math.abs(a-o)<8))return Math.abs(o-t)<4?{feature:e,edge:"min"}:Math.abs(a-t)<4?{feature:e,edge:"max"}:void 0}function ke(e,t){return Boolean(t&&e._id===t._id)}function Ne(e,t){return!!t&&(e._id===t._id||e.hasDescendant(t._id))}function Re(e){let t;t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id;const n=`(${(e.min+1).toLocaleString("en")}..${e.max.toLocaleString("en")})`;if(t&&t.length+n.length>65){const e=60-n.length;t=e>0?t.slice(0,e):"",t=`${t}[...]`}return`${t} ${n}`}function Ie(e,t){const{apolloInternetAccount:n,changeManager:o,regions:a,selectedFeature:r,session:i}=e,l=[],c=n?n.role:"admin",d="admin"===c,u=!(c&&["admin","user"].includes(c)),[f]=a,g=e.getAssemblyId(f.assemblyName),h=e.getAssemblyId(f.assemblyName);return l.push({label:Re(t),type:"subHeader"},{label:"Add child feature",disabled:u,onClick:()=>{i.queueDialog((e=>[wt,{session:i,handleClose:()=>{e()},changeManager:o,sourceFeature:t,sourceAssemblyId:g,internetAccount:n}]))}},{label:"Copy features and annotations",disabled:u,onClick:()=>{i.queueDialog((e=>[Rt,{session:i,handleClose:()=>{e()},changeManager:o,sourceFeature:t,sourceAssemblyId:h}]))}},{label:"Delete feature",disabled:!d,onClick:()=>{i.queueDialog((n=>[Mt,{session:i,handleClose:()=>{n()},changeManager:o,sourceFeature:t,sourceAssemblyId:h,selectedFeature:r,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),s.isSessionModelWithWidgets(i)&&l.push({label:"Open feature details",onClick:()=>{const e=i.addWidget("ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget",{feature:t,assembly:h,refName:f.refName});i.showWidget(e)}}),l}function Me(e,t,n){const o=(e.max-e.min)*t,a=Math.max(e.min-o,1),s=Math.min(e.max+o,n);return{refName:e.refSeq,start:a,end:s}}function Le(e,t,n){const o=[{featureId:e._id,oldLocation:e[n],newLocation:t}],{parent:a}=e;return a&&("min"===n&&a[n]>t||"max"===n&&a[n]<t)&&o.push(...Le(a,t,n)),o}function Ee(e,t,n,o,a){const s=e._id,r=[{featureId:s,oldLocation:e[n],newLocation:t}],{parent:i,children:l}=e;if(l)for(const[,e]of l)e._id!==a&&("min"===n&&e[n]<t||"max"===n&&e[n]>t)&&r.push(...Ee(e,t,n,o));if(i&&o){const e=[];if(i.children)for(const[,t]of i.children)t._id!==s&&e.push(t);if(0===e.length)r.push(...Ee(i,t,n,o,s));else{const a=i[n],l=Math[n](...e.map((e=>e[n])),t);l!==a&&r.push(...Ee(i,l,n,o,s))}}return r}function qe(e,t,n,o=!1){const a=e[n];if(t===a)throw new Error(`New and existing locations are the same: "${t}"`);return"min"===n?t>a?Ee(e,t,n,o):Le(e,t,n):t<a?Ee(e,t,n,o):Le(e,t,n)}function Pe(e){return"feature"in e}function Oe(e,t){const n=e.currentTarget,{clientX:o,clientY:a}=e,{left:s,top:r}=n.getBoundingClientRect(),i=o-s,l=a-r,{coord:c,index:d,refName:u}=t.pxToBp(i);return{x:i,y:l,refName:u,bp:c,regionNumber:d}}async function _e(e,t){let n;try{n=await e.text()}catch{n=""}return`${t?`${t} — `:""}${e.status} ${e.statusText}${n?` (${n})`:""}`}const Be=y.makeStyles()((e=>({dialogTitle:{background:e.palette.primary.main,color:e.palette.primary.contrastText,padding:e.spacing(2)},closeButton:{position:"absolute",right:e.spacing(1),top:e.spacing(1.5),color:e.palette.primary.contrastText}}))),Ue=N.observer((function(e){const{classes:t}=Be(),{handleClose:n,title:o,...a}=e;return m.jsx(D.Dialog,{...a,header:m.jsxs(m.Fragment,{children:[m.jsx(i.DialogTitle,{className:t.dialogTitle,children:o}),m.jsx(i.IconButton,{"aria-label":"close",onClick:n,className:t.closeButton,children:m.jsx(k,{})})]})})}));var $e;!function(e){e.GFF3="text/x-gff3",e.FASTA="text/x-fasta",e.BGZIP_FASTA="application/x-bgzip-fasta",e.FAI="text/x-fai",e.GZI="application/x-gzi",e.EXTERNAL="text/x-external"}($e||($e={}));const Ge=y.makeStyles()((e=>({accordion:{border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{borderBottom:0}},accordionSummary:{flexDirection:"row-reverse"},accordionDetails:{padding:e.spacing(2),borderTop:"1px solid rgba(0, 0, 0, .125)"},radioIcon:{color:e.palette.tertiary.contrastText},dialog:{minWidth:550,maxWidth:800}})));function We(e,t,n,o,a,s,r,i,l){return!(!e||!(t&&o||n===$e.GFF3&&o||o&&a&&s||r&&i&&l))}function ze({changeManager:e,handleClose:n,session:a}){const{classes:s}=Ge(),{internetAccounts:r}=l.getRoot(a),{notify:c}=a,d=r.filter((e=>"ApolloInternetAccount"===e.type));if(0===d.length)throw new Error("No Apollo internet account found");const[u,f]=v.useState(""),[g,h]=v.useState(""),[p,y]=v.useState(!1),[j,T]=v.useState($e.BGZIP_FASTA),[A,F]=v.useState(!0),[D,k]=v.useState(!1),[N,R]=v.useState(!1),[I,M]=v.useState(!0),[L,E]=v.useState(null),[q,P]=v.useState(null),[O,_]=v.useState(null),[B,U]=v.useState(""),[$,G]=v.useState(""),[W,z]=v.useState(""),[H,V]=v.useState(!1),[J,X]=v.useState(!1),[K,Z]=v.useState(!1);async function Y(e,t){const{jobsManager:n}=a,o=new AbortController,[{baseURL:s,getFetcher:r}]=d,i=new URL("files",s);i.searchParams.set("type",t);const l=i.href,c=new FormData;let f=e.name;const g=t===$e.BGZIP_FASTA||t===$e.FASTA&&(!D||J)||t===$e.GFF3&&K;g&&!e.name.toLocaleLowerCase().endsWith(".gz")?f=`${f}.gz`:!g&&e.name.toLocaleLowerCase().endsWith(".gz")&&(f=`${f}.txt`),c.append("file",e,f),c.append("type",t);const p=r({locationType:"UriLocation",uri:l}),m={name:`UploadAssemblyFile for ${u}`,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{o.abort(new DOMException(`Canceling adding of assembly "${u}"`,"AbortError")),n.abortJob(m.name)}};n.runJob(m),n.update(m.name,`Uploading ${e.name}, this may take awhile`);const{signal:y}=o,b=await p(l,{method:"POST",body:c,signal:y});if(!b.ok){const e=await _e(b,"Error when inserting new assembly (while uploading file)");return n.abortJob(m.name,e),h(e),""}const x=(await b.json())._id;return n.done(m),x}let Q=!1;try{const e=new URL(B);"http:"!==e.protocol&&"https:"!==e.protocol||(Q=!0)}catch{}let ee=!1;try{const e=new URL($);"http:"!==e.protocol&&"https:"!==e.protocol||(ee=!0)}catch{}let te=!1;try{const e=new URL(W);"http:"!==e.protocol&&"https:"!==e.protocol||(te=!0)}catch{}const[ne,oe]=v.useState("panelFastaInput"),ae=e=>(t,n)=>{n&&oe(e)};return m.jsxs(Ue,{open:!0,handleClose:n,"data-testid":"add-assembly-dialog",title:"Add new assembly",maxWidth:!1,children:[m.jsxs("form",{onSubmit:async function(o){let a;if(o.preventDefault(),h(""),R(!0),V(!0),c(`Assembly "${u}" is being added`,"info"),n(),o.preventDefault(),j===$e.EXTERNAL)a=new t.AddAssemblyFromExternalChange({typeName:"AddAssemblyFromExternalChange",assembly:(new C).toHexString(),assemblyName:u,externalLocation:{fa:B,fai:$,gzi:W}});else{if(!L)throw new Error("Missing fasta file");if(j===$e.GFF3&&A){const e=await Y(L,$e.GFF3);a=new t.AddAssemblyAndFeaturesFromFileChange({typeName:"AddAssemblyAndFeaturesFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e},parseOptions:{strict:I}})}else if(j===$e.GFF3){const e=await Y(L,$e.GFF3);a=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e}})}else if(D){const e=await Y(L,$e.FASTA);a=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e}})}else{if(!q||!O)throw new Error("Missing fasta index files");const e=await Y(L,$e.BGZIP_FASTA),n=await Y(q,$e.FAI),o=await Y(O,$e.GZI);a=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e,fai:n,gzi:o}})}}const[{internetAccountId:s}]=d;await e.submit(a,{internetAccountId:s,updateJobsManager:!0}),R(!1),V(!1)},"data-testid":"submit-form",children:[m.jsxs(i.DialogContent,{className:s.dialog,children:[H?m.jsx(i.LinearProgress,{}):null,m.jsx(i.TextField,{margin:"dense",id:"name",label:"Assembly name",type:"TextField",fullWidth:!0,variant:"outlined",onChange:e=>{R(!1),f(e.target.value),function(e){const{assemblies:t}=a;t.find((t=>o.readConfObject(t,"displayName")===e))?(y(!1),h(`Assembly ${e} already exists.`)):(y(!0),h(""))}(e.target.value)},disabled:N&&!g}),m.jsxs(i.Accordion,{disableGutters:!0,elevation:0,square:!0,className:s.accordion,expanded:"panelFastaInput"===ne,onChange:ae("panelFastaInput"),children:[m.jsx(i.AccordionSummary,{className:s.accordionSummary,expandIcon:"panelFastaInput"===ne?m.jsx(S,{className:s.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):m.jsx(w,{className:s.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelFastaInputd-content",id:"panelFastaInputd-header",children:m.jsx(i.Typography,{component:"span",children:"FASTA input"})}),m.jsx(i.AccordionDetails,{className:s.accordionDetails,children:m.jsxs(i.FormGroup,{children:[m.jsx(i.FormControlLabel,{"data-testid":"files-on-url-checkbox",control:m.jsx(i.Checkbox,{onChange:()=>{T(j===$e.EXTERNAL?$e.BGZIP_FASTA:$e.EXTERNAL),j===$e.EXTERNAL&&k(!1)},checked:j===$e.EXTERNAL,disabled:D&&j!==$e.GFF3}),label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Use external URLs",m.jsx(i.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:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{"data-testid":"sequence-is-editable-checkbox",control:m.jsx(i.Checkbox,{onChange:()=>{k(!D)}}),checked:D,disabled:j===$e.EXTERNAL,label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Store sequence in database",m.jsx(i.Tooltip,{title:"Enables users to edit the genomic sequence, but comes with performance impacts. Use with care.",placement:"top-start",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{"data-testid":"fasta-is-gzip-checkbox",control:m.jsx(i.Checkbox,{checked:!D||J,onChange:()=>{X(!D||!J)},disabled:!D}),label:"FASTA is gzip compressed"}),m.jsx(i.Table,j===$e.BGZIP_FASTA||j===$e.GFF3?{size:"small",sx:{mt:2},children:m.jsxs(i.TableBody,{children:[m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:[m.jsx("span",{children:"FASTA"}),m.jsx(i.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:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx("input",{"data-testid":"fasta-input-file",type:"file",onChange:e=>{const t=e.target.files?.item(0);t&&(E(t),t.name.endsWith(".gz")&&X(!0))},disabled:N&&!g})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA index (.fai)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx("input",{"data-testid":"fai-input-file",type:"file",onChange:e=>{P(e.target.files?.item(0)??null)},disabled:N&&!g||D})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA binary index (.gzi)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx("input",{"data-testid":"gzi-input-file",type:"file",onChange:e=>{_(e.target.files?.item(0)??null)},disabled:N&&!g||D})})]})]})}:{size:"small",sx:{mt:2},children:m.jsxs(i.TableBody,{children:[m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:[m.jsx("span",{children:"FASTA"}),m.jsx(i.Tooltip,{title:"Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx(i.TextField,{"data-testid":"fasta-input-url",variant:"outlined",value:B,error:!Q,onChange:e=>{const{value:t}=e.target;U(t),G(t?`${t}.fai`:""),z(t?`${t}.gzi`:"")},disabled:N&&!g,slotProps:{input:{startAdornment:m.jsx(i.InputAdornment,{position:"start",children:m.jsx(x,{})})}}})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA index (.fai)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx(i.TextField,{"data-testid":"fai-input-url",variant:"outlined",value:$,error:!ee,onChange:e=>{G(e.target.value)},disabled:N&&!g,slotProps:{input:{startAdornment:m.jsx(i.InputAdornment,{position:"start",children:m.jsx(x,{})})}}})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA binary index (.gzi)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx(i.TextField,{"data-testid":"gzi-input-url",variant:"outlined",value:W,error:!te,onChange:e=>{z(e.target.value)},disabled:N&&!g,slotProps:{input:{startAdornment:m.jsx(i.InputAdornment,{position:"start",children:m.jsx(x,{})})}}})})]})]})})]})})]}),m.jsxs(i.Accordion,{disableGutters:!0,elevation:0,square:!0,className:s.accordion,expanded:"panelGffInput"===ne,onChange:ae("panelGffInput"),children:[m.jsx(i.AccordionSummary,{className:s.accordionSummary,expandIcon:"panelGffInput"===ne?m.jsx(S,{className:s.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):m.jsx(w,{className:s.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelGffInputd-content",children:m.jsxs(i.Typography,{component:"span",children:["GFF3 input",m.jsx(i.Tooltip,{title:"GFF3 must includes FASTA sequences. File can be gzip compressed.",children:m.jsx(b,{className:s.radioIcon,sx:{fontSize:18}})})]})}),m.jsx(i.AccordionDetails,{className:s.accordionDetails,children:m.jsxs(i.Box,{style:{marginTop:20},children:[m.jsx("input",{"data-testid":"gff3-input-file",type:"file",disabled:N&&!g,onChange:e=>{const t=e.target.files?.item(0);t&&(E(t),T($e.GFF3),t.name.endsWith(".gz")&&Z(!0))}}),m.jsxs(i.FormGroup,{style:{display:"grid"},children:[m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:A,onChange:()=>{F(!A)},disabled:N&&!g}),label:"Load features from GFF3 file"}),m.jsx(i.FormControlLabel,{label:"Strict parsing",disabled:!A||N&&!g,control:m.jsx(i.Checkbox,{checked:I,onChange:e=>{M(e.target.checked)}})}),m.jsx(i.FormHelperText,{children:"Don't import any features if any lines in the GFF3 are unable to be processed"}),m.jsx(i.FormControlLabel,{"data-testid":"gff3-is-gzip-checkbox",control:m.jsx(i.Checkbox,{checked:K,onChange:()=>{Z(!K)},disabled:N&&!g}),label:"GFF3 is gzip compressed"})]})]})})]})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!We(p,D,j,L,q,O,Q,ee,te)||N,variant:"contained",type:"submit","data-testid":"submit-button",children:N?"Submitting...":"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),g?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:g})}):null]})}const He=[{field:"name",headerName:"Assembly Name",width:150,editable:!1},{field:"aliases",headerName:"Aliases",width:300,editable:!0}];function Ve({changeManager:e,handleClose:n,session:o}){const{apolloDataStore:a}=o,{collaborationServerDriver:s}=a,r=s.getAssemblies().map((e=>({id:e.name,name:e.displayName,aliases:e.aliases.join(", ")}))),[l,c]=v.useState("");return m.jsxs(Ue,{open:!0,title:"Add assembly aliases",handleClose:n,maxWidth:"sm","data-testid":"add-assembly-alias",fullWidth:!0,children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.Box,{sx:{height:400,width:"100%"},children:m.jsx(F.DataGrid,{rows:r,columns:He,initialState:{pagination:{paginationModel:{pageSize:5}}},pageSizeOptions:[5],processRowUpdate:(o,a)=>{const s=new t.AddAssemblyAliasesChange({typeName:"AddAssemblyAliasesChange",assembly:o.id,aliases:o.aliases.split(",")});return e.submit(s).catch((()=>{c("Error submitting change")})),n(),o},disableRowSelectionOnClick:!0})})}),l?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:l})}):null]})}const Je=new Set(["i","me","my","myself","we","our","ours","ourselves","you","your","yours","yourself","yourselves","he","him","his","himself","she","her","hers","herself","it","its","itself","they","them","their","theirs","themselves","what","which","who","whom","this","that","these","those","am","is","are","was","were","be","been","being","have","has","had","having","do","does","did","doing","a","an","the","and","but","if","or","because","as","until","while","of","at","by","for","with","about","against","between","into","through","during","before","after","above","below","to","from","up","down","in","out","on","off","over","under","again","further","then","once","here","there","when","where","why","how","all","any","both","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","s","t","can","will","just","don","should","now","0","1","2","3","4","5","6","7","8","9"]);function Xe(e,t){for(const[n,o]of t.entries())if(e.startsWith(o))return e.replace(o,String(n));return e}const Ke="$PREFIXED_ID";function Ze(e,t,n){if(t===Ke)return[Xe(e.id,n)];let o;try{o=L.query(e,t)}catch{o=L.query(JSON.parse(JSON.stringify(e)),t)}return o}function Ye(e){return e.toLowerCase().split(/[^\d:A-Za-z]+/).filter((e=>e&&!Je.has(e)))}function*Qe(e){for(const t of e)yield*Ye(t)}function*et(e){for(const t of e)if("string"==typeof t)yield t;else if("object"==typeof t){const e=L.query(t,"$..*");yield*et(e)}}function*tt(e,t,n){for(const o of t){const t=Ze(e,o,n);if(t.length>0)for(const e of Qe(et(t)))yield[o,e]}}async function nt(e,t,n){const o=await this.db,a=t??o.transaction(["nodes"]);M.checkAbortSignal(n);const s=[...Ye(e)],r=[],i=new Map;r.push(...s.map((async(e,t)=>{M.checkAbortSignal(n);const o=a.objectStore("nodes").index("full-text-words");for await(const a of o.iterate(IDBKeyRange.bound(e,`${e}￿`,!1,!1))){M.checkAbortSignal(n);const e=a.value,o=i.get(e.id)??[e,new Set];o[1].add(t),i.set(e.id,o)}}))),await Promise.all(r),M.checkAbortSignal(n);const l=[];for(const[,[e,t]]of i)M.checkAbortSignal(n),l.push(...ot(this.textIndexFields,e,t,s,this.prefixes));return l.sort(((e,t)=>t.score-e.score)),l.slice(0,this.options.maxSearchResults??this.DEFAULT_MAX_SEARCH_RESULTS)}function ot(e,t,n,o,a){const s=[...n].sort().map((e=>o[e])),r=s.map((e=>{const t=e.replaceAll(/[$()*+./?[\\\]^{|}-]/g,String.raw`\$&`);return new RegExp(`\\b${t}`,"gi")}));let i=[],l=0;for(const[n,s]of e.entries()){const c=new Set,d=e.length-n-1,u=[...et(Ze(t,s.jsonPath,a))];for(const e of u){let n=0;const a=[];for(const[t,s]of r.entries())for(const r of e.matchAll(s)){n+=1+1*d,c.add(t);const s=r.index,i=o[t];void 0!==s&&(n+=.01*i.length,n+=i.length/e.length*100*.05,a.push({wordIndex:t,position:s}))}n+=100*c.size,l<n&&(l=n),a.sort(((e,t)=>e.position-t.position)),a.length>0&&i.push({term:t,field:s,str:e,score:n,wordMatches:a})}}i=i.filter((e=>e.score===l));for(const e of i){const{wordMatches:t}=e;for(let n=0;n<t.length-1;n++){const o=t[n],a=t[n+1],r=a.wordIndex-o.wordIndex;if(1===r||-1===r){e.score+=1,1===r&&(e.score+=1);const t=Math.abs(a.position-(o.position+s[o.wordIndex].length))-1;e.score-=.05*t}}}return i}function at(e){return"string"==typeof e.id}function st(e){return"string"==typeof e.sub&&"string"==typeof e.pred&&"string"==typeof e.obj}function rt(e){return Boolean(e.meta?.deprecated)}async function it(e){return I.openDB(e,2,{upgrade(e,t,n,o,a){if(t<2&&(e.objectStoreNames.contains("meta")&&e.deleteObjectStore("meta"),e.objectStoreNames.contains("nodes")&&e.deleteObjectStore("nodes"),e.objectStoreNames.contains("edges")&&e.deleteObjectStore("edges")),e.objectStoreNames.contains("meta")||e.createObjectStore("meta"),!e.objectStoreNames.contains("nodes")){e.createObjectStore("nodes",{keyPath:"id"});const t=o.objectStore("nodes");t.createIndex("by-label","lbl"),t.createIndex("by-type","type"),t.createIndex("by-synonym",["meta","synonyms","val"]),t.createIndex("full-text-words","fullTextWords",{multiEntry:!0})}if(!e.objectStoreNames.contains("edges")){e.createObjectStore("edges",{autoIncrement:!0});const t=o.objectStore("edges");t.createIndex("by-subject","sub"),t.createIndex("by-object","obj"),t.createIndex("by-predicate","pred")}}})}function lt(e){const t=new Set;for(const[,n]of e)t.add(n);return[...t]}async function ct(e){const t=Date.now();let n,o=1;this.options.update?.("Parsing JSON",o);try{n=JSON.parse(await E.openLocation(this.sourceLocation).readFile("utf8"))}catch{throw new Error("Error in loading ontology")}o+=5,this.options.update?.("Parsing JSON complete",o);const a=Date.now(),[s,...r]=n.graphs??[];if(s){if(r.length>0)throw new Error("multiple graphs not supported");try{const n=e.transaction(["meta","nodes","edges"],"readwrite");await n.objectStore("meta").clear(),await n.objectStore("nodes").clear(),await n.objectStore("edges").clear();const r=n.objectStore("nodes"),i=dt.call(this).map((e=>e.jsonPath));if(s.nodes){let e=Math.round(o);for(const[,t]of s.nodes.entries())o+=1/s.nodes.length*64,Math.round(o)!=e&&o<100&&(this.options.update?.("Processing nodes",o),e=Math.round(o)),at(t)&&await r.add({...t,fullTextWords:lt(tt(t,i,this.prefixes))})}const l=n.objectStore("edges");if(s.edges){let e=Math.round(o);for(const[,t]of s.edges.entries())o+=1/s.edges.length*30,Math.round(o)!=e&&o<100&&(this.options.update?.("Processing edges",o),e=Math.round(o)),st(t)&&await l.add(t)}await n.done;const c=e.transaction("meta","readwrite"),{update:d,...u}=this.options;await c.objectStore("meta").add({ontologyRecord:{name:this.ontologyName,version:this.ontologyVersion,sourceLocation:this.sourceLocation},storeOptions:u,graphMeta:s.meta,timestamp:String(new Date),schemaVersion:2,timings:{overall:Date.now()-t,load:Date.now()-a}},"meta"),await c.done}catch(t){throw await e.transaction("meta","readwrite").objectStore("meta").clear(),t}}}function dt(){return[{displayName:"ID",jsonPath:Ke},...this.options.textIndexing?.indexFields??pt]}async function ut(e){const[t]=await e.transaction("meta").objectStore("meta").getAll();return!!t&&q(this.options.prefixes,t.storeOptions.prefixes)&&q(this.options.textIndexing,t.storeOptions.textIndexing)}class ft{ontologyName;ontologyVersion;sourceLocation;db;options;loadOboGraphJson=ct;getTermsByFulltext=nt;openDatabase=it;isDatabaseCurrent=ut;get textIndexFields(){return dt.call(this)}get prefixes(){return this.options.prefixes??new Map}DEFAULT_MAX_SEARCH_RESULTS=100;constructor(e,t,n,o){this.ontologyName=e,this.ontologyVersion=t,this.sourceLocation=n,this.options=o??{},this.db=this.prepareDatabase()}validate(){const e=[],{sourceLocation:t,sourceType:n}=this;return n?"obo-graph-json"!==n&&e.push(new Error(`ontology source file ${JSON.stringify(t)} has type ${n}, which is not yet supported`)):e.push(new Error(`unable to determine format of ontology source file ${JSON.stringify(t)}, file name must end with ".json", ".obo", or ".owl"`)),e}get sourceType(){if(s.isUriLocation(this.sourceLocation)){if(this.sourceLocation.uri.endsWith(".json"))return"obo-graph-json"}else if(s.isLocalPathLocation(this.sourceLocation)&&this.sourceLocation.localPath.endsWith(".json"))return"obo-graph-json"}get dbName(){return`Apollo Ontology "${this.ontologyName}" "${this.ontologyVersion}"`}async prepareDatabase(){const e=this.validate();if(e.length>0)throw e;const t=await this.openDatabase(this.dbName);if(await this.isDatabaseCurrent(t))return t;try{const{options:e,sourceLocation:n,sourceType:o}=this;if("obo-graph-json"!==o)throw new Error(`ontology source file ${JSON.stringify(n)} has type ${o}, which is not yet supported`);return e.update?.("",0),await this.loadOboGraphJson(t),e.update?.("",100),t}catch(e){throw t.close(),await I.deleteDB(this.dbName),e}}async termCount(e){const t=await this.db;return(e??t.transaction("nodes")).objectStore("nodes").count()}unique(e){const t=new Map,n=[];for(const o of e)t.has(o.id)||(t.set(o.id,!0),n.push(o));return n}async getTermsWithLabelOrSynonym(e,t,n){const o=t?.includeSubclasses??!0,a=await this.db,s=n??a.transaction(["nodes","edges"]),r=s.objectStore("nodes"),i=[...await r.index("by-label").getAll(e),...await r.index("by-synonym").getAll(e)];if(o){const e=await this.recurseEdges("by-object",i.map((e=>e.id)),(e=>"is_a"===e.pred),"sub",s);for(const t of e){const e=await r.get(t);e&&i.push(e)}}return i}async getPropertiesByLabel(e,t,n){const o=t?.includeSubProperties??!0,a=await this.db,s=n??a.transaction(["nodes","edges"]),r=(await this.getTermsWithLabelOrSynonym(e,{includeSubclasses:!1},s)).filter((e=>bt(e)));if(o){const e=await this.recurseEdges("by-object",r.map((e=>e.id)),(e=>"subPropertyOf"===e.pred),"sub",s),t=s.objectStore("nodes");for(const n of e){const e=await t.get(n);e&&bt(e)&&r.push(e)}}return r}async recurseEdges(e,t,n,o,a){const s=new Set;return await async function t(r){await Promise.all([...r].map((async r=>{const i=(await a.objectStore("edges").index(e).getAll(r)).filter((e=>n(e))).map((e=>e[o]));if(i.length>0){for(const e of i)s.add(e);await t(i)}})))}(t),s.values()}async*expandNodeSet(e,t="is_a",n,o){const a=await this.db,s=o??a.transaction(["edges"]),r=[...e],i=await this.recurseEdges("subclasses"===n?"by-object":"by-subject",r,(e=>e.pred===t),"subclasses"===n?"sub":"obj",s);for(const e of r)yield e;for(const e of i)yield e}expandSubclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"subclasses",n)}expandSuperclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"superclasses",n)}async getClassesThat(e,t,n){const o=await this.db,a=n??o.transaction(["nodes","edges"]),s=await this.getPropertiesByLabel(e,{includeSubProperties:!0},a),r=new Set(s.map((e=>e.id))),i=await async function(e){const t=[];for await(const n of e)t.push(n);return t}(this.expandSuperclasses(t.map((e=>e.id)),"is_a",a)),l=await this.recurseEdges("by-object",i,(e=>r.has(e.pred)),"sub",a),c=this.expandSubclasses(l,"is_a",a),d=[];for await(const e of c){const t=await a.objectStore("nodes").get(e);t&&yt(t)&&!rt(t)&&d.push(t)}return d}async getClassesWithoutPropertyLabeled(e,t,n){const o=await this.db,a=n??o.transaction(["nodes","edges"]),s=a.objectStore("nodes"),r=a.objectStore("edges"),i=(await this.getPropertiesByLabel(e,t,a)).map((e=>e.id)),l=await(async()=>{const e=new Set;for(const t of i)for await(const n of r.index("by-predicate").iterate(t))e.add(n.value.sub);const t=new Set;for await(const n of this.expandSubclasses(e,"is_a",a))t.add(n);return t})(),c=[];for await(const e of s){const t=e.value;yt(t)&&!l.has(t.id)&&c.push(t.id)}const d=[];for(const e of c){const t=await a.objectStore("nodes").get(e);t&&yt(t)&&!rt(t)&&d.push(t)}return d}async getAllClasses(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").index("by-type").getAll("CLASS")).filter((e=>!rt(e)))}async getAllTerms(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").getAll()).filter((e=>!rt(e)))}}const gt=l.types.model("OntologyRecord",{name:l.types.string,version:"unversioned",source:l.types.union(R.LocalPathLocation,R.UriLocation,R.BlobLocation),options:l.types.frozen(),equivalentTypes:l.types.map(l.types.array(l.types.string))}).volatile((e=>({dataStore:void 0,startedEquivalentTypeRequests:new Set}))).actions((e=>({ping(){},initDataStore(){e.dataStore=new ft(e.name,e.version,l.getSnapshot(e.source),e.options)},afterCreate(){l.addDisposer(e,c.autorun((()=>{this.initDataStore()})))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).actions((e=>({loadEquivalentTypes:l.flow((function*(t){if(!e.dataStore)return;if(e.startedEquivalentTypeRequests.has(t))return;e.startedEquivalentTypeRequests.add(t);const n=(yield e.dataStore.getTermsWithLabelOrSynonym(t)).map((e=>e.lbl)).filter((e=>null!=e));l.isAlive(e)&&e.setEquivalentTypes(t,n)}))}))).actions((e=>({afterCreate(){c.autorun((t=>{e.dataStore&&(e.loadEquivalentTypes("gene"),e.loadEquivalentTypes("pseudogene"),e.loadEquivalentTypes("transcript"),e.loadEquivalentTypes("pseudogenic_transcript"),e.loadEquivalentTypes("CDS"),e.loadEquivalentTypes("mRNA"),t.dispose())}))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).views((e=>({isTypeOf(t,n){if(t===n)return!0;if(!e.dataStore)return!1;const o=e.equivalentTypes.get(n);return o?o.includes(t):(e.loadEquivalentTypes(n),!1)}}))),ht=l.types.model("OntologyManager",{ontologies:l.types.array(gt),prefixes:l.types.optional(l.types.map(l.types.string),{"GO:":"http://purl.obolibrary.org/obo/GO_","SO:":"http://purl.obolibrary.org/obo/SO_"})}).views((e=>({get featureTypeOntologyName(){const t=l.getRoot(e).jbrowse.configuration;return o.readConfObject(t.ApolloPlugin,"featureTypeOntologyName")}}))).views((e=>({get featureTypeOntology(){return this.findOntology(e.featureTypeOntologyName)},findOntology:(t,n)=>e.ontologies.find((e=>e.name===t&&(void 0===n||e.version===n))),openOntology(e,t){return this.findOntology(e,t)?.dataStore},applyPrefixes:t=>Xe(t,e.prefixes),expandPrefixes:t=>function(e,t){for(const[n,o]of t.entries())if(e.startsWith(String(n)))return e.replace(String(n),o);return e}(t,e.prefixes)}))).actions((e=>({addOntology(t,n,o,a){const s=e.ontologies.push({name:t,version:n,source:o,options:{prefixes:new Map(e.prefixes.entries()),...a}});e.ontologies[s-1].ping()}}))),pt=[{displayName:"Label",jsonPath:"$.lbl"},{displayName:"Synonym",jsonPath:"$.meta.synonyms[*].val"},{displayName:"Definition",jsonPath:"$.meta.definition.val"}],mt=o.ConfigurationSchema("OntologyRecord",{name:{type:"string",description:'the full name of the ontology, e.g. "Gene Ontology"',defaultValue:"My Ontology"},version:{type:"string",description:"the ontology's version string",defaultValue:"unversioned"},source:{type:"fileLocation",description:"the download location for the ontology's source file",defaultValue:{locationType:"UriLocation",uri:"http://example.com/myontology.json"}},textIndexFields:{type:"frozen",description:"JSON paths for text fields that will be indexed for text searching",defaultValue:pt}});function yt(e){return"CLASS"===e.type}function bt(e){return"PROPERTY"===e.type}async function xt(e,t,n){if(!e)return;const o=await t.getTermsWithLabelOrSynonym(e.type,{includeSubclasses:!1}),a=o.filter(yt);if(0===o.length)return;const s=await t.getClassesThat("part_of",a);return 0!==s.length?s:void 0}function St({fetchValidTerms:e,filterTerms:t,includeDeprecated:n,onChange:o,ontologyName:a,ontologyVersion:s,renderInput:r,session:l,style:c,value:d}){const[u,f]=v.useState(!1),[g,h]=v.useState(),[p,y]=v.useState(""),[b,x]=v.useState(),{ontologyManager:S}=l.apolloDataStore,w=S.findOntology(a,s)?.dataStore,C=w&&u&&!g,j=w&&!b,T=v.useCallback((e=>(n||!rt(e))&&(!t||t(e))),[t,n]);v.useEffect((()=>{const e=new AbortController,{signal:t}=e;return j&&async function(e,t,n,o){if(!t)return;const a=(await e.getTermsWithLabelOrSynonym(t,{includeSubclasses:!1})).find((e=>(n??(()=>!0))(e)));if(!a)throw new Error(`not a valid ${e.ontologyName} term`);return a}(w,d,T).then((e=>{y(""),t.aborted||x(e)}),(e=>{t.aborted||M.isAbortException(e)||y(String(e))})),()=>{e.abort(new DOMException("Cancel getting current term from ontology store","AbortError"))}}),[l,d,T,w,j]),v.useEffect((()=>{const t=new AbortController,{signal:n}=t;return C&&async function(e,t,n,o){let a;if(t){const n=await t(e,o);n&&(a=n)}return a||(a=await e.getAllTerms()),n?a.filter((e=>n(e))):a}(w,e,T,n).then((e=>{e&&!n.aborted&&h(e)}),(e=>{n.aborted||M.isAbortException(e)||l.notify(e instanceof Error?e.message:String(e),"error")})),()=>{t.abort(new DOMException("Canceling getting valid terms from ontology store","AbortError"))}}),[C,T,w,l,e]);const A={};return p&&(A.error=!0,A.helperText=p),m.jsx(i.Autocomplete,{style:c,autoComplete:!0,filterSelectedOptions:!0,disableClearable:!0,selectOnFocus:!0,clearOnBlur:!0,handleHomeEndKeys:!0,freeSolo:!0,value:d,options:g??[],onOpen:()=>{f(!0)},onClose:()=>{f(!1)},loading:C,renderInput:r??(e=>m.jsx(i.TextField,{...e,...A})),getOptionLabel:e=>"string"==typeof e?e:e.lbl??"",isOptionEqualToValue:(e,t)=>e.lbl===t.lbl,onChange:(e,t)=>{t&&("string"==typeof t?(x(void 0),o(d,t)):t.lbl!==d&&(y(""),x(t),o(d,t.lbl)))}})}function wt({changeManager:e,handleClose:n,session:o,sourceAssemblyId:a,sourceFeature:s}){const[r,l]=v.useState(String(s.max)),[c,d]=v.useState(String(s.min+1)),[u,f]=v.useState(""),[g,h]=v.useState(""),[p,y]=v.useState(""),b=Number(r)<=Number(c);return m.jsxs(Ue,{open:!0,title:"Add new child feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog",children:[m.jsxs("form",{onSubmit:function(i){i.preventDefault(),h("");const l=(new C).toHexString(),d=new t.AddFeatureChange({changedIds:[s._id],typeName:"AddFeatureChange",assembly:a,addedFeature:{_id:l,refSeq:s.refSeq,min:Number(c)-1,max:Number(r),type:u},parentFeatureId:s._id});e.submit(d).then((()=>{o.apolloSetSelectedFeature(l)})),n(),i.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:c,onChange:e=>{d(e.target.value)}}),m.jsx(i.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:r,onChange:e=>{l(e.target.value)},error:b,helperText:b?'"End" must be greater than "Start"':null}),m.jsx(St,{session:o,ontologyName:"Sequence Ontology",style:{width:170},value:u,filterTerms:yt,fetchValidTerms:async function(e,t,n){const o=await xt(e,t);if(o)return o;y(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,s),renderInput:e=>m.jsx(i.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(p),helperText:p}),onChange:(e,t)=>{var n;t&&(n=t,h(""),f(n))}})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:b||!(c&&r&&u),children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),g?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:g})}):null]})}class Ct{clientStore;constructor(e){this.clientStore=e}}class vt{dataStore;constructor(e){this.dataStore=e}recentChanges=[];undoneChanges=[];async submit(n,o={}){const{addToRecents:a=!0,submitToBackend:r=!0,updateJobsManager:i=!1}=o,l=s.getSession(this.dataStore),c=new AbortController,{jobsManager:d,isLocked:u,changeInProgress:f,setChangeInProgress:g}=s.getSession(this.dataStore);if(u)return l.notify("Cannot submit changes in locked mode"),void g(!1);if(f)return void l.notify("Could not submit change, there is another change still in progress");g(!0);const h={name:n.typeName,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{c.abort(new DOMException(`Cancelling change "${n.typeName}"`,"AbortError"))}};i&&d.runJob(h);const p=await t.validationRegistry.frontendPreValidate(n);if(!p.ok){const e=`Pre-validation failed: "${p.resultsMessages}"`;return i&&d.abortJob(h.name,e),l.notify(e,"error"),void g(!1)}try{await n.execute(this.dataStore)}catch(e){return i&&d.abortJob(h.name,String(e)),console.error(e),l.notify(`Error encountered in client: ${String(e)}. Data may be out of sync, please refresh the page`,"error"),void g(!1)}if((await t.validationRegistry.frontendPostValidate(n,this.dataStore)).ok||await this.undo(n),r){i&&d.update(h.name,"Submitting to driver");const{collaborationServerDriver:t,getBackendDriver:s}=this.dataStore,r=e.isAssemblySpecificChange(n)?s(n.assembly)??t:t;let c;try{c=await r.submitChange(n,o)}catch(e){return i&&d.abortJob(h.name,String(e)),console.error(e),l.notify(String(e),"error"),await this.undo(n,!1),void g(!1)}if(!c.ok){const e=`Post-validation failed: "${p.resultsMessages}"`;return i&&d.abortJob(h.name,e),l.notify(e,"error"),await this.undo(n,!1),void g(!1)}n.notification&&l.notify(n.notification,"success"),a&&(this.recentChanges.push(n),this.undoneChanges=[])}i&&d.done(h),g(!1)}async undo(e,t=!0){const n=e.getInverse();return this.submit(n,{submitToBackend:t,addToRecents:!1})}async redo(e,t=!0){return this.submit(e,{submitToBackend:t,addToRecents:!1})}async undoLastChange(){const e=s.getSession(this.dataStore),t=this.recentChanges.pop();if(t)return this.undoneChanges.push(t),this.undo(t);e.notify("No changes to undo!","info")}async redoLastChange(){const e=s.getSession(this.dataStore),t=this.undoneChanges.pop();if(t)return this.recentChanges.push(t),this.redo(t);e.notify("No changes to redo!","info")}}class jt extends Ct{inFlight=new Map;refSeqMaps=new Map;async fetch(e,t,n){return e.getFetcher({locationType:"UriLocation",uri:t.toString()})(t,n)}async searchFeatures(e,t){const n=this.clientStore.getInternetAccount(t[0]),{baseURL:o}=n,a=new URL("features/searchFeatures",o),s=new URLSearchParams({assemblies:t.join(","),term:e});a.search=s.toString();const r=a.toString(),i=await this.fetch(n,r);if(!i.ok){const e=await _e(i,"searchFeatures failed");throw new Error(e)}return i.json()}async getFeatures(e){const{assemblyName:t,end:n,refName:o,start:a}=e,{assemblyManager:r}=s.getSession(this.clientStore);if(!r.get(t))throw new Error(`Could not find assembly with name "${t}"`);const i=(await this.getRefSeqMapping(t)).get(o);if(!i)throw new Error(`Could not find refSeq "${o}"`);const l=i.id,c=this.clientStore.getInternetAccount(t),{baseURL:d}=c,u=new URL("features/getFeatures",d),f=new URLSearchParams({refSeq:l,start:String(a),end:String(n)});u.search=f.toString();const g=u.toString(),h=await this.fetch(c,g);if(!h.ok){const e=await _e(h,"getFeatures failed");throw new Error(e)}return this.checkSocket(t,o,c),h.json()}checkSocket(n,o,a){const{socket:s}=a,r=a.retrieveToken();if(!r)return;const i=t.makeUserSessionId(r),l=`${n}-${o}`,c=new vt(this.clientStore);s.hasListeners(l)||s.on(l,(async t=>{if(a.setLastChangeSequenceNumber(Number(t.changeSequence)),t.userSessionId===i)return;const n=e.Change.fromJSON(t.changeInfo);e.isFeatureChange(n)&&this.haveDataForChange(n)&&await c.submit(n,{submitToBackend:!1})}))}haveDataForChange(e){const{assembly:t,changedIds:n}=e;if(!this.clientStore.assemblies.get(t))return!1;for(const e of n)if(this.clientStore.getFeature(e))return!0;return!1}async getSequence(e){const t=`${e.refName}:${e.start}-${e.end}`,n=this.inFlight.get(t),{assemblyName:o,end:a,refName:r,start:i}=e,{assemblyManager:l}=s.getSession(this.clientStore);if(!l.get(o))throw new Error(`Could not find assembly with name "${o}"`);const c=(await this.getRefSeqMapping(o)).get(r);if(!c)throw new Error(`Could not find refSeq "${r}"`);const d=c.id;if(n)return{seq:await n,refSeq:d};let u=this.clientStore.assemblies.get(o);u||(u=this.clientStore.addAssembly(o));let f=u.refSeqs.get(d);f||(f=u.addRefSeq(d,r));const g=f.getSequence(i,a);if(g.length===a-i)return{seq:g,refSeq:d};const h=this.clientStore.getInternetAccount(o),{baseURL:p}=h,m=new URL("sequence",p),y=new URLSearchParams({refSeq:d,start:String(i),end:String(a)});m.search=y.toString();const b=m.toString(),x=this.getSeqFromServer(h,b,f,i,a);this.inFlight.set(t,x);const S=await x;return this.checkSocket(o,r,h),this.inFlight.delete(t),{seq:S,refSeq:d}}async getSeqFromServer(e,t,n,o,a){const s=await this.fetch(e,t);if(!s.ok){let e;try{e=await s.text()}catch{e=""}throw new Error(`getSequence failed: ${s.status} (${s.statusText})${e?` (${e})`:""}`)}const r=await s.text();return n.addSequence({sequence:r,start:o,stop:a}),r}async getRefSeqMapping(e){const t=this.refSeqMaps.get(e);if(t)return t;const{assemblyManager:n}=s.getSession(this.clientStore);if(!n.get(e))throw new Error(`Could not find assembly with name "${e}"`);const o=this.clientStore.getInternetAccount(e),{baseURL:a}=o,r=new URL("refSeqs",a),i=new URLSearchParams({assembly:e});r.search=i.toString();const l=r.toString(),c=await this.fetch(o,l);if(!c.ok){let e;try{e=await c.text()}catch{e=""}throw new Error(`getRefNameAliases failed: ${c.status} (${c.statusText})${e?` (${e})`:""}`)}const d=await c.json(),u=new Map(d.map((e=>[e.name,{refName:e.name,id:e._id,aliases:e.aliases}])));return this.refSeqMaps.set(e,u),u}async getRefNameAliases(e){return[...(await this.getRefSeqMapping(e)).values()].map((e=>({refName:e.refName,aliases:[...new Set([e.id,...e.aliases])],uniqueId:`alias-${e.id}`})))}async getRefSeqId(e,t){const n=await this.getRefSeqMapping(e);if(!n)return;const o=n.get(t);return o?.id}async getRegions(e){const{assemblyManager:t}=s.getSession(this.clientStore);if(!t.get(e))throw new Error(`Could not find assembly with name "${e}"`);const n=this.clientStore.getInternetAccount(e),{baseURL:o}=n,a=new URL("refSeqs",o),r=new URLSearchParams({assembly:e});a.search=r.toString();const i=a.toString(),l=await this.fetch(n,i);if(!l.ok){let e;try{e=await l.text()}catch{e=""}throw new Error(`getRegions failed: ${l.status} (${l.statusText})${e?` (${e})`:""}`)}return(await l.json()).map((e=>({refName:e.name,start:0,end:e.length})))}getAssemblies(e){const{assemblyManager:t}=s.getSession(this.clientStore);return t.assemblies.filter((t=>{const n=o.getConf(t,["sequence","metadata"]);return!(!(n&&n.apollo&&n.internetAccountConfigId)||e&&n.internetAccountConfigId!==e)}))}async submitChange(e,n={}){const{internetAccountId:o}=n,a=this.clientStore.getInternetAccount("assembly"in e?e.assembly:void 0,o),{baseURL:s}=a,r=new URL("changes",s).href,i=await this.fetch(a,r,{method:"POST",body:JSON.stringify(e.toJSON()),headers:{"Content-Type":"application/json"}});if(!i.ok){const e=await _e(i,"submitChange failed");throw new Error(e)}const l=new t.ValidationResultSet;return i.ok||(l.ok=!1),l}}class Tt extends Ct{async getFeatures(){return[[],[]]}async getSequence(e){const{assemblyName:t,end:n,refName:o,start:a}=e,s=this.clientStore.assemblies.get(t);if(!s)return{seq:"",refSeq:o};const r=s.refSeqs.get(o);return r?{seq:r.getSequence(a,n),refSeq:o}:{seq:"",refSeq:o}}async getRefNameAliases(e){const t=this.clientStore.assemblies.get(e),n=[];if(!t)return n;for(const[,e]of t.refSeqs)n.push({refName:e.name,aliases:[e._id],uniqueId:`alias-${e._id}`});return n}async getRegions(e){const t=this.clientStore.assemblies.get(e);if(!t)return[];const n=[];for(const[,o]of t.refSeqs)n.push({assemblyName:e,refName:o.name,start:o.sequence[0].start,end:o.sequence[0].stop});return n}getAssemblies(){const{assemblyManager:e}=s.getSession(this.clientStore);return e.assemblies.filter((e=>{const t=o.getConf(e,["sequence","metadata"]);return Boolean(t&&t.apollo&&!t.file&&!t.internetAccountConfigId)}))}async submitChange(e,n={}){const{clientStore:o}=this,{assemblies:a}=o;o.clearCheckResults();for(const[,e]of a)if("InMemoryFileDriver"===e.backendDriverType){const t=await me(e);o.addCheckResults(t)}return new t.ValidationResultSet}async searchFeatures(e,t){return[]}}class At extends Ct{async loadAssembly(e){const{assemblyManager:t}=s.getSession(this.clientStore),n=t.get(e);if(!n)throw new Error(`Assembly ${e} not found`);const{file:a}=o.getConf(n,["sequence","metadata"]),r=require("node:fs");return pe(e,await r.promises.readFile(a,"utf8"),this.clientStore)}async getAssembly(e){let t=this.clientStore.assemblies.get(e);return t||(t=await this.loadAssembly(e)),t}async getRefNameAliases(e){const t=await this.getAssembly(e),n=[];for(const[,e]of t.refSeqs)n.push({refName:e.name,aliases:[e._id],uniqueId:`alias-${e._id}`});return n}async getFeatures(e){return await this.getAssembly(e.assemblyName),[[],[]]}async getSequence(e){const{assemblyName:t,end:n,refName:o,start:a}=e,s=(await this.getAssembly(t)).refSeqs.get(o);if(!s)throw new Error(`refSeq ${o} not found in client data store`);return{seq:s.getSequence(a,n),refSeq:o}}async getRegions(e){const t=await this.getAssembly(e),n=[];for(const[,o]of t.refSeqs)n.push({assemblyName:e,refName:o.name,start:o.sequence[0].start,end:o.sequence[0].stop});return n}getAssemblies(){const{assemblyManager:e}=s.getSession(this.clientStore);return e.assemblies.filter((e=>{const t=o.getConf(e,["sequence","metadata"]);return Boolean(t&&t.apollo&&!t.internetAccountConfigId&&t.file)}))}async submitChange(n){if(!e.isAssemblySpecificChange(n))throw new Error(`Cannot use this type of change with local file: "${n.typeName}"`);const{assemblyManager:a}=s.getSession(this.clientStore),r=a.get(n.assembly);if(!r)throw new Error(`Could not find assembly with name "${n.assembly}"`);const{file:i}=o.getConf(r,["sequence","metadata"]),c=this.clientStore.assemblies.get(n.assembly);if(!c)throw new Error(`Could not find assembly in client with name "${n.assembly}"`);const d=new Set(...c.refSeqs.keys()),{checkResults:u}=this.clientStore;for(const e of u.values())d.has(e.refSeq)&&u.delete(e._id);const f=await me(c);this.clientStore.addCheckResults(f);const g=[{directive:"gff-version",value:"3"}];for(const[,e]of c.refSeqs)g.push({directive:"sequence-region",value:`${e.name} 1 ${e.sequence[0].stop}`});for(const e of c.comments)g.push({comment:e});for(const[,e]of c.refSeqs){const{features:n}=e;for(const[,e]of n)g.push(t.annotationFeatureToGFF3(l.getSnapshot(e)))}for(const[,e]of c.refSeqs){const[n]=e.sequence,o=t.splitStringIntoChunks(n.sequence,80).join("\n");g.push({id:e.name,description:e.description,sequence:o})}const h=j.formatSync(g),p=require("node:fs");return await p.promises.writeFile(i,h,"utf8"),new t.ValidationResultSet}async searchFeatures(e,t){return[]}}var Ft;function Dt(e,t,n,o){const a={_id:(new C).toHexString(),refSeq:e,type:"CDS",min:n,max:o,strand:t},s={_id:(new C).toHexString(),refSeq:e,type:"exon",min:n,max:o,strand:t},r={};return r[a._id]=a,r[s._id]=s,{_id:(new C).toHexString(),refSeq:e,type:"mRNA",min:n,max:o,strand:t,children:r}}function kt({changeManager:e,handleClose:n,region:o,session:a}){const[s,r]=v.useState(String(o.end)),[l,c]=v.useState(String(o.start+1)),[d,u]=v.useState(Ft.GENE_AND_SUBFEATURES),[f,g]=v.useState(""),[h,p]=v.useState(),[y,x]=v.useState(""),S=Number(s)<=Number(l);let w=Boolean(S)||!(l&&s&&d);return(d===Ft.CUSTOM&&!f||!h&&d===Ft.GENE_AND_SUBFEATURES||!h&&d===Ft.TRANSCRIPT_AND_SUBFEATURES)&&(w=!0),m.jsxs(Ue,{open:!0,title:"Add new feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog",children:[m.jsxs("form",{onSubmit:async function(r){r.preventDefault(),x("");const i=a.apolloDataStore.getBackendDriver(o.assemblyName);if(!i)return void x("No backend driver found");let c=o.refName;if(i instanceof jt){const e=await i.getRefSeqId(o.assemblyName,o.refName);if(!e)return void x(`Could not find refSeq for "${o.refName}"`);c=e}if(d===Ft.GENE_AND_SUBFEATURES){const r=Dt(c,h,Number(l)-1,Number(s)),i={};i[r._id]=r;const d=(new C).toHexString(),u=new t.AddFeatureChange({changedIds:[d],typeName:"AddFeatureChange",assembly:o.assemblyName,addedFeature:{_id:d,refSeq:c,min:Number(l)-1,max:Number(s),type:"gene",strand:h,children:i}});return e.submit(u).then((()=>{a.apolloSetSelectedFeature(d)})),void n()}if(d===Ft.TRANSCRIPT_AND_SUBFEATURES){const r=Dt(c,h,Number(l)-1,Number(s)),i=new t.AddFeatureChange({changedIds:[r._id],typeName:"AddFeatureChange",assembly:o.assemblyName,addedFeature:r});return e.submit(i).then((()=>{a.apolloSetSelectedFeature(r._id)})),void n()}if(!f)return void x("No type selected");const u=(new C).toHexString(),g=new t.AddFeatureChange({changedIds:[u],typeName:"AddFeatureChange",assembly:o.assemblyName,addedFeature:{_id:u,refSeq:c,min:Number(l)-1,max:Number(s),type:f,strand:h}});e.submit(g).then((()=>{a.apolloSetSelectedFeature(u)})),n()},"data-testid":"submit-form",children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:Number(l),onChange:e=>{c(e.target.value)}}),m.jsx(i.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:s,onChange:e=>{r(e.target.value)},error:S,helperText:S?'"End" must be greater than "Start"':null}),m.jsxs(i.FormControl,{children:[m.jsx(i.InputLabel,{id:"demo-simple-select-label",children:"Strand"}),m.jsxs(i.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Strand",value:h?.toString(),onChange:function(e){switch(x(""),Number(e.target.value)){case 1:p(1);break;case-1:p(-1);break;default:p(void 0)}},children:[m.jsx(i.MenuItem,{value:void 0}),m.jsx(i.MenuItem,{value:1,children:"+"}),m.jsx(i.MenuItem,{value:-1,children:"-"})]})]}),m.jsx(i.FormControl,{style:{marginTop:20},children:m.jsxs(i.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",defaultValue:Ft.GENE_AND_SUBFEATURES,name:"radio-buttons-group",value:d,onChange:e=>{x("");const{value:t}=e.target;Object.keys(Ft).includes(t)&&u(Ft[t])},children:[m.jsx(i.FormControlLabel,{value:Ft.GENE_AND_SUBFEATURES,control:m.jsx(i.Radio,{}),label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Add gene and sub-features",m.jsx(i.Tooltip,{title:"This is a shortcut to create a gene with a single mRNA, exon, and CDS",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{value:Ft.TRANSCRIPT_AND_SUBFEATURES,control:m.jsx(i.Radio,{}),label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Add transcript and sub-features",m.jsx(i.Tooltip,{title:"This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{value:Ft.CUSTOM,checked:d!==Ft.GENE_AND_SUBFEATURES&&d!==Ft.TRANSCRIPT_AND_SUBFEATURES,control:m.jsx(i.Radio,{}),label:"Add feature with a sequence ontology type"})]})}),d===Ft.CUSTOM?m.jsx(St,{session:a,ontologyName:"Sequence Ontology",style:{width:170},value:f,filterTerms:yt,renderInput:e=>m.jsx(i.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{var n;t&&(n=t,x(""),g(n))}}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:w,children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),y?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:y})}):null]})}function Nt(e,t){const n=(new C).toHexString();t.push(n);const o={};if(e.children)for(const n of Object.values(e.children)){const e=Nt(n,t);o[e._id]=e}const a="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString();return{...e,refSeq:a,children:e.children&&o,_id:n}}function Rt({changeManager:e,handleClose:n,session:a,sourceAssemblyId:s,sourceFeature:r}){const{assemblyManager:c}=a,d=c.assemblyList,[u,f]=v.useState(d.find((e=>e.name!==s))?.name),[g,h]=v.useState([]),[p,y]=v.useState(""),[b,x]=v.useState(r.min),[S,w]=v.useState("");function C(e,t){const n={};if(e.children)for(const o of Object.values(e.children)){const e=C(o,t);e.refSeq=p,e.min=e.min+t,e.max=e.max+t,n[e._id]=e}const o="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString(),a="string"==typeof e._id?e._id:e._id.toHexString();return{...e,refSeq:o,children:e.children&&n,_id:a}}return v.useEffect((()=>{(async function(){if(y(""),!u)return void w("No assemblies to copy to");const e=await c.waitForAssembly(u);if(!e)return;const{refNameAliases:t}=e;if(!t)return;const n=[...Object.entries(t)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t})));h(n),y(n[0]?._id||"")})().catch((e=>{w(String(e))}))}),[u,c]),m.jsxs(Ue,{open:!0,title:"Copy features and annotations",handleClose:n,maxWidth:!1,"data-testid":"copy-feature",children:[m.jsxs("form",{onSubmit:async function(o){if(!u)return;o.preventDefault(),w("");const s=r.length,i=await c.waitForAssembly(u);if(!i)return void w(`Assembly not found: ${u}.`);const d=i.getCanonicalRefName(p),f=i.regions?.find((e=>e.refName===d));if(!f)return void w(`RefSeq not found: ${p}.`);const g=b+s;if(g>f.end)return void w(`Feature would extend beyond the bounds of the selected reference sequence. (Feature would end at ${g}, but reference sequence ends at ${f.end})`);if(b<f.start)return void w(`Reference sequence starts at ${f.start}, feature cannot start before that.`);const h=[],m=Nt(l.getSnapshot(r),h),y={...m.attributes};"Parent"in y&&delete y.Parent,m.refSeq=p;const x=b-m.min;m.min=b,m.max=b+s;const S=C(m,x),v=new t.AddFeatureChange({changedIds:[m._id],typeName:"AddFeatureChange",assembly:u,addedFeature:{_id:m._id,refSeq:m.refSeq,min:m.min,max:m.max,type:m.type,children:S.children,attributes:y,strand:m.strand},copyFeature:!0,allIds:h});e.submit(v).then((()=>{a.apolloSetSelectedFeature(m._id)})),n(),o.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.DialogContentText,{children:"Target assembly"}),m.jsx(i.Select,{labelId:"label",value:u,onChange:function(e){f(e.target.value)},children:d.filter((e=>e.name!==s)).map((e=>m.jsx(i.MenuItem,{value:e.name,children:o.readConfObject(e,"displayName")},e.name)))}),m.jsx(i.DialogContentText,{children:"Target reference sequence"}),m.jsx(i.Select,{labelId:"label",value:p,onChange:function(e){y(e.target.value)},children:g.map((e=>m.jsx(i.MenuItem,{value:e._id,children:e.name},e._id)))}),m.jsx(i.DialogContentText,{children:"Start position in target reference sequence"}),m.jsx(i.TextField,{margin:"dense",type:"number",fullWidth:!0,variant:"outlined",value:b,onChange:e=>{x(Number(e.target.value))}})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!u||!p||!b,variant:"contained",type:"submit",children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),S?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:S})}):null]})}function It({changeManager:e,handleClose:n,session:o}){const{internetAccounts:a}=l.getRoot(o),[s,r]=v.useState(""),[c,d]=v.useState(!1),[u,f]=v.useState(!1),g=a.filter((e=>"ApolloInternetAccount"===e.type));if(0===g.length)throw new Error("No Apollo internet account found");const[h,p]=v.useState(g[0]),{collaborationServerDriver:y}=o.apolloDataStore,b=y.getAssemblies(),[x,S]=v.useState(b.at(0));return m.jsxs(Ue,{open:!0,title:"Delete Assembly",handleClose:n,maxWidth:!1,"data-testid":"delete-assembly",children:[m.jsxs("form",{onSubmit:async function(o){if(o.preventDefault(),f(!0),r(""),!x)return void r("Must select assembly!");const a=new t.DeleteAssemblyChange({typeName:"DeleteAssemblyChange",assembly:x.name});await e.submit(a,{internetAccountId:h.internetAccountId}),n(),o.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[g.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:h.internetAccountId,onChange:function(e){f(!1);const t=g.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);p(t)},disabled:u&&!s,children:a.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx(i.DialogContentText,{children:"Select assembly"}),m.jsx(i.Select,{labelId:"label",value:x?.name??"",onChange:function(e){const t=b.find((t=>t.name===e.target.value));S(t)},disabled:0===b.length,children:b.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName},e.name)))}),m.jsx(i.DialogContentText,{children:m.jsx("strong",{style:{color:"red"},children:"NOTE: All assembly data will be deleted and this operation cannot be undone!"})}),m.jsx(i.FormGroup,{children:m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:c,onChange:()=>{d(!c)}}),label:"I understand that all assembly data will be deleted"})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!x||!c,variant:"contained",type:"submit",children:"Delete"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),s?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:s})}):null]})}function Mt({changeManager:e,handleClose:n,selectedFeature:o,session:a,setSelectedFeature:s,sourceAssemblyId:r,sourceFeature:c}){const[d,u]=v.useState(""),{ontologyManager:f}=a.apolloDataStore,{featureTypeOntology:g}=f;function h(e){if(!e.parent?.children||1===e.parent.children.size)return;const t=[];for(const n of e.parent.children.values())g?.isTypeOf(n.type,"CDS")||t.push(n);t.sort(((e,t)=>e.min-t.min));const n=[];for(const t of e.parent.children.values())g?.isTypeOf(t.type,"CDS")||n.push(t);if(n.sort(((e,t)=>t.max-e.max)),e.min===t[0].min){let n;for(const o of t)if(o._id!==e._id&&o.min>=e.min){n=o.min;break}if(n&&n!=e.parent.min)return{typeName:"LocationStartChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.min,newLocation:n}}if(e.max===n[0].max){let t;for(const o of n)if(o._id!=e._id&&o.max<=e.max){t=o.max;break}if(t&&t!=e.parent.max)return{typeName:"LocationEndChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.max,newLocation:t}}}return m.jsxs(Ue,{open:!0,title:"Delete feature",handleClose:n,maxWidth:!1,"data-testid":"delete-feature",children:[m.jsxs("form",{onSubmit:a=>{!async function(a){a.preventDefault(),u(""),o?._id===c._id&&s();const i=[],d=new t.DeleteFeatureChange({changedIds:[c._id],typeName:"DeleteFeatureChange",assembly:r,changes:[{deletedFeature:l.getSnapshot(c),parentFeatureId:c.parent?._id}]});if(g&&(g.isTypeOf(c.type,"transcript")||g.isTypeOf(c.type,"pseudogenic_transcript"))){const e=h(c);e&&i.push(e)}if(g&&g.isTypeOf(c.type,"exon")){const e=function(e){if(!g)return;if(!g.isTypeOf(e.type,"exon"))return;if(!e.parent?.cdsLocations||0===e.parent.cdsLocations.length||0===e.parent.cdsLocations[0].length)return;if(!e.parent.children)throw new Error("Unable to find parent of CDS");if(1!=e.parent.cdsLocations.length)throw new Error("Unable to handle a transcript with multiple CDSs");const n=(e.parent.cdsLocations.at(0)??[]).sort((({min:e},{min:t})=>e-t));let o;for(const t of e.parent.children.values())if(t.type===n[0].type){o=t;break}if(!o)throw new Error("Unable to find CDS");const a=n[0].min,s=n[n.length-1].max;if(!(e.min>a&&e.max<s||e.max<a||e.min>s)){if(e.min<=a&&e.max>=s)return new t.DeleteFeatureChange({changedIds:[o._id],typeName:"DeleteFeatureChange",assembly:r,changes:[{deletedFeature:l.getSnapshot(o),parentFeatureId:o.parent?._id}]});if(e.min<=a&&e.max>a){let t;for(const o of n)if(o.min>e.max){t=o.min;break}if(!t)throw new Error("Error setting new CDS start");return{typeName:"LocationStartChange",changedId:o._id,featureId:o._id,oldLocation:o.min,newLocation:t}}if(e.min<s&&e.max>=s){let t;for(const o of n.reverse())if(o.max<e.min){t=o.max;break}if(!t)throw new Error("Error setting new CDS end");return{typeName:"LocationEndChange",changedId:o._id,featureId:o._id,oldLocation:o.max,newLocation:t}}throw new Error("Unexpected relationship between exon and CDS")}}(c);e&&("DeleteFeatureChange"===e.typeName?(d.changedIds.push(...e.changedIds),d.changes.push(...e.changes)):i.push(e));const n=h(c);if(n){i.push(n);const e=c.parent?.parent;if(e?.children)if("LocationStartChange"===n.typeName){let t=n.newLocation;for(const[,o]of e.children)o._id!=n.featureId&&o.min<t&&(t=o.min);t!=e.min&&i.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.min,newLocation:t})}else{let t=n.newLocation;for(const[,o]of e.children)o._id!=n.featureId&&o.max>t&&(t=o.max);t!=e.max&&i.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.max,newLocation:t})}}}const f=function(e,n){if(0===e.length)return;const o=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:n}),a=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:n});for(const t of e)"LocationStartChange"===t.typeName&&(o.changedIds.push(t.changedId),o.changes.push({featureId:t.featureId,oldStart:t.oldLocation,newStart:t.newLocation})),"LocationEndChange"===t.typeName&&(a.changedIds.push(t.changedId),a.changes.push({featureId:t.featureId,oldEnd:t.oldLocation,newEnd:t.newLocation}));if(o.changedIds.length>0&&0===a.changedIds.length)return o;if(a.changedIds.length>0&&0===o.changedIds.length)return a;throw new Error("Unexpected list of changes")}(i,r);await e.submit(d),f&&await e.submit(f),n(),a.preventDefault()}(a)},children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.DialogContentText,{children:"Are you sure you want to delete the selected feature?"})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Yes"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),d?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:d})}):null]})}function Lt({handleClose:e,session:n}){const[a,s]=v.useState(!1),[r,c]=v.useState(),[d,u]=v.useState(""),{collaborationServerDriver:f,getInternetAccount:g,inMemoryFileDriver:h}=n.apolloDataStore,p=[...f.getAssemblies(),...h.getAssemblies()];return m.jsxs(Ue,{open:!0,title:"Export GFF3",handleClose:e,maxWidth:!1,"data-testid":"download-gff3",children:[m.jsxs("form",{onSubmit:async function(s){if(s.preventDefault(),u(""),!r)return void u("Must select assembly to download");const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);i?await async function(e){if(!r)return void u("Must select assembly to download");const t=g(r.configuration.name,e),n=new URL("export/getID",t.baseURL),o=new URLSearchParams({assembly:r.name});n.search=o.toString();const s=n.toString(),i=t.getFetcher({locationType:"UriLocation",uri:s}),l=await i(s,{method:"GET"});if(!l.ok){const e=await _e(l,"Error when exporting ID");return void u(e)}const{exportID:c}=await l.json(),d=new URL("export",t.baseURL),f=new URLSearchParams({exportID:c,includeFASTA:a?"true":"false"});d.search=f.toString();const h=d.toString();window.open(h,"_blank")}(i):function(e){if(!r)return void u("Must select assembly to download");const{assemblies:n}=e.apolloDataStore,a=n.get(r.name),s=a?.refSeqs;if(!s)return void u(`No refSeqs found for assembly "${r.name}"`);const i=[{directive:"gff-version",value:"3"}],c=o.getConf(r,["sequence","adapter","features"]);for(const e of c){const{end:t,refName:n,start:o}=e;i.push({directive:"sequence-region",value:`${n} ${o+1} ${t}`})}for(const[,e]of s){const{features:n}=e;if(n)for(const[,e]of n)i.push(t.annotationFeatureToGFF3(l.getSnapshot(e)))}for(const e of c){const{refName:t,seq:n}=e;i.push({id:t,description:"",sequence:n})}const d=j.formatSync(i),f=new Blob([d],{type:"text/plain;charset=utf-8"});P.saveAs(f,`${r.displayName??r.name}.gff3`)}(n),e()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.DialogContentText,{children:"Select assembly"}),m.jsx(i.Select,{labelId:"label",value:r?.name??"",onChange:function(e){const t=p.find((t=>t.name===e.target.value));c(t)},disabled:0===p.length,children:p.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName??e.name},e.name)))}),m.jsx(i.DialogContentText,{children:"Select assembly to export to GFF3"}),m.jsx(i.FormGroup,{children:m.jsx(i.FormControlLabel,{"data-testid":"include-fasta-checkbox",control:m.jsx(i.Checkbox,{checked:a,onChange:()=>{s(!a)}}),label:"Include fasta sequence in GFF output"})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!r,variant:"contained",type:"submit",children:"Download"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Cancel"})]})]}),d?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:d})}):null]})}function Et({changeManager:e,handleClose:n,session:a}){const{apolloDataStore:s}=a,[r,l]=v.useState(),[c,d]=v.useState(),[u,f]=v.useState(""),[g,h]=v.useState(!1),[p,y]=v.useState(),[b,x]=v.useState(!1),[S,w]=v.useState(!0),[C,j]=v.useState(!1),{collaborationServerDriver:T,getInternetAccount:A}=s,F=T.getAssemblies();return v.useEffect((()=>{c&&(async()=>{const{internetAccountConfigId:e}=o.getConf(c,["sequence","metadata"]),t=A(c.name,e);if(!t)throw new Error("No Apollo internet account found");const{baseURL:n}=t,a=new URL("features/count",n),s=new URLSearchParams({assemblyId:c.name});a.search=s.toString();const r=t.getFetcher({locationType:"UriLocation",uri:a.toString()});j(!0);const i=await r(a.toString(),{method:"GET"});if(!i.ok)throw new Error(await _e(i));{const e=await i.json();y(e.count)}j(!1)})().catch((e=>{console.error(e),f(e.message??e)}))}),[A,a,c]),m.jsxs(Ue,{open:!0,title:"Import Features from GFF3 file",handleClose:n,maxWidth:!1,"data-testid":"import-features-dialog",children:[C?m.jsx(i.LinearProgress,{}):null,m.jsxs("form",{onSubmit:async function(s){s.preventDefault(),f(""),j(!0),h(!0);let i="";if(!r)return void f("must select a file");if(!c)return void f("Must select assembly to download");const{internetAccountConfigId:l}=o.getConf(c,["sequence","metadata"]),d=A(c.name,l),{baseURL:u}=d,g=new URL("files",u);g.searchParams.set("type","text/x-gff3");const p=g.href,m=new FormData;m.append("file",r),m.append("fileName",r.name),m.append("type","text/x-gff3");const y=d.getFetcher({locationType:"UriLocation",uri:p});n();const{jobsManager:x}=a,w=new AbortController,C={name:`Importing features for ${c.displayName}`,statusMessage:"Uploading file, this may take awhile",progressPct:0,cancelCallback:()=>{w.abort(new DOMException(`Canceling importing of features to ${c.displayName}`,"AbortError")),x.abortJob(C.name)}};if(x.runJob(C),y){const{signal:e}=w,t=await y(p,{method:"POST",body:m,signal:e});if(!t.ok){const e=await _e(t,"Error when inserting new features (while uploading file)");return x.abortJob(C.name,e),void f(e)}i=(await t.json())._id}const v=new t.AddFeaturesFromFileChange({typeName:"AddFeaturesFromFileChange",assembly:c.name,fileId:i,parseOptions:{strict:S},deleteExistingFeatures:b});x.done(C),await e.submit(v,{updateJobsManager:!0})},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.DialogContentText,{children:"Select assembly"}),m.jsx(i.Select,{labelId:"label",value:c?.name??"",onChange:function(e){const t=F.find((t=>t.name===e.target.value));d(t),h(!1)},disabled:g&&!u,children:F.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName??e.name},e.name)))}),m.jsx(i.DialogContentText,{children:"Upload GFF3 to load features"}),m.jsx("input",{type:"file",onChange:function(e){h(!1),e.target.files&&l(e.target.files[0])},disabled:g&&!u}),m.jsx(i.FormControlLabel,{label:"Strict parsing",disabled:g&&!u,control:m.jsx(i.Checkbox,{checked:S,onChange:function(e){w(e.target.checked)}})}),m.jsx(i.FormHelperText,{children:"Don't import any features if any lines in the GFF3 are unable to be processed"}),p&&p>0?m.jsxs(m.Fragment,{children:[m.jsx(i.FormControlLabel,{label:"Delete existing features",disabled:g&&!u,control:m.jsx(i.Checkbox,{checked:b,onChange:function(e){x(e.target.checked)},slotProps:{input:{"aria-label":"controlled"}},color:"warning"})}),m.jsxs(i.FormHelperText,{children:["This assembly has ",p," features that will be deleted"]})]}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!(c&&r&&void 0!==p)||g,variant:"contained",type:"submit",children:g?"Submitting...":"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Close"})]})]}),u?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:u})}):null]})}function qt({handleClose:e,session:t}){const{internetAccounts:n}=l.getRoot(t),[o,a]=v.useState(""),s=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===s.length)throw new Error("No Apollo internet account found");const[r,c]=v.useState(s[0]);return m.jsxs(Ue,{open:!0,title:"Log out",handleClose:e,maxWidth:!1,"data-testid":"log-out",children:[m.jsxs("form",{onSubmit:function(e){e.preventDefault(),a(""),r.removeToken(),globalThis.location.reload()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[s.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:r.internetAccountId,onChange:function(e){const t=s.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);c(t)},children:n.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx(i.DialogContentText,{children:"Are you sure you want to log out?"})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!r,variant:"contained",type:"submit",children:"Log Out"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Cancel"})]})]}),o?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:o})}):null]})}function Pt({handleClose:e,session:t}){const{internetAccounts:n}=l.getRoot(t),[o,a]=v.useState(""),[s,r]=v.useState(!1),c=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===c.length)throw new Error("No Apollo internet account found");const[d,u]=v.useState(c[0]),[f,g]=v.useState([]),[h,p]=v.useState([]),{collaborationServerDriver:y}=t.apolloDataStore,b=y.getAssemblies(),[x,S]=v.useState(b.at(0));function w(e,t){const n=[...h],o=e.target.value;if(t)n.includes(o)||(n.push(o),p(n));else{const e=n.indexOf(o,0);-1!==e&&n.splice(e,1),p(n)}}return v.useEffect((()=>{(async function(){const{baseURL:e,getFetcher:t}=d,n=new URL("checks/types",e).href,o=t({locationType:"UriLocation",uri:n}),s=await o(n,{method:"GET"});if(!s.ok){const e=await _e(s,"Error when retrieving checks from server");return void a(e)}const r=await s.json();g(r)})().catch((e=>{a(String(e))}))}),[d]),v.useEffect((()=>{(async function(){if(!x)return;const{baseURL:e,getFetcher:t}=d,n=new URL(`assemblies/${x.name}`,e).href,o=t({locationType:"UriLocation",uri:n}),s=await o(n,{method:"GET"});if(!s.ok){const e=await _e(s,"Error when retrieving assembly from server");return void a(e)}const r=await s.json();p(r.checks)})().catch((e=>{a(String(e))}))}),[x,d]),m.jsxs(Ue,{open:!0,title:"Manage Checks",handleClose:e,"data-testid":"manage-checks",children:[m.jsxs("form",{onSubmit:async function(n){if(n.preventDefault(),!x)return void a("Must select assembly!");const{notify:o}=t,{baseURL:s,getFetcher:r}=d,i=new URL("assemblies/checks",s).href,l=r({locationType:"UriLocation",uri:i}),c=await l(i,{method:"POST",body:JSON.stringify({_id:x.name,checks:h,name:""}),headers:{"Content-Type":"application/json"}});if(c.ok)o("Assembly checks updated successfully","success"),e();else{const e=await _e(c,"Error when updating assembly checks");a(e)}},children:[m.jsxs(i.DialogContent,{children:[c.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:d.internetAccountId,onChange:function(e){r(!1);const t=c.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);u(t)},disabled:s&&!o,children:n.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx(i.DialogContentText,{children:"Select assembly"}),m.jsx(i.Select,{style:{width:300},labelId:"label",value:x?.name??"",onChange:function(e){const t=b.find((t=>t.name===e.target.value));S(t)},disabled:0===b.length,children:b.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName},e.name)))}),m.jsx("br",{}),m.jsx("br",{}),m.jsx(i.TableContainer,{component:i.Paper,children:m.jsxs(i.Table,{children:[m.jsx(i.TableHead,{children:m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{children:"Check name"}),m.jsx(i.TableCell,{children:"Use check"})]})}),m.jsx(i.TableBody,{children:f.map((e=>m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{children:e.name}),m.jsx(i.TableCell,{children:m.jsx(i.Checkbox,{value:e._id,checked:h.includes(e._id),onChange:w})})]},e._id)))})]})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Cancel"})]})]}),o?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:o})}):null]})}function Ot({changeManager:e,handleClose:n,session:o}){const{internetAccounts:a}=l.getRoot(o),s=a.filter((e=>"ApolloInternetAccount"===e.type)).filter((e=>e.role?.includes("admin")));if(0===s.length)throw new Error("No Apollo internet account found");const[r,c]=v.useState(""),[d,u]=v.useState(s[0]),[g,h]=v.useState([]);function p(e){return e===d.getUserId()}v.useEffect((()=>{(async function(){const{baseURL:e}=d,t=new URL("users",e).href,n=d.getFetcher({locationType:"UriLocation",uri:t}),o=await n(t,{method:"GET"});if(!o.ok){const e=await _e(o,"Error when getting user data from db");return void c(e)}const a=await o.json();h(a.map((e=>void 0===e.role?{...e,role:""}:e)))})().catch((e=>{c(String(e))}))}),[d]);const y=[{field:"username",headerName:"User",width:140},{field:"email",headerName:"Email",width:160},{field:"role",headerName:"Role",width:140,type:"singleSelect",valueOptions:["readOnly","user","admin","none"],getOptionLabel(e){switch(e){case"readOnly":return"Read-only";case"user":return"User";case"admin":return"Admin";case"none":return"None";default:return"unknown"}},editable:!0},{field:"actions",type:"actions",getActions:n=>[m.jsx(F.GridActionsCellItem,{icon:m.jsx(f,{}),onClick:async()=>{globalThis.confirm("Delete this user?")&&await async function(n){const o=new t.DeleteUserChange({typeName:"DeleteUserChange",userId:n});await e.submit(o,{internetAccountId:d.internetAccountId}),h((e=>e.filter((e=>e._id!==n))))}(n.id)},disabled:p(n.id),label:"Delete"},`delete-${n.id}`)]}];return m.jsxs(Ue,{open:!0,fullScreen:!0,title:"Manage users",handleClose:n,"data-testid":"manage-users",children:[m.jsxs(i.DialogContent,{children:[s.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:d.internetAccountId,onChange:function(e){const t=s.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);u(t)},disabled:!r,children:a.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx("div",{style:{height:"100%",width:"100%"},children:m.jsx(F.DataGrid,{pagination:!0,rows:g,columns:y,getRowId:e=>e._id,slots:{toolbar:F.GridToolbar},getRowHeight:()=>"auto",isCellEditable:e=>!p(e.id),processRowUpdate:async function(n){const o=new t.UserChange({typeName:"UserChange",role:n.role,userId:n._id});return await e.submit(o,{internetAccountId:d.internetAccountId}),n},onProcessRowUpdateError:e=>{c(String(e))}})})]}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Close"})}),r?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:r})}):null]})}function _t(e,t){const n=t[e];let o;if("three_prime"===e)o=`3'end (coords: ${n.min+1}-${n.max})`;else{if("five_prime"!==e)throw new Error(`Unexpected direction: "${e}"`);o=`5'end (coords: ${n.min+1}-${n.max})`}return o}function Bt({changeManager:e,handleClose:n,selectedFeature:o,setSelectedFeature:a,sourceAssemblyId:s,sourceFeature:r}){const[c,d]=v.useState(""),[u,f]=v.useState(),g=function(e){const t={},n=e.parent;if(!n)throw new Error("Unable to find parent of reference exon");let o=[];if(n.children)for(const[,e]of n.children)"exon"===e.type&&o.push(e);o=o.sort(((e,t)=>e.min===t.min?e.max-t.max:e.min-t.min)),n.strand&&-1===n.strand&&(o=o.reverse());let a=0;for(const n of o){if(n._id===e._id){o.length>a+1&&(t.three_prime=o[a+1]),a>0&&(t.five_prime=o[a-1]);break}a++}return t}(r);return m.jsxs(Ue,{open:!0,title:"Merge exons",handleClose:n,maxWidth:!1,"data-testid":"merge-exons",children:[m.jsxs("form",{onSubmit:function(i){i.preventDefault(),d("");const{parent:c}=r;if(!u||!c)return;o?._id===r._id&&a();const f=new t.MergeExonsChange({changedIds:[r._id],typeName:"MergeExonsChange",assembly:s,firstExon:l.getSnapshot(r),secondExon:l.getSnapshot(u),parentFeatureId:c._id});e.submit(f),n(),i.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[0===Object.keys(g).length?"There are no neighbouring exons to merge with":"Merge with exon on:",m.jsx(i.FormControl,{style:{marginTop:5},children:m.jsx(i.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:u,onChange:e=>{d("");const{value:t}=e.target;f(g[t])},children:Object.keys(g).map((e=>m.jsx(i.FormControlLabel,{value:e,control:m.jsx(i.Radio,{}),label:m.jsx(i.Box,{display:"flex",alignItems:"center",children:_t(e,g)})},e)))})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(g).length||void 0===u,children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),c?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:c})}):null]})}function Ut(e){let t;return t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id,`${t} [${e.min+1}-${e.max}]`}function $t({changeManager:e,handleClose:n,selectedFeature:o,session:a,setSelectedFeature:s,sourceAssemblyId:r,sourceFeature:c}){const[d,u]=v.useState(""),f=function(e,t){const n=e.parent;if(!n)throw new Error("Unable to find parent of reference transcript");const{featureTypeOntology:o}=t.apolloDataStore.ontologyManager;if(!o)throw new Error("featureTypeOntology is undefined");const a={};if(n.children)for(const[,t]of n.children)o.isTypeOf(t.type,"transcript")&&t._id!==e._id&&(a[t._id]=t);return a}(c,a),g=Object.keys(f).at(0),[h,p]=v.useState(g);return m.jsxs(Ue,{open:!0,title:"Merge transcripts",handleClose:n,maxWidth:!1,"data-testid":"merge-transcripts",children:[m.jsxs("form",{onSubmit:function(a){if(a.preventDefault(),u(""),!h)return;const i=f[h];if(o?._id===c._id&&s(),!c.parent)throw new Error("Cannot find parent");const d=new t.MergeTranscriptsChange({changedIds:[c._id],typeName:"MergeTranscriptsChange",assembly:r,firstTranscript:l.getSnapshot(c),secondTranscript:l.getSnapshot(i),parentFeatureId:c.parent._id});e.submit(d),n()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[0===Object.keys(f).length?"There are no transcripts to merge with":"Merge with transcript:",m.jsx(i.FormControl,{style:{marginTop:5},children:m.jsx(i.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:h,onChange:e=>{u("");const{value:t}=e.target;p(t)},children:Object.keys(f).map((e=>m.jsx(i.FormControlLabel,{value:e,control:m.jsx(i.Radio,{}),label:m.jsx(i.Box,{display:"flex",alignItems:"center",children:Ut(f[e])})},e)))})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(f).length||void 0===h,children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),d?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:d})}):null]})}function Gt({handleClose:e,session:t}){const{apolloDataStore:n}=t,{addAssembly:o,addSessionAssembly:a,assemblyManager:r,notify:l}=t,[c,d]=v.useState(null),[u,f]=v.useState(""),[g,h]=v.useState(""),[p,y]=v.useState(!1),b=i.useTheme();return m.jsxs(Ue,{open:!0,title:"Open local GFF3 file",handleClose:e,maxWidth:!1,"data-testid":"open-local-file",children:[m.jsxs("form",{onSubmit:async function(i){if(i.preventDefault(),h(""),y(!0),!c)throw new Error("No file selected");const d=await new Response(c).text(),f=`${u}-${c.name}-${O.nanoid(8)}`;try{await pe(f,d,n)}catch(t){return console.error(t),l(`Error loading GFF3 ${c.name}, ${String(t)}`,"error"),void e()}const g={};if(s.isElectron){const{webUtils:e}=globalThis.require("electron");g.file=e.getPathForFile(c)}const p={name:f,aliases:[u],displayName:u,sequence:{trackId:`sequenceConfigId-${u}`,type:"ReferenceSequenceTrack",adapter:{type:"ApolloSequenceAdapter",assemblyId:f},metadata:{apollo:!0,...g}}};await(s.isElectron?o?.(p):(a||o)(p));const m=await r.waitForAssembly(p.name);m?(t.addApolloTrackConfig(m),l(`Loaded GFF3 ${c.name}`,"success")):l(`Error loading GFF3 ${c.name}`,"error"),e()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsxs(i.FormControl,{children:[m.jsxs("div",{style:{flexDirection:"row"},children:[m.jsxs(i.Button,{variant:"contained",component:"label",style:{marginRight:b.spacing()},children:["Choose File",m.jsx("input",{type:"file",required:!0,hidden:!0,onChange:function(e){const t=e.target.files?.item(0);if(t&&(h(""),d(t),!u)){const e=t.name,n=e.lastIndexOf(".");f(-1===n?e:e.slice(0,n))}}})]}),c?c.name:"No file chosen"]}),m.jsx(i.FormHelperText,{children:"Make sure your GFF3 has an embedded FASTA section"})]}),m.jsx(i.TextField,{required:!0,label:"Assembly name",value:u,onChange:function(e){f(e.target.value)}})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!1,variant:"contained",type:"submit",children:p?"Submitting...":"Submit"}),m.jsx(i.Button,{disabled:p,variant:"outlined",type:"submit",onClick:e,children:"Cancel"})]})]}),g?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:g})}):null]})}!function(e){e.GENE_AND_SUBFEATURES="GENE_AND_SUBFEATURES",e.TRANSCRIPT_AND_SUBFEATURES="TRANSCRIPT_AND_SUBFEATURES",e.CUSTOM="CUSTOM"}(Ft||(Ft={}));const Wt=y.makeStyles()((e=>({changeTextarea:{fontFamily:"monospace",width:600,resize:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius}})));function zt({handleClose:t,session:n}){const{internetAccounts:o}=l.getRoot(n),a=o.find((e=>"ApolloInternetAccount"===e.type));if(!a)throw new Error("No Apollo internet account found");const{baseURL:s}=a,{classes:r}=Wt(),[c,d]=v.useState(),[u,f]=v.useState([]),{collaborationServerDriver:g}=n.apolloDataStore,h=g.getAssemblies(),[p,y]=v.useState(h.at(0)),b=[{field:"sequence"},{field:"typeName",headerName:"Change type",width:200,type:"singleSelect",valueOptions:[...e.changeRegistry.changes.keys()]},{field:"changes",headerName:"Change JSON",width:600,renderCell:({value:e})=>m.jsx("textarea",{className:r.changeTextarea,value:JSON.stringify(e),readOnly:!0})},{field:"user",headerName:"User",width:140},{field:"createdAt",headerName:"Time",width:160,type:"dateTime",valueGetter:e=>e&&new Date(e)}];return v.useEffect((()=>{(async function(){if(!p)return;const e=new URL("changes",s),t=new URLSearchParams({assembly:p.name});e.search=t.toString();const n=e.toString(),o=a?.getFetcher({locationType:"UriLocation",uri:n});if(o){const e=await o(n,{headers:new Headers({"Content-Type":"application/json"})});if(!e.ok){const t=await _e(e,"Error when retrieving changes");return void d(t)}const t=await e.json();f(t)}})().catch((e=>{d(String(e))}))}),[a,s,p]),m.jsxs(Ue,{open:!0,fullScreen:!0,title:"View change log",handleClose:t,"data-testid":"view-changelog",children:[m.jsx(i.Select,{style:{width:200,marginLeft:40},value:p?.name??"",onChange:function(e){const t=h.find((t=>t.name===e.target.value));y(t)},children:h.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName||e.name},e.name)))}),m.jsx(i.DialogContent,{children:m.jsx(F.DataGrid,{pagination:!0,rows:u,columns:b,getRowId:e=>e._id,slots:{toolbar:F.GridToolbar},initialState:{sorting:{sortModel:[{field:"sequence",sort:"desc"}]},columns:{columnVisibilityModel:{sequence:!1}}}})}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:t,children:"Close"})}),c?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:c})}):null]})}const Ht=[{field:"refName",headerName:"Ref Name"},{field:"aliases",headerName:"Aliases",editable:!0,flex:1}],Vt=e=>/^[\da-f]{24}$/i.test(e),Jt=N.observer((function({changeManager:e,handleClose:n,session:o}){const a=v.useRef(null),[s,r]=v.useState(""),[l,c]=v.useState(!1),[d,u]=v.useState(),[f,g]=v.useState([]),[h,p]=v.useState(new Map),{apolloDataStore:y}=o,{collaborationServerDriver:b}=y,x=b.getAssemblies();v.useEffect((()=>{x.length>0&&(u(x[0]),b.getRefNameAliases(x[0].name).then((e=>{S(e)})).catch((()=>{p(new Map),r("Error fetching refName aliases for assembly")})))}),[]);const S=e=>{const t=new Map;for(const n of e){const e=n.refName;Vt(e)||t.set(e,n.aliases)}p(t)},w=()=>[...h].map(((e,t)=>({id:t,refName:e[0],aliases:e[1].filter((t=>t!==e[0])).join(", ")})));return m.jsxs(Ue,{open:!0,title:"Add reference sequence aliases",handleClose:n,maxWidth:"sm","data-testid":"add-refseq-alias",fullWidth:!0,children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsxs(i.Grid,{container:!0,spacing:2,children:[m.jsx(i.Grid,{children:m.jsxs(i.FormControl,{disabled:l&&!s,fullWidth:!0,children:[m.jsx(i.InputLabel,{id:"demo-simple-select-label",children:"Assembly"}),m.jsx(i.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Assembly",value:d?.name??"",onChange:e=>{const t=x.find((t=>t.name===e.target.value));u(t),t?.name&&(b.getRefNameAliases(t.name).then((e=>{S(e),r("")})).catch((()=>{p(new Map),r("Error fetching refName aliases for assembly")})),c(!1),a.current&&(a.current.value=""))},style:{minWidth:150},children:x.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName},e.name)))})]})}),m.jsxs(i.Grid,{children:[m.jsx(i.InputLabel,{children:"Load RefName alias"}),m.jsx("input",{type:"file",onChange:e=>{(async e=>{if(!e.target.files)return;const t=e.target.files[0],n=(await t.text()).split("\n"),o=new Map(h);r("");for(const e of n){const t=e.split("\t");for(const e of t)o.has(e)&&o.set(e,[...o.get(e)??[],...t])}p(o)})(e).catch((()=>{r("Error reading file")}))},ref:a,disabled:l&&!s||!d})]})]}),d&&h.size>0?m.jsxs("div",{style:{height:200,width:"100%",marginTop:20},children:[m.jsx(i.InputLabel,{children:"Refname aliases found for selected assembly."}),m.jsx(F.DataGrid,{rows:w(),columns:Ht,initialState:{pagination:{paginationModel:{page:0,pageSize:5}}},pageSizeOptions:[5,10],onRowSelectionModelChange:e=>{const{ids:t}=e;if(t.size>0){c(!0);const e=[...t.values()].flatMap((e=>w().filter((t=>String(t.id)===String(e)))));g(e)}else c(!1),g([])},processRowUpdate:(e,t)=>{const n=new Map(h);return n.set(e.refName,e.aliases.split(",")),p(n),e},checkboxSelection:!0,disableRowSelectionExcludeModel:!0})]}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:!l,onClick:()=>{const o=[];for(const e of f){const{refName:t}=e,n=e.aliases.split(",").map((e=>e.trim())).filter((e=>e.length>0));o.push({refName:t,aliases:n})}if(r(""),!d)return void r("No assembly selected");const a=new t.AddRefSeqAliasesChange({typeName:"AddRefSeqAliasesChange",assembly:d.name,refSeqAliases:o});e.submit(a).catch((()=>{r("Error submitting change")})),n()},children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Close"})]}),s?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:s})}):null]})}));function Xt({handleClose:e,session:t}){const{internetAccounts:n}=l.getRoot(t),{collaborationServerDriver:o}=t.apolloDataStore,a=n.find((e=>"ApolloInternetAccount"===e.type));if(!a)throw new Error("No Apollo internet account found");const{baseURL:s}=a,[r,c]=v.useState(),[d,u]=v.useState([]),f=o.getAssemblies(),[g,h]=v.useState(f.at(0));return v.useEffect((()=>{(async function(){const e=g?.name;if(!e)return;const t=new URL("checks",s),n=new URLSearchParams({assembly:e});t.search=n.toString();const o=t.toString(),r=a?.getFetcher({locationType:"UriLocation",uri:o});if(r){const e=await r(o,{headers:new Headers({"Content-Type":"application/json"})});if(!e.ok){const t=await _e(e,"Error when retrieving checks");return void c(t)}const t=await e.json();u(t)}})().catch((e=>{c(String(e))}))}),[g,a,s]),m.jsxs(Ue,{open:!0,fullScreen:!0,title:"View check results",handleClose:e,"data-testid":"view-check-results",children:[m.jsx(i.Select,{style:{width:200,marginLeft:40},value:g?.name??"",onChange:function(e){const t=f.find((t=>t.name===e.target.value));h(t)},disabled:0===f.length,children:f.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName},e.name)))}),m.jsx(i.DialogContent,{children:m.jsx(F.DataGrid,{pagination:!0,rows:d,columns:[{field:"_id",headerName:"id",width:50},{field:"name",headerName:"Check name",width:200},{field:"refSeq",headerName:"Reference sequence ID",width:200},{field:"ids",headerName:"Feature IDs",width:200},{field:"message",headerName:"Message",flex:1}],getRowId:e=>e._id,slots:{toolbar:F.GridToolbar},initialState:{sorting:{sortModel:[{field:"name",sort:"asc"}]},columns:{columnVisibilityModel:{name:!0}}}})}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Close"})}),r?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:r})}):null]})}function Kt(e){return e.max-e.min<2?{isSplittable:!1,comment:"This exon is too short to be split"}:{isSplittable:!0,comment:""}}function Zt(e){const t=Kt(e);return t.isSplittable?"Are you sure you want to split the selected exon?":t.comment}function Yt({changeManager:e,handleClose:n,selectedFeature:o,setSelectedFeature:a,sourceAssemblyId:s,sourceFeature:r}){const[c,d]=v.useState(""),u=l.getSnapshot(r);return m.jsxs(Ue,{open:!0,title:"Split exon",handleClose:n,maxWidth:!1,"data-testid":"split-exon",children:[m.jsxs("form",{onSubmit:function(i){i.preventDefault(),d(""),o?._id===r._id&&a();const l=u.min+(u.max-u.min)/2,c=Math.floor(l),f=Math.ceil(l);if(!r.parent?._id)throw new Error("Splitting an exon without parent is not possible yet");const g=new t.SplitExonChange({changedIds:[r._id],typeName:"SplitExonChange",assembly:s,exonToBeSplit:u,parentFeatureId:r.parent._id,upstreamCut:c,downstreamCut:f,leftExonId:(new C).toHexString(),rightExonId:(new C).toHexString()});e.submit(g),n(),i.preventDefault()},children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.DialogContentText,{children:Zt(u)})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:!Kt(u).isSplittable,children:"Yes"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),c?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:c})}):null]})}function Qt({changeManager:e,handleClose:n,session:o,sourceAssemblyId:a,sourceFeature:s,setSelectedFeature:r}){const[c,d]=v.useState(""),{notify:u}=o;return m.jsxs(Ue,{open:!0,title:"Duplicate transcript",handleClose:n,maxWidth:!1,"data-testid":"duplicate-transcript",children:[m.jsxs("form",{onSubmit:i=>{!async function(i){i.preventDefault(),d("");try{const i=s.parent;if(!i)return void d("No parent gene found for this transcript");const c=l.getSnapshot(s),f=(new C).toHexString(),g={...c,_id:f};if(g.children){const e={};for(const[,t]of Object.entries(g.children)){const n=(new C).toHexString();e[n]={...t,_id:n}}g.children=e}const h=new t.AddFeatureChange({parentFeatureId:i._id,changedIds:[i._id],typeName:"AddFeatureChange",assembly:a,addedFeature:g});await e.submit(h).then((()=>{r(void 0),o.apolloSetSelectedFeature(f),u("Successfully duplicated transcript","success")})),n()}catch(e){d(e instanceof Error?e.message:"Failed to duplicate transcript")}}(i)},children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.DialogContentText,{children:"Are you sure you want to create a duplicate of this transcript?"})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Yes"}),m.jsx(i.Button,{variant:"outlined",type:"button",onClick:n,children:"Cancel"})]})]}),c?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:c})}):null]})}function en(e){const{color:t}=e;return m.jsx(i.SvgIcon,{viewBox:"0 0 18 18",style:{fontSize:18,marginRight:4},...e,children:"disabled"===t?m.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"}):m.jsxs(m.Fragment,{children:[m.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"}),m.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"}),m.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"}),m.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"})]})})}function tn(e){const{color:t}=e;return m.jsxs(i.SvgIcon,{viewBox:"0 0 21 21",style:{fontSize:21},...e,children:[m.jsx("rect",{x:"1",y:"1",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#F25022"}),m.jsx("rect",{x:"1",y:"11",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#00A4EF"}),m.jsx("rect",{x:"11",y:"1",width:"9",height:"9",fill:"disabled"===t?"#939393":"#7FBA00"}),m.jsx("rect",{x:"11",y:"11",width:"9",height:"9",fill:"disabled"===t?"#B9B9B9":"#FFB900"})]})}const nn=y.makeStyles()((e=>({loginButton:{marginBottom:e.spacing(1),width:"220px",height:"40px",fontSize:"16px",textTransform:"none",justifyContent:"left",padding:"3px 12px"}})));function on(e){const{classes:t}=nn(),{disabled:n}=e;return m.jsx(i.Button,{className:t.loginButton,variant:"outlined",startIcon:m.jsx(en,{color:n?"disabled":void 0}),...e,children:"Sign in with Google"})}function an(e){const{classes:t}=nn(),{disabled:n}=e;return m.jsx(i.Button,{className:t.loginButton,variant:"outlined",startIcon:m.jsx(tn,{color:n?"disabled":void 0}),...e,children:"Sign in with Microsoft"})}function sn(e){const{classes:t}=nn();return m.jsx(i.Button,{className:t.loginButton,variant:"outlined",startIcon:m.jsx(_,{fontSize:"small"}),...e,children:"Continue as Guest"})}const rn=y.makeStyles()((e=>({divider:{marginTop:e.spacing(4),marginBottom:e.spacing(5)}}))),ln=({baseURL:e,handleClose:t,name:n})=>{const{classes:o}=rn(),[a,s]=v.useState(""),[r,l]=v.useState([]);function c(e){t("google"===e?"google":"microsoft"===e?"microsoft":"guest")}v.useEffect((()=>{const t=new AbortController,{signal:n}=t;return async function(){const t=new URL("auth/types",e).href,o=await fetch(t,{method:"GET",signal:n});if(!o.ok){const e=await _e(o,"Error when retrieving auth types from server");return void s(e)}const a=await o.json();l(a)}().catch((e=>{M.isAbortException(e)||s(String(e))})),()=>{t.abort(new DOMException("Error retrieving valid authentication types","AbortError"))}}),[e]);const d=r.includes("google"),u=r.includes("microsoft"),f=r.includes("guest");return m.jsxs(Ue,{open:!0,title:`Log in to ${n}`,handleClose:t,maxWidth:!1,"data-testid":"login-apollo",children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column",paddingTop:8},children:[d?m.jsx(on,{disabled:!d,onClick:()=>{c("google")}}):null,u?m.jsx(an,{disabled:!u,onClick:()=>{c("microsoft")}}):null,f?m.jsxs(m.Fragment,{children:[m.jsx(i.Divider,{className:o.divider}),m.jsx(sn,{onClick:()=>{c("guest")}})]}):null]}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:()=>{t()},children:"Cancel"})}),a?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:a})}):null]})},cn="undefined"==typeof sessionStorage,dn=n=>a.InternetAccount.named("ApolloInternetAccount").props({type:l.types.literal("ApolloInternetAccount"),configuration:o.ConfigurationReference(n)}).views((e=>({get baseURL(){return o.getConf(e,"baseURL")},getUserId(){const n=e.retrieveToken();if(n)return t.getDecodedToken(n).id}}))).volatile((()=>({role:void 0,controller:new AbortController}))).actions((e=>({setRole(){const n=e.retrieveToken();if(!n)return void(e.role=void 0);const o=t.getDecodedToken(n),{role:a}=o;e.role!==a&&(e.role=a)}}))).actions((e=>{let t;return{addMessageChannel(e,n){t=t=>{this.finishOAuthWindow(t,e,n)},window.addEventListener("message",t)},deleteMessageChannel(){window.removeEventListener("message",t)},finishOAuthWindow(t,n,o){if(t.data.name!==`JBrowseAuthWindow-${e.internetAccountId}`)return;const a=t.data.redirectUri.replace("#","?"),s=new URL(a),r=new URLSearchParams(s.search).get("access_token");this.deleteMessageChannel(),r?(e.storeToken(r),e.setRole(),n(r)):o(new Error("Error with token endpoint"))},async openAuthWindow(t,n,o){const a=s.isElectron?"http://localhost/auth":globalThis.location.origin+globalThis.location.pathname,r=new URL("auth/login",e.baseURL),i=new URLSearchParams({type:t,redirect_uri:a});r.search=i.toString();const l=`JBrowseAuthWindow-${e.internetAccountId}`;if(s.isElectron){const{ipcRenderer:t}=globalThis.require("electron"),s=await t.invoke("openAuthWindow",{internetAccountId:e.internetAccountId,data:{redirect_uri:a},url:r.toString()}),i=new MessageEvent("message",{data:{name:l,redirectUri:s}});this.finishOAuthWindow(i,n,o)}else this.addMessageChannel(n,o),window.open(r,l,"width=500,height=600")}}})).actions((e=>({async getTokenFromUser(t,n){const{baseURL:o}=e,a=await new Promise(((t,n)=>{const{session:o}=l.getRoot(e),{baseURL:a,name:s}=e;o.queueDialog((e=>[ln,{name:s,handleClose:o=>{o?o instanceof Error?n(o):t(o):n(new Error("user cancelled entry")),e()},baseURL:a}]))}));if("guest"!==a)return void e.openAuthWindow(a,t,n);const s=new URL("auth/login",o),r=new URLSearchParams({type:a});s.search=r.toString();const i=s.toString(),c=await fetch(i,{signal:e.controller.signal});if(!c.ok){const e=await _e(c,"Error when logging in");return void n(new Error(e))}const{token:d}=await c.json();t(d)}}))).volatile((()=>({lastChangeSequenceNumber:void 0}))).actions((e=>({setLastChangeSequenceNumber(t){e.lastChangeSequenceNumber=t}}))).actions((t=>({updateLastChangeSequenceNumber:l.flow((function*(){const{baseURL:e}=t,n=new URL("changes",e),o=new URLSearchParams({limit:"1"});n.search=o.toString();const a=n.toString(),s=t.getFetcher({locationType:"UriLocation",uri:a});let r;try{r=yield s(a,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!r.ok){const e=yield _e(r,"Error when fetching server LastChangeSequence");throw new Error(e)}const i=yield r.json();t.setLastChangeSequenceNumber(i.length>0?i[0].sequence:0)})),getMissingChanges:l.flow((function*(){const{session:n}=l.getRoot(t),{changeManager:o}=n.apolloDataStore;if(!t.lastChangeSequenceNumber)throw new Error("No LastChangeSequence stored in session. Please, refresh you browser to get last updates from server");const{baseURL:a,lastChangeSequenceNumber:s}=t,r=new URL("changes",a),i=new URLSearchParams({since:String(s),sort:"1"});r.search=i.toString();const c=r.toString(),d=t.getFetcher({locationType:"UriLocation",uri:c});let u;try{u=yield d(c,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!u.ok)return void console.error(`Error when fetching the last updates to recover socket connection — ${u.status}`);const f=yield u.json();for(const t of f){const n=e.Change.fromJSON(t);o.submit(n,{submitToBackend:!1})}}))}))).volatile((e=>{const{origin:t,pathname:n}=new URL("socket.io/",e.baseURL);return{socket:d.io(t,{path:n})}})).actions((n=>({addSocketListeners(){const{session:o}=l.getRoot(n),{notify:a}=o,s=n.retrieveToken();if(!s)throw new Error("No Token found");const r=t.getDecodedToken(s),i=t.makeUserSessionId(r),{socket:c}=n,{addCheckResult:d,changeManager:u,deleteCheckResult:f}=o.apolloDataStore;c.on("connect",(()=>{n.getMissingChanges()})),c.on("connect_error",(e=>{console.error(e),a("Could not connect to the Apollo server.","error")})),c.on("COMMON",(t=>{if("checkResult"in t)return void(t.deleted?f(t.checkResult._id.toString()):d(t.checkResult));if(sessionStorage.setItem("LastChangeSequence",String(t.changeSequence)),t.userSessionId===i)return;const n=e.Change.fromJSON(t.changeInfo);u.submit(n,{submitToBackend:!1})})),c.on("USER_LOCATION",(e=>{const{channel:t,locations:n,userName:a,userSessionId:s}=e;"USER_LOCATION"===t&&s!==i&&o.addOrUpdateCollaborator({name:a,id:s,locations:n})})),c.on("REQUEST_INFORMATION",(e=>{const{channel:t,userSessionId:n}=e;"REQUEST_INFORMATION"===t&&n!==s&&o.broadcastLocations()}))}}))).actions((e=>({postUserLocation:(t=>{let n;return t=>{clearTimeout(n),n=setTimeout((()=>{!async function(t){if(!l.isAlive(e)||"none"===e.role)return;const{baseURL:n,controller:o}=e,a=new URL("users/userLocation",n).href,s=new URLSearchParams(JSON.stringify(t)),r=e.getFetcher({locationType:"UriLocation",uri:a});try{if(!(await r(a,{method:"POST",body:s,signal:o.signal})).ok)throw new Error("ignore")}catch{console.error("Broadcasting user location failed")}}(t)}),300)}})()}))).volatile((()=>({roleNotificationSent:!1}))).actions((e=>{function t(){e.postUserLocation([])}function n(){if("hidden"===document.visibilityState&&e.postUserLocation([]),"visible"===document.visibilityState){const{session:t}=l.getRoot(e);t.broadcastLocations()}}return{initialize:l.flow((function*(o){if("none"===o){if(!e.roleNotificationSent){const{session:t}=l.getRoot(e);t.notify("You have registered as an Apollo user but have not been given access. Ask your administrator to enable access for your account.","warning"),e.roleNotificationSent=!0}return}if("admin"===o){const t=l.getRoot(e);s.isAbstractMenuManager(t)&&function(e){e.appendToMenu("Apollo",{label:"Admin",type:"subMenu",icon:u,subMenu:[{label:"Add Assembly",icon:r,onClick:e=>{e.queueDialog((t=>[ze,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Delete Assembly",icon:f,onClick:e=>{e.queueDialog((t=>[It,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Import Features",icon:g,onClick:e=>{e.queueDialog((t=>[Et,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add reference sequence aliases",onClick:e=>{e.queueDialog((t=>[Jt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add Assembly aliases",onClick:e=>{e.queueDialog((t=>[Ve,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Users",icon:h,onClick:e=>{e.queueDialog((t=>[Ot,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Checks",icon:p,onClick:e=>{e.queueDialog((t=>[Pt,{session:e,handleClose:()=>{t()}}]))}}]})}(t)}yield e.updateLastChangeSequenceNumber(),e.addSocketListeners();const{baseURL:a}=e,i=new URL("users/locations",a).href,c=e.getFetcher({locationType:"UriLocation",uri:i});yield c(i,{method:"GET",signal:e.controller.signal}),window.addEventListener("beforeunload",t),document.addEventListener("visibilitychange",n)})),removeBeforeUnloadListener(){window.removeEventListener("beforeunload",t)},removeVisibilityChangeListener(){document.removeEventListener("visibilitychange",n)}}})).actions((e=>({afterAttach(){e.setRole(),c.autorun((async t=>{if(cn)return;const{session:n}=l.getRoot(e);if(n&&e.role)try{await e.initialize(e.role),t.dispose()}catch{}}),{name:"ApolloInternetAccount"})},beforeDestroy(){e.removeBeforeUnloadListener(),e.removeVisibilityChangeListener(),e.controller.abort(new DOMException("Cleaning up Apollo connection","AbortError")),e.socket.close()}}))),un="undefined"==typeof sessionStorage;class fn extends U.BaseAdapter{refNameAliases;async getRefNameAliases(){const e=o.readConfObject(this.config,"assemblyId");if(!un){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e);if(!n)throw new Error("No backend driver found");return await n.getRefNameAliases(e)}const t=await new Promise(((t,n)=>{const o=setTimeout((()=>{n(new Error("timeout"))}),2e4),a=O.nanoid(),s=e=>{const n=e.data;(function(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo&&"refNameAliases"in e})(n)&&n.messageId===a&&(clearTimeout(o),removeEventListener("message",s),t(n.refNameAliases))};addEventListener("message",s),rpcServer.emit("apollo",{apollo:!0,method:"getRefNameAliases",assembly:e,messageId:a})}));return this.refNameAliases=t,t}freeResources(){}}var gn=o.ConfigurationSchema("ApolloRefNameAliasAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});function hn(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo}const pn="undefined"==typeof sessionStorage;class mn extends U.BaseSequenceAdapter{regions;async getRefNames(){return(await this.getRegions()).map((e=>e.refName))}async getRegions(){if(this.regions)return this.regions;const e=o.readConfObject(this.config,"assemblyId");if(!pn){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e);if(!n)throw new Error("No backend driver found");const o=await n.getRegions(e);return this.regions=o,o}const t=await new Promise(((t,n)=>{const o=setTimeout((()=>{n("timeout")}),2e4),a=O.nanoid(),s=e=>{const{data:n}=e;hn(n)&&n.messageId===a&&(clearTimeout(o),removeEventListener("message",s),t(n.regions))};addEventListener("message",s),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getRegions",assembly:e,messageId:a})}));return this.regions=t,t}getFeatures(e){const{end:t,refName:n,start:a}=e,s=o.readConfObject(this.config,"assemblyId"),r={...e,assemblyName:s};return $.ObservableCreate((async e=>{if(!pn){const o=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!o)return void e.error("No Apollo data store found");const i=o.getBackendDriver(s);if(!i)return void e.error("No backend driver found");const l=(await i.getRegions(r.assemblyName)).find((e=>e.refName===r.refName));if(!l)return void e.error("Cannot get region");r.end>l.end&&(r.end=l.end);const{seq:c}=await i.getSequence(r);return e.next(new G({id:`${n} ${a}-${t}`,data:{refName:n,start:a,end:t,seq:c}})),void e.complete()}const o=await new Promise(((e,t)=>{const n=setTimeout((()=>{t("timeout")}),2e4),o=O.nanoid(),a=t=>{const{data:s}=t;hn(s)&&s.messageId===o&&(clearTimeout(n),removeEventListener("message",a),e(s.sequence))};addEventListener("message",a),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getSequence",region:r,messageId:o})}));e.next(new G({id:`${n} ${a}-${t}`,data:{refName:n,start:a,end:t,seq:o}})),e.complete()}))}freeResources(){}}var yn=o.ConfigurationSchema("ApolloSequenceAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});function bn(e,t){const{children:n,indexedIds:o,...a}=t;if(JSON.stringify(a).includes(e))return t;if(n)for(const t of Object.values(n)){const n=bn(e,t);if(n)return n}}class xn extends U.BaseAdapter{get baseURL(){return o.readConfObject(this.config,"baseURL").uri}get trackId(){return o.readConfObject(this.config,"trackId")}get assemblyNames(){return o.readConfObject(this.config,"assemblyNames")}mapBaseResult(e,t,n){return e.map((e=>{const o=bn(n,e)??e,a=t.getCanonicalRefName(e.refSeq);return new W({label:n,trackId:this.trackId,locString:`${a}:${o.min+1}..${o.max}`,matchedObject:o})}))}async searchIndex(e){const t=e.queryString,n=[],o=this.pluginManager?.rootModel?.session;if(!o)return n;const{apolloDataStore:a}=o,{assemblyManager:s}=o;for(const o of this.assemblyNames){const r=a.getBackendDriver(o),i=s.get(o);if(!r||!i)continue;const l=await r.searchFeatures(e.queryString,[o]);n.push(...this.mapBaseResult(l,i,t))}return n}freeResources(){}}var Sn=o.ConfigurationSchema("ApolloTextSearchAdapter",{assemblyNames:{type:"stringArray",defaultValue:[],description:"List of assemblies covered by text search adapter"},trackId:{type:"string",defaultValue:""},baseURL:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}},{explicitlyTyped:!0,explicitIdentifier:"textSearchAdapterId"});const wn=y.makeStyles()((e=>({attributeKey:{fontWeight:"bold",marginRight:e.spacing(2)}})));function Cn({attributeKey:e}){const{classes:n}=wn(),o=/^[A-Z]/.test(e);let a,s=e;return t.isGFFInternalAttribute(e)?(s=t.internalToGFF[e],a=`On GFF3 export, this will be assigned to the GFF3's reserved "${s}" attribute`):t.isGFFColumnInternal(e)?(s=t.gffInternalToColumn[e],a=`On GFF3 export, this will be placed in the GFF3's "${s}" column`):o&&(a="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"),m.jsxs("div",{style:{display:"flex"},children:[m.jsx(i.Typography,{className:n.attributeKey,children:s}),a?m.jsx(i.Tooltip,{title:a,children:m.jsx(i.Chip,{icon:m.jsx(b,{}),label:"GFF3",size:"small",variant:"outlined"})}):null]})}const vn="Custom",jn={[vn]:"custom"};for(const[e,n]of Object.entries(t.gffToInternal))jn[`GFF ${n}`]=e;for(const[e,n]of Object.entries(t.gffColumnToInternal))jn[`GFF ${n}`]=e;const Tn=N.observer((function({setKey:e,session:t}){const{pluginManager:n}=s.getEnv(t),o=n.evaluateExtensionPoint("Apollo-ReservedAttributeKeys",jn),a=Object.keys(o).at(0)??vn,[r,l]=v.useState(a),[c,d]=v.useState(),u=r===vn;return m.jsxs("form",{onSubmit:function(t){t.preventDefault(),e(u?c:o[r])},children:[m.jsxs("div",{style:{display:"flex",flexDirection:"column",margin:8},children:[m.jsxs(i.FormControl,{variant:"outlined",children:[m.jsx(i.InputLabel,{id:"attribute-key-select-label",children:"Key"}),m.jsx(i.Select,{labelId:"attribute-key-select-label",value:r,label:"Key",onChange:e=>{l(e.target.value)},children:Object.keys(o).map((e=>m.jsx(i.MenuItem,{value:e,children:e},e)))})]}),u?m.jsx(i.TextField,{label:"Attribute key",variant:"outlined",id:"attributeKey",onChange:e=>{d(e.target.value)}}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{color:"primary",variant:"contained",type:"submit",disabled:u&&!c,children:"Add"}),m.jsx(i.Button,{variant:"outlined",onClick:function(){e()},children:"Cancel"})]})]})})),An=N.observer((function({onChangeCommitted:e,value:t,...n}){const[o,a]=v.useState(String(t)),[s,r]=v.useState(!1),[l,c]=v.useState(null);return v.useEffect((()=>{a(String(t))}),[t]),v.useEffect((()=>{s&&(l?.blur(),r(!1))}),[s,l]),m.jsx(i.TextField,{...n,type:"text",onChange:function(e){a(e.target.value)},value:o,onKeyDown:e=>{"Enter"===e.key?l?.blur():"Escape"===e.key&&(a(String(t)),r(!0))},onBlur:()=>{o!==String(t)&&e(o)},inputRef:e=>{c(e)}})})),Fn=N.observer((function({attributeValues:e,setAttribute:t,isNew:n=!1}){const[o,a]=v.useState(e&&e.length>0?e:[""]);return m.jsxs(m.Fragment,{children:[o.map(((e,t)=>m.jsxs("div",{style:{display:"flex"},children:[m.jsx(An,{value:e,onChangeCommitted:e=>{!function(e,t){a((n=>{const o=[...n];return o[e]=t,o}))}(t,e)},variant:"outlined",fullWidth:!0}),m.jsx(i.IconButton,{"aria-label":"delete",size:"medium",edge:"end",onClick:()=>{!function(e){a((t=>{const n=[...t];return n.splice(e,1),n}))}(t)},children:m.jsx(f,{fontSize:"inherit"})})]},`${t}-${e}`))),m.jsx(i.IconButton,{"aria-label":"add",size:"medium",color:"secondary",edge:"start",onClick:function(){a((e=>{const t=[...e];return t.push(""),t}))},children:m.jsx(J,{fontSize:"inherit"})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{color:"primary",variant:"contained",onClick:()=>{t(o.filter(Boolean))},children:n?"Add":"Update"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:()=>{t()},children:"Cancel"})]})]})}));function Dn({values:e}){return m.jsx(m.Fragment,{children:e?.map(((e,t)=>m.jsx(i.Typography,{variant:"body2",color:"textSecondary",children:e},`${t}.${e}`)))})}const kn=y.makeStyles()((e=>({list:{"li:nth-of-type(odd)":{backgroundColor:e.palette.action.focus},"li:nth-of-type(even)":{backgroundColor:e.palette.action.hover}}}))),Nn=N.observer((function({assembly:e,editable:n,feature:o,session:a}){const{pluginManager:r}=s.getEnv(a),{classes:d}=kn(),[u,g]=v.useState(null),[h,p]=v.useState(null),[y,b]=v.useState(null),[x,S]=v.useState(!1),[w,C]=v.useState(),j=Boolean(u),{changeManager:T}=a.apolloDataStore,{notify:A}=a;function F(){g(null),p(null)}const{_id:D,attributes:k}=o,N=r.evaluateExtensionPoint("Apollo-AttributeEditorComponent",Fn,{key:w});return m.jsxs(m.Fragment,{children:[m.jsxs(i.List,{className:d.list,children:[c.entries(k).map((([s,c])=>{const d=r.evaluateExtensionPoint("Apollo-AttributeEditorComponent",Fn,{key:s}),u=r.evaluateExtensionPoint("Apollo-AttributeViewerComponent",Dn,{key:s});return m.jsx(i.ListItem,{secondaryAction:n&&!y?m.jsx(i.IconButton,{edge:"end",onClick:e=>{!function(e,t){g(e.currentTarget),p(t)}(e,s)},children:m.jsx(V,{})}):null,children:m.jsx(i.ListItemText,{disableTypography:!0,primary:m.jsx(Cn,{attributeKey:s}),secondary:y===s?m.jsx(d,{session:a,attributeValues:c,setAttribute:n=>{b(null),n&&function(n,a){const s={...l.getSnapshot(k)},r=structuredClone(s);if(!(n in s))return void A(`"${n}" not found in feature attributes`,"error");if(s[n].toString()===a.toString())return;s[n]=a;const i=new t.FeatureAttributeChange({changedIds:[o._id],typeName:"FeatureAttributeChange",assembly:e,featureId:o._id,oldAttributes:r,newAttributes:s});T.submit(i)}(s,n)}}):m.jsx(u,{values:c})})},s)})),w?m.jsx(i.ListItem,{children:m.jsx(i.ListItemText,{disableTypography:!0,primary:m.jsx(Cn,{attributeKey:w}),secondary:m.jsx(N,{session:a,attributeValues:[],setAttribute:n=>{n&&function(n,a){const s={...l.getSnapshot(k)},r=structuredClone(s);if(n in s)return void A(`Feature already has attribute "${n}"`,"error");s[n]=a;const i=new t.FeatureAttributeChange({changedIds:[o._id],typeName:"FeatureAttributeChange",assembly:e,featureId:o._id,oldAttributes:r,newAttributes:s});T.submit(i)}(w,n),C(void 0)},isNew:!0})})}):null]}),n?m.jsx(i.Button,{color:"primary",variant:"contained",disabled:x||Boolean(w),onClick:()=>{S(!0)},children:"Add new"}):null,x?m.jsx(i.Paper,{variant:"outlined",style:{marginTop:8},children:m.jsx(Tn,{session:a,setKey:e=>{C(e),S(!1)}})}):null,m.jsxs(i.Menu,{anchorEl:u,open:j,onClose:F,children:[m.jsxs(i.MenuItem,{onClick:function(){h&&function(n){const o=l.getSnapshot(k),{[n]:a,...s}=o,r=new t.FeatureAttributeChange({changedIds:[D],typeName:"FeatureAttributeChange",assembly:e,featureId:D,oldAttributes:o,newAttributes:s});T.submit(r)}(h),F()},children:[m.jsx(i.ListItemIcon,{children:m.jsx(f,{fontSize:"small"})}),m.jsx(i.Typography,{variant:"inherit",children:"Delete"})]}),m.jsxs(i.MenuItem,{onClick:function(){h&&b(h),F()},children:[m.jsx(i.ListItemIcon,{children:m.jsx(H,{fontSize:"small"})}),m.jsx(i.Typography,{variant:"inherit",children:"Edit"})]})]})]})})),Rn=N.observer((function({onChangeCommitted:e,value:t,...n}){const[o,a]=v.useState(String(t)),[s,r]=v.useState(!1),[l,c]=v.useState(null);v.useEffect((()=>{a(String(t))}),[t]),v.useEffect((()=>{s&&(l?.blur(),r(!1))}),[s,l]);const d=Number.isNaN(Number(o));return m.jsx(i.TextField,{...n,type:"text",onChange:function(e){a(e.target.value)},value:o,onKeyDown:e=>{"Enter"===e.key?l?.blur():"Escape"===e.key&&(a(String(t)),r(!0))},onBlur:()=>{const n=Number(o);o!==String(t)&&(Number.isNaN(n)?a(String(t)):e(n)||a(String(t)))},inputRef:e=>{c(e)},error:d,helperText:d?"Not a valid number":void 0})})),In=N.observer((function({assembly:e,feature:n,session:o}){const[a,s]=v.useState(""),[r,l]=v.useState(""),{_id:c,assemblyId:d,max:u,min:f,strand:g,type:h}=n,p=e=>{o.notify(e.message,"error")},{changeManager:y}=o.apolloDataStore;function b(n){const{value:o}=n.target,a=o?Number(o):void 0,s=new t.StrandChange({typeName:"StrandChange",changedIds:[c],featureId:c,oldStrand:g,newStrand:a,assembly:e});return y.submit(s)}return m.jsxs("div",{"data-testid":"basic_information",children:[m.jsx(Rn,{margin:"dense",id:"start",label:"Start",fullWidth:!0,variant:"outlined",value:f+1,onChangeCommitted:function(n){n--;const o=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[c],featureId:c,oldStart:f,newStart:n,assembly:e});return y.submit(o),!0}}),m.jsx(Rn,{margin:"dense",id:"end",label:"End",fullWidth:!0,variant:"outlined",value:u,onChangeCommitted:function(n){const o=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[c],featureId:c,oldEnd:u,newEnd:n,assembly:e});return y.submit(o),!0}}),m.jsx(St,{session:o,ontologyName:"Sequence Ontology",value:h,filterTerms:yt,fetchValidTerms:async function(e,t,n){const o=await xt(e,t);if(o)return o;l(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,n),renderInput:e=>m.jsx(i.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(r),helperText:r}),onChange:(e,n)=>{n&&function(e){s("");const n=new t.TypeChange({typeName:"TypeChange",changedIds:[c],featureId:c,oldType:h,newType:e,assembly:d});return y.submit(n)}(n).catch(p)}}),m.jsxs("label",{children:[m.jsx("input",{type:"radio",value:"1",checked:1===g,onChange:b}),"Positive Strand (+)"]}),m.jsxs("label",{children:[m.jsx("input",{type:"radio",value:"-1",checked:-1===g,onChange:b}),"Negative Strand (-)"]}),m.jsxs("label",{children:[m.jsx("input",{type:"radio",value:"",checked:void 0===g,onChange:b}),"No Strand Information"]}),a?m.jsx(i.Typography,{color:"error",children:a}):null]})})),Mn=N.observer((function(e){const{feature:t,model:n}=e,{children:o,parent:a}=t,s=[];if(o)for(const[,e]of o)s.push(e);return a??s.length>0?m.jsxs("div",{style:{marginTop:10},children:[a&&m.jsxs("div",{children:[m.jsx(i.Typography,{variant:"h6",children:"Parent:"}),m.jsxs(i.Button,{variant:"contained",onClick:()=>{n.setFeature(a)},children:[a.type,xe(a)," (",a.min,"..",a.max,")"]})]}),s.length>0&&m.jsxs("div",{children:[m.jsxs(i.Typography,{variant:"h6",children:[1===s.length?"Child":"Children",":"]}),s.map((e=>m.jsx("div",{style:{marginBottom:5},children:m.jsxs(i.Button,{variant:"contained",onClick:()=>{n.setFeature(e)},children:[e.type,xe(e)," (",e.min,"..",e.max,")"]})},e._id)))]})]}):null})),Ln=y.makeStyles()({sequence:{width:"100%",resize:"vertical"}}),En=N.observer((function({assembly:e,feature:t,refName:n,session:o}){const a=o.apolloDataStore.assemblies.get(e),{classes:s}=Ln();if(!t||!a)return null;const r=a.getByRefName(n);if(!r)return null;const{max:i,min:l}=t;let c=r.getSequence(l,i);return c?c=function(e,t,n,o,a){return`>${t}:${n+1}–${o}\n${e}`}(c,n,l,i):o.apolloDataStore.loadRefSeq([{assemblyName:e,refName:n,start:l,end:i}]),m.jsx("div",{children:m.jsx("textarea",{readOnly:!0,rows:20,className:s.sequence,value:c})})})),qn=y.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),Pn=N.observer((function(e){const{model:t}=e,{assembly:n,feature:o,refName:a}=t,r=s.getSession(t),l=r.apolloDataStore.assemblies.get(n),{classes:c}=qn(),[d,u]=v.useState(["attributes"]);if(v.useEffect((()=>{u(["attributes"])}),[o]),!o||!l)return null;const f=l.getByRefName(a);if(!f)return null;const{max:g,min:h}=o;function p(e,t){u(e?[...d,t]:d.filter((e=>e!==t)))}return f.getSequence(h,g)||r.apolloDataStore.loadRefSeq([{assemblyName:n,refName:a,start:h,end:g}]),m.jsxs("div",{className:c.root,children:[m.jsx(In,{feature:o,session:r,assembly:l._id}),m.jsxs(i.Accordion,{style:{marginTop:10},expanded:d.includes("attributes"),onChange:(e,t)=>{p(t,"attributes")},children:[m.jsx(i.AccordionSummary,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header",children:m.jsx(i.Typography,{component:"span",children:"Attributes"})}),m.jsx(i.AccordionDetails,{children:m.jsx(Nn,{feature:o,session:r,assembly:l._id,editable:!0})})]}),m.jsxs(i.Accordion,{style:{marginTop:10},expanded:d.includes("sequence"),onChange:(e,t)=>{p(t,"sequence")},children:[m.jsx(i.AccordionSummary,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header",children:m.jsx(i.Typography,{component:"span",children:"Sequence"})}),m.jsx(i.AccordionDetails,{children:d.includes("sequence")&&m.jsx(En,{feature:o,session:r,assembly:l._id,refName:a})})]}),m.jsxs(i.Accordion,{style:{marginTop:10},expanded:d.includes("related_features"),onChange:(e,t)=>{p(t,"related_features")},children:[m.jsx(i.AccordionSummary,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header",children:m.jsx(i.Typography,{component:"span",children:"Related features"})}),m.jsx(i.AccordionDetails,{children:m.jsx(Mn,{model:t,feature:o})})]})]})})),On=l.types.model("ApolloFeatureDetailsWidget",{id:R.ElementId,type:l.types.literal("ApolloFeatureDetailsWidget"),feature:l.types.maybe(l.types.reference(X.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:l.types.string,refName:l.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((t=>{if(!e.tryReload)return;const n=s.getSession(e),{apolloDataStore:o}=n;if(!o)return;const a=o.getFeature(e.tryReload);a&&(e.setFeature(a),e.setTryReload(),t.dispose())})))}}))),_n=l.types.model("ApolloTranscriptDetails",{id:R.ElementId,type:l.types.literal("ApolloTranscriptDetails"),feature:l.types.maybe(l.types.reference(X.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:l.types.string,refName:l.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((t=>{if(!e.tryReload)return;const n=s.getSession(e),{apolloDataStore:o}=n;if(!o)return;const a=o.getFeature(e.tryReload);a&&(e.setFeature(a),e.setTryReload(),t.dispose())})))}})));async function Bn(e){if(isSecureContext){const t=new Blob([e.outerText],{type:"text/plain"}),n=new Blob([e.outerHTML],{type:"text/html"}),o=new ClipboardItem({[t.type]:t,[n.type]:n});return navigator.clipboard.write([o])}const t=t=>{t.clipboardData?.setData("text/plain",e.outerText),t.clipboardData?.setData("text/html",e.outerHTML),t.preventDefault()};document.addEventListener("copy",t),document.execCommand("copy"),document.removeEventListener("copy",t)}function Un(e){let t=0;for(const n of e)t+=n.sequence.length;return t}function $n(e,t,n){const o=[],{cdsLocations:a,strand:r,transcriptParts:i}=t;switch(e){case"genomic":case"cDNA":{const[t]=i;for(const a of t){if("cDNA"===e&&"intron"===a.type)continue;let t=n(a.min,a.max);-1===r&&(t=s.revcom(t));const i="fivePrimeUTR"===a.type||"threePrimeUTR"===a.type?"UTR":a.type,l=o.at(-1);l&&l.type===i?(l.sequence+=t,l.locs.push({min:a.min,max:a.max})):o.push({type:i,sequence:t,locs:[{min:a.min,max:a.max}]})}return o}case"CDS":{let e="";const[t]=a,i=[];for(const o of t){let t=n(o.min,o.max);-1===r&&(t=s.revcom(t)),e+=t,i.push({min:o.min,max:o.max})}return o.push({type:"CDS",sequence:e,locs:i}),o}case"protein":{let e="";const[t]=a,i=[];for(const o of t){let t=n(o.min,o.max);-1===r&&(t=s.revcom(t)),e+=t,i.push({min:o.min,max:o.max})}let l="";for(let t=0;t<e.length;t+=3){const n=e.slice(t,t+3).toUpperCase();l+=s.defaultCodonTable[n]||"&"}return o.push({type:"protein",sequence:l,locs:i}),o}}}function Gn(e){switch(e){case"upOrDownstream":return"rgb(255,255,255)";case"exon":case"UTR":return"rgb(194,106,119)";case"CDS":return"rgb(93,168,153)";case"intron":return"rgb(187,187,187)";case"protein":return"rgb(148,203,236)"}}function Wn(e){const t=[],n=e.flatMap((e=>e.locs));let[o]=n;for(let e=1;e<n.length;e++)o.min===n[e].max||o.max===n[e].min?o={min:Math.min(o.min,n[e].min),max:Math.max(o.max,n[e].max)}:(t.push(o),o=n[e]);return t.push(o),t}const zn=N.observer((function({assembly:e,feature:n,refName:o,session:a}){const s=a.apolloDataStore.assemblies.get(e),r=s?.getByRefName(o),{featureTypeOntology:l}=a.apolloDataStore.ontologyManager,c="genomic",d=["genomic","cDNA"],[u,f]=v.useState(d),[g,h]=v.useState(c),[p,y]=v.useState((()=>r?$n(c,n,((e,t)=>r.getSequence(e,t))):[])),[b,x]=v.useState((()=>Wn(p))),S=i.useTheme(),w=v.useRef(null);if(v.useEffect((()=>{const{cdsLocations:e}=n,[t]=e;f(t.length>0?[...d,"CDS","protein"]:d)}),[n]),!s||!r)return null;const C=s.getByRefName(o);if(!C)return null;if(!l)throw new Error("featureTypeOntology is undefined");return l.isTypeOf(n.type,"transcript")?m.jsxs(m.Fragment,{children:[m.jsx(i.Select,{defaultValue:"genomic",value:g,onChange:function(e){const t=e.target.value;h(t);const o=r?$n(t,n,((e,t)=>r.getSequence(e,t))):[],a=Wn(o);y(o),x(a)},size:"small","data-testid":"sequenceOptionSelector",children:u.map((e=>m.jsx(i.MenuItem,{value:e,"data-testid":`sequenceOption-${e}`,children:e},e)))}),m.jsx(i.Button,{variant:"contained",onClick:()=>{const e=w.current;e&&Bn(e)},style:{marginLeft:10},size:"medium",children:"Copy sequence"}),m.jsxs(i.Paper,{style:{fontFamily:"monospace",padding:S.spacing(),overflowX:"auto"},ref:w,children:[">",C.name,":",b.map((e=>1===n.strand?`${e.min+1}-${e.max}`:`${e.max}-${e.min+1}`)).join(";"),"(strand=",1===n.strand?"+":"-",";length=",Un(p),")",m.jsx("br",{}),function(e,n){const o=[];let a=0;for(const[n,s]of e.entries()){const e=a%60,r=a>0&&0===e?"\n":"";a+=s.sequence.length;const i=r+s.sequence.slice(0,60-e),l=[i,...t.splitStringIntoChunks(s.sequence.slice(i.length),60)],c=m.jsx("span",{style:{background:Gn(s.type),color:S.palette.getContrastText(Gn(s.type)),whiteSpace:"pre-line"},children:l.join("\n")},`${s.type}-${n}`);o.push(c)}return o}(p)]})]}):null})),Hn=K(Rn)((()=>({"&.MuiFormControl-root":{marginTop:0,marginBottom:0,width:"100%"},"& .MuiInputBase-input":{fontSize:12,height:20,padding:1,paddingLeft:10}}))),Vn=K("div")({display:"flex",justifyContent:"center",alignItems:"center",textAlign:"left",width:"100%",overflowWrap:"break-word",wordWrap:"break-word",wordBreak:"break-all","& span":{fontSize:12}}),Jn=e=>{const{strand:t}=e;return m.jsx("div",{children:1===t?m.jsx(r,{}):-1===t?m.jsx(Q,{}):m.jsx(i.Typography,{component:"span",children:"N/A"})})},Xn=N.observer((function({assembly:e,feature:n,refName:o,session:a}){const{notify:r}=a,l=a.apolloDataStore.assemblies.get(e),c=l?.getByRefName(o),{changeManager:d}=a.apolloDataStore,u=v.useRef(null),{changeInProgress:f}=a;if(!c)return null;const{apolloDataStore:g}=a,{featureTypeOntology:h}=g.ontologyManager;if(!h.isTypeOf(n.type,"transcript")&&!h.isTypeOf(n.type,"pseudogenic_transcript"))throw new Error("Feature is not a transcript or equivalent");const{cdsLocations:p,transcriptExonParts:y,strand:b}=n,[x]=p,[S,w]=((e,t)=>{const{transcriptExonParts:n}=e,o=n.filter((e=>t.isTypeOf(e.type,"exon"))).sort((({min:e},{min:t})=>e-t)),a=o[0]?.min,s=o[o.length-1]?.max;return[a,s]})(n,h);let C=S,j=w;const T=x.length>0;if(T){const e=x.toSorted((({min:e},{min:t})=>e-t));C=e[0].min,j=e[e.length-1].max}const A=(n,o,a,s,i)=>{if(!a.children)throw new Error("Transcript should have child features");if(n===o)return!0;const l=N(a,h,n,s);if(!l)return r("No matching CDS feature found","error"),!1;if(s&&o>=l.max)return r("Start location should be less than CDS end location","error"),!1;if(!s&&o<=l.min)return r("End location should be greater than CDS start location","error"),!1;if(!L(a,h,o,s))return r("There should be an overlapping exon for the new CDS location","error"),!1;const c=s?new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[l._id],featureId:l._id,oldStart:l.min,newStart:o,assembly:e}):new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[l._id],featureId:l._id,oldEnd:l.max,newEnd:o,assembly:e});return d.submit(c).then((()=>{i&&i()})).catch((()=>{r("Error updating feature CDS position","error")})),!0};function F(n,o,a,s){if(!a.children)throw new Error("Transcript should have child features");const{matchingExon:i,prevExon:l,nextExon:c}=E(a,h,n,s);if(!i)return r("No matching exon found","error"),!1;if(s&&o>=i.max)return r("Start location should be less than end location","error"),!1;if(!s&&o<=i.min)return r("End location should be greater than start location","error"),!1;if(l&&l.max+2>o)return r("Error while changing start location","error"),!1;if(c&&c.min-2<o)return r("Error while changing end location","error"),!1;const u=I(a,i.min,i.max,h);if(!u)return r("No matching exon feature found","error"),!1;const f=R(a,h);if(s&&o!==i.min){const n=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:e});if(l)k(u,n,o);else{const e=a.min,t=a.parent;if(o<e)t&&o<t.min&&k(t,n,o),k(a,n,o),k(u,n,o);else if(o>e&&(k(u,n,o),k(a,n,o),t)){const[e]=M(t,a,o,h,s);t.min!=e&&k(t,n,e)}}f&&f.min>=i.min&&f.min<=i.max&&o>f.min&&k(f,n,o),d.submit(n).catch((()=>{r("Error updating feature exon start position","error")}))}if(!s&&o!==i.max){const n=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:e});if(c)D(u,n,o);else{const e=a.max,t=a.parent;if(o>e)t&&o>t.max&&D(t,n,o),D(a,n,o),D(u,n,o);else if(o<e&&(D(u,n,o),D(a,n,o),t)){const[,e]=M(t,a,o,h,s);t.max!=e&&D(t,n,e)}}f&&f.max>=i.min&&f.max<=i.max&&o<f.max&&D(f,n,o),d.submit(n).catch((()=>{r("Error updating feature exon end position","error")}))}return!0}const D=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldEnd:e.max,newEnd:n})},k=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldStart:e.min,newStart:n})},N=(e,t,n,o)=>{let a;for(const[,s]of e.children??[])if(t.isTypeOf(s.type,"CDS")){if(o&&n===s.min){a=s;break}if(!o&&n===s.max){a=s;break}}return a},R=(e,t)=>{let n;for(const[,o]of e.children??[])if(t.isTypeOf(o.type,"CDS")){n=o;break}return n},I=(e,t,n,o)=>{let a;for(const[,s]of e.children??[])if(o.isTypeOf(s.type,"exon")&&t===s.min&&n===s.max){a=s;break}return a},M=(e,t,n,o,a)=>{const s=[],r=[];for(const[,i]of e.children?.entries()??[])o.isTypeOf(i.type,"transcript")&&(i._id===t._id?a?(s.push(n),r.push(i.max)):(r.push(n),s.push(i.min)):(s.push(i.min),r.push(i.max)));return[Math.min(...s),Math.max(...r)]},L=(e,t,n,o)=>{const{transcriptExonParts:a}=e;let s;for(const[,e]of a.entries())if(t.isTypeOf(e.type,"exon")){if(!o&&n>=e.min&&n<=e.max){s=e;break}if(o&&n>=e.min&&n<=e.max){s=e;break}}return s},E=(e,t,n,o)=>{const{transcriptExonParts:a,strand:s}=e;let r,i,l,c;for(const[e,s]of a.entries())if(t.isTypeOf(s.type,"exon")){if(o&&s.min===n){r=s,i=e;break}if(!o&&s.max===n){r=s,i=e;break}}if(r&&void 0!==i){if(1===s&&i>0)for(let e=i-1;e>=0;e--){const n=a[e];if(t.isTypeOf(n.type,"exon")){l=n;break}}if(-1===s&&i<a.length-1)for(let e=i+1;e<a.length;e++){const n=a[e];if(t.isTypeOf(n.type,"exon")){l=n;break}}if(1===s&&i<a.length-1)for(let e=i+1;e<a.length;e++){const n=a[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}if(-1===s&&i>0)for(let e=i-1;e>=0;e--){const n=a[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}}return{matchingExon:r,prevExon:l,nextExon:c}},q=(e,t)=>{let n="";if(t>0){const o=y[t-1];1===b?"intron"===o.type&&(n=c.getSequence(e.min-2,e.min)):"intron"===o.type&&(n=s.revcom(c.getSequence(e.max,e.max+2)))}return n=n.toUpperCase(),[{spliceSite:n,color:"AG"===n?"green":"red"}]},P=(e,t)=>{let n="";if(t<y.length-1){const o=y[t+1];1===b?"intron"===o.type&&(n=c.getSequence(e.max,e.max+2)):"intron"===o.type&&(n=s.revcom(c.getSequence(e.min-2,e.min)))}return n=n.toUpperCase(),[{spliceSite:n,color:"GT"===n?"green":"red"}]},O=()=>{let e="";const[t]=p,o=t.toSorted((({min:e},{min:t})=>e-t));for(const t of o)e+=c.getSequence(t.min,t.max);-1===b&&(e=s.revcom(e));const a=[];for(let t=0;t<e.length;t+=3){const o=e.slice(t,t+3).toUpperCase(),r=s.defaultCodonTable[o]||"&";"ATG"===o?a.push(m.jsx(i.Typography,{component:"span",style:{backgroundColor:f?"lightgray":"yellow",cursor:"pointer",border:"1px solid black"},onClick:()=>{if(f)return;const e=_(t);e!==C&&1===b&&A(C,e,n,!0),e!==j&&-1===b&&A(j,e,n,!1)},children:r},t)):["TAA","TAG","TGA"].includes(o)?a.push(m.jsx(i.Typography,{style:{backgroundColor:"red",color:"white"},component:"span",children:r},t)):a.push(m.jsx(i.Typography,{component:"span",children:r},t))}return a},_=e=>{const[t]=p;let n=0;const o=t.toSorted((({min:e},{min:t})=>e-t));if(1===b)for(const t of o){const o=t.max-t.min;if(n+o>e)return t.min+(e-n);n+=o}else if(-1===b)for(let t=o.length-1;t>=0;t--){const a=o[t],s=a.max-a.min;if(n+s>e)return a.max-(e-n);n+=s}return 1===b?C:j};return m.jsxs("div",{children:[T&&m.jsxs("div",{children:[m.jsxs(i.Accordion,{children:[m.jsx(Qn,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Translation"})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(Vn,{children:m.jsx(i.Typography,{component:"span",ref:u,style:{maxHeight:120,overflowY:"scroll"},children:O()})}),m.jsxs("div",{style:{marginTop:10,display:"flex",flexDirection:"row",alignItems:"center",gap:10},children:[m.jsx(i.Tooltip,{title:"Copy",children:m.jsx("button",{onClick:()=>{const e=u.current;e&&Bn(e)},style:{border:"none",background:"none",padding:0},disabled:f,children:m.jsx(Z,{style:{fontSize:15}})})}),m.jsx(i.Tooltip,{title:"Trim",children:m.jsx("button",{onClick:()=>{const e=O(),t=e.map((e=>e.props.children)).join("");if(t.startsWith("M")&&t.endsWith("*"))return;const o=[];for(const t of e)o.push({codonGenomicPos:t.key,sequenceLetter:t.props.children});if(0===o.length)return;const a=t.indexOf("M"),s=t.indexOf("*"),i=o[a].codonGenomicPos,l=o[s].codonGenomicPos;if(!i||!l)return;const c=_(i);let d=_(l);if(1===b){if(c>d)return void r("Start codon genomic location should be less than stop codon genomic location","error");let e;d+=3,c!==C&&(e=new Promise((e=>{A(C,c,n,!0,(()=>{e(!0)}))}))),d!==j&&(e?e.then((()=>{A(j,d,n,!1)})):A(j,d,n,!1))}if(-1===b){if(c<d)return void r("Start codon genomic location should be less than stop codon genomic location","error");let e;d-=3,c!==j&&(e=new Promise((e=>{A(j,c,n,!1,(()=>{e(!0)}))}))),d!==C&&(e?e.then((()=>{A(C,d,n,!0)})):A(C,d,n,!0))}r("Translation sequence trimmed to start and stop codons","success")},style:{border:"none",background:"none",padding:0},disabled:f,children:m.jsx(Y,{style:{fontSize:15}})})})]})]})]}),m.jsxs(i.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center",marginTop:10},children:[m.jsx(i.Grid,{size:1}),m.jsx(i.Grid,1===b?{size:4,children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:C+1,onChangeCommitted:e=>A(C,e-1,n,!0),style:{border:"1px solid black",borderRadius:5},disabled:f})}:{size:4,children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:j,onChangeCommitted:e=>A(j,e,n,!1),style:{border:"1px solid black",borderRadius:5},disabled:f})}),m.jsx(i.Grid,{size:2,children:m.jsx(i.Typography,{component:"span",children:"CDS"})}),m.jsx(i.Grid,1===b?{size:4,children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:j,onChangeCommitted:e=>A(j,e,n,!1),style:{border:"1px solid black",borderRadius:5},disabled:f})}:{size:4,children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:C+1,onChangeCommitted:e=>A(C,e-1,n,!0),style:{border:"1px solid black",borderRadius:5},disabled:f})}),m.jsx(i.Grid,{size:1})]})]}),m.jsx("div",{style:{marginTop:5},children:y.map(((e,t)=>m.jsx("div",{children:"exon"===e.type&&m.jsxs(i.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center"},children:[m.jsx(i.Grid,{size:1,children:0!==t&&q(e,t).map(((e,t)=>m.jsx(i.Typography,{component:"span",color:e.color,children:e.spliceSite},t)))}),m.jsx(i.Grid,1===b?{size:4,style:{padding:0},children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>F(e.min,t-1,n,!0),disabled:f})}:{size:4,style:{padding:0},children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>F(e.max,t,n,!1),disabled:f})}),m.jsx(i.Grid,{size:2,children:m.jsx(Jn,{strand:n.strand})}),m.jsx(i.Grid,1===b?{size:4,style:{padding:0},children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>F(e.max,t,n,!1),disabled:f})}:{size:4,style:{padding:0},children:m.jsx(Hn,{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>F(e.min,t-1,n,!0),disabled:f})}),m.jsx(i.Grid,{size:1,children:t!==y.length-1&&P(e,t).map(((e,t)=>m.jsx(i.Typography,{component:"span",color:e.color,children:e.spliceSite},t)))})]})},t)))})]})})),Kn=K(i.TableCell)((()=>({fontWeight:"bold"}))),Zn=N.observer((function(e){const{feature:t}=e,n=ye(t),o=be(t);return m.jsx(i.Table,{size:"small",sx:{fontSize:"0.75rem","& .MuiTableCell-root":{padding:"4px"}},children:m.jsxs(i.TableBody,{children:[""!==n&&m.jsxs(i.TableRow,{children:[m.jsx(Kn,{children:"Name"}),m.jsx(i.TableCell,{children:ye(t)})]}),""!==o&&m.jsxs(i.TableRow,{children:[m.jsx(Kn,{children:"ID"}),m.jsx(i.TableCell,{children:be(t)})]}),m.jsxs(i.TableRow,{children:[m.jsx(Kn,{children:"Type"}),m.jsx(i.TableCell,{children:t.type})]}),m.jsxs(i.TableRow,{children:[m.jsx(Kn,{children:"Location"}),m.jsxs(i.TableCell,{children:[e.refName,":",t.min,"..",t.max]})]}),m.jsxs(i.TableRow,{children:[m.jsx(Kn,{children:"Strand"}),m.jsx(i.TableCell,{children:(a=t.strand,1===a?"Forward":-1===a?"Reverse":"")})]})]})});var a})),Yn=y.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),Qn=K(i.AccordionSummary)((()=>({minHeight:30,maxHeight:30,"&.Mui-expanded":{minHeight:30,maxHeight:30}})));function eo(e){return null}const to=N.observer((function(e){const{classes:t}=Yn(),n=["summary","location"],[o,a]=v.useState(n),{model:r}=e,{assembly:c,feature:d,refName:u}=r;v.useEffect((()=>{a(n)}),[d]);const f=s.getSession(r),{pluginManager:g}=s.getEnv(f),h=s.getSession(r),p=h.apolloDataStore.assemblies.get(c),{internetAccounts:y}=l.getRoot(f),x=y.find((e=>"ApolloInternetAccount"===e.type)),S=["admin","user"].includes((x?x.role:"admin")??"");if(!d||!p)return null;const w=p.getByRefName(u);if(!w)return null;const{max:C,min:j}=d;function T(e,t){a(e?[...o,t]:o.filter((e=>e!==t)))}w.getSequence(j,C)||h.apolloDataStore.loadRefSeq([{assemblyName:c,refName:u,start:j,end:C}]);const A=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSummary",eo,{feature:d,session:f}),F=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSummary",eo,{feature:d,session:f}),D=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideLocation",eo,{feature:d,session:f}),k=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterLocation",eo,{feature:d,session:f}),N=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideAttributes",eo,{feature:d,session:f}),R=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterAttributes",eo,{feature:d,session:f}),I=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSequence",eo,{feature:d,session:f}),M=g.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSequence",eo,{feature:d,session:f});return m.jsxs("div",{className:t.root,children:[m.jsxs(i.Accordion,{expanded:o.includes("summary"),onChange:(e,t)=>{T(t,"summary")},children:[m.jsx(Qn,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Summary"})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(Zn,{feature:d,refName:u}),m.jsx(A,{session:f,feature:d})]})]}),m.jsx(F,{session:f,feature:d}),m.jsxs(i.Accordion,{style:{marginTop:5},expanded:o.includes("location"),onChange:(e,t)=>{T(t,"location")},children:[m.jsx(Qn,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Location"})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(Xn,{feature:d,refName:u,session:h,assembly:p._id||""}),m.jsx(D,{session:f,feature:d})]})]}),m.jsx(k,{session:f,feature:d}),m.jsxs(i.Accordion,{style:{marginTop:5},expanded:o.includes("attrs"),onChange:(e,t)=>{T(t,"attrs")},children:[m.jsx(Qn,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header",children:m.jsxs("div",{style:{display:"flex",alignItems:"center"},children:[m.jsxs(i.Typography,{component:"span",fontWeight:"bold",children:["Attributes"," "]}),m.jsx(i.Tooltip,{title:"Separate multiple values for the attribute with commas",children:m.jsx(b,{style:{color:"white",fontSize:15,marginLeft:10}})})]})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(Nn,{feature:d,session:h,assembly:p._id||"",editable:S}),m.jsx(N,{session:f,feature:d})]})]}),m.jsx(R,{session:f,feature:d}),m.jsxs(i.Accordion,{style:{marginTop:5},expanded:o.includes("sequence"),onChange:(e,t)=>{T(t,"sequence")},children:[m.jsx(Qn,{expandIcon:m.jsx(z,{style:{color:"white"}}),"aria-controls":"panel4-content",id:"panel4-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Sequence"})}),m.jsxs(i.AccordionDetails,{children:[o.includes("sequence")&&m.jsx(zn,{feature:d,session:h,assembly:p._id||"",refName:u}),m.jsx(I,{session:f,feature:d})]})]}),m.jsx(M,{feature:d,session:f})]})})),no=o.ConfigurationSchema("LinearApolloDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),oo=y.makeStyles()({highlighted:{background:"orange"}}),ao=({highlight:e,text:t})=>{const{classes:n}=oo();if(!e)return m.jsx(m.Fragment,{children:t});const o=t.split(e);if(1===o.length)return m.jsx(m.Fragment,{children:t});const a=[];for(let t=0;t<o.length-1;t++)a.push(o[t],m.jsx("span",{className:n.highlighted,children:e}));return m.jsxs(m.Fragment,{children:[a,o.at(-1)]})},so=N.observer((function({feature:e,filterText:t}){const n=[...e.attributes.entries()].map((([e,t])=>{if(e.startsWith("gff_")){const n=e.slice(4);return[n.charAt(0).toUpperCase()+n.slice(1),l.getSnapshot(t)]}return"_id"===e?["ID",l.getSnapshot(t)]:[e,l.getSnapshot(t)]})).filter((([e])=>e)).map((([e,t])=>`${e}=${Array.isArray(t)?t.join(", "):t}`)).join(", ");return m.jsx(ao,{text:n,highlight:t})})),ro=y.makeStyles()((e=>({inputWrapper:{position:"relative"},hiddenWidthSpan:{padding:e.spacing(.5),color:"transparent"},numberTextInput:{border:"none",background:"inherit",font:"inherit",position:"absolute",width:"100%",left:0}}))),io=N.observer((function({initialValue:e,notifyError:t,onChangeCommitted:n}){const[o,a]=v.useState(e),[s,r]=v.useState(!1),[i,l]=v.useState(null),{classes:c}=ro();return v.useEffect((()=>{e!==o&&a(e)}),[e]),v.useEffect((()=>{s&&(i?.blur(),r(!1))}),[s,i]),m.jsxs("span",{className:c.inputWrapper,children:[m.jsx("span",{className:c.hiddenWidthSpan,"aria-hidden":!0,children:o}),m.jsx("input",{type:"text",value:o,className:c.numberTextInput,onChange:function(e){const t=Number(e.target.value);Number.isNaN(t)||a(t)},onKeyDown:t=>{"Enter"===t.key?i?.blur():"Escape"===t.key&&(a(e),r(!0))},onBlur:()=>{o!==e&&n(o).catch(t)},ref:e=>{l(e)}})]})})),lo=y.makeStyles()((e=>({typeContent:{display:"inline-block",width:"174px",height:"100%",cursor:"text"},feature:{td:{position:"relative",verticalAlign:"top",paddingLeft:"0.5em"}},arrow:{display:"inline-block",width:"1.6em",textAlign:"center",cursor:"pointer"},arrowExpanded:{transform:"rotate(90deg)"},hoveredFeature:{backgroundColor:e.palette.action.hover},typeInputElement:{border:"none",background:"none"},typeErrorMessage:{color:"red"}})));function co(e,t){const{changeManager:n,getAssemblyId:o,regions:a,selectedFeature:r,session:i,setSelectedFeature:c,filteredTranscripts:d,updateFilteredTranscripts:u}=e;return function(e,t,n,o,a,r,i,c,d){const u=function(e){const{internetAccounts:t}=l.getParent(e);return t.find((e=>"ApolloInternetAccount"===e.type))}(r),f=u?u.role:"admin",g="admin"===f,h=!(f&&["admin","user"].includes(f)),p=[];if(e){const l=e.attributes.get("gff_id")?.toString(),f=n(t.assemblyName),m=n(t.assemblyName);p.push({label:"Edit feature details",onClick:()=>{const n=r.addWidget("ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget",{feature:e,assembly:m,refName:t.refName});r.showWidget(n)}},{label:"Add child feature",disabled:h,onClick:()=>{r.queueDialog((t=>[wt,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:f,internetAccount:u}]))}},{label:"Copy features and annotations",disabled:h,onClick:()=>{r.queueDialog((t=>[Rt,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:m}]))}},{label:"Delete feature",disabled:!g,onClick:()=>{r.queueDialog((t=>[Mt,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:m,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Merge transcripts",disabled:!g,onClick:()=>{r.queueDialog((t=>[$t,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:m,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Merge exons",disabled:!g,onClick:()=>{r.queueDialog((t=>[Bt,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:m,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Split exon",disabled:!g,onClick:()=>{r.queueDialog((t=>[Yt,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:m,selectedFeature:o,setSelectedFeature:a}]))}});const{featureTypeOntology:y}=r.apolloDataStore.ontologyManager;if(!y)throw new Error("featureTypeOntology is undefined");(y.isTypeOf(e.type,"transcript")||y.isTypeOf(e.type,"pseudogenic_transcript"))&&s.isSessionModelWithWidgets(r)&&p.push({label:"Edit transcript details",onClick:()=>{const n=r.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:e,assembly:m,changeManager:i,refName:t.refName});r.showWidget(n)}},{label:"Duplicate feature",onClick:()=>{r.queueDialog((t=>[Qt,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:m,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Visible",type:"checkbox",checked:!l||!c.includes(l),onClick:()=>{if(l){const e=c.includes(l)?c.filter((e=>e!==l)):[...c,l];d(e)}}})}return p}(t,a[0],o,r,c,i,n,d,u)}const uo=N.observer((function e({depth:n,feature:o,isHovered:a,isSelected:s,model:r,selectedFeatureClass:i,setContextMenu:l}){const{classes:c}=lo(),{changeManager:d,hoveredFeature:u,selectedFeature:f,session:g,tabularEditor:h}=r,{featureCollapsed:p,filterText:y}=h,{_id:b,children:x,max:S,min:w,strand:C,type:v}=o,j=!p.get(b),T=e=>{g.notify(e.message,"error")};return m.jsxs(m.Fragment,{children:[m.jsxs("tr",{onMouseEnter:e=>{r.setHoveredFeature({feature:o,bp:w})},className:c.feature+(s?` ${i}`:a?` ${c.hoveredFeature}`:""),onClick:e=>{e.stopPropagation(),r.setSelectedFeature(o)},onDoubleClick:()=>{r.setSelectedFeature(o),function(e,t){e.lgv.navTo(Me(t,.1,e.lgv.totalBp))}(r,o)},onContextMenu:e=>(e.preventDefault(),l({position:{left:e.clientX+2,top:e.clientY-6},items:co(r,o)}),!1),children:[m.jsxs("td",{style:{whiteSpace:"nowrap",borderLeft:2*n+"em solid transparent"},children:[x?.size?m.jsx("div",{onClick:e=>{e.stopPropagation(),h.setFeatureCollapsed(b,j)},className:c.arrow+(j?` ${c.arrowExpanded}`:""),children:"❯"}):null,m.jsx("div",{className:c.typeContent,children:m.jsx(St,{session:g,ontologyName:"Sequence Ontology",style:{width:170},value:v,filterTerms:yt,fetchValidTerms:fo.bind(null,o),renderInput:e=>m.jsxs("div",{ref:e.InputProps.ref,children:[m.jsx("input",{type:"text",...e.inputProps,className:c.typeInputElement,style:{width:170}}),e.error?m.jsx("div",{className:c.typeErrorMessage,children:e.errorMessage??"unknown error"}):null]}),onChange:(e,n)=>{n&&function(e,n,o,a){const s=n._id,r=new t.TypeChange({typeName:"TypeChange",changedIds:[s],featureId:s,oldType:String(o),newType:String(a),assembly:n.assemblyId});return e.submit(r)}(d,o,e,n).catch(T)}})})]}),m.jsx("td",{children:m.jsx(io,{initialValue:w+1,notifyError:T,onChangeCommitted:e=>function(e,n,o,a){const s=n._id,r=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[s],featureId:s,oldStart:o,newStart:a,assembly:n.assemblyId});return e.submit(r)}(d,o,w,e-1)})}),m.jsx("td",{children:m.jsx(io,{initialValue:S,notifyError:T,onChangeCommitted:e=>function(e,n,o,a){const s=n._id,r=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[s],featureId:s,oldEnd:o,newEnd:a,assembly:n.assemblyId});return e.submit(r)}(d,o,S,e)})}),m.jsx("td",{children:1===C?"+":-1===C?"-":void 0}),m.jsx("td",{children:m.jsx(so,{filterText:y,feature:o})})]}),j&&x?[...x.entries()].filter((e=>{if(!y)return!0;const[,t]=e;return JSON.stringify(t).includes(y)})).map((([t,o])=>m.jsx(e,{isHovered:u?.feature._id===o._id,isSelected:f?._id===o._id,selectedFeatureClass:i,depth:(n||0)+1,feature:o,model:r,setContextMenu:l},t))):null]})}));async function fo(e,t,n){const{parent:o}=e;if(o){const e=(await t.getTermsWithLabelOrSynonym(o.type,{includeSubclasses:!1})).filter(yt);if(e.length>0)return await t.getClassesThat("part_of",e)}}const go=y.makeStyles()((e=>({scrollableTable:{width:"100%",height:"100%",th:{position:"sticky",top:0,zIndex:2,textAlign:"left",background:e.palette.background.paper,paddingTop:"3.2em"},td:{whiteSpace:"normal"}},selectedFeature:{backgroundColor:e.palette.action.selected}}))),ho=N.observer((function({model:e}){const{hoveredFeature:t,seenFeatures:n,selectedFeature:o,tabularEditor:a}=e,s=i.useTheme(),{classes:r}=go(),l=v.useRef(null),[c,d]=v.useState(null),{filterText:u}=a;return v.useEffect((()=>{const e=l.current;if(e&&o){const t=e.querySelector(`.${r.selectedFeature}`);if(t){const n=e.scrollTop,o=t.offsetTop-25;o>n&&o<n+e.offsetHeight||e.scroll({top:o-40,behavior:"smooth"})}}}),[o,n,r.selectedFeature]),m.jsxs("div",{ref:l,style:{width:"100%",overflowY:"auto",height:"100%"},children:[m.jsxs("table",{className:r.scrollableTable,children:[m.jsx("thead",{children:m.jsxs("tr",{children:[m.jsx("th",{children:"Type"}),m.jsx("th",{children:"Start"}),m.jsx("th",{children:"End"}),m.jsx("th",{children:"Strand"}),m.jsx("th",{children:"Attributes"})]})}),m.jsx("tbody",{children:[...n.entries()].filter((e=>{if(!u)return!0;const[,t]=e;return JSON.stringify(t).includes(u)})).sort(((e,t)=>e[1].min-t[1].min)).map((([n,a])=>m.jsx(uo,{isSelected:o?._id===n,isHovered:t?.feature._id===n,selectedFeatureClass:r.selectedFeature,feature:a,model:e,depth:0,setContextMenu:d},n)))})]}),m.jsx(D.Menu,{open:Boolean(c),onMenuItemClick:(e,t)=>{t(),d(null)},onClose:()=>{d(null)},slotProps:{transition:{onExit:()=>{d(null)}}},style:{zIndex:s.zIndex.tooltip},menuItems:c?.items??[],anchorReference:"anchorPosition",anchorPosition:c?.position})]})})),po=y.makeStyles()({toolbar:{width:"100%",display:"flex",paddingRight:"2em",flexDirection:"row",justifyContent:"space-between",position:"absolute",zIndex:4},filterText:{}}),mo=N.observer((function({model:e}){const t=e.tabularEditor,{classes:n}=po();return m.jsxs("div",{className:n.toolbar,children:[m.jsx(i.Tooltip,{title:"Collapse all",children:m.jsx(i.IconButton,{"aria-label":"collapse",sx:{marginTop:0},onClick:t.collapseAllFeatures,children:m.jsx(te,{})})}),m.jsx(i.TextField,{className:n.filterText,label:"Filter features",value:t.filterText,sx:{marginTop:0},variant:"outlined",onChange:e=>{t.setFilterText(e.target.value)},slotProps:{input:{endAdornment:m.jsx(i.InputAdornment,{position:"end",children:m.jsx(i.IconButton,{onClick:()=>{t.clearFilterText()},children:m.jsx(ee,{})})})}}})]})}));function yo(e){e.stopPropagation()}const bo=N.observer((function({model:e}){return e.tabularEditor.isShown?m.jsxs("div",{onMouseDown:yo,onClick:yo,style:{width:"100%",height:"100%",position:"relative"},children:[m.jsx(mo,{model:e}),m.jsx(ho,{model:e})]}):null})),xo=l.types.model("TabularEditor",{isShown:!0,featureCollapsed:l.types.map(l.types.boolean),filterText:""}).actions((e=>({setFeatureCollapsed(t,n){e.featureCollapsed.set(t,n)},setFilterText(t){e.filterText=t},clearFilterText(){e.filterText=""},collapseAllFeatures(){const t=l.getParent(e);for(const[n]of t.seenFeatures.entries())e.featureCollapsed.set(n,!0)},togglePane(){e.isShown=!e.isShown},hidePane(){e.isShown=!1},showPane(){e.isShown=!0}})));function So(e,t,n,o=!1){const{apolloRowHeight:a,lgv:s,theme:r}=e,i=e.getFeatureLayoutPosition(n);if(!i)return;const{bpPerPx:l,displayedRegions:c,offsetPx:d}=s,{layoutIndex:u,layoutRow:f}=i,g=c[u],{refName:h,reversed:p}=g,{length:m,max:y,min:b}=n,x=(s.bpToPx({refName:h,coord:p?y:b,regionNumber:u})?.offsetPx??0)-d,S=f*a,w=m/l;t.fillStyle=o?r.palette.action.disabled:r.palette.action.focus,t.fillRect(x,S,w,a)}function wo(e,t,n,o,a,s){e.fillStyle=s,e.fillRect(t,n,o,a)}function Co(e,t,n){const{refName:o,regionNumber:a,x:s}=e,{lgv:r}=n,{offsetPx:i}=r,l=r.bpToPx({refName:o,coord:t.min,regionNumber:a}),c=r.bpToPx({refName:o,coord:t.max,regionNumber:a});if(void 0!==l&&void 0!==c){const e=l.offsetPx-i,t=c.offsetPx-i;if(Math.abs(t-e)<8)return;if(Math.abs(e-s)<4)return"min";if(Math.abs(t-s)<4)return"max"}}const vo={draw:function(e,t,n,o,a){const{apolloRowHeight:s,lgv:r,selectedFeature:i,theme:l}=o,{bpPerPx:c,displayedRegions:d,offsetPx:u}=r,f=d[a],g=(r.bpToPx({refName:f.refName,coord:t.min,regionNumber:a})?.offsetPx??0)-u,{reversed:h}=f,p=t.length/c,m=h?g-p:g,y=n*s,b=l.palette.background.default;!function(e,t,n,o,a,s){wo(e,t,n,o,a,s),o<=2||e.clearRect(t+1,n+1,o-2,a-2)}(e,m,y,p,s,l.palette.text.primary),p<=2||(function(e,t,n,o,a,s){wo(e,t+1,n+1,o-2,a-2,s)}(e,m,y,p,s,b),ke(t,i)&&So(o,e,t,!0))},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:o,lgv:a,theme:s}=e,{bpPerPx:r,displayedRegions:l,offsetPx:c}=a;if(!n)return;const{current:d,edge:u,feature:f,start:g}=n,h=Math.floor(g.y/o),p=l[g.regionNumber],m=(p.reversed?p.end-f[u]:f[u]-p.start)/r-c,y=Math.min(d.x,m),b=h*o,x=Math.abs(d.x-m),S=1*o;t.strokeStyle=s.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,x,S),t.fillStyle=i.alpha(s.palette.info.main,.2),t.fillRect(y,b,x,S)},drawHover:function(e,t){const{hoveredFeature:n}=e;n&&So(e,t,n.feature)},drawTooltip:function(e,t){const{hoveredFeature:n,apolloRowHeight:o,lgv:a,theme:s}=e;if(!n)return;const{feature:r}=n,l=e.getFeatureLayoutPosition(r);if(!l)return;const{featureRow:c,layoutIndex:d,layoutRow:u}=l,{bpPerPx:f,displayedRegions:g,offsetPx:h}=a,p=g[d],{refName:m,reversed:y}=p;let b="Loc: ";const{length:x,max:S,min:w}=r;b+=`${w+1}–${S}`;let C=(a.bpToPx({refName:m,coord:y?S:w,regionNumber:d})?.offsetPx??0)-h;const v=(u+c)*o,j=x/f,T=`Type: ${r.type}`,{attributes:A}=r,F=A.get("gff_name")?.find((e=>""!==e)),D=[t.measureText(T).width,t.measureText(b).width];F&&D.push(t.measureText(`Name: ${F}`).width);const k=Math.max(...D);C=C+j+5,t.fillStyle=i.alpha(s.palette.text.primary,.7),t.fillRect(C,v,k+4,3===D.length?45:35),t.beginPath(),t.moveTo(C,v),t.lineTo(C-5,v+5),t.lineTo(C,v+10),t.fill(),t.fillStyle=s.palette.background.default;let N=v+12;t.fillText(T,C+2,N),F&&(N+=12,t.fillText(`Name: ${F}`,C+2,N)),N+=12,t.fillText(b,C+2,N)},getContextMenuItemsForFeature:Ie,getContextMenuItems:function(e){const{hoveredFeature:t}=e;return t?Ie(e,t.feature):[]},getFeatureFromLayout:function(e,t,n){return e},getRowCount:function(e){return 1},getRowForFeature:function(e,t){return 0},onMouseDown:function(e,t,n){const{feature:o}=t,a=Co(t,o,e);a&&(n.stopPropagation(),e.startDrag(t,o,a))},onMouseLeave:function(){},onMouseMove:function(e,t){if(Pe(t)){const{feature:n,bp:o}=t;if(e.setHoveredFeature({feature:n,bp:o}),Co(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(e.apolloDragging)return;const{feature:n}=t;n&&(e.setSelectedFeature(n),e.showFeatureDetailsWidget(n))}};let jo=null,To=null,Ao=null,Fo=null;const Do=globalThis.document.createElement("canvas");if(Do?.getContext)for(const e of["forward","backward"])for(const t of["light","dark"]){const n=document.createElement("canvas"),o=10;n.width=n.height=o;const a=n.getContext("2d");if(a){const s="light"===t?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",r="light"===t?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",i="forward"===e?a.createLinearGradient(0,o,o,0):a.createLinearGradient(0,0,o,o);i.addColorStop(0,s),i.addColorStop(.25,s),i.addColorStop(.25,r),i.addColorStop(.5,r),i.addColorStop(.5,s),i.addColorStop(.75,s),i.addColorStop(.75,r),i.addColorStop(1,r),a.fillStyle=i,a.fillRect(0,0,10,10),"forward"===e?"light"===t?jo=a.createPattern(n,"repeat"):Ao=a.createPattern(n,"repeat"):"light"===t?To=a.createPattern(n,"repeat"):Fo=a.createPattern(n,"repeat")}}function ko(e,t,n,o,a,s,r,i,l){const{apolloRowHeight:c,lgv:d,theme:u}=t,{bpPerPx:f,displayedRegions:g,offsetPx:h}=d,p=g[n],{refName:m,reversed:y}=p,b=(d.bpToPx({refName:m,coord:a.min,regionNumber:n})?.offsetPx??0)-h,x=a.length/f,S=y?b-x:b,w=(o+s)*c,C=Math.round(.6*c),v=w+(c-C)/2;if(e.fillStyle=u.palette.text.primary,e.fillRect(S,v,x,C),x>2&&(e.clearRect(S+1,v+1,x-2,C-2),e.fillStyle="rgb(211,211,211)",e.fillRect(S+1,v+1,x-2,C-2),i&&l&&r)){const t=y?-1:1,[n,o]=r*t==1?[i,l]:[l,i];e.fillStyle=n,e.fillRect(S+1,v+1,x-2,(C-2)/2),e.fillStyle=o,e.fillRect(S+1,v+1+(C-2)/2,x-2,(C-2)/2)}}function*No(e,t,n=1){if(e!==t)if(e<t)for(let o=e;o<t;o+=n)yield o;else for(let o=e;o>t;o-=n)yield o}function Ro(e,t,n,o,a,s){const{apolloRowHeight:r,lgv:i,theme:l}=t,{bpPerPx:c,displayedRegions:d,offsetPx:u}=i,f=d[n],{refName:g,reversed:h}=f,p=(i.bpToPx({refName:g,coord:a.min,regionNumber:n})?.offsetPx??0)-u,m=Math.round(a.length/c),y=h?p-m:p,b=Math.round((s+.5)*r)+o*r;e.strokeStyle=l.palette.text.primary;const{strand:x=1}=a;e.beginPath();const S=x*(h?-1:1),w=y-(-1===S?5:0),C=y+m+(-1===S?0:5);e.moveTo(w,b),e.lineTo(C,b);const v=w+(-1===S?0:3),j=C-(-1===S?3:0),T=-1===S?3:-3,A=-1===S?No(v,j,20):No(j,v,20);for(const t of A)e.moveTo(t+T,b+T),e.lineTo(t,b),e.lineTo(t+T,b-T);e.stroke()}function Io(e,t,n,o=!1){const{apolloRowHeight:a,lgv:s,session:r,theme:i}=e,{featureTypeOntology:l}=r.apolloDataStore.ontologyManager,c=e.getFeatureLayoutPosition(n);if(!c)return;const{bpPerPx:d,displayedRegions:u,offsetPx:f}=s,{featureRow:g,layoutIndex:h,layoutRow:p}=c,m=u[h],{refName:y,reversed:b}=m,{length:x,max:S,min:w}=n,C=(s.bpToPx({refName:y,coord:b?S:w,regionNumber:h})?.offsetPx??0)-f,v=(p+g)*a,j=x/d;if(t.fillStyle=o?i.palette.action.disabled:i.palette.action.focus,!l)throw new Error("featureTypeOntology is undefined");t.fillRect(C,v,j,a*Lo(n,l))}function Mo(e,t){const{children:n,type:o}=e;if(!n)return 0;let a=0;if(t.isTypeOf(o,"transcript"))for(const[,e]of n)t.isTypeOf(e.type,"CDS")&&(a+=1);return a}function Lo(e,t,n){const{children:o,type:a}=e;if(!o)return 1;let s=0;if(t.isTypeOf(a,"transcript")||t.isTypeOf(a,"pseudogenic_transcript")){for(const[,e]of o)t.isTypeOf(e.type,"CDS")&&(s+=1);return 0===s?1:s}for(const[,e]of o)s+=Lo(e,t);return s}function Eo(e,t){if(!t.isTypeOf(e.type,"gene")&&!t.isTypeOf(e.type,"pseudogene"))throw new Error('Top level feature for GeneGlyph must have type "gene"');const{children:n}=e;if(!n)return[[e]];const o=[];for(const[,a]of n){if(!t.isTypeOf(a.type,"transcript")&&!t.isTypeOf(a.type,"pseudogenic_transcript")){o.push([a,e]);continue}if(!a.children)continue;const n=[],s=[];for(const[,e]of a.children)t.isTypeOf(e.type,"CDS")?n.push(e):t.isTypeOf(e.type,"exon")&&s.push(e);for(const t of n)o.push([t,...s,a,e]);0===n.length&&o.push([...s,a,e])}return o}function qo(e,t,n){const{session:o}=n,{apolloDataStore:a}=o,{featureTypeOntology:r}=a.ontologyManager;if(!r)throw new Error("featureTypeOntology is undefined");const i=r.isTypeOf(t.type,"gene")||r.isTypeOf(t.type,"pseudogene"),l=r.isTypeOf(t.type,"transcript")||r.isTypeOf(t.type,"pseudogenic_transcript"),c=r.isTypeOf(t.type,"CDS");if(i||l)return;const{bp:d,refName:u,regionNumber:f,x:g}=e,{lgv:h}=n;if(c){const e=t.parent;if(!e?.children)return;const n=[];for(const t of e.children.values())r.isTypeOf(t.type,"exon")&&n.push(t);const o=n.find((e=>{const[t,n]=s.intersection2(d-1,d,e.min,e.max);return void 0!==t&&void 0!==n}));if(o){const e=Fe(o,u,f,h);if(e){const t=De(o,g,e);if(t)return t}}}const p=Fe(t,u,f,h);if(p){const e=De(t,g,p);if(e)return e}}const{drawTooltip:Po,getContextMenuItemsForFeature:Oo,onMouseLeave:_o}=vo,Bo={draw:function(e,t,n,a,r){const{apolloRowHeight:l,lgv:c,selectedFeature:d,session:u,theme:f}=a,{bpPerPx:g,displayedRegions:h,offsetPx:p}=c,m=h[r],{refName:y,reversed:b}=m,x=l,S=Math.round(.9*x),{children:w,strand:C}=t;if(!w)return;const{apolloDataStore:v}=u,{featureTypeOntology:j}=v.ontologyManager;if(!j)throw new Error("featureTypeOntology is undefined");!function(e,t,n,a,s,r){const{apolloRowHeight:l,lgv:c,session:d,theme:u}=n,{bpPerPx:f,displayedRegions:g,offsetPx:h}=c,p=g[a],{refName:m,reversed:y}=p,{apolloDataStore:b}=d,{featureTypeOntology:x}=b.ontologyManager;if(!x)throw new Error("featureTypeOntology is undefined");const S=(c.bpToPx({refName:m,coord:t.min,regionNumber:a})?.offsetPx??0)-h,w=t.length/f,C=y?S-w:S,v=s*l,j=Lo(t,x)*l;let T;T=o.readConfObject(d.getPluginConfiguration(),"geneBackgroundColor",{featureType:t.type}),T||(T=i.alpha(u.palette.background.paper,.6)),e.fillStyle=T,e.fillRect(C,v,w,j)}(e,t,a,r,n);let T=0;for(const[,t]of w){if(!j.isTypeOf(t.type,"transcript")&&!j.isTypeOf(t.type,"pseudogenic_transcript")){T+=1;continue}const{children:o}=t;if(!o)continue;const s=Mo(t,j);for(const[,s]of o)j.isTypeOf(s.type,"CDS")&&(Ro(e,a,r,n,t,T),T+=1);0===s&&(Ro(e,a,r,n,t,T),T+=1)}const A="dark"===f.palette.mode?Ao:jo,F="dark"===f.palette.mode?Fo:To;T=0;for(const[,t]of w){if(!j.isTypeOf(t.type,"transcript")&&!j.isTypeOf(t.type,"pseudogenic_transcript")){vo.draw(e,t,n,a,r),T+=1;continue}const o=Mo(t,j);if(0!=o)for(const o of t.cdsLocations){const{children:i}=t;if(i){for(const[,t]of i)j.isTypeOf(t.type,"exon")&&ko(e,a,r,n,t,T,C,A,F);for(const a of o){const o=(a.max-a.min)/g,i=(c.bpToPx({refName:y,coord:a.min,regionNumber:r})?.offsetPx??0)-p,l=b?i-o:i;e.fillStyle=f.palette.text.primary;const d=(n+T)*x+(x-S)/2;if(e.fillRect(l,d,o,S),o>2){e.clearRect(l+1,d+1,o-2,S-2);const n=s.getFrame(a.min,a.max,t.strand??1,a.phase),r=f.palette.framesCDS.at(n)?.main;if(e.fillStyle=r??"black",e.fillRect(l+1,d+1,o-2,S-2),A&&F&&C){const t=b?-1:1,[n,a]=C*t==1?[A,F]:[F,A];e.fillStyle=n,e.fillRect(l+1,d+1,o-2,(S-2)/2),e.fillStyle=a,e.fillRect(l+1,d+(S-2)/2,o-2,(S-2)/2)}}}T+=1}}const{children:i}=t;if(0===o&&i){for(const[,t]of i)j.isTypeOf(t.type,"exon")&&ko(e,a,r,n,t,T,C,A,F);T+=1}}d&&Ne(t,d)&&Io(a,e,d,!0)},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:o,lgv:a,theme:s}=e,{bpPerPx:r,displayedRegions:l,offsetPx:c}=a;if(!n)return;const{current:d,edge:u,feature:f,start:g}=n,h=Math.floor(g.y/o),p=l[g.regionNumber],m=(p.reversed?p.end-f[u]:f[u]-p.start)/r-c,y=Math.min(d.x,m),b=h*o,x=Math.abs(d.x-m),S=1*o;t.strokeStyle=s.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,x,S),t.fillStyle=i.alpha(s.palette.info.main,.2),t.fillRect(y,b,x,S)},drawHover:function(e,t){const{hoveredFeature:n}=e;n&&Io(e,t,n.feature)},drawTooltip:Po,getContextMenuItems:function(e,t){const{apolloInternetAccount:n,hoveredFeature:o,changeManager:a,regions:r,selectedFeature:i,session:l}=e,[c]=r,d=e.getAssemblyId(c.assemblyName),u=[],f="admin"===(n?n.role:"admin");if(!o)return u;if(Pe(t)){const{bp:n,feature:o}=t;let r=Se(o,n);je(o,l)&&(r=Se(o,n,!0));for(const n of r){const o=vo.getContextMenuItemsForFeature(e,n);if(ve(n,l)){const r=Te(n,e,t,l),c=s.getContainingView(e);if(r.upstream){const t=r.upstream;o.push({label:"Go to upstream exon",icon:Ae(n.strand,!0,c.displayedRegions.at(0)?.reversed),onClick:()=>{c.navTo(Me(t,.1,c.totalBp)),we(e,t)}})}if(r.downstream){const t=r.downstream;o.push({label:"Go to downstream exon",icon:Ae(n.strand,!1,c.displayedRegions.at(0)?.reversed),onClick:()=>{c.navTo(Me(t,.1,c.totalBp)),we(e,t)}})}o.push({label:"Merge exons",disabled:!f,onClick:()=>{l.queueDialog((t=>[Bt,{session:l,handleClose:()=>{t()},changeManager:a,sourceFeature:n,sourceAssemblyId:d,selectedFeature:i,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:!f,onClick:()=>{l.queueDialog((t=>[Yt,{session:l,handleClose:()=>{t()},changeManager:a,sourceFeature:n,sourceAssemblyId:d,selectedFeature:i,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}})}Ce(n,l)&&(o.push({label:"Merge transcript",onClick:()=>{l.queueDialog((t=>[$t,{session:l,handleClose:()=>{t()},changeManager:a,sourceFeature:n,sourceAssemblyId:d,selectedFeature:i,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Duplicate feature",onClick:()=>{l.queueDialog((t=>[Qt,{session:l,handleClose:()=>{t()},changeManager:a,sourceFeature:n,sourceAssemblyId:d,selectedFeature:i,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),s.isSessionModelWithWidgets(l)&&o.splice(1,0,{label:"Open transcript editor",onClick:()=>{const e=l.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:n,assembly:d,changeManager:a,refName:c.refName});l.showWidget(e)}})),u.push({label:n.type,subMenu:o})}}return u},getContextMenuItemsForFeature:Oo,getFeatureFromLayout:function(e,t,n,o){const a=Eo(e,o)[n]||[];for(const e of a){let n;if(t>=e.min&&t<=e.max&&e.parent&&(n=e),n){if(o.isTypeOf(n.type,"CDS")&&n.parent&&(o.isTypeOf(n.parent.type,"transcript")||o.isTypeOf(n.parent.type,"pseudogenic_transcript"))){const{cdsLocations:e}=n.parent;for(const o of e)for(const e of o)if(t>=e.min&&t<=e.max)return n;return n.parent}return n}}return e},getRowCount:Lo,getRowForFeature:function(e,t,n){const o=Eo(e,n);for(const[e,n]of o.entries())if(n.some((e=>e._id===t._id)))return e},onMouseDown:function(e,t,n){const{feature:o}=t,a=qo(t,o,e);a&&(n.stopPropagation(),e.startDrag(t,a.feature,a.edge,!0))},onMouseLeave:_o,onMouseMove:function(e,t){if(Pe(t)){const{feature:n,bp:o}=t;if(e.setHoveredFeature({feature:n,bp:o}),qo(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(e.apolloDragging)return;const{feature:n}=t;n&&we(e,n)}};function Uo(e){const t=[[e]];if(e.children)for(const[,n]of e.children)t.push(...Uo(n));return t}function $o(e){return Uo(e).length}function Go(e,t,n,o,a,s){const r=Uo(t)[n-o];for(const t of r)Wo(e,t,n,a,s)}function Wo(e,t,n,o,a){const{apolloRowHeight:s,lgv:r,theme:l}=o,{bpPerPx:c,displayedRegions:d,offsetPx:u}=r,f=d[a],g=(r.bpToPx({refName:f.refName,coord:t.min,regionNumber:a})?.offsetPx??0)-u,{reversed:h}=f,p=t.length/c,m=h?g-p:g,y=n*s,b=$o(t),x=i.alpha(l.palette.background.paper,.6);b>1&&wo(e,m,y,p,b*s,x),vo.draw(e,t,n,o,a)}function zo(e,t,n,o=!1){const{apolloRowHeight:a,lgv:s,theme:r}=e,i=e.getFeatureLayoutPosition(n);if(!i)return;const{featureRow:l,layoutIndex:c,layoutRow:d}=i,{bpPerPx:u,displayedRegions:f,offsetPx:g}=s,h=f[c],{refName:p,reversed:m}=h,{length:y,max:b,min:x}=n,S=(s.bpToPx({refName:p,coord:m?b:x,regionNumber:c})?.offsetPx??0)-g,w=(d+l)*a,C=y/u;t.fillStyle=o?r.palette.action.disabled:r.palette.action.focus,t.fillRect(S,w,C,a*$o(n))}const{drawDragPreview:Ho,drawTooltip:Vo,getContextMenuItemsForFeature:Jo,onMouseDown:Xo,onMouseLeave:Ko,onMouseMove:Zo,onMouseUp:Yo}=vo,Qo={draw:function(e,t,n,o,a){const{selectedFeature:s}=o;for(let s=0;s<$o(t);s++)Go(e,t,n+s,n,o,a);s&&Ne(t,s)&&zo(o,e,s)},drawDragPreview:Ho,drawHover:function(e,t){const{hoveredFeature:n}=e;n&&zo(e,t,n.feature)},drawTooltip:Vo,getContextMenuItemsForFeature:Jo,getContextMenuItems:function(e,t){const{hoveredFeature:n,session:o}=e,a=[];if(!n)return a;const{featureTypeOntology:s}=o.apolloDataStore.ontologyManager;if(!s)throw new Error("featureTypeOntology is undefined");const r=vo.getContextMenuItems(e,t);if(a.push({label:n.feature.type,subMenu:r}),Pe(t)){const{bp:o,feature:s}=t;for(const t of Se(s,o)){if(t._id===n.feature._id)continue;const o=vo.getContextMenuItemsForFeature(e,t);a.push({label:t.type,subMenu:o})}}return a},getFeatureFromLayout:function(e,t,n){return Uo(e)[n].find((e=>t>=e.min&&t<=e.max))},getRowCount:$o,getRowForFeature:function(e,t){const n=Uo(e);for(const[e,o]of n.entries())if(o.some((e=>e._id===t._id)))return e},onMouseDown:Xo,onMouseLeave:Ko,onMouseMove:Zo,onMouseUp:Yo},ea=N.observer((function({featureTypes:e,handleClose:t,onUpdate:n,session:o}){const[a,s]=v.useState(""),[r,l]=v.useState(e);return m.jsx(Ue,{open:!0,maxWidth:!1,"data-testid":"filter-features-dialog",title:"Filter features by type",handleClose:t,children:m.jsxs(i.DialogContent,{children:[m.jsx(i.DialogContentText,{children:"Select the feature types you want to display in the apollo track"}),m.jsxs(i.Grid,{container:!0,spacing:2,children:[m.jsx(i.Grid,{size:8,children:m.jsx(St,{session:o,ontologyName:"Sequence Ontology",style:{width:"100%"},value:a,filterTerms:yt,renderInput:e=>m.jsx(i.TextField,{...e,label:"Feature type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{t&&s(t)}})}),m.jsx(i.Grid,{size:4,children:m.jsx(i.Button,{variant:"contained",onClick:()=>{if(a){if(r.includes(a))return;n([...r,a]),l([...r,a])}},disabled:!a,style:{marginTop:9},size:"medium",children:"Add"})})]}),r.length>0&&m.jsxs("div",{children:[m.jsx("hr",{}),m.jsxs("div",{style:{width:300},children:[m.jsx(i.DialogContentText,{children:"Selected feature types:"}),m.jsx(i.Box,{sx:{display:"flex",flexWrap:"wrap",gap:.5},children:r.map((e=>m.jsx(i.Chip,{label:e,onDelete:()=>{(e=>{const t=r.filter((t=>t!==e));n(t),l(t)})(e)}},e)))})]})]})]})})})),ta=N.observer((function({model:e,handleClose:t}){const[n,o]=v.useState(`${e.zoomThresholdSetting}`);return m.jsx(D.Dialog,{open:!0,onClose:t,title:"Edit zoom threshold setting",children:m.jsxs(i.DialogContent,{children:[m.jsx(i.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."}),m.jsx(i.TextField,{label:"Threshold value (bpPerPx)",value:n,onChange:e=>{o(e.target.value)}}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",onClick:()=>{e.setZoomThresholdSetting({zoomThreshold:+n}),t()},children:"Submit"}),m.jsx(i.Button,{variant:"contained",color:"secondary",onClick:()=>{t()},children:"Cancel"})]})]})})})),na=y.makeStyles()((e=>({canvasContainer:{position:"relative",left:0},canvas:{position:"absolute",left:0},center:{display:"flex",justifyContent:"center"},ellipses:{textOverflow:"ellipsis",overflow:"hidden"},avatar:{position:"static",height:"100%",width:"100%",overflow:"visible",color:e.palette.warning.light,backgroundColor:e.palette.warning.contrastText},box:{position:"absolute",overflow:"visible"},badge:{display:"inline-block"},loading:{position:"absolute",right:e.spacing(3),zIndex:10,pointerEvents:"none",textAlign:"right"},locked:{position:"absolute",right:e.spacing(3),top:e.spacing(6),zIndex:1,pointerEvents:"none",textAlign:"right"}})));function oa(e,t,n){const o=new Map;for(const t of e)(o.get(t.message)??o.set(t.message,[]).get(t.message)).push(t);const a=[];for(const[e,n]of o.entries()){if(0===n.length)continue;n.sort(((e,t)=>e.start-t.start));let o=[n[0]],s=n[0].start,r=n[0].start+t;const i=()=>{const t=o.map((e=>e.start)).sort(((e,t)=>e-t)),n=Math.floor(t.length/2),i=o[0].ids;a.push({_id:o[0]._id,message:e,start:t.length%2?t[n]:(t[n-1]+t[n])/2,count:o.length,members:[...o],range:{min:s,max:r},featureIds:i})};for(let e=1;e<n.length;e++){const a=n[e],l=a.start,c=l+t;l<=r?(o.push(a),l<s&&(s=l),c>r&&(r=c)):(i(),o=[a],s=l,r=c)}i()}return a.sort(((e,t)=>e.message.localeCompare(t.message)||e.start-t.start)),a}function aa(e,t,n){return"M"===e?t.palette.startCodon:"*"===e?n?t.palette.text.primary:t.palette.stopCodon:void 0}function sa(e,t){const n=e.toUpperCase();return"A"===n||"C"===n||"G"===n||"T"===n?t.palette.bases[n].main.toString():"lightgray"}function ra(e,t,n){const o=[];for(let a=e;a<e+t;a++){const e=n.get(a);e&&o.push(e)}return o}function ia(e,t){for(const n of e)for(const[e,o]of n)if(s.doesIntersect2(t.min,t.max,e,o)||s.doesIntersect2(e,o,t.min,t.max))return!1;return!0}function la(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return a.BaseDisplay.named("BaseLinearApolloDisplay").props({type:l.types.literal("LinearApolloDisplay"),configuration:o.ConfigurationReference(t),graphical:!0,table:!1,showCheckResults:!0,zoomThreshold:200,heightPreConfig:l.types.maybe(l.types.refinement("displayHeight",l.types.number,(e=>e>=20))),filteredFeatureTypes:l.types.array(l.types.string),loadingState:!1}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...ne.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return s.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?400:e.graphical?100:200},get loading(){return e.loadingState},get zoomThresholdSetting(){return e.zoomThreshold??o.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return s.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:o})=>({assemblyName:e,refName:n,start:Math.round(o),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=l.getRoot(e),{assemblyName:a}=t,{assemblyManager:s}=e.session,r=s.get(a);if(!r)throw new Error(`No assembly found with name ${a}`);const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);return n.find((e=>o.getConf(e,"internetAccountId")===i))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,o=n.get(t);if(!o)throw new Error(`Could not find assembly named ${t}`);return o.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=l.cast(t)},setLoading(t){e.loadingState=t},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:o,table:a,showCheckResults:r}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:o&&!a,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:a&&!o,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:a&&o,onClick:()=>{e.showGraphicalAndTable()}},{label:"Check Results",type:"checkbox",checked:r,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{s.getSession(e).queueDialog((t=>[ta,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((o=>[ea,{session:n,handleClose:()=>{o()},featureTypes:l.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[o]=e.regions,{assemblyName:a,refName:s}=o,r=e.getAssemblyId(a);if(!r)return;const{session:i}=e,{changeManager:l}=i.apolloDataStore,[c,d]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],u=i.addWidget(c,d,{feature:t,assembly:r,refName:s,changeManager:l});i.showWidget(u)},afterAttach(){l.addDisposer(e,c.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.setLoading(!0),e.session.apolloDataStore.loadFeatures(e.regions).then((()=>{setTimeout((()=>{e.setLoading(!1)}),1e3)})))}),{name:"LinearApolloDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloDisplayLayouts").props({cleanupBoundary:2e5}).volatile((()=>({seenFeatures:c.observable.map()}))).views((e=>({getAnnotationFeatureById:t=>e.seenFeatures.get(t),getGlyph(e){const{topLevelFeature:t}=e;return t.looksLikeGene?Bo:t.children?.size?Qo:vo}}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({get featureLayouts(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map((n=>{const o=t.get(n.assemblyName),a=new Map,r=new Map,{end:i,refName:c,start:d}=n;for(const[t,n]of e.seenFeatures.entries()){if(!l.isAlive(n)){e.deleteSeenFeature(t);continue}if(c!==o?.getCanonicalRefName(n.refSeq)||!s.doesIntersect2(d,i,n.min,n.max)||e.filteredFeatureTypes.length>0&&!e.filteredFeatureTypes.includes(n.type))continue;const{featureTypeOntology:u}=e.session.apolloDataStore.ontologyManager;if(!u)throw new Error("featureTypeOntology is undefined");const f=e.getGlyph(n).getRowCount(n,u,e.lgv.bpPerPx);let g=0,h=!1;for(;!h;){let e=ra(g,f,r);if(e.length<f){for(let t=0;t<f-e.length;t++){const e=r.size;r.set(e,[]),a.set(e,[])}e=ra(g,f,r)}if(ia(e,n)){for(let e=g;e<g+f;e++){r.get(e)?.push([n.min,n.max]);const t=a.get(e);t?.push([e-g,n._id])}h=!0}else g+=1}}return a}))},getFeatureLayoutPosition(t){const{featureLayouts:n}=this,{featureTypeOntology:o}=e.session.apolloDataStore.ontologyManager;for(const[a,s]of n.entries())for(const[n,r]of s)for(const[s,i]of r){if(0!==s)continue;const r=e.getAnnotationFeatureById(i);if(r){if(t._id===r._id)return{layoutIndex:a,layoutRow:n,featureRow:s};if(r.hasDescendant(t._id)){if(!o)throw new Error("featureTypeOntology is undefined");const s=e.getGlyph(r).getRowForFeature(r,t,o);if(void 0!==s)return{layoutIndex:a,layoutRow:n,featureRow:s}}}}}}))).views((e=>({get highestRow(){return Math.max(0,...e.featureLayouts.map((e=>Math.max(...e.keys()))))}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered()){for(const[t,n]of e.seenFeatures.entries()){let o=!1;for(const t of e.regions)if(s.doesIntersect2(t.start-e.cleanupBoundary,t.end+e.cleanupBoundary,n.min,n.max)){o=!0;break}o||e.deleteSeenFeature(t)}for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),o=n?.getByRefName(t.refName),a=o?.features;if(a)for(const[,n]of a)s.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}}),{name:"LinearApolloDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,lastRowTooltipBufferHeight:40,isShown:!0,filteredTranscripts:l.types.array(l.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:i.createTheme()}))).views((e=>({get featuresHeight(){return(e.highestRow+1)*e.apolloRowHeight+e.lastRowTooltipBufferHeight}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);for(const n of e.session.collaborators){const{locations:o}=n;if(0===o.length)continue;let a=0;for(const s of e.lgv.displayedRegions){for(const r of o){if(r.refSeq!==s.refName)continue;const{end:o,refSeq:i,start:l}=r,c=e.lgv.bpToPx({refName:i,coord:l,regionNumber:a});if(!c)continue;const d=c.offsetPx-e.lgv.offsetPx,u=(o-l)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(d,1,u,100),t.fillStyle="black",t.fillText(n.name,d+1,11,u-2)}a++}}}}),{name:"LinearApolloDisplayRenderCollaborators"})),l.addDisposer(e,c.autorun((()=>{const{canvas:t,featureLayouts:n,featuresHeight:o,lgv:a}=e;if(!a.initialized||e.regionCannotBeRendered())return;const{displayedRegions:r,dynamicBlocks:i}=a,l=t?.getContext("2d");if(l){l.clearRect(0,0,i.totalWidthPx,o);for(const[t,o]of n.entries()){const n=r[t];for(const[a,r]of o.entries())for(const[o,i]of r){const r=e.getAnnotationFeatureById(i);o>0||!r||s.doesIntersect2(n.start,n.end,r.min,r.max)&&e.getGlyph(r).draw(l,r,a,e,t)}}}}),{name:"LinearApolloDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition(t){const n=Oe(t,e.lgv),{bp:o,regionNumber:a,y:s}=n,r=Math.floor(s/e.apolloRowHeight),i=e.featureLayouts[a].get(r);if(!i)return n;const l=i.find((t=>{const n=e.getAnnotationFeatureById(t[1]);return n&&o>=n.min&&o<=n.max}));if(!l)return n;const[c,d]=l,u=e.getAnnotationFeatureById(d);if(!u)return n;const f=e.getGlyph(u),{featureTypeOntology:g}=e.session.apolloDataStore.ontologyManager;if(!g)throw new Error("featureTypeOntology is undefined");const h=f.getFeatureFromLayout(u,o,c,g);return h?{...n,feature:h}:n}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(e){}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const{hoveredFeature:n}=e;if(!n)return[];const o=e.getMousePosition(t),{topLevelFeature:a}=n.feature,s=e.getGlyph(a);return Pe(o)?s.getContextMenuItems(e,o):[]}}))).actions((e=>({startDrag(t,n,o,a=!1){e.apolloDragging={start:t,current:t,feature:n,edge:o,shrinkParent:a}},endDrag(){if(!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:n,edge:o,feature:a,start:s,shrinkParent:r}=e.apolloDragging;if(Math.abs(n.x-s.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:i}=e.lgv,l=e.getAssemblyId(i[s.regionNumber].assemblyName),c=qe(a,n.bp,o,r),d="max"===o?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:l}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:l});e.changeManager.submit(d),e.setDragging(),e.setCursor()}}))).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t);Pe(n)&&e.getGlyph(n.feature).onMouseDown(e,n,t)},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);Pe(n)?e.getGlyph(n.feature).onMouseMove(e,n,t):(e.setHoveredFeature(),e.setCursor())},onMouseLeave(t){e.setDragging(),e.setHoveredFeature();const n=e.getMousePosition(t);Pe(n)&&e.getGlyph(n.feature).onMouseLeave(e,n,t)},onMouseUp(t){const n=e.getMousePosition(t);Pe(n)?e.getGlyph(n.feature).onMouseUp(e,n,t):e.setSelectedFeature(),e.apolloDragging&&e.endDrag()}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.overlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);const{apolloDragging:n,hoveredFeature:o}=e;if(!o)return;const a=e.getGlyph(o.feature);a.drawHover(e,t),a.drawTooltip(e,t),n&&e.getGlyph(n.feature.topLevelFeature).drawDragPreview(e,t)}),{name:"LinearApolloDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:l.types.optional(xo,{})}).named("LinearApolloDisplay")}const ca=o.ConfigurationSchema("LinearApolloReferenceSequenceDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0});function da(e,t,n){const o=t<=1?[2,1,0,7,6,5]:[2,1,0,5,4,3];n&&o.reverse(),o.unshift(0);const a=o.at(e);if(void 0===a)throw new Error("could not find row");return a}function ua(e,t,n,o){return o.offsetPx-n+(o.reversed?o.end-e.max:e.min-o.start)/t}function fa(e,t,n,o,a,s,r=!1){e.fillStyle=r?s.palette.action.disabled:s.palette.action.focus,e.fillRect(t,n,o,a),e.strokeStyle=r?s.palette.text.secondary:s.palette.text.primary,e.strokeStyle=s.palette.text.primary,e.strokeRect(t,n,o,a)}function ga(e,t,n,o,a,s,r,i=!1){const l=function(e,t,n){if(!(t>1||void 0===e))return n?1===e?4:3:1===e?3:4}(t.strand,n,s.reversed);l&&fa(e,ua(t,n,o,s),l*a,t.length/n,a,r,i)}function ha(e,t,n,o,a,r,i,l=!1){const c=t.parent;if(!c)return;const d=c.cdsLocations.find((e=>{const n=e.at(1===t.strand?0:-1)?.min,o=e.at(1===t.strand?-1:0)?.max;return t.min===n&&t.max===o}));if(d)for(const c of d){const d=da(s.getFrame(c.min,c.max,t.strand??1,c.phase),n,r.reversed);fa(e,ua(c,n,o,r),d*a,(c.max-c.min)/n,a,i,l)}}function pa(e,t,n,o,a,s){e.strokeStyle=s,e.lineWidth=1,e.strokeRect(t+.5,n+.5,o-1,a-1)}function ma(e,t,n,o,a){const s=Math.min(o,10);e.fillStyle="#000",e.font=`${s}px`;const r=e.measureText(a).width,i=Math.round(t+(o-r)/2);e.fillText(a,i,n+10)}function ya(e,t,n,o,a,s,r,i){const l=t<=1?[3,2,1,0,0,-1,-2,-3]:[3,2,1,-1,-2,-3];i&&l.reverse();for(const[t,i]of l.entries()){const l=n.palette.framesCDS.at(i)?.main;if(!l)continue;const c=t*r;e.fillStyle=o?n.palette.background.default:l,e.fillRect(a,c,s,r),o&&pa(e,a,c,s,r,n.palette.grey[200])}}function ba(e,t,n,o,a,r,i){if(1/a<1)return;const l=Math.round(o+n/a),c=Math.round(o+(n+1)/a)-l,d=[-1,1];for(const n of d){const o=(1===n?3:4)*r,d=1===n?t:s.revcom(t);e.fillStyle=sa(d,i),e.fillRect(l,o,c,r),1/a>=12&&(pa(e,l,o,c,r,i.palette.text.disabled),ma(e,l,o,c,d))}}function xa(e,t,n,o,a,r,i,l,c,d,u){const f=(i<=1?[0,2,1,0,7,6,5]:[0,2,1,0,5,4,3]).map((e=>e*c)),g=[-1,1];for(const h of g){const g=s.getFrame(l,l+3,h,0),p=f.at(g);if(void 0===p)continue;const m=Math.round(n+o/i),y=Math.round(n+(o+3)/i)-m,b=1===h?t:s.revcom(t),x=s.defaultCodonTable[b],S=aa(x,a,r);S&&(u&&"*"==x||d&&"*"!=x)&&(e.fillStyle=S,e.fillRect(m,p,y,c)),1/i>=4&&(pa(e,m,p,y,c,a.palette.text.disabled),ma(e,m,p,y,x))}}function Sa(e,t){return function(e,t){const n=function(e,t){return a.BaseDisplay.named("BaseLinearApolloReferenceSequenceDisplay").props({type:l.types.literal("LinearApolloReferenceSequenceDisplay"),configuration:o.ConfigurationReference(t),showStartCodons:!1,showStopCodons:!0,highContrast:!1,heightPreConfig:l.types.maybe(l.types.refinement("displayHeight",l.types.number,(e=>e>=20))),sequenceRowHeight:15}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...ne.getParentRenderProps(e),config:t.renderer})}})).views((e=>({get lgv(){return s.getContainingView(e)}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return s.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:o})=>({assemblyName:e,refName:n,start:Math.round(o),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=3)return"Zoom in to see sequence"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=l.getRoot(e),{assemblyName:a}=t,{assemblyManager:s}=e.session,r=s.get(a);if(!r)throw new Error(`No assembly found with name ${a}`);const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);return n.find((e=>o.getConf(e,"internetAccountId")===i))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,o=n.get(t);if(!o)throw new Error(`Could not find assembly named ${t}`);return o.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature},get height(){const{sequenceRowHeight:t}=e;return e.lgv.bpPerPx<=1?8*t:6*t}}))).volatile((()=>({scrollTop:0}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},toggleShowStartCodons(){e.showStartCodons=!e.showStartCodons},toggleShowStopCodons(){e.showStopCodons=!e.showStopCodons},toggleHighContrast(){e.highContrast=!e.highContrast}}))).views((e=>{const{trackMenuItems:t}=e;return{trackMenuItems(){const{showStartCodons:n,showStopCodons:o,highContrast:a}=e;return[...t(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show start codons",type:"checkbox",checked:n,onClick:()=>{e.toggleShowStartCodons()}},{label:"Show stop codons",type:"checkbox",checked:o,onClick:()=>{e.toggleShowStopCodons()}},{label:"Use high contrast colors",type:"checkbox",checked:a,onClick:()=>{e.toggleHighContrast()}}]}]}}})).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&e.lgv.bpPerPx<=3&&e.session.apolloDataStore.loadRefSeq(e.regions)}),{name:"LinearApolloReferenceSequenceDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloReferenceSequenceDisplayRendering").volatile((()=>({seqTrackCanvas:null,seqTrackOverlayCanvas:null,theme:i.createTheme()}))).actions((e=>({setSeqTrackCanvas(t){e.seqTrackCanvas=t},setSeqTrackOverlayCanvas(t){e.seqTrackOverlayCanvas=t},setTheme(t){e.theme=t},afterAttach(){l.addDisposer(e,c.autorun((()=>{const{lgv:t,seqTrackCanvas:n,theme:o,highContrast:a,showStartCodons:r,showStopCodons:i,sequenceRowHeight:l,session:c}=e;if(!t.initialized||e.regionCannotBeRendered()||!n)return;if(3/t.bpPerPx<1)return;const{bpPerPx:d,offsetPx:u,dynamicBlocks:f}=t;!function(e,t,n,o,a,r,i,l,c,d){const u=e.getContext("2d");if(!u)return;u.clearRect(0,0,e.width,e.height);const{apolloDataStore:f}=d;for(const e of a.contentBlocks){const a=e.offsetPx-o;ya(u,n,t,r,a,e.widthPx,c,e.reversed);const d=f.assemblies.get(e.assemblyName),g=d?.getByRefName(e.refName),h=Math.floor(e.start),p=Math.ceil(e.end);let m=g?.getSequence(h,p);if(!m)return;m=m.toUpperCase(),e.reversed&&(m=s.revcom(m));const y=a-(e.reversed?p-e.end:e.start-h)/n;for(let o=0;o<m.length;o++){const a=e.reversed?p-o:h+o,s=m.slice(o,o+3);ba(u,m[o],o,y,n,c,t),3===s.length&&xa(u,s,y,o,t,r,n,a,c,i,l)}}}(n,o,d,u,f,a,r,i,l,c)}),{name:"LinearApolloReferenceSequenceDisplayRenderSequence"})),l.addDisposer(e,c.autorun((()=>{const{seqTrackOverlayCanvas:t}=e;if(!e.lgv.initialized||e.regionCannotBeRendered()||!t)return;const n=t.getContext("2d");if(!n)return;n.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.height);const{hoveredFeature:o,selectedFeature:a,lgv:s,sequenceRowHeight:r,session:i,theme:l}=e;if(!o&&!a)return;const{bpPerPx:c,dynamicBlocks:d,offsetPx:u}=s;!function(e,t,n,o,a,s,r,i,l,c){const{featureTypeOntology:d}=r.apolloDataStore.ontologyManager;if(!d)throw new Error("featureTypeOntology is undefined");for(const r of c.contentBlocks){t.save(),t.beginPath(),t.rect(r.offsetPx-l,0,r.widthPx,e.height),t.clip();for(const e of[o,n?.feature].filter((e=>void 0!==e)))d.isTypeOf(e.type,"CDS")?ha(t,e,i,l,a,r,s,e._id===o?._id):ga(t,e,i,l,a,r,s,e._id===o?._id);t.restore()}}(t,n,o,a,r,l,i,c,u,d)}),{name:"LinearApolloReferenceSequenceDisplayRenderSequenceHighlight"}))}})))}(0,t).named("LinearApolloReferenceSequenceDisplay")}const wa=N.observer((function(e){const t=i.useTheme(),{model:n}=e,{height:o,regionCannotBeRendered:a,setSeqTrackCanvas:r,setSeqTrackOverlayCanvas:l,setTheme:c}=n,{classes:d}=na();v.useEffect((()=>{c(t)}),[t,c]);const u=s.getContainingView(n),f=a();return f?m.jsx(i.Alert,{severity:"warning",classes:{message:d.ellipses},slotProps:{root:{className:d.center}},children:m.jsx(i.Tooltip,{title:f,children:m.jsx("div",{children:f})})}):m.jsx(m.Fragment,{children:3/u.bpPerPx>=1?m.jsxs("div",{className:d.canvasContainer,style:{width:u.dynamicBlocks.totalWidthPx,height:o},children:[m.jsx("canvas",{ref:async e=>{await Promise.resolve(),r(e)},width:u.dynamicBlocks.totalWidthPx,height:o,className:d.canvas,"data-testid":"seqTrackCanvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),l(e)},width:u.dynamicBlocks.totalWidthPx,height:o,className:d.canvas,"data-testid":"seqTrackOverlayCanvas"})]}):null})})),Ca=o.ConfigurationSchema("LinearApolloSixFrameDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),va=N.observer((function({sourceFeature:e,filteredTranscripts:t,handleClose:n,onUpdate:o}){const a=[];if(e.children)for(const[,t]of e.children){const e=t.attributes.get("gff_id")?.toString();e&&a.push(e)}const[s,r]=v.useState(t);return m.jsx(Ue,{open:!0,maxWidth:!1,"data-testid":"filter-transcripts-dialog",title:"Filter transcripts by ID",handleClose:n,children:m.jsxs(i.DialogContent,{children:[m.jsx(i.DialogContentText,{children:"Select the alternate transcripts you want to display in the apollo track"}),m.jsx(i.Grid,{container:!0,spacing:2,children:m.jsx(i.Grid,{size:8,children:m.jsx(i.FormGroup,{children:a.map((e=>m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:!s.includes(e),onChange:()=>{(e=>{const t=s.includes(e)?s.filter((t=>t!==e)):[...s,e];o(t),r(t)})(e)},slotProps:{input:{"aria-label":"controlled"}}}),label:e})))})})})]})})}));let ja=null,Ta=null,Aa=null,Fa=null;const Da=globalThis.document.createElement("canvas");if(Da?.getContext)for(const e of["forward","backward"])for(const t of["light","dark"]){const n=document.createElement("canvas"),o=10;n.width=n.height=o;const a=n.getContext("2d");if(a){const s="light"===t?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",r="light"===t?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",i="forward"===e?a.createLinearGradient(0,o,o,0):a.createLinearGradient(0,0,o,o);i.addColorStop(0,s),i.addColorStop(.25,s),i.addColorStop(.25,r),i.addColorStop(.5,r),i.addColorStop(.5,s),i.addColorStop(.75,s),i.addColorStop(.75,r),i.addColorStop(1,r),a.fillStyle=i,a.fillRect(0,0,10,10),"forward"===e?"light"===t?ja=a.createPattern(n,"repeat"):Aa=a.createPattern(n,"repeat"):"light"===t?Ta=a.createPattern(n,"repeat"):Fa=a.createPattern(n,"repeat")}}function ka(e,t){for(const n of e)if(q(n,t))return!0;return!1}function Na(e,t,n){const{filteredTranscripts:o,session:a}=n,{apolloDataStore:r}=a,{featureTypeOntology:i}=r.ontologyManager;if(!i)throw new Error("featureTypeOntology is undefined");const l=i.isTypeOf(t.type,"transcript"),c=t.attributes.get("gff_id")?.toString();if(c&&o.includes(c))return;const{bp:d,refName:u,regionNumber:f,x:g}=e,{lgv:h}=n;if(l){const e=t;if(!e.children)return;const n=[],o=[];for(const t of e.children.values()){const e=i.isTypeOf(t.type,"exon"),a=i.isTypeOf(t.type,"CDS");e?n.push(t):a&&o.push(t)}const a=n.find((e=>{const[t,n]=s.intersection2(d,d+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(a){const e=Fe(a,u,f,h);if(e){const t=De(a,g,e);if(t)return t}}for(const t of e.cdsLocations)for(const e of t){const t=Fe(e,u,f,h);if(t){const e=o.find((e=>{const[t,n]=s.intersection2(d,d+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(e){const n=De(e,g,t);if(n)return n}}}}}const Ra={draw:function(e,t,n,o,a){const{apolloRowHeight:r,lgv:l,session:c,theme:d,highestRow:u,filteredTranscripts:f,selectedFeature:g,showFeatureLabels:h}=o,{bpPerPx:p,displayedRegions:m,offsetPx:y}=l,b=m[a],{refName:x,reversed:S}=b,w=r,C=w,v=w,j=w,T=h?2:1,A=d.palette.text.primary,{attributes:F,children:D,min:k,strand:N}=t;if(!D)return;const{apolloDataStore:R}=c,{featureTypeOntology:I}=R.ontologyManager;if(!I)throw new Error("featureTypeOntology is undefined");const M=[],L=(l.bpToPx({refName:x,coord:k,regionNumber:a})?.offsetPx??0)-y,E=t.length/p,q=S?L-E:L,P=(1==N?3:4)*T*w;e.fillStyle=d.palette.text.primary,e.fillRect(q,P,E,j),e.fillStyle=ke(t,g)?i.alpha("rgb(0,0,0)",.7):i.alpha(d.palette.background.paper,.7),e.fillRect(q+1,P+1,E-2,j-2);const O=ke(t,g),_={x:q,y:P,h:j,text:F.get("gff_id")?.toString(),color:A,isSelected:O};O?M.unshift(_):M.push(_);const B="dark"===d.palette.mode?Aa:ja,U="dark"===d.palette.mode?Fa:Ta,$=S?-1:1;let G=null,W=null;N&&([G,W]=N*$==1?[B,U]:[U,B]),G&&W&&(e.fillStyle=G,e.fillRect(q+1,P+1,E-2,(j-2)/2),e.fillStyle=W,e.fillRect(q+1,P+(j-2)/2,E-2,(j-2)/2));const z=new Set;for(const[,t]of D){if(!I.isTypeOf(t.type,"transcript")&&!I.isTypeOf(t.type,"pseudogenic_transcript"))continue;const{children:n,cdsLocations:o}=t;if(!n)continue;const r=t.attributes.get("gff_id")?.toString();if(r&&f.includes(r))continue;for(const[,t]of n){if(!I.isTypeOf(t.type,"exon"))continue;const n=(l.bpToPx({refName:x,coord:t.min,regionNumber:a})?.offsetPx??0)-y,o=t.length/p,s=S?n-o:n,r=P+(j-C)/2,c=ke(t,g);if(e.fillStyle=d.palette.text.primary,e.fillRect(s,r,o,C),o>2){e.clearRect(s+1,r+1,o-2,C-2),e.fillStyle=c?"rgb(0,0,0)":i.alpha("#f5f500",.6),e.fillRect(s+1,r+1,o-2,C-2),G&&W&&(e.fillStyle=G,e.fillRect(s+1,r+1,o-2,(C-2)/2),e.fillStyle=W,e.fillRect(s+1,r+1+(C-2)/2,o-2,(C-2)/2));const n={x:s,y:r,h:C,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(n):M.push(n)}}const c=ke(t,g?.parent);let m=0,b=0;for(const n of o){let o=0,r=0,i=1;for(const f of n.sort(((e,t)=>e.max-t.max)))if(g&&c&&I.isTypeOf(g.type,"CDS")||!ka(z,f)){const n=(f.max-f.min)/p,C=(l.bpToPx({refName:x,coord:f.min,regionNumber:a})?.offsetPx??0)-y;m=S?C-n:C,e.fillStyle=d.palette.text.primary;const j=s.getFrame(f.min,f.max,t.strand??1,f.phase),A=(h?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).at(j);if(void 0===A)continue;if(b=A*w,e.fillRect(m,b,n,v),i>1){const t=[(m-r)/2+r,Math.max(j<0?w*T*u+1:1,Math.min(o,b)-w/2)];e.strokeStyle="rgb(0, 128, 128)",e.beginPath(),e.moveTo(r,o),e.lineTo(...t),e.stroke(),e.moveTo(...t),e.lineTo(m,b+w/2),e.stroke()}if(r=m+n,o=b+w/2,i+=1,n>2){e.clearRect(m+1,b+1,n-2,v-2);const t=d.palette.framesCDS.at(j)?.main,o=t??"rgb(171,71,188)";e.fillStyle=o,e.fillStyle=g&&c&&I.isTypeOf(g.type,"CDS")?"rgb(0,0,0)":o,e.fillRect(m+1,b+1,n-2,v-2),G&&W&&(e.fillStyle=G,e.fillRect(m+1,b+1,n-2,(v-2)/2),e.fillStyle=W,e.fillRect(m+1,b+(v-2)/2,n-2,(v-2)/2))}z.add(f)}}const F={x:m,y:b,h:v,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(F):M.push(F)}h&&function(e,t,n="10px sans-serif"){for(let o=t.length-1;o>=0;--o){const a=t[o];e.fillStyle=a.color;const r=a.x+1,i=a.y+a.h,l=s.measureText(a.text,10);a.isSelected&&(e.font="bold ".concat(n)),a.text&&(e.clearRect(r-5,i,l+10,a.h),e.fillText(a.text,r,i+11,l),e.font=n)}}(e,M)},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:o,lgv:a,theme:s}=e,{bpPerPx:r,displayedRegions:l,offsetPx:c}=a;if(!n)return;const{current:d,edge:u,feature:f,start:g}=n,h=Math.floor(g.y/o),p=l[g.regionNumber],m=(p.reversed?p.end-f[u]:f[u]-p.start)/r-c,y=Math.min(d.x,m),b=h*o,x=Math.abs(d.x-m),S=1*o;t.strokeStyle=s.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,x,S),t.fillStyle=i.alpha(s.palette.info.main,.2),t.fillRect(y,b,x,S)},drawHover:function(e,t){const{hoveredFeature:n,apolloRowHeight:o,filteredTranscripts:a,lgv:r,highestRow:i,session:l,showFeatureLabels:c}=e;if(!n)return;const{feature:d}=n,{apolloDataStore:u}=l,{featureTypeOntology:f}=u.ontologyManager;if(!f)throw new Error("featureTypeOntology is undefined");if(!f.isTypeOf(d.type,"transcript"))return;const g=d.attributes.get("gff_id")?.toString();if(g&&a.includes(g))return;const h=e.getFeatureLayoutPosition(d);if(!h)return;const{bpPerPx:p,displayedRegions:m,offsetPx:y}=r,{layoutIndex:b}=h,x=m[b],{refName:S,reversed:w}=x,C=o,v=C,j=c?2:1,{cdsLocations:T,strand:A}=d;for(const e of T){let n=0,o=0,a=1;for(const l of e.sort(((e,t)=>e.max-t.max))){const e=(l.max-l.min)/p,d=(r.bpToPx({refName:S,coord:l.min,regionNumber:b})?.offsetPx??0)-y,u=w?d-e:d,f=s.getFrame(l.min,l.max,A??1,l.phase),g=(c?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).at(f);if(void 0===g)continue;const h=g*C;if(a>1){const e=[(u-o)/2+o,Math.max(f<0?C*j*i+1:1,Math.min(n,h)-C/2)];t.strokeStyle="rgb(0, 0, 0)",t.lineWidth=2,t.beginPath(),t.moveTo(o,n),t.lineTo(...e),t.stroke(),t.moveTo(...e),t.lineTo(u,h+C/2),t.stroke()}o=u+e,n=h+C/2,a+=1,e>2&&(t.fillStyle="rgba(255,0,0,0.6)",t.fillRect(u,h,e,v))}}},drawTooltip:function(e,t){const{hoveredFeature:n,apolloRowHeight:o,filteredTranscripts:a,lgv:r,session:l,showFeatureLabels:c,theme:d}=e;if(!n)return;const{feature:u,bp:f}=n,{featureTypeOntology:g}=l.apolloDataStore.ontologyManager;if(!g)throw new Error("featureTypeOntology is undefined");if(!g.isTypeOf(u.type,"transcript"))return;const{attributes:h,strand:p,type:m}=u,y=e.getFeatureLayoutPosition(u);if(!y)return;const b=h.get("gff_id")?.toString();if(b&&a.includes(b))return;const{layoutIndex:x}=y,{bpPerPx:S,displayedRegions:w,offsetPx:C}=r,v=w[x],{refName:j,reversed:T}=v,A=o;let F,D="Loc: ";for(const e of u.cdsLocations)for(const t of e)if(f>=t.min&&f<=t.max){F=t;break}if(!F)return;const{max:k,min:N,phase:R}=F;D+=`${N+1}–${k}`;let I=(r.bpToPx({refName:j,coord:T?k:N,regionNumber:x})?.offsetPx??0)-C;const M=s.getFrame(N,k,p??1,R),L=(c?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).at(M);if(void 0===L)return;const E=L*A,q=(k-N)/S,P=`Type: ${F.type}`,O=h.get("gff_name")?.find((e=>""!==e)),_=[t.measureText(P).width,t.measureText(D).width];O&&_.push(t.measureText(`Parent Type: ${m}`).width,t.measureText(`Parent Name: ${O}`).width);const B=Math.max(..._);I=I+q+5,t.fillStyle=i.alpha(d.palette.text.primary,.7),t.fillRect(I,E,B+4,4===_.length?55:35),t.beginPath(),t.moveTo(I,E),t.lineTo(I-5,E+5),t.lineTo(I,E+10),t.fill(),t.fillStyle=d.palette.background.default;let U=E+12;t.fillText(P,I+2,U),O&&(U+=12,t.fillText(`Parent Type: ${m}`,I+2,U),U+=12,t.fillText(`Parent Name: ${O}`,I+2,U)),U+=12,t.fillText(D,I+2,U)},getContextMenuItems:function(e,t){const{apolloInternetAccount:n,hoveredFeature:o,changeManager:a,filteredTranscripts:r,regions:i,selectedFeature:c,session:d}=e,[u]=i,f=e.getAssemblyId(u.assemblyName),g=[],h="admin"===(n?n.role:"admin");if(!o)return g;const{featureTypeOntology:p}=d.apolloDataStore.ontologyManager;if(!p)throw new Error("featureTypeOntology is undefined");if(Pe(t)){const{bp:n,feature:o}=t;let i=Se(o,n);je(o,d)&&(i=Se(o,n,!0));for(const n of i){const o=n.attributes.get("gff_id")?.toString();if(o&&r.includes(o))continue;const i=Ie(e,n);if(ve(n,d)){const o=Te(n,e,t,d),r=s.getContainingView(e);if(o.upstream){const t=o.upstream;i.push({label:"Go to upstream exon",icon:Ae(n.strand,!0,r.displayedRegions.at(0)?.reversed),onClick:()=>{r.navTo(Me(t,.1,r.totalBp)),we(e,t)}})}if(o.downstream){const t=o.downstream;i.push({label:"Go to downstream exon",icon:Ae(n.strand,!1,r.displayedRegions.at(0)?.reversed),onClick:()=>{r.navTo(Me(t,.1,r.totalBp)),we(e,t)}})}i.push({label:"Merge exons",disabled:!h,onClick:()=>{d.queueDialog((t=>[Bt,{session:d,handleClose:()=>{t()},changeManager:a,sourceFeature:n,sourceAssemblyId:f,selectedFeature:c,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:!h,onClick:()=>{d.queueDialog((t=>[Yt,{session:d,handleClose:()=>{t()},changeManager:a,sourceFeature:n,sourceAssemblyId:f,selectedFeature:c,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}})}p.isTypeOf(n.type,"gene")&&i.push({label:"Filter alternate transcripts",onClick:()=>{d.queueDialog((t=>[va,{handleClose:()=>{t()},sourceFeature:n,filteredTranscripts:l.getSnapshot(r),onUpdate:t=>{e.updateFilteredTranscripts(t)}}]))}}),g.push({label:n.type,subMenu:i})}}return g},getContextMenuItemsForFeature:Ie,onMouseDown:function(e,t,n){const{feature:o}=t,a=Na(t,o,e);a&&(n.stopPropagation(),e.startDrag(t,a.feature,a.edge,!0))},onMouseLeave:function(){},onMouseMove:function(e,t){if(Pe(t)){const{feature:n,bp:o}=t;if(e.setHoveredFeature({feature:n,bp:o}),Na(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(!e.apolloDragging&&Pe(t)){const{feature:n}=t,{session:o}=e,{apolloDataStore:a}=o,{featureTypeOntology:s}=a.ontologyManager;if(e.setSelectedFeature(n),!s)throw new Error("featureTypeOntology is undefined");let r=!1;for(const[,e]of n.children??[])if(s.isTypeOf(e.type,"CDS")||s.isTypeOf(e.type,"exon")){r=!0;break}(s.isTypeOf(n.type,"transcript")||s.isTypeOf(n.type,"pseudogenic_transcript"))&&r?e.showFeatureDetailsWidget(n,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(n)}}};function Ia(e,t,n,o,a,r,i,l,c,d,u,f){const g=(d?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).map((e=>e*c)),h=[-1,1];for(const d of h){const h=s.getFrame(l,l+3,d,0),p=g.at(h);if(void 0===p)continue;const m=Math.round(n+o/i),y=0===Math.round(3/i)?1:Math.round(3/i),b=1===d?t:s.revcom(t),x=s.defaultCodonTable[b],S=aa(x,a,r);S&&(f&&"*"==x||u&&"*"!=x)&&(e.fillStyle=S,e.fillRect(m,p,y,c))}}function Ma(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return a.BaseDisplay.named("BaseLinearApolloSixFrameDisplay").props({type:l.types.literal("LinearApolloSixFrameDisplay"),configuration:o.ConfigurationReference(t),graphical:!0,table:!1,showFeatureLabels:!0,showStartCodons:!1,showStopCodons:!0,showCheckResults:!0,zoomThreshold:200,heightPreConfig:l.types.maybe(l.types.refinement("displayHeight",l.types.number,(e=>e>=20))),filteredFeatureTypes:l.types.array(l.types.string)}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...ne.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return s.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?500:e.graphical?e.showFeatureLabels?400:200:300},get zoomThresholdSetting(){return e.zoomThreshold??o.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return s.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:o})=>({assemblyName:e,refName:n,start:Math.round(o),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=l.getRoot(e),{assemblyName:a}=t,{assemblyManager:s}=e.session,r=s.get(a);if(!r)throw new Error(`No assembly found with name ${a}`);const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);return n.find((e=>o.getConf(e,"internetAccountId")===i))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,o=n.get(t);if(!o)throw new Error(`Could not find assembly named ${t}`);return o.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowFeatureLabels(){e.showFeatureLabels=!e.showFeatureLabels},toggleShowStartCodons(){e.showStartCodons=!e.showStartCodons},toggleShowStopCodons(){e.showStopCodons=!e.showStopCodons},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=l.cast(t)},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:o,table:a,showFeatureLabels:r,showStartCodons:i,showStopCodons:c,showCheckResults:d}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:o&&!a,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:a&&!o,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:a&&o,onClick:()=>{e.showGraphicalAndTable()}},{label:"Feature Labels",type:"checkbox",checked:r,onClick:()=>{e.toggleShowFeatureLabels()}},{label:"Show start codons",type:"checkbox",checked:i,onClick:()=>{e.toggleShowStartCodons()}},{label:"Show stop codons",type:"checkbox",checked:c,onClick:()=>{e.toggleShowStopCodons()}},{label:"Check Results",type:"checkbox",checked:d,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{s.getSession(e).queueDialog((t=>[ta,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((o=>[ea,{session:n,handleClose:()=>{o()},featureTypes:l.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[o]=e.regions,{assemblyName:a,refName:s}=o,r=e.getAssemblyId(a);if(!r)return;const{session:i}=e,{changeManager:l}=i.apolloDataStore,[c,d]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],u=i.addWidget(c,d,{feature:t,assembly:r,refName:s,changeManager:l});i.showWidget(u)},afterAttach(){l.addDisposer(e,c.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.session.apolloDataStore.loadFeatures(e.regions),e.lgv.bpPerPx<=e.zoomThreshold&&e.session.apolloDataStore.loadRefSeq(e.regions))}),{name:"LinearApolloSixFrameDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayLayouts").props({featuresMinMaxLimit:5e5}).volatile((()=>({seenFeatures:c.observable.map()}))).views((e=>({get featuresMinMax(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map((n=>{const o=t.get(n.assemblyName);let a,r;const{end:i,refName:l,start:c}=n;for(const[,t]of e.seenFeatures)l!==o?.getCanonicalRefName(t.refSeq)||!s.doesIntersect2(c,i,t.min,t.max)||t.length>e.featuresMinMaxLimit||(void 0===a&&({min:a}=t),void 0===r&&({max:r}=t),t.minWithChildren<a&&({min:a}=t),t.maxWithChildren>r&&({max:r}=t));if(void 0!==a&&void 0!==r)return[a,r]}))},getGlyph:e=>Ra,featureLabelSpacer:t=>e.showFeatureLabels?2*t-1:t}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({get geneTrackRowNums(){return[4,5].map((t=>e.featureLabelSpacer(t)))}}))).views((e=>({get featureLayouts(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map(((n,o)=>{const a=t.get(n.assemblyName),r=new Map;if(!e.featuresMinMax[o])return r;const{end:i,refName:c,start:d}=n;for(const[t,n]of e.seenFeatures.entries()){if(!l.isAlive(n)){e.deleteSeenFeature(t);continue}if(c!==a?.getCanonicalRefName(n.refSeq)||!s.doesIntersect2(d,i,n.min,n.max))continue;const{featureTypeOntology:o}=e.session.apolloDataStore.ontologyManager;if(!o)throw new Error("featureTypeOntology is undefined");if(n.looksLikeGene){const t=1==n.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1];r.get(t)||r.set(t,[]);const a=r.get(t);a?.push({rowNum:t,feature:n});const{children:i}=n;if(!i)continue;for(const[,t]of i)if(o.isTypeOf(t.type,"transcript")){const{cdsLocations:n,strand:a,children:i}=t;if(i)for(const[,t]of i){if(!o.isTypeOf(t.type,"exon"))continue;const n=1==t.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1],a=r.get(n);a?.push({rowNum:n,feature:t})}for(const o of n)for(const n of o){const o=s.getFrame(n.min,n.max,a??1,n.phase),i=(e.showFeatureLabels?[0,5,3,1,15,13,11]:[0,2,1,0,8,7,6]).at(o);if(!i)continue;r.get(i)||r.set(i,[]);const l=r.get(i);l?.push({rowNum:i,feature:t})}}}}return r}))},getFeatureLayoutPosition(e){const{featureLayouts:t}=this;for(const[n,o]of t.entries())for(const[,t]of o)for(const{feature:o}of t)if(e._id===o._id)return{layoutIndex:n,layoutRow:0,featureRow:0}}}))).views((e=>({get highestRow(){return 5}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered())for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),o=n?.getByRefName(t.refName),a=o?.features;if(a)for(const[,n]of a)s.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}),{name:"LinearApolloSixFrameDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloSixFrameDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,lastRowTooltipBufferHeight:120,isShown:!0,filteredTranscripts:l.types.array(l.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:i.createTheme()}))).views((e=>({get featuresHeight(){return(e.highestRow+1)*e.apolloRowHeight*(e.showFeatureLabels?2:1)+e.lastRowTooltipBufferHeight}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);for(const n of e.session.collaborators){const{locations:o}=n;if(0===o.length)continue;let a=0;for(const s of e.lgv.displayedRegions){for(const r of o){if(r.refSeq!==s.refName)continue;const{end:o,refSeq:i,start:l}=r,c=e.lgv.bpToPx({refName:i,coord:l,regionNumber:a});if(!c)continue;const d=c.offsetPx-e.lgv.offsetPx,u=(o-l)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(d,1,u,100),t.fillStyle="black",t.fillText(n.name,d+1,11,u-2)}a++}}}}),{name:"LinearApolloSixFrameDisplayRenderCollaborators"})),l.addDisposer(e,c.autorun((()=>{const{apolloRowHeight:t,canvas:n,featureLayouts:o,featuresHeight:a,lgv:r,session:i,theme:l,showFeatureLabels:c,showStartCodons:d,showStopCodons:u}=e;if(!r.initialized||e.regionCannotBeRendered())return;const{bpPerPx:f,offsetPx:g,displayedRegions:h,dynamicBlocks:p}=r,m=n?.getContext("2d");if(m){m.clearRect(0,0,p.totalWidthPx,a);for(const[t,n]of o.entries()){const o=h[t];for(const[a,r]of n.entries())for(const{feature:n}of r){if(!n.looksLikeGene)continue;if(!s.doesIntersect2(o.start,o.end,n.min,n.max))continue;const{topLevelFeature:r}=n,i=e.getGlyph(r);void 0!==i&&i.draw(m,r,a,e,t)}}if(d||u){const{apolloDataStore:e}=i;for(const n of p.contentBlocks){const o=e.assemblies.get(n.assemblyName),a=o?.getByRefName(n.refName),s=Math.floor(n.start),r=Math.ceil(n.end);let i=a?.getSequence(s,r);if(!i)break;i=i.toUpperCase();const h=Math.round(n.offsetPx-g-(n.start-s)/f);for(let e=0;e<i.length;e++){const n=s+e;Ia(m,i.slice(e,e+3),h,e,l,!0,f,n,t,c,d,u)}}}}}),{name:"LinearApolloSixFrameDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition(t){const n=Oe(t,e.lgv),{bp:o,regionNumber:a,y:r}=n,i=Math.floor(r/e.apolloRowHeight)+1,l=e.featureLayouts[a].get(i);if(!l)return n;const{featureTypeOntology:c}=e.session.apolloDataStore.ontologyManager;if(!c)throw new Error("featureTypeOntology is undefined");let d;if(e.geneTrackRowNums.includes(i)?(d=l.find((e=>"exon"==e.feature.type&&o>=e.feature.min&&o<=e.feature.max)),d||(d=l.find((e=>o>=e.feature.min&&o<=e.feature.max)))):d=l.find((t=>{const{feature:n}=t,a=n.attributes.get("gff_id")?.toString();if(!c.isTypeOf(n.type,"transcript"))return!1;for(const t of n.cdsLocations)for(const r of t){const t=s.getFrame(r.min,r.max,n.strand??1,r.phase),l=(e.showFeatureLabels?[0,5,3,1,15,13,11]:[0,2,1,0,8,7,6]).at(t);if(i===l&&o>=r.min&&o<=r.max)return void 0===a||!e.filteredTranscripts.includes(a)}return!1})),!d)return n;const{feature:u}=d;return{...n,feature:u}}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(t){e.filteredTranscripts=l.cast(t)}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const{hoveredFeature:n}=e;if(!n)return[];const o=e.getMousePosition(t),{topLevelFeature:a}=n.feature,s=e.getGlyph(a);return Pe(o)?s.getContextMenuItems(e,o):[]}}))).actions((e=>({startDrag(t,n,o,a=!1){e.apolloDragging={start:t,current:t,feature:n,edge:o,shrinkParent:a}},endDrag(){if(!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:n,edge:o,feature:a,start:s,shrinkParent:r}=e.apolloDragging;if(Math.abs(n.x-s.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:i}=e.lgv,l=e.getAssemblyId(i[s.regionNumber].assemblyName),c=qe(a,n.bp,o,r),d="max"===o?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:l}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:l});e.changeManager.submit(d),e.setDragging(),e.setCursor()}}))).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t);Pe(n)&&e.getGlyph(n.feature).onMouseDown(e,n,t)},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);Pe(n)?e.getGlyph(n.feature).onMouseMove(e,n,t):(e.setHoveredFeature(),e.setCursor())},onMouseLeave(t){e.setDragging(),e.setHoveredFeature();const n=e.getMousePosition(t);Pe(n)&&e.getGlyph(n.feature).onMouseLeave(e,n,t)},onMouseUp(t){const n=e.getMousePosition(t);Pe(n)?e.getGlyph(n.feature).onMouseUp(e,n,t):e.setSelectedFeature(),e.apolloDragging&&e.endDrag()}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.overlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);const{apolloDragging:n,hoveredFeature:o}=e;if(!o)return;const a=e.getGlyph(o.feature);a.drawHover(e,t),a.drawTooltip(e,t),n&&e.getGlyph(n.feature.topLevelFeature).drawDragPreview(e,t)}),{name:"LinearApolloSixFrameDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:l.types.optional(xo,{})}).named("LinearApolloSixFrameDisplay")}const La=o.ConfigurationSchema("ApolloPlugin",{ontologies:l.types.array(mt),featureTypeOntologyName:{description:"Name of the feature type ontology",type:"string",defaultValue:"Sequence Ontology"},hasRole:{description:"Flag used internally by jbrowse-plugin-apollo",type:"boolean",defaultValue:!1},geneBackgroundColor:{description:"Color for feature background",type:"string",defaultValue:"jexl:geneBackgroundColor(featureType)",contextVariable:["featureType"]}}),Ea=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogene")||n.isTypeOf(e.type,"pseudogenic_transcript")},qa=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"pseudogene")},Pa=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")};function Oa(e){const{attributes:t}=e,n=["gene_name","gene_id","gene_stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}const _a=e=>{const t=function(e){const{attributes:t}=e,n=["name","gff_name","transcript_name","gene_name"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e),n=function(e){const{attributes:t}=e,n=["id","gff_id","transcript_id","gene_id","gene_stable_id","stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e);return t?`${e.type} - ${t}`:n?`${e.type} - ${n}`:e.type};function Ba({annotationFeature:e,assembly:n,handleClose:o,refSeqId:a,session:s,region:r}){const c=s,{featureTypeOntology:d}=c.apolloDataStore.ontologyManager,u=v.useMemo((()=>Object.keys(e.children??{})),[e]),[f,g]=v.useState(!0),[h,p]=v.useState(u),[y,b]=v.useState(""),[x,S]=v.useState([]),[w,j]=v.useState(!1),[T,A]=v.useState(),F=c.apolloDataStore.assemblies.get(n.name),D=F?.refSeqs.get(a),k=D?.getFeatures(r.start,r.end),N=()=>{const e=[];for(const t of k??[])if(!(t.min>r.end||t.max<r.start)&&d?.isTypeOf(t.type,"gene")){const n=l.getSnapshot(t);e.push(n)}return e};v.useEffect((()=>{b("");const e=N();S(e),A(e[0])}),[h,f,r]);const R=async e=>{if(T)for(const o of Object.keys(e)){const a=e[o];if(a.strand=T.strand,a.children)for(const e of Object.keys(a.children))a.children[e].strand=T.strand;const s=new t.AddFeatureChange({parentFeatureId:T._id,changedIds:[T._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:a});await L(s,o)}},I=async o=>{const s=(new C).toHexString(),r=Math.min(...Object.values(o).map((e=>e.min))),i=Math.max(...Object.values(o).map((e=>e.max))),l=new t.AddFeatureChange({changedIds:[s],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{_id:s,refSeq:a,min:r,max:i,strand:e.strand,type:"gene",children:o,attributes:{name:[Oa(e)],gene_name:[Oa(e)]}}});await L(l,s)},M=async(e,o)=>{if(!T)return;const a=[];e!==T.min&&a.push(new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[T._id],featureId:T._id,assembly:n.name,oldStart:T.min,newStart:e})),o!==T.max&&a.push(new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[T._id],featureId:T._id,assembly:n.name,oldEnd:T.max,newEnd:o}));for(const e of a)await L(e)},L=async(e,t)=>{await c.apolloDataStore.changeManager.submit(e).then((()=>{c.apolloSetSelectedFeature(t)}))};return m.jsxs(Ue,{open:!0,title:"Create Apollo Annotation",handleClose:o,fullWidth:!0,maxWidth:"sm",children:[m.jsx(i.DialogTitle,{fontSize:15,children:"Select the feature to be copied to apollo track"}),m.jsxs(i.DialogContent,{children:[m.jsxs(i.Box,{sx:{ml:3},children:[Ea(e,c)&&m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{size:"small",checked:f,onChange:e=>{const t=e.target.checked;g(t),p(t?u:[])}}),label:`${_a(e)} (${e.min+1}..${e.max})`}),e.children&&m.jsx(i.Box,{sx:{display:"flex",flexDirection:"column",ml:3},children:Object.values(e.children).filter((e=>Pa(e,c))).map((e=>m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{size:"small",checked:h.includes(e._id),onChange:t=>{((e,t)=>{p((n=>e.target.checked?[...n,t._id]:n.filter((e=>e!==t._id))))})(t,e)}}),label:`${_a(e)} (${e.min+1}..${e.max})`},e._id)))})]}),x.length>0&&(!f&&h.length>0||f&&Pa(e,c))&&m.jsxs("div",{style:{border:"1px solid #ccc",marginTop:20,padding:10,borderRadius:5},children:[m.jsxs(i.Box,{sx:{ml:3},children:[m.jsx(i.Typography,{variant:"caption",fontSize:12,children:"Select the destination feature to copy the selected features"}),m.jsx(i.Box,{sx:{mt:1},children:m.jsx(i.Select,{labelId:"label",style:{width:"100%"},value:T?._id??"",onChange:e=>{const t=x.find((t=>t._id===e.target.value));A(t)},disabled:w,children:x.map((e=>m.jsx(i.MenuItem,{value:e._id,children:`${_a(e)} (${e.min+1}..${e.max})`},e._id)))})})]}),m.jsx(i.Box,{sx:{ml:3},children:m.jsx(i.FormGroup,{children:m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:w,onChange:e=>{j(e.target.checked)}}),label:"Create new gene"})})})]})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:0===h.length||!f&&h.length>0&&!T,onClick:async()=>{if(f){if(qa(e,c)&&(await(async()=>{let o;if(e.children&&h.length!==Object.values(e.children).length){const a={};for(const t of h)a[t]=e.children[t];o=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{...e,children:a}})}else o=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:e});await L(o,e._id)})(),s.notify("Successfully copied selected gene and transcript(s)","success")),Pa(e,c))if(T&&!w){const t={};if(t[e._id]=e,T.max<e.max||T.min>e.min){const n=Math.min(T.min,e.min),o=Math.max(T.max,e.max);await M(n,o),await R(t)}else await R(t);s.notify("Successfully copied selected transcripts to destination gene","success")}else{const t={};t[e._id]=e,await I(t),s.notify("Successfully created a new gene with selected transcripts","success")}}else{if(!e.children)return;if(T&&!w){const t={};for(const n of h)t[n]=e.children[n];const n=Math.min(...Object.values(t).map((e=>e.min))),o=Math.max(...Object.values(t).map((e=>e.max)));if(T.min>n||T.max<o){const e=Math.min(T.min,n),a=Math.max(T.max,o);await M(e,a),await R(t)}else await R(t);s.notify("Successfully copied transcript to destination gene","success")}else{const t={};for(const n of h)t[n]=e.children[n];await I(t),s.notify("Successfully created a new gene with selected transcript","success")}}o()},children:"Create"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:o,children:"Cancel"})]}),y?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:y})}):null]})}function Ua(e){if("LinearPileupDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>s.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=e.getFirstRegion(),n=s.getSession(e),{assemblyManager:o}=n,{assemblyName:a}=t,r=o.get(a);if(!r)throw new Error(`Could not find assembly named ${a}`);return r},getRefSeqId(t){const n=e.getFirstRegion(),{refName:o}=n,{refNameAliases:a}=t;if(!a)throw new Error(`Could not find aliases for ${t.name}`);const s=[...Object.entries(a)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t}))),r=s.find((e=>e.name===o))?._id;if(!r)throw new Error(`Could not find refSeqId named ${o}`);return r},getAnnotationFeature(){const t=e.contextMenuFeature,n=e.getAssembly(),o=e.getRefSeqId(n),a=t.get("start"),s=t.get("end"),r=t.get("strand"),i=t.get("name"),l=function(e){const t=/(\d+)([MIDNSHPX=])/g,n=[];let o;for(;null!==(o=t.exec(e));)n.push([o[2],Number.parseInt(o[1],10)]);return n}(t.get("CIGAR"));let c,d=a;const u=[];for(const[e,t]of l)switch(e){case"M":case"=":case"X":void 0===c&&(c=d),d+=t;break;case"N":void 0!==c&&(u.push({start:c,end:d}),c=void 0),d+=t;break;case"D":d+=t;break;case"I":case"S":case"H":case"P":break;default:throw new Error(`Unknown CIGAR operation: ${e}`)}void 0!==c&&u.push({start:c,end:d});const f={_id:C().toHexString(),refSeq:o,min:a,max:s,type:"mRNA",strand:r,attributes:{name:[i]}};if(0===u.length)return f;f.children={};for(const e of u){const t={_id:C().toHexString(),refSeq:o,min:e.start,max:e.end,type:"exon",strand:r};f.children[t._id]=t}return f}}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=s.getSession(e),o=e.getAssembly(),a=e.getFirstRegion();return e.contextMenuFeature?[...t(),{label:"Create Apollo annotation",icon:r,onClick:()=>{n.queueDialog((t=>[Ba,{session:n,handleClose:()=>{t()},annotationFeature:e.getAnnotationFeature(o),assembly:o,refSeqId:e.getRefSeqId(o),region:a}]))}}]:t()}}}));return e.stateModel=n,e}function $a(e,t){const n=e.get("subfeatures");return[{start:e.get("start")+1,end:e.get("end"),seq_id:t,source:e.get("source")??null,type:e.get("type")??null,score:e.get("score")??null,strand:e.get("strand")?1===e.get("strand")?"+":"-":null,phase:null!==e.get("phase")||void 0!==e.get("phase")?e.get("phase"):null,attributes:Wa(e),derived_features:[],child_features:n?n.map((e=>$a(e,t))):[]}]}function Ga(e,n){return t.gff3ToAnnotationFeature($a(e,n))}function Wa(e){const t={},n=new Set(["start","end","type","strand","refName","subfeatures","derived_features","phase","source","score"]);for(const[o,a]of Object.entries(e.toJSON()))n.has(o)||(t[o]=Array.isArray(a)?a.map(String):[String(a)]);return t}function za(e){if("LinearBasicDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>s.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=e.getFirstRegion(),n=s.getSession(e),{assemblyManager:o}=n,{assemblyName:a}=t,r=o.get(a);if(!r)throw new Error(`Could not find assembly named ${a}`);return r},getRefSeqId(t){const n=e.getFirstRegion(),{refName:o}=n,{refNameAliases:a}=t;if(!a)throw new Error(`Could not find aliases for ${t.name}`);const s=[...Object.entries(a)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t}))),r=s.find((e=>e.name===o))?._id;if(!r)throw new Error(`Could not find refSeqId named ${o}`);return r},getAnnotationFeature:(t,n)=>Ga(n,e.getRefSeqId(t))}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=s.getSession(e),o=e.getAssembly(),a=e.getFirstRegion(),i=e.contextMenuFeature;return i?[...t(),{label:"Create Apollo annotation",icon:r,onClick:()=>{n.queueDialog((t=>[Ba,{session:n,handleClose:()=>{t()},annotationFeature:e.getAnnotationFeature(o,i),assembly:o,refSeqId:e.getRefSeqId(o),region:a}]))}}]:t()}}}));return e.stateModel=n,e}const Ha=N.observer((function({display:e}){const{classes:t}=na(),{apolloDragging:n,apolloRowHeight:o,lgv:a,session:r,showCheckResults:l}=e,{assemblyManager:c}=r;return l?a.dynamicBlocks.contentBlocks.map((l=>{const d=a.bpPerPx*o,u=c.get(l.assemblyName);return u?oa([...r.apolloDataStore.checkResults.values()].filter((e=>u.isValidRefName(e.refSeq)&&u.getCanonicalRefName(e.refSeq)===l.refName&&s.doesIntersect2(l.start,l.end,e.start,e.end))),d).map((a=>{const s=Math.round(function(e,t,n){const{lgv:o}=e,{bpPerPx:a,offsetPx:s}=o;return n.offsetPx-s+(n.reversed?n.end-t.max:t.min-n.start)/a}(e,a.range,l)),[r]=a.featureIds;if(!r)return null;let c=0;const d=e.getFeatureLayoutPosition(r);return d&&(c=d.layoutRow+d.featureRow),m.jsx(i.Tooltip,{title:a.message,children:m.jsx(i.Box,{className:t.box,style:{top:c*o,left:s,height:o,width:o,pointerEvents:n?"none":"auto"},children:m.jsx(i.Badge,{className:t.badge,badgeContent:a.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:a.count<=1,children:m.jsx(i.Avatar,{className:t.avatar,children:m.jsx(se,{"data-testid":`ErrorIcon-${a.start}`})})})})},a._id)})):null})):null})),Va=N.observer((function(e){const t=i.useTheme(),{model:n}=e,{loading:o,contextMenuItems:a,cursor:r,featuresHeight:l,isShown:c,onMouseDown:d,onMouseLeave:u,onMouseMove:f,onMouseUp:g,regionCannotBeRendered:h,session:p,setCanvas:y,setCollaboratorCanvas:b,setOverlayCanvas:x,setTheme:S}=n,{classes:w}=na(),C=s.getContainingView(n);v.useEffect((()=>{S(t)}),[t,S]);const[j,T]=v.useState(),[A,F]=v.useState([]),k=h();return c?m.jsx(m.Fragment,{children:m.jsxs("div",{className:w.canvasContainer,style:{width:C.dynamicBlocks.totalWidthPx,height:l},onContextMenu:e=>{e.preventDefault(),A.length>0?F([]):(T([e.clientX,e.clientY]),F(a(e)))},children:[p.isLocked?m.jsx("div",{className:w.locked,"data-testid":"lock-icon",children:m.jsx(ae,{})}):null,o?m.jsx("div",{className:w.loading,children:m.jsx(i.CircularProgress,{size:"18px"})}):null,k?m.jsx(i.Alert,{severity:"warning",classes:{message:w.ellipses},slotProps:{root:{className:w.center}},children:m.jsx(i.Tooltip,{title:k,children:m.jsx("div",{children:k})})}):m.jsxs(m.Fragment,{children:[m.jsx("canvas",{ref:async e=>{await Promise.resolve(),b(e)},width:C.dynamicBlocks.totalWidthPx,height:l,className:w.canvas,"data-testid":"collaboratorCanvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),y(e)},width:C.dynamicBlocks.totalWidthPx,height:l,className:w.canvas,"data-testid":"canvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),x(e)},width:C.dynamicBlocks.totalWidthPx,height:l,onMouseMove:f,onMouseLeave:u,onMouseDown:d,onMouseUp:g,className:w.canvas,style:{cursor:r??"default"},"data-testid":"overlayCanvas"}),m.jsx(Ha,{display:n}),m.jsx(D.Menu,{open:A.length>0,onMenuItemClick:(e,t)=>{t(),F([])},onClose:()=>{F([])},slotProps:{transition:{onExit:()=>{F([])}}},anchorReference:"anchorPosition",anchorPosition:j?{top:j[1],left:j[0]}:void 0,menuItems:A})]})]})}):null})),Ja=N.observer((function({model:e,hrStyle:t={margin:0,top:0,color:"black"},idx:n=0}){const{apolloRowHeight:o,highestRow:a,showFeatureLabels:s}=e,r=s?2:1;return m.jsx("div",{style:{position:"absolute",left:0,top:o*r*(a+1)/2+n*r*o,width:"100%"},children:m.jsx("hr",{style:t})})})),Xa=N.observer((function(e,t){const n=i.useTheme(),{model:o}=e,{apolloRowHeight:a,contextMenuItems:r,cursor:l,featuresHeight:c,geneTrackRowNums:d,isShown:u,onMouseDown:f,onMouseLeave:g,onMouseMove:h,onMouseUp:p,regionCannotBeRendered:y,session:b,setCanvas:x,setCollaboratorCanvas:S,setOverlayCanvas:w,setTheme:C,showCheckResults:j,showFeatureLabels:T}=o,{classes:A}=na(),F=s.getContainingView(o);v.useEffect((()=>{C(n)}),[n,C]);const[k,N]=v.useState(),[R,I]=v.useState([]),M=y();if(!u)return null;const{assemblyManager:L}=b;return m.jsx(m.Fragment,{children:m.jsxs("div",{className:A.canvasContainer,style:{width:F.dynamicBlocks.totalWidthPx,height:c},onContextMenu:e=>{e.preventDefault(),R.length>0?I([]):(N([e.clientX,e.clientY]),I(r(e)))},children:[b.isLocked?m.jsx("div",{className:A.locked,"data-testid":"lock-icon",children:m.jsx(ae,{})}):null,M?m.jsx(i.Alert,{severity:"warning",classes:{message:A.ellipses},slotProps:{root:{className:A.center}},children:m.jsx(i.Tooltip,{title:M,children:m.jsx("div",{children:M})})}):m.jsxs(m.Fragment,{children:[m.jsx(Ja,{model:o,idx:0}),m.jsx(Ja,{model:o,hrStyle:{margin:0,top:0,color:"grey",opacity:.4},idx:1}),m.jsx(Ja,{model:o,idx:2}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),S(e)},width:F.dynamicBlocks.totalWidthPx,height:c,className:A.canvas,"data-testid":"collaboratorCanvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),x(e)},width:F.dynamicBlocks.totalWidthPx,height:c,className:A.canvas,"data-testid":"canvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),w(e)},width:F.dynamicBlocks.totalWidthPx,height:c,onMouseMove:h,onMouseLeave:g,onMouseDown:f,onMouseUp:p,className:A.canvas,style:{cursor:l??"default"},"data-testid":"overlayCanvas"}),F.displayedRegions.flatMap(((e,n)=>{const o=F.bpPerPx*a,r=L.get(e.assemblyName);return j?oa([...b.apolloDataStore.checkResults.values()].filter((t=>r?.isValidRefName(t.refSeq)&&r.getCanonicalRefName(t.refSeq)===e.refName&&s.doesIntersect2(e.start,e.end,t.start,t.end))),o).map((o=>{const r=(F.bpToPx({refName:e.refName,coord:o.start,regionNumber:n})?.offsetPx??0)-F.offsetPx,[l]=o.featureIds;if(!l||!l.parent?.looksLikeGene)return null;let c;for(const e of l.cdsLocations)for(const t of e){const e=s.getFrame(t.min,t.max,l.strand??1,t.phase),n=(T?[0,5,3,1,15,13,11]:[0,2,1,0,8,7,6]).at(e);if(n&&o.start>=t.min&&o.start<=t.max){c=n-1;break}}return void 0===c&&(c=(1==l.strand?d[0]:d[1])-1),m.jsx(i.Tooltip,{title:o.message,children:m.jsx(i.Box,{className:A.box,style:{top:c*a,left:r,height:a,width:a,pointerEvents:t?"none":"auto"},children:m.jsx(i.Badge,{className:A.badge,badgeContent:o.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:o.count<=1,children:m.jsx(i.Avatar,{className:A.avatar,children:m.jsx(se,{"data-testid":`ErrorIcon-${o.start}`})})})})},o._id)})):null})),m.jsx(D.Menu,{open:R.length>0,onMenuItemClick:(e,t)=>{t(),I([])},onClose:()=>{I([])},slotProps:{transition:{onExit:()=>{I([])}}},anchorReference:"anchorPosition",anchorPosition:k?{top:k[1],left:k[0]}:void 0,style:{zIndex:n.zIndex.tooltip},menuItems:R})]})]})})})),Ka=y.makeStyles()((e=>({shading:{background:i.alpha(e.palette.primary.main,.2),overflowX:"hidden"},details:{background:e.palette.background.paper},accordionControl:{height:12,width:"100%","&:hover":{background:e.palette.action.hover},display:"flex",alignItems:"center",justifyContent:"center"},accordionRoot:{background:e.palette.divider},resizeHandle:{width:"100%",height:4,position:"absolute",cursor:"row-resize",zIndex:100},expandIcon:{},title:{userSelect:"none"},alertContainer:{display:"flex",alignItems:"center",justifyContent:"center"}})));function Za(e,t){const{apolloRowHeight:n,selectedFeature:o}=e;if(t.current&&o){const a=e.getFeatureLayoutPosition(o);a&&t.current.scroll({top:(a.layoutRow+a.featureRow)*n,behavior:"smooth"})}}const Ya=({onResize:e})=>{const{classes:t}=Ka(),n=v.useCallback((t=>{t.stopPropagation(),t.preventDefault(),e(t.movementY)}),[e]);return m.jsx("div",{onMouseDown:e=>{e.stopPropagation();const t=new AbortController,{signal:o}=t;function a(){t.abort(new DOMException("Canceling drag event listener","AbortError"))}globalThis.addEventListener("mousemove",n,{signal:o}),globalThis.addEventListener("mouseup",a,{signal:o}),globalThis.addEventListener("mouseleave",a,{signal:o})},onClick:e=>{e.stopPropagation(),e.preventDefault()},className:t.resizeHandle})},Qa=N.observer((function({onClick:e,onResize:t,open:n,title:o}){const{classes:a}=Ka();return m.jsxs("div",{className:a.accordionRoot,children:[n&&t?m.jsx(Ya,{onResize:t}):null,m.jsxs("div",{className:a.accordionControl,onClick:e,children:[m.jsx(n?oe:z,{className:a.expandIcon}),o?m.jsx(i.Typography,{className:a.title,variant:"caption",component:"span",children:o}):null]})]})})),es=N.observer((function({model:e,...t}){const n=s.getSession(e),{ontologyManager:o}=n.apolloDataStore,{featureTypeOntology:a}=o,r=a?.dataStore,{classes:l}=Ka(),{graphical:c,height:d,isShown:u,selectedFeature:f,table:g,tabularEditor:h,toggleShown:p}=e,y=v.useRef(null);v.useEffect((()=>{Za(e,y)}),[e,f]);const b=t=>{e.setDetailsHeight(e.detailsHeight-t)};if(!r)return m.jsx("div",{className:l.alertContainer,children:m.jsx(i.Alert,{severity:"error",children:"Could not load feature type ontology."})});if(c&&g){const n=h.isShown?e.detailsHeight:0,o=u?d-e.detailsHeight-24:0;return m.jsxs("div",{style:{height:d},children:[m.jsx(Qa,{open:u,title:"Graphical",onClick:p}),m.jsx("div",{className:l.shading,ref:y,style:{height:o},children:m.jsx(Va,{model:e,...t})}),m.jsx(Qa,{title:"Table",open:h.isShown,onClick:h.togglePane,onResize:b}),m.jsx("div",{className:l.details,style:{height:n},children:m.jsx(bo,{model:e})})]})}return m.jsx("div",c?{className:l.shading,ref:y,style:{height:d},children:m.jsx(Va,{model:e,...t})}:{className:l.details,style:{height:d},children:m.jsx(bo,{model:e})})})),ts=N.observer((function({model:e,...t}){const n=s.getSession(e),{ontologyManager:o}=n.apolloDataStore,{featureTypeOntology:a}=o,r=a?.dataStore,{classes:l}=Ka(),{detailsHeight:c,graphical:d,height:u,isShown:f,selectedFeature:g,table:h,tabularEditor:p,toggleShown:y}=e,b=v.useRef(null);v.useEffect((()=>{Za(e,b)}),[e,g]);const x=t=>{e.setDetailsHeight(c-t)};if(!r)return m.jsx("div",{className:l.alertContainer,children:m.jsx(i.Alert,{severity:"error",children:"Could not load feature type ontology."})});if(d&&h){const n=p.isShown?c:0,o=f?u-c-24:0;return m.jsxs("div",{style:{height:u},children:[m.jsx(Qa,{open:f,title:"Graphical",onClick:y}),m.jsx("div",{className:l.shading,ref:b,style:{height:o},children:m.jsx(Xa,{model:e,...t})}),m.jsx(Qa,{title:"Table",open:p.isShown,onClick:p.togglePane,onResize:x}),m.jsx("div",{className:l.details,style:{height:n},children:m.jsx(bo,{model:e})})]})}return m.jsx("div",d?{className:l.shading,ref:b,style:{height:u},children:m.jsx(Xa,{model:e,...t})}:{className:l.details,style:{height:u},children:m.jsx(bo,{model:e})})})),ns=l.types.model("JobsManager",{}).views((e=>({get jobStatusWidget(){const{widgets:t}=s.getSession(e);let n=t.get("JobsList");return n||(n=s.getSession(e).addWidget("JobsListWidget","JobsList")),n}}))).actions((e=>({update(t,n,o){e.jobStatusWidget.updateJobStatusMessage(t,n),o&&e.jobStatusWidget.updateJobProgressPct(t,o)},abortJob(t,n){const o=s.getSession(e);if(s.isSessionModelWithWidgets(o)){o.showWidget(e.jobStatusWidget),e.jobStatusWidget.updateJobStatusMessage(t,n??"Aborted unexpectedly");const a=e.jobStatusWidget.jobs.findIndex((e=>e.name===t));e.jobStatusWidget.addAbortedJob({...e.jobStatusWidget.jobs[a]}),e.jobStatusWidget.removeJob(t),o.notify("Job aborted","info")}},runJob(t){const n=s.getSession(e);s.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.addJob(t))},done(t){const n=s.getSession(e);s.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.removeJob(t.name),e.jobStatusWidget.addFinishedJob({name:t.name,statusMessage:"All operations successful",progressPct:100,cancelCallback:t.cancelCallback}))}})));function os(e,n){const a=e.evaluateExtensionPoint("Apollo-extendAnnotationFeature",X.AnnotationFeatureModel),r=function(e){return l.types.model("ClientDataStore",{typeName:l.types.optional(l.types.literal("Client"),"Client"),assemblies:l.types.map(X.ApolloAssembly),checkResults:l.types.map(X.CheckResult),ontologyManager:l.types.optional(ht,{})}).views((t=>({get internetAccounts(){return l.getRoot(t).internetAccounts},get pluginConfiguration(){return l.getRoot(t).jbrowse.configuration.ApolloPlugin},getFeature:n=>l.resolveIdentifier(e,t.assemblies,n)}))).actions((e=>({addAssembly(t,n){const o={_id:t,refSeqs:{}};return n&&(o.backendDriverType=n),e.assemblies.put(o)}}))).actions((e=>({addFeature(t,n){const o=s.getSession(e),{assemblyManager:a}=o;let r=e.assemblies.get(t);if(!r){if(!a.get(t))throw new Error(`Could not find assembly "${t}" to add feature "${n._id}"`);r=e.addAssembly(t)}let i=r.refSeqs.get(n.refSeq);if(!i){const e=a.get(t);if(!e)throw new Error(`Could not find assembly "${t}" to add feature "${n._id}"`);const o=e.getCanonicalRefName(n.refSeq);if(!o)throw new Error(`Could not find refSeq "${n.refSeq}" to add feature "${n._id}"`);i=r.addRefSeq(n.refSeq,o)}i.features.put(n)},deleteFeature(t){const n=e.getFeature(t);if(!n)throw new Error(`Could not find feature "${t}" to delete`);const{_id:o,parent:a}=n;a?a.deleteChild(t):l.getParentOfType(n,X.ApolloRefSeq).deleteFeature(o)},deleteAssembly(t){e.assemblies.delete(t)},addCheckResult(t){e.checkResults.put(t)},addCheckResults(t){for(const n of t)e.checkResults.has(n._id)||e.checkResults.put(n)},deleteCheckResult(t){e.checkResults.delete(t)},clearCheckResults(){e.checkResults.clear()}}))).volatile((e=>({changeManager:new vt(e),collaborationServerDriver:new jt(e),inMemoryFileDriver:new Tt(e),desktopFileDriver:s.isElectron?new At(e):void 0}))).actions((e=>({afterCreate(){l.addDisposer(e,c.autorun((()=>{const{ontologyManager:t,pluginConfiguration:n}=e,a=n.ontologies;for(const n of a||[]){const[a,r,i,l]=[o.readConfObject(n,"name"),o.readConfObject(n,"version"),o.readConfObject(n,"source"),o.readConfObject(n,"textIndexFields")];if(!t.findOntology(a)){const n=s.getSession(e),{jobsManager:o}=n,c=new AbortController,d=`Loading ontology "${a}"`,u={name:d,statusMessage:`Loading ontology "${a}", version "${r}", this may take a while`,progressPct:0,cancelCallback:()=>{c.abort(new DOMException(`Canceling loading of ontology "${a}"`,"AbortError")),o.abortJob(u.name)}};t.addOntology(a,r,i,{textIndexing:{indexFields:l},update:(e,t)=>{0!==t?100!==t?o.update(d,e,t):o.done(u):o.runJob(u)}})}}})))}}))).views((e=>({getBackendDriver(t){const n=s.getSession(e),{assemblyManager:a}=n,r=a.get(t);if(!r)return;const{file:i,internetAccountConfigId:l}=o.getConf(r,["sequence","metadata"]);return s.isElectron&&i?e.desktopFileDriver:l?e.collaborationServerDriver:e.inMemoryFileDriver},getInternetAccount(t,n){if(!(t??n))throw new Error("Must provide either assemblyName or internetAccountId");let a=n;if(t&&!a){const{assemblyManager:n}=s.getSession(e),r=n.get(t);if(!r)throw new Error(`No assembly found with name ${t}`);({internetAccountConfigId:a}=o.getConf(r,["sequence","metadata"]))}const{internetAccounts:r}=e,i=r.find((e=>e.internetAccountId===a));if(!i)throw new Error(`No InternetAccount found with config id ${n}`);return i}}))).actions((e=>({loadFeatures:l.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const[o,a]=yield t.getFeatures(n);if(0===o.length)continue;const{assemblyName:s,refName:r}=n;let i=e.assemblies.get(s);i||(i=e.assemblies.put({_id:s,refSeqs:{}}));const[l]=o;let c=i.refSeqs.get(l.refSeq);c||(c=i.refSeqs.put({_id:l.refSeq,name:r,features:{}}));for(const e of o)c.features.has(e._id)||c.features.put(e);e.addCheckResults(a)}})),loadRefSeq:l.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const{refSeq:o,seq:a}=yield t.getSequence(n),{assemblyName:s,end:r,refName:i,start:l}=n;let c=e.assemblies.get(s);c||(c=e.assemblies.put({_id:s,refSeqs:{}}));let d=c.refSeqs.get(o);d||(d=c.refSeqs.put({_id:o,name:i,sequence:[]})),d.addSequence({start:l,stop:r,sequence:a})}}))})))}(a),i=n.props({apolloDataStore:l.types.optional(r,{typeName:"Client"}),apolloSelectedFeature:l.types.safeReference(a),jobsManager:l.types.optional(ns,{}),isLocked:l.types.optional(l.types.boolean,!1),changeInProgress:l.types.optional(l.types.boolean,!1)}).volatile((()=>({apolloHoveredFeature:void 0,abortController:new AbortController}))).extend((()=>{const e=c.observable.array([]);return{views:{get collaborators(){return e}},actions:{addOrUpdateCollaborator(t){const n=e.find((e=>e.id===t.id));n?n.locations=t.locations:e.push(t)}}}})).actions((e=>({apolloSetSelectedFeature(t){e.apolloSelectedFeature=t},apolloSetHoveredFeature(t){e.apolloHoveredFeature=t},addApolloTrackConfig(t,n){const a=`apollo_track_${t.name}`;e.tracks.some((e=>e.trackId===a))||e.addTrackConf({type:"ApolloTrack",trackId:a,name:`Annotations (${o.getConf(t,"displayName")||t.name})`,assemblyNames:[t.name],textSearching:{textSearchAdapter:{type:"ApolloTextSearchAdapter",trackId:a,assemblyNames:[t.name],textSearchAdapterId:`apollo_search_${t.name}`,...n?{baseURL:{uri:n,locationType:"UriLocation"}}:{}}}})},toggleLocked(){e.isLocked=!e.isLocked},setChangeInProgress(t){e.changeInProgress=t},getPluginConfiguration(){const{jbrowse:t}=l.getRoot(e);return t.configuration.ApolloPlugin},broadcastLocations(){const{internetAccounts:t}=l.getRoot(e),n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const o=t;if(o.initialized){const{dynamicBlocks:t}=o;for(const o of t.contentBlocks){const{assemblyName:t,end:a,refName:s,start:r}=o,i=e.apolloDataStore.assemblies.get(t);i&&"CollaborationServerDriver"===i.backendDriverType&&n.push({assemblyName:t,refName:s,start:r,end:a})}}}if(0===n.length){for(const e of t)"baseURL"in e&&e.postUserLocation([]);return}const o=[];for(const e of t)if("baseURL"in e){for(const e of n)o.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(o)}}}))).actions((e=>({apolloSetEventualSelectedFeature:c.flow((function*(t){yield c.when((()=>Boolean(e.apolloDataStore.getFeature(t)))),e.apolloSetSelectedFeature(t)}))}))).volatile((e=>({previousSnapshot:l.getSnapshot(e)}))).actions((e=>({afterCreate(){l.applySnapshot(e,{name:e.name,id:e.id});const{internetAccounts:t,jbrowse:n,reloadPluginManagerCallback:a}=l.getRoot(e);l.addDisposer(e,c.autorun((()=>{const n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const o=t;if(o.initialized){const{dynamicBlocks:t}=o;for(const o of t.contentBlocks){const{assemblyName:t,end:a,refName:s,start:r}=o,i=e.apolloDataStore.assemblies.get(t);i&&"CollaborationServerDriver"===i.backendDriverType&&n.push({assemblyName:t,refName:s,start:r,end:a})}}}if(0===n.length){for(const e of t)"baseURL"in e&&e.postUserLocation([]);return}const o=[];for(const e of t)if("baseURL"in e){for(const e of n)o.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(o)}}),{name:"ApolloSessionBroadcastLocations"})),l.addDisposer(e,c.autorun((async s=>{if(o.readConfObject(n.configuration.ApolloPlugin,"hasRole"))return l.applySnapshot(e,e.previousSnapshot),void s.dispose();const{signal:r}=e.abortController;for(const n of t){if("ApolloInternetAccount"!==n.type)continue;const{baseURL:t}=n,o=new URL("jbrowse/config.json",t).href,i=n.getFetcher({locationType:"UriLocation",uri:o});let l,c;try{l=await i(o,{signal:r})}catch(t){e.abortController.signal.aborted||console.error(t);continue}if(l.ok){try{c=await l.json()}catch(e){console.error(e);continue}c.configuration.ApolloPlugin.hasRole&&(a(c,e.previousSnapshot),s.dispose())}else{const e=await _e(l,"Failed to fetch assemblies");console.error(e)}}}),{name:"ApolloSessionLoadConfig"}))},beforeDestroy(){e.abortController.abort(new DOMException("Clean up Apollo session","AbortError"))}}))).views((e=>{const n=e.getTrackActionMenuItems;return{getTrackActionMenuItems(a){if("ApolloTrack"===a.type||"ReferenceSequenceTrack"===a.type)return n?.(a);const s=o.readConfObject(a,"trackId");return s.endsWith("-sessionTrack")?[...n?.(a)??[],{label:"Save track to Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:o}=l.getRoot(e),r=l.getSnapshot(o);let i;i=t.filterJBrowseConfig(r),0===Object.keys(i).length&&(i=void 0);const c={...l.getSnapshot(a),trackId:s.slice(0,s.length-13)};for(const o of n){if("ApolloInternetAccount"!==o.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:i,newJBrowseConfig:{...i,tracks:i?.tracks&&[...i.tracks,c]}}),{internetAccountId:a}=o;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:a});const{notify:s}=e;s("Track added","success")}e.deleteTrackConf(a),o.addTrackConf(c)},icon:ge}]:[...n?.(a)??[],{label:"Remove track from Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:o}=l.getRoot(e),r=l.getSnapshot(o);let i;i=t.filterJBrowseConfig(r),0===Object.keys(i).length&&(i=void 0);const c=i?.tracks?.filter((e=>e.trackId!==s));for(const o of n){if("ApolloInternetAccount"!==o.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:i,newJBrowseConfig:{...i,tracks:c}}),{internetAccountId:a}=o;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:a});const{notify:s}=e;s("Track removed","success")}e.deleteTrackConf(a),o.deleteTrackConf(a)},icon:ge}]}}}));return l.types.snapshotProcessor(i,{postProcessor(e,t){e.apolloSelectedFeature=void 0;const n=Object.fromEntries(Object.entries(e.apolloDataStore.assemblies).filter((([,e])=>"InMemoryFileDriver"===e.backendDriverType)));if(e.apolloDataStore={typeName:"Client",assemblies:n,checkResults:{}},!t)return e;const{apolloDataStore:o}=t,{checkResults:a}=o;for(const[,t]of a){const[n]=t.ids;if(!n)continue;const a=o.assemblies.get(n.assemblyId);a&&"InMemoryFileDriver"===a.backendDriverType&&(e.apolloDataStore.checkResults[t._id]=l.getSnapshot(t))}return e}})}const as="WorkerGlobalScope"in globalThis;for(const[n,o]of Object.entries(t.changes))e.changeRegistry.registerChange(n,o);const ss=new t.CDSCheck;e.checkRegistry.registerCheck(ss.name,ss);const rs=new t.TranscriptCheck;e.checkRegistry.registerCheck(rs.name,rs),t.validationRegistry.registerValidation(new t.CoreValidation),t.validationRegistry.registerValidation(new t.ParentChildValidation),exports.default=class extends n{name="ApolloPlugin";version="0.3.13";configurationSchema=La;install(e){!function(e){e.addAdapterType((()=>new B({name:"ApolloSequenceAdapter",configSchema:yn,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:mn})))}(e),function(e){e.addAdapterType((()=>new B({name:"ApolloRefNameAliasAdapter",configSchema:gn,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:fn})))}(e),function(e){e.addTextSearchAdapterType((()=>new a.TextSearchAdapterType({name:"ApolloTextSearchAdapter",displayName:"Apollo text search adapter",configSchema:Sn,AdapterClass:xn,description:"Apollo Text Search adapter"})))}(e),e.addWidgetType((()=>{const e=o.ConfigurationSchema("ApolloFeatureDetailsWidget",{});return new a.WidgetType({name:"ApolloFeatureDetailsWidget",heading:"Apollo feature details",configSchema:e,stateModel:On,ReactComponent:Pn})})),e.addWidgetType((()=>{const e=o.ConfigurationSchema("ApolloTranscriptDetails",{});return new a.WidgetType({name:"ApolloTranscriptDetails",heading:"Apollo transcript details",configSchema:e,stateModel:_n,ReactComponent:to})})),e.addTrackType((()=>{const t=o.ConfigurationSchema("ApolloTrack",{adapter:""},{baseConfiguration:a.createBaseTrackConfig(e),explicitIdentifier:"trackId"});return new a.TrackType({name:"ApolloTrack",configSchema:t,stateModel:a.createBaseTrackModel(e,"ApolloTrack",t)})})),e.addInternetAccountType((()=>new a.InternetAccountType({name:"ApolloInternetAccount",configSchema:he,stateModel:dn(he)}))),e.addDisplayType((()=>new a.DisplayType({name:"LinearApolloDisplay",configSchema:no,stateModel:la(0,no),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:es}))),e.addDisplayType((()=>new a.DisplayType({name:"LinearApolloSixFrameDisplay",configSchema:Ca,stateModel:Ma(0,Ca),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:ts}))),e.addDisplayType((()=>new a.DisplayType({name:"LinearApolloReferenceSequenceDisplay",configSchema:ca,stateModel:Sa(0,ca),displayName:"Apollo reference sequence display",trackType:"ReferenceSequenceTrack",viewType:"LinearGenomeView",ReactComponent:wa}))),e.addToExtensionPoint("Core-extendSession",os.bind(this,e)),e.addToExtensionPoint("Core-extendPluggableElement",(e=>{if("LinearGenomeView"===e.name){const{stateModel:t}=e,n=t.views((e=>{const t=e.rubberBandMenuItems;return{rubberBandMenuItems:()=>[...t(),{label:"Add new feature",icon:r,onClick:()=>{const t=s.getSession(e),{leftOffset:n,rightOffset:o}=e,a=e.getSelectedRegions(n,o);t.queueDialog((e=>[kt,{session:t,handleClose:()=>{e()},region:a[0],changeManager:t.apolloDataStore.changeManager}]))}}]}}));e.stateModel=n}return e})),e.addToExtensionPoint("Core-extendPluggableElement",Ua),e.addToExtensionPoint("Core-extendPluggableElement",za),e.addToExtensionPoint("LinearGenomeView-searchResultSelected",((e,t)=>{const{session:n,result:o}=t,a=o.getTrackId(),s=o.matchedObject;return a?.startsWith("apollo_track_")&&s&&n.apolloSetEventualSelectedFeature(s._id),e})),as||e.addToExtensionPoint("Core-extendWorker",(t=>"on"in t&&t.on?(t.on("apollo",(async n=>{if("object"!=typeof(o=n)||null===o||!("apollo"in o)||!0!==o.apollo)return;var o;const{apollo:a,messageId:s,method:r}=n;switch(r){case"getSequence":{const{region:o}=n,{assemblyName:r}=o,i=e.rootModel?.session?.apolloDataStore;if(!i)break;const l=i.getBackendDriver(r);if(!l)break;const{seq:c}=await l.getSequence(o);t.workers[0].postMessage({apollo:a,messageId:s,sequence:c});break}case"getRegions":{const{assembly:o}=n,r=e.rootModel?.session?.apolloDataStore;if(!r)break;const i=r.getBackendDriver(o);if(!i)break;const l=await i.getRegions(o);t.workers[0].postMessage({apollo:a,messageId:s,regions:l});break}case"getRefNameAliases":{const{assembly:o}=n,r=e.rootModel?.session?.apolloDataStore;if(!r)break;const i=r.getBackendDriver(o);if(!i)break;const l=await i.getRefNameAliases(o);t.workers[0].postMessage({apollo:a,messageId:s,refNameAliases:l});break}}})),t):t))}configure(e){var t;s.isAbstractMenuManager(e.rootModel)&&(e.jexl.addFunction("geneBackgroundColor",(e=>"pseudogene"===e?i.alpha("rgb(148, 203, 236)",.6):"ncRNA_gene"===e?i.alpha("rgb(194, 106, 119)",.6):void 0)),(t=e.rootModel).insertInMenu("Apollo",{label:"Redo",icon:de,onClick(e){const{apolloDataStore:t}=e;t.changeManager.redoLastChange()}},0),t.insertInMenu("Apollo",{label:"Undo",icon:fe,onClick(e){const{apolloDataStore:t}=e;t.changeManager.undoLastChange()}},0),t.appendToMenu("Apollo",{label:"Download GFF3",icon:re,onClick:e=>{e.queueDialog((t=>[Lt,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"View Change Log",icon:ue,onClick:e=>{e.queueDialog((t=>[zt,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"Open local GFF3 file",icon:le,onClick:e=>{e.queueDialog((t=>[Gt,{session:e,handleClose:()=>{t()},inMemoryFileDriver:e.apolloDataStore.inMemoryFileDriver}]))}}),t.appendToMenu("Apollo",{label:"View check results",icon:ie,onClick:e=>{e.queueDialog((t=>[Xt,{session:e,handleClose:()=>{t()}}]))}}),t.appendToMenu("Apollo",{label:"Lock/Unlock session",onClick:e=>{e.toggleLocked()}}),t.appendToMenu("Apollo",{label:"Log out",icon:ce,onClick:e=>{e.queueDialog((t=>[qt,{session:e,handleClose:()=>{t()}}]))}}))}};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@apollo-annotation/common"),t=require("@apollo-annotation/shared"),n=require("@jbrowse/core/Plugin"),o=require("@jbrowse/core/configuration"),a=require("@jbrowse/core/pluggableElementTypes"),s=require("@jbrowse/core/util"),r=require("@mui/icons-material/Add"),i=require("@mui/material"),l=require("@jbrowse/mobx-state-tree"),c=require("mobx"),d=require("socket.io-client"),u=require("@mui/icons-material/AdminPanelSettings"),g=require("@mui/icons-material/Delete"),f=require("@mui/icons-material/Input"),h=require("@mui/icons-material/Person"),p=require("@mui/icons-material/Rule"),m=require("react/jsx-runtime"),y=require("@jbrowse/core/util/tss-react"),b=require("@mui/icons-material/Info"),x=require("@mui/icons-material/Link"),w=require("@mui/icons-material/RadioButtonChecked"),S=require("@mui/icons-material/RadioButtonUnchecked"),C=require("bson-objectid"),v=require("react"),j=require("@mui/icons-material/SkipNextRounded"),T=require("@mui/icons-material/SkipPreviousRounded"),A=require("@jbrowse/core/util/types/mst"),F=require("idb/with-async-ittr"),k=require("@jbrowse/core/util/aborting"),D=require("jsonpath"),N=require("@jbrowse/core/util/io"),I=require("fast-deep-equal/es6"),R=require("@jbrowse/core/ui"),M=require("@mui/icons-material/Close"),E=require("mobx-react"),L=require("@mui/x-data-grid"),q=require("@gmod/gff"),P=require("file-saver"),_=require("@mui/icons-material/AccountCircle"),O=require("@jbrowse/core/pluggableElementTypes/AdapterType"),B=require("@jbrowse/core/data_adapters/BaseAdapter"),U=require("nanoid"),$=require("@jbrowse/core/util/rxjs"),z=require("@jbrowse/core/util/simpleFeature"),W=require("@jbrowse/core/TextSearch/BaseResults"),G=require("@mui/icons-material/ExpandMore"),H=require("@mui/icons-material/Edit"),V=require("@mui/icons-material/MoreHoriz"),J=require("@mui/icons-material/AddBox"),X=require("@apollo-annotation/mst"),K=require("@emotion/styled"),Z=require("@mui/icons-material/ContentCopy"),Y=require("@mui/icons-material/ContentCut"),Q=require("@mui/icons-material/Remove"),ee=require("@mui/icons-material/Clear"),te=require("@mui/icons-material/UnfoldLess"),ne=require("@jbrowse/core/util/tracks"),oe=require("@mui/icons-material/FactCheck"),ae=require("@mui/icons-material/TrackChanges"),se=require("@mui/icons-material/ExpandLess"),re=require("@mui/icons-material/Lock"),ie=require("@mui/icons-material/Error"),le=require("@mui/icons-material/Logout"),ce=require("@mui/icons-material/Redo"),de=require("@mui/icons-material/Undo"),ue=require("@mui/icons-material/Save");const ge=o.ConfigurationSchema("ApolloInternetAccount",{baseURL:{description:"Location of Apollo server",type:"string",defaultValue:""},tokenType:{description:"A custom name for a token to include in the header",type:"string",defaultValue:"Bearer"}},{baseConfiguration:a.BaseInternetAccountConfig,explicitlyTyped:!0});function fe(e){const{attributes:t}=e,n=t.get("gff_name");return n?n[0]:""}function he(e){const{attributes:t}=e,n=t.get("gff_id"),o=t.get("transcript_id"),a=t.get("exon_id"),s=t.get("protein_id");return n?n[0]:o?o[0]:a?a[0]:s?s[0]:""}function pe(e){const t=fe(e),n=he(e);return t?`: ${t}`:n?`: ${n}`:""}function me(e,t,n=!1){const o=[];o.push(e);for(const t of function(e){const t=[];let{parent:n}=e;for(;n;)t.push(n),({parent:n}=n);return t}(e))o.push(t);const a=function(e){const t=[];if(e.children)for(const[,n]of e.children)t.push(n);return t}(e);for(const e of a)e.min<t&&e.max>=t&&o.push(e);if(!n)return o;if(e.parent){const n=e.parent.children;if(n)for(const[,a]of n)a._id!=e._id&&a.min<t&&a.max>=t&&o.push(a)}return o}function ye(e,t){if(e.attributes){const n={};for(const[o,a]of Object.entries(e.attributes))t.has(o)||(n[o]=a);e.attributes=0===Object.keys(n).length?void 0:n}if(e.children){const n={};for(const[o,a]of Object.entries(e.children)){const e={...a};ye(e,t),n[o]=e}e.children=n}}const be=new Set(["i","me","my","myself","we","our","ours","ourselves","you","your","yours","yourself","yourselves","he","him","his","himself","she","her","hers","herself","it","its","itself","they","them","their","theirs","themselves","what","which","who","whom","this","that","these","those","am","is","are","was","were","be","been","being","have","has","had","having","do","does","did","doing","a","an","the","and","but","if","or","because","as","until","while","of","at","by","for","with","about","against","between","into","through","during","before","after","above","below","to","from","up","down","in","out","on","off","over","under","again","further","then","once","here","there","when","where","why","how","all","any","both","each","few","more","most","other","some","such","no","nor","not","only","own","same","so","than","too","very","s","t","can","will","just","don","should","now","0","1","2","3","4","5","6","7","8","9"]);function xe(e,t){for(const[n,o]of t.entries())if(e.startsWith(o))return e.replace(o,String(n));return e}const we="$PREFIXED_ID";function Se(e,t,n){if(t===we)return[xe(e.id,n)];let o;try{o=D.query(e,t)}catch{o=D.query(JSON.parse(JSON.stringify(e)),t)}return o}function Ce(e){return e.toLowerCase().split(/[^\d:A-Za-z]+/).filter((e=>e&&!be.has(e)))}function*ve(e){for(const t of e)yield*Ce(t)}function*je(e){for(const t of e)if("string"==typeof t)yield t;else if("object"==typeof t){const e=D.query(t,"$..*");yield*je(e)}}function*Te(e,t,n){for(const o of t){const t=Se(e,o,n);if(t.length>0)for(const e of ve(je(t)))yield[o,e]}}async function Ae(e,t,n){const o=await this.db,a=t??o.transaction(["nodes"]);k.checkAbortSignal(n);const s=[...Ce(e)],r=[],i=new Map;r.push(...s.map((async(e,t)=>{k.checkAbortSignal(n);const o=a.objectStore("nodes").index("full-text-words");for await(const a of o.iterate(IDBKeyRange.bound(e,`${e}￿`,!1,!1))){k.checkAbortSignal(n);const e=a.value,o=i.get(e.id)??[e,new Set];o[1].add(t),i.set(e.id,o)}}))),await Promise.all(r),k.checkAbortSignal(n);const l=[];for(const[,[e,t]]of i)k.checkAbortSignal(n),l.push(...Fe(this.textIndexFields,e,t,s,this.prefixes));return l.sort(((e,t)=>t.score-e.score)),l.slice(0,this.options.maxSearchResults??this.DEFAULT_MAX_SEARCH_RESULTS)}function Fe(e,t,n,o,a){const s=[...n].sort().map((e=>o[e])),r=s.map((e=>{const t=e.replaceAll(/[$()*+./?[\\\]^{|}-]/g,String.raw`\$&`);return new RegExp(`\\b${t}`,"gi")}));let i=[],l=0;for(const[n,s]of e.entries()){const c=new Set,d=e.length-n-1,u=[...je(Se(t,s.jsonPath,a))];for(const e of u){let n=0;const a=[];for(const[t,s]of r.entries())for(const r of e.matchAll(s)){n+=1+1*d,c.add(t);const s=r.index,i=o[t];void 0!==s&&(n+=.01*i.length,n+=i.length/e.length*100*.05,a.push({wordIndex:t,position:s}))}n+=100*c.size,l<n&&(l=n),a.sort(((e,t)=>e.position-t.position)),a.length>0&&i.push({term:t,field:s,str:e,score:n,wordMatches:a})}}i=i.filter((e=>e.score===l));for(const e of i){const{wordMatches:t}=e;for(let n=0;n<t.length-1;n++){const o=t[n],a=t[n+1],r=a.wordIndex-o.wordIndex;if(1===r||-1===r){e.score+=1,1===r&&(e.score+=1);const t=Math.abs(a.position-(o.position+s[o.wordIndex].length))-1;e.score-=.05*t}}}return i}function ke(e){return"string"==typeof e.id}function De(e){return"string"==typeof e.sub&&"string"==typeof e.pred&&"string"==typeof e.obj}function Ne(e){return Boolean(e.meta?.deprecated)}function Ie(e){return"CLASS"===e.type}function Re(e){return"PROPERTY"===e.type}const Me=[{displayName:"Label",jsonPath:"$.lbl"},{displayName:"Synonym",jsonPath:"$.meta.synonyms[*].val"},{displayName:"Definition",jsonPath:"$.meta.definition.val"}];async function Ee(e){return F.openDB(e,2,{upgrade(e,t,n,o,a){if(t<2&&(e.objectStoreNames.contains("meta")&&e.deleteObjectStore("meta"),e.objectStoreNames.contains("nodes")&&e.deleteObjectStore("nodes"),e.objectStoreNames.contains("edges")&&e.deleteObjectStore("edges")),e.objectStoreNames.contains("meta")||e.createObjectStore("meta"),!e.objectStoreNames.contains("nodes")){e.createObjectStore("nodes",{keyPath:"id"});const t=o.objectStore("nodes");t.createIndex("by-label","lbl"),t.createIndex("by-type","type"),t.createIndex("by-synonym",["meta","synonyms","val"]),t.createIndex("full-text-words","fullTextWords",{multiEntry:!0})}if(!e.objectStoreNames.contains("edges")){e.createObjectStore("edges",{autoIncrement:!0});const t=o.objectStore("edges");t.createIndex("by-subject","sub"),t.createIndex("by-object","obj"),t.createIndex("by-predicate","pred")}}})}function Le(e){const t=new Set;for(const[,n]of e)t.add(n);return[...t]}async function qe(e){const t=Date.now();let n,o=1;this.options.update?.("Parsing JSON",o);try{n=JSON.parse(await N.openLocation(this.sourceLocation).readFile("utf8"))}catch{throw new Error("Error in loading ontology")}o+=5,this.options.update?.("Parsing JSON complete",o);const a=Date.now(),[s,...r]=n.graphs??[];if(s){if(r.length>0)throw new Error("multiple graphs not supported");try{const n=e.transaction(["meta","nodes","edges"],"readwrite");await n.objectStore("meta").clear(),await n.objectStore("nodes").clear(),await n.objectStore("edges").clear();const r=n.objectStore("nodes"),i=Pe.call(this).map((e=>e.jsonPath));if(s.nodes){let e=Math.round(o);for(const[,t]of s.nodes.entries())o+=1/s.nodes.length*64,Math.round(o)!=e&&o<100&&(this.options.update?.("Processing nodes",o),e=Math.round(o)),ke(t)&&await r.add({...t,fullTextWords:Le(Te(t,i,this.prefixes))})}const l=n.objectStore("edges");if(s.edges){let e=Math.round(o);for(const[,t]of s.edges.entries())o+=1/s.edges.length*30,Math.round(o)!=e&&o<100&&(this.options.update?.("Processing edges",o),e=Math.round(o)),De(t)&&await l.add(t)}await n.done;const c=e.transaction("meta","readwrite"),{update:d,...u}=this.options;await c.objectStore("meta").delete("meta"),await c.objectStore("meta").add({ontologyRecord:{name:this.ontologyName,version:this.ontologyVersion,sourceLocation:this.sourceLocation},storeOptions:u,graphMeta:s.meta,timestamp:String(new Date),schemaVersion:2,timings:{overall:Date.now()-t,load:Date.now()-a}},"meta"),await c.done}catch(t){throw await e.transaction("meta","readwrite").objectStore("meta").clear(),t}}}function Pe(){return[{displayName:"ID",jsonPath:we},...this.options.textIndexing?.indexFields??Me]}async function _e(e){const[t]=await e.transaction("meta").objectStore("meta").getAll();return!!t&&I(this.options.prefixes,t.storeOptions.prefixes)&&I(this.options.textIndexing,t.storeOptions.textIndexing)}class Oe{ontologyName;ontologyVersion;sourceLocation;db;options;loadOboGraphJson=qe;getTermsByFulltext=Ae;openDatabase=Ee;isDatabaseCurrent=_e;get textIndexFields(){return Pe.call(this)}get prefixes(){return this.options.prefixes??new Map}DEFAULT_MAX_SEARCH_RESULTS=100;constructor(e,t,n,o){this.ontologyName=e,this.ontologyVersion=t,this.sourceLocation=n,this.options=o??{},this.db=this.prepareDatabase()}validate(){const e=[],{sourceLocation:t,sourceType:n}=this;return n?"obo-graph-json"!==n&&e.push(new Error(`ontology source file ${JSON.stringify(t)} has type ${n}, which is not yet supported`)):e.push(new Error(`unable to determine format of ontology source file ${JSON.stringify(t)}, file name must end with ".json", ".obo", or ".owl"`)),e}get sourceType(){if(s.isUriLocation(this.sourceLocation)){if(this.sourceLocation.uri.endsWith(".json"))return"obo-graph-json"}else if(s.isLocalPathLocation(this.sourceLocation)&&this.sourceLocation.localPath.endsWith(".json"))return"obo-graph-json"}get dbName(){return`Apollo Ontology "${this.ontologyName}" "${this.ontologyVersion}"`}async prepareDatabase(){const e=this.validate();if(e.length>0)throw e;const t=await this.openDatabase(this.dbName);if(await this.isDatabaseCurrent(t))return t;try{const{options:e,sourceLocation:n,sourceType:o}=this;if("obo-graph-json"!==o)throw new Error(`ontology source file ${JSON.stringify(n)} has type ${o}, which is not yet supported`);return e.update?.("",0),await this.loadOboGraphJson(t),e.update?.("",100),t}catch(e){throw t.close(),await F.deleteDB(this.dbName),e}}async termCount(e){const t=await this.db;return(e??t.transaction("nodes")).objectStore("nodes").count()}unique(e){const t=new Map,n=[];for(const o of e)t.has(o.id)||(t.set(o.id,!0),n.push(o));return n}async getTermsWithLabelOrSynonym(e,t,n){const o=t?.includeSubclasses??!0,a=await this.db,s=n??a.transaction(["nodes","edges"]),r=s.objectStore("nodes"),i=[...await r.index("by-label").getAll(e),...await r.index("by-synonym").getAll(e)];if(o){const e=await this.recurseEdges("by-object",i.map((e=>e.id)),(e=>"is_a"===e.pred),"sub",s);for(const t of e){const e=await r.get(t);e&&i.push(e)}}return i}async getPropertiesByLabel(e,t,n){const o=t?.includeSubProperties??!0,a=await this.db,s=n??a.transaction(["nodes","edges"]),r=(await this.getTermsWithLabelOrSynonym(e,{includeSubclasses:!1},s)).filter((e=>Re(e)));if(o){const e=await this.recurseEdges("by-object",r.map((e=>e.id)),(e=>"subPropertyOf"===e.pred),"sub",s),t=s.objectStore("nodes");for(const n of e){const e=await t.get(n);e&&Re(e)&&r.push(e)}}return r}async recurseEdges(e,t,n,o,a){const s=new Set;return await async function t(r){await Promise.all([...r].map((async r=>{const i=(await a.objectStore("edges").index(e).getAll(r)).filter((e=>n(e))).map((e=>e[o]));if(i.length>0){for(const e of i)s.add(e);await t(i)}})))}(t),s.values()}async*expandNodeSet(e,t="is_a",n,o){const a=await this.db,s=o??a.transaction(["edges"]),r=[...e],i=await this.recurseEdges("subclasses"===n?"by-object":"by-subject",r,(e=>e.pred===t),"subclasses"===n?"sub":"obj",s);for(const e of r)yield e;for(const e of i)yield e}expandSubclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"subclasses",n)}expandSuperclasses(e,t="is_a",n){return this.expandNodeSet(e,t,"superclasses",n)}async getClassesThat(e,t,n){const o=await this.db,a=n??o.transaction(["nodes","edges"]),s=await this.getPropertiesByLabel(e,{includeSubProperties:!0},a),r=new Set(s.map((e=>e.id))),i=await async function(e){const t=[];for await(const n of e)t.push(n);return t}(this.expandSuperclasses(t.map((e=>e.id)),"is_a",a)),l=await this.recurseEdges("by-object",i,(e=>r.has(e.pred)),"sub",a),c=this.expandSubclasses(l,"is_a",a),d=[];for await(const e of c){const t=await a.objectStore("nodes").get(e);t&&Ie(t)&&!Ne(t)&&d.push(t)}return d}async getClassesWithoutPropertyLabeled(e,t,n){const o=await this.db,a=n??o.transaction(["nodes","edges"]),s=a.objectStore("nodes"),r=a.objectStore("edges"),i=(await this.getPropertiesByLabel(e,t,a)).map((e=>e.id)),l=await(async()=>{const e=new Set;for(const t of i)for await(const n of r.index("by-predicate").iterate(t))e.add(n.value.sub);const t=new Set;for await(const n of this.expandSubclasses(e,"is_a",a))t.add(n);return t})(),c=[];for await(const e of s){const t=e.value;Ie(t)&&!l.has(t.id)&&c.push(t.id)}const d=[];for(const e of c){const t=await a.objectStore("nodes").get(e);t&&Ie(t)&&!Ne(t)&&d.push(t)}return d}async getAllClasses(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").index("by-type").getAll("CLASS")).filter((e=>!Ne(e)))}async getAllTerms(e){const t=await this.db,n=e??t.transaction(["nodes"]);return(await n.objectStore("nodes").getAll()).filter((e=>!Ne(e)))}}const Be=l.types.model("OntologyRecord",{name:l.types.string,version:"unversioned",source:l.types.union(A.LocalPathLocation,A.UriLocation,A.BlobLocation),options:l.types.frozen(),equivalentTypes:l.types.map(l.types.array(l.types.string))}).volatile((e=>({dataStore:void 0,startedEquivalentTypeRequests:new Set}))).actions((e=>({ping(){},initDataStore(){e.dataStore=new Oe(e.name,e.version,l.getSnapshot(e.source),e.options)},afterCreate(){l.addDisposer(e,c.autorun((()=>{this.initDataStore()})))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).actions((e=>({loadEquivalentTypes:l.flow((function*(t){if(!e.dataStore)return;if(e.startedEquivalentTypeRequests.has(t))return;e.startedEquivalentTypeRequests.add(t);const n=(yield e.dataStore.getTermsWithLabelOrSynonym(t)).map((e=>e.lbl)).filter((e=>null!=e));l.isAlive(e)&&e.setEquivalentTypes(t,n)}))}))).actions((e=>({afterCreate(){c.autorun((t=>{e.dataStore&&(e.loadEquivalentTypes("gene"),e.loadEquivalentTypes("pseudogene"),e.loadEquivalentTypes("transcript"),e.loadEquivalentTypes("pseudogenic_transcript"),e.loadEquivalentTypes("CDS"),e.loadEquivalentTypes("mRNA"),t.dispose())}))},setEquivalentTypes(t,n){e.equivalentTypes.set(t,n)}}))).views((e=>({isTypeOf(t,n){if(t===n)return!0;if(!e.dataStore)return!1;const o=e.equivalentTypes.get(n);return o?o.includes(t):(e.loadEquivalentTypes(n),!1)}}))),Ue=l.types.model("OntologyManager",{ontologies:l.types.array(Be),prefixes:l.types.optional(l.types.map(l.types.string),{"GO:":"http://purl.obolibrary.org/obo/GO_","SO:":"http://purl.obolibrary.org/obo/SO_"})}).views((e=>({get featureTypeOntologyName(){const t=l.getRoot(e).jbrowse.configuration;return o.readConfObject(t.ApolloPlugin,"featureTypeOntologyName")}}))).views((e=>({get featureTypeOntology(){return this.findOntology(e.featureTypeOntologyName)},findOntology:(t,n)=>e.ontologies.find((e=>e.name===t&&(void 0===n||e.version===n))),openOntology(e,t){return this.findOntology(e,t)?.dataStore},applyPrefixes:t=>xe(t,e.prefixes),expandPrefixes:t=>function(e,t){for(const[n,o]of t.entries())if(e.startsWith(String(n)))return e.replace(String(n),o);return e}(t,e.prefixes)}))).actions((e=>({addOntology(t,n,o,a){const s=e.ontologies.push({name:t,version:n,source:o,options:{prefixes:new Map(e.prefixes.entries()),...a}});e.ontologies[s-1].ping()}}))),$e=o.ConfigurationSchema("OntologyRecord",{name:{type:"string",description:'the full name of the ontology, e.g. "Gene Ontology"',defaultValue:"My Ontology"},version:{type:"string",description:"the ontology's version string",defaultValue:"unversioned"},source:{type:"fileLocation",description:"the download location for the ontology's source file",defaultValue:{locationType:"UriLocation",uri:"http://example.com/myontology.json"}},textIndexFields:{type:"frozen",description:"JSON paths for text fields that will be indexed for text searching",defaultValue:Me}});async function ze(e,t,n){if(!e)return;const o=await t.getTermsWithLabelOrSynonym(e.type,{includeSubclasses:!1}),a=o.filter(Ie);if(0===o.length)return;const s=await t.getClassesThat("part_of",a);return 0!==s.length?s:void 0}const We=y.makeStyles()((e=>({dialogTitle:{background:e.palette.primary.main,color:e.palette.primary.contrastText,padding:e.spacing(2)},closeButton:{position:"absolute",right:e.spacing(1),top:e.spacing(1.5),color:e.palette.primary.contrastText}}))),Ge=E.observer((function(e){const{classes:t}=We(),{handleClose:n,title:o,...a}=e;return m.jsx(R.Dialog,{...a,header:m.jsxs(m.Fragment,{children:[m.jsx(i.DialogTitle,{className:t.dialogTitle,children:o}),m.jsx(i.IconButton,{"aria-label":"close",onClick:n,className:t.closeButton,children:m.jsx(M,{})})]})})}));function He({fetchValidTerms:e,filterTerms:t,includeDeprecated:n,onChange:o,ontologyName:a,ontologyVersion:s,renderInput:r,session:l,style:c,value:d}){const[u,g]=v.useState(!1),[f,h]=v.useState(),[p,y]=v.useState(""),[b,x]=v.useState(),{ontologyManager:w}=l.apolloDataStore,S=w.findOntology(a,s)?.dataStore,C=S&&u&&!f,j=S&&!b,T=v.useCallback((e=>(n||!Ne(e))&&(!t||t(e))),[t,n]);v.useEffect((()=>{const e=new AbortController,{signal:t}=e;return j&&async function(e,t,n,o){if(!t)return;const a=(await e.getTermsWithLabelOrSynonym(t,{includeSubclasses:!1})).find((e=>(n??(()=>!0))(e)));if(!a)throw new Error(`not a valid ${e.ontologyName} term`);return a}(S,d,T).then((e=>{y(""),t.aborted||x(e)}),(e=>{t.aborted||k.isAbortException(e)||y(String(e))})),()=>{e.abort(new DOMException("Cancel getting current term from ontology store","AbortError"))}}),[l,d,T,S,j]),v.useEffect((()=>{const t=new AbortController,{signal:n}=t;return C&&async function(e,t,n,o){let a;if(t){const n=await t(e,o);n&&(a=n)}return a||(a=await e.getAllTerms()),n?a.filter((e=>n(e))):a}(S,e,T,n).then((e=>{e&&!n.aborted&&h(e)}),(e=>{n.aborted||k.isAbortException(e)||l.notify(e instanceof Error?e.message:String(e),"error")})),()=>{t.abort(new DOMException("Canceling getting valid terms from ontology store","AbortError"))}}),[C,T,S,l,e]);const A={};return p&&(A.error=!0,A.helperText=p),m.jsx(i.Autocomplete,{style:c,autoComplete:!0,filterSelectedOptions:!0,disableClearable:!0,selectOnFocus:!0,clearOnBlur:!0,handleHomeEndKeys:!0,freeSolo:!0,value:d,options:f??[],onOpen:()=>{g(!0)},onClose:()=>{g(!1)},loading:C,renderInput:r??(e=>m.jsx(i.TextField,{...e,...A})),getOptionLabel:e=>"string"==typeof e?e:e.lbl??"",isOptionEqualToValue:(e,t)=>e.lbl===t.lbl,onChange:(e,t)=>{t&&("string"==typeof t?(x(void 0),o(d,t)):t.lbl!==d&&(y(""),x(t),o(d,t.lbl)))}})}function Ve({changeManager:e,handleClose:n,session:o,sourceAssemblyId:a,sourceFeature:s}){const[r,l]=v.useState(String(s.max)),[c,d]=v.useState(String(s.min+1)),[u,g]=v.useState(""),[f,h]=v.useState(""),[p,y]=v.useState(""),b=Number(r)<=Number(c);return m.jsxs(Ge,{open:!0,title:"Add new child feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog",children:[m.jsxs("form",{onSubmit:function(i){i.preventDefault(),h("");const l=(new C).toHexString(),d={_id:l,refSeq:s.refSeq,min:Number(c)-1,max:Number(r),type:u};s.strand&&(d.strand=s.strand);const g=new t.AddFeatureChange({changedIds:[s._id],typeName:"AddFeatureChange",assembly:a,addedFeature:d,parentFeatureId:s._id});e.submit(g).then((()=>{o.apolloSetSelectedFeature(l)})),n(),i.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:c,onChange:e=>{d(e.target.value)}}),m.jsx(i.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:r,onChange:e=>{l(e.target.value)},error:b,helperText:b?'"End" must be greater than "Start"':null}),m.jsx(He,{session:o,ontologyName:"Sequence Ontology",style:{width:170},value:u,filterTerms:Ie,fetchValidTerms:async function(e,t,n){const o=await ze(e,t);if(o)return o;y(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,s),renderInput:e=>m.jsx(i.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(p),helperText:p}),onChange:(e,t)=>{var n;t&&(n=t,h(""),g(n))}})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:b||!(c&&r&&u),children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),f?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:f})}):null]})}const Je=["#cc79a7","#d65e00","#e69f00","#f0e442","#56b3e9","#0072b2","#009e73"];function Xe({changeManager:e,handleClose:n,sourceAssemblyId:o,sourceFeature:a}){const s=a.attributes.get("apollo_color")?.[0],[r,c]=v.useState(s??Je[0]);return m.jsx(Ge,{open:!0,title:"Color feature",handleClose:n,maxWidth:!1,"data-testid":"color-feature",children:m.jsxs("form",{onSubmit:s=>{!async function(s){s.preventDefault();const i=a.attributes.get("apollo_color")?.[0];if(i===r)return void n();const c=l.getSnapshot(a.attributes),d={...c,apollo_color:[r]},u=new t.FeatureAttributeChange({changedIds:[a._id],typeName:"FeatureAttributeChange",assembly:o,featureId:a._id,oldAttributes:c,newAttributes:d});await e.submit(u),n()}(s)},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.DialogContentText,{children:"Choose a color for this feature."}),m.jsx("div",{style:{display:"flex",gap:8,marginTop:8},children:Je.map((e=>{const t=r.toLowerCase()===e;return m.jsx("button",{type:"button","aria-label":e,"aria-pressed":t,onClick:()=>{c(e)},style:{width:32,height:32,padding:0,borderRadius:4,border:"1px solid rgba(0, 0, 0, 0.3)",outline:t?"2px solid currentColor":"none",outlineOffset:2,backgroundColor:e,cursor:"pointer"}},e)}))}),m.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginTop:16},children:[m.jsx("label",{htmlFor:"color-feature-custom",children:"Custom:"}),m.jsx("input",{id:"color-feature-custom",type:"color",value:r,onChange:e=>{c(e.target.value)}})]})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Submit"}),m.jsx(i.Button,{variant:"outlined",color:"error",type:"button",disabled:void 0===s,onClick:()=>{!async function(){const s=l.getSnapshot(a.attributes),{apollo_color:r,...i}=s,c=new t.FeatureAttributeChange({changedIds:[a._id],typeName:"FeatureAttributeChange",assembly:o,featureId:a._id,oldAttributes:s,newAttributes:i});await e.submit(c),n()}()},children:"Remove color"}),m.jsx(i.Button,{variant:"outlined",type:"button",onClick:n,children:"Cancel"})]})]})})}function Ke(e,t){const n=(new C).toHexString();t.push(n);const o={};if(e.children)for(const n of Object.values(e.children)){const e=Ke(n,t);o[e._id]=e}const a="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString();return{...e,refSeq:a,children:e.children&&o,_id:n}}function Ze({changeManager:e,handleClose:n,session:a,sourceAssemblyId:s,sourceFeature:r}){const{assemblyManager:c}=a,d=c.assemblyList,[u,g]=v.useState(d.find((e=>e.name!==s))?.name),[f,h]=v.useState([]),[p,y]=v.useState(""),[b,x]=v.useState(r.min),[w,S]=v.useState("");function C(e,t){const n={};if(e.children)for(const o of Object.values(e.children)){const e=C(o,t);e.refSeq=p,e.min=e.min+t,e.max=e.max+t,n[e._id]=e}const o="string"==typeof e.refSeq?e.refSeq:e.refSeq.toHexString(),a="string"==typeof e._id?e._id:e._id.toHexString();return{...e,refSeq:o,children:e.children&&n,_id:a}}return v.useEffect((()=>{(async function(){if(y(""),!u)return void S("No assemblies to copy to");const e=await c.waitForAssembly(u);if(!e)return;const{refNameAliases:t}=e;if(!t)return;const n=[...Object.entries(t)].filter((([e,t])=>e!==t)).map((([e,t])=>({_id:e,name:t})));h(n),y(n[0]?._id||"")})().catch((e=>{S(String(e))}))}),[u,c]),m.jsxs(Ge,{open:!0,title:"Copy features and annotations",handleClose:n,maxWidth:!1,"data-testid":"copy-feature",children:[m.jsxs("form",{onSubmit:async function(o){if(!u)return;o.preventDefault(),S("");const s=r.length,i=await c.waitForAssembly(u);if(!i)return void S(`Assembly not found: ${u}.`);const d=i.getCanonicalRefName(p),g=i.regions?.find((e=>e.refName===d));if(!g)return void S(`RefSeq not found: ${p}.`);const f=b+s;if(f>g.end)return void S(`Feature would extend beyond the bounds of the selected reference sequence. (Feature would end at ${f}, but reference sequence ends at ${g.end})`);if(b<g.start)return void S(`Reference sequence starts at ${g.start}, feature cannot start before that.`);const h=[],m=Ke(l.getSnapshot(r),h),y={...m.attributes};"Parent"in y&&delete y.Parent,m.refSeq=p;const x=b-m.min;m.min=b,m.max=b+s;const w=C(m,x),v=new t.AddFeatureChange({changedIds:[m._id],typeName:"AddFeatureChange",assembly:u,addedFeature:{_id:m._id,refSeq:m.refSeq,min:m.min,max:m.max,type:m.type,children:w.children,attributes:y,strand:m.strand},copyFeature:!0,allIds:h});e.submit(v).then((()=>{a.apolloSetSelectedFeature(m._id)})),n(),o.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.DialogContentText,{children:"Target assembly"}),m.jsx(i.Select,{labelId:"label",value:u,onChange:function(e){g(e.target.value)},children:d.filter((e=>e.name!==s)).map((e=>m.jsx(i.MenuItem,{value:e.name,children:o.readConfObject(e,"displayName")},e.name)))}),m.jsx(i.DialogContentText,{children:"Target reference sequence"}),m.jsx(i.Select,{labelId:"label",value:p,onChange:function(e){y(e.target.value)},children:f.map((e=>m.jsx(i.MenuItem,{value:e._id,children:e.name},e._id)))}),m.jsx(i.DialogContentText,{children:"Start position in target reference sequence"}),m.jsx(i.TextField,{margin:"dense",type:"number",fullWidth:!0,variant:"outlined",value:b,onChange:e=>{x(Number(e.target.value))}})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!u||!p||!b,variant:"contained",type:"submit",children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),w?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:w})}):null]})}function Ye({changeManager:e,handleClose:n,selectedFeature:o,session:a,setSelectedFeature:s,sourceAssemblyId:r,sourceFeature:c}){const[d,u]=v.useState(""),{ontologyManager:g}=a.apolloDataStore,{featureTypeOntology:f}=g;function h(e){if(!e.parent?.children||1===e.parent.children.size)return;const t=[];for(const n of e.parent.children.values())f?.isTypeOf(n.type,"CDS")||t.push(n);t.sort(((e,t)=>e.min-t.min));const n=[];for(const t of e.parent.children.values())f?.isTypeOf(t.type,"CDS")||n.push(t);if(n.sort(((e,t)=>t.max-e.max)),e.min===t[0].min){let n;for(const o of t)if(o._id!==e._id&&o.min>=e.min){n=o.min;break}if(n&&n!=e.parent.min)return{typeName:"LocationStartChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.min,newLocation:n}}if(e.max===n[0].max){let t;for(const o of n)if(o._id!=e._id&&o.max<=e.max){t=o.max;break}if(t&&t!=e.parent.max)return{typeName:"LocationEndChange",changedId:e.parent._id,featureId:e.parent._id,oldLocation:e.parent.max,newLocation:t}}}return m.jsxs(Ge,{open:!0,title:"Delete feature",handleClose:n,maxWidth:!1,"data-testid":"delete-feature",children:[m.jsxs("form",{onSubmit:a=>{!async function(a){a.preventDefault(),u(""),o?._id===c._id&&s();const i=[],d=new t.DeleteFeatureChange({changedIds:[c._id],typeName:"DeleteFeatureChange",assembly:r,changes:[{deletedFeature:l.getSnapshot(c),parentFeatureId:c.parent?._id}]});if(f&&(f.isTypeOf(c.type,"transcript")||f.isTypeOf(c.type,"pseudogenic_transcript"))){const e=h(c);e&&i.push(e)}if(f&&f.isTypeOf(c.type,"exon")){const e=function(e){if(!f)return;if(!f.isTypeOf(e.type,"exon"))return;if(!e.parent?.cdsLocations||0===e.parent.cdsLocations.length||0===e.parent.cdsLocations[0].length)return;if(!e.parent.children)throw new Error("Unable to find parent of CDS");if(1!=e.parent.cdsLocations.length)throw new Error("Unable to handle a transcript with multiple CDSs");const n=(e.parent.cdsLocations.at(0)??[]).sort((({min:e},{min:t})=>e-t));let o;for(const t of e.parent.children.values())if(t.type===n[0].type){o=t;break}if(!o)throw new Error("Unable to find CDS");const a=n[0].min,s=n[n.length-1].max;if(!(e.min>a&&e.max<s||e.max<a||e.min>s)){if(e.min<=a&&e.max>=s)return new t.DeleteFeatureChange({changedIds:[o._id],typeName:"DeleteFeatureChange",assembly:r,changes:[{deletedFeature:l.getSnapshot(o),parentFeatureId:o.parent?._id}]});if(e.min<=a&&e.max>a){let t;for(const o of n)if(o.min>e.max){t=o.min;break}if(!t)throw new Error("Error setting new CDS start");return{typeName:"LocationStartChange",changedId:o._id,featureId:o._id,oldLocation:o.min,newLocation:t}}if(e.min<s&&e.max>=s){let t;for(const o of n.reverse())if(o.max<e.min){t=o.max;break}if(!t)throw new Error("Error setting new CDS end");return{typeName:"LocationEndChange",changedId:o._id,featureId:o._id,oldLocation:o.max,newLocation:t}}throw new Error("Unexpected relationship between exon and CDS")}}(c);e&&("DeleteFeatureChange"===e.typeName?(d.changedIds.push(...e.changedIds),d.changes.push(...e.changes)):i.push(e));const n=h(c);if(n){i.push(n);const e=c.parent?.parent;if(e?.children)if("LocationStartChange"===n.typeName){let t=n.newLocation;for(const[,o]of e.children)o._id!=n.featureId&&o.min<t&&(t=o.min);t!=e.min&&i.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.min,newLocation:t})}else{let t=n.newLocation;for(const[,o]of e.children)o._id!=n.featureId&&o.max>t&&(t=o.max);t!=e.max&&i.push({typeName:n.typeName,changedId:e._id,featureId:e._id,oldLocation:e.max,newLocation:t})}}}const g=function(e,n){if(0===e.length)return;const o=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:n}),a=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:n});for(const t of e)"LocationStartChange"===t.typeName&&(o.changedIds.push(t.changedId),o.changes.push({featureId:t.featureId,oldStart:t.oldLocation,newStart:t.newLocation})),"LocationEndChange"===t.typeName&&(a.changedIds.push(t.changedId),a.changes.push({featureId:t.featureId,oldEnd:t.oldLocation,newEnd:t.newLocation}));if(o.changedIds.length>0&&0===a.changedIds.length)return o;if(a.changedIds.length>0&&0===o.changedIds.length)return a;throw new Error("Unexpected list of changes")}(i,r);await e.submit(d),g&&await e.submit(g),n(),a.preventDefault()}(a)},children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.DialogContentText,{children:"Are you sure you want to delete the selected feature?"})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Yes"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),d?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:d})}):null]})}function Qe(e,t){if(e.apolloDragging)return;e.setSelectedFeature(t);const{session:n}=e,{apolloDataStore:o}=n,{featureTypeOntology:a}=o.ontologyManager;if(!a)throw new Error("featureTypeOntology is undefined");let s=!1;for(const[,e]of t.children??[])if(a.isTypeOf(e.type,"CDS")||a.isTypeOf(e.type,"exon")){s=!0;break}(a.isTypeOf(t.type,"transcript")||a.isTypeOf(t.type,"pseudogenic_transcript"))&&s?e.showFeatureDetailsWidget(t,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(t)}function et(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"pseudogene")}function tt(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")}function nt(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"exon")}function ot(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"CDS")}function at(e,t){const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");const o=e.children;if(!o?.size)return!1;if(!et(e,t))return!1;for(const[,e]of o)if(tt(e,t)){const{children:n}=e;return!!n?.size&&[...n.values()].some((e=>nt(e,t)))}return!1}function st(e,t){if(!e.parent)return{upstream:void 0,downstream:void 0};const n=e.parent;if(!n.children)throw new Error(`Error getting children of ${n._id}`);const{featureTypeOntology:o}=t.session.apolloDataStore.ontologyManager;if(!o)throw new Error("featureTypeOntology is undefined");let a=[];for(const[,e]of n.children)o.isTypeOf(e.type,"exon")&&a.push(e);const s={upstream:void 0,downstream:void 0};a=a.sort(((e,t)=>e.min<t.min?-1:1));for(const t of a)if(t.min>e.max){s.downstream=t;break}a=a.sort(((e,t)=>e.min>t.min?-1:1));for(const t of a)if(t.max<e.min){s.upstream=t;break}if(-1===n.strand){const e=s.downstream;s.downstream=s.upstream,s.upstream=e}return s}function rt(e,t,n){let o=j;return-1===e&&(o=T),t&&(o=o===T?j:T),n&&(o=o===T?j:T),o}function it(e,t,n,o){const a=o.bpToPx({refName:t,coord:e.min,regionNumber:n}),s=o.bpToPx({refName:t,coord:e.max,regionNumber:n});if(void 0===a||void 0===s)return;const{offsetPx:r}=o;return[a.offsetPx-r,s.offsetPx-r]}function lt(e,t,n){const[o,a]=n;if(!(Math.abs(a-o)<8))return Math.abs(o-t)<4?{feature:e,edge:"min"}:Math.abs(a-t)<4?{feature:e,edge:"max"}:void 0}function ct(e,t){return Boolean(t&&e._id===t._id)}function dt(e){let t;t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id;const n=`(${(e.min+1).toLocaleString("en")}..${e.max.toLocaleString("en")})`;if(t&&t.length+n.length>65){const e=60-n.length;t=e>0?t.slice(0,e):"",t=`${t}[...]`}return`${t} ${n}`}function ut(e,t){const{apolloInternetAccount:n,changeManager:o,regions:a,selectedFeature:r,session:i}=e,l=[],c=n?n.role:"admin",d=!(c&&["admin","user"].includes(c)),[u]=a,g=e.getAssemblyId(u.assemblyName),f=e.getAssemblyId(u.assemblyName);return l.push({label:dt(t),type:"subHeader"},{label:"Add child feature",disabled:d,onClick:()=>{i.queueDialog((e=>[Ve,{session:i,handleClose:()=>{e()},changeManager:o,sourceFeature:t,sourceAssemblyId:g,internetAccount:n}]))}},{label:"Copy features and annotations",disabled:d,onClick:()=>{i.queueDialog((e=>[Ze,{session:i,handleClose:()=>{e()},changeManager:o,sourceFeature:t,sourceAssemblyId:f}]))}},{label:"Delete feature",disabled:d,onClick:()=>{i.queueDialog((n=>[Ye,{session:i,handleClose:()=>{n()},changeManager:o,sourceFeature:t,sourceAssemblyId:f,selectedFeature:r,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Color feature",disabled:d,onClick:()=>{i.queueDialog((e=>[Xe,{session:i,handleClose:()=>{e()},changeManager:o,sourceFeature:t,sourceAssemblyId:f}]))}}),s.isSessionModelWithWidgets(i)&&l.push({label:"Open feature details",onClick:()=>{const e=i.addWidget("ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget",{feature:t,assembly:f,refName:u.refName});i.showWidget(e)}}),l}function gt(e,t,n){const o=(e.max-e.min)*t,a=Math.max(e.min-o,1),s=Math.min(e.max+o,n);return{refName:e.refSeq,start:a,end:s}}function ft(e,t,n){const o=[{featureId:e._id,oldLocation:e[n],newLocation:t}],{parent:a}=e;return a&&("min"===n&&a[n]>t||"max"===n&&a[n]<t)&&o.push(...ft(a,t,n)),o}function ht(e,t,n,o,a){const s=e._id,r=[{featureId:s,oldLocation:e[n],newLocation:t}],{parent:i,children:l}=e;if(l)for(const[,e]of l)e._id!==a&&("min"===n&&e[n]<t||"max"===n&&e[n]>t)&&r.push(...ht(e,t,n,o));if(i&&o){const e=[];if(i.children)for(const[,t]of i.children)t._id!==s&&e.push(t);if(0===e.length)r.push(...ht(i,t,n,o,s));else{const a=i[n],l=Math[n](...e.map((e=>e[n])),t);l!==a&&r.push(...ht(i,l,n,o,s))}}return r}function pt(e,t,n,o=!1){const a=e[n];if(t===a)throw new Error(`New and existing locations are the same: "${t}"`);return"min"===n?t>a?ht(e,t,n,o):ft(e,t,n):t<a?ht(e,t,n,o):ft(e,t,n)}function mt(e){return"feature"in e}async function yt(e,t){let n;try{n=await e.text()}catch{n=""}return`${t?`${t} — `:""}${e.status} ${e.statusText}${n?` (${n})`:""}`}var bt;!function(e){e.GFF3="text/x-gff3",e.FASTA="text/x-fasta",e.BGZIP_FASTA="application/x-bgzip-fasta",e.FAI="text/x-fai",e.GZI="application/x-gzi",e.EXTERNAL="text/x-external"}(bt||(bt={}));const xt=y.makeStyles()((e=>({accordion:{border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{borderBottom:0}},accordionSummary:{flexDirection:"row-reverse"},accordionDetails:{padding:e.spacing(2),borderTop:"1px solid rgba(0, 0, 0, .125)"},radioIcon:{color:e.palette.tertiary.contrastText},dialog:{minWidth:550,maxWidth:800}})));function wt(e,t,n,o,a,s,r,i,l){return!(!e||!(t&&o||n===bt.GFF3&&o||o&&a&&s||r&&i&&l))}function St({changeManager:e,handleClose:n,session:a}){const{classes:s}=xt(),{internetAccounts:r}=l.getRoot(a),{notify:c}=a,d=r.filter((e=>"ApolloInternetAccount"===e.type));if(0===d.length)throw new Error("No Apollo internet account found");const[u,g]=v.useState(""),[f,h]=v.useState(""),[p,y]=v.useState(!1),[j,T]=v.useState(bt.BGZIP_FASTA),[A,F]=v.useState(!0),[k,D]=v.useState(!1),[N,I]=v.useState(!1),[R,M]=v.useState(!0),[E,L]=v.useState(null),[q,P]=v.useState(null),[_,O]=v.useState(null),[B,U]=v.useState(""),[$,z]=v.useState(""),[W,G]=v.useState(""),[H,V]=v.useState(!1),[J,X]=v.useState(!1),[K,Z]=v.useState(!1);async function Y(e,t){const{jobsManager:n}=a,o=new AbortController,[{baseURL:s,getFetcher:r}]=d,i=new URL("files",s);i.searchParams.set("type",t);const l=i.href,c=new FormData;let g=e.name;const f=t===bt.BGZIP_FASTA||t===bt.FASTA&&(!k||J)||t===bt.GFF3&&K;f&&!e.name.toLocaleLowerCase().endsWith(".gz")?g=`${g}.gz`:!f&&e.name.toLocaleLowerCase().endsWith(".gz")&&(g=`${g}.txt`),c.append("file",e,g),c.append("type",t);const p=r({locationType:"UriLocation",uri:l}),m={name:`UploadAssemblyFile for ${u}`,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{o.abort(new DOMException(`Canceling adding of assembly "${u}"`,"AbortError")),n.abortJob(m.name)}};n.runJob(m),n.update(m.name,`Uploading ${e.name}, this may take awhile`);const{signal:y}=o,b=await p(l,{method:"POST",body:c,signal:y});if(!b.ok){const e=await yt(b,"Error when inserting new assembly (while uploading file)");return n.abortJob(m.name,e),h(e),""}const x=(await b.json())._id;return n.done(m),x}let Q=!1;try{const e=new URL(B);"http:"!==e.protocol&&"https:"!==e.protocol||(Q=!0)}catch{}let ee=!1;try{const e=new URL($);"http:"!==e.protocol&&"https:"!==e.protocol||(ee=!0)}catch{}let te=!1;try{const e=new URL(W);"http:"!==e.protocol&&"https:"!==e.protocol||(te=!0)}catch{}const[ne,oe]=v.useState("panelFastaInput"),ae=e=>(t,n)=>{n&&oe(e)};return m.jsxs(Ge,{open:!0,handleClose:n,"data-testid":"add-assembly-dialog",title:"Add new assembly",maxWidth:!1,children:[m.jsxs("form",{onSubmit:async function(o){let a;if(o.preventDefault(),h(""),I(!0),V(!0),c(`Assembly "${u}" is being added`,"info"),n(),o.preventDefault(),j===bt.EXTERNAL)a=new t.AddAssemblyFromExternalChange({typeName:"AddAssemblyFromExternalChange",assembly:(new C).toHexString(),assemblyName:u,externalLocation:{fa:B,fai:$,gzi:W}});else{if(!E)throw new Error("Missing fasta file");if(j===bt.GFF3&&A){const e=await Y(E,bt.GFF3);a=new t.AddAssemblyAndFeaturesFromFileChange({typeName:"AddAssemblyAndFeaturesFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e},parseOptions:{strict:R}})}else if(j===bt.GFF3){const e=await Y(E,bt.GFF3);a=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e}})}else if(k){const e=await Y(E,bt.FASTA);a=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e}})}else{if(!q||!_)throw new Error("Missing fasta index files");const e=await Y(E,bt.BGZIP_FASTA),n=await Y(q,bt.FAI),o=await Y(_,bt.GZI);a=new t.AddAssemblyFromFileChange({typeName:"AddAssemblyFromFileChange",assembly:(new C).toHexString(),assemblyName:u,fileIds:{fa:e,fai:n,gzi:o}})}}const[{internetAccountId:s}]=d;await e.submit(a,{internetAccountId:s,updateJobsManager:!0}),I(!1),V(!1)},"data-testid":"submit-form",children:[m.jsxs(i.DialogContent,{className:s.dialog,children:[H?m.jsx(i.LinearProgress,{}):null,m.jsx(i.TextField,{margin:"dense",id:"name",label:"Assembly name",type:"TextField",fullWidth:!0,variant:"outlined",onChange:e=>{I(!1),g(e.target.value),function(e){const{assemblies:t}=a;t.find((t=>o.readConfObject(t,"displayName")===e))?(y(!1),h(`Assembly ${e} already exists.`)):(y(!0),h(""))}(e.target.value)},disabled:N&&!f}),m.jsxs(i.Accordion,{disableGutters:!0,elevation:0,square:!0,className:s.accordion,expanded:"panelFastaInput"===ne,onChange:ae("panelFastaInput"),children:[m.jsx(i.AccordionSummary,{className:s.accordionSummary,expandIcon:"panelFastaInput"===ne?m.jsx(w,{className:s.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):m.jsx(S,{className:s.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelFastaInputd-content",id:"panelFastaInputd-header",children:m.jsx(i.Typography,{component:"span",children:"FASTA input"})}),m.jsx(i.AccordionDetails,{className:s.accordionDetails,children:m.jsxs(i.FormGroup,{children:[m.jsx(i.FormControlLabel,{"data-testid":"files-on-url-checkbox",control:m.jsx(i.Checkbox,{onChange:()=>{T(j===bt.EXTERNAL?bt.BGZIP_FASTA:bt.EXTERNAL),j===bt.EXTERNAL&&D(!1)},checked:j===bt.EXTERNAL,disabled:k&&j!==bt.GFF3}),label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Use external URLs",m.jsx(i.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:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{"data-testid":"sequence-is-editable-checkbox",control:m.jsx(i.Checkbox,{onChange:()=>{D(!k)}}),checked:k,disabled:j===bt.EXTERNAL,label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Store sequence in database",m.jsx(i.Tooltip,{title:"Enables users to edit the genomic sequence, but comes with performance impacts. Use with care.",placement:"top-start",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{"data-testid":"fasta-is-gzip-checkbox",control:m.jsx(i.Checkbox,{checked:!k||J,onChange:()=>{X(!k||!J)},disabled:!k}),label:"FASTA is gzip compressed"}),m.jsx(i.Table,j===bt.BGZIP_FASTA||j===bt.GFF3?{size:"small",sx:{mt:2},children:m.jsxs(i.TableBody,{children:[m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:[m.jsx("span",{children:"FASTA"}),m.jsx(i.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:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx("input",{"data-testid":"fasta-input-file",type:"file",onChange:e=>{const t=e.target.files?.item(0);t&&(L(t),t.name.endsWith(".gz")&&X(!0))},disabled:N&&!f})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA index (.fai)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx("input",{"data-testid":"fai-input-file",type:"file",onChange:e=>{P(e.target.files?.item(0)??null)},disabled:N&&!f||k})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA binary index (.gzi)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx("input",{"data-testid":"gzi-input-file",type:"file",onChange:e=>{O(e.target.files?.item(0)??null)},disabled:N&&!f||k})})]})]})}:{size:"small",sx:{mt:2},children:m.jsxs(i.TableBody,{children:[m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:[m.jsx("span",{children:"FASTA"}),m.jsx(i.Tooltip,{title:"Remote FASTA input must be compressed with bgzip and indexed with samtools faidx (or equivalent)",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx(i.TextField,{"data-testid":"fasta-input-url",variant:"outlined",value:B,error:!Q,onChange:e=>{const{value:t}=e.target;U(t),z(t?`${t}.fai`:""),G(t?`${t}.gzi`:"")},disabled:N&&!f,slotProps:{input:{startAdornment:m.jsx(i.InputAdornment,{position:"start",children:m.jsx(x,{})})}}})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA index (.fai)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx(i.TextField,{"data-testid":"fai-input-url",variant:"outlined",value:$,error:!ee,onChange:e=>{z(e.target.value)},disabled:N&&!f,slotProps:{input:{startAdornment:m.jsx(i.InputAdornment,{position:"start",children:m.jsx(x,{})})}}})})]}),m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:"FASTA binary index (.gzi)"}),m.jsx(i.TableCell,{style:{borderBottomWidth:0},children:m.jsx(i.TextField,{"data-testid":"gzi-input-url",variant:"outlined",value:W,error:!te,onChange:e=>{G(e.target.value)},disabled:N&&!f,slotProps:{input:{startAdornment:m.jsx(i.InputAdornment,{position:"start",children:m.jsx(x,{})})}}})})]})]})})]})})]}),m.jsxs(i.Accordion,{disableGutters:!0,elevation:0,square:!0,className:s.accordion,expanded:"panelGffInput"===ne,onChange:ae("panelGffInput"),children:[m.jsx(i.AccordionSummary,{className:s.accordionSummary,expandIcon:"panelGffInput"===ne?m.jsx(w,{className:s.radioIcon,sx:{fontSize:"1.2rem",ml:5}}):m.jsx(S,{className:s.radioIcon,sx:{fontSize:"1.2rem",mr:5}}),"aria-controls":"panelGffInputd-content",children:m.jsxs(i.Typography,{component:"span",children:["GFF3 input",m.jsx(i.Tooltip,{title:"GFF3 must includes FASTA sequences. File can be gzip compressed.",children:m.jsx(b,{className:s.radioIcon,sx:{fontSize:18}})})]})}),m.jsx(i.AccordionDetails,{className:s.accordionDetails,children:m.jsxs(i.Box,{style:{marginTop:20},children:[m.jsx("input",{"data-testid":"gff3-input-file",type:"file",disabled:N&&!f,onChange:e=>{const t=e.target.files?.item(0);t&&(L(t),T(bt.GFF3),t.name.endsWith(".gz")&&Z(!0))}}),m.jsxs(i.FormGroup,{style:{display:"grid"},children:[m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:A,onChange:()=>{F(!A)},disabled:N&&!f}),label:"Load features from GFF3 file"}),m.jsx(i.FormControlLabel,{label:"Strict parsing",disabled:!A||N&&!f,control:m.jsx(i.Checkbox,{checked:R,onChange:e=>{M(e.target.checked)}})}),m.jsx(i.FormHelperText,{children:"Don't import any features if any lines in the GFF3 are unable to be processed"}),m.jsx(i.FormControlLabel,{"data-testid":"gff3-is-gzip-checkbox",control:m.jsx(i.Checkbox,{checked:K,onChange:()=>{Z(!K)},disabled:N&&!f}),label:"GFF3 is gzip compressed"})]})]})})]})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!wt(p,k,j,E,q,_,Q,ee,te)||N,variant:"contained",type:"submit","data-testid":"submit-button",children:N?"Submitting...":"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),f?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:f})}):null]})}const Ct=[{field:"name",headerName:"Assembly Name",width:150,editable:!1},{field:"aliases",headerName:"Aliases",width:300,editable:!0}];function vt({changeManager:e,handleClose:n,session:o}){const{apolloDataStore:a}=o,{collaborationServerDriver:s}=a,r=s.getAssemblies().map((e=>({id:e.name,name:e.displayName,aliases:e.aliases.join(", ")}))),[l,c]=v.useState("");return m.jsxs(Ge,{open:!0,title:"Add assembly aliases",handleClose:n,maxWidth:"sm","data-testid":"add-assembly-alias",fullWidth:!0,children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.Box,{sx:{height:400,width:"100%"},children:m.jsx(L.DataGrid,{rows:r,columns:Ct,initialState:{pagination:{paginationModel:{pageSize:5}}},pageSizeOptions:[5],processRowUpdate:(o,a)=>{const s=new t.AddAssemblyAliasesChange({typeName:"AddAssemblyAliasesChange",assembly:o.id,aliases:o.aliases.split(",")});return e.submit(s).catch((()=>{c("Error submitting change")})),n(),o},disableRowSelectionOnClick:!0})})}),l?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:l})}):null]})}class jt{clientStore;constructor(e){this.clientStore=e}}async function Tt(e,t){return F.openDB(`Apollo-${e}`,1,{upgrade(e){const n="changes";e.objectStoreNames.contains(n)||e.createObjectStore(n,{autoIncrement:!0});for(const n of t){const t=`features-${n}`;if(!e.objectStoreNames.contains(t)){const n=e.createObjectStore(t);n.createIndex("min","min",{unique:!1}),n.createIndex("max","max",{unique:!1})}const o=`checkresults-${n}`;if(!e.objectStoreNames.contains(o)){const t=e.createObjectStore(o,{keyPath:"_id"});t.createIndex("min","start",{unique:!1}),t.createIndex("max","end",{unique:!1}),t.createIndex("featureId","featureId",{unique:!1})}}}})}class At extends jt{async getFeatures(e){const{assemblyName:t,end:n,refName:o,start:a}=e,s=(await this.getRegions(t)).map((e=>e.refName)),r=`features-${o}`,i=`checkresults-${o}`,l=[],c=[],d=(await Tt(t,s)).transaction([r,i]);for await(const e of d.objectStore(r).index("min").iterate(IDBKeyRange.upperBound(n,!0)))e.value.max>a&&l.push(e.value);for await(const e of d.objectStore(i).index("min").iterate(IDBKeyRange.upperBound(n,!0)))e.value.end>a&&c.push(e.value);return[l,c]}async getSequence(e){const t=s.getSession(this.clientStore),{assemblyManager:n}=t,o=await n.waitForAssembly(e.assemblyName);if(!o)throw new Error(`Assembly not found: "${e.assemblyName}"`);const{configuration:a}=o,{adapter:r}=a.sequence,{pluginManager:i}=s.getEnv(this.clientStore),l=i.getAdapterType(r.type);if(!l)throw new Error(`No adapter found for "${r.type}"`);const c=new(await l.getAdapterClass())(r,void 0,i),d=await c.getSequence(e);if(!d)throw new Error(`Sequence not found: ${JSON.stringify(e)}`);return{seq:d,refSeq:e.refName}}async getRegions(e){const t=s.getSession(this.clientStore),{assemblyManager:n}=t,o=await n.waitForAssembly(e);if(!o)throw new Error(`Assembly not found: "${e}"`);const{regions:a}=o;if(!a)throw new Error(`Assembly not found: "${e}"`);return a}getAssemblies(e){return[]}async getRefNameAliases(e){const t=s.getSession(this.clientStore),{assemblyManager:n}=t,o=await n.waitForAssembly(e);if(!o)throw new Error(`Assembly not found: "${e}"`);const{configuration:a}=o,{refNameAliases:r}=a;if(!r)return[];const{pluginManager:i}=s.getEnv(this.clientStore),l=i.getAdapterType(r.adapter.type);if(!l)throw new Error(`No adapter found for "${r.adapter.type}"`);return new(await l.getAdapterClass())(r.adapter,void 0,i).getRefNameAliases({})}async submitChange(n,o){if(!e.isFeatureChange(n))return new t.ValidationResultSet;const{assembly:a,changedIds:s}=n,r=(await this.getRegions(a)).map((e=>e.refName)),i=await Tt(a,r),c=new Set,d=[],u=new Set;if(t.isDeleteFeatureChange(n))for(const e of n.changes)if(e.parentFeatureId){const t=this.clientStore.getFeature(e.parentFeatureId);t&&(c.add(t.topLevelFeature),u.add(t.topLevelFeature.refSeq))}else{const{refSeq:t,_id:n}=e.deletedFeature;d.push({refSeq:t,featureId:n}),u.add(t)}else for(const e of s){const t=this.clientStore.getFeature(e);t&&(c.add(t.topLevelFeature),u.add(t.refSeq))}const g=[...u].flatMap((e=>[`features-${e}`,`checkresults-${e}`]));g.push("changes");const f=i.transaction(g,"readwrite");for(const{refSeq:e,featureId:t}of d)f.objectStore(`features-${e}`).delete(t);for(const e of c){const t=l.getSnapshot(e);f.objectStore(`features-${e.refSeq}`).put(t,e._id)}for(const{featureId:e,refSeq:t}of d){const n=f.objectStore(`checkresults-${t}`);for await(const t of n.index("featureId").iterate(e))this.clientStore.deleteCheckResult(t.value._id),t.delete()}for(const e of c){const t=f.objectStore(`checkresults-${e.refSeq}`);for await(const n of t.index("featureId").iterate(e._id))this.clientStore.deleteCheckResult(n.value._id),n.delete()}if(f.objectStore("changes").put({...n.toJSON(),createdAt:new Date}),await f.done,c.size>0){const t=[...e.checkRegistry.getChecks().values()],n=[];for(const e of c){const o=l.getSnapshot(e),s=async(t,n)=>(await this.getSequence({assemblyName:a,refName:e.refSeq,start:t,end:n})).seq;for(const a of t){const t=await a.checkFeature(o,s);for(const o of t)n.push({refSeq:e.refSeq,result:o,topLevelFeatureId:e._id})}}if(n.length>0){const e=r.map((e=>`checkresults-${e}`)),t=i.transaction(e,"readwrite");for(const{refSeq:e,result:o,topLevelFeatureId:a}of n)t.objectStore(`checkresults-${e}`).put({...o,featureId:a});await t.done;for(const{result:e}of n)this.clientStore.addCheckResult(e)}}return new t.ValidationResultSet}async searchFeatures(e,t){return[]}async getCheckResults(e){const t=(await this.getRegions(e)).map((e=>e.refName)),n=await Tt(e,t),o=[],a=t.map((e=>`checkresults-${e}`)),s=n.transaction(a);for(const e of a)for await(const t of s.objectStore(e).iterate())o.push(t.value);return o}async getChanges(e,t={}){const n=(await this.getRegions(e)).map((e=>e.refName)),o=await Tt(e,n);let a=[];for await(const e of o.transaction("changes").store.iterate())a.push({sequence:e.key,...e.value});const{filters:s}=t;if(s?.user){const e=new RegExp(s.user,"i");a=a.filter((t=>void 0!==t.user&&e.test(t.user)))}if(s?.typeName&&(a=a.filter((e=>e.typeName===s.typeName))),s?.startTime){const e=new Date(s.startTime).getTime();a=a.filter((t=>new Date(t.createdAt).getTime()>=e))}if(s?.endTime){const e=new Date(s.endTime).getTime();a=a.filter((t=>new Date(t.createdAt).getTime()<=e))}const r=a.length,i=t.sortField??"sequence",l="asc"===(t.sortOrder??"desc")?1:-1;if(a.sort(((e,t)=>{const n=e[i],o=t[i];return n===o?0:void 0===n?1:void 0===o?-1:n<o?-l:l})),void 0!==t.page&&void 0!==t.pageSize){const e=t.page*t.pageSize;a=a.slice(e,e+t.pageSize)}return{changes:a,totalCount:r}}}const Ft={async AddFeatureChange(e,t){const{assembly:n,changes:o}=t;for(const t of o){const{addedFeature:o,parentFeatureId:a}=t;if(a){let t=e.getFeature(a);if(!t&&(await e.loadFeatures([{assemblyName:n,refName:o.refSeq,start:o.min,end:o.max}]),t=e.getFeature(a),!t))throw new Error(`Could not find parent feature "${a}"`);t.attributes.get("_id")||t.setAttribute("_id",[t._id]),t.addChild(o)}else e.addFeature(n,o)}},async DeleteFeatureChange(e,t){for(const n of t.changes){const{deletedFeature:t,parentFeatureId:o}=n;if(o){const n=e.getFeature(o);if(!n)throw new Error(`Could not find parent feature "${o}"`);n.deleteChild(t._id)}else e.getFeature(t._id)&&e.deleteFeature(t._id)}},async FeatureAttributeChange(e,t){for(const[n,o]of t.changedIds.entries()){const a=e.getFeature(o);if(!a)throw new Error(`Could not find feature with identifier "${o}"`);a.setAttributes(new Map(Object.entries(t.changes[n].newAttributes)))}},async LocationEndChange(e,t){for(const n of t.changes){const{featureId:t,newEnd:o}=n,a=e.getFeature(t);if(!a)throw new Error(`Could not find feature with identifier "${t}"`);a.setMax(o)}},async LocationStartChange(e,t){for(const n of t.changes){const{featureId:t,newStart:o}=n,a=e.getFeature(t);if(!a)throw new Error(`Could not find feature with identifier "${t}"`);a.setMin(o)}},async MergeExonsChange(e,n){for(const o of n.changes){const{firstExon:n,secondExon:a}=o,s=e.getFeature(n._id);if(!s)throw new Error(`Could not find feature with identifier "${n._id}"`);s.setMin(Math.min(n.min,a.min)),s.setMax(Math.max(n.max,a.max));const r=s.attributes.get("merged_with")?.slice()??[],i=t.stringifyAttributes(t.attributesToRecords(a.attributes));r.includes(i)||r.push(i),s.setAttribute("merged_with",r),s.parent?.deleteChild(a._id)}},async SplitExonChange(e,t){for(const[n]of t.changedIds.entries()){const{exonToBeSplit:o,parentFeatureId:a,upstreamCut:s,downstreamCut:r,leftExonId:i,rightExonId:l}=t.changes[n];if(!a)throw new Error("TODO: Split exon without parent");const[c,d]=t.makeSplitExons(o,s,r,i,l),u=e.getFeature(a);if(!u)throw new Error(`Could not find parent feature "${a}"`);u.addChild(c),u.addChild(d),e.getFeature(o._id)&&e.deleteFeature(o._id)}},async MergeTranscriptsChange(e,t){for(const[n,o]of t.changedIds.entries()){const{firstTranscript:a,secondTranscript:s}=t.changes[n],r=e.getFeature(a._id);if(!r)throw new Error(`Could not find feature with identifier "${o}"`);t.mergeTranscriptsOnClient(r,s),r.parent?.deleteChild(s._id)}},async UndoMergeExonsChange(e,t){for(const n of t.changes){const{exonsToRestore:t,parentFeatureId:o}=n;if(!o)throw new Error("Parent ID is missing");const a=e.getFeature(o);if(!a)throw new Error(`Could not find parent feature "${o}"`);a.attributes.get("_id")||a.setAttribute("_id",[a._id]);for(const e of t)a.addChild(e)}},async UndoSplitExonChange(e,t){for(const n of t.changes){const{exonToRestore:t,parentFeatureId:o,idsToDelete:a}=n;if(!o)throw new Error("Parent ID is missing");const s=e.getFeature(o);if(!s)throw new Error(`Could not find parent feature "${o}"`);s.attributes.get("_id")||s.setAttribute("_id",[s._id]),s.addChild(t),a.map((e=>{s.deleteChild(e)}))}},async UndoMergeTranscriptsChange(e,t){for(const n of t.changes){const{transcriptsToRestore:t,parentFeatureId:o}=n;if(!o)throw new Error("Parent ID is missing");const a=e.getFeature(o);if(!a)throw new Error(`Could not find parent feature "${o}"`);a.attributes.get("_id")||a.setAttribute("_id",[a._id]);for(const e of t)a.addChild(e)}},async StrandChange(e,t){for(const[n,o]of t.changedIds.entries()){const a=e.getFeature(o);if(!a)throw new Error(`Could not find feature with identifier "${o}"`);a.setStrand(t.changes[n].newStrand)}},async TypeChange(e,t){for(const[n,o]of t.changedIds.entries()){const a=e.getFeature(o);if(!a)throw new Error(`Could not find feature with identifier "${o}"`);a.setType(t.changes[n].newType)}}};class kt{dataStore;constructor(e){this.dataStore=e}recentChanges=[];undoneChanges=[];async submit(n,o={}){const{addToRecents:a=!0,submitToBackend:r=!0,updateJobsManager:i=!1}=o,l=s.getSession(this.dataStore),c=new AbortController,{jobsManager:d,isLocked:u,changeInProgress:g,setChangeInProgress:f}=s.getSession(this.dataStore);if(u)return l.notify("Cannot submit changes in locked mode"),void f(!1);if(g)return void l.notify("Could not submit change, there is another change still in progress");f(!0);const h={name:n.typeName,statusMessage:"Pre-validating",progressPct:0,cancelCallback:()=>{c.abort(new DOMException(`Cancelling change "${n.typeName}"`,"AbortError"))}};i&&d.runJob(h);const p=await t.validationRegistry.frontendPreValidate(n);if(!p.ok){const e=`Pre-validation failed: "${p.resultsMessages}"`;return i&&d.abortJob(h.name,e),l.notify(e,"error"),void f(!1)}const m=n.typeName,y=function(e){return e in Ft}(m)?Ft[m]:void 0;if(y)try{await y(this.dataStore,n)}catch(e){return i&&d.abortJob(h.name,String(e)),console.error(e),l.notify(`Error encountered in client: ${String(e)}. Data may be out of sync, please refresh the page`,"error"),void f(!1)}if((await t.validationRegistry.frontendPostValidate(n)).ok||await this.undo(n),r){i&&d.update(h.name,"Submitting to driver");const{collaborationServerDriver:t,getBackendDriver:s}=this.dataStore,r=e.isAssemblySpecificChange(n)?s(n.assembly)??t:t;let c;try{c=await r.submitChange(n,o)}catch(e){return i&&d.abortJob(h.name,String(e)),console.error(e),l.notify(String(e),"error"),f(!1),void await this.undo(n,!1)}if(!c.ok){const e=`Post-validation failed: "${p.resultsMessages}"`;return i&&d.abortJob(h.name,e),l.notify(e,"error"),f(!1),void await this.undo(n,!1)}n.notification&&l.notify(n.notification,"success"),a&&(this.recentChanges.push(n),this.undoneChanges=[])}i&&d.done(h),f(!1)}async undo(e,t=!0){const n=e.getInverse();return this.submit(n,{submitToBackend:t,addToRecents:!1})}async redo(e,t=!0){return this.submit(e,{submitToBackend:t,addToRecents:!1})}async undoLastChange(){const e=s.getSession(this.dataStore),t=this.recentChanges.pop();if(t)return this.undoneChanges.push(t),this.undo(t);e.notify("No changes to undo!","info")}async redoLastChange(){const e=s.getSession(this.dataStore),t=this.undoneChanges.pop();if(t)return this.recentChanges.push(t),this.redo(t);e.notify("No changes to redo!","info")}}class Dt extends jt{inFlight=new Map;refSeqMaps=new Map;async fetch(e,t,n){return e.getFetcher({locationType:"UriLocation",uri:t.toString()})(t,n)}async searchFeatures(e,t){const n=this.clientStore.getInternetAccount(t[0]),{baseURL:o}=n,a=new URL("features/searchFeatures",o),s=new URLSearchParams({assemblies:t.join(","),term:e});a.search=s.toString();const r=a.toString(),i=await this.fetch(n,r);if(!i.ok){const e=await yt(i,"searchFeatures failed");throw new Error(e)}return i.json()}async getFeatures(e){const{assemblyName:t,end:n,refName:o,start:a}=e,{assemblyManager:r}=s.getSession(this.clientStore);if(!r.get(t))throw new Error(`Could not find assembly with name "${t}"`);const i=(await this.getRefSeqMapping(t)).get(o);if(!i)throw new Error(`Could not find refSeq "${o}"`);const l=i.id,c=this.clientStore.getInternetAccount(t),{baseURL:d}=c,u=new URL("features/getFeatures",d),g=new URLSearchParams({refSeq:l,start:String(a),end:String(n)});u.search=g.toString();const f=u.toString(),h=await this.fetch(c,f);if(!h.ok){const e=await yt(h,"getFeatures failed");throw new Error(e)}return this.checkSocket(t,o,c),h.json()}checkSocket(n,o,a){const{socket:s}=a,r=`${n}-${o}`;s.hasListeners(r)||s.on(r,(async n=>{const o=a.retrieveToken();if(!o)return;const s=t.makeUserSessionId(o),r=new kt(this.clientStore);if(a.setLastChangeSequenceNumber(Number(n.changeSequence)),n.userSessionId===s)return;const i=e.Change.fromJSON(n.changeInfo);e.isFeatureChange(i)&&this.haveDataForChange(i)&&await r.submit(i,{submitToBackend:!1})}))}haveDataForChange(e){const{assembly:t,changedIds:n}=e;if(!this.clientStore.assemblies.get(t))return!1;for(const e of n)if(this.clientStore.getFeature(e))return!0;return!1}async getSequence(e){const t=`${e.refName}:${e.start}-${e.end}`,n=this.inFlight.get(t),{assemblyName:o,end:a,refName:r,start:i}=e,{assemblyManager:l}=s.getSession(this.clientStore);if(!l.get(o))throw new Error(`Could not find assembly with name "${o}"`);const c=(await this.getRefSeqMapping(o)).get(r);if(!c)throw new Error(`Could not find refSeq "${r}"`);const d=c.id;if(n)return{seq:await n,refSeq:d};let u=this.clientStore.assemblies.get(o);u||(u=this.clientStore.addAssembly(o));let g=u.refSeqs.get(d);g||(g=u.addRefSeq(d,r));const f=g.getSequence(i,a);if(f.length===a-i)return{seq:f,refSeq:d};const h=this.clientStore.getInternetAccount(o),{baseURL:p}=h,m=new URL("sequence",p),y=new URLSearchParams({refSeq:d,start:String(i),end:String(a)});m.search=y.toString();const b=m.toString(),x=this.getSeqFromServer(h,b,g,i,a);this.inFlight.set(t,x);const w=await x;return this.checkSocket(o,r,h),this.inFlight.delete(t),{seq:w,refSeq:d}}async getSeqFromServer(e,t,n,o,a){const s=await this.fetch(e,t);if(!s.ok){let e;try{e=await s.text()}catch{e=""}throw new Error(`getSequence failed: ${s.status} (${s.statusText})${e?` (${e})`:""}`)}const r=await s.text();return n.addSequence({sequence:r,start:o,stop:a}),r}async getRefSeqMapping(e){const t=this.refSeqMaps.get(e);if(t)return t;const{assemblyManager:n}=s.getSession(this.clientStore);if(!n.get(e))throw new Error(`Could not find assembly with name "${e}"`);const o=this.clientStore.getInternetAccount(e),{baseURL:a}=o,r=new URL("refSeqs",a),i=new URLSearchParams({assembly:e});r.search=i.toString();const l=r.toString(),c=await this.fetch(o,l);if(!c.ok){let e;try{e=await c.text()}catch{e=""}throw new Error(`getRefNameAliases failed: ${c.status} (${c.statusText})${e?` (${e})`:""}`)}const d=await c.json(),u=new Map(d.map((e=>[e.name,{refName:e.name,id:e._id,aliases:e.aliases}])));return this.refSeqMaps.set(e,u),u}async getRefNameAliases(e){return[...(await this.getRefSeqMapping(e)).values()].map((e=>({refName:e.refName,aliases:[...new Set([e.id,...e.aliases])],uniqueId:`alias-${e.id}`})))}async getRefSeqId(e,t){const n=await this.getRefSeqMapping(e);if(!n)return;const o=n.get(t);return o?.id}async getRegions(e){const{assemblyManager:t}=s.getSession(this.clientStore);if(!t.get(e))throw new Error(`Could not find assembly with name "${e}"`);const n=this.clientStore.getInternetAccount(e),{baseURL:o}=n,a=new URL("refSeqs",o),r=new URLSearchParams({assembly:e});a.search=r.toString();const i=a.toString(),l=await this.fetch(n,i);if(!l.ok){let e;try{e=await l.text()}catch{e=""}throw new Error(`getRegions failed: ${l.status} (${l.statusText})${e?` (${e})`:""}`)}return(await l.json()).map((e=>({refName:e.name,start:0,end:e.length})))}getAssemblies(e){const{assemblyManager:t}=s.getSession(this.clientStore);return t.assemblies.filter((t=>{const n=o.getConf(t,["sequence","metadata"]);return!(!(n&&n.apollo&&n.internetAccountConfigId)||e&&n.internetAccountConfigId!==e)}))}async getChanges(e,t={}){const n=this.clientStore.getInternetAccount(e),{baseURL:o}=n,a=new URL("changes",o),s={assembly:e};void 0!==t.page&&(s.page=String(t.page)),void 0!==t.pageSize&&(s.pageSize=String(t.pageSize)),t.sortField&&(s.sortField=t.sortField),t.sortOrder&&(s.sortOrder=t.sortOrder),t.filters?.user&&(s.user=t.filters.user),t.filters?.typeName&&(s.typeName=t.filters.typeName),t.filters?.startTime&&(s.startTime=t.filters.startTime),t.filters?.endTime&&(s.endTime=t.filters.endTime),a.search=new URLSearchParams(s).toString();const r=await this.fetch(n,a.toString());if(!r.ok){const e=await yt(r,"getChanges failed");throw new Error(e)}return r.json()}async getCheckResults(e){const t=this.clientStore.getInternetAccount(e),{baseURL:n}=t,o=new URL("checks",n);o.search=new URLSearchParams({assembly:e}).toString();const a=await this.fetch(t,o.toString());if(!a.ok){const e=await yt(a,"getCheckResults failed");throw new Error(e)}return a.json()}async submitChange(e,n={}){const{internetAccountId:o}=n,a=this.clientStore.getInternetAccount("assembly"in e?e.assembly:void 0,o),{baseURL:s}=a,r=new URL("changes",s).href,i=await this.fetch(a,r,{method:"POST",body:JSON.stringify(e.toJSON()),headers:{"Content-Type":"application/json"}});if(!i.ok){const e=await yt(i,"submitChange failed");throw new Error(e)}const l=new t.ValidationResultSet;return i.ok||(l.ok=!1),l}}var Nt;function It(e,t,n,o){const a={_id:(new C).toHexString(),refSeq:e,type:"CDS",min:n,max:o,strand:t},s={_id:(new C).toHexString(),refSeq:e,type:"exon",min:n,max:o,strand:t},r={};return r[a._id]=a,r[s._id]=s,{_id:(new C).toHexString(),refSeq:e,type:"mRNA",min:n,max:o,strand:t,children:r}}function Rt({changeManager:e,handleClose:n,region:o,session:a}){const[s,r]=v.useState(String(o.end)),[l,c]=v.useState(String(o.start+1)),[d,u]=v.useState(Nt.GENE_AND_SUBFEATURES),[g,f]=v.useState(""),[h,p]=v.useState(),[y,x]=v.useState(""),w=Number(s)<=Number(l);let S=Boolean(w)||!(l&&s&&d);return(d===Nt.CUSTOM&&!g||!h&&d===Nt.GENE_AND_SUBFEATURES||!h&&d===Nt.TRANSCRIPT_AND_SUBFEATURES)&&(S=!0),m.jsxs(Ge,{open:!0,title:"Add new feature",handleClose:n,maxWidth:!1,"data-testid":"add-feature-dialog",children:[m.jsxs("form",{onSubmit:async function(r){r.preventDefault(),x("");const i=a.apolloDataStore.getBackendDriver(o.assemblyName);if(!i)return void x("No backend driver found");let c=o.refName;if(i instanceof Dt){const e=await i.getRefSeqId(o.assemblyName,o.refName);if(!e)return void x(`Could not find refSeq for "${o.refName}"`);c=e}if(d===Nt.GENE_AND_SUBFEATURES){const r=It(c,h,Number(l)-1,Number(s)),i={};i[r._id]=r;const d=(new C).toHexString(),u=new t.AddFeatureChange({changedIds:[d],typeName:"AddFeatureChange",assembly:o.assemblyName,addedFeature:{_id:d,refSeq:c,min:Number(l)-1,max:Number(s),type:"gene",strand:h,children:i}});return e.submit(u).then((()=>{a.apolloSetSelectedFeature(d)})),void n()}if(d===Nt.TRANSCRIPT_AND_SUBFEATURES){const r=It(c,h,Number(l)-1,Number(s)),i=new t.AddFeatureChange({changedIds:[r._id],typeName:"AddFeatureChange",assembly:o.assemblyName,addedFeature:r});return e.submit(i).then((()=>{a.apolloSetSelectedFeature(r._id)})),void n()}if(!g)return void x("No type selected");const u=(new C).toHexString(),f=new t.AddFeatureChange({changedIds:[u],typeName:"AddFeatureChange",assembly:o.assemblyName,addedFeature:{_id:u,refSeq:c,min:Number(l)-1,max:Number(s),type:g,strand:h}});e.submit(f).then((()=>{a.apolloSetSelectedFeature(u)})),n()},"data-testid":"submit-form",children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.TextField,{margin:"dense",id:"start",label:"Start",type:"number",fullWidth:!0,variant:"outlined",value:Number(l),onChange:e=>{c(e.target.value)}}),m.jsx(i.TextField,{margin:"dense",id:"end",label:"End",type:"number",fullWidth:!0,variant:"outlined",value:s,onChange:e=>{r(e.target.value)},error:w,helperText:w?'"End" must be greater than "Start"':null}),m.jsxs(i.FormControl,{children:[m.jsx(i.InputLabel,{id:"demo-simple-select-label",children:"Strand"}),m.jsxs(i.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Strand",value:h?.toString(),onChange:function(e){switch(x(""),Number(e.target.value)){case 1:p(1);break;case-1:p(-1);break;default:p(void 0)}},children:[m.jsx(i.MenuItem,{value:void 0}),m.jsx(i.MenuItem,{value:1,children:"+"}),m.jsx(i.MenuItem,{value:-1,children:"-"})]})]}),m.jsx(i.FormControl,{style:{marginTop:20},children:m.jsxs(i.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",defaultValue:Nt.GENE_AND_SUBFEATURES,name:"radio-buttons-group",value:d,onChange:e=>{x("");const{value:t}=e.target;Object.keys(Nt).includes(t)&&u(Nt[t])},children:[m.jsx(i.FormControlLabel,{value:Nt.GENE_AND_SUBFEATURES,control:m.jsx(i.Radio,{}),label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Add gene and sub-features",m.jsx(i.Tooltip,{title:"This is a shortcut to create a gene with a single mRNA, exon, and CDS",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{value:Nt.TRANSCRIPT_AND_SUBFEATURES,control:m.jsx(i.Radio,{}),label:m.jsxs(i.Box,{display:"flex",alignItems:"center",children:["Add transcript and sub-features",m.jsx(i.Tooltip,{title:"This is a shortcut to create a single mRNA with exon and CDS, but without a parent gene",children:m.jsx(i.IconButton,{size:"small",children:m.jsx(b,{sx:{fontSize:18}})})})]})}),m.jsx(i.FormControlLabel,{value:Nt.CUSTOM,checked:d!==Nt.GENE_AND_SUBFEATURES&&d!==Nt.TRANSCRIPT_AND_SUBFEATURES,control:m.jsx(i.Radio,{}),label:"Add feature with a sequence ontology type"})]})}),d===Nt.CUSTOM?m.jsx(He,{session:a,ontologyName:"Sequence Ontology",style:{width:170},value:g,filterTerms:Ie,renderInput:e=>m.jsx(i.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{var n;t&&(n=t,x(""),f(n))}}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:S,children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),y?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:y})}):null]})}function Mt({changeManager:e,handleClose:n,session:o}){const{internetAccounts:a}=l.getRoot(o),[s,r]=v.useState(""),[c,d]=v.useState(!1),[u,g]=v.useState(!1),f=a.filter((e=>"ApolloInternetAccount"===e.type));if(0===f.length)throw new Error("No Apollo internet account found");const[h,p]=v.useState(f[0]),{collaborationServerDriver:y}=o.apolloDataStore,b=y.getAssemblies(),[x,w]=v.useState(b.at(0));return m.jsxs(Ge,{open:!0,title:"Delete Assembly",handleClose:n,maxWidth:!1,"data-testid":"delete-assembly",children:[m.jsxs("form",{onSubmit:async function(o){if(o.preventDefault(),g(!0),r(""),!x)return void r("Must select assembly!");const a=new t.DeleteAssemblyChange({typeName:"DeleteAssemblyChange",assembly:x.name});await e.submit(a,{internetAccountId:h.internetAccountId}),n(),o.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[f.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:h.internetAccountId,onChange:function(e){g(!1);const t=f.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);p(t)},disabled:u&&!s,children:a.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx(i.DialogContentText,{children:"Select assembly"}),m.jsx(i.Select,{labelId:"label",value:x?.name??"",onChange:function(e){const t=b.find((t=>t.name===e.target.value));w(t)},disabled:0===b.length,children:b.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName},e.name)))}),m.jsx(i.DialogContentText,{children:m.jsx("strong",{style:{color:"red"},children:"NOTE: All assembly data will be deleted and this operation cannot be undone!"})}),m.jsx(i.FormGroup,{children:m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:c,onChange:()=>{d(!c)}}),label:"I understand that all assembly data will be deleted"})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!x||!c,variant:"contained",type:"submit",children:"Delete"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),s?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:s})}):null]})}function Et(e){return m.jsx(i.SvgIcon,{viewBox:"0 0 24 24",...e,children:m.jsx("path",{d:"M23,12L19,8V11H10V13H19V16M1,18V6C1,4.89 1.9,4 3,4H15A2,2 0 0,1 17,6V9H15V6H3V18H15V15H17V18A2,2 0 0,1 15,20H3A2,2 0 0,1 1,18Z"})})}function Lt({handleClose:e,session:n,assembly:a}){const[s,r]=v.useState(!1),[l,c]=v.useState(""),{getInternetAccount:d}=n.apolloDataStore,{assemblyManager:u}=n,g=u.get(a);if(!g)return void c(`Assembly "${a}" not found`);const{internetAccountConfigId:f}=o.getConf(g,["sequence","metadata"]);return m.jsxs(Ge,{open:!0,title:"Export annotations",handleClose:e,maxWidth:!1,"data-testid":"download-gff3",children:[m.jsxs("form",{onSubmit:async function(n){n.preventDefault(),c(""),await(f?async function(e){const t=d(a,e),n=new URL("export/getID",t.baseURL),o=new URLSearchParams({assembly:a});n.search=o.toString();const r=n.toString(),i=t.getFetcher({locationType:"UriLocation",uri:r}),l=await i(r,{method:"GET"});if(!l.ok){const e=await yt(l,"Error when exporting ID");return void c(e)}const{exportID:u}=await l.json(),g=new URL("export",t.baseURL),f=new URLSearchParams({exportID:u,includeFASTA:s?"true":"false"});g.search=f.toString();const h=g.toString();window.open(h,"_blank")}(f):async function(e){const n=function(e){const n=new ReadableStream({async start(n){for await(const o of async function*(e){const t=await Tt(e,[]);for(const e of t.objectStoreNames){const n=t.transaction(e);for await(const e of n.store.iterate())yield e.value}t.close()}(e)){const e=t.annotationFeatureToGFF3(o);n.enqueue(e)}n.close()}});return n.pipeThrough(new TransformStream(new q.GFFFormattingTransformer))}(e),o=`${e}.gff3`;try{const e=await globalThis.showSaveFilePicker({suggestedName:o}),t=await e.createWritable();await n.pipeTo(t)}catch{const e=await new Response(n).blob();P.saveAs(e,o)}}(a)),e()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsxs(i.DialogContentText,{children:["Exporting annotations for ",a]}),m.jsx(i.FormGroup,{children:m.jsx(i.FormControlLabel,{"data-testid":"include-fasta-checkbox",control:m.jsx(i.Checkbox,{checked:s,onChange:()=>{r(!s)},disabled:!f}),label:"Include fasta sequence in GFF output"})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Download"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Cancel"})]})]}),l?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:l})}):null]})}function qt({changeManager:e,handleClose:n,session:a}){const{apolloDataStore:s}=a,[r,l]=v.useState(),[c,d]=v.useState(),[u,g]=v.useState(""),[f,h]=v.useState(!1),[p,y]=v.useState(),[b,x]=v.useState(!1),[w,S]=v.useState(!0),[C,j]=v.useState(!1),{collaborationServerDriver:T,getInternetAccount:A}=s,F=T.getAssemblies();return v.useEffect((()=>{c&&(async()=>{const{internetAccountConfigId:e}=o.getConf(c,["sequence","metadata"]),t=A(c.name,e);if(!t)throw new Error("No Apollo internet account found");const{baseURL:n}=t,a=new URL("features/count",n),s=new URLSearchParams({assemblyId:c.name});a.search=s.toString();const r=t.getFetcher({locationType:"UriLocation",uri:a.toString()});j(!0);const i=await r(a.toString(),{method:"GET"});if(!i.ok)throw new Error(await yt(i));{const e=await i.json();y(e.count)}j(!1)})().catch((e=>{console.error(e),g(e.message??e)}))}),[A,a,c]),m.jsxs(Ge,{open:!0,title:"Import Features from GFF3 file",handleClose:n,maxWidth:!1,"data-testid":"import-features-dialog",children:[C?m.jsx(i.LinearProgress,{}):null,m.jsxs("form",{onSubmit:async function(s){s.preventDefault(),g(""),j(!0),h(!0);let i="";if(!r)return void g("must select a file");if(!c)return void g("Must select assembly to download");const{internetAccountConfigId:l}=o.getConf(c,["sequence","metadata"]),d=A(c.name,l),{baseURL:u}=d,f=new URL("files",u);f.searchParams.set("type","text/x-gff3");const p=f.href,m=new FormData;m.append("file",r),m.append("fileName",r.name),m.append("type","text/x-gff3");const y=d.getFetcher({locationType:"UriLocation",uri:p});n();const{jobsManager:x}=a,S=new AbortController,C={name:`Importing features for ${c.displayName}`,statusMessage:"Uploading file, this may take awhile",progressPct:0,cancelCallback:()=>{S.abort(new DOMException(`Canceling importing of features to ${c.displayName}`,"AbortError")),x.abortJob(C.name)}};if(x.runJob(C),y){const{signal:e}=S,t=await y(p,{method:"POST",body:m,signal:e});if(!t.ok){const e=await yt(t,"Error when inserting new features (while uploading file)");return x.abortJob(C.name,e),void g(e)}i=(await t.json())._id}const v=new t.AddFeaturesFromFileChange({typeName:"AddFeaturesFromFileChange",assembly:c.name,fileId:i,parseOptions:{strict:w},deleteExistingFeatures:b});x.done(C),await e.submit(v,{updateJobsManager:!0})},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsx(i.DialogContentText,{children:"Select assembly"}),m.jsx(i.Select,{labelId:"label",value:c?.name??"",onChange:function(e){const t=F.find((t=>t.name===e.target.value));d(t),h(!1)},disabled:f&&!u,children:F.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName??e.name},e.name)))}),m.jsx(i.DialogContentText,{children:"Upload GFF3 to load features"}),m.jsx("input",{type:"file",onChange:function(e){h(!1),e.target.files&&l(e.target.files[0])},disabled:f&&!u}),m.jsx(i.FormControlLabel,{label:"Strict parsing",disabled:f&&!u,control:m.jsx(i.Checkbox,{checked:w,onChange:function(e){S(e.target.checked)}})}),m.jsx(i.FormHelperText,{children:"Don't import any features if any lines in the GFF3 are unable to be processed"}),p&&p>0?m.jsxs(m.Fragment,{children:[m.jsx(i.FormControlLabel,{label:"Delete existing features",disabled:f&&!u,control:m.jsx(i.Checkbox,{checked:b,onChange:function(e){x(e.target.checked)},slotProps:{input:{"aria-label":"controlled"}},color:"warning"})}),m.jsxs(i.FormHelperText,{children:["This assembly has ",p," features that will be deleted"]})]}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!(c&&r&&void 0!==p)||f,variant:"contained",type:"submit",children:f?"Submitting...":"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Close"})]})]}),u?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:u})}):null]})}function Pt({handleClose:e,session:t}){const{internetAccounts:n}=l.getRoot(t),[o,a]=v.useState(""),s=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===s.length)throw new Error("No Apollo internet account found");const[r,c]=v.useState(s[0]);return m.jsxs(Ge,{open:!0,title:"Log out",handleClose:e,maxWidth:!1,"data-testid":"log-out",children:[m.jsxs("form",{onSubmit:function(e){e.preventDefault(),a(""),r.removeToken(),globalThis.location.reload()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[s.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:r.internetAccountId,onChange:function(e){const t=s.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);c(t)},children:n.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx(i.DialogContentText,{children:"Are you sure you want to log out?"})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{disabled:!r,variant:"contained",type:"submit",children:"Log Out"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Cancel"})]})]}),o?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:o})}):null]})}function _t({handleClose:e,session:t}){const{internetAccounts:n}=l.getRoot(t),[o,a]=v.useState(""),[s,r]=v.useState(!1),c=n.filter((e=>"ApolloInternetAccount"===e.type));if(0===c.length)throw new Error("No Apollo internet account found");const[d,u]=v.useState(c[0]),[g,f]=v.useState([]),[h,p]=v.useState([]),{collaborationServerDriver:y}=t.apolloDataStore,b=y.getAssemblies(),[x,w]=v.useState(b.at(0));function S(e,t){const n=[...h],o=e.target.value;if(t)n.includes(o)||(n.push(o),p(n));else{const e=n.indexOf(o,0);-1!==e&&n.splice(e,1),p(n)}}return v.useEffect((()=>{(async function(){const{baseURL:e,getFetcher:t}=d,n=new URL("checks/types",e).href,o=t({locationType:"UriLocation",uri:n}),s=await o(n,{method:"GET"});if(!s.ok){const e=await yt(s,"Error when retrieving checks from server");return void a(e)}const r=await s.json();f(r)})().catch((e=>{a(String(e))}))}),[d]),v.useEffect((()=>{(async function(){if(!x)return;const{baseURL:e,getFetcher:t}=d,n=new URL(`assemblies/${x.name}`,e).href,o=t({locationType:"UriLocation",uri:n}),s=await o(n,{method:"GET"});if(!s.ok){const e=await yt(s,"Error when retrieving assembly from server");return void a(e)}const r=await s.json();p(r.checks)})().catch((e=>{a(String(e))}))}),[x,d]),m.jsxs(Ge,{open:!0,title:"Manage Checks",handleClose:e,"data-testid":"manage-checks",children:[m.jsxs("form",{onSubmit:async function(n){if(n.preventDefault(),!x)return void a("Must select assembly!");const{notify:o}=t,{baseURL:s,getFetcher:r}=d,i=new URL("assemblies/checks",s).href,l=r({locationType:"UriLocation",uri:i}),c=await l(i,{method:"POST",body:JSON.stringify({_id:x.name,checks:h,name:""}),headers:{"Content-Type":"application/json"}});if(c.ok)o("Assembly checks updated successfully","success"),e();else{const e=await yt(c,"Error when updating assembly checks");a(e)}},children:[m.jsxs(i.DialogContent,{children:[c.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:d.internetAccountId,onChange:function(e){r(!1);const t=c.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);u(t)},disabled:s&&!o,children:n.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx(i.DialogContentText,{children:"Select assembly"}),m.jsx(i.Select,{style:{width:300},labelId:"label",value:x?.name??"",onChange:function(e){const t=b.find((t=>t.name===e.target.value));w(t)},disabled:0===b.length,children:b.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName},e.name)))}),m.jsx("br",{}),m.jsx("br",{}),m.jsx(i.TableContainer,{component:i.Paper,children:m.jsxs(i.Table,{children:[m.jsx(i.TableHead,{children:m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{children:"Check name"}),m.jsx(i.TableCell,{children:"Use check"})]})}),m.jsx(i.TableBody,{children:g.map((e=>m.jsxs(i.TableRow,{children:[m.jsx(i.TableCell,{children:e.name}),m.jsx(i.TableCell,{children:m.jsx(i.Checkbox,{value:e._id,checked:h.includes(e._id),onChange:S})})]},e._id)))})]})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Cancel"})]})]}),o?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:o})}):null]})}function Ot(e){return"ApolloInternetAccount"===e.type}function Bt({changeManager:e,handleClose:n,session:o}){const{internetAccounts:a}=l.getRoot(o),s=a.filter((e=>Ot(e))).filter((e=>e.role?.includes("admin")));if(0===s.length)throw new Error("No Apollo internet account found");const[r,c]=v.useState(""),[d,u]=v.useState(s[0]),[f,h]=v.useState([]);function p(e){return e===d.getUserId()}v.useEffect((()=>{(async function(){const{baseURL:e}=d,t=new URL("users",e).href,n=d.getFetcher({locationType:"UriLocation",uri:t}),o=await n(t,{method:"GET"});if(!o.ok){const e=await yt(o,"Error when getting user data from db");return void c(e)}const a=await o.json();h(a.map((e=>void 0===e.role?{...e,role:""}:e)))})().catch((e=>{c(String(e))}))}),[d]);const y=[{field:"username",headerName:"User",width:140},{field:"email",headerName:"Email",width:160},{field:"role",headerName:"Role",width:140,type:"singleSelect",valueOptions:["readOnly","user","admin","none"],getOptionLabel(e){switch(e){case"readOnly":return"Read-only";case"user":return"User";case"admin":return"Admin";case"none":return"None";default:return"unknown"}},editable:!0},{field:"actions",type:"actions",getActions:n=>[m.jsx(L.GridActionsCellItem,{icon:m.jsx(g,{}),onClick:async()=>{globalThis.confirm("Delete this user?")&&await async function(n){const o=new t.DeleteUserChange({typeName:"DeleteUserChange",userId:n});await e.submit(o,{internetAccountId:d.internetAccountId}),h((e=>e.filter((e=>e._id!==n))))}(n.id)},disabled:p(n.id),label:"Delete"},`delete-${n.id}`)]}];return m.jsxs(Ge,{open:!0,fullScreen:!0,title:"Manage users",handleClose:n,"data-testid":"manage-users",children:[m.jsxs(i.DialogContent,{children:[s.length>1?m.jsxs(m.Fragment,{children:[m.jsx(i.DialogContentText,{children:"Select account"}),m.jsx(i.Select,{value:d.internetAccountId,onChange:function(e){const t=s.find((t=>t.internetAccountId===e.target.value));if(!t)throw new Error(`Could not find internetAccount with ID "${e.target.value}"`);u(t)},disabled:!r,children:a.map((e=>m.jsx(i.MenuItem,{value:e.internetAccountId,children:e.name},e.id)))})]}):null,m.jsx("div",{style:{height:"100%",width:"100%"},children:m.jsx(L.DataGrid,{pagination:!0,rows:f,columns:y,getRowId:e=>e._id,slots:{toolbar:L.GridToolbar},getRowHeight:()=>"auto",isCellEditable:e=>!p(e.id),processRowUpdate:async function(n){const o=new t.UserChange({typeName:"UserChange",role:n.role,userId:n._id});return await e.submit(o,{internetAccountId:d.internetAccountId}),n},onProcessRowUpdateError:e=>{c(String(e))}})})]}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Close"})}),r?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:r})}):null]})}function Ut(e,t){const n=t[e];let o;if("three_prime"===e)o=`3'end (coords: ${n.min+1}-${n.max})`;else{if("five_prime"!==e)throw new Error(`Unexpected direction: "${e}"`);o=`5'end (coords: ${n.min+1}-${n.max})`}return o}function $t({changeManager:e,handleClose:n,selectedFeature:o,setSelectedFeature:a,sourceAssemblyId:s,sourceFeature:r}){const[c,d]=v.useState(""),[u,g]=v.useState(),f=function(e){const t={},n=e.parent;if(!n)throw new Error("Unable to find parent of reference exon");let o=[];if(n.children)for(const[,e]of n.children)"exon"===e.type&&o.push(e);o=o.sort(((e,t)=>e.min===t.min?e.max-t.max:e.min-t.min)),n.strand&&-1===n.strand&&(o=o.reverse());let a=0;for(const n of o){if(n._id===e._id){o.length>a+1&&(t.three_prime=o[a+1]),a>0&&(t.five_prime=o[a-1]);break}a++}return t}(r);return m.jsxs(Ge,{open:!0,title:"Merge exons",handleClose:n,maxWidth:!1,"data-testid":"merge-exons",children:[m.jsxs("form",{onSubmit:function(i){i.preventDefault(),d("");const{parent:c}=r;if(!u||!c)return;o?._id===r._id&&a();const g=new t.MergeExonsChange({changedIds:[r._id],typeName:"MergeExonsChange",assembly:s,firstExon:l.getSnapshot(r),secondExon:l.getSnapshot(u),parentFeatureId:c._id});e.submit(g),n(),i.preventDefault()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[0===Object.keys(f).length?"There are no neighbouring exons to merge with":"Merge with exon on:",m.jsx(i.FormControl,{style:{marginTop:5},children:m.jsx(i.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:u,onChange:e=>{d("");const{value:t}=e.target;g(f[t])},children:Object.keys(f).map((e=>m.jsx(i.FormControlLabel,{value:e,control:m.jsx(i.Radio,{}),label:m.jsx(i.Box,{display:"flex",alignItems:"center",children:Ut(e,f)})},e)))})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(f).length||void 0===u,children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),c?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:c})}):null]})}function zt(e){let t;return t=e.attributes.get("gff_name")?e.attributes.get("gff_name")?.join(","):e.attributes.get("gff_id")?e.attributes.get("gff_id")?.join(","):e._id,`${t} [${e.min+1}-${e.max}]`}function Wt({changeManager:e,handleClose:n,selectedFeature:o,session:a,setSelectedFeature:s,sourceAssemblyId:r,sourceFeature:c}){const[d,u]=v.useState(""),g=function(e,t){const n=e.parent;if(!n)throw new Error("Unable to find parent of reference transcript");const{featureTypeOntology:o}=t.apolloDataStore.ontologyManager;if(!o)throw new Error("featureTypeOntology is undefined");const a={};if(n.children)for(const[,t]of n.children)o.isTypeOf(t.type,"transcript")&&t._id!==e._id&&(a[t._id]=t);return a}(c,a),f=Object.keys(g).at(0),[h,p]=v.useState(f);return m.jsxs(Ge,{open:!0,title:"Merge transcripts",handleClose:n,maxWidth:!1,"data-testid":"merge-transcripts",children:[m.jsxs("form",{onSubmit:function(a){if(a.preventDefault(),u(""),!h)return;const i=g[h];if(o?._id===c._id&&s(),!c.parent)throw new Error("Cannot find parent");const d=new t.MergeTranscriptsChange({changedIds:[c._id],typeName:"MergeTranscriptsChange",assembly:r,firstTranscript:l.getSnapshot(c),secondTranscript:l.getSnapshot(i),parentFeatureId:c.parent._id});e.submit(d),n()},children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[0===Object.keys(g).length?"There are no transcripts to merge with":"Merge with transcript:",m.jsx(i.FormControl,{style:{marginTop:5},children:m.jsx(i.RadioGroup,{"aria-labelledby":"demo-radio-buttons-group-label",name:"radio-buttons-group",value:h,onChange:e=>{u("");const{value:t}=e.target;p(t)},children:Object.keys(g).map((e=>m.jsx(i.FormControlLabel,{value:e,control:m.jsx(i.Radio,{}),label:m.jsx(i.Box,{display:"flex",alignItems:"center",children:zt(g[e])})},e)))})})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:0===Object.keys(g).length||void 0===h,children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),d?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:d})}):null]})}!function(e){e.GENE_AND_SUBFEATURES="GENE_AND_SUBFEATURES",e.TRANSCRIPT_AND_SUBFEATURES="TRANSCRIPT_AND_SUBFEATURES",e.CUSTOM="CUSTOM"}(Nt||(Nt={}));const Gt=y.makeStyles()((e=>({changeTextarea:{fontFamily:"monospace",width:600,resize:"none",border:`1px solid ${e.palette.divider}`,borderRadius:e.shape.borderRadius}})));function Ht(e){const t={};for(const n of e.items)if(void 0!==n.value&&""!==n.value&&null!==n.value)switch(n.field){case"user":t.user=String(n.value);break;case"typeName":t.typeName=String(n.value);break;case"createdAt":{const e=new Date(n.value).toISOString();"after"===n.operator||"onOrAfter"===n.operator?t.startTime=e:"before"!==n.operator&&"onOrBefore"!==n.operator||(t.endTime=e);break}}return t}function Vt({handleClose:t,session:n,assembly:o}){const{classes:a}=Gt(),[s,r]=v.useState(),[l,c]=v.useState([]),[d,u]=v.useState(0),[g,f]=v.useState(!1),[h,p]=v.useState({page:0,pageSize:15}),[y,b]=v.useState([{field:"sequence",sort:"desc"}]),[x,w]=v.useState({items:[]}),{apolloDataStore:S}=n,{assemblyManager:C}=n,j=C.get(o),T=j?.displayName??o,A=[{field:"sequence"},{field:"typeName",headerName:"Change type",width:200,type:"singleSelect",valueOptions:[...e.changeRegistry.changes.keys()]},{field:"changeData",headerName:"Change JSON",width:600,sortable:!1,filterable:!1,renderCell:({value:e})=>m.jsx("textarea",{className:a.changeTextarea,value:JSON.stringify(e),readOnly:!0})},{field:"user",headerName:"User",width:140},{field:"createdAt",headerName:"Time",width:160,type:"dateTime",valueGetter:e=>e&&new Date(e)}];return v.useEffect((()=>{(async function(){const e=S.getBackendDriver(o);if(!e)return void r(`No driver found for assembly "${o}"`);f(!0);const[t]=y,n=t?.field,a=t?.sort,s="asc"===a||"desc"===a?a:void 0,{changes:i,totalCount:l}=await e.getChanges(o,{page:h.page,pageSize:h.pageSize,sortField:n,sortOrder:s,filters:Ht(x)}),d=i.map((e=>{const{sequence:t,typeName:n,changes:o,user:a,createdAt:s,...r}=e;return{sequence:t,typeName:n,changeData:o??{typeName:n,...r},user:a,createdAt:s}}));c(d),u(l)})().catch((e=>{r(String(e))})).finally((()=>{f(!1)}))}),[S,o,h,y,x]),m.jsxs(Ge,{open:!0,fullScreen:!0,title:"View change log",handleClose:t,"data-testid":"view-changelog",children:[m.jsxs(i.DialogContent,{children:[m.jsxs(i.DialogContentText,{children:["Changes for ",T]}),m.jsx(L.DataGrid,{pagination:!0,paginationMode:"server",sortingMode:"server",filterMode:"server",rowCount:d,paginationModel:h,onPaginationModelChange:p,sortModel:y,onSortModelChange:b,filterModel:x,onFilterModelChange:w,loading:g,rows:l,columns:A,getRowId:e=>e.sequence,showToolbar:!0,pageSizeOptions:[5,15,25,50,100],initialState:{columns:{columnVisibilityModel:{sequence:!1}}}})]}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:t,children:"Close"})}),s?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:s})}):null]})}const Jt=[{field:"refName",headerName:"Ref Name"},{field:"aliases",headerName:"Aliases",editable:!0,flex:1}],Xt=e=>/^[\da-f]{24}$/i.test(e),Kt=E.observer((function({changeManager:e,handleClose:n,session:o}){const a=v.useRef(null),[s,r]=v.useState(""),[l,c]=v.useState(!1),[d,u]=v.useState(),[g,f]=v.useState([]),[h,p]=v.useState(new Map),{apolloDataStore:y}=o,{collaborationServerDriver:b}=y,x=b.getAssemblies();v.useEffect((()=>{x.length>0&&(u(x[0]),b.getRefNameAliases(x[0].name).then((e=>{w(e)})).catch((()=>{p(new Map),r("Error fetching refName aliases for assembly")})))}),[]);const w=e=>{const t=new Map;for(const n of e){const e=n.refName;Xt(e)||t.set(e,n.aliases)}p(t)},S=()=>[...h].map(((e,t)=>({id:t,refName:e[0],aliases:e[1].filter((t=>t!==e[0])).join(", ")})));return m.jsxs(Ge,{open:!0,title:"Add reference sequence aliases",handleClose:n,maxWidth:"sm","data-testid":"add-refseq-alias",fullWidth:!0,children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:[m.jsxs(i.Grid,{container:!0,spacing:2,children:[m.jsx(i.Grid,{children:m.jsxs(i.FormControl,{disabled:l&&!s,fullWidth:!0,children:[m.jsx(i.InputLabel,{id:"demo-simple-select-label",children:"Assembly"}),m.jsx(i.Select,{labelId:"demo-simple-select-label",id:"demo-simple-select",label:"Assembly",value:d?.name??"",onChange:e=>{const t=x.find((t=>t.name===e.target.value));u(t),t?.name&&(b.getRefNameAliases(t.name).then((e=>{w(e),r("")})).catch((()=>{p(new Map),r("Error fetching refName aliases for assembly")})),c(!1),a.current&&(a.current.value=""))},style:{minWidth:150},children:x.map((e=>m.jsx(i.MenuItem,{value:e.name,children:e.displayName},e.name)))})]})}),m.jsxs(i.Grid,{children:[m.jsx(i.InputLabel,{children:"Load RefName alias"}),m.jsx("input",{type:"file",onChange:e=>{(async e=>{if(!e.target.files)return;const t=e.target.files[0],n=(await t.text()).split("\n"),o=new Map(h);r("");for(const e of n){const t=e.split("\t");for(const e of t)o.has(e)&&o.set(e,[...o.get(e)??[],...t])}p(o)})(e).catch((()=>{r("Error reading file")}))},ref:a,disabled:l&&!s||!d})]})]}),d&&h.size>0?m.jsxs("div",{style:{height:200,width:"100%",marginTop:20},children:[m.jsx(i.InputLabel,{children:"Refname aliases found for selected assembly."}),m.jsx(L.DataGrid,{rows:S(),columns:Jt,initialState:{pagination:{paginationModel:{page:0,pageSize:5}}},pageSizeOptions:[5,10],onRowSelectionModelChange:e=>{const{ids:t}=e;if(t.size>0){c(!0);const e=[...t.values()].flatMap((e=>S().filter((t=>String(t.id)===String(e)))));f(e)}else c(!1),f([])},processRowUpdate:(e,t)=>{const n=new Map(h);return n.set(e.refName,e.aliases.split(",")),p(n),e},checkboxSelection:!0,disableRowSelectionExcludeModel:!0})]}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:!l,onClick:()=>{const o=[];for(const e of g){const{refName:t}=e,n=e.aliases.split(",").map((e=>e.trim())).filter((e=>e.length>0));o.push({refName:t,aliases:n})}if(r(""),!d)return void r("No assembly selected");const a=new t.AddRefSeqAliasesChange({typeName:"AddRefSeqAliasesChange",assembly:d.name,refSeqAliases:o});e.submit(a).catch((()=>{r("Error submitting change")})),n()},children:"Submit"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Close"})]}),s?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:s})}):null]})}));function Zt({handleClose:e,session:t,assembly:n}){const[o,a]=v.useState(),[s,r]=v.useState([]),{apolloDataStore:l}=t;return v.useEffect((()=>{(async function(){const e=l.getBackendDriver(n);if(!e)return void a(`No driver found for assembly "${n}"`);const t=await e.getCheckResults(n);r(t)})().catch((e=>{a(String(e))}))}),[l,n]),m.jsxs(Ge,{open:!0,fullScreen:!0,title:"View check results",handleClose:e,"data-testid":"view-check-results",children:[m.jsxs(i.DialogContent,{children:[m.jsxs(i.DialogContentText,{children:["Check results for ",n]}),m.jsx(L.DataGrid,{pagination:!0,rows:s,columns:[{field:"_id",headerName:"id",width:50},{field:"name",headerName:"Check name",width:200},{field:"refSeq",headerName:"Reference sequence ID",width:200},{field:"ids",headerName:"Feature IDs",width:200},{field:"message",headerName:"Message",flex:1}],getRowId:e=>e._id,showToolbar:!0,initialState:{sorting:{sortModel:[{field:"name",sort:"asc"}]},columns:{columnVisibilityModel:{name:!0}}}})]}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:e,children:"Close"})}),o?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:o})}):null]})}function Yt(e){return e.max-e.min<2?{isSplittable:!1,comment:"This exon is too short to be split"}:{isSplittable:!0,comment:""}}function Qt(e){const t=Yt(e);return t.isSplittable?"Are you sure you want to split the selected exon?":t.comment}function en({changeManager:e,handleClose:n,selectedFeature:o,setSelectedFeature:a,sourceAssemblyId:s,sourceFeature:r}){const[c,d]=v.useState(""),u=l.getSnapshot(r);return m.jsxs(Ge,{open:!0,title:"Split exon",handleClose:n,maxWidth:!1,"data-testid":"split-exon",children:[m.jsxs("form",{onSubmit:function(i){i.preventDefault(),d(""),o?._id===r._id&&a();const l=u.min+(u.max-u.min)/2,c=Math.floor(l),g=Math.ceil(l);if(!r.parent?._id)throw new Error("Splitting an exon without parent is not possible yet");const f=new t.SplitExonChange({changedIds:[r._id],typeName:"SplitExonChange",assembly:s,exonToBeSplit:u,parentFeatureId:r.parent._id,upstreamCut:c,downstreamCut:g,leftExonId:(new C).toHexString(),rightExonId:(new C).toHexString()});e.submit(f),n(),i.preventDefault()},children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.DialogContentText,{children:Qt(u)})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:!Yt(u).isSplittable,children:"Yes"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:n,children:"Cancel"})]})]}),c?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:c})}):null]})}function tn({changeManager:e,handleClose:n,session:a,sourceAssemblyId:s,sourceFeature:r,setSelectedFeature:c}){const[d,u]=v.useState(""),{notify:g}=a;return m.jsxs(Ge,{open:!0,title:"Duplicate transcript",handleClose:n,maxWidth:!1,"data-testid":"duplicate-transcript",children:[m.jsxs("form",{onSubmit:i=>{!async function(i){i.preventDefault(),u("");try{const i=r.parent;if(!i)return void u("No parent gene found for this transcript");const d=l.getSnapshot(r),f=(new C).toHexString(),h={...d,_id:f};if(h.children){const e={};for(const[,t]of Object.entries(h.children)){const n=(new C).toHexString();e[n]={...t,_id:n}}h.children=e}const p=o.readConfObject(a.getPluginConfiguration(),"skippedAttributesOnCopy");ye(h,new Set(p??[]));const m=new t.AddFeatureChange({parentFeatureId:i._id,changedIds:[i._id],typeName:"AddFeatureChange",assembly:s,addedFeature:h});await e.submit(m).then((()=>{c(void 0),a.apolloSetSelectedFeature(f),g("Successfully duplicated transcript","success")})),n()}catch(e){u(e instanceof Error?e.message:"Failed to duplicate transcript")}}(i)},children:[m.jsx(i.DialogContent,{style:{display:"flex",flexDirection:"column"},children:m.jsx(i.DialogContentText,{children:"Are you sure you want to create a duplicate of this transcript?"})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",children:"Yes"}),m.jsx(i.Button,{variant:"outlined",type:"button",onClick:n,children:"Cancel"})]})]}),d?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:d})}):null]})}function nn(e){const{color:t}=e;return m.jsx(i.SvgIcon,{viewBox:"0 0 18 18",style:{fontSize:18,marginRight:4},...e,children:"disabled"===t?m.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"}):m.jsxs(m.Fragment,{children:[m.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"}),m.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"}),m.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"}),m.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"})]})})}function on(e){const{color:t}=e;return m.jsxs(i.SvgIcon,{viewBox:"0 0 21 21",style:{fontSize:21},...e,children:[m.jsx("rect",{x:"1",y:"1",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#F25022"}),m.jsx("rect",{x:"1",y:"11",width:"9",height:"9",fill:"disabled"===t?"#7B7B7B":"#00A4EF"}),m.jsx("rect",{x:"11",y:"1",width:"9",height:"9",fill:"disabled"===t?"#939393":"#7FBA00"}),m.jsx("rect",{x:"11",y:"11",width:"9",height:"9",fill:"disabled"===t?"#B9B9B9":"#FFB900"})]})}const an=y.makeStyles()((e=>({loginButton:{marginBottom:e.spacing(1),width:"220px",height:"40px",fontSize:"16px",textTransform:"none",justifyContent:"left",padding:"3px 12px"}})));function sn(e){const{classes:t}=an(),{disabled:n}=e;return m.jsx(i.Button,{className:t.loginButton,variant:"outlined",startIcon:m.jsx(nn,{color:n?"disabled":void 0}),...e,children:"Sign in with Google"})}function rn(e){const{classes:t}=an(),{disabled:n}=e;return m.jsx(i.Button,{className:t.loginButton,variant:"outlined",startIcon:m.jsx(on,{color:n?"disabled":void 0}),...e,children:"Sign in with Microsoft"})}function ln(e){const{classes:t}=an();return m.jsx(i.Button,{className:t.loginButton,variant:"outlined",startIcon:m.jsx(_,{fontSize:"small"}),...e,children:"Continue as Guest"})}const cn=y.makeStyles()((e=>({divider:{marginTop:e.spacing(4),marginBottom:e.spacing(5)}}))),dn=({baseURL:e,handleClose:t,name:n})=>{const{classes:o}=cn(),[a,s]=v.useState(""),[r,l]=v.useState([]);function c(e){t("google"===e?"google":"microsoft"===e?"microsoft":"guest")}v.useEffect((()=>{const t=new AbortController,{signal:n}=t;return async function(){const t=new URL("auth/types",e).href,o=await fetch(t,{method:"GET",signal:n});if(!o.ok){const e=await yt(o,"Error when retrieving auth types from server");return void s(e)}const a=await o.json();l(a)}().catch((e=>{k.isAbortException(e)||s(String(e))})),()=>{t.abort(new DOMException("Error retrieving valid authentication types","AbortError"))}}),[e]);const d=r.includes("google"),u=r.includes("microsoft"),g=r.includes("guest");return m.jsxs(Ge,{open:!0,title:`Log in to ${n}`,handleClose:t,maxWidth:!1,"data-testid":"login-apollo",children:[m.jsxs(i.DialogContent,{style:{display:"flex",flexDirection:"column",paddingTop:8},children:[d?m.jsx(sn,{disabled:!d,onClick:()=>{c("google")}}):null,u?m.jsx(rn,{disabled:!u,onClick:()=>{c("microsoft")}}):null,g?m.jsxs(m.Fragment,{children:[m.jsx(i.Divider,{className:o.divider}),m.jsx(ln,{onClick:()=>{c("guest")}})]}):null]}),m.jsx(i.DialogActions,{children:m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:()=>{t()},children:"Cancel"})}),a?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:a})}):null]})},un="undefined"==typeof sessionStorage,gn=n=>a.InternetAccount.named("ApolloInternetAccount").props({type:l.types.literal("ApolloInternetAccount"),configuration:o.ConfigurationReference(n)}).views((e=>({get baseURL(){return o.getConf(e,"baseURL")},getUserId(){const n=e.retrieveToken();if(n)return t.getDecodedToken(n).id}}))).volatile((()=>({role:void 0,controller:new AbortController,tokenPromise:void 0}))).actions((e=>({setRole(){const n=e.retrieveToken();if(!n)return void(e.role=void 0);const o=t.getDecodedToken(n),{role:a,exp:s}=o;if(s<Date.now()/1e3)return e.role=void 0,void e.removeToken();e.role!==a&&(e.role=a)}}))).actions((e=>{const t=e.getFetcher;return{getFetcher(n){const o=t(n);return async(t,n)=>{const a=await o(t,n);return 403===a.status?(e.removeToken(),e.setRole(),o(t,n)):a}}}})).actions((e=>({removeToken(){sessionStorage.removeItem(e.tokenKey),e.tokenPromise=void 0}}))).actions((e=>({async getToken(t){if(e.tokenPromise)return e.tokenPromise;let n=t?.internetAccountPreAuthorization?.authInfo?.token;if(n)return e.tokenPromise=Promise.resolve(n),e.tokenPromise;if(un)throw new Error("Did not get internet account pre-authorization info in worker");return n=e.retrieveToken(),n?(e.tokenPromise=Promise.resolve(n),e.tokenPromise):(e.tokenPromise=new Promise(((t,n)=>{e.getTokenFromUser((n=>{e.storeToken(n),t(n)}),(t=>{e.removeToken(),n(t)}))})),e.tokenPromise)}}))).actions((e=>{let t;return{addMessageChannel(e,n){t=t=>{this.finishOAuthWindow(t,e,n)},window.addEventListener("message",t)},deleteMessageChannel(){window.removeEventListener("message",t)},finishOAuthWindow(t,n,o){if(t.data.name!==`JBrowseAuthWindow-${e.internetAccountId}`)return;const a=t.data.redirectUri.replace("#","?"),s=new URL(a),r=new URLSearchParams(s.search).get("access_token");this.deleteMessageChannel(),r?(e.storeToken(r),e.setRole(),n(r)):o(new Error("Error with token endpoint"))},async openAuthWindow(t,n,o){const a=s.isElectron?"http://localhost/auth":globalThis.location.origin+globalThis.location.pathname,r=new URL("auth/login",e.baseURL),i=new URLSearchParams({type:t,redirect_uri:a});r.search=i.toString();const l=`JBrowseAuthWindow-${e.internetAccountId}`;if(s.isElectron){const{ipcRenderer:t}=globalThis.require("electron"),s=await t.invoke("openAuthWindow",{internetAccountId:e.internetAccountId,data:{redirect_uri:a},url:r.toString()}),i=new MessageEvent("message",{data:{name:l,redirectUri:s}});this.finishOAuthWindow(i,n,o)}else this.addMessageChannel(n,o),window.open(r,l,"width=500,height=600")}}})).actions((e=>({async getTokenFromUser(t,n){const{baseURL:o}=e,a=await new Promise(((t,n)=>{const{session:o}=l.getRoot(e),{baseURL:a,name:s}=e;o.queueDialog((e=>[dn,{name:s,handleClose:o=>{o?o instanceof Error?n(o):t(o):n(new Error("user cancelled entry")),e()},baseURL:a}]))}));if("guest"!==a)return void e.openAuthWindow(a,t,n);const s=new URL("auth/login",o),r=new URLSearchParams({type:a});s.search=r.toString();const i=s.toString(),c=await fetch(i,{signal:e.controller.signal});if(!c.ok){const e=await yt(c,"Error when logging in");return void n(new Error(e))}const{token:d}=await c.json();t(d)}}))).volatile((()=>({lastChangeSequenceNumber:void 0}))).actions((e=>({setLastChangeSequenceNumber(t){e.lastChangeSequenceNumber=t}}))).actions((t=>({updateLastChangeSequenceNumber:l.flow((function*(){const{baseURL:e}=t,n=new URL("changes",e),o=new URLSearchParams({limit:"1"});n.search=o.toString();const a=n.toString(),s=t.getFetcher({locationType:"UriLocation",uri:a});let r;try{r=yield s(a,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!r.ok){const e=yield yt(r,"Error when fetching server LastChangeSequence");throw new Error(e)}const{changes:i}=yield r.json();t.setLastChangeSequenceNumber(i.length>0?i[0].sequence:0)})),getMissingChanges:l.flow((function*(){const{session:n}=l.getRoot(t),{changeManager:o}=n.apolloDataStore;if(!t.lastChangeSequenceNumber)throw new Error("No LastChangeSequence stored in session. Please, refresh you browser to get last updates from server");const{baseURL:a,lastChangeSequenceNumber:s}=t,r=new URL("changes",a),i=new URLSearchParams({since:String(s),sort:"1"});r.search=i.toString();const c=r.toString(),d=t.getFetcher({locationType:"UriLocation",uri:c});let u;try{u=yield d(c,{method:"GET",signal:t.controller.signal})}catch(e){return void(t.controller.signal.aborted||console.error(e))}if(!u.ok)return void console.error(`Error when fetching the last updates to recover socket connection — ${u.status}`);const{changes:g}=yield u.json();for(const t of g){const n=e.Change.fromJSON(t);o.submit(n,{submitToBackend:!1})}}))}))).volatile((e=>{const{origin:t,pathname:n}=new URL("socket.io/",e.baseURL);return{socket:d.io(t,{path:n})}})).actions((n=>({addSocketListeners(){const{session:o}=l.getRoot(n),{notify:a}=o,s=n.retrieveToken();if(!s)throw new Error("No Token found");const r=t.getDecodedToken(s),i=t.makeUserSessionId(r),{socket:c}=n,{addCheckResult:d,changeManager:u,deleteCheckResult:g}=o.apolloDataStore;c.on("connect",(()=>{n.getMissingChanges()})),c.on("connect_error",(e=>{console.error(e),a("Could not connect to the Apollo server.","error")})),c.on("COMMON",(t=>{if("checkResult"in t)return void(t.deleted?g(t.checkResult._id.toString()):d(t.checkResult));if(sessionStorage.setItem("LastChangeSequence",String(t.changeSequence)),t.userSessionId===i)return;const n=e.Change.fromJSON(t.changeInfo);u.submit(n,{submitToBackend:!1})})),c.on("USER_LOCATION",(e=>{const{channel:t,locations:n,userName:a,userSessionId:s}=e;"USER_LOCATION"===t&&s!==i&&o.addOrUpdateCollaborator({name:a,id:s,locations:n})})),c.on("REQUEST_INFORMATION",(e=>{const{channel:t,userSessionId:n}=e;"REQUEST_INFORMATION"===t&&n!==s&&o.broadcastLocations()}))}}))).actions((e=>({postUserLocation:(t=>{let n;return t=>{clearTimeout(n),n=setTimeout((()=>{!async function(t){if(!l.isAlive(e)||"none"===e.role)return;const{baseURL:n,controller:o}=e,a=new URL("users/userLocation",n).href,s=new URLSearchParams(JSON.stringify(t)),r=e.getFetcher({locationType:"UriLocation",uri:a});try{if(!(await r(a,{method:"POST",body:s,signal:o.signal})).ok)throw new Error("ignore")}catch{console.error("Broadcasting user location failed")}}(t)}),300)}})()}))).volatile((()=>({roleNotificationSent:!1}))).actions((e=>{function t(){e.postUserLocation([])}function n(){if("hidden"===document.visibilityState&&e.postUserLocation([]),"visible"===document.visibilityState){const{session:t}=l.getRoot(e);t.broadcastLocations()}}return{initialize:l.flow((function*(o){if("none"===o){if(!e.roleNotificationSent){const{session:t}=l.getRoot(e);t.notify("You have registered as an Apollo user but have not been given access. Ask your administrator to enable access for your account.","warning"),e.roleNotificationSent=!0}return}if("admin"===o){const t=l.getRoot(e);s.isAbstractMenuManager(t)&&function(e){e.appendToMenu("Apollo",{label:"Admin",type:"subMenu",icon:u,subMenu:[{label:"Add Assembly",icon:r,onClick:e=>{e.queueDialog((t=>[St,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Delete Assembly",icon:g,onClick:e=>{e.queueDialog((t=>[Mt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Import Features",icon:f,onClick:e=>{e.queueDialog((t=>[qt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add reference sequence aliases",onClick:e=>{e.queueDialog((t=>[Kt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Add Assembly aliases",onClick:e=>{e.queueDialog((t=>[vt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Users",icon:h,onClick:e=>{e.queueDialog((t=>[Bt,{session:e,handleClose:()=>{t()},changeManager:e.apolloDataStore.changeManager}]))}},{label:"Manage Checks",icon:p,onClick:e=>{e.queueDialog((t=>[_t,{session:e,handleClose:()=>{t()}}]))}}]})}(t)}yield e.updateLastChangeSequenceNumber(),e.addSocketListeners();const{baseURL:a}=e,i=new URL("users/locations",a).href,c=e.getFetcher({locationType:"UriLocation",uri:i});yield c(i,{method:"GET",signal:e.controller.signal}),window.addEventListener("beforeunload",t),document.addEventListener("visibilitychange",n)})),removeBeforeUnloadListener(){window.removeEventListener("beforeunload",t)},removeVisibilityChangeListener(){document.removeEventListener("visibilitychange",n)}}})).actions((e=>({afterAttach(){e.setRole(),c.autorun((async t=>{if(un)return;const{session:n}=l.getRoot(e);if(n&&e.role)try{await e.initialize(e.role),t.dispose()}catch{}}),{name:"ApolloInternetAccount"})},beforeDestroy(){e.removeBeforeUnloadListener(),e.removeVisibilityChangeListener(),e.controller.abort(new DOMException("Cleaning up Apollo connection","AbortError")),e.socket.close()}}))),fn="undefined"==typeof sessionStorage;class hn extends B.BaseAdapter{refNameAliasesP;async getRefNameAliases(){if(this.refNameAliasesP)return this.refNameAliasesP;const e=o.readConfObject(this.config,"assemblyId");if(!fn){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e);if(!n)throw new Error("No backend driver found");return await n.getRefNameAliases(e)}const t=new Promise(((t,n)=>{const o=setTimeout((()=>{n(new Error("timeout"))}),2e4),a=U.nanoid(),s=e=>{const n=e.data;(function(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo&&"refNameAliases"in e})(n)&&n.messageId===a&&(clearTimeout(o),removeEventListener("message",s),t(n.refNameAliases))};addEventListener("message",s),rpcServer.emit("apollo",{apollo:!0,method:"getRefNameAliases",assembly:e,messageId:a})}));return this.refNameAliasesP=t,t}freeResources(){}}var pn=o.ConfigurationSchema("ApolloRefNameAliasAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});function mn(e){return"object"==typeof e&&null!==e&&"apollo"in e&&!0===e.apollo}const yn="undefined"==typeof sessionStorage;class bn extends B.BaseSequenceAdapter{regions;async getRefNames(){return(await this.getRegions()).map((e=>e.refName))}async getRegions(){if(this.regions)return this.regions;const e=o.readConfObject(this.config,"assemblyId");if(!yn){const t=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!t)throw new Error("No Apollo data store found");const n=t.getBackendDriver(e);if(!n)throw new Error("No backend driver found");const o=await n.getRegions(e);return this.regions=o,o}const t=await new Promise(((t,n)=>{const o=setTimeout((()=>{n("timeout")}),2e4),a=U.nanoid(),s=e=>{const{data:n}=e;mn(n)&&n.messageId===a&&(clearTimeout(o),removeEventListener("message",s),t(n.regions))};addEventListener("message",s),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getRegions",assembly:e,messageId:a})}));return this.regions=t,t}getFeatures(e){const{end:t,refName:n,start:a}=e,s=o.readConfObject(this.config,"assemblyId"),r={...e,assemblyName:s};return $.ObservableCreate((async e=>{if(!yn){const o=this.pluginManager?.rootModel?.session?.apolloDataStore;if(!o)return void e.error("No Apollo data store found");const i=o.getBackendDriver(s);if(!i)return void e.error("No backend driver found");const l=(await i.getRegions(r.assemblyName)).find((e=>e.refName===r.refName));if(!l)return void e.error("Cannot get region");r.end>l.end&&(r.end=l.end);const{seq:c}=await i.getSequence(r);return e.next(new z({id:`${n} ${a}-${t}`,data:{refName:n,start:a,end:t,seq:c}})),void e.complete()}const o=await new Promise(((e,t)=>{const n=setTimeout((()=>{t("timeout")}),2e4),o=U.nanoid(),a=t=>{const{data:s}=t;mn(s)&&s.messageId===o&&(clearTimeout(n),removeEventListener("message",a),e(s.sequence))};addEventListener("message",a),globalThis.rpcServer.emit("apollo",{apollo:!0,method:"getSequence",region:r,messageId:o})}));e.next(new z({id:`${n} ${a}-${t}`,data:{refName:n,start:a,end:t,seq:o}})),e.complete()}))}freeResources(){}}var xn=o.ConfigurationSchema("ApolloSequenceAdapter",{assemblyId:{type:"string",defaultValue:""}},{explicitlyTyped:!0});function wn(e,t){const{children:n,indexedIds:o,allIds:a,...s}=t;if(JSON.stringify(s).includes(e))return t;if(n)for(const t of Object.values(n)){const n=wn(e,t);if(n)return n}}class Sn extends B.BaseAdapter{get baseURL(){return o.readConfObject(this.config,"baseURL").uri}get trackId(){return o.readConfObject(this.config,"trackId")}get assemblyNames(){return o.readConfObject(this.config,"assemblyNames")}mapBaseResult(e,t,n){return e.map((e=>{const o=wn(n,e)??e,a=t.getCanonicalRefName(e.refSeq);return new W({label:n,trackId:this.trackId,locString:`${a}:${o.min+1}..${o.max}`,matchedObject:o})}))}async searchIndex(e){const t=e.queryString,n=[],o=this.pluginManager?.rootModel?.session;if(!o)return n;const{apolloDataStore:a}=o,{assemblyManager:s}=o;for(const o of this.assemblyNames){const r=a.getBackendDriver(o),i=s.get(o);if(!r||!i)continue;const l=await r.searchFeatures(e.queryString,[o]);n.push(...this.mapBaseResult(l,i,t))}return n}freeResources(){}}var Cn=o.ConfigurationSchema("ApolloTextSearchAdapter",{assemblyNames:{type:"stringArray",defaultValue:[],description:"List of assemblies covered by text search adapter"},trackId:{type:"string",defaultValue:""},baseURL:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}},{explicitlyTyped:!0,explicitIdentifier:"textSearchAdapterId"});const vn=y.makeStyles()((e=>({attributeKey:{fontWeight:"bold",marginRight:e.spacing(2)}})));function jn({attributeKey:e}){const{classes:n}=vn(),o=/^[A-Z]/.test(e);let a,s=e;return t.isGFFInternalAttribute(e)?(s=t.internalToGFF[e],a=`On GFF3 export, this will be assigned to the GFF3's reserved "${s}" attribute`):t.isGFFColumnInternal(e)?(s=t.gffInternalToColumn[e],a=`On GFF3 export, this will be placed in the GFF3's "${s}" column`):o&&(a="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"),m.jsxs("div",{style:{display:"flex"},children:[m.jsx(i.Typography,{className:n.attributeKey,children:s}),a?m.jsx(i.Tooltip,{title:a,children:m.jsx(i.Chip,{icon:m.jsx(b,{}),label:"GFF3",size:"small",variant:"outlined"})}):null]})}const Tn="Custom",An={[Tn]:"custom"};for(const[e,n]of Object.entries(t.gffToInternal))An[`GFF ${n}`]=e;for(const[e,n]of Object.entries(t.gffColumnToInternal))An[`GFF ${n}`]=e;const Fn=E.observer((function({setKey:e,session:t}){const{pluginManager:n}=s.getEnv(t),o=n.evaluateExtensionPoint("Apollo-ReservedAttributeKeys",An),a=Object.keys(o).at(0)??Tn,[r,l]=v.useState(a),[c,d]=v.useState(),u=r===Tn;return m.jsxs("form",{onSubmit:function(t){t.preventDefault(),e(u?c:o[r])},children:[m.jsxs("div",{style:{display:"flex",flexDirection:"column",margin:8},children:[m.jsxs(i.FormControl,{variant:"outlined",children:[m.jsx(i.InputLabel,{id:"attribute-key-select-label",children:"Key"}),m.jsx(i.Select,{labelId:"attribute-key-select-label",value:r,label:"Key",onChange:e=>{l(e.target.value)},children:Object.keys(o).map((e=>m.jsx(i.MenuItem,{value:e,children:e},e)))})]}),u?m.jsx(i.TextField,{label:"Attribute key",variant:"outlined",id:"attributeKey",onChange:e=>{d(e.target.value)}}):null]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{color:"primary",variant:"contained",type:"submit",disabled:u&&!c,children:"Add"}),m.jsx(i.Button,{variant:"outlined",onClick:function(){e()},children:"Cancel"})]})]})})),kn=E.observer((function({onChangeCommitted:e,value:t,...n}){const[o,a]=v.useState(String(t)),[s,r]=v.useState(!1),[l,c]=v.useState(null);return v.useEffect((()=>{a(String(t))}),[t]),v.useEffect((()=>{s&&(l?.blur(),r(!1))}),[s,l]),m.jsx(i.TextField,{...n,type:"text",onChange:function(e){a(e.target.value)},value:o,onKeyDown:e=>{"Enter"===e.key?l?.blur():"Escape"===e.key&&(a(String(t)),r(!0))},onBlur:()=>{o!==String(t)&&e(o)},inputRef:e=>{c(e)}})})),Dn=E.observer((function({attributeValues:e,setAttribute:t,isNew:n=!1}){const[o,a]=v.useState(e&&e.length>0?e:[""]);return m.jsxs(m.Fragment,{children:[o.map(((e,t)=>m.jsxs("div",{style:{display:"flex"},children:[m.jsx(kn,{value:e,onChangeCommitted:e=>{!function(e,t){a((n=>{const o=[...n];return o[e]=t,o}))}(t,e)},variant:"outlined",fullWidth:!0}),m.jsx(i.IconButton,{"aria-label":"delete",size:"medium",edge:"end",onClick:()=>{!function(e){a((t=>{const n=[...t];return n.splice(e,1),n}))}(t)},children:m.jsx(g,{fontSize:"inherit"})})]},`${t}-${e}`))),m.jsx(i.IconButton,{"aria-label":"add",size:"medium",color:"secondary",edge:"start",onClick:function(){a((e=>{const t=[...e];return t.push(""),t}))},children:m.jsx(J,{fontSize:"inherit"})}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{color:"primary",variant:"contained",onClick:()=>{t(o.filter(Boolean))},children:n?"Add":"Update"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:()=>{t()},children:"Cancel"})]})]})}));function Nn({values:e}){return m.jsx(m.Fragment,{children:e?.map(((e,t)=>m.jsx(i.Typography,{variant:"body2",color:"textSecondary",children:e},`${t}.${e}`)))})}const In=y.makeStyles()((e=>({list:{"li:nth-of-type(odd)":{backgroundColor:e.palette.action.focus},"li:nth-of-type(even)":{backgroundColor:e.palette.action.hover}}}))),Rn=E.observer((function({assembly:e,editable:n,feature:o,session:a}){const{pluginManager:r}=s.getEnv(a),{classes:d}=In(),[u,f]=v.useState(null),[h,p]=v.useState(null),[y,b]=v.useState(null),[x,w]=v.useState(!1),[S,C]=v.useState(),j=Boolean(u),{changeManager:T}=a.apolloDataStore,{notify:A}=a;function F(){f(null),p(null)}const{_id:k,attributes:D}=o,N=r.evaluateExtensionPoint("Apollo-AttributeEditorComponent",Dn,{key:S});return m.jsxs(m.Fragment,{children:[m.jsxs(i.List,{className:d.list,children:[c.entries(D).map((([s,c])=>{const d=r.evaluateExtensionPoint("Apollo-AttributeEditorComponent",Dn,{key:s}),u=r.evaluateExtensionPoint("Apollo-AttributeViewerComponent",Nn,{key:s});return m.jsx(i.ListItem,{secondaryAction:n&&!y?m.jsx(i.IconButton,{edge:"end",onClick:e=>{!function(e,t){f(e.currentTarget),p(t)}(e,s)},children:m.jsx(V,{})}):null,children:m.jsx(i.ListItemText,{disableTypography:!0,primary:m.jsx(jn,{attributeKey:s}),secondary:y===s?m.jsx(d,{session:a,attributeValues:c,setAttribute:n=>{b(null),n&&function(n,a){const s={...l.getSnapshot(D)},r=structuredClone(s);if(!(n in s))return void A(`"${n}" not found in feature attributes`,"error");if(s[n].toString()===a.toString())return;s[n]=a;const i=new t.FeatureAttributeChange({changedIds:[o._id],typeName:"FeatureAttributeChange",assembly:e,featureId:o._id,oldAttributes:r,newAttributes:s});T.submit(i)}(s,n)}}):m.jsx(u,{values:c})})},s)})),S?m.jsx(i.ListItem,{children:m.jsx(i.ListItemText,{disableTypography:!0,primary:m.jsx(jn,{attributeKey:S}),secondary:m.jsx(N,{session:a,attributeValues:[],setAttribute:n=>{n&&function(n,a){const s={...l.getSnapshot(D)},r=structuredClone(s);if(n in s)return void A(`Feature already has attribute "${n}"`,"error");s[n]=a;const i=new t.FeatureAttributeChange({changedIds:[o._id],typeName:"FeatureAttributeChange",assembly:e,featureId:o._id,oldAttributes:r,newAttributes:s});T.submit(i)}(S,n),C(void 0)},isNew:!0})})}):null]}),n?m.jsx(i.Button,{color:"primary",variant:"contained",disabled:x||Boolean(S),onClick:()=>{w(!0)},children:"Add new"}):null,x?m.jsx(i.Paper,{variant:"outlined",style:{marginTop:8},children:m.jsx(Fn,{session:a,setKey:e=>{C(e),w(!1)}})}):null,m.jsxs(i.Menu,{anchorEl:u,open:j,onClose:F,children:[m.jsxs(i.MenuItem,{onClick:function(){h&&function(n){const o=l.getSnapshot(D),{[n]:a,...s}=o,r=new t.FeatureAttributeChange({changedIds:[k],typeName:"FeatureAttributeChange",assembly:e,featureId:k,oldAttributes:o,newAttributes:s});T.submit(r)}(h),F()},children:[m.jsx(i.ListItemIcon,{children:m.jsx(g,{fontSize:"small"})}),m.jsx(i.Typography,{variant:"inherit",children:"Delete"})]}),m.jsxs(i.MenuItem,{onClick:function(){h&&b(h),F()},children:[m.jsx(i.ListItemIcon,{children:m.jsx(H,{fontSize:"small"})}),m.jsx(i.Typography,{variant:"inherit",children:"Edit"})]})]})]})})),Mn=E.observer((function({onChangeCommitted:e,value:t,...n}){const[o,a]=v.useState(String(t)),[s,r]=v.useState(!1),[l,c]=v.useState(null);v.useEffect((()=>{a(String(t))}),[t]),v.useEffect((()=>{s&&(l?.blur(),r(!1))}),[s,l]);const d=Number.isNaN(Number(o));return m.jsx(i.TextField,{...n,type:"text",onChange:function(e){a(e.target.value)},value:o,onKeyDown:e=>{"Enter"===e.key?l?.blur():"Escape"===e.key&&(a(String(t)),r(!0))},onBlur:()=>{const n=Number(o);o!==String(t)&&(Number.isNaN(n)?a(String(t)):e(n)||a(String(t)))},inputRef:e=>{c(e)},error:d,helperText:d?"Not a valid number":void 0})})),En=E.observer((function({assembly:e,feature:n,session:o}){const[a,s]=v.useState(""),[r,l]=v.useState(""),{_id:c,assemblyId:d,max:u,min:g,strand:f,type:h}=n,p=e=>{o.notify(e.message,"error")},{changeManager:y}=o.apolloDataStore;function b(n){const{value:o}=n.target,a=o?Number(o):void 0,s=new t.StrandChange({typeName:"StrandChange",changedIds:[c],featureId:c,oldStrand:f,newStrand:a,assembly:e});return y.submit(s)}return m.jsxs("div",{"data-testid":"basic_information",children:[m.jsx(Mn,{margin:"dense",id:"start",label:"Start",fullWidth:!0,variant:"outlined",value:g+1,onChangeCommitted:function(n){n--;const o=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[c],featureId:c,oldStart:g,newStart:n,assembly:e});return y.submit(o),!0}}),m.jsx(Mn,{margin:"dense",id:"end",label:"End",fullWidth:!0,variant:"outlined",value:u,onChangeCommitted:function(n){const o=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[c],featureId:c,oldEnd:u,newEnd:n,assembly:e});return y.submit(o),!0}}),m.jsx(He,{session:o,ontologyName:"Sequence Ontology",value:h,filterTerms:Ie,fetchValidTerms:async function(e,t,n){const o=await ze(e,t);if(o)return o;l(`Type "${e?.type}" does not have any children in the ontology`)}.bind(null,n),renderInput:e=>m.jsx(i.TextField,{...e,label:"Type",variant:"outlined",fullWidth:!0,error:Boolean(r),helperText:r}),onChange:(e,n)=>{n&&function(e){s("");const n=new t.TypeChange({typeName:"TypeChange",changedIds:[c],featureId:c,oldType:h,newType:e,assembly:d});return y.submit(n)}(n).catch(p)}}),m.jsxs("label",{children:[m.jsx("input",{type:"radio",value:"1",checked:1===f,onChange:b}),"Positive Strand (+)"]}),m.jsxs("label",{children:[m.jsx("input",{type:"radio",value:"-1",checked:-1===f,onChange:b}),"Negative Strand (-)"]}),m.jsxs("label",{children:[m.jsx("input",{type:"radio",value:"",checked:void 0===f,onChange:b}),"No Strand Information"]}),a?m.jsx(i.Typography,{color:"error",children:a}):null]})})),Ln=E.observer((function(e){const{feature:t,model:n}=e,{children:o,parent:a}=t,s=[];if(o)for(const[,e]of o)s.push(e);return a??s.length>0?m.jsxs("div",{style:{marginTop:10},children:[a&&m.jsxs("div",{children:[m.jsx(i.Typography,{variant:"h6",children:"Parent:"}),m.jsxs(i.Button,{variant:"contained",onClick:()=>{n.setFeature(a)},children:[a.type,pe(a)," (",a.min,"..",a.max,")"]})]}),s.length>0&&m.jsxs("div",{children:[m.jsxs(i.Typography,{variant:"h6",children:[1===s.length?"Child":"Children",":"]}),s.map((e=>m.jsx("div",{style:{marginBottom:5},children:m.jsxs(i.Button,{variant:"contained",onClick:()=>{n.setFeature(e)},children:[e.type,pe(e)," (",e.min,"..",e.max,")"]})},e._id)))]})]}):null})),qn=y.makeStyles()({sequence:{width:"100%",resize:"vertical"}}),Pn=E.observer((function({assembly:e,feature:t,refName:n,session:o}){const a=o.apolloDataStore.assemblies.get(e),{classes:s}=qn();if(!t||!a)return null;const r=a.getByRefName(n);if(!r)return null;const{max:i,min:l}=t;let c=r.getSequence(l,i);return c?c=function(e,t,n,o,a){return`>${t}:${n+1}–${o}\n${e}`}(c,n,l,i):o.apolloDataStore.loadRefSeq([{assemblyName:e,refName:n,start:l,end:i}]),m.jsx("div",{children:m.jsx("textarea",{readOnly:!0,rows:20,className:s.sequence,value:c})})})),_n=y.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),On=E.observer((function(e){const{model:t}=e,{assembly:n,feature:o,refName:a}=t,r=s.getSession(t),l=r.apolloDataStore.assemblies.get(n),{classes:c}=_n(),[d,u]=v.useState(["attributes"]);if(v.useEffect((()=>{u(["attributes"])}),[o]),!o||!l)return null;const g=l.getByRefName(a);if(!g)return null;const{max:f,min:h}=o;function p(e,t){u(e?[...d,t]:d.filter((e=>e!==t)))}return g.getSequence(h,f)||r.apolloDataStore.loadRefSeq([{assemblyName:n,refName:a,start:h,end:f}]),m.jsxs("div",{className:c.root,children:[m.jsx(En,{feature:o,session:r,assembly:l._id}),m.jsxs(i.Accordion,{style:{marginTop:10},expanded:d.includes("attributes"),onChange:(e,t)=>{p(t,"attributes")},children:[m.jsx(i.AccordionSummary,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header",children:m.jsx(i.Typography,{component:"span",children:"Attributes"})}),m.jsx(i.AccordionDetails,{children:m.jsx(Rn,{feature:o,session:r,assembly:l._id,editable:!0})})]}),m.jsxs(i.Accordion,{style:{marginTop:10},expanded:d.includes("sequence"),onChange:(e,t)=>{p(t,"sequence")},children:[m.jsx(i.AccordionSummary,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header",children:m.jsx(i.Typography,{component:"span",children:"Sequence"})}),m.jsx(i.AccordionDetails,{children:d.includes("sequence")&&m.jsx(Pn,{feature:o,session:r,assembly:l._id,refName:a})})]}),m.jsxs(i.Accordion,{style:{marginTop:10},expanded:d.includes("related_features"),onChange:(e,t)=>{p(t,"related_features")},children:[m.jsx(i.AccordionSummary,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header",children:m.jsx(i.Typography,{component:"span",children:"Related features"})}),m.jsx(i.AccordionDetails,{children:m.jsx(Ln,{model:t,feature:o})})]})]})})),Bn=l.types.model("ApolloFeatureDetailsWidget",{id:A.ElementId,type:l.types.literal("ApolloFeatureDetailsWidget"),feature:l.types.maybe(l.types.reference(X.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:l.types.string,refName:l.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((t=>{if(!e.tryReload)return;const n=s.getSession(e),{apolloDataStore:o}=n;if(!o)return;const a=o.getFeature(e.tryReload);a&&(e.setFeature(a),e.setTryReload(),t.dispose())})))}}))),Un=l.types.model("ApolloTranscriptDetails",{id:A.ElementId,type:l.types.literal("ApolloTranscriptDetails"),feature:l.types.maybe(l.types.reference(X.AnnotationFeatureModel,{onInvalidated(e){e.parent.setTryReload(e.invalidId),e.removeRef()}})),assembly:l.types.string,refName:l.types.string}).volatile((()=>({tryReload:void 0}))).actions((e=>({setFeature(t){e.feature=t},setTryReload(t){e.tryReload=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((t=>{if(!e.tryReload)return;const n=s.getSession(e),{apolloDataStore:o}=n;if(!o)return;const a=o.getFeature(e.tryReload);a&&(e.setFeature(a),e.setTryReload(),t.dispose())})))}})));async function $n(e){if(isSecureContext){const t=new Blob([e.outerText],{type:"text/plain"}),n=new Blob([e.outerHTML],{type:"text/html"}),o=new ClipboardItem({[t.type]:t,[n.type]:n});return navigator.clipboard.write([o])}const t=t=>{t.clipboardData?.setData("text/plain",e.outerText),t.clipboardData?.setData("text/html",e.outerHTML),t.preventDefault()};document.addEventListener("copy",t),document.execCommand("copy"),document.removeEventListener("copy",t)}function zn(e){let t=0;for(const n of e)t+=n.sequence.length;return t}function Wn(e,t,n){const o=[],{cdsLocations:a,strand:r,transcriptParts:i}=t;switch(e){case"genomic":case"cDNA":{const[t]=i;for(const a of t){if("cDNA"===e&&"intron"===a.type)continue;let t=n(a.min,a.max);-1===r&&(t=s.revcom(t));const i="fivePrimeUTR"===a.type||"threePrimeUTR"===a.type?"UTR":a.type,l=o.at(-1);l&&l.type===i?(l.sequence+=t,l.locs.push({min:a.min,max:a.max})):o.push({type:i,sequence:t,locs:[{min:a.min,max:a.max}]})}return o}case"CDS":{let e="";const[t]=a,i=[];for(const o of t){let t=n(o.min,o.max);-1===r&&(t=s.revcom(t)),e+=t,i.push({min:o.min,max:o.max})}return o.push({type:"CDS",sequence:e,locs:i}),o}case"protein":{let e="";const[t]=a,i=[];for(const o of t){let t=n(o.min,o.max);-1===r&&(t=s.revcom(t)),e+=t,i.push({min:o.min,max:o.max})}let l="";for(let t=0;t<e.length;t+=3){const n=e.slice(t,t+3).toUpperCase();l+=s.defaultCodonTable[n]||"&"}return o.push({type:"protein",sequence:l,locs:i}),o}}}function Gn(e){switch(e){case"upOrDownstream":return"rgb(255,255,255)";case"exon":case"UTR":return"rgb(194,106,119)";case"CDS":return"rgb(93,168,153)";case"intron":return"rgb(187,187,187)";case"protein":return"rgb(148,203,236)"}}function Hn(e){const t=[],n=e.flatMap((e=>e.locs));let[o]=n;for(let e=1;e<n.length;e++)o.min===n[e].max||o.max===n[e].min?o={min:Math.min(o.min,n[e].min),max:Math.max(o.max,n[e].max)}:(t.push(o),o=n[e]);return t.push(o),t}const Vn=E.observer((function({assembly:e,feature:n,refName:o,session:a}){const s=a.apolloDataStore.assemblies.get(e),r=s?.getByRefName(o),{featureTypeOntology:l}=a.apolloDataStore.ontologyManager,c="genomic",d=["genomic","cDNA"],[u,g]=v.useState(d),[f,h]=v.useState(c),[p,y]=v.useState((()=>r?Wn(c,n,((e,t)=>r.getSequence(e,t))):[])),[b,x]=v.useState((()=>Hn(p))),w=i.useTheme(),S=v.useRef(null);if(v.useEffect((()=>{const{cdsLocations:e}=n,[t]=e;g(t.length>0?[...d,"CDS","protein"]:d)}),[n]),!s||!r)return null;const C=s.getByRefName(o);if(!C)return null;if(!l)throw new Error("featureTypeOntology is undefined");return l.isTypeOf(n.type,"transcript")?m.jsxs(m.Fragment,{children:[m.jsx(i.Select,{defaultValue:"genomic",value:f,onChange:function(e){const t=e.target.value;h(t);const o=r?Wn(t,n,((e,t)=>r.getSequence(e,t))):[],a=Hn(o);y(o),x(a)},size:"small","data-testid":"sequenceOptionSelector",children:u.map((e=>m.jsx(i.MenuItem,{value:e,"data-testid":`sequenceOption-${e}`,children:e},e)))}),m.jsx(i.Button,{variant:"contained",onClick:()=>{const e=S.current;e&&$n(e)},style:{marginLeft:10},size:"medium",children:"Copy sequence"}),m.jsxs(i.Paper,{style:{fontFamily:"monospace",padding:w.spacing(),overflowX:"auto"},ref:S,children:[">",C.name,":",b.map((e=>1===n.strand?`${e.min+1}-${e.max}`:`${e.max}-${e.min+1}`)).join(";"),"(strand=",1===n.strand?"+":"-",";length=",zn(p),")",m.jsx("br",{}),function(e,n){const o=[];let a=0;for(const[n,s]of e.entries()){const e=a%60,r=a>0&&0===e?"\n":"";a+=s.sequence.length;const i=r+s.sequence.slice(0,60-e),l=[i,...t.splitStringIntoChunks(s.sequence.slice(i.length),60)],c=m.jsx("span",{style:{background:Gn(s.type),color:w.palette.getContrastText(Gn(s.type)),whiteSpace:"pre-line"},children:l.join("\n")},`${s.type}-${n}`);o.push(c)}return o}(p)]})]}):null})),Jn=K(Mn)((()=>({"&.MuiFormControl-root":{marginTop:0,marginBottom:0,width:"100%"},"& .MuiInputBase-input":{fontSize:12,height:20,padding:1,paddingLeft:10}}))),Xn=K("div")({display:"flex",justifyContent:"center",alignItems:"center",textAlign:"left",width:"100%",overflowWrap:"break-word",wordWrap:"break-word",wordBreak:"break-all","& span":{fontSize:12}}),Kn=K(i.AccordionSummary)((()=>({minHeight:30,maxHeight:30,"&.Mui-expanded":{minHeight:30,maxHeight:30}}))),Zn=e=>{const{strand:t}=e;return m.jsx("div",{children:1===t?m.jsx(r,{}):-1===t?m.jsx(Q,{}):m.jsx(i.Typography,{component:"span",children:"N/A"})})},Yn=E.observer((function({assembly:e,feature:n,refName:o,session:a}){const{notify:r}=a,l=a.apolloDataStore.assemblies.get(e),c=l?.getByRefName(o),{changeManager:d}=a.apolloDataStore,u=v.useRef(null),{changeInProgress:g}=a;if(!c)return null;const{apolloDataStore:f}=a,{featureTypeOntology:h}=f.ontologyManager;if(!h.isTypeOf(n.type,"transcript")&&!h.isTypeOf(n.type,"pseudogenic_transcript"))throw new Error("Feature is not a transcript or equivalent");const{cdsLocations:p,transcriptExonParts:y,strand:b}=n,[x]=p,[w,S]=((e,t)=>{const{transcriptExonParts:n}=e,o=n.filter((e=>t.isTypeOf(e.type,"exon"))).sort((({min:e},{min:t})=>e-t)),a=o[0]?.min,s=o[o.length-1]?.max;return[a,s]})(n,h);let C=w,j=S;const T=x.length>0;if(T){const e=x.toSorted((({min:e},{min:t})=>e-t));C=e[0].min,j=e[e.length-1].max}const A=(n,o,a,s,i)=>{if(!a.children)throw new Error("Transcript should have child features");if(n===o)return!0;const l=N(a,h,n,s);if(!l)return r("No matching CDS feature found","error"),!1;if(s&&o>=l.max)return r("Start location should be less than CDS end location","error"),!1;if(!s&&o<=l.min)return r("End location should be greater than CDS start location","error"),!1;if(!E(a,h,o,s))return r("There should be an overlapping exon for the new CDS location","error"),!1;const c=s?new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[l._id],featureId:l._id,oldStart:l.min,newStart:o,assembly:e}):new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[l._id],featureId:l._id,oldEnd:l.max,newEnd:o,assembly:e});return d.submit(c).then((()=>{i&&i()})).catch((()=>{r("Error updating feature CDS position","error")})),!0};function F(n,o,a,s){if(!a.children)throw new Error("Transcript should have child features");const{matchingExon:i,prevExon:l,nextExon:c}=L(a,h,n,s);if(!i)return r("No matching exon found","error"),!1;if(s&&o>=i.max)return r("Start location should be less than end location","error"),!1;if(!s&&o<=i.min)return r("End location should be greater than start location","error"),!1;if(l&&l.max+2>o)return r("Error while changing start location","error"),!1;if(c&&c.min-2<o)return r("Error while changing end location","error"),!1;const u=R(a,i.min,i.max,h);if(!u)return r("No matching exon feature found","error"),!1;const g=I(a,h);if(s&&o!==i.min){const n=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[],changes:[],assembly:e});if(l)D(u,n,o);else{const e=a.min,t=a.parent;if(o<e)t&&o<t.min&&D(t,n,o),D(a,n,o),D(u,n,o);else if(o>e&&(D(u,n,o),D(a,n,o),t)){const[e]=M(t,a,o,h,s);t.min!=e&&D(t,n,e)}}g&&g.min>=i.min&&g.min<=i.max&&o>g.min&&D(g,n,o),d.submit(n).catch((()=>{r("Error updating feature exon start position","error")}))}if(!s&&o!==i.max){const n=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[],changes:[],assembly:e});if(c)k(u,n,o);else{const e=a.max,t=a.parent;if(o>e)t&&o>t.max&&k(t,n,o),k(a,n,o),k(u,n,o);else if(o<e&&(k(u,n,o),k(a,n,o),t)){const[,e]=M(t,a,o,h,s);t.max!=e&&k(t,n,e)}}g&&g.max>=i.min&&g.max<=i.max&&o<g.max&&k(g,n,o),d.submit(n).catch((()=>{r("Error updating feature exon end position","error")}))}return!0}const k=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldEnd:e.max,newEnd:n})},D=(e,t,n)=>{t.changedIds.push(e._id),t.changes.push({featureId:e._id,oldStart:e.min,newStart:n})},N=(e,t,n,o)=>{let a;for(const[,s]of e.children??[])if(t.isTypeOf(s.type,"CDS")){if(o&&n===s.min){a=s;break}if(!o&&n===s.max){a=s;break}}return a},I=(e,t)=>{let n;for(const[,o]of e.children??[])if(t.isTypeOf(o.type,"CDS")){n=o;break}return n},R=(e,t,n,o)=>{let a;for(const[,s]of e.children??[])if(o.isTypeOf(s.type,"exon")&&t===s.min&&n===s.max){a=s;break}return a},M=(e,t,n,o,a)=>{const s=[],r=[];for(const[,i]of e.children?.entries()??[])o.isTypeOf(i.type,"transcript")&&(i._id===t._id?a?(s.push(n),r.push(i.max)):(r.push(n),s.push(i.min)):(s.push(i.min),r.push(i.max)));return[Math.min(...s),Math.max(...r)]},E=(e,t,n,o)=>{const{transcriptExonParts:a}=e;let s;for(const[,e]of a.entries())if(t.isTypeOf(e.type,"exon")){if(!o&&n>=e.min&&n<=e.max){s=e;break}if(o&&n>=e.min&&n<=e.max){s=e;break}}return s},L=(e,t,n,o)=>{const{transcriptExonParts:a,strand:s}=e;let r,i,l,c;for(const[e,s]of a.entries())if(t.isTypeOf(s.type,"exon")){if(o&&s.min===n){r=s,i=e;break}if(!o&&s.max===n){r=s,i=e;break}}if(r&&void 0!==i){if(1===s&&i>0)for(let e=i-1;e>=0;e--){const n=a[e];if(t.isTypeOf(n.type,"exon")){l=n;break}}if(-1===s&&i<a.length-1)for(let e=i+1;e<a.length;e++){const n=a[e];if(t.isTypeOf(n.type,"exon")){l=n;break}}if(1===s&&i<a.length-1)for(let e=i+1;e<a.length;e++){const n=a[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}if(-1===s&&i>0)for(let e=i-1;e>=0;e--){const n=a[e];if(t.isTypeOf(n.type,"exon")){c=n;break}}}return{matchingExon:r,prevExon:l,nextExon:c}},q=(e,t)=>{let n="";if(t>0){const o=y[t-1];1===b?"intron"===o.type&&(n=c.getSequence(e.min-2,e.min)):"intron"===o.type&&(n=s.revcom(c.getSequence(e.max,e.max+2)))}return n=n.toUpperCase(),[{spliceSite:n,color:"AG"===n?"green":"red"}]},P=(e,t)=>{let n="";if(t<y.length-1){const o=y[t+1];1===b?"intron"===o.type&&(n=c.getSequence(e.max,e.max+2)):"intron"===o.type&&(n=s.revcom(c.getSequence(e.min-2,e.min)))}return n=n.toUpperCase(),[{spliceSite:n,color:"GT"===n?"green":"red"}]},_=()=>{let e="";const[t]=p,o=t.toSorted((({min:e},{min:t})=>e-t));for(const t of o)e+=c.getSequence(t.min,t.max);-1===b&&(e=s.revcom(e));const a=[];for(let t=0;t<e.length;t+=3){const o=e.slice(t,t+3).toUpperCase(),r=s.defaultCodonTable[o]||"&";"ATG"===o?a.push(m.jsx(i.Typography,{component:"span",style:{backgroundColor:g?"lightgray":"yellow",cursor:"pointer",border:"1px solid black"},onClick:()=>{if(g)return;const e=O(t);e!==C&&1===b&&A(C,e,n,!0),e!==j&&-1===b&&A(j,e,n,!1)},children:r},t)):["TAA","TAG","TGA"].includes(o)?a.push(m.jsx(i.Typography,{style:{backgroundColor:"red",color:"white"},component:"span",children:r},t)):a.push(m.jsx(i.Typography,{component:"span",children:r},t))}return a},O=e=>{const[t]=p;let n=0;const o=t.toSorted((({min:e},{min:t})=>e-t));if(1===b)for(const t of o){const o=t.max-t.min;if(n+o>e)return t.min+(e-n);n+=o}else if(-1===b)for(let t=o.length-1;t>=0;t--){const a=o[t],s=a.max-a.min;if(n+s>e)return a.max-(e-n);n+=s}return 1===b?C:j};return m.jsxs("div",{children:[T&&m.jsx("div",{children:m.jsxs(i.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center"},children:[m.jsx(i.Grid,{size:1}),m.jsx(i.Grid,1===b?{size:4,children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:C+1,onChangeCommitted:e=>A(C,e-1,n,!0),style:{border:"1px solid black",borderRadius:5},disabled:g})}:{size:4,children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:j,onChangeCommitted:e=>A(j,e,n,!1),style:{border:"1px solid black",borderRadius:5},disabled:g})}),m.jsx(i.Grid,{size:2,children:m.jsx(i.Typography,{component:"span",children:"CDS"})}),m.jsx(i.Grid,1===b?{size:4,children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:j,onChangeCommitted:e=>A(j,e,n,!1),style:{border:"1px solid black",borderRadius:5},disabled:g})}:{size:4,children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:C+1,onChangeCommitted:e=>A(C,e-1,n,!0),style:{border:"1px solid black",borderRadius:5},disabled:g})}),m.jsx(i.Grid,{size:1})]})}),m.jsxs("div",{style:{marginTop:5,marginBottom:10},children:[m.jsx("div",{style:{textAlign:"center"},children:m.jsx(i.Typography,{children:"Exons"})}),y.map(((e,t)=>m.jsx("div",{children:"exon"===e.type&&m.jsxs(i.Grid,{container:!0,justifyContent:"center",alignItems:"center",style:{textAlign:"center"},children:[m.jsx(i.Grid,{size:1,children:0!==t&&q(e,t).map(((e,t)=>m.jsx(i.Typography,{component:"span",color:e.color,children:e.spliceSite},t)))}),m.jsx(i.Grid,1===b?{size:4,style:{padding:0},children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>F(e.min,t-1,n,!0),disabled:g})}:{size:4,style:{padding:0},children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>F(e.max,t,n,!1),disabled:g})}),m.jsx(i.Grid,{size:2,children:m.jsx(Zn,{strand:n.strand})}),m.jsx(i.Grid,1===b?{size:4,style:{padding:0},children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:e.max,onChangeCommitted:t=>F(e.max,t,n,!1),disabled:g})}:{size:4,style:{padding:0},children:m.jsx(Jn,{margin:"dense",variant:"outlined",value:e.min+1,onChangeCommitted:t=>F(e.min,t-1,n,!0),disabled:g})}),m.jsx(i.Grid,{size:1,children:t!==y.length-1&&P(e,t).map(((e,t)=>m.jsx(i.Typography,{component:"span",color:e.color,children:e.spliceSite},t)))})]})},t)))]}),T&&m.jsx("div",{children:m.jsxs(i.Accordion,{children:[m.jsx(Kn,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Translation"})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(Xn,{children:m.jsx(i.Typography,{component:"span",ref:u,style:{maxHeight:120,overflowY:"scroll"},children:_()})}),m.jsxs("div",{style:{marginTop:10,display:"flex",flexDirection:"row",alignItems:"center",gap:10},children:[m.jsx(i.Tooltip,{title:"Copy",children:m.jsx("button",{onClick:()=>{const e=u.current;e&&$n(e)},style:{border:"none",background:"none",padding:0},disabled:g,children:m.jsx(Z,{style:{fontSize:15}})})}),m.jsx(i.Tooltip,{title:"Trim",children:m.jsx("button",{onClick:()=>{const e=_(),t=e.map((e=>e.props.children)).join("");if(t.startsWith("M")&&t.endsWith("*"))return;const o=[];for(const t of e)o.push({codonGenomicPos:t.key,sequenceLetter:t.props.children});if(0===o.length)return;const a=t.indexOf("M"),s=t.indexOf("*"),i=o[a].codonGenomicPos,l=o[s].codonGenomicPos;if(!i||!l)return;const c=O(i);let d=O(l);if(1===b){if(c>d)return void r("Start codon genomic location should be less than stop codon genomic location","error");let e;d+=3,c!==C&&(e=new Promise((e=>{A(C,c,n,!0,(()=>{e(!0)}))}))),d!==j&&(e?e.then((()=>{A(j,d,n,!1)})):A(j,d,n,!1))}if(-1===b){if(c<d)return void r("Start codon genomic location should be less than stop codon genomic location","error");let e;d-=3,c!==j&&(e=new Promise((e=>{A(j,c,n,!1,(()=>{e(!0)}))}))),d!==C&&(e?e.then((()=>{A(C,d,n,!0)})):A(C,d,n,!0))}r("Translation sequence trimmed to start and stop codons","success")},style:{border:"none",background:"none",padding:0},disabled:g,children:m.jsx(Y,{style:{fontSize:15}})})})]})]})]})})]})})),Qn=K(i.TableCell)((()=>({fontWeight:"bold"}))),eo=E.observer((function(e){const{feature:t}=e,n=fe(t),o=he(t);return m.jsx(i.Table,{size:"small",sx:{fontSize:"0.75rem","& .MuiTableCell-root":{padding:"4px"}},children:m.jsxs(i.TableBody,{children:[""!==n&&m.jsxs(i.TableRow,{children:[m.jsx(Qn,{children:"Name"}),m.jsx(i.TableCell,{children:fe(t)})]}),""!==o&&m.jsxs(i.TableRow,{children:[m.jsx(Qn,{children:"ID"}),m.jsx(i.TableCell,{children:he(t)})]}),m.jsxs(i.TableRow,{children:[m.jsx(Qn,{children:"Type"}),m.jsx(i.TableCell,{children:t.type})]}),m.jsxs(i.TableRow,{children:[m.jsx(Qn,{children:"Location"}),m.jsxs(i.TableCell,{children:[e.refName,":",t.min,"..",t.max]})]}),m.jsxs(i.TableRow,{children:[m.jsx(Qn,{children:"Strand"}),m.jsx(i.TableCell,{children:(a=t.strand,1===a?"Forward":-1===a?"Reverse":"")})]})]})});var a})),to=y.makeStyles()((e=>({root:{padding:e.spacing(2)}}))),no=K(i.AccordionSummary)((()=>({minHeight:30,maxHeight:30,"&.Mui-expanded":{minHeight:30,maxHeight:30}})));function oo(e){return null}const ao=E.observer((function(e){const{classes:t}=to(),n=["summary","location"],[o,a]=v.useState(n),{model:r}=e,{assembly:c,feature:d,refName:u}=r;v.useEffect((()=>{a(n)}),[d]);const g=s.getSession(r),{pluginManager:f}=s.getEnv(g),h=s.getSession(r),p=h.apolloDataStore.assemblies.get(c),{internetAccounts:y}=l.getRoot(g),x=y.find((e=>"ApolloInternetAccount"===e.type)),w=["admin","user"].includes((x?x.role:"admin")??"");if(!d||!p)return null;const S=p.getByRefName(u);if(!S)return null;const{max:C,min:j}=d;function T(e,t){a(e?[...o,t]:o.filter((e=>e!==t)))}S.getSequence(j,C)||h.apolloDataStore.loadRefSeq([{assemblyName:c,refName:u,start:j,end:C}]);const A=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSummary",oo,{feature:d,session:g}),F=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSummary",oo,{feature:d,session:g}),k=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideLocation",oo,{feature:d,session:g}),D=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterLocation",oo,{feature:d,session:g}),N=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideAttributes",oo,{feature:d,session:g}),I=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterAttributes",oo,{feature:d,session:g}),R=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-InsideSequence",oo,{feature:d,session:g}),M=f.evaluateExtensionPoint("Apollo-TranscriptDetailsCustomComponent-AfterSequence",oo,{feature:d,session:g});return m.jsxs("div",{className:t.root,children:[m.jsxs(i.Accordion,{expanded:o.includes("summary"),onChange:(e,t)=>{T(t,"summary")},children:[m.jsx(no,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel1-content",id:"panel1-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Summary"})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(eo,{feature:d,refName:u}),m.jsx(A,{session:g,feature:d})]})]}),m.jsx(F,{session:g,feature:d}),m.jsxs(i.Accordion,{style:{marginTop:5},expanded:o.includes("location"),onChange:(e,t)=>{T(t,"location")},children:[m.jsx(no,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel2-content",id:"panel2-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Location"})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(Yn,{feature:d,refName:u,session:h,assembly:p._id||""}),m.jsx(k,{session:g,feature:d})]})]}),m.jsx(D,{session:g,feature:d}),m.jsxs(i.Accordion,{style:{marginTop:5},expanded:o.includes("attrs"),onChange:(e,t)=>{T(t,"attrs")},children:[m.jsx(no,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel3-content",id:"panel3-header",children:m.jsxs("div",{style:{display:"flex",alignItems:"center"},children:[m.jsxs(i.Typography,{component:"span",fontWeight:"bold",children:["Attributes"," "]}),m.jsx(i.Tooltip,{title:"Separate multiple values for the attribute with commas",children:m.jsx(b,{style:{color:"white",fontSize:15,marginLeft:10}})})]})}),m.jsxs(i.AccordionDetails,{children:[m.jsx(Rn,{feature:d,session:h,assembly:p._id||"",editable:w}),m.jsx(N,{session:g,feature:d})]})]}),m.jsx(I,{session:g,feature:d}),m.jsxs(i.Accordion,{style:{marginTop:5},expanded:o.includes("sequence"),onChange:(e,t)=>{T(t,"sequence")},children:[m.jsx(no,{expandIcon:m.jsx(G,{style:{color:"white"}}),"aria-controls":"panel4-content",id:"panel4-header",children:m.jsx(i.Typography,{component:"span",fontWeight:"bold",children:"Sequence"})}),m.jsxs(i.AccordionDetails,{children:[o.includes("sequence")&&m.jsx(Vn,{feature:d,session:h,assembly:p._id||"",refName:u}),m.jsx(R,{session:g,feature:d})]})]}),m.jsx(M,{feature:d,session:g})]})})),so=o.ConfigurationSchema("LinearApolloDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),ro=y.makeStyles()({highlighted:{background:"orange"}}),io=({highlight:e,text:t})=>{const{classes:n}=ro();if(!e)return m.jsx(m.Fragment,{children:t});const o=t.split(e);if(1===o.length)return m.jsx(m.Fragment,{children:t});const a=[];for(let t=0;t<o.length-1;t++)a.push(o[t],m.jsx("span",{className:n.highlighted,children:e}));return m.jsxs(m.Fragment,{children:[a,o.at(-1)]})},lo=E.observer((function({feature:e,filterText:t}){const n=[...e.attributes.entries()].map((([e,t])=>{if(e.startsWith("gff_")){const n=e.slice(4);return[n.charAt(0).toUpperCase()+n.slice(1),l.getSnapshot(t)]}return"_id"===e?["ID",l.getSnapshot(t)]:[e,l.getSnapshot(t)]})).filter((([e])=>e)).map((([e,t])=>`${e}=${Array.isArray(t)?t.join(", "):t}`)).join(", ");return m.jsx(io,{text:n,highlight:t})})),co=y.makeStyles()((e=>({inputWrapper:{position:"relative"},hiddenWidthSpan:{padding:e.spacing(.5),color:"transparent"},numberTextInput:{border:"none",background:"inherit",font:"inherit",position:"absolute",width:"100%",left:0}}))),uo=E.observer((function({initialValue:e,notifyError:t,onChangeCommitted:n}){const[o,a]=v.useState(e),[s,r]=v.useState(!1),[i,l]=v.useState(null),{classes:c}=co();return v.useEffect((()=>{e!==o&&a(e)}),[e]),v.useEffect((()=>{s&&(i?.blur(),r(!1))}),[s,i]),m.jsxs("span",{className:c.inputWrapper,children:[m.jsx("span",{className:c.hiddenWidthSpan,"aria-hidden":!0,children:o}),m.jsx("input",{type:"text",value:o,className:c.numberTextInput,onChange:function(e){const t=Number(e.target.value);Number.isNaN(t)||a(t)},onKeyDown:t=>{"Enter"===t.key?i?.blur():"Escape"===t.key&&(a(e),r(!0))},onBlur:()=>{o!==e&&n(o).catch(t)},ref:e=>{l(e)}})]})})),go=y.makeStyles()((e=>({typeContent:{display:"inline-block",width:"174px",height:"100%",cursor:"text"},feature:{td:{position:"relative",verticalAlign:"top",paddingLeft:"0.5em"}},arrow:{display:"inline-block",width:"1.6em",textAlign:"center",cursor:"pointer"},arrowExpanded:{transform:"rotate(90deg)"},hoveredFeature:{backgroundColor:e.palette.action.hover},typeInputElement:{border:"none",background:"none"},typeErrorMessage:{color:"red"}})));function fo(e,t){const{changeManager:n,getAssemblyId:o,regions:a,selectedFeature:r,session:i,setSelectedFeature:c,filteredTranscripts:d,updateFilteredTranscripts:u}=e;return function(e,t,n,o,a,r,i,c,d){const u=function(e){const{internetAccounts:t}=l.getParent(e);return t.find((e=>"ApolloInternetAccount"===e.type))}(r),g=u?u.role:"admin",f=!(g&&["admin","user"].includes(g)),h=[];if(e){const l=e.attributes.get("gff_id")?.toString(),g=n(t.assemblyName),p=n(t.assemblyName);h.push({label:"Edit feature details",onClick:()=>{const n=r.addWidget("ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget",{feature:e,assembly:p,refName:t.refName});r.showWidget(n)}},{label:"Add child feature",disabled:f,onClick:()=>{r.queueDialog((t=>[Ve,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:g,internetAccount:u}]))}},{label:"Copy features and annotations",disabled:f,onClick:()=>{r.queueDialog((t=>[Ze,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:p}]))}},{label:"Delete feature",disabled:f,onClick:()=>{r.queueDialog((t=>[Ye,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:p,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Merge transcripts",disabled:f,onClick:()=>{r.queueDialog((t=>[Wt,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:p,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Merge exons",disabled:f,onClick:()=>{r.queueDialog((t=>[$t,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:p,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Split exon",disabled:f,onClick:()=>{r.queueDialog((t=>[en,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:p,selectedFeature:o,setSelectedFeature:a}]))}});const{featureTypeOntology:m}=r.apolloDataStore.ontologyManager;if(!m)throw new Error("featureTypeOntology is undefined");(m.isTypeOf(e.type,"transcript")||m.isTypeOf(e.type,"pseudogenic_transcript"))&&s.isSessionModelWithWidgets(r)&&h.push({label:"Edit transcript details",onClick:()=>{const n=r.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:e,assembly:p,changeManager:i,refName:t.refName});r.showWidget(n)}},{label:"Duplicate feature",onClick:()=>{r.queueDialog((t=>[tn,{session:r,handleClose:()=>{t()},changeManager:i,sourceFeature:e,sourceAssemblyId:p,selectedFeature:o,setSelectedFeature:a}]))}},{label:"Visible",type:"checkbox",checked:!l||!c.includes(l),onClick:()=>{if(l){const e=c.includes(l)?c.filter((e=>e!==l)):[...c,l];d(e)}}})}return h}(t,a[0],o,r,c,i,n,d,u)}const ho=E.observer((function e({depth:n,feature:o,isHovered:a,isSelected:s,model:r,selectedFeatureClass:i,setContextMenu:l}){const{classes:c}=go(),{changeManager:d,hoveredFeature:u,selectedFeature:g,session:f,tabularEditor:h}=r,{featureCollapsed:p,filterText:y}=h,{_id:b,children:x,max:w,min:S,strand:C,type:v}=o,j=!p.get(b),T=e=>{f.notify(e.message,"error")};return m.jsxs(m.Fragment,{children:[m.jsxs("tr",{onMouseEnter:e=>{r.setHoveredFeature({feature:o,bp:S})},className:c.feature+(s?` ${i}`:a?` ${c.hoveredFeature}`:""),onClick:e=>{e.stopPropagation(),r.setSelectedFeature(o)},onDoubleClick:()=>{r.setSelectedFeature(o),function(e,t){e.lgv.navTo(gt(t,.1,e.lgv.totalBp))}(r,o)},onContextMenu:e=>(e.preventDefault(),l({position:{left:e.clientX+2,top:e.clientY-6},items:fo(r,o)}),!1),children:[m.jsxs("td",{style:{whiteSpace:"nowrap",borderLeft:2*n+"em solid transparent"},children:[x?.size?m.jsx("div",{onClick:e=>{e.stopPropagation(),h.setFeatureCollapsed(b,j)},className:c.arrow+(j?` ${c.arrowExpanded}`:""),children:"❯"}):null,m.jsx("div",{className:c.typeContent,children:m.jsx(He,{session:f,ontologyName:"Sequence Ontology",style:{width:170},value:v,filterTerms:Ie,fetchValidTerms:po.bind(null,o),renderInput:e=>m.jsxs("div",{ref:e.InputProps.ref,children:[m.jsx("input",{type:"text",...e.inputProps,className:c.typeInputElement,style:{width:170}}),e.error?m.jsx("div",{className:c.typeErrorMessage,children:e.errorMessage??"unknown error"}):null]}),onChange:(e,n)=>{n&&function(e,n,o,a){const s=n._id,r=new t.TypeChange({typeName:"TypeChange",changedIds:[s],featureId:s,oldType:String(o),newType:String(a),assembly:n.assemblyId});return e.submit(r)}(d,o,e,n).catch(T)}})})]}),m.jsx("td",{children:m.jsx(uo,{initialValue:S+1,notifyError:T,onChangeCommitted:e=>function(e,n,o,a){const s=n._id,r=new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[s],featureId:s,oldStart:o,newStart:a,assembly:n.assemblyId});return e.submit(r)}(d,o,S,e-1)})}),m.jsx("td",{children:m.jsx(uo,{initialValue:w,notifyError:T,onChangeCommitted:e=>function(e,n,o,a){const s=n._id,r=new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[s],featureId:s,oldEnd:o,newEnd:a,assembly:n.assemblyId});return e.submit(r)}(d,o,w,e)})}),m.jsx("td",{children:1===C?"+":-1===C?"-":void 0}),m.jsx("td",{children:m.jsx(lo,{filterText:y,feature:o})})]}),j&&x?[...x.entries()].filter((e=>{if(!y)return!0;const[,t]=e;return JSON.stringify(t).includes(y)})).map((([t,o])=>m.jsx(e,{isHovered:u?.feature._id===o._id,isSelected:g?._id===o._id,selectedFeatureClass:i,depth:(n||0)+1,feature:o,model:r,setContextMenu:l},t))):null]})}));async function po(e,t,n){const{parent:o}=e;if(o){const e=(await t.getTermsWithLabelOrSynonym(o.type,{includeSubclasses:!1})).filter(Ie);if(e.length>0)return await t.getClassesThat("part_of",e)}}const mo=y.makeStyles()((e=>({scrollableTable:{width:"100%",height:"100%",th:{position:"sticky",top:0,zIndex:2,textAlign:"left",background:e.palette.background.paper,paddingTop:"3.2em"},td:{whiteSpace:"normal"}},selectedFeature:{backgroundColor:e.palette.action.selected}}))),yo=E.observer((function({model:e}){const{hoveredFeature:t,seenFeatures:n,selectedFeature:o,tabularEditor:a}=e,s=i.useTheme(),{classes:r}=mo(),l=v.useRef(null),[c,d]=v.useState(null),{filterText:u}=a;return v.useEffect((()=>{const e=l.current;if(e&&o){const t=e.querySelector(`.${r.selectedFeature}`);if(t){const n=e.scrollTop,o=t.offsetTop-25;o>n&&o<n+e.offsetHeight||e.scroll({top:o-40,behavior:"smooth"})}}}),[o,n,r.selectedFeature]),m.jsxs("div",{ref:l,style:{width:"100%",overflowY:"auto",height:"100%"},children:[m.jsxs("table",{className:r.scrollableTable,children:[m.jsx("thead",{children:m.jsxs("tr",{children:[m.jsx("th",{children:"Type"}),m.jsx("th",{children:"Start"}),m.jsx("th",{children:"End"}),m.jsx("th",{children:"Strand"}),m.jsx("th",{children:"Attributes"})]})}),m.jsx("tbody",{children:[...n.entries()].filter((e=>{if(!u)return!0;const[,t]=e;return JSON.stringify(t).includes(u)})).sort(((e,t)=>e[1].min-t[1].min)).map((([n,a])=>m.jsx(ho,{isSelected:o?._id===n,isHovered:t?.feature._id===n,selectedFeatureClass:r.selectedFeature,feature:a,model:e,depth:0,setContextMenu:d},n)))})]}),m.jsx(R.Menu,{open:Boolean(c),onMenuItemClick:(e,t)=>{t(),d(null)},onClose:()=>{d(null)},slotProps:{transition:{onExit:()=>{d(null)}}},style:{zIndex:s.zIndex.tooltip},menuItems:c?.items??[],anchorReference:"anchorPosition",anchorPosition:c?.position})]})})),bo=y.makeStyles()({toolbar:{width:"100%",display:"flex",paddingRight:"2em",flexDirection:"row",justifyContent:"space-between",position:"absolute",zIndex:4},filterText:{}}),xo=E.observer((function({model:e}){const t=e.tabularEditor,{classes:n}=bo();return m.jsxs("div",{className:n.toolbar,children:[m.jsx(i.Tooltip,{title:"Collapse all",children:m.jsx(i.IconButton,{"aria-label":"collapse",sx:{marginTop:0},onClick:t.collapseAllFeatures,children:m.jsx(te,{})})}),m.jsx(i.TextField,{className:n.filterText,label:"Filter features",value:t.filterText,sx:{marginTop:0},variant:"outlined",onChange:e=>{t.setFilterText(e.target.value)},slotProps:{input:{endAdornment:m.jsx(i.InputAdornment,{position:"end",children:m.jsx(i.IconButton,{onClick:()=>{t.clearFilterText()},children:m.jsx(ee,{})})})}}})]})}));function wo(e){e.stopPropagation()}const So=E.observer((function({model:e}){return e.tabularEditor.isShown?m.jsxs("div",{onMouseDown:wo,onClick:wo,style:{width:"100%",height:"100%",position:"relative"},children:[m.jsx(xo,{model:e}),m.jsx(yo,{model:e})]}):null})),Co=l.types.model("TabularEditor",{isShown:!0,featureCollapsed:l.types.map(l.types.boolean),filterText:""}).actions((e=>({setFeatureCollapsed(t,n){e.featureCollapsed.set(t,n)},setFilterText(t){e.filterText=t},clearFilterText(){e.filterText=""},collapseAllFeatures(){const t=l.getParent(e);for(const[n]of t.seenFeatures.entries())e.featureCollapsed.set(n,!0)},togglePane(){e.isShown=!e.isShown},hidePane(){e.isShown=!1},showPane(){e.isShown=!0}})));function vo(e,t,n){const{lgv:o}=e,{bpPerPx:a,offsetPx:s}=o;return n.offsetPx-s+(n.reversed?n.end-t.max:t.min-n.start)/a}function jo(e,t,n,o){const{apolloRowHeight:a,lgv:s}=e,{bpPerPx:r}=s;return[n*a,Math.round(vo(e,t,o)),Math.round((t.max-t.min)/r),a]}function To(e,t,n,o,a,s,r,l){const c=function(e,t,n){const{theme:o}=e;switch(n){case"select":return o.palette.action.disabled;case"hover":return o.palette.action.focus;case"highlight":{const{attributes:e}=t,n=e.get("apollo_color");return n?.[0]}}}(e,r,l);c&&(t.fillStyle=i.alpha(c,.3),t.fillRect(n,o,a,s))}function Ao(e,t,n,o,a,s){e.strokeStyle=s,e.lineWidth=1,e.strokeRect(t+.5,n+.5,o-1,a-1)}function Fo(e,t,n){const{refName:o,regionNumber:a,x:s}=e,{lgv:r}=n,{offsetPx:i}=r,l=r.bpToPx({refName:o,coord:t.min,regionNumber:a}),c=r.bpToPx({refName:o,coord:t.max,regionNumber:a});if(void 0!==l&&void 0!==c){const e=l.offsetPx-i,t=c.offsetPx-i;if(Math.abs(t-e)<8)return;if(Math.abs(e-s)<4)return"min";if(Math.abs(t-s)<4)return"max"}}function ko(e,t,n,o,a,s){const[r,i,l,c]=jo(e,n,o,a);To(e,t,i,r,l,c,n,s)}const Do={draw:function(e,t,n,o,a,s){const{selectedFeature:r,theme:i}=e,[l,c,d,u]=jo(e,n,o,s);d>2&&(t.fillStyle=i.palette.background.default,t.fillRect(c,l,d,u)),Ao(t,c,l,d,u,i.palette.text.primary),ct(n,r)&&ko(e,t,n,o,s,"select")},drawDragPreview:function(e,t,n,o,a){const{apolloDragging:s,theme:r}=e;if(!s)return;const{current:l,start:c}=s,d=Math.min(l.bp,c.bp),u=Math.max(l.bp,c.bp),[g,f,h,p]=jo(e,{min:d,max:u},o,a);t.fillStyle=i.alpha(r.palette.info.main,.2),t.fillRect(f,g,h,p),t.setLineDash([6]),Ao(t,f,g,h,p,r.palette.info.main)},drawOverlay:ko,getContextMenuItems:function(e){const{hoveredFeature:t}=e;return t?ut(e,t.feature):[]},getLayout:function(e,t){return{byFeature:new Map([[t._id,0]]),byRow:[[{feature:t,rowInFeature:0}]],min:t.min,max:t.max}},isDraggable:!0};function No(e,t,n,o,a,r){const{apolloRowHeight:i,canvasPatterns:l,theme:c}=e,[d,u,g]=jo(e,n,a,r),f=Math.round(i/2);if(g>2){const e=s.getFrame(n.min,n.max,o??1,n.phase),a=c.palette.framesCDS.at(e)?.main;t.fillStyle=a??"black",t.fillRect(u,d,g,i);const h=l.forward,p=l.backward;if(h&&p&&o){const{reversed:e}=r,n=e?-1:1,[a,s]=o*n==1?[h,p]:[p,h];t.fillStyle=a,t.fillRect(u,d,g,f),t.fillStyle=s,t.fillRect(u,d+f,g,f)}}Ao(t,u,d,g,i,c.palette.text.primary)}function Io(e,t,n,o,a,s){const{apolloRowHeight:r}=e,[i,l,c]=jo(e,n,o,a);To(e,t,l,i,c,1*r,n,s)}const{drawDragPreview:Ro}=Do,Mo={draw:function(e,t,n,o,a,s){const r=n.parent;if(!r)return void Do.draw(e,t,n,o,0,s);const{cdsLocations:i}=r,l=i.find((e=>{const t=e.at(1===n.strand?0:-1)?.min,o=e.at(1===n.strand?-1:0)?.max;return n.min===t&&n.max===o}));if(!l)return;for(const a of l)No(e,t,a,n.strand,o,s);const{selectedFeature:c}=e;ct(n,c)&&Io(e,t,n,o,s,"select")},drawDragPreview:Ro,drawOverlay:Io,getContextMenuItems:function(){return[]},getLayout:function(e,t){return{byFeature:new Map([[t._id,0]]),byRow:[[{feature:t,rowInFeature:0}]],min:t.min,max:t.max}},isDraggable:!0};function Eo(e,t,n,o,a,s){const{apolloRowHeight:r}=e,[,i,l]=jo(e,n,o,a),c=Math.round(.6*r),d=Math.round(c/2);To(e,t,i,Math.round(d/2)+o*r,l,c,n,s)}const{drawDragPreview:Lo}=Do,qo={draw:function(e,t,n,o,a,s){const{apolloRowHeight:r,canvasPatterns:i,selectedFeature:l,theme:c}=e,[,d,u]=jo(e,n,o,s),g=Math.round(.6*r),f=Math.round(g/2),h=Math.round(f/2)+o*r;if(u>2){t.fillStyle="rgb(211,211,211)",t.fillRect(d,h,u,g);const e=i.forward,o=i.backward,{strand:a}=n;if(e&&o&&a){const{reversed:n}=s,r=n?-1:1,[i,l]=a*r==1?[e,o]:[o,e];t.fillStyle=i,t.fillRect(d,h,u,f),t.fillStyle=l,t.fillRect(d,h+f,u,f)}}Ao(t,d,h,u,g,c.palette.text.primary),ct(n,l)&&Eo(e,t,n,o,s,"select")},drawDragPreview:Lo,drawOverlay:Eo,getContextMenuItems:function(e,t){const{apolloInternetAccount:n,changeManager:o,regions:a,selectedFeature:r,session:i}=e,[l]=a,c=e.getAssemblyId(l.assemblyName),d="admin"===(n?n.role:"admin"),u=[],g=st(t,e),f=s.getContainingView(e);if(g.upstream){const n=g.upstream;u.push({label:"Go to upstream exon",icon:rt(t.strand,!0,f.displayedRegions.at(0)?.reversed),onClick:()=>{f.navTo(gt(n,.1,f.totalBp)),Qe(e,n)}})}if(g.downstream){const n=g.downstream;u.push({label:"Go to downstream exon",icon:rt(t.strand,!1,f.displayedRegions.at(0)?.reversed),onClick:()=>{f.navTo(gt(n,.1,f.totalBp)),Qe(e,n)}})}return u.push({label:"Merge exons",disabled:!d,onClick:()=>{i.queueDialog((n=>[$t,{session:i,handleClose:()=>{n()},changeManager:o,sourceFeature:t,sourceAssemblyId:c,selectedFeature:r,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:!d,onClick:()=>{i.queueDialog((n=>[en,{session:i,handleClose:()=>{n()},changeManager:o,sourceFeature:t,sourceAssemblyId:c,selectedFeature:r,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),u},getLayout:function(e,t){return{byFeature:new Map([[t._id,0]]),byRow:[[{feature:t,rowInFeature:0}]],min:t.min,max:t.max}},isDraggable:!0};function Po(e,t){return Oo(e,t).byRow.length}function _o(e,t,n,o,a,s,r){if(r>0)return;const{apolloRowHeight:i}=e,[l,c,d]=jo(e,n,o,a);To(e,t,c,l,d,Po(e,n)*i,n,s)}function Oo(e,t){const n={byFeature:new Map([[t._id,0]]),byRow:[[{feature:t,rowInFeature:0}]],min:t.min,max:t.max},{children:o}=t;if(!o)return n;n.byRow=[];const{getGlyph:a}=e;for(const[,s]of o){const o=a(s).getLayout(e,s),r=n.byRow.length;for(const[e,a]of o.byRow.entries())n.byRow.push([{feature:t,rowInFeature:r+e},...a]);for(const e of o.byFeature.entries()){const[t,o]=e;n.byFeature.set(t,o+r)}}return n}const{drawDragPreview:Bo}=Do,Uo={draw:function(e,t,n,a,s,r){if(s>0)return;const{apolloRowHeight:l,theme:c,selectedFeature:d,session:u}=e,[g,f,h]=jo(e,n,a,r),p=Po(e,n)*l;if(h>2){let e=o.readConfObject(u.getPluginConfiguration(),"geneBackgroundColor",{featureType:n.type});e=i.alpha(c.palette.background.paper,.6),t.fillStyle=e,t.fillRect(f,g,h,p)}Ao(t,f,g,h,p,c.palette.text.primary),ct(n,d)&&_o(e,t,n,a,r,"select",s)},drawDragPreview:Bo,drawOverlay:_o,getContextMenuItems:function(){return[]},getLayout:Oo,isDraggable:!1};function $o(e,t){return Wo(e,t).byRow.length}function zo(e,t,n,o,a,s){const{apolloRowHeight:r}=e,[i,l,c]=jo(e,n,o,a);To(e,t,l,i,c,$o(e,n)*r,n,s)}function Wo(e,t){const n={byFeature:new Map([[t._id,0]]),byRow:[[{feature:t,rowInFeature:0}]],min:t.min,max:t.max},{children:o}=t;if(!o)return n;const{getGlyph:a}=e;for(const[,s]of o){const o=a(s).getLayout(e,s),r=n.byRow.length;for(const[e,a]of o.byRow.entries())n.byRow.push([{feature:t,rowInFeature:r+e},...a]);for(const e of o.byFeature.entries()){const[t,o]=e;n.byFeature.set(t,o+r)}}return n}const{drawDragPreview:Go}=Do,Ho={draw:function(e,t,n,o,a,s){if(a>0)return;const{apolloRowHeight:r,selectedFeature:l,theme:c}=e,[d,u,g]=jo(e,n,o,s),f=$o(e,n)*r;g>2&&(t.fillStyle=i.alpha(c.palette.background.paper,.6),t.fillRect(u,d,g,f)),Ao(t,u,d,g,f,c.palette.text.primary),Do.draw(e,t,n,o,0,s),ct(n,l)&&zo(e,t,n,o,s,"select")},drawDragPreview:Go,drawOverlay:zo,getContextMenuItems:function(){return[]},getLayout:Wo,isDraggable:!0};function*Vo(e,t,n=1){if(e!==t)if(e<t)for(let o=e;o<t;o+=n)yield o;else for(let o=e;o>t;o-=n)yield o}function Jo(e,t,n,o,a,s){const{apolloRowHeight:r}=e,[i,l,c]=jo(e,n,o,a),d=r*function(e,t){return Xo(e,t).byRow.length}(e,n);To(e,t,l,i,c,d,n,s)}function Xo(e,t){const n={byFeature:new Map([[t._id,0]]),byRow:[[{feature:t,rowInFeature:0}]],min:t.min,max:t.max},{children:o}=t;if(!o)return n;n.byRow=[];const a=function(e,t){const{children:n}=t;if(!n)return[];const{session:o}=e;return[...n.values()].filter((e=>nt(e,o)))}(e,t),s=function(e,t){const{children:n}=t;if(!n)return[];const{session:o}=e;return[...n.values()].filter((e=>!nt(e,o)))}(e,t);if(n.byFeature.set(t._id,0),0===s.length){const e=[];e.push({feature:t,rowInFeature:0});for(const t of a)e.push({feature:t,rowInFeature:0}),n.byFeature.set(t._id,0);return n.byRow.push(e),n}const{getGlyph:r,session:i}=e;let l=0;for(const[o,c]of s.entries()){const s=[];if(s.push({feature:t,rowInFeature:o+l}),ot(c,i)){for(const e of a)s.push({feature:e,rowInFeature:l}),n.byFeature.set(e._id,l);s.push({feature:c,rowInFeature:l}),n.byFeature.set(c._id,l)}else{const t=r(c).getLayout(e,c).byRow.length;for(let e=0;e<t;e++)s.push({feature:c,rowInFeature:e}),n.byFeature.set(c._id,e);l+=t-1}n.byRow.push(s)}return n}const{drawDragPreview:Ko}=Do,Zo={draw:function(e,t,n,o,a,s){!function(e,t,n,o,a){const{apolloRowHeight:s,lgv:r,theme:i}=e,{bpPerPx:l}=r,{reversed:c}=a,d=Math.round(vo(e,n,a)),u=Math.round(n.length/l),g=Math.round(s/2)+o*s;t.strokeStyle=i.palette.text.primary;const{strand:f=1}=n;t.beginPath();const h=f*(c?-1:1);let p=d-(-1===h?5:0),m=d+u+(-1===h?0:5);p=Math.max(p,0),m=Math.min(m,globalThis.innerWidth),t.moveTo(p,g),t.lineTo(m,g);const y=p+(-1===h?0:3),b=m-(-1===h?3:0),x=-1===h?3:-3,w=-1===h?Vo(y,b,20):Vo(b,y,20);for(const e of w)t.moveTo(e+x,g+x),t.lineTo(e,g),t.lineTo(e+x,g-x);t.stroke()}(e,t,n,o,s);const{selectedFeature:r}=e;ct(n,r)&&Jo(e,t,n,o,s,"select")},drawDragPreview:Ko,drawOverlay:Jo,getContextMenuItems:function(e,t){const{changeManager:n,regions:o,selectedFeature:a,session:r}=e,[i]=o,l=e.getAssemblyId(i.assemblyName),c=[];return s.isSessionModelWithWidgets(r)&&c.splice(1,0,{label:"Open transcript editor",onClick:()=>{const e=r.addWidget("ApolloTranscriptDetails","apolloTranscriptDetails",{feature:t,assembly:l,changeManager:n,refName:i.refName});r.showWidget(e)}}),c.push({label:"Merge transcript",onClick:()=>{r.queueDialog((o=>[Wt,{session:r,handleClose:()=>{o()},changeManager:n,sourceFeature:t,sourceAssemblyId:l,selectedFeature:a,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Duplicate feature",onClick:()=>{r.queueDialog((o=>[tn,{session:r,handleClose:()=>{o()},changeManager:n,sourceFeature:t,sourceAssemblyId:l,selectedFeature:a,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}}),c},getLayout:Xo,isDraggable:!1},Yo=E.observer((function({featureTypes:e,handleClose:t,onUpdate:n,session:o}){const[a,s]=v.useState(""),[r,l]=v.useState(e);return m.jsx(Ge,{open:!0,maxWidth:!1,"data-testid":"filter-features-dialog",title:"Filter features by type",handleClose:t,children:m.jsxs(i.DialogContent,{children:[m.jsx(i.DialogContentText,{children:"Select the feature types you want to display in the apollo track"}),m.jsxs(i.Grid,{container:!0,spacing:2,children:[m.jsx(i.Grid,{size:8,children:m.jsx(He,{session:o,ontologyName:"Sequence Ontology",style:{width:"100%"},value:a,filterTerms:Ie,renderInput:e=>m.jsx(i.TextField,{...e,label:"Feature type",variant:"outlined",fullWidth:!0}),onChange:(e,t)=>{t&&s(t)}})}),m.jsx(i.Grid,{size:4,children:m.jsx(i.Button,{variant:"contained",onClick:()=>{if(a){if(r.includes(a))return;n([...r,a]),l([...r,a])}},disabled:!a,style:{marginTop:9},size:"medium",children:"Add"})})]}),r.length>0&&m.jsxs("div",{children:[m.jsx("hr",{}),m.jsxs("div",{style:{width:300},children:[m.jsx(i.DialogContentText,{children:"Selected feature types:"}),m.jsx(i.Box,{sx:{display:"flex",flexWrap:"wrap",gap:.5},children:r.map((e=>m.jsx(i.Chip,{label:e,onDelete:()=>{(e=>{const t=r.filter((t=>t!==e));n(t),l(t)})(e)}},e)))})]})]})]})})})),Qo=E.observer((function({model:e,handleClose:t}){const[n,o]=v.useState(`${e.zoomThresholdSetting}`);return m.jsx(R.Dialog,{open:!0,onClose:t,title:"Edit zoom threshold setting",children:m.jsxs(i.DialogContent,{children:[m.jsx(i.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."}),m.jsx(i.TextField,{label:"Threshold value (bpPerPx)",value:n,onChange:e=>{o(e.target.value)}}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",onClick:()=>{e.setZoomThresholdSetting({zoomThreshold:+n}),t()},children:"Submit"}),m.jsx(i.Button,{variant:"contained",color:"secondary",onClick:()=>{t()},children:"Cancel"})]})]})})})),ea=y.makeStyles()((e=>({canvasContainer:{position:"relative",left:0},canvas:{position:"absolute",left:0},center:{display:"flex",justifyContent:"center"},ellipses:{textOverflow:"ellipsis",overflow:"hidden"},avatar:{position:"static",height:"100%",width:"100%",overflow:"visible",color:e.palette.warning.light,backgroundColor:e.palette.warning.contrastText},box:{position:"absolute",overflow:"visible"},badge:{display:"inline-block"},loading:{position:"absolute",right:e.spacing(3),zIndex:10,pointerEvents:"none",textAlign:"right"},locked:{position:"absolute",right:e.spacing(3),top:e.spacing(6),zIndex:1,pointerEvents:"none",textAlign:"right"}})));function ta(e,t,n){const o=new Map;for(const t of e)(o.get(t.message)??o.set(t.message,[]).get(t.message)).push(t);const a=[];for(const[e,n]of o.entries()){if(0===n.length)continue;n.sort(((e,t)=>e.start-t.start));let o=[n[0]],s=n[0].start,r=n[0].start+t;const i=()=>{const t=o.map((e=>e.start)).sort(((e,t)=>e-t)),n=Math.floor(t.length/2),i=o[0].ids;a.push({_id:o[0]._id,message:e,start:t.length%2?t[n]:(t[n-1]+t[n])/2,count:o.length,members:[...o],range:{min:s,max:r},featureIds:i})};for(let e=1;e<n.length;e++){const a=n[e],l=a.start,c=l+t;l<=r?(o.push(a),l<s&&(s=l),c>r&&(r=c)):(i(),o=[a],s=l,r=c)}i()}return a.sort(((e,t)=>e.message.localeCompare(t.message)||e.start-t.start)),a}function na(e,t,n){return"M"===e?t.palette.startCodon:"*"===e?n?t.palette.text.primary:t.palette.stopCodon:void 0}function oa(e,t){const n=e.toUpperCase();return"A"===n||"C"===n||"G"===n||"T"===n?t.palette.bases[n].main.toString():"lightgray"}function aa(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return a.BaseDisplay.named("BaseLinearApolloDisplay").props({type:l.types.literal("LinearApolloDisplay"),configuration:o.ConfigurationReference(t),graphical:!0,table:!1,showCheckResults:!0,zoomThreshold:200,heightPreConfig:l.types.maybe(l.types.refinement("displayHeight",l.types.number,(e=>e>=20))),filteredFeatureTypes:l.types.array(l.types.string),loadingState:!1}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...ne.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return s.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?400:e.graphical?100:200},get loading(){return e.loadingState},get zoomThresholdSetting(){return e.zoomThreshold??o.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return s.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:o})=>({assemblyName:e,refName:n,start:Math.round(o),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=l.getRoot(e),{assemblyName:a}=t,{assemblyManager:s}=e.session,r=s.get(a);if(!r)throw new Error(`No assembly found with name ${a}`);const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);return n.find((e=>o.getConf(e,"internetAccountId")===i))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,o=n.get(t);if(!o)throw new Error(`Could not find assembly named ${t}`);return o.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=l.cast(t)},setLoading(t){e.loadingState=t},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:o,table:a,showCheckResults:r}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:o&&!a,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:a&&!o,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:a&&o,onClick:()=>{e.showGraphicalAndTable()}},{label:"Check Results",type:"checkbox",checked:r,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{s.getSession(e).queueDialog((t=>[Qo,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((o=>[Yo,{session:n,handleClose:()=>{o()},featureTypes:l.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}},{label:"Export annotations",icon:Et,onClick:()=>{const[t]=e.regions,{assemblyName:n}=t,o=e.getAssemblyId(n);if(!o)return;const a=e.session;a.queueDialog((e=>[Lt,{session:a,handleClose:()=>{e()},assembly:o}]))}},{label:"View Change Log",icon:ae,onClick:()=>{const[t]=e.regions,{assemblyName:n}=t,o=e.getAssemblyId(n);if(!o)return;const a=e.session;a.queueDialog((e=>[Vt,{session:a,handleClose:()=>{e()},assembly:o}]))}},{label:"View Check Results",icon:oe,onClick:()=>{const[t]=e.regions,{assemblyName:n}=t,o=e.getAssemblyId(n);if(!o)return;const a=e.session;a.queueDialog((e=>[Zt,{session:a,handleClose:()=>{e()},assembly:o}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[o]=e.regions,{assemblyName:a,refName:s}=o,r=e.getAssemblyId(a);if(!r)return;const{session:i}=e,{changeManager:l}=i.apolloDataStore,[c,d]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],u=i.addWidget(c,d,{feature:t,assembly:r,refName:s,changeManager:l});i.showWidget(u)},afterAttach(){l.addDisposer(e,c.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.setLoading(!0),e.session.apolloDataStore.loadFeatures(e.regions).then((()=>{setTimeout((()=>{e.setLoading(!1)}),1e3)})))}),{name:"LinearApolloDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloDisplayLayouts").props({cleanupBoundary:2e5}).volatile((()=>({seenFeatures:c.observable.map()}))).views((e=>({getAnnotationFeatureById:t=>e.seenFeatures.get(t),getGlyph:t=>et(t,e.session)?Uo:tt(t,e.session)?Zo:nt(t,e.session)?qo:ot(t,e.session)?Mo:t.children?.size?Ho:Do}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({getCanonicalRefName(t,n){const{assemblyManager:o}=e.session,a=o.get(t);if(!a)throw new Error("no assembly in layout");const s=a.getCanonicalRefName(n);if(!s)throw new Error("no canonical refName in layout");return s}}))).views((e=>({isFeatureDisplayed(t){const n=e.getCanonicalRefName(t.assemblyId,t.refSeq);return e.lgv.displayedRegions.some((o=>{const{end:a,refName:r,start:i}=o;return!(e.filteredFeatureTypes.length>0&&!e.filteredFeatureTypes.includes(t.type)||n!==r||!s.doesIntersect2(i,a,t.min,t.max))}))}}))).views((e=>({get layouts(){const t=new Map;for(const[n,o]of e.seenFeatures.entries()){if(!l.isAlive(o)){e.deleteSeenFeature(n);continue}if(!e.isFeatureDisplayed(o))continue;const a=e.getGlyph(o).getLayout(e,o),r=e.getCanonicalRefName(o.assemblyId,o.refSeq);let i=t.get(o.assemblyId);i||(i=new Map,t.set(o.assemblyId,i));const c=i.get(r);if(!c){i.set(r,a);continue}let d=0;e:for(;;){let e=c.byRow.at(d);if(!e){c.byRow.push(...a.byRow);for(const e of a.byFeature.entries()){const[t,n]=e;c.byFeature.set(t,n+d)}c.min=Math.min(c.min,a.min),c.max=Math.max(c.max,a.max);break e}const t=d+a.byRow.length-1;let n=d;for(;e&&d<=t;){for(const t of e.values())if(s.doesIntersect2(a.min,a.max,t.feature.min,t.feature.max)){d+=1;continue e}n+=1,e=c.byRow.at(n)}for(let e=0;e<a.byRow.length;e++){const t=c.byRow.at(d+e);t?t.push(...a.byRow[e]):c.byRow.push(a.byRow[e])}for(const e of a.byFeature.entries()){const[t,n]=e;c.byFeature.set(t,n+d)}c.min=Math.min(c.min,a.min),c.max=Math.max(c.max,a.max);break e}}return t},getRowForFeature(t){const n=e.getCanonicalRefName(t.assemblyId,t.refSeq);return this.layouts.get(t.assemblyId)?.get(n)?.byFeature.get(t._id)},getFeaturesAtPosition(e,t,n,o){const a=this.layouts.get(e);if(!a)return[];const s=a.get(t);if(!s)return[];const r=s.byRow.at(n);return r?r.filter((({feature:e})=>o>=e.min&&o<=e.max)).map((e=>e.feature)):[]}}))).views((e=>({highestRow(t){const n=e.layouts.get(t);return n?Math.max(0,...[...n.values()].map((e=>e.byRow.length))):0}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered()){for(const[t,n]of e.seenFeatures.entries()){let o=!1;for(const t of e.regions)if(s.doesIntersect2(t.start-e.cleanupBoundary,t.end+e.cleanupBoundary,n.min,n.max)){o=!0;break}o||e.deleteSeenFeature(t)}for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),o=n?.getByRefName(t.refName),a=o?.features;if(a)for(const[,n]of a)s.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}}),{name:"LinearApolloDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,isShown:!0,filteredTranscripts:l.types.array(l.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:i.createTheme()}))).views((e=>({featuresHeight:t=>(e.highestRow(t)+1)*e.apolloRowHeight,get canvasPatterns(){const t={forward:null,backward:null},n=document.createElement("canvas"),o=n?.getContext("2d");if(!o)return t;const a=10;n.width=n.height=a;const{theme:s}=e,r="light"===s.palette.mode?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",i="light"===s.palette.mode?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",l=["forward","backward"];for(const e of l){const s="forward"===e?o.createLinearGradient(0,a,a,0):o.createLinearGradient(0,0,a,a);s.addColorStop(0,r),s.addColorStop(.25,r),s.addColorStop(.25,i),s.addColorStop(.5,i),s.addColorStop(.5,r),s.addColorStop(.75,r),s.addColorStop(.75,i),s.addColorStop(1,i),o.fillStyle=s,o.clearRect(0,0,a,a),o.fillRect(0,0,a,a),t[e]=o.createPattern(n,"repeat")}return t}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight(e.lgv.assemblyNames[0]));for(const n of e.session.collaborators){const{locations:o}=n;if(0===o.length)continue;let a=0;for(const s of e.lgv.displayedRegions){for(const r of o){if(r.refSeq!==s.refName)continue;const{end:o,refSeq:i,start:l}=r,c=e.lgv.bpToPx({refName:i,coord:l,regionNumber:a});if(!c)continue;const d=c.offsetPx-e.lgv.offsetPx,u=(o-l)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(d,1,u,100),t.fillStyle="black",t.fillText(n.name,d+1,11,u-2)}a++}}}}),{name:"LinearApolloDisplayRenderCollaborators"})),l.addDisposer(e,c.autorun((()=>{const{canvas:t,layouts:n,lgv:o}=e;if(!o.initialized||e.regionCannotBeRendered()||!t)return;const{dynamicBlocks:a,offsetPx:r}=o,i=t.getContext("2d");if(!i)return;const l=n.get(o.assemblyNames[0]);if(l){i.clearRect(0,0,t.width,t.height);for(const n of a.contentBlocks){const o=n.offsetPx-r;i.save(),i.beginPath(),i.rect(o,0,n.widthPx,t.height),i.clip();const a=l.get(n.refName);if(!a)return;const{byRow:c}=a;for(const[t,o]of c.entries())for(const a of o){const{feature:o,rowInFeature:r}=a;s.doesIntersect2(n.start,n.end,o.min,o.max)&&e.getGlyph(o).draw(e,i,o,t,r,n)}for(const[t,o]of c.entries())for(const a of o){const{feature:o,rowInFeature:r}=a;s.doesIntersect2(n.start,n.end,o.min,o.max)&&e.getGlyph(o).drawOverlay(e,i,o,t,n,"highlight",r)}i.restore()}}}),{name:"LinearApolloDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition:t=>function(e,t){const n=e.currentTarget,{clientX:o,clientY:a}=e,{left:s,top:r}=n.getBoundingClientRect(),i=o-s,l=a-r,{coord:c,index:d,assemblyName:u,refName:g}=t.pxToBp(i);return{x:i,y:l,assemblyName:u,refName:g,bp:c,regionNumber:d}}(t,e.lgv),getFeaturesAtMousePosition(t){const{bp:n,assemblyName:o,refName:a,y:s}=t,r=Math.floor(s/e.apolloRowHeight),i=e.layouts.get(o)?.get(a);return i?e.getFeaturesAtPosition(o,a,r,n):[]}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(e){}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const n=e.getMousePosition(t),o=e.getFeaturesAtMousePosition(n);if(1===o.length)return ut(e,o[0]);const a=[];for(const t of o){const n=e.getGlyph(t);a.push({label:t.type,subMenu:[...ut(e,t),...n.getContextMenuItems(e,t)]})}return a}}))).actions((e=>{function n(t){"Escape"===t.key&&e.setDragging()}return{startDrag(t,o,a,s=!1){globalThis.addEventListener("keydown",n,!0),e.apolloDragging={start:t,current:t,feature:o,edge:a,shrinkParent:s}},endDrag(){if(globalThis.removeEventListener("keydown",n,!0),!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:o,edge:a,feature:s,start:r,shrinkParent:i}=e.apolloDragging;if(Math.abs(o.x-r.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:l}=e.lgv,c=e.getAssemblyId(l[r.regionNumber].assemblyName),d=pt(s,o.bp,a,i),u="max"===a?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:d.map((e=>e.featureId)),changes:d.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:c}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:d.map((e=>e.featureId)),changes:d.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:c});e.changeManager.submit(u),e.setDragging(),e.setCursor()}}})).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t),o=e.getFeaturesAtMousePosition(n);for(const a of o.toReversed())if(e.getGlyph(a).isDraggable){const o=Fo(n,a,e);if(o)return t.stopPropagation(),void e.startDrag(n,a,o,!0)}},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);const o=e.getFeaturesAtMousePosition(n);let a=o.at(-1);if(a&&ot(a,e.session)){const t=o.at(-2);t&&!nt(t,e.session)&&(a=t)}a?e.setHoveredFeature({feature:a,bp:n.bp}):e.setHoveredFeature();for(const t of o.toReversed())if(e.getGlyph(t).isDraggable&&Fo(n,t,e))return void e.setCursor("col-resize");e.setCursor()},onMouseLeave(t){e.setDragging(),e.setHoveredFeature()},onMouseUp(t){if(e.apolloDragging)return void e.endDrag();const n=e.getMousePosition(t),o=e.getFeaturesAtMousePosition(n);let a=o.at(-1);if(a&&ot(a,e.session)){const t=o.at(-2);t&&!nt(t,e.session)&&(a=t)}a?(Qe(e,a),e.setSelectedFeature(a)):e.setSelectedFeature()}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{const{lgv:t,overlayCanvas:n}=e;if(!t.initialized||e.regionCannotBeRendered()||!n)return;const{dynamicBlocks:o,offsetPx:a}=t,r=n.getContext("2d");if(!r)return;r.clearRect(0,0,n.width,n.height);const{apolloDragging:i,hoveredFeature:l}=e;if(!l)return;const{feature:c}=l,d=e.getGlyph(c),u=e.getRowForFeature(c);if(void 0!==u)for(const t of o.contentBlocks){const o=t.offsetPx-a;if(r.save(),r.beginPath(),r.rect(o,0,t.widthPx,n.height),r.clip(),t.assemblyName===c.assemblyId&&s.doesIntersect2(t.start,t.end,c.min,c.max)&&d.drawOverlay(e,r,c,u,t,"hover"),i){const{current:n,start:o,feature:a}=i,l=Math.min(n.bp,o.bp),c=Math.max(n.bp,o.bp);if(s.doesIntersect2(t.start,t.end,l,c)){const n=e.getGlyph(a),o=e.getRowForFeature(a);void 0!==o&&n.drawDragPreview(e,r,a,o,t)}}r.restore()}}),{name:"LinearApolloDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:l.types.optional(Co,{})}).named("LinearApolloDisplay")}const sa=o.ConfigurationSchema("LinearApolloReferenceSequenceDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0});function ra(e,t,n){const o=t<=1?[2,1,0,7,6,5]:[2,1,0,5,4,3];n&&o.reverse(),o.unshift(0);const a=o.at(e);if(void 0===a)throw new Error("could not find row");return a}function ia(e,t,n,o){return o.offsetPx-n+(o.reversed?o.end-e.max:e.min-o.start)/t}function la(e,t,n,o,a,s,r=!1){e.fillStyle=r?s.palette.action.disabled:s.palette.action.focus,e.fillRect(t,n,o,a),e.strokeStyle=r?s.palette.text.secondary:s.palette.text.primary,e.strokeStyle=s.palette.text.primary,e.strokeRect(t,n,o,a)}function ca(e,t,n,o,a,s,r,i=!1){const l=function(e,t,n){if(!(t>1||void 0===e))return n?1===e?4:3:1===e?3:4}(t.strand,n,s.reversed);void 0!==l&&la(e,ia(t,n,o,s),l*a,t.length/n,a,r,i)}function da(e,t,n,o,a,r,i,l=!1){const c=t.parent;if(!c)return;const d=c.cdsLocations.find((e=>{const n=e.at(1===t.strand?0:-1)?.min,o=e.at(1===t.strand?-1:0)?.max;return t.min===n&&t.max===o}));if(d)for(const c of d){const d=ra(s.getFrame(c.min,c.max,t.strand??1,c.phase),n,r.reversed);la(e,ia(c,n,o,r),d*a,(c.max-c.min)/n,a,i,l)}}function ua(e,t,n,o,a){const s=Math.min(o,10);e.fillStyle="#000",e.font=`${s}px`;const r=e.measureText(a).width,i=Math.round(t+(o-r)/2);e.fillText(a,i,n+10)}function ga(e,t,n,o,a,s,r,i){const l=t<=1?[3,2,1,0,0,-1,-2,-3]:[3,2,1,-1,-2,-3];i&&l.reverse();for(const[t,i]of l.entries()){const l=n.palette.framesCDS.at(i)?.main;if(!l)continue;const c=t*r;e.fillStyle=o?n.palette.background.default:l,e.fillRect(a,c,s,r),o&&Ao(e,a,c,s,r,n.palette.grey[200])}}function fa(e,t,n,o,a,r,i){if(1/a<1)return;const l=Math.round(o+n/a),c=Math.round(o+(n+1)/a)-l,d=[-1,1];for(const n of d){const o=(1===n?3:4)*r,d=1===n?t:s.revcom(t);e.fillStyle=oa(d,i),e.fillRect(l,o,c,r),1/a>=12&&(Ao(e,l,o,c,r,i.palette.text.disabled),ua(e,l,o,c,d))}}function ha(e,t,n,o,a,r,i,l,c,d,u){const g=(i<=1?[0,2,1,0,7,6,5]:[0,2,1,0,5,4,3]).map((e=>e*c)),f=[-1,1];for(const h of f){const f=s.getFrame(l,l+3,h,0),p=g.at(f);if(void 0===p)continue;const m=Math.round(n+o/i),y=Math.round(n+(o+3)/i)-m,b=1===h?t:s.revcom(t),x=s.defaultCodonTable[b],w=na(x,a,r);w&&(u&&"*"==x||d&&"*"!=x)&&(e.fillStyle=w,e.fillRect(m,p,y,c)),1/i>=4&&(Ao(e,m,p,y,c,a.palette.text.disabled),ua(e,m,p,y,x))}}function pa(e,t){return function(e,t){const n=function(e,t){return a.BaseDisplay.named("BaseLinearApolloReferenceSequenceDisplay").props({type:l.types.literal("LinearApolloReferenceSequenceDisplay"),configuration:o.ConfigurationReference(t),showStartCodons:!1,showStopCodons:!0,highContrast:!1,heightPreConfig:l.types.maybe(l.types.refinement("displayHeight",l.types.number,(e=>e>=20))),sequenceRowHeight:15}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...ne.getParentRenderProps(e),config:t.renderer})}})).views((e=>({get lgv(){return s.getContainingView(e)}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return s.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:o})=>({assemblyName:e,refName:n,start:Math.round(o),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>3)return"Zoom in to see sequence"}}))).views((e=>({get expandedRegions(){return e.lgv.dynamicBlocks.contentBlocks.map((e=>{const{assemblyName:t,end:n,refName:o,start:a}=e,{parentRegion:s}=e;return{assemblyName:t,refName:o,start:Math.round(Math.max(a-5,s.start)),end:Math.round(Math.min(n+5,s.end))}}))},get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=l.getRoot(e),{assemblyName:a}=t,{assemblyManager:s}=e.session,r=s.get(a);if(!r)throw new Error(`No assembly found with name ${a}`);const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);return n.find((e=>o.getConf(e,"internetAccountId")===i))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,o=n.get(t);if(!o)throw new Error(`Could not find assembly named ${t}`);return o.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature},get height(){const{sequenceRowHeight:t}=e;return e.lgv.bpPerPx<=1?8*t:6*t}}))).volatile((()=>({scrollTop:0}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},toggleShowStartCodons(){e.showStartCodons=!e.showStartCodons},toggleShowStopCodons(){e.showStopCodons=!e.showStopCodons},toggleHighContrast(){e.highContrast=!e.highContrast}}))).views((e=>{const{trackMenuItems:t}=e;return{trackMenuItems(){const{showStartCodons:n,showStopCodons:o,highContrast:a}=e;return[...t(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show start codons",type:"checkbox",checked:n,onClick:()=>{e.toggleShowStartCodons()}},{label:"Show stop codons",type:"checkbox",checked:o,onClick:()=>{e.toggleShowStopCodons()}},{label:"Use high contrast colors",type:"checkbox",checked:a,onClick:()=>{e.toggleHighContrast()}}]}]}}})).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&e.lgv.bpPerPx<=3&&e.session.apolloDataStore.loadRefSeq(e.expandedRegions)}),{name:"LinearApolloReferenceSequenceDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloReferenceSequenceDisplayRendering").volatile((()=>({seqTrackCanvas:null,seqTrackOverlayCanvas:null,theme:i.createTheme()}))).actions((e=>({setSeqTrackCanvas(t){e.seqTrackCanvas=t},setSeqTrackOverlayCanvas(t){e.seqTrackOverlayCanvas=t},setTheme(t){e.theme=t},afterAttach(){l.addDisposer(e,c.autorun((()=>{const{lgv:t,seqTrackCanvas:n,theme:o,highContrast:a,showStartCodons:r,showStopCodons:i,sequenceRowHeight:l,session:c}=e;if(!t.initialized||e.regionCannotBeRendered()||!n)return;if(3/t.bpPerPx<1)return;const{bpPerPx:d,offsetPx:u,dynamicBlocks:g}=t;!function(e,t,n,o,a,r,i,l,c,d){const u=e.getContext("2d");if(!u)return;u.clearRect(0,0,e.width,e.height);const{apolloDataStore:g}=d;for(const e of a.contentBlocks){const a=e.offsetPx-o;ga(u,n,t,r,a,e.widthPx,c,e.reversed);const d=g.assemblies.get(e.assemblyName),f=d?.getByRefName(e.refName),h=Math.floor(e.start),p=Math.ceil(e.end);let m=f?.getSequence(h,p);if(!m)return;m=m.toUpperCase(),e.reversed&&(m=s.revcom(m));const y=a-(e.reversed?p-e.end:e.start-h)/n;for(let o=0;o<m.length;o++){const a=e.reversed?p-o:h+o,s=m.slice(o,o+3);fa(u,m[o],o,y,n,c,t),3===s.length&&ha(u,s,y,o,t,r,n,a,c,i,l)}}}(n,o,d,u,g,a,r,i,l,c)}),{name:"LinearApolloReferenceSequenceDisplayRenderSequence"})),l.addDisposer(e,c.autorun((()=>{const{seqTrackOverlayCanvas:t}=e;if(!e.lgv.initialized||e.regionCannotBeRendered()||!t)return;const n=t.getContext("2d");if(!n)return;n.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.height);const{hoveredFeature:o,selectedFeature:a,lgv:s,sequenceRowHeight:r,session:i,theme:l}=e;if(!o&&!a)return;const{bpPerPx:c,dynamicBlocks:d,offsetPx:u}=s;!function(e,t,n,o,a,s,r,i,l,c){const{featureTypeOntology:d}=r.apolloDataStore.ontologyManager;if(!d)throw new Error("featureTypeOntology is undefined");for(const r of c.contentBlocks){t.save(),t.beginPath(),t.rect(r.offsetPx-l,0,r.widthPx,e.height),t.clip();for(const e of[o,n?.feature].filter((e=>void 0!==e)))d.isTypeOf(e.type,"CDS")?da(t,e,i,l,a,r,s,e._id===o?._id):ca(t,e,i,l,a,r,s,e._id===o?._id);t.restore()}}(t,n,o,a,r,l,i,c,u,d)}),{name:"LinearApolloReferenceSequenceDisplayRenderSequenceHighlight"}))}})))}(0,t).named("LinearApolloReferenceSequenceDisplay")}const ma=E.observer((function(e){const t=i.useTheme(),{model:n}=e,{height:o,regionCannotBeRendered:a,setSeqTrackCanvas:r,setSeqTrackOverlayCanvas:l,setTheme:c}=n,{classes:d}=ea();v.useEffect((()=>{c(t)}),[t,c]);const u=s.getContainingView(n),g=a();return g?m.jsx(i.Alert,{severity:"warning",classes:{message:d.ellipses},slotProps:{root:{className:d.center}},children:m.jsx(i.Tooltip,{title:g,children:m.jsx("div",{children:g})})}):m.jsx(m.Fragment,{children:3/u.bpPerPx>=1?m.jsxs("div",{className:d.canvasContainer,style:{width:u.dynamicBlocks.totalWidthPx,height:o},children:[m.jsx("canvas",{ref:async e=>{await Promise.resolve(),r(e)},width:u.dynamicBlocks.totalWidthPx,height:o,className:d.canvas,"data-testid":"seqTrackCanvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),l(e)},width:u.dynamicBlocks.totalWidthPx,height:o,className:d.canvas,"data-testid":"seqTrackOverlayCanvas"})]}):null})})),ya=o.ConfigurationSchema("LinearApolloSixFrameDisplay",{},{explicitIdentifier:"displayId",explicitlyTyped:!0}),ba=E.observer((function({sourceFeature:e,filteredTranscripts:t,handleClose:n,onUpdate:o}){const a=[];if(e.children)for(const[,t]of e.children){const e=t.attributes.get("gff_id")?.toString();e&&a.push(e)}const[s,r]=v.useState(t);return m.jsx(Ge,{open:!0,maxWidth:!1,"data-testid":"filter-transcripts-dialog",title:"Filter transcripts by ID",handleClose:n,children:m.jsxs(i.DialogContent,{children:[m.jsx(i.DialogContentText,{children:"Select the alternate transcripts you want to display in the apollo track"}),m.jsx(i.Grid,{container:!0,spacing:2,children:m.jsx(i.Grid,{size:8,children:m.jsx(i.FormGroup,{children:a.map((e=>m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:!s.includes(e),onChange:()=>{(e=>{const t=s.includes(e)?s.filter((t=>t!==e)):[...s,e];o(t),r(t)})(e)},slotProps:{input:{"aria-label":"controlled"}}}),label:e})))})})})]})})}));let xa=null,wa=null,Sa=null,Ca=null;const va=globalThis.document.createElement("canvas");if(va?.getContext)for(const e of["forward","backward"])for(const t of["light","dark"]){const n=document.createElement("canvas"),o=10;n.width=n.height=o;const a=n.getContext("2d");if(a){const s="light"===t?"rgba(0,0,0,0)":"rgba(0,0,0,0.75)",r="light"===t?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.50)",i="forward"===e?a.createLinearGradient(0,o,o,0):a.createLinearGradient(0,0,o,o);i.addColorStop(0,s),i.addColorStop(.25,s),i.addColorStop(.25,r),i.addColorStop(.5,r),i.addColorStop(.5,s),i.addColorStop(.75,s),i.addColorStop(.75,r),i.addColorStop(1,r),a.fillStyle=i,a.fillRect(0,0,10,10),"forward"===e?"light"===t?xa=a.createPattern(n,"repeat"):Sa=a.createPattern(n,"repeat"):"light"===t?wa=a.createPattern(n,"repeat"):Ca=a.createPattern(n,"repeat")}}function ja(e,t){for(const n of e)if(I(n,t))return!0;return!1}function Ta(e,t,n){const{filteredTranscripts:o,session:a}=n,{apolloDataStore:r}=a,{featureTypeOntology:i}=r.ontologyManager;if(!i)throw new Error("featureTypeOntology is undefined");const l=i.isTypeOf(t.type,"transcript"),c=t.attributes.get("gff_id")?.toString();if(c&&o.includes(c))return;const{bp:d,refName:u,regionNumber:g,x:f}=e,{lgv:h}=n;if(l){const e=t;if(!e.children)return;const n=[],o=[];for(const t of e.children.values()){const e=i.isTypeOf(t.type,"exon"),a=i.isTypeOf(t.type,"CDS");e?n.push(t):a&&o.push(t)}const a=n.find((e=>{const[t,n]=s.intersection2(d,d+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(a){const e=it(a,u,g,h);if(e){const t=lt(a,f,e);if(t)return t}}for(const t of e.cdsLocations)for(const e of t){const t=it(e,u,g,h);if(t){const e=o.find((e=>{const[t,n]=s.intersection2(d,d+1,e.min,e.max);return void 0!==t&&void 0!==n}));if(e){const n=lt(e,f,t);if(n)return n}}}}}const Aa={draw:function(e,t,n,o,a){const{apolloRowHeight:r,lgv:l,session:c,theme:d,highestRow:u,filteredTranscripts:g,selectedFeature:f,showFeatureLabels:h}=o,{bpPerPx:p,displayedRegions:m,offsetPx:y}=l,b=m[a],{refName:x,reversed:w}=b,S=r,C=S,v=S,j=S,T=h?2:1,A=d.palette.text.primary,{attributes:F,children:k,min:D,strand:N}=t;if(!k)return;const{apolloDataStore:I}=c,{featureTypeOntology:R}=I.ontologyManager;if(!R)throw new Error("featureTypeOntology is undefined");const M=[],E=(l.bpToPx({refName:x,coord:D,regionNumber:a})?.offsetPx??0)-y,L=t.length/p,q=w?E-L:E,P=(1==N?3:4)*T*S;e.fillStyle=d.palette.text.primary,e.fillRect(q,P,L,j),e.fillStyle=ct(t,f)?i.alpha("rgb(0,0,0)",.7):i.alpha(d.palette.background.paper,.7),e.fillRect(q+1,P+1,L-2,j-2);const _=ct(t,f),O={x:q,y:P,h:j,text:F.get("gff_id")?.toString(),color:A,isSelected:_};_?M.unshift(O):M.push(O);const B="dark"===d.palette.mode?Sa:xa,U="dark"===d.palette.mode?Ca:wa,$=w?-1:1;let z=null,W=null;N&&([z,W]=N*$==1?[B,U]:[U,B]),z&&W&&(e.fillStyle=z,e.fillRect(q+1,P+1,L-2,(j-2)/2),e.fillStyle=W,e.fillRect(q+1,P+(j-2)/2,L-2,(j-2)/2));const G=new Set;for(const[,t]of k){if(!R.isTypeOf(t.type,"transcript")&&!R.isTypeOf(t.type,"pseudogenic_transcript"))continue;const{children:n,cdsLocations:o}=t;if(!n)continue;const r=t.attributes.get("gff_id")?.toString();if(r&&g.includes(r))continue;for(const[,t]of n){if(!R.isTypeOf(t.type,"exon"))continue;const n=(l.bpToPx({refName:x,coord:t.min,regionNumber:a})?.offsetPx??0)-y,o=t.length/p,s=w?n-o:n,r=P+(j-C)/2,c=ct(t,f);if(e.fillStyle=d.palette.text.primary,e.fillRect(s,r,o,C),o>2){e.clearRect(s+1,r+1,o-2,C-2),e.fillStyle=c?"rgb(0,0,0)":i.alpha("#f5f500",.6),e.fillRect(s+1,r+1,o-2,C-2),z&&W&&(e.fillStyle=z,e.fillRect(s+1,r+1,o-2,(C-2)/2),e.fillStyle=W,e.fillRect(s+1,r+1+(C-2)/2,o-2,(C-2)/2));const n={x:s,y:r,h:C,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(n):M.push(n)}}const c=ct(t,f?.parent);let m=0,b=0;for(const n of o){let o=0,r=0,i=1;for(const g of n.toSorted(((e,t)=>e.max-t.max)))if(f&&c&&R.isTypeOf(f.type,"CDS")||!ja(G,g)){const n=(g.max-g.min)/p,C=(l.bpToPx({refName:x,coord:g.min,regionNumber:a})?.offsetPx??0)-y;m=w?C-n:C,e.fillStyle=d.palette.text.primary;const j=s.getFrame(g.min,g.max,t.strand??1,g.phase),A=(h?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).at(j);if(void 0===A)continue;if(b=A*S,e.fillRect(m,b,n,v),i>1){const t=[(m-r)/2+r,Math.max(j<0?S*T*u+1:1,Math.min(o,b)-S/2)];e.strokeStyle="rgb(0, 128, 128)",e.beginPath(),e.moveTo(r,o),e.lineTo(...t),e.stroke(),e.moveTo(...t),e.lineTo(m,b+S/2),e.stroke()}if(r=m+n,o=b+S/2,i+=1,n>2){e.clearRect(m+1,b+1,n-2,v-2);const t=d.palette.framesCDS.at(j)?.main,o=t??"rgb(171,71,188)";e.fillStyle=o,e.fillStyle=f&&c&&R.isTypeOf(f.type,"CDS")?"rgb(0,0,0)":o,e.fillRect(m+1,b+1,n-2,v-2),z&&W&&(e.fillStyle=z,e.fillRect(m+1,b+1,n-2,(v-2)/2),e.fillStyle=W,e.fillRect(m+1,b+(v-2)/2,n-2,(v-2)/2))}G.add(g)}}const F={x:m,y:b,h:v,text:t.attributes.get("gff_id")?.toString(),color:A,isSelected:c};c?M.unshift(F):M.push(F)}h&&function(e,t,n="10px sans-serif"){for(let o=t.length-1;o>=0;--o){const a=t[o];e.fillStyle=a.color;const r=a.x+1,i=a.y+a.h,l=s.measureText(a.text,10);a.isSelected&&(e.font="bold ".concat(n)),a.text&&(e.clearRect(r-5,i,l+10,a.h),e.fillText(a.text,r,i+11,l),e.font=n)}}(e,M)},drawDragPreview:function(e,t){const{apolloDragging:n,apolloRowHeight:o,lgv:a,theme:s}=e,{bpPerPx:r,displayedRegions:l,offsetPx:c}=a;if(!n)return;const{current:d,edge:u,feature:g,start:f}=n,h=Math.floor(f.y/o),p=l[f.regionNumber],m=(p.reversed?p.end-g[u]:g[u]-p.start)/r-c,y=Math.min(d.x,m),b=h*o,x=Math.abs(d.x-m),w=1*o;t.strokeStyle=s.palette.info.main,t.setLineDash([6]),t.strokeRect(y,b,x,w),t.fillStyle=i.alpha(s.palette.info.main,.2),t.fillRect(y,b,x,w)},drawOverlay:function(e,t){const{hoveredFeature:n,apolloRowHeight:o,filteredTranscripts:a,lgv:r,highestRow:i,session:l,showFeatureLabels:c}=e;if(!n)return;const{feature:d}=n,{apolloDataStore:u}=l,{featureTypeOntology:g}=u.ontologyManager;if(!g)throw new Error("featureTypeOntology is undefined");if(!g.isTypeOf(d.type,"transcript"))return;const f=d.attributes.get("gff_id")?.toString();if(f&&a.includes(f))return;const h=e.getFeatureLayoutPosition(d);if(!h)return;const{bpPerPx:p,displayedRegions:m,offsetPx:y}=r,{layoutIndex:b}=h,x=m[b],{refName:w,reversed:S}=x,C=o,v=C,j=c?2:1,{cdsLocations:T,strand:A}=d;for(const e of T){let n=0,o=0,a=1;for(const l of e.toSorted(((e,t)=>e.max-t.max))){const e=(l.max-l.min)/p,d=(r.bpToPx({refName:w,coord:l.min,regionNumber:b})?.offsetPx??0)-y,u=S?d-e:d,g=s.getFrame(l.min,l.max,A??1,l.phase),f=(c?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).at(g);if(void 0===f)continue;const h=f*C;if(a>1){const e=[(u-o)/2+o,Math.max(g<0?C*j*i+1:1,Math.min(n,h)-C/2)];t.strokeStyle="rgb(0, 0, 0)",t.lineWidth=2,t.beginPath(),t.moveTo(o,n),t.lineTo(...e),t.stroke(),t.moveTo(...e),t.lineTo(u,h+C/2),t.stroke()}o=u+e,n=h+C/2,a+=1,e>2&&(t.fillStyle="rgba(255,0,0,0.6)",t.fillRect(u,h,e,v))}}},drawTooltip:function(e,t){const{hoveredFeature:n,apolloRowHeight:o,filteredTranscripts:a,lgv:r,session:l,showFeatureLabels:c,theme:d}=e;if(!n)return;const{feature:u,bp:g}=n,{featureTypeOntology:f}=l.apolloDataStore.ontologyManager;if(!f)throw new Error("featureTypeOntology is undefined");if(!f.isTypeOf(u.type,"transcript"))return;const{attributes:h,strand:p,type:m}=u,y=e.getFeatureLayoutPosition(u);if(!y)return;const b=h.get("gff_id")?.toString();if(b&&a.includes(b))return;const{layoutIndex:x}=y,{bpPerPx:w,displayedRegions:S,offsetPx:C}=r,v=S[x],{refName:j,reversed:T}=v,A=o;let F,k="Loc: ";for(const e of u.cdsLocations)for(const t of e)if(g>=t.min&&g<=t.max){F=t;break}if(!F)return;const{max:D,min:N,phase:I}=F;k+=`${N+1}–${D}`;let R=(r.bpToPx({refName:j,coord:T?D:N,regionNumber:x})?.offsetPx??0)-C;const M=s.getFrame(N,D,p??1,I),E=(c?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).at(M);if(void 0===E)return;const L=E*A,q=(D-N)/w,P=`Type: ${F.type}`,_=h.get("gff_name")?.find((e=>""!==e)),O=[t.measureText(P).width,t.measureText(k).width];_&&O.push(t.measureText(`Parent Type: ${m}`).width,t.measureText(`Parent Name: ${_}`).width);const B=Math.max(...O);R=R+q+5,t.fillStyle=i.alpha(d.palette.text.primary,.7),t.fillRect(R,L,B+4,4===O.length?55:35),t.beginPath(),t.moveTo(R,L),t.lineTo(R-5,L+5),t.lineTo(R,L+10),t.fill(),t.fillStyle=d.palette.background.default;let U=L+12;t.fillText(P,R+2,U),_&&(U+=12,t.fillText(`Parent Type: ${m}`,R+2,U),U+=12,t.fillText(`Parent Name: ${_}`,R+2,U)),U+=12,t.fillText(k,R+2,U)},getContextMenuItems:function(e,t){const{apolloInternetAccount:n,hoveredFeature:o,changeManager:a,filteredTranscripts:r,regions:i,selectedFeature:c,session:d}=e,[u]=i,g=e.getAssemblyId(u.assemblyName),f=[],h=n?n.role:"admin",p=!(h&&["admin","user"].includes(h));if(!o)return f;const{featureTypeOntology:m}=d.apolloDataStore.ontologyManager;if(!m)throw new Error("featureTypeOntology is undefined");if(mt(t)){const{bp:n,feature:o}=t;let i=me(o,n);ot(o,d)&&(i=me(o,n,!0));for(const t of i){const n=t.attributes.get("gff_id")?.toString();if(n&&r.includes(n))continue;const o=ut(e,t);if(nt(t,d)){const n=st(t,e),r=s.getContainingView(e);if(n.upstream){const a=n.upstream;o.push({label:"Go to upstream exon",icon:rt(t.strand,!0,r.displayedRegions.at(0)?.reversed),onClick:()=>{r.navTo(gt(a,.1,r.totalBp)),Qe(e,a)}})}if(n.downstream){const a=n.downstream;o.push({label:"Go to downstream exon",icon:rt(t.strand,!1,r.displayedRegions.at(0)?.reversed),onClick:()=>{r.navTo(gt(a,.1,r.totalBp)),Qe(e,a)}})}o.push({label:"Merge exons",disabled:p,onClick:()=>{d.queueDialog((n=>[$t,{session:d,handleClose:()=>{n()},changeManager:a,sourceFeature:t,sourceAssemblyId:g,selectedFeature:c,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}},{label:"Split exon",disabled:p,onClick:()=>{d.queueDialog((n=>[en,{session:d,handleClose:()=>{n()},changeManager:a,sourceFeature:t,sourceAssemblyId:g,selectedFeature:c,setSelectedFeature:t=>{e.setSelectedFeature(t)}}]))}})}m.isTypeOf(t.type,"gene")&&o.push({label:"Filter alternate transcripts",onClick:()=>{d.queueDialog((n=>[ba,{handleClose:()=>{n()},sourceFeature:t,filteredTranscripts:l.getSnapshot(r),onUpdate:t=>{e.updateFilteredTranscripts(t)}}]))}}),f.push({label:t.type,subMenu:o})}}return f},getContextMenuItemsForFeature:ut,onMouseDown:function(e,t,n){const{feature:o}=t,a=Ta(t,o,e);a&&(n.stopPropagation(),e.startDrag(t,a.feature,a.edge,!0))},onMouseLeave:function(){},onMouseMove:function(e,t){if(mt(t)){const{feature:n,bp:o}=t;if(e.setHoveredFeature({feature:n,bp:o}),Ta(t,n,e))return void e.setCursor("col-resize")}e.setCursor()},onMouseUp:function(e,t){if(!e.apolloDragging&&mt(t)){const{feature:n}=t,{session:o}=e,{apolloDataStore:a}=o,{featureTypeOntology:s}=a.ontologyManager;if(e.setSelectedFeature(n),!s)throw new Error("featureTypeOntology is undefined");let r=!1;for(const[,e]of n.children??[])if(s.isTypeOf(e.type,"CDS")||s.isTypeOf(e.type,"exon")){r=!0;break}(s.isTypeOf(n.type,"transcript")||s.isTypeOf(n.type,"pseudogenic_transcript"))&&r?e.showFeatureDetailsWidget(n,["ApolloTranscriptDetails","apolloTranscriptDetails"]):e.showFeatureDetailsWidget(n)}}};function Fa(e,t,n,o,a,r,i,l,c,d,u,g){const f=(d?[0,4,2,0,14,12,10]:[0,2,1,0,7,6,5]).map((e=>e*c)),h=[-1,1];for(const d of h){const h=s.getFrame(l,l+3,d,0),p=f.at(h);if(void 0===p)continue;const m=Math.round(n+o/i),y=0===Math.round(3/i)?1:Math.round(3/i),b=1===d?t:s.revcom(t),x=s.defaultCodonTable[b],w=na(x,a,r);w&&(g&&"*"==x||u&&"*"!=x)&&(e.fillStyle=w,e.fillRect(m,p,y,c))}}function ka(e,n){return function(e,n){return function(e,t){const n=function(e,t){return function(e,t){const n=function(e,t){return a.BaseDisplay.named("BaseLinearApolloSixFrameDisplay").props({type:l.types.literal("LinearApolloSixFrameDisplay"),configuration:o.ConfigurationReference(t),graphical:!0,table:!1,showFeatureLabels:!0,showStartCodons:!1,showStopCodons:!0,showCheckResults:!0,zoomThreshold:200,heightPreConfig:l.types.maybe(l.types.refinement("displayHeight",l.types.number,(e=>e>=20))),filteredFeatureTypes:l.types.array(l.types.string)}).views((e=>{const{configuration:t,renderProps:n}=e;return{renderProps:()=>({...n(),...ne.getParentRenderProps(e),config:t.renderer})}})).volatile((()=>({scrollTop:0}))).views((e=>({get lgv(){return s.getContainingView(e)},get height(){return e.heightPreConfig?e.heightPreConfig:e.graphical&&e.table?500:e.graphical?e.showFeatureLabels?400:200:300},get zoomThresholdSetting(){return e.zoomThreshold??o.getConf(e,"zoomThreshold")}}))).views((e=>({get rendererTypeName(){return e.configuration.renderer.type},get session(){return s.getSession(e)},get regions(){return e.lgv.dynamicBlocks.contentBlocks.map((({assemblyName:e,end:t,refName:n,start:o})=>({assemblyName:e,refName:n,start:Math.round(o),end:Math.round(t)})))},regionCannotBeRendered(){if(e.lgv&&e.lgv.bpPerPx>=e.zoomThreshold)return"Zoom in to see annotations"}}))).views((e=>({get apolloInternetAccount(){const[t]=e.regions,{internetAccounts:n}=l.getRoot(e),{assemblyName:a}=t,{assemblyManager:s}=e.session,r=s.get(a);if(!r)throw new Error(`No assembly found with name ${a}`);const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);return n.find((e=>o.getConf(e,"internetAccountId")===i))},get changeManager(){return e.session.apolloDataStore.changeManager},getAssemblyId(t){const{assemblyManager:n}=e.session,o=n.get(t);if(!o)throw new Error(`Could not find assembly named ${t}`);return o.name},get selectedFeature(){return e.session.apolloSelectedFeature},get hoveredFeature(){return e.session.apolloHoveredFeature}}))).actions((e=>({setScrollTop(t){e.scrollTop=t},setHeight:t=>(e.heightPreConfig=Math.max(t,20),e.height),resizeHeight(t){const n=e.height;return this.setHeight(e.height+t)-n},showGraphicalOnly(){e.graphical=!0,e.table=!1},showTableOnly(){e.graphical=!1,e.table=!0},showGraphicalAndTable(){e.graphical=!0,e.table=!0},toggleShowFeatureLabels(){e.showFeatureLabels=!e.showFeatureLabels},toggleShowStartCodons(){e.showStartCodons=!e.showStartCodons},toggleShowStopCodons(){e.showStopCodons=!e.showStopCodons},toggleShowCheckResults(){e.showCheckResults=!e.showCheckResults},updateFilteredFeatureTypes(t){e.filteredFeatureTypes=l.cast(t)},setZoomThresholdSetting({zoomThreshold:t}){e.zoomThreshold=t}}))).views((e=>{const{filteredFeatureTypes:t,trackMenuItems:n}=e;return{trackMenuItems(){const{graphical:o,table:a,showFeatureLabels:r,showStartCodons:i,showStopCodons:c,showCheckResults:d}=e;return[...n(),{type:"subMenu",label:"Appearance",subMenu:[{label:"Show graphical display",type:"radio",checked:o&&!a,onClick:()=>{e.showGraphicalOnly()}},{label:"Show table display",type:"radio",checked:a&&!o,onClick:()=>{e.showTableOnly()}},{label:"Show both graphical and table display",type:"radio",checked:a&&o,onClick:()=>{e.showGraphicalAndTable()}},{label:"Feature Labels",type:"checkbox",checked:r,onClick:()=>{e.toggleShowFeatureLabels()}},{label:"Show start codons",type:"checkbox",checked:i,onClick:()=>{e.toggleShowStartCodons()}},{label:"Show stop codons",type:"checkbox",checked:c,onClick:()=>{e.toggleShowStopCodons()}},{label:"Check Results",type:"checkbox",checked:d,onClick:()=>{e.toggleShowCheckResults()}},{label:"Change zoom threshold",onClick:()=>{s.getSession(e).queueDialog((t=>[Qo,{model:e,handleClose:t}]))}}]},{label:"Filter features by type",onClick:()=>{const n=e.session;e.session.queueDialog((o=>[Yo,{session:n,handleClose:()=>{o()},featureTypes:l.getSnapshot(t),onUpdate:t=>{e.updateFilteredFeatureTypes(t)}}]))}}]}}})).actions((e=>({setSelectedFeature(t){e.session.apolloSetSelectedFeature(t)},setHoveredFeature(t){e.session.apolloSetHoveredFeature(t)},showFeatureDetailsWidget(t,n){const[o]=e.regions,{assemblyName:a,refName:s}=o,r=e.getAssemblyId(a);if(!r)return;const{session:i}=e,{changeManager:l}=i.apolloDataStore,[c,d]=n??["ApolloFeatureDetailsWidget","apolloFeatureDetailsWidget"],u=i.addWidget(c,d,{feature:t,assembly:r,refName:s,changeManager:l});i.showWidget(u)},afterAttach(){l.addDisposer(e,c.autorun((()=>{e.lgv.initialized&&!e.regionCannotBeRendered()&&(e.session.apolloDataStore.loadFeatures(e.regions),e.lgv.bpPerPx<=e.zoomThreshold&&e.session.apolloDataStore.loadRefSeq(e.regions))}),{name:"LinearApolloSixFrameDisplayLoadFeatures",delay:1e3}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayLayouts").props({featuresMinMaxLimit:5e5}).volatile((()=>({seenFeatures:c.observable.map()}))).views((e=>({get featuresMinMax(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map((n=>{const o=t.get(n.assemblyName);let a,r;const{end:i,refName:l,start:c}=n;for(const[,t]of e.seenFeatures)l!==o?.getCanonicalRefName(t.refSeq)||!s.doesIntersect2(c,i,t.min,t.max)||t.length>e.featuresMinMaxLimit||(void 0===a&&({min:a}=t),void 0===r&&({max:r}=t),t.minWithChildren<a&&({min:a}=t),t.maxWithChildren>r&&({max:r}=t));if(void 0!==a&&void 0!==r)return[a,r]}))},getGlyph:e=>Aa,featureLabelSpacer:t=>e.showFeatureLabels?2*t-1:t}))).actions((e=>({addSeenFeature(t){e.seenFeatures.set(t._id,t)},deleteSeenFeature(t){e.seenFeatures.delete(t)}}))).views((e=>({get geneTrackRowNums(){return[4,5].map((t=>e.featureLabelSpacer(t)))}}))).views((e=>({get featureLayouts(){const{assemblyManager:t}=e.session;return e.lgv.displayedRegions.map(((n,o)=>{const a=t.get(n.assemblyName),r=new Map;if(!e.featuresMinMax[o])return r;const{end:i,refName:c,start:d}=n;for(const[t,n]of e.seenFeatures.entries()){if(!l.isAlive(n)){e.deleteSeenFeature(t);continue}if(c!==a?.getCanonicalRefName(n.refSeq)||!s.doesIntersect2(d,i,n.min,n.max))continue;const{featureTypeOntology:o}=e.session.apolloDataStore.ontologyManager;if(!o)throw new Error("featureTypeOntology is undefined");if(at(n,e.session)){const t=1==n.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1];r.get(t)||r.set(t,[]);const a=r.get(t);a?.push({rowNum:t,feature:n});const{children:i}=n;if(!i)continue;for(const[,t]of i)if(o.isTypeOf(t.type,"transcript")){const{cdsLocations:n,strand:a,children:i}=t;if(i)for(const[,t]of i){if(!o.isTypeOf(t.type,"exon"))continue;const n=1==t.strand?e.geneTrackRowNums[0]:e.geneTrackRowNums[1],a=r.get(n);a?.push({rowNum:n,feature:t})}for(const o of n)for(const n of o){const o=s.getFrame(n.min,n.max,a??1,n.phase),i=(e.showFeatureLabels?[0,5,3,1,15,13,11]:[0,2,1,0,8,7,6]).at(o);if(void 0===i)continue;r.get(i)||r.set(i,[]);const l=r.get(i);l?.push({rowNum:i,feature:t})}}}}return r}))},getFeatureLayoutPosition(e){const{featureLayouts:t}=this;for(const[n,o]of t.entries())for(const[,t]of o)for(const{feature:o}of t)if(e._id===o._id)return{layoutIndex:n,layoutRow:0,featureRow:0}}}))).views((e=>({get highestRow(){return 5}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(e.lgv.initialized&&!e.regionCannotBeRendered())for(const t of e.regions){const n=e.session.apolloDataStore.assemblies.get(t.assemblyName),o=n?.getByRefName(t.refName),a=o?.features;if(a)for(const[,n]of a)s.doesIntersect2(t.start,t.end,n.min,n.max)&&!e.seenFeatures.has(n._id)&&e.addSeenFeature(n)}}),{name:"LinearApolloSixFrameDisplaySetSeenFeatures",delay:1e3}))}})))}(0,t).named("LinearApolloSixFrameDisplayRendering").props({apolloRowHeight:20,detailsMinHeight:200,detailsHeight:200,lastRowTooltipBufferHeight:120,isShown:!0,filteredTranscripts:l.types.array(l.types.string)}).volatile((()=>({canvas:null,overlayCanvas:null,collaboratorCanvas:null,theme:i.createTheme()}))).views((e=>({get featuresHeight(){return(e.highestRow+1)*e.apolloRowHeight*(e.showFeatureLabels?2:1)+e.lastRowTooltipBufferHeight}}))).actions((e=>({toggleShown(){e.isShown=!e.isShown},setDetailsHeight(t){e.detailsHeight=e.isShown?Math.max(Math.min(t,e.height-100),Math.min(e.height,e.detailsMinHeight)):t},setCanvas(t){e.canvas=t},setOverlayCanvas(t){e.overlayCanvas=t},setCollaboratorCanvas(t){e.collaboratorCanvas=t},setTheme(t){e.theme=t}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.collaboratorCanvas?.getContext("2d");if(t){t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);for(const n of e.session.collaborators){const{locations:o}=n;if(0===o.length)continue;let a=0;for(const s of e.lgv.displayedRegions){for(const r of o){if(r.refSeq!==s.refName)continue;const{end:o,refSeq:i,start:l}=r,c=e.lgv.bpToPx({refName:i,coord:l,regionNumber:a});if(!c)continue;const d=c.offsetPx-e.lgv.offsetPx,u=(o-l)/e.lgv.bpPerPx;t.fillStyle="rgba(0,255,0,.2)",t.fillRect(d,1,u,100),t.fillStyle="black",t.fillText(n.name,d+1,11,u-2)}a++}}}}),{name:"LinearApolloSixFrameDisplayRenderCollaborators"})),l.addDisposer(e,c.autorun((()=>{const{apolloRowHeight:t,canvas:n,featureLayouts:o,featuresHeight:a,lgv:r,session:i,theme:l,showFeatureLabels:c,showStartCodons:d,showStopCodons:u}=e;if(!r.initialized||e.regionCannotBeRendered())return;const{bpPerPx:g,offsetPx:f,displayedRegions:h,dynamicBlocks:p}=r,m=n?.getContext("2d");if(m){m.clearRect(0,0,p.totalWidthPx,a);for(const[t,n]of o.entries()){const o=h[t];for(const[a,r]of n.entries())for(const{feature:n}of r){if(!at(n,e.session))continue;if(!s.doesIntersect2(o.start,o.end,n.min,n.max))continue;const{topLevelFeature:r}=n,i=e.getGlyph(r);void 0!==i&&i.draw(m,r,a,e,t)}}if(d||u){const{apolloDataStore:e}=i;for(const n of p.contentBlocks){const o=e.assemblies.get(n.assemblyName),a=o?.getByRefName(n.refName),s=Math.floor(n.start),r=Math.ceil(n.end);let i=a?.getSequence(s,r);if(!i)break;i=i.toUpperCase();const h=Math.round(n.offsetPx-f-(n.start-s)/g);for(let e=0;e<i.length;e++){const n=s+e;Fa(m,i.slice(e,e+3),h,e,l,!0,g,n,t,c,d,u)}}}}}),{name:"LinearApolloSixFrameDisplayRenderFeatures"}))}})))}(0,t);return n.named("LinearApolloSixFrameDisplayMouseEvents").volatile((()=>({apolloDragging:null,cursor:void 0}))).views((e=>({getMousePosition(t){const n=function(e,t){const n=e.currentTarget,{clientX:o,clientY:a}=e,{left:s,top:r}=n.getBoundingClientRect(),i=o-s,l=a-r,{coord:c,index:d,refName:u}=t.pxToBp(i);return{x:i,y:l,refName:u,bp:c,regionNumber:d}}(t,e.lgv),{bp:o,regionNumber:a,y:r}=n,i=Math.floor(r/e.apolloRowHeight)+1,l=e.featureLayouts[a].get(i);if(!l)return n;const{featureTypeOntology:c}=e.session.apolloDataStore.ontologyManager;if(!c)throw new Error("featureTypeOntology is undefined");let d;if(e.geneTrackRowNums.includes(i)?(d=l.find((e=>"exon"==e.feature.type&&o>=e.feature.min&&o<=e.feature.max)),d||(d=l.find((e=>o>=e.feature.min&&o<=e.feature.max)))):d=l.find((t=>{const{feature:n}=t,a=n.attributes.get("gff_id")?.toString();if(!c.isTypeOf(n.type,"transcript"))return!1;for(const t of n.cdsLocations)for(const r of t){const t=s.getFrame(r.min,r.max,n.strand??1,r.phase),l=(e.showFeatureLabels?[0,5,3,1,15,13,11]:[0,2,1,0,8,7,6]).at(t);if(i===l&&o>=r.min&&o<=r.max)return void 0===a||!e.filteredTranscripts.includes(a)}return!1})),!d)return n;const{feature:u}=d;return{...n,feature:u}}}))).actions((e=>({continueDrag(t,n){if(!e.apolloDragging)throw new Error("continueDrag() called with no current drag in progress");n.stopPropagation(),e.apolloDragging={...e.apolloDragging,current:t}},setDragging(t){e.apolloDragging=t??null}}))).actions((e=>({setCursor(t){e.cursor!==t&&(e.cursor=t)},updateFilteredTranscripts(t){e.filteredTranscripts=l.cast(t)}}))).actions((()=>({onClick(){}})))}(0,n).views((e=>({contextMenuItems(t){const{hoveredFeature:n}=e;if(!n)return[];const o=e.getMousePosition(t),{topLevelFeature:a}=n.feature,s=e.getGlyph(a);return mt(o)?s.getContextMenuItems(e,o):[]}}))).actions((e=>({startDrag(t,n,o,a=!1){e.apolloDragging={start:t,current:t,feature:n,edge:o,shrinkParent:a}},endDrag(){if(!e.apolloDragging)throw new Error("endDrag() called with no current drag in progress");const{current:n,edge:o,feature:a,start:s,shrinkParent:r}=e.apolloDragging;if(Math.abs(n.x-s.x)<=4)return e.setDragging(),void e.setCursor();const{displayedRegions:i}=e.lgv,l=e.getAssemblyId(i[s.regionNumber].assemblyName),c=pt(a,n.bp,o,r),d="max"===o?new t.LocationEndChange({typeName:"LocationEndChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldEnd:e.oldLocation,newEnd:e.newLocation}))),assembly:l}):new t.LocationStartChange({typeName:"LocationStartChange",changedIds:c.map((e=>e.featureId)),changes:c.map((e=>({featureId:e.featureId,oldStart:e.oldLocation,newStart:e.newLocation}))),assembly:l});e.changeManager.submit(d),e.setDragging(),e.setCursor()}}))).actions((e=>({onMouseDown(t){const n=e.getMousePosition(t);mt(n)&&e.getGlyph(n.feature).onMouseDown(e,n,t)},onMouseMove(t){const n=e.getMousePosition(t);if(e.apolloDragging)return e.setCursor("col-resize"),void e.continueDrag(n,t);mt(n)?e.getGlyph(n.feature).onMouseMove(e,n,t):(e.setHoveredFeature(),e.setCursor())},onMouseLeave(t){e.setDragging(),e.setHoveredFeature();const n=e.getMousePosition(t);mt(n)&&e.getGlyph(n.feature).onMouseLeave(e,n,t)},onMouseUp(t){const n=e.getMousePosition(t);mt(n)?e.getGlyph(n.feature).onMouseUp(e,n,t):e.setSelectedFeature(),e.apolloDragging&&e.endDrag()}}))).actions((e=>({afterAttach(){l.addDisposer(e,c.autorun((()=>{if(!e.lgv.initialized||e.regionCannotBeRendered())return;const t=e.overlayCanvas?.getContext("2d");if(!t)return;t.clearRect(0,0,e.lgv.dynamicBlocks.totalWidthPx,e.featuresHeight);const{apolloDragging:n,hoveredFeature:o}=e;if(!o)return;const a=e.getGlyph(o.feature);a.drawOverlay(e,t),a.drawTooltip(e,t),n&&e.getGlyph(n.feature.topLevelFeature).drawDragPreview(e,t)}),{name:"LinearApolloSixFrameDisplayRenderMouseoverAndDrag"}))}})))}(0,n).props({tabularEditor:l.types.optional(Co,{})}).named("LinearApolloSixFrameDisplay")}const Da=o.ConfigurationSchema("ApolloPlugin",{ontologies:l.types.array($e),featureTypeOntologyName:{description:"Name of the feature type ontology",type:"string",defaultValue:"Sequence Ontology"},hasRole:{description:"Flag used internally by jbrowse-plugin-apollo",type:"boolean",defaultValue:!1},skippedAttributesOnCopy:{description:"Feature attribute keys to skip when copying features",type:"stringArray",defaultValue:[]},geneBackgroundColor:{description:"Color for feature background",type:"string",defaultValue:"jexl:geneBackgroundColor(featureType)",contextVariable:["featureType"]}},{actions:e=>({addOntology(t){e.ontologies.push(t)}})}),Na=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogene")||n.isTypeOf(e.type,"pseudogenic_transcript")},Ia=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"gene")||n.isTypeOf(e.type,"pseudogene")},Ra=(e,t)=>{const{featureTypeOntology:n}=t.apolloDataStore.ontologyManager;if(!n)throw new Error("featureTypeOntology is undefined");return n.isTypeOf(e.type,"transcript")||n.isTypeOf(e.type,"pseudogenic_transcript")};function Ma(e){const{attributes:t}=e,n=["gene_name","gene_id","gene_stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}const Ea=e=>{const t=function(e){const{attributes:t}=e,n=["name","gff_name","transcript_name","gene_name"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e),n=function(e){const{attributes:t}=e,n=["id","gff_id","transcript_id","gene_id","gene_stable_id","stable_id"];for(const e of n){const n=t?.[e];if(n?.[0])return n[0]}return""}(e);return t?`${e.type} - ${t}`:n?`${e.type} - ${n}`:e.type};function La({annotationFeature:e,assembly:n,handleClose:a,refSeqId:s,session:r,region:c}){const d=r,u=o.readConfObject(d.getPluginConfiguration(),"skippedAttributesOnCopy"),g=new Set(u??[]),{featureTypeOntology:f}=d.apolloDataStore.ontologyManager,h=v.useMemo((()=>Object.keys(e.children??{})),[e]),[p,y]=v.useState(!0),[b,x]=v.useState(h),[w,S]=v.useState(""),[j,T]=v.useState([]),[A,F]=v.useState(!1),[k,D]=v.useState(),N=d.apolloDataStore.assemblies.get(n.name),I=N?.refSeqs.get(s),R=I?.getFeatures(c.start,c.end),M=()=>{const e=[];for(const t of R??[])if(!(t.min>c.end||t.max<c.start)&&f?.isTypeOf(t.type,"gene")){const n=l.getSnapshot(t);e.push(n)}return e};v.useEffect((()=>{S("");const e=M();T(e),D(e[0])}),[b,p,c]);const E=async e=>{if(k)for(const o of Object.keys(e)){const a={...e[o]};if(ye(a,g),a.strand=k.strand,a.children)for(const e of Object.keys(a.children))a.children[e].strand=k.strand;const s=new t.AddFeatureChange({parentFeatureId:k._id,changedIds:[k._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:a});await P(s,o)}},L=async o=>{const a={};for(const[e,t]of Object.entries(o)){const n={...t};ye(n,g),a[e]=n}const r=(new C).toHexString(),i=Math.min(...Object.values(a).map((e=>e.min))),l=Math.max(...Object.values(a).map((e=>e.max))),c=new t.AddFeatureChange({changedIds:[r],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{_id:r,refSeq:s,min:i,max:l,strand:e.strand,type:"gene",children:a,attributes:{name:[Ma(e)],gene_name:[Ma(e)]}}});await P(c,r)},q=async(e,o)=>{if(!k)return;const a=[];e!==k.min&&a.push(new t.LocationStartChange({typeName:"LocationStartChange",changedIds:[k._id],featureId:k._id,assembly:n.name,oldStart:k.min,newStart:e})),o!==k.max&&a.push(new t.LocationEndChange({typeName:"LocationEndChange",changedIds:[k._id],featureId:k._id,assembly:n.name,oldEnd:k.max,newEnd:o}));for(const e of a)await P(e)},P=async(e,t)=>{await d.apolloDataStore.changeManager.submit(e).then((()=>{d.apolloSetSelectedFeature(t)}))};return m.jsxs(Ge,{open:!0,title:"Create Apollo Annotation",handleClose:a,fullWidth:!0,maxWidth:"sm",children:[m.jsx(i.DialogTitle,{fontSize:15,children:"Select the feature to be copied to apollo track"}),m.jsxs(i.DialogContent,{children:[m.jsxs(i.Box,{sx:{ml:3},children:[Na(e,d)&&m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{size:"small",checked:p,onChange:e=>{const t=e.target.checked;y(t),x(t?h:[])}}),label:`${Ea(e)} (${e.min+1}..${e.max})`}),e.children&&m.jsx(i.Box,{sx:{display:"flex",flexDirection:"column",ml:3},children:Object.values(e.children).filter((e=>Ra(e,d))).map((e=>m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{size:"small",checked:b.includes(e._id),onChange:t=>{((e,t)=>{x((n=>e.target.checked?[...n,t._id]:n.filter((e=>e!==t._id))))})(t,e)}}),label:`${Ea(e)} (${e.min+1}..${e.max})`},e._id)))})]}),j.length>0&&(!p&&b.length>0||p&&Ra(e,d))&&m.jsxs("div",{style:{border:"1px solid #ccc",marginTop:20,padding:10,borderRadius:5},children:[m.jsxs(i.Box,{sx:{ml:3},children:[m.jsx(i.Typography,{variant:"caption",fontSize:12,children:"Select the destination feature to copy the selected features"}),m.jsx(i.Box,{sx:{mt:1},children:m.jsx(i.Select,{labelId:"label",style:{width:"100%"},value:k?._id??"",onChange:e=>{const t=j.find((t=>t._id===e.target.value));D(t)},disabled:A,children:j.map((e=>m.jsx(i.MenuItem,{value:e._id,children:`${Ea(e)} (${e.min+1}..${e.max})`},e._id)))})})]}),m.jsx(i.Box,{sx:{ml:3},children:m.jsx(i.FormGroup,{children:m.jsx(i.FormControlLabel,{control:m.jsx(i.Checkbox,{checked:A,onChange:e=>{F(e.target.checked)}}),label:"Create new gene"})})})]})]}),m.jsxs(i.DialogActions,{children:[m.jsx(i.Button,{variant:"contained",type:"submit",disabled:0===b.length||!p&&b.length>0&&!k,onClick:async()=>{if(p){if(Ia(e,d)&&(await(async()=>{const o={...e};let a;if(ye(o,g),o.children&&b.length!==Object.values(o.children).length){const s={};for(const e of b)s[e]=o.children[e];a=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:{...o,children:s}})}else a=new t.AddFeatureChange({changedIds:[e._id],typeName:"AddFeatureChange",assembly:n.name,addedFeature:o});await P(a,e._id)})(),r.notify("Successfully copied selected gene and transcript(s)","success")),Ra(e,d))if(k&&!A){const t={};if(t[e._id]=e,k.max<e.max||k.min>e.min){const n=Math.min(k.min,e.min),o=Math.max(k.max,e.max);await q(n,o),await E(t)}else await E(t);r.notify("Successfully copied selected transcripts to destination gene","success")}else{const t={};t[e._id]=e,await L(t),r.notify("Successfully created a new gene with selected transcripts","success")}}else{if(!e.children)return;if(k&&!A){const t={};for(const n of b)t[n]=e.children[n];const n=Math.min(...Object.values(t).map((e=>e.min))),o=Math.max(...Object.values(t).map((e=>e.max)));if(k.min>n||k.max<o){const e=Math.min(k.min,n),a=Math.max(k.max,o);await q(e,a),await E(t)}else await E(t);r.notify("Successfully copied transcript to destination gene","success")}else{const t={};for(const n of b)t[n]=e.children[n];await L(t),r.notify("Successfully created a new gene with selected transcript","success")}}a()},children:"Create"}),m.jsx(i.Button,{variant:"outlined",type:"submit",onClick:a,children:"Cancel"})]}),w?m.jsx(i.DialogContent,{children:m.jsx(i.DialogContentText,{color:"error",children:w})}):null]})}function qa(e){return m.jsx(i.SvgIcon,{viewBox:"0 0 856 855",style:{fontSize:18,marginRight:4},...e,children:m.jsxs("g",{children:[m.jsx("path",{style:{opacity:.68,fill:"#AEAEAE"},d:"M276.7,656.9l85-148h102.9c23.1,0,16.1-16,11.1-25l-134-238.5l85-148l185,315.6c0,0-15-26.3,0,0\n\t\t\tc53,92.9-24,243.9-132,243.9c-6,0-4,0-6.4,0H276.7z"}),m.jsx("polygon",{style:{opacity:.85,fill:"#717171"},points:"49.7,756.9 219.1,756.9 513.7,246.9 425.7,99.9 \t\t"}),m.jsx("polygon",{style:{opacity:.85,fill:"#717171"},points:"630,756.9 806.4,756.9 513.7,246.9 425.1,400.2 \t\t"}),m.jsx("polygon",{style:{fill:"#C6C6C6"},points:"175.7,657.3 195.6,657.3 277.9,508.9 254.1,508.9 170.6,657.3 \t\t"}),m.jsx("polygon",{style:{fill:"#C6C6C6"},points:"369.7,657.3 389.6,657.3 471.9,508.9 448.1,508.9 364.6,657.3 \t\t"}),m.jsx("polygon",{style:{fill:"#C6C6C6"},points:"321.7,657.3 341.6,657.3 423.9,508.9 400.1,508.9 316.6,657.3 \t\t"}),m.jsx("polygon",{style:{fill:"#C6C6C6"},points:"224.7,657.3 244.6,657.3 326.9,508.9 303.1,508.9 219.6,657.3 \t\t"}),m.jsx("polygon",{style:{fill:"#C6C6C6"},points:"273.7,657.3 293.6,657.3 375.9,508.9 352.1,508.9 268.6,657.3 \t\t"})]})})}function Pa(e){if("LinearPileupDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>s.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=this.getFirstRegion(),n=s.getSession(e),{assemblyManager:o}=n,{assemblyName:a}=t,r=o.get(a);if(!r)throw new Error(`Could not find assembly named ${a}`);return r},getAnnotationFeature(e,t){const n=e.get("start"),o=e.get("end"),a=e.get("strand"),s=e.get("name"),r=function(e){const t=/(\d+)([MIDNSHPX=])/g,n=[];let o;for(;null!==(o=t.exec(e));)n.push([o[2],Number.parseInt(o[1],10)]);return n}(e.get("CIGAR"));let i,l=n;const c=[];for(const[e,t]of r)switch(e){case"M":case"=":case"X":void 0===i&&(i=l),l+=t;break;case"N":void 0!==i&&(c.push({start:i,end:l}),i=void 0),l+=t;break;case"D":l+=t;break;case"I":case"S":case"H":case"P":break;default:throw new Error(`Unknown CIGAR operation: ${e}`)}void 0!==i&&c.push({start:i,end:l});const d={_id:C().toHexString(),refSeq:t,min:n,max:o,type:"mRNA",strand:a};if(s&&(d.attributes={},d.attributes.gff_name=[s]),0===c.length)return d;d.children={};for(const e of c){const n={_id:C().toHexString(),refSeq:t,min:e.start,max:e.end,type:"exon",strand:a};d.children[n._id]=n}return d}}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=s.getSession(e),o=e.getAssembly(),a=e.getFirstRegion(),r=e.contextMenuFeature;return r?[...t(),{label:"Create Apollo annotation",icon:qa,onClick:async()=>{const t=n.apolloDataStore.getBackendDriver(a.assemblyName);let s=a.refName;if(t instanceof Dt){const e=await t.getRefSeqId(a.assemblyName,a.refName);if(!e)throw new Error(`Could not find refSeq for "${a.refName}"`);s=e}n.queueDialog((t=>[La,{session:n,handleClose:()=>{t()},annotationFeature:e.getAnnotationFeature(r,s),assembly:o,refSeqId:s,region:a}]))}}]:t()}}}));return e.stateModel=n,e}function _a(e,t){const n=e.get("subfeatures");return[{start:e.get("start")+1,end:e.get("end"),seq_id:t,source:e.get("source")??null,type:e.get("type")??null,score:e.get("score")??null,strand:e.get("strand")?1===e.get("strand")?"+":"-":null,phase:null!==e.get("phase")||void 0!==e.get("phase")?e.get("phase"):null,attributes:$a(e),derived_features:[],child_features:n?n.map((e=>_a(e,t))):[]}]}function Oa(e,n){return t.gff3ToAnnotationFeature(_a(e,n))}const Ba=new Set(["start","end","type","strand","refName","subfeatures","derived_features","phase","source","score","parent","__jbrowsefmt","length","position","uniqueId","exonFrames","parentId","thickStart","thickEnd","_lineHash"]),Ua={id:"gff_id",name:"gff_name",alias:"gff_alias",target:"gff_target",gap:"gff_gap",derives_from:"gff_derives_from",note:"gff_note",dbxref:"gff_dbxref",ontology_term:"gff_ontology_term",is_circular:"gff_is_circular"};function $a(e){const t={};for(const[n,o]of Object.entries(e.toJSON()))Ba.has(n)||(t[Ua[n]??n]=Array.isArray(o)?o.map(String):[String(o)]);return t}function za(e){if("LinearBasicDisplay"!==e.name)return e;const{stateModel:t}=e,n=t.views((e=>({getFirstRegion:()=>s.getContainingView(e).dynamicBlocks.contentBlocks[0],getAssembly(){const t=e.getFirstRegion(),n=s.getSession(e),{assemblyManager:o}=n,{assemblyName:a}=t,r=o.get(a);if(!r)throw new Error(`Could not find assembly named ${a}`);return r}}))).views((e=>{const t=e.contextMenuItems;return{contextMenuItems(){const n=s.getSession(e),o=e.getAssembly(),a=e.getFirstRegion(),r=e.contextMenuFeature;if(!r)return t();const i=function(e){let t=e,n=e.get("parent");for(;n;)t=n,n=n.get("parent");return t}(r);return[...t(),{label:"Create Apollo annotation",icon:qa,onClick:async()=>{const e=n.apolloDataStore.getBackendDriver(a.assemblyName);let t=a.refName;if(e instanceof Dt){const n=await e.getRefSeqId(a.assemblyName,a.refName);if(!n)throw new Error(`Could not find refSeq for "${a.refName}"`);t=n}const s=Oa(i,t);n.queueDialog((e=>[La,{session:n,handleClose:()=>{e()},annotationFeature:s,assembly:o,refSeqId:t,region:a}]))}}]}}}));return e.stateModel=n,e}const Wa=E.observer((function({display:e}){const{classes:t}=ea(),{apolloDragging:n,apolloRowHeight:o,lgv:a,session:r,showCheckResults:l}=e,{assemblyManager:c}=r;return l?a.dynamicBlocks.contentBlocks.map((l=>{const d=a.bpPerPx*o,u=c.get(l.assemblyName);return u?ta([...r.apolloDataStore.checkResults.values()].filter((e=>u.isValidRefName(e.refSeq)&&u.getCanonicalRefName(e.refSeq)===l.refName&&s.doesIntersect2(l.start,l.end,e.start,e.end))),d).map((a=>{const s=Math.round(vo(e,a.range,l)),[r]=a.featureIds;if(!r)return null;const c=e.getRowForFeature(r)??0;return m.jsx(i.Tooltip,{title:a.message,children:m.jsx(i.Box,{className:t.box,style:{top:c*o,left:s,height:o,width:o,pointerEvents:n?"none":"auto"},children:m.jsx(i.Badge,{className:t.badge,badgeContent:a.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:a.count<=1,children:m.jsx(i.Avatar,{className:t.avatar,children:m.jsx(ie,{"data-testid":`ErrorIcon-${a.start}`})})})})},a._id)})):null})):null})),Ga=E.observer((function(e){const{mouseCooordinate:t,session:n,dragging:o}=e,{apolloHoveredFeature:a}=n;if(!t||!a||o)return;const[s,r]=t,{feature:i}=a,{attributes:l,min:c,max:d}=i,u=`Loc: ${c+1}..${d}`,g=`Type: ${i.type}`,f=l.get("gff_name")?.find((e=>""!==e));return m.jsxs(R.BaseTooltip,{clientPoint:{x:s,y:r},placement:"top-start",children:[g,m.jsx("br",{}),f?m.jsxs(m.Fragment,{children:[f,m.jsx("br",{})]}):null,u]})})),Ha=E.observer((function(e){const{model:t}=e,{apolloDragging:n,cursor:o,featuresHeight:a,isShown:r,onMouseDown:i,onMouseLeave:l,onMouseMove:c,onMouseUp:d,session:u,setOverlayCanvas:g}=t,{classes:f}=ea(),h=s.getContainingView(t),[p,y]=v.useState();if(!r)return null;const b=a(h.assemblyNames[0]);return m.jsxs(m.Fragment,{children:[m.jsx("canvas",{ref:async e=>{await Promise.resolve(),g(e)},width:h.dynamicBlocks.totalWidthPx,height:b,onMouseMove:(...e)=>{const[t]=e;y([t.clientX,t.clientY]),c(...e)},onMouseLeave:(...e)=>{y(void 0),l(...e)},onMouseDown:i,onMouseUp:d,className:f.canvas,style:{cursor:o??"default"},"data-testid":"overlayCanvas"}),m.jsx(Ga,{mouseCooordinate:p,session:u,dragging:Boolean(n)})]})})),Va=E.observer((function(e){const t=i.useTheme(),{model:n}=e,{loading:o,contextMenuItems:a,featuresHeight:r,isShown:l,regionCannotBeRendered:c,session:d,setCanvas:u,setCollaboratorCanvas:g,setTheme:f}=n,{classes:h}=ea(),p=s.getContainingView(n);v.useEffect((()=>{f(t)}),[t,f]);const[y,b]=v.useState(),[x,w]=v.useState([]),S=c();if(!l)return null;const C=r(p.assemblyNames[0]);return m.jsxs("div",{className:h.canvasContainer,style:{width:p.dynamicBlocks.totalWidthPx,height:C},onContextMenu:e=>{e.preventDefault(),x.length>0?w([]):(b([e.clientX,e.clientY]),w(a(e)))},children:[d.isLocked?m.jsx("div",{className:h.locked,"data-testid":"lock-icon",children:m.jsx(re,{})}):null,o?m.jsx("div",{className:h.loading,children:m.jsx(i.CircularProgress,{size:"18px"})}):null,S?m.jsx(i.Alert,{severity:"warning",classes:{message:h.ellipses},slotProps:{root:{className:h.center}},children:m.jsx(i.Tooltip,{title:S,children:m.jsx("div",{children:S})})}):m.jsxs(m.Fragment,{children:[m.jsx("canvas",{ref:async e=>{await Promise.resolve(),g(e)},width:p.dynamicBlocks.totalWidthPx,height:C,className:h.canvas,"data-testid":"collaboratorCanvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),u(e)},width:p.dynamicBlocks.totalWidthPx,height:C,className:h.canvas,"data-testid":"canvas"}),m.jsx(Ha,{model:n}),m.jsx(Wa,{display:n}),m.jsx(R.Menu,{open:x.length>0,onMenuItemClick:(e,t)=>{t(),w([])},onClose:()=>{w([])},slotProps:{transition:{onExit:()=>{w([])}}},anchorReference:"anchorPosition",anchorPosition:y?{top:y[1],left:y[0]}:void 0,menuItems:x})]})]})})),Ja=E.observer((function({model:e,hrStyle:t={margin:0,top:0,color:"black"},idx:n=0}){const{apolloRowHeight:o,highestRow:a,showFeatureLabels:s}=e,r=s?2:1;return m.jsx("div",{style:{position:"absolute",left:0,top:o*r*(a+1)/2+n*r*o,width:"100%"},children:m.jsx("hr",{style:t})})})),Xa=E.observer((function(e,t){const n=i.useTheme(),{model:o}=e,{apolloRowHeight:a,contextMenuItems:r,cursor:l,featuresHeight:c,geneTrackRowNums:d,isShown:u,onMouseDown:g,onMouseLeave:f,onMouseMove:h,onMouseUp:p,regionCannotBeRendered:y,session:b,setCanvas:x,setCollaboratorCanvas:w,setOverlayCanvas:S,setTheme:C,showCheckResults:j,showFeatureLabels:T}=o,{classes:A}=ea(),F=s.getContainingView(o);v.useEffect((()=>{C(n)}),[n,C]);const[k,D]=v.useState(),[N,I]=v.useState([]),M=y();if(!u)return null;const{assemblyManager:E}=b;return m.jsx(m.Fragment,{children:m.jsxs("div",{className:A.canvasContainer,style:{width:F.dynamicBlocks.totalWidthPx,height:c},onContextMenu:e=>{e.preventDefault(),N.length>0?I([]):(D([e.clientX,e.clientY]),I(r(e)))},children:[b.isLocked?m.jsx("div",{className:A.locked,"data-testid":"lock-icon",children:m.jsx(re,{})}):null,M?m.jsx(i.Alert,{severity:"warning",classes:{message:A.ellipses},slotProps:{root:{className:A.center}},children:m.jsx(i.Tooltip,{title:M,children:m.jsx("div",{children:M})})}):m.jsxs(m.Fragment,{children:[m.jsx(Ja,{model:o,idx:0}),m.jsx(Ja,{model:o,hrStyle:{margin:0,top:0,color:"grey",opacity:.4},idx:1}),m.jsx(Ja,{model:o,idx:2}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),w(e)},width:F.dynamicBlocks.totalWidthPx,height:c,className:A.canvas,"data-testid":"collaboratorCanvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),x(e)},width:F.dynamicBlocks.totalWidthPx,height:c,className:A.canvas,"data-testid":"canvas"}),m.jsx("canvas",{ref:async e=>{await Promise.resolve(),S(e)},width:F.dynamicBlocks.totalWidthPx,height:c,onMouseMove:h,onMouseLeave:f,onMouseDown:g,onMouseUp:p,className:A.canvas,style:{cursor:l??"default"},"data-testid":"overlayCanvas"}),F.displayedRegions.flatMap(((e,n)=>{const o=F.bpPerPx*a,r=E.get(e.assemblyName);return j?ta([...b.apolloDataStore.checkResults.values()].filter((t=>r?.isValidRefName(t.refSeq)&&r.getCanonicalRefName(t.refSeq)===e.refName&&s.doesIntersect2(e.start,e.end,t.start,t.end))),o).map((o=>{const r=(F.bpToPx({refName:e.refName,coord:o.start,regionNumber:n})?.offsetPx??0)-F.offsetPx,[l]=o.featureIds;if(!l||!l.parent||!at(l.parent,b))return null;let c;for(const e of l.cdsLocations)for(const t of e){const e=s.getFrame(t.min,t.max,l.strand??1,t.phase),n=(T?[0,5,3,1,15,13,11]:[0,2,1,0,8,7,6]).at(e);if(void 0!==n&&o.start>=t.min&&o.start<=t.max){c=n-1;break}}return void 0===c&&(c=(1==l.strand?d[0]:d[1])-1),m.jsx(i.Tooltip,{title:o.message,children:m.jsx(i.Box,{className:A.box,style:{top:c*a,left:r,height:a,width:a,pointerEvents:t?"none":"auto"},children:m.jsx(i.Badge,{className:A.badge,badgeContent:o.count,color:"primary",overlap:"circular",anchorOrigin:{vertical:"bottom",horizontal:"right"},invisible:o.count<=1,children:m.jsx(i.Avatar,{className:A.avatar,children:m.jsx(ie,{"data-testid":`ErrorIcon-${o.start}`})})})})},o._id)})):null})),m.jsx(R.Menu,{open:N.length>0,onMenuItemClick:(e,t)=>{t(),I([])},onClose:()=>{I([])},slotProps:{transition:{onExit:()=>{I([])}}},anchorReference:"anchorPosition",anchorPosition:k?{top:k[1],left:k[0]}:void 0,style:{zIndex:n.zIndex.tooltip},menuItems:N})]})]})})})),Ka=y.makeStyles()((e=>({shading:{background:i.alpha(e.palette.primary.main,.2),overflowX:"hidden"},details:{background:e.palette.background.paper},accordionControl:{height:12,width:"100%","&:hover":{background:e.palette.action.hover},display:"flex",alignItems:"center",justifyContent:"center"},accordionRoot:{background:e.palette.divider},resizeHandle:{width:"100%",height:4,position:"absolute",cursor:"row-resize",zIndex:100},expandIcon:{},title:{userSelect:"none"},alertContainer:{display:"flex",alignItems:"center",justifyContent:"center"}})));function Za(e,t){const{apolloRowHeight:n,selectedFeature:o}=e;if(t.current&&o){let a;if("getFeatureLayoutPosition"in e){const t=e.getFeatureLayoutPosition(o);t&&(a=t.layoutRow+t.featureRow)}else a=e.getRowForFeature(o);void 0!==a&&t.current.scroll({top:a*n,behavior:"smooth"})}}const Ya=({onResize:e})=>{const{classes:t}=Ka(),n=v.useCallback((t=>{t.stopPropagation(),t.preventDefault(),e(t.movementY)}),[e]);return m.jsx("div",{onMouseDown:e=>{e.stopPropagation();const t=new AbortController,{signal:o}=t;function a(){t.abort(new DOMException("Canceling drag event listener","AbortError"))}globalThis.addEventListener("mousemove",n,{signal:o}),globalThis.addEventListener("mouseup",a,{signal:o}),globalThis.addEventListener("mouseleave",a,{signal:o})},onClick:e=>{e.stopPropagation(),e.preventDefault()},className:t.resizeHandle})},Qa=E.observer((function({onClick:e,onResize:t,open:n,title:o}){const{classes:a}=Ka();return m.jsxs("div",{className:a.accordionRoot,children:[n&&t?m.jsx(Ya,{onResize:t}):null,m.jsxs("div",{className:a.accordionControl,onClick:e,children:[m.jsx(n?se:G,{className:a.expandIcon}),o?m.jsx(i.Typography,{className:a.title,variant:"caption",component:"span",children:o}):null]})]})})),es=E.observer((function({model:e,...t}){const n=s.getSession(e),{ontologyManager:o}=n.apolloDataStore,{featureTypeOntology:a}=o,r=a?.dataStore,{classes:l}=Ka(),{graphical:c,height:d,isShown:u,selectedFeature:g,table:f,tabularEditor:h,toggleShown:p}=e,y=v.useRef(null);v.useEffect((()=>{Za(e,y)}),[e,g]);const b=t=>{e.setDetailsHeight(e.detailsHeight-t)};if(!r)return m.jsx("div",{className:l.alertContainer,children:m.jsx(i.Alert,{severity:"error",children:"Could not load feature type ontology."})});if(c&&f){const n=h.isShown?e.detailsHeight:0,o=u?d-e.detailsHeight-24:0;return m.jsxs("div",{style:{height:d},children:[m.jsx(Qa,{open:u,title:"Graphical",onClick:p}),m.jsx("div",{className:l.shading,ref:y,style:{height:o},children:m.jsx(Va,{model:e,...t})}),m.jsx(Qa,{title:"Table",open:h.isShown,onClick:h.togglePane,onResize:b}),m.jsx("div",{className:l.details,style:{height:n},children:m.jsx(So,{model:e})})]})}return m.jsx("div",c?{className:l.shading,ref:y,style:{height:d},children:m.jsx(Va,{model:e,...t})}:{className:l.details,style:{height:d},children:m.jsx(So,{model:e})})})),ts=E.observer((function({model:e,...t}){const n=s.getSession(e),{ontologyManager:o}=n.apolloDataStore,{featureTypeOntology:a}=o,r=a?.dataStore,{classes:l}=Ka(),{detailsHeight:c,graphical:d,height:u,isShown:g,selectedFeature:f,table:h,tabularEditor:p,toggleShown:y}=e,b=v.useRef(null);v.useEffect((()=>{Za(e,b)}),[e,f]);const x=t=>{e.setDetailsHeight(c-t)};if(!r)return m.jsx("div",{className:l.alertContainer,children:m.jsx(i.Alert,{severity:"error",children:"Could not load feature type ontology."})});if(d&&h){const n=p.isShown?c:0,o=g?u-c-24:0;return m.jsxs("div",{style:{height:u},children:[m.jsx(Qa,{open:g,title:"Graphical",onClick:y}),m.jsx("div",{className:l.shading,ref:b,style:{height:o},children:m.jsx(Xa,{model:e,...t})}),m.jsx(Qa,{title:"Table",open:p.isShown,onClick:p.togglePane,onResize:x}),m.jsx("div",{className:l.details,style:{height:n},children:m.jsx(So,{model:e})})]})}return m.jsx("div",d?{className:l.shading,ref:b,style:{height:u},children:m.jsx(Xa,{model:e,...t})}:{className:l.details,style:{height:u},children:m.jsx(So,{model:e})})})),ns=l.types.model("JobsManager",{}).views((e=>({get jobStatusWidget(){const{widgets:t}=s.getSession(e);let n=t.get("JobsList");return n||(n=s.getSession(e).addWidget("JobsListWidget","JobsList")),n}}))).actions((e=>({update(t,n,o){e.jobStatusWidget.updateJobStatusMessage(t,n),o&&e.jobStatusWidget.updateJobProgressPct(t,o)},abortJob(t,n){const o=s.getSession(e);if(s.isSessionModelWithWidgets(o)){o.showWidget(e.jobStatusWidget),e.jobStatusWidget.updateJobStatusMessage(t,n??"Aborted unexpectedly");const a=e.jobStatusWidget.jobs.findIndex((e=>e.name===t));e.jobStatusWidget.addAbortedJob({...e.jobStatusWidget.jobs[a]}),e.jobStatusWidget.removeJob(t),o.notify("Job aborted","info")}},runJob(t){const n=s.getSession(e);s.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.addJob(t))},done(t){const n=s.getSession(e);s.isSessionModelWithWidgets(n)&&(n.showWidget(e.jobStatusWidget),e.jobStatusWidget.removeJob(t.name),e.jobStatusWidget.addFinishedJob({name:t.name,statusMessage:"All operations successful",progressPct:100,cancelCallback:t.cancelCallback}))}})));function os(e,n){const a=e.evaluateExtensionPoint("Apollo-extendAnnotationFeature",X.AnnotationFeatureModel),r=function(e){return l.types.model("ClientDataStore",{typeName:l.types.optional(l.types.literal("Client"),"Client"),assemblies:l.types.map(X.ApolloAssembly),checkResults:l.types.map(X.CheckResult),ontologyManager:l.types.optional(Ue,{})}).views((t=>({get internetAccounts(){return l.getRoot(t).internetAccounts},get pluginConfiguration(){return l.getRoot(t).jbrowse.configuration.ApolloPlugin},getFeature:n=>l.resolveIdentifier(e,t.assemblies,n)}))).actions((e=>({addAssembly(t,n){const o={_id:t,refSeqs:{}};return n&&(o.backendDriverType=n),e.assemblies.put(o)}}))).actions((e=>({addFeature(t,n){const o=s.getSession(e),{assemblyManager:a}=o;let r=e.assemblies.get(t);if(!r){if(!a.get(t))throw new Error(`Could not find assembly "${t}" to add feature "${n._id}"`);r=e.addAssembly(t)}let i=r.refSeqs.get(n.refSeq);if(!i){const e=a.get(t);if(!e)throw new Error(`Could not find assembly "${t}" to add feature "${n._id}"`);const o=e.getCanonicalRefName(n.refSeq);if(!o)throw new Error(`Could not find refSeq "${n.refSeq}" to add feature "${n._id}"`);i=r.addRefSeq(n.refSeq,o)}i.features.put(n)},deleteFeature(t){const n=e.getFeature(t);if(!n)throw new Error(`Could not find feature "${t}" to delete`);const{_id:o,parent:a}=n;a?a.deleteChild(t):l.getParentOfType(n,X.ApolloRefSeq).deleteFeature(o)},deleteAssembly(t){e.assemblies.delete(t)},addCheckResult(t){e.checkResults.put(t)},addCheckResults(t){for(const n of t)e.checkResults.has(n._id)||e.checkResults.put(n)},deleteCheckResult(t){e.checkResults.delete(t)},clearCheckResults(){e.checkResults.clear()}}))).volatile((e=>({changeManager:new kt(e),collaborationServerDriver:new Dt(e),localDriver:new At(e)}))).actions((e=>({afterCreate(){l.addDisposer(e,c.autorun((()=>{const{ontologyManager:t,pluginConfiguration:n}=e,a=n.ontologies;for(const n of a||[]){const[a,r,i,l]=[o.readConfObject(n,"name"),o.readConfObject(n,"version"),o.readConfObject(n,"source"),o.readConfObject(n,"textIndexFields")];if(!t.findOntology(a)){const n=s.getSession(e),{jobsManager:o}=n,c=new AbortController,d=`Loading ontology "${a}"`,u={name:d,statusMessage:`Loading ontology "${a}", version "${r}", this may take a while`,progressPct:0,cancelCallback:()=>{c.abort(new DOMException(`Canceling loading of ontology "${a}"`,"AbortError")),o.abortJob(u.name)}};t.addOntology(a,r,i,{textIndexing:{indexFields:l},update:(e,t)=>{0!==t?100!==t?o.update(d,e,t):o.done(u):o.runJob(u)}})}}})))}}))).views((e=>({getBackendDriver(t){const n=s.getSession(e),{assemblyManager:a}=n,r=a.get(t);if(!r)return;const{internetAccountConfigId:i}=o.getConf(r,["sequence","metadata"]);return i?e.collaborationServerDriver:e.localDriver},getInternetAccount(t,n){if(!(t??n))throw new Error("Must provide either assemblyName or internetAccountId");let a=n;if(t&&!a){const{assemblyManager:n}=s.getSession(e),r=n.get(t);if(!r)throw new Error(`No assembly found with name ${t}`);({internetAccountConfigId:a}=o.getConf(r,["sequence","metadata"]))}const{internetAccounts:r}=e,i=r.find((e=>e.internetAccountId===a));if(!i)throw new Error(`No InternetAccount found with config id ${n}`);return i}}))).actions((e=>({loadFeatures:l.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const[o,a]=yield t.getFeatures(n);if(0===o.length)continue;const{assemblyName:s,refName:r}=n;let i=e.assemblies.get(s);i||(i=e.assemblies.put({_id:s,refSeqs:{}}));const[l]=o;let c=i.refSeqs.get(l.refSeq);c||(c=i.refSeqs.put({_id:l.refSeq,name:r,features:{}}));for(const e of o)c.features.has(e._id)||c.features.put(e);e.addCheckResults(a)}})),loadRefSeq:l.flow((function*(t){for(const n of t){const t=e.getBackendDriver(n.assemblyName);if(!t)return;const{refSeq:o,seq:a}=yield t.getSequence(n),{assemblyName:s,end:r,refName:i,start:l}=n;let c=e.assemblies.get(s);c||(c=e.assemblies.put({_id:s,refSeqs:{}}));let d=c.refSeqs.get(o);d||(d=c.refSeqs.put({_id:o,name:i,sequence:[]})),d.addSequence({start:l,stop:r,sequence:a})}}))})))}(a),i=n.props({apolloDataStore:l.types.optional(r,{typeName:"Client"}),apolloSelectedFeature:l.types.safeReference(a),jobsManager:l.types.optional(ns,{}),isLocked:l.types.optional(l.types.boolean,!1),changeInProgress:l.types.optional(l.types.boolean,!1)}).volatile((()=>({apolloHoveredFeature:void 0,abortController:new AbortController}))).extend((()=>{const e=c.observable.array([]);return{views:{get collaborators(){return e}},actions:{addOrUpdateCollaborator(t){const n=e.find((e=>e.id===t.id));n?n.locations=t.locations:e.push(t)}}}})).actions((e=>({apolloSetSelectedFeature(t){e.apolloSelectedFeature=t},apolloSetHoveredFeature(t){e.apolloHoveredFeature=t},addApolloLocalTrackConfig(t){const n=`apollo_track_${t.name}`;e.tracks.some((e=>e.trackId===n))||l.getRoot(e).jbrowse.addTrackConf({type:"ApolloTrack",trackId:n,name:`Annotations (${t.displayName})`,assemblyNames:[t.name],category:["Apollo"]})},toggleLocked(){e.isLocked=!e.isLocked},setChangeInProgress(t){e.changeInProgress=t},getPluginConfiguration(){const{jbrowse:t}=l.getRoot(e);return t.configuration.ApolloPlugin},broadcastLocations(){const{internetAccounts:t}=l.getRoot(e),n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const o=t;if(o.initialized){const{dynamicBlocks:t}=o;for(const o of t.contentBlocks){const{assemblyName:t,end:a,refName:s,start:r}=o,i=e.apolloDataStore.assemblies.get(t);i&&"CollaborationServerDriver"===i.backendDriverType&&n.push({assemblyName:t,refName:s,start:r,end:a})}}}if(0===n.length){for(const e of t)Ot(e)&&e.postUserLocation([]);return}const o=[];for(const e of t)if(Ot(e)){for(const e of n)o.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(o)}}}))).actions((e=>({apolloSetEventualSelectedFeature:c.flow((function*(t){yield c.when((()=>Boolean(e.apolloDataStore.getFeature(t)))),e.apolloSetSelectedFeature(t)}))}))).volatile((e=>({previousSnapshot:l.getSnapshot(e)}))).actions((e=>({afterCreate(){l.applySnapshot(e,{name:e.name,id:e.id});const{internetAccounts:t,jbrowse:n,reloadPluginManagerCallback:a}=l.getRoot(e);l.addDisposer(e,c.autorun((()=>{const n=[];for(const t of e.views){if("LinearGenomeView"!==t.type)return;const o=t;if(o.initialized){const{dynamicBlocks:t}=o;for(const o of t.contentBlocks){const{assemblyName:t,end:a,refName:s,start:r}=o,i=e.apolloDataStore.assemblies.get(t);i&&"CollaborationServerDriver"===i.backendDriverType&&n.push({assemblyName:t,refName:s,start:r,end:a})}}}if(0===n.length){for(const e of t)Ot(e)&&e.postUserLocation([]);return}const o=[];for(const e of t)if(Ot(e)){for(const e of n)o.push({assemblyId:e.assemblyName,refSeq:e.refName,start:e.start,end:e.end});e.postUserLocation(o)}}),{name:"ApolloSessionBroadcastLocations"})),l.addDisposer(e,c.autorun((async s=>{const r=n.configuration.ApolloPlugin,i=o.readConfObject(r,"hasRole"),c=o.readConfObject(r,"featureTypeOntologyName"),d=t.some((e=>Ot(e))),u=e.assemblyManager.assemblies.filter((e=>!o.getConf(e,["sequence","metadata"]).apollo));if(!d||i){const{assemblies:t}=e.assemblyManager;if(0===t.length)return;const{pluginConfiguration:n}=e.apolloDataStore;n.ontologies.find((e=>o.readConfObject(e,"name")===c))||n.addOntology({name:"Sequence Ontology",version:"01c33c6d9b6c8dca12e7d3e37b49ee113093c2fa",source:{uri:"https://raw.githubusercontent.com/The-Sequence-Ontology/SO-Ontologies/01c33c6d9b6c8dca12e7d3e37b49ee113093c2fa/Ontology_Files/so.json",locationType:"UriLocation"}});for(const t of u)e.addApolloLocalTrackConfig(t);return l.applySnapshot(e,e.previousSnapshot),void s.dispose()}const{signal:g}=e.abortController;for(const n of t){if("ApolloInternetAccount"!==n.type)continue;const{baseURL:t}=n,o=new URL("jbrowse/config.json",t).href,r=n.getFetcher({locationType:"UriLocation",uri:o});let i,l;try{i=await r(o,{signal:g})}catch(t){e.abortController.signal.aborted||console.error(t);continue}if(i.ok){try{l=await i.json()}catch(e){console.error(e);continue}l.configuration.ApolloPlugin.hasRole&&(a(l,e.previousSnapshot),s.dispose())}else{const e=await yt(i,"Failed to fetch assemblies");console.error(e)}}}),{name:"ApolloSessionLoadConfig"}))},beforeDestroy(){e.abortController.abort(new DOMException("Clean up Apollo session","AbortError"))}}))).views((e=>{const n=e.getTrackActions;return{getTrackActions(a){if("ApolloTrack"===a.type||"ReferenceSequenceTrack"===a.type)return n?.(a);const s=o.readConfObject(a,"trackId");return s.endsWith("-sessionTrack")?[...n?.(a)??[],{label:"Save track to Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:o}=l.getRoot(e),r=l.getSnapshot(o);let i;i=t.filterJBrowseConfig(r),0===Object.keys(i).length&&(i=void 0);const c={...l.getSnapshot(a),trackId:s.slice(0,s.length-13)};for(const o of n){if("ApolloInternetAccount"!==o.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:i,newJBrowseConfig:{...i,tracks:i?.tracks&&[...i.tracks,c]}}),{internetAccountId:a}=o;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:a});const{notify:s}=e;s("Track added","success")}e.deleteTrackConf(a),o.addTrackConf(c)},icon:ue}]:[...n?.(a)??[],{label:"Remove track from Apollo",onClick:async()=>{const{internetAccounts:n,jbrowse:o}=l.getRoot(e),r=l.getSnapshot(o);let i;i=t.filterJBrowseConfig(r),0===Object.keys(i).length&&(i=void 0);const c=i?.tracks?.filter((e=>e.trackId!==s));for(const o of n){if("ApolloInternetAccount"!==o.type)continue;const n=new t.ImportJBrowseConfigChange({typeName:"ImportJBrowseConfigChange",oldJBrowseConfig:i,newJBrowseConfig:{...i,tracks:c}}),{internetAccountId:a}=o;await e.apolloDataStore.changeManager.submit(n,{internetAccountId:a});const{notify:s}=e;s("Track removed","success")}e.deleteTrackConf(a),o.deleteTrackConf(a)},icon:ue}]}}}));return l.types.snapshotProcessor(i,{postProcessor(e,t){if(e.apolloSelectedFeature=void 0,e.apolloDataStore={typeName:"Client",checkResults:{}},!t)return e;const{apolloDataStore:n}=t,{checkResults:o}=n;for(const[,e]of o){const[t]=e.ids}return e}})}const as="WorkerGlobalScope"in globalThis;for(const[n,o]of Object.entries(t.changes))e.changeRegistry.registerChange(n,o);const ss=new t.CDSCheck;e.checkRegistry.registerCheck(ss.name,ss);const rs=new t.TranscriptCheck;e.checkRegistry.registerCheck(rs.name,rs),t.validationRegistry.registerValidation(new t.CoreValidation),t.validationRegistry.registerValidation(new t.ParentChildValidation),exports.default=class extends n{name="ApolloPlugin";version="1.0.0";configurationSchema=Da;install(e){!function(e){e.addAdapterType((()=>new O({name:"ApolloSequenceAdapter",configSchema:xn,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:bn})))}(e),function(e){e.addAdapterType((()=>new O({name:"ApolloRefNameAliasAdapter",configSchema:pn,adapterMetadata:{category:void 0,hiddenFromGUI:!0,description:void 0},AdapterClass:hn})))}(e),function(e){e.addTextSearchAdapterType((()=>new a.TextSearchAdapterType({name:"ApolloTextSearchAdapter",displayName:"Apollo text search adapter",configSchema:Cn,AdapterClass:Sn,description:"Apollo Text Search adapter"})))}(e),e.addWidgetType((()=>{const e=o.ConfigurationSchema("ApolloFeatureDetailsWidget",{});return new a.WidgetType({name:"ApolloFeatureDetailsWidget",heading:"Apollo feature details",configSchema:e,stateModel:Bn,ReactComponent:On})})),e.addWidgetType((()=>{const e=o.ConfigurationSchema("ApolloTranscriptDetails",{});return new a.WidgetType({name:"ApolloTranscriptDetails",heading:"Apollo transcript details",configSchema:e,stateModel:Un,ReactComponent:ao})})),e.addTrackType((()=>{const t=o.ConfigurationSchema("ApolloTrack",{adapter:""},{baseConfiguration:a.createBaseTrackConfig(e),explicitIdentifier:"trackId"});return new a.TrackType({name:"ApolloTrack",configSchema:t,stateModel:a.createBaseTrackModel(e,"ApolloTrack",t)})})),e.addInternetAccountType((()=>new a.InternetAccountType({name:"ApolloInternetAccount",configSchema:ge,stateModel:gn(ge)}))),e.addDisplayType((()=>new a.DisplayType({name:"LinearApolloDisplay",configSchema:so,stateModel:aa(0,so),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:es}))),e.addDisplayType((()=>new a.DisplayType({name:"LinearApolloSixFrameDisplay",configSchema:ya,stateModel:ka(0,ya),trackType:"ApolloTrack",viewType:"LinearGenomeView",ReactComponent:ts}))),e.addDisplayType((()=>new a.DisplayType({name:"LinearApolloReferenceSequenceDisplay",configSchema:sa,stateModel:pa(0,sa),displayName:"Apollo reference sequence display",trackType:"ReferenceSequenceTrack",viewType:"LinearGenomeView",ReactComponent:ma}))),e.addToExtensionPoint("Core-extendSession",os.bind(this,e)),e.addToExtensionPoint("Core-extendPluggableElement",(e=>{if("LinearGenomeView"===e.name){const{stateModel:t}=e,n=t.views((e=>{const t=e.rubberBandMenuItems;return{rubberBandMenuItems:()=>[...t(),{label:"Add new feature",icon:r,onClick:()=>{const t=s.getSession(e),{leftOffset:n,rightOffset:o}=e,a=e.getSelectedRegions(n,o);t.queueDialog((e=>[Rt,{session:t,handleClose:()=>{e()},region:a[0],changeManager:t.apolloDataStore.changeManager}]))}}]}}));e.stateModel=n}return e})),e.addToExtensionPoint("Core-extendPluggableElement",Pa),e.addToExtensionPoint("Core-extendPluggableElement",za),e.addToExtensionPoint("Core-preProcessTrackConfig",(e=>{if("ReferenceSequenceTrack"!==e.type)return e;const t=e.displays??[],n=t.findIndex((e=>"LinearApolloReferenceSequenceDisplay"===e.type));if(0===n)return e;if(-1===n)return{...e,displays:[{type:"LinearApolloReferenceSequenceDisplay",displayId:`${e.trackId}-LinearApolloReferenceSequenceDisplay`},...t]};const o=t.toSpliced(n,1);return o.unshift({type:"LinearApolloReferenceSequenceDisplay",displayId:`${e.trackId}-LinearApolloReferenceSequenceDisplay`}),{...e,displays:o}})),e.addToExtensionPoint("LinearGenomeView-searchResultSelected",((e,t)=>{const{session:n,result:o}=t,a=o.getTrackId(),s=o.matchedObject;return a?.startsWith("apollo_track_")&&s&&n.apolloSetEventualSelectedFeature(s._id),e})),as||e.addToExtensionPoint("Core-extendWorker",(t=>"on"in t&&t.on?(t.on("apollo",(async n=>{if("object"!=typeof(o=n)||null===o||!("apollo"in o)||!0!==o.apollo)return;var o;const{apollo:a,messageId:s,method:r}=n;switch(r){case"getSequence":{const{region:o}=n,{assemblyName:r}=o,i=e.rootModel?.session?.apolloDataStore;if(!i)break;const l=i.getBackendDriver(r);if(!l)break;const{seq:c}=await l.getSequence(o);t.workers[0].postMessage({apollo:a,messageId:s,sequence:c});break}case"getRegions":{const{assembly:o}=n,r=e.rootModel?.session?.apolloDataStore;if(!r)break;const i=r.getBackendDriver(o);if(!i)break;const l=await i.getRegions(o);t.workers[0].postMessage({apollo:a,messageId:s,regions:l});break}case"getRefNameAliases":{const{assembly:o}=n,r=e.rootModel?.session?.apolloDataStore;if(!r)break;const i=r.getBackendDriver(o);if(!i)break;const l=await i.getRefNameAliases(o);t.workers[0].postMessage({apollo:a,messageId:s,refNameAliases:l});break}}})),t):t))}configure(e){s.isAbstractMenuManager(e.rootModel)&&(e.jexl.addFunction("geneBackgroundColor",(e=>"pseudogene"===e?i.alpha("rgb(148, 203, 236)",.6):"ncRNA_gene"===e?i.alpha("rgb(194, 106, 119)",.6):void 0)),function(e){e.insertInMenu("Apollo",{label:"Redo",icon:ce,onClick(e){const{apolloDataStore:t}=e;t.changeManager.redoLastChange()}},0),e.insertInMenu("Apollo",{label:"Undo",icon:de,onClick(e){const{apolloDataStore:t}=e;t.changeManager.undoLastChange()}},0),e.appendToMenu("Apollo",{label:"Lock/Unlock session",onClick:e=>{e.toggleLocked()}});const{internetAccounts:t}=e;t.some((e=>Ot(e)))&&e.appendToMenu("Apollo",{label:"Log out",icon:le,onClick:e=>{e.queueDialog((t=>[Pt,{session:e,handleClose:()=>{t()}}]))}})}(e.rootModel))}};
2
2
  //# sourceMappingURL=jbrowse-plugin-apollo.cjs.production.min.js.map