@apollo-annotation/jbrowse-plugin-apollo 0.3.5 → 0.3.7

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 (136) hide show
  1. package/dist/index.esm.js +6964 -4598
  2. package/dist/index.esm.js.map +1 -1
  3. package/dist/jbrowse-plugin-apollo.cjs.development.js +6610 -4261
  4. package/dist/jbrowse-plugin-apollo.cjs.development.js.map +1 -1
  5. package/dist/jbrowse-plugin-apollo.cjs.production.min.js +1 -1
  6. package/dist/jbrowse-plugin-apollo.cjs.production.min.js.map +1 -1
  7. package/dist/jbrowse-plugin-apollo.umd.development.js +11563 -7493
  8. package/dist/jbrowse-plugin-apollo.umd.development.js.map +1 -1
  9. package/dist/jbrowse-plugin-apollo.umd.production.min.js +1 -1
  10. package/dist/jbrowse-plugin-apollo.umd.production.min.js.map +1 -1
  11. package/package.json +4 -4
  12. package/src/ApolloInternetAccount/addMenuItems.ts +23 -2
  13. package/src/ApolloInternetAccount/components/AuthTypeSelector.tsx +1 -0
  14. package/src/ApolloInternetAccount/components/LoginButtons.tsx +1 -1
  15. package/src/ApolloInternetAccount/components/LoginIcons.tsx +1 -1
  16. package/src/ApolloInternetAccount/configSchema.ts +1 -1
  17. package/src/ApolloInternetAccount/model.ts +11 -10
  18. package/src/ApolloJobModel.ts +1 -1
  19. package/src/ApolloRefNameAliasAdapter/ApolloRefNameAliasAdapter.ts +8 -6
  20. package/src/ApolloRefNameAliasAdapter/index.ts +2 -2
  21. package/src/ApolloSequenceAdapter/ApolloSequenceAdapter.ts +4 -4
  22. package/src/ApolloSequenceAdapter/index.ts +1 -1
  23. package/src/ApolloTextSearchAdapter/ApolloTextSearchAdapter.ts +8 -7
  24. package/src/ApolloTextSearchAdapter/index.ts +1 -1
  25. package/src/BackendDrivers/BackendDriver.ts +7 -7
  26. package/src/BackendDrivers/CollaborationServerDriver.ts +14 -10
  27. package/src/BackendDrivers/DesktopFileDriver.ts +11 -10
  28. package/src/BackendDrivers/InMemoryFileDriver.ts +10 -6
  29. package/src/ChangeManager.ts +15 -11
  30. package/src/FeatureDetailsWidget/ApolloFeatureDetailsWidget.tsx +8 -7
  31. package/src/FeatureDetailsWidget/ApolloTranscriptDetailsWidget.tsx +35 -14
  32. package/src/FeatureDetailsWidget/AttributeKey.tsx +50 -0
  33. package/src/FeatureDetailsWidget/AttributeKeySelector.tsx +104 -0
  34. package/src/FeatureDetailsWidget/Attributes.tsx +215 -367
  35. package/src/FeatureDetailsWidget/BasicInformation.tsx +6 -5
  36. package/src/FeatureDetailsWidget/DefaultAttributeEditor.tsx +104 -0
  37. package/src/FeatureDetailsWidget/DefaultAttributeViewer.tsx +22 -0
  38. package/src/FeatureDetailsWidget/FeatureDetailsNavigation.tsx +4 -4
  39. package/src/FeatureDetailsWidget/NumberTextField.tsx +1 -1
  40. package/src/FeatureDetailsWidget/Sequence.tsx +2 -2
  41. package/src/FeatureDetailsWidget/StringTextField.tsx +1 -1
  42. package/src/FeatureDetailsWidget/TranscriptSequence.tsx +15 -23
  43. package/src/FeatureDetailsWidget/TranscriptWidgetEditLocation.tsx +950 -196
  44. package/src/FeatureDetailsWidget/TranscriptWidgetSummary.tsx +8 -4
  45. package/src/FeatureDetailsWidget/model.ts +8 -3
  46. package/src/LinearApolloDisplay/components/LinearApolloDisplay.tsx +7 -7
  47. package/src/LinearApolloDisplay/glyphs/BoxGlyph.ts +59 -72
  48. package/src/LinearApolloDisplay/glyphs/GeneGlyph.ts +253 -60
  49. package/src/LinearApolloDisplay/glyphs/GenericChildGlyph.ts +52 -6
  50. package/src/LinearApolloDisplay/glyphs/Glyph.ts +16 -8
  51. package/src/LinearApolloDisplay/stateModel/base.ts +81 -10
  52. package/src/LinearApolloDisplay/stateModel/index.ts +4 -3
  53. package/src/LinearApolloDisplay/stateModel/layouts.ts +8 -39
  54. package/src/LinearApolloDisplay/stateModel/mouseEvents.ts +63 -46
  55. package/src/LinearApolloDisplay/stateModel/rendering.ts +60 -31
  56. package/src/LinearApolloSixFrameDisplay/components/LinearApolloSixFrameDisplay.tsx +226 -0
  57. package/src/LinearApolloSixFrameDisplay/components/TrackLines.tsx +32 -0
  58. package/src/LinearApolloSixFrameDisplay/components/index.ts +2 -0
  59. package/src/LinearApolloSixFrameDisplay/configSchema.ts +7 -0
  60. package/src/LinearApolloSixFrameDisplay/glyphs/GeneGlyph.ts +940 -0
  61. package/src/LinearApolloSixFrameDisplay/glyphs/Glyph.ts +63 -0
  62. package/src/LinearApolloSixFrameDisplay/glyphs/index.ts +1 -0
  63. package/src/LinearApolloSixFrameDisplay/index.ts +2 -0
  64. package/src/LinearApolloSixFrameDisplay/stateModel/base.ts +302 -0
  65. package/src/LinearApolloSixFrameDisplay/stateModel/index.ts +27 -0
  66. package/src/LinearApolloSixFrameDisplay/stateModel/layouts.ts +252 -0
  67. package/src/LinearApolloSixFrameDisplay/stateModel/mouseEvents.ts +368 -0
  68. package/src/LinearApolloSixFrameDisplay/stateModel/rendering.ts +201 -0
  69. package/src/LinearApolloSixFrameDisplay/types.ts +1 -0
  70. package/src/OntologyManager/OntologyStore/fulltext.test.ts +1 -1
  71. package/src/OntologyManager/OntologyStore/fulltext.ts +8 -3
  72. package/src/OntologyManager/OntologyStore/index.test.ts +3 -1
  73. package/src/OntologyManager/OntologyStore/index.ts +19 -14
  74. package/src/OntologyManager/OntologyStore/indexeddb-schema.ts +6 -5
  75. package/src/OntologyManager/OntologyStore/indexeddb-storage.ts +11 -5
  76. package/src/OntologyManager/index.ts +12 -7
  77. package/src/OntologyManager/util.ts +3 -2
  78. package/src/TabularEditor/HybridGrid/ChangeHandling.ts +2 -2
  79. package/src/TabularEditor/HybridGrid/Feature.tsx +13 -7
  80. package/src/TabularEditor/HybridGrid/FeatureAttributes.tsx +1 -1
  81. package/src/TabularEditor/HybridGrid/HybridGrid.tsx +3 -2
  82. package/src/TabularEditor/HybridGrid/ToolBar.tsx +1 -1
  83. package/src/TabularEditor/HybridGrid/featureContextMenuItems.ts +114 -22
  84. package/src/TabularEditor/TabularEditorPane.tsx +1 -1
  85. package/src/TabularEditor/model.ts +2 -2
  86. package/src/TabularEditor/types.ts +5 -2
  87. package/src/components/AddAssembly.tsx +182 -179
  88. package/src/components/AddAssemblyAliases.tsx +114 -0
  89. package/src/components/AddChildFeature.tsx +8 -10
  90. package/src/components/AddFeature.tsx +216 -44
  91. package/src/components/AddRefSeqAliases.tsx +14 -12
  92. package/src/components/CopyFeature.tsx +10 -11
  93. package/src/components/CreateApolloAnnotation.tsx +342 -158
  94. package/src/components/DeleteAssembly.tsx +9 -8
  95. package/src/components/DeleteFeature.tsx +362 -14
  96. package/src/components/Dialog.tsx +1 -1
  97. package/src/components/DownloadGFF3.tsx +31 -11
  98. package/src/components/FilterFeatures.tsx +6 -4
  99. package/src/components/FilterTranscripts.tsx +86 -0
  100. package/src/components/ImportFeatures.tsx +7 -6
  101. package/src/components/LogOut.tsx +5 -4
  102. package/src/components/ManageChecks.tsx +9 -8
  103. package/src/components/ManageUsers.tsx +11 -10
  104. package/src/components/MergeExons.tsx +193 -0
  105. package/src/components/MergeTranscripts.tsx +185 -0
  106. package/src/components/OntologyTermAutocomplete.tsx +5 -5
  107. package/src/components/OntologyTermMultiSelect.tsx +6 -6
  108. package/src/components/OpenLocalFile.tsx +4 -3
  109. package/src/components/SplitExon.tsx +134 -0
  110. package/src/components/ViewChangeLog.tsx +7 -6
  111. package/src/components/ViewCheckResults.tsx +8 -7
  112. package/src/components/index.ts +3 -0
  113. package/src/config.ts +5 -0
  114. package/src/extensions/annotationFromJBrowseFeature.test.ts +1 -0
  115. package/src/extensions/annotationFromJBrowseFeature.ts +13 -10
  116. package/src/extensions/annotationFromPileup.ts +104 -94
  117. package/src/index.ts +33 -50
  118. package/src/makeDisplayComponent.tsx +90 -37
  119. package/src/session/ClientDataStore.ts +21 -17
  120. package/src/session/session.ts +46 -39
  121. package/src/types.ts +4 -4
  122. package/src/util/annotationFeatureUtils.ts +66 -1
  123. package/src/util/copyToClipboard.ts +21 -0
  124. package/src/util/glyphUtils.ts +49 -0
  125. package/src/util/index.ts +5 -3
  126. package/src/util/loadAssemblyIntoClient.ts +10 -3
  127. package/src/util/mouseEventsUtils.ts +113 -0
  128. package/src/ApolloSixFrameRenderer/ApolloSixFrameRenderer.tsx +0 -13
  129. package/src/ApolloSixFrameRenderer/components/ApolloRendering.tsx +0 -707
  130. package/src/ApolloSixFrameRenderer/configSchema.ts +0 -7
  131. package/src/ApolloSixFrameRenderer/index.ts +0 -3
  132. package/src/SixFrameFeatureDisplay/components/TrackLines.tsx +0 -19
  133. package/src/SixFrameFeatureDisplay/components/index.ts +0 -1
  134. package/src/SixFrameFeatureDisplay/configSchema.ts +0 -21
  135. package/src/SixFrameFeatureDisplay/index.ts +0 -2
  136. package/src/SixFrameFeatureDisplay/stateModel.ts +0 -443
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apollo-annotation/jbrowse-plugin-apollo",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "description": "Apollo plugin for JBrowse 2",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -48,9 +48,9 @@
48
48
  }
49
49
  },
50
50
  "dependencies": {
51
- "@apollo-annotation/common": "^0.3.5",
52
- "@apollo-annotation/mst": "^0.3.5",
53
- "@apollo-annotation/shared": "^0.3.5",
51
+ "@apollo-annotation/common": "^0.3.7",
52
+ "@apollo-annotation/mst": "^0.3.7",
53
+ "@apollo-annotation/shared": "^0.3.7",
54
54
  "@emotion/react": "^11.10.6",
55
55
  "@emotion/styled": "^11.10.6",
56
56
  "@gmod/gff": "1.2.0",
@@ -1,4 +1,7 @@
1
- import { AbstractMenuManager, AbstractSessionModel } from '@jbrowse/core/util'
1
+ import {
2
+ type AbstractMenuManager,
3
+ type AbstractSessionModel,
4
+ } from '@jbrowse/core/util'
2
5
 
3
6
  import {
4
7
  AddAssembly,
@@ -7,7 +10,8 @@ import {
7
10
  ImportFeatures,
8
11
  ManageUsers,
9
12
  } from '../components'
10
- import { ApolloSessionModel } from '../session'
13
+ import { AddAssemblyAliases } from '../components/AddAssemblyAliases'
14
+ import { type ApolloSessionModel } from '../session'
11
15
 
12
16
  export function addMenuItems(rootModel: AbstractMenuManager) {
13
17
  rootModel.appendToMenu('Apollo', {
@@ -78,6 +82,23 @@ export function addMenuItems(rootModel: AbstractMenuManager) {
78
82
  )
79
83
  },
80
84
  })
85
+ rootModel.appendToMenu('Apollo', {
86
+ label: 'Add Assembly aliases',
87
+ onClick: (session: ApolloSessionModel) => {
88
+ ;(session as unknown as AbstractSessionModel).queueDialog(
89
+ (doneCallback) => [
90
+ AddAssemblyAliases,
91
+ {
92
+ session,
93
+ handleClose: () => {
94
+ doneCallback()
95
+ },
96
+ changeManager: session.apolloDataStore.changeManager,
97
+ },
98
+ ],
99
+ )
100
+ },
101
+ })
81
102
  rootModel.appendToMenu('Apollo', {
82
103
  label: 'Manage Users',
83
104
  onClick: (session: ApolloSessionModel) => {
@@ -12,6 +12,7 @@ import { makeStyles } from 'tss-react/mui'
12
12
 
13
13
  import { Dialog } from '../../components/Dialog'
14
14
  import { createFetchErrorMessage } from '../../util'
15
+
15
16
  import { GoogleButton, GuestButton, MicrosoftButton } from './LoginButtons'
16
17
 
17
18
  const useStyles = makeStyles()((theme) => ({
@@ -1,5 +1,5 @@
1
1
  import AccountCircleIcon from '@mui/icons-material/AccountCircle'
2
- import { Button, ButtonProps } from '@mui/material'
2
+ import { Button, type ButtonProps } from '@mui/material'
3
3
  import React from 'react'
4
4
  import { makeStyles } from 'tss-react/mui'
5
5
 
@@ -1,4 +1,4 @@
1
- import { SvgIcon, SvgIconProps } from '@mui/material'
1
+ import { SvgIcon, type SvgIconProps } from '@mui/material'
2
2
  import React from 'react'
3
3
 
4
4
  // Icon source: https://developers.google.com/identity/branding-guidelines
@@ -1,6 +1,6 @@
1
1
  import { ConfigurationSchema } from '@jbrowse/core/configuration'
2
2
  import { BaseInternetAccountConfig } from '@jbrowse/core/pluggableElementTypes'
3
- import { Instance } from 'mobx-state-tree'
3
+ import { type Instance } from 'mobx-state-tree'
4
4
 
5
5
  const ApolloConfigSchema = ConfigurationSchema(
6
6
  'ApolloInternetAccount',
@@ -7,31 +7,32 @@
7
7
  /* eslint-disable @typescript-eslint/no-misused-promises */
8
8
  import { Change } from '@apollo-annotation/common'
9
9
  import {
10
- ChangeMessage,
11
- CheckResultUpdate,
12
- RequestUserInformationMessage,
13
- UserLocation,
14
- UserLocationMessage,
10
+ type ChangeMessage,
11
+ type CheckResultUpdate,
12
+ type RequestUserInformationMessage,
13
+ type UserLocation,
14
+ type UserLocationMessage,
15
15
  getDecodedToken,
16
16
  makeUserSessionId,
17
17
  } from '@apollo-annotation/shared'
18
18
  import { ConfigurationReference, getConf } from '@jbrowse/core/configuration'
19
19
  import { InternetAccount } from '@jbrowse/core/pluggableElementTypes'
20
20
  import {
21
- AbstractSessionModel,
21
+ type AbstractSessionModel,
22
22
  isAbstractMenuManager,
23
23
  isElectron,
24
24
  } from '@jbrowse/core/util'
25
25
  import { autorun } from 'mobx'
26
- import { Instance, flow, getRoot, types } from 'mobx-state-tree'
26
+ import { type Instance, flow, getRoot, types } from 'mobx-state-tree'
27
27
  import { io } from 'socket.io-client'
28
28
 
29
- import { Collaborator } from '../session'
30
- import { ApolloRootModel } from '../types'
29
+ import { type Collaborator } from '../session'
30
+ import { type ApolloRootModel } from '../types'
31
31
  import { createFetchErrorMessage } from '../util'
32
+
32
33
  import { addMenuItems } from './addMenuItems'
33
34
  import { AuthTypeSelector } from './components/AuthTypeSelector'
34
- import { ApolloInternetAccountConfigModel } from './configSchema'
35
+ import { type ApolloInternetAccountConfigModel } from './configSchema'
35
36
 
36
37
  type AuthType = 'google' | 'microsoft' | 'guest'
37
38
 
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
2
  /* eslint-disable @typescript-eslint/no-confusing-void-expression */
3
3
  import {
4
- SessionWithWidgets,
4
+ type SessionWithWidgets,
5
5
  getSession,
6
6
  isSessionModelWithWidgets,
7
7
  } from '@jbrowse/core/util'
@@ -1,13 +1,15 @@
1
- import { RefNameAliases } from './../BackendDrivers/BackendDriver'
1
+ import { readConfObject } from '@jbrowse/core/configuration'
2
2
  import {
3
- BaseRefNameAliasAdapter,
4
3
  BaseAdapter,
4
+ type BaseRefNameAliasAdapter,
5
5
  } from '@jbrowse/core/data_adapters/BaseAdapter'
6
- import { readConfObject } from '@jbrowse/core/configuration'
7
- import { ApolloSessionModel } from '../session'
8
- import { BackendDriver } from '../BackendDrivers'
6
+ import type RpcServer from 'librpc-web-mod/dist/server'
9
7
  import { nanoid } from 'nanoid'
10
- import RpcServer from 'librpc-web-mod/dist/server'
8
+
9
+ import { type BackendDriver } from '../BackendDrivers'
10
+ import { type ApolloSessionModel } from '../session'
11
+
12
+ import { type RefNameAliases } from './../BackendDrivers/BackendDriver'
11
13
 
12
14
  declare global {
13
15
  const rpcServer: RpcServer
@@ -1,8 +1,8 @@
1
+ import type PluginManager from '@jbrowse/core/PluginManager'
1
2
  import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'
2
- import PluginManager from '@jbrowse/core/PluginManager'
3
3
 
4
- import configSchema from './configSchema'
5
4
  import ApolloRefNameAliasAdapter from './ApolloRefNameAliasAdapter'
5
+ import configSchema from './configSchema'
6
6
 
7
7
  export function installApolloRefNameAliasAdapter(pluginManager: PluginManager) {
8
8
  pluginManager.addAdapterType(
@@ -6,12 +6,12 @@
6
6
  import { readConfObject } from '@jbrowse/core/configuration'
7
7
  import { BaseSequenceAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'
8
8
  import { ObservableCreate } from '@jbrowse/core/util/rxjs'
9
- import SimpleFeature, { Feature } from '@jbrowse/core/util/simpleFeature'
10
- import { NoAssemblyRegion, Region } from '@jbrowse/core/util/types'
9
+ import SimpleFeature, { type Feature } from '@jbrowse/core/util/simpleFeature'
10
+ import { type NoAssemblyRegion, type Region } from '@jbrowse/core/util/types'
11
11
  import { nanoid } from 'nanoid'
12
12
 
13
- import { BackendDriver } from '../BackendDrivers'
14
- import { ApolloSessionModel } from '../session'
13
+ import { type BackendDriver } from '../BackendDrivers'
14
+ import { type ApolloSessionModel } from '../session'
15
15
 
16
16
  // declare global {
17
17
  // var rpcServer: import('librpc-web-mod').RpcServer
@@ -1,5 +1,5 @@
1
+ import type PluginManager from '@jbrowse/core/PluginManager'
1
2
  import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'
2
- import PluginManager from '@jbrowse/core/PluginManager'
3
3
 
4
4
  import { ApolloSequenceAdapter } from './ApolloSequenceAdapter'
5
5
  import configSchema from './configSchema'
@@ -1,14 +1,15 @@
1
- import { AnnotationFeatureSnapshot } from '@apollo-annotation/mst'
1
+ import { type AnnotationFeatureSnapshot } from '@apollo-annotation/mst'
2
+ import BaseResult from '@jbrowse/core/TextSearch/BaseResults'
3
+ import { type Assembly } from '@jbrowse/core/assemblyManager/assembly'
2
4
  import { readConfObject } from '@jbrowse/core/configuration'
3
5
  import {
4
6
  BaseAdapter,
5
- BaseTextSearchAdapter,
6
- BaseTextSearchArgs,
7
+ type BaseTextSearchAdapter,
8
+ type BaseTextSearchArgs,
7
9
  } from '@jbrowse/core/data_adapters/BaseAdapter'
8
- import BaseResult from '@jbrowse/core/TextSearch/BaseResults'
9
- import { AbstractSessionModel, UriLocation } from '@jbrowse/core/util'
10
- import { ApolloSessionModel } from '../session'
11
- import { Assembly } from '@jbrowse/core/assemblyManager/assembly'
10
+ import { type AbstractSessionModel, type UriLocation } from '@jbrowse/core/util'
11
+
12
+ import { type ApolloSessionModel } from '../session'
12
13
 
13
14
  export class ApolloTextSearchAdapter
14
15
  extends BaseAdapter
@@ -1,5 +1,5 @@
1
+ import type PluginManager from '@jbrowse/core/PluginManager'
1
2
  import { TextSearchAdapterType } from '@jbrowse/core/pluggableElementTypes'
2
- import PluginManager from '@jbrowse/core/PluginManager'
3
3
 
4
4
  import { ApolloTextSearchAdapter } from './ApolloTextSearchAdapter'
5
5
  import configSchema from './configSchema'
@@ -1,13 +1,13 @@
1
- import { Change, ClientDataStore } from '@apollo-annotation/common'
1
+ import { type Change, type ClientDataStore } from '@apollo-annotation/common'
2
2
  import {
3
- AnnotationFeatureSnapshot,
4
- CheckResultSnapshot,
3
+ type AnnotationFeatureSnapshot,
4
+ type CheckResultSnapshot,
5
5
  } from '@apollo-annotation/mst'
6
- import { ValidationResultSet } from '@apollo-annotation/shared'
7
- import { Assembly } from '@jbrowse/core/assemblyManager/assembly'
8
- import { Region } from '@jbrowse/core/util'
6
+ import { type ValidationResultSet } from '@apollo-annotation/shared'
7
+ import { type Assembly } from '@jbrowse/core/assemblyManager/assembly'
8
+ import { type Region } from '@jbrowse/core/util'
9
9
 
10
- import { SubmitOpts } from '../ChangeManager'
10
+ import { type SubmitOpts } from '../ChangeManager'
11
11
 
12
12
  export interface RefNameAliases {
13
13
  refName: string
@@ -4,21 +4,25 @@
4
4
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
5
5
  /* eslint-disable @typescript-eslint/no-unsafe-call */
6
6
  /* eslint-disable @typescript-eslint/no-unnecessary-condition */
7
- import { AssemblySpecificChange, Change } from '@apollo-annotation/common'
7
+ import { type AssemblySpecificChange, Change } from '@apollo-annotation/common'
8
8
  import {
9
- AnnotationFeatureSnapshot,
10
- ApolloRefSeqI,
11
- CheckResultSnapshot,
9
+ type AnnotationFeatureSnapshot,
10
+ type ApolloRefSeqI,
11
+ type CheckResultSnapshot,
12
12
  } from '@apollo-annotation/mst'
13
- import { ChangeMessage, ValidationResultSet } from '@apollo-annotation/shared'
13
+ import {
14
+ type ChangeMessage,
15
+ ValidationResultSet,
16
+ } from '@apollo-annotation/shared'
14
17
  import { getConf } from '@jbrowse/core/configuration'
15
- import { BaseInternetAccountModel } from '@jbrowse/core/pluggableElementTypes'
16
- import { Region, getSession } from '@jbrowse/core/util'
17
- import { Socket } from 'socket.io-client'
18
+ import { type BaseInternetAccountModel } from '@jbrowse/core/pluggableElementTypes'
19
+ import { type Region, getSession } from '@jbrowse/core/util'
20
+ import { type Socket } from 'socket.io-client'
18
21
 
19
- import { ChangeManager, SubmitOpts } from '../ChangeManager'
22
+ import { ChangeManager, type SubmitOpts } from '../ChangeManager'
20
23
  import { createFetchErrorMessage } from '../util'
21
- import { BackendDriver, RefNameAliases } from './BackendDriver'
24
+
25
+ import { BackendDriver, type RefNameAliases } from './BackendDriver'
22
26
 
23
27
  export interface ApolloRefSeqResponse {
24
28
  _id: string
@@ -1,25 +1,26 @@
1
1
  /* eslint-disable @typescript-eslint/require-await */
2
2
  import {
3
- AssemblySpecificChange,
4
- Change,
3
+ type AssemblySpecificChange,
4
+ type Change,
5
5
  isAssemblySpecificChange,
6
6
  } from '@apollo-annotation/common'
7
7
  import {
8
- AnnotationFeatureSnapshot,
9
- CheckResultSnapshot,
8
+ type AnnotationFeatureSnapshot,
9
+ type CheckResultSnapshot,
10
10
  } from '@apollo-annotation/mst'
11
11
  import {
12
- annotationFeatureToGFF3,
13
12
  ValidationResultSet,
13
+ annotationFeatureToGFF3,
14
14
  splitStringIntoChunks,
15
15
  } from '@apollo-annotation/shared'
16
- import gff, { GFF3Item } from '@gmod/gff'
16
+ import gff, { type GFF3Item } from '@gmod/gff'
17
17
  import { getConf } from '@jbrowse/core/configuration'
18
- import { Region, getSession } from '@jbrowse/core/util'
18
+ import { type Region, getSession } from '@jbrowse/core/util'
19
19
  import { getSnapshot } from 'mobx-state-tree'
20
20
 
21
21
  import { checkFeatures, loadAssemblyIntoClient } from '../util'
22
- import { BackendDriver, RefNameAliases } from './BackendDriver'
22
+
23
+ import { BackendDriver, type RefNameAliases } from './BackendDriver'
23
24
 
24
25
  export class DesktopFileDriver extends BackendDriver {
25
26
  async loadAssembly(assemblyName: string) {
@@ -32,7 +33,7 @@ export class DesktopFileDriver extends BackendDriver {
32
33
  file: string
33
34
  }
34
35
 
35
- // eslint-disable-next-line @typescript-eslint/no-require-imports
36
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/consistent-type-imports
36
37
  const fs = require('node:fs') as typeof import('fs')
37
38
  const fileContents = await fs.promises.readFile(file, 'utf8')
38
39
  return loadAssemblyIntoClient(assemblyName, fileContents, this.clientStore)
@@ -166,7 +167,7 @@ export class DesktopFileDriver extends BackendDriver {
166
167
 
167
168
  const gff3Contents = gff.formatSync(gff3Items)
168
169
 
169
- // eslint-disable-next-line @typescript-eslint/no-require-imports
170
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/consistent-type-imports
170
171
  const fs = require('node:fs') as typeof import('fs')
171
172
  await fs.promises.writeFile(file, gff3Contents, 'utf8')
172
173
 
@@ -1,17 +1,21 @@
1
1
  /* eslint-disable @typescript-eslint/require-await */
2
- import { AssemblySpecificChange, Change } from '@apollo-annotation/common'
3
2
  import {
4
- AnnotationFeatureSnapshot,
5
- CheckResultSnapshot,
3
+ type AssemblySpecificChange,
4
+ type Change,
5
+ } from '@apollo-annotation/common'
6
+ import {
7
+ type AnnotationFeatureSnapshot,
8
+ type CheckResultSnapshot,
6
9
  } from '@apollo-annotation/mst'
7
10
  import { ValidationResultSet } from '@apollo-annotation/shared'
8
11
  import { getConf } from '@jbrowse/core/configuration'
9
- import { Region, getSession } from '@jbrowse/core/util'
12
+ import { type Region, getSession } from '@jbrowse/core/util'
10
13
 
11
- import { SubmitOpts } from '../ChangeManager'
12
- import { BackendDriver, RefNameAliases } from './BackendDriver'
14
+ import { type SubmitOpts } from '../ChangeManager'
13
15
  import { checkFeatures } from '../util'
14
16
 
17
+ import { BackendDriver, type RefNameAliases } from './BackendDriver'
18
+
15
19
  export class InMemoryFileDriver extends BackendDriver {
16
20
  async getFeatures(): Promise<
17
21
  [AnnotationFeatureSnapshot[], CheckResultSnapshot[]]
@@ -2,18 +2,18 @@
2
2
  /* eslint-disable @typescript-eslint/no-unsafe-call */
3
3
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
4
4
  import {
5
- Change,
6
- ClientDataStore,
5
+ type Change,
6
+ type ClientDataStore,
7
7
  isAssemblySpecificChange,
8
8
  } from '@apollo-annotation/common'
9
9
  import {
10
- ValidationResultSet,
10
+ type ValidationResultSet,
11
11
  validationRegistry,
12
12
  } from '@apollo-annotation/shared'
13
13
  import { getSession } from '@jbrowse/core/util'
14
- import { IAnyStateTreeNode } from 'mobx-state-tree'
14
+ import { type IAnyStateTreeNode } from 'mobx-state-tree'
15
15
 
16
- import { ApolloSessionModel } from './session'
16
+ import { type ApolloSessionModel } from './session'
17
17
 
18
18
  export interface SubmitOpts {
19
19
  /** defaults to true */
@@ -76,7 +76,10 @@ export class ChangeManager {
76
76
  jobsManager.abortJob(job.name, String(error))
77
77
  }
78
78
  console.error(error)
79
- session.notify(String(error), 'error')
79
+ session.notify(
80
+ `Error encountered in client: ${String(error)}. Data may be out of sync, please refresh the page`,
81
+ 'error',
82
+ )
80
83
  return
81
84
  }
82
85
 
@@ -123,10 +126,10 @@ export class ChangeManager {
123
126
  if (change.notification) {
124
127
  session.notify(change.notification, 'success')
125
128
  }
126
- }
127
- if (addToRecents) {
128
- // Push the change into array
129
- this.recentChanges.push(change)
129
+ if (addToRecents) {
130
+ // Push the change into array
131
+ this.recentChanges.push(change)
132
+ }
130
133
  }
131
134
 
132
135
  if (updateJobsManager) {
@@ -136,7 +139,8 @@ export class ChangeManager {
136
139
 
137
140
  async revert(change: Change, submitToBackend = true) {
138
141
  const inverseChange = change.getInverse()
139
- return this.submit(inverseChange, { submitToBackend, addToRecents: false })
142
+ const opts = { submitToBackend, addToRecents: false }
143
+ return this.submit(inverseChange, opts)
140
144
  }
141
145
 
142
146
  /**
@@ -1,21 +1,22 @@
1
1
  import { getSession } from '@jbrowse/core/util'
2
- import { observer } from 'mobx-react'
3
- import React, { useEffect, useState } from 'react'
4
- import { makeStyles } from 'tss-react/mui'
2
+ import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
5
3
  import {
6
4
  Accordion,
7
5
  AccordionDetails,
8
6
  AccordionSummary,
9
7
  Typography,
10
8
  } from '@mui/material'
11
- import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
9
+ import { observer } from 'mobx-react'
10
+ import React, { useEffect, useState } from 'react'
11
+ import { makeStyles } from 'tss-react/mui'
12
+
13
+ import { type ApolloSessionModel } from '../session'
12
14
 
13
- import { ApolloSessionModel } from '../session'
14
15
  import { Attributes } from './Attributes'
15
16
  import { BasicInformation } from './BasicInformation'
16
- import { ApolloFeatureDetailsWidget as ApolloFeatureDetails } from './model'
17
- import { Sequence } from './Sequence'
18
17
  import { FeatureDetailsNavigation } from './FeatureDetailsNavigation'
18
+ import { Sequence } from './Sequence'
19
+ import { type ApolloFeatureDetailsWidget as ApolloFeatureDetails } from './model'
19
20
 
20
21
  const useStyles = makeStyles()((theme) => ({
21
22
  root: {
@@ -1,8 +1,12 @@
1
- import { AbstractSessionModel, getSession } from '@jbrowse/core/util'
2
- import { observer } from 'mobx-react'
3
- import { getRoot } from 'mobx-state-tree'
4
- import React, { useEffect, useState } from 'react'
5
- import { makeStyles } from 'tss-react/mui'
1
+ import { type AnnotationFeature } from '@apollo-annotation/mst'
2
+ import styled from '@emotion/styled'
3
+ import {
4
+ type AbstractSessionModel,
5
+ getEnv,
6
+ getSession,
7
+ } from '@jbrowse/core/util'
8
+ import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
9
+ import InfoIcon from '@mui/icons-material/Info'
6
10
  import {
7
11
  Accordion,
8
12
  AccordionDetails,
@@ -10,20 +14,25 @@ import {
10
14
  Tooltip,
11
15
  Typography,
12
16
  } from '@mui/material'
17
+ import { observer } from 'mobx-react'
18
+ import { getRoot } from 'mobx-state-tree'
19
+ import React, { useEffect, useState } from 'react'
20
+ import { makeStyles } from 'tss-react/mui'
13
21
 
14
- import styled from '@emotion/styled'
15
-
16
- import ExpandMoreIcon from '@mui/icons-material/ExpandMore'
17
- import InfoIcon from '@mui/icons-material/Info'
22
+ import { type ApolloInternetAccountModel } from '../ApolloInternetAccount/model'
23
+ import { type ApolloSessionModel } from '../session'
24
+ import { type ApolloRootModel } from '../types'
18
25
 
19
- import { ApolloInternetAccountModel } from '../ApolloInternetAccount/model'
20
- import { ApolloSessionModel } from '../session'
21
- import { ApolloRootModel } from '../types'
22
26
  import { Attributes } from './Attributes'
23
27
  import { TranscriptSequence } from './TranscriptSequence'
24
- import { ApolloTranscriptDetailsWidget as ApolloTranscriptDetailsWidgetState } from './model'
25
- import { TranscriptWidgetSummary } from './TranscriptWidgetSummary'
26
28
  import { TranscriptWidgetEditLocation } from './TranscriptWidgetEditLocation'
29
+ import { TranscriptWidgetSummary } from './TranscriptWidgetSummary'
30
+ import { type ApolloTranscriptDetailsWidget as ApolloTranscriptDetailsWidgetState } from './model'
31
+
32
+ interface CustomComponentProps {
33
+ session: AbstractSessionModel
34
+ feature: AnnotationFeature
35
+ }
27
36
 
28
37
  const useStyles = makeStyles()((theme) => ({
29
38
  root: {
@@ -40,6 +49,10 @@ export const StyledAccordionSummary = styled(AccordionSummary)(() => ({
40
49
  },
41
50
  }))
42
51
 
52
+ function NoOpCustomComponent(_props: CustomComponentProps) {
53
+ return null
54
+ }
55
+
43
56
  export const ApolloTranscriptDetailsWidget = observer(
44
57
  function ApolloTranscriptDetails(props: {
45
58
  model: ApolloTranscriptDetailsWidgetState
@@ -57,6 +70,7 @@ export const ApolloTranscriptDetailsWidget = observer(
57
70
  }, [feature])
58
71
 
59
72
  const session = getSession(model) as unknown as AbstractSessionModel
73
+ const { pluginManager } = getEnv(session)
60
74
  const apolloSession = getSession(model) as unknown as ApolloSessionModel
61
75
  const currentAssembly =
62
76
  apolloSession.apolloDataStore.assemblies.get(assembly)
@@ -92,6 +106,12 @@ export const ApolloTranscriptDetailsWidget = observer(
92
106
  }
93
107
  }
94
108
 
109
+ const CustomComponent = pluginManager.evaluateExtensionPoint(
110
+ 'Apollo-TranscriptDetailsCustomComponent',
111
+ NoOpCustomComponent,
112
+ props,
113
+ ) as React.ElementType<CustomComponentProps>
114
+
95
115
  return (
96
116
  <div className={classes.root}>
97
117
  <Accordion
@@ -113,6 +133,7 @@ export const ApolloTranscriptDetailsWidget = observer(
113
133
  <TranscriptWidgetSummary feature={feature} refName={refName} />
114
134
  </AccordionDetails>
115
135
  </Accordion>
136
+ <CustomComponent session={session} feature={feature} />
116
137
  <Accordion
117
138
  style={{ marginTop: 5 }}
118
139
  expanded={panelState.includes('location')}
@@ -0,0 +1,50 @@
1
+ import {
2
+ gffInternalToColumn,
3
+ internalToGFF,
4
+ isGFFColumnInternal,
5
+ isGFFInternalAttribute,
6
+ } from '@apollo-annotation/shared'
7
+ import InfoIcon from '@mui/icons-material/Info'
8
+ import { Chip, Tooltip, Typography } from '@mui/material'
9
+ import React from 'react'
10
+ import { makeStyles } from 'tss-react/mui'
11
+
12
+ const useStyles = makeStyles()((theme) => ({
13
+ attributeKey: {
14
+ fontWeight: 'bold',
15
+ marginRight: theme.spacing(2),
16
+ },
17
+ }))
18
+
19
+ export function AttributeKey({ attributeKey: key }: { attributeKey: string }) {
20
+ const { classes } = useStyles()
21
+
22
+ const startsWithCapital = /^[A-Z]/.test(key)
23
+ let displayKey = key
24
+ let titleText: string | undefined
25
+ if (isGFFInternalAttribute(key)) {
26
+ displayKey = internalToGFF[key]
27
+ titleText = `On GFF3 export, this will be assigned to the GFF3's reserved "${displayKey}" attribute`
28
+ } else if (isGFFColumnInternal(key)) {
29
+ displayKey = gffInternalToColumn[key]
30
+ titleText = `On GFF3 export, this will be placed in the GFF3's "${displayKey}" column`
31
+ } else if (startsWithCapital) {
32
+ titleText =
33
+ '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'
34
+ }
35
+ return (
36
+ <div style={{ display: 'flex' }}>
37
+ <Typography className={classes.attributeKey}>{displayKey}</Typography>
38
+ {titleText ? (
39
+ <Tooltip title={titleText}>
40
+ <Chip
41
+ icon={<InfoIcon />}
42
+ label="GFF3"
43
+ size="small"
44
+ variant="outlined"
45
+ />
46
+ </Tooltip>
47
+ ) : null}
48
+ </div>
49
+ )
50
+ }