@jbrowse/plugin-data-management 2.0.0 → 2.1.2

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 (140) hide show
  1. package/dist/AddConnectionWidget/components/AddConnectionWidget.js +23 -40
  2. package/dist/AddConnectionWidget/components/AddConnectionWidget.js.map +1 -1
  3. package/dist/AddConnectionWidget/components/ConfigureConnection.js +6 -6
  4. package/dist/AddConnectionWidget/components/ConfigureConnection.js.map +1 -1
  5. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js +7 -9
  6. package/dist/AddConnectionWidget/components/ConnectionTypeSelect.js.map +1 -1
  7. package/dist/AddConnectionWidget/index.js +1 -1
  8. package/dist/AddConnectionWidget/index.js.map +1 -1
  9. package/dist/AddConnectionWidget/model.js +2 -2
  10. package/dist/AddConnectionWidget/model.js.map +1 -1
  11. package/dist/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
  12. package/dist/AddTrackWidget/components/AddTrackWidget.js +24 -220
  13. package/dist/AddTrackWidget/components/AddTrackWidget.js.map +1 -1
  14. package/dist/AddTrackWidget/components/ConfirmTrack.js +72 -99
  15. package/dist/AddTrackWidget/components/ConfirmTrack.js.map +1 -1
  16. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +7 -0
  17. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js +162 -0
  18. package/dist/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -0
  19. package/dist/AddTrackWidget/components/TrackSourceSelect.js +11 -12
  20. package/dist/AddTrackWidget/components/TrackSourceSelect.js.map +1 -1
  21. package/dist/AddTrackWidget/index.js +1 -1
  22. package/dist/AddTrackWidget/index.js.map +1 -1
  23. package/dist/AddTrackWidget/model.js +34 -30
  24. package/dist/AddTrackWidget/model.js.map +1 -1
  25. package/dist/AssemblyManager/AssemblyAddForm.js +42 -61
  26. package/dist/AssemblyManager/AssemblyAddForm.js.map +1 -1
  27. package/dist/AssemblyManager/AssemblyEditor.js +4 -5
  28. package/dist/AssemblyManager/AssemblyEditor.js.map +1 -1
  29. package/dist/AssemblyManager/AssemblyManager.js +24 -41
  30. package/dist/AssemblyManager/AssemblyManager.js.map +1 -1
  31. package/dist/AssemblyManager/AssemblyTable.js +17 -18
  32. package/dist/AssemblyManager/AssemblyTable.js.map +1 -1
  33. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js +9 -29
  34. package/dist/HierarchicalTrackSelectorWidget/components/CloseConnectionDialog.js.map +1 -1
  35. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js +7 -8
  36. package/dist/HierarchicalTrackSelectorWidget/components/DeleteConnectionDialog.js.map +1 -1
  37. package/dist/HierarchicalTrackSelectorWidget/components/Header.d.ts +10 -0
  38. package/dist/HierarchicalTrackSelectorWidget/components/Header.js +177 -0
  39. package/dist/HierarchicalTrackSelectorWidget/components/Header.js.map +1 -0
  40. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +79 -365
  41. package/dist/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  42. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js +17 -18
  43. package/dist/HierarchicalTrackSelectorWidget/components/ManageConnectionsDialog.js.map +1 -1
  44. package/dist/HierarchicalTrackSelectorWidget/components/Node.d.ts +29 -0
  45. package/dist/HierarchicalTrackSelectorWidget/components/Node.js +173 -0
  46. package/dist/HierarchicalTrackSelectorWidget/components/Node.js.map +1 -0
  47. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js +19 -20
  48. package/dist/HierarchicalTrackSelectorWidget/components/ToggleConnectionsDialog.js.map +1 -1
  49. package/dist/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  50. package/dist/HierarchicalTrackSelectorWidget/components/util.js +9 -0
  51. package/dist/HierarchicalTrackSelectorWidget/components/util.js.map +1 -0
  52. package/dist/HierarchicalTrackSelectorWidget/configSchema.d.ts +2 -0
  53. package/dist/HierarchicalTrackSelectorWidget/configSchema.js +6 -0
  54. package/dist/HierarchicalTrackSelectorWidget/configSchema.js.map +1 -0
  55. package/dist/HierarchicalTrackSelectorWidget/index.d.ts +4 -2
  56. package/dist/HierarchicalTrackSelectorWidget/index.js +4 -4
  57. package/dist/HierarchicalTrackSelectorWidget/index.js.map +1 -1
  58. package/dist/HierarchicalTrackSelectorWidget/model.d.ts +10 -2
  59. package/dist/HierarchicalTrackSelectorWidget/model.js +102 -153
  60. package/dist/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  61. package/dist/PluginStoreWidget/components/CustomPluginForm.js +25 -43
  62. package/dist/PluginStoreWidget/components/CustomPluginForm.js.map +1 -1
  63. package/dist/PluginStoreWidget/components/InstalledPlugin.js +29 -47
  64. package/dist/PluginStoreWidget/components/InstalledPlugin.js.map +1 -1
  65. package/dist/PluginStoreWidget/components/InstalledPluginsList.js +12 -15
  66. package/dist/PluginStoreWidget/components/InstalledPluginsList.js.map +1 -1
  67. package/dist/PluginStoreWidget/components/PluginCard.js +23 -40
  68. package/dist/PluginStoreWidget/components/PluginCard.js.map +1 -1
  69. package/dist/PluginStoreWidget/components/PluginStoreWidget.js +49 -117
  70. package/dist/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  71. package/dist/PluginStoreWidget/index.js +1 -1
  72. package/dist/PluginStoreWidget/index.js.map +1 -1
  73. package/dist/PluginStoreWidget/model.js +6 -6
  74. package/dist/PluginStoreWidget/model.js.map +1 -1
  75. package/dist/SetDefaultSession/SetDefaultSession.js +9 -10
  76. package/dist/SetDefaultSession/SetDefaultSession.js.map +1 -1
  77. package/dist/index.d.ts +4 -1
  78. package/dist/index.js +38 -60
  79. package/dist/index.js.map +1 -1
  80. package/dist/ucsc-trackhub/configSchema.js +2 -2
  81. package/dist/ucsc-trackhub/configSchema.js.map +1 -1
  82. package/dist/ucsc-trackhub/model.js +33 -97
  83. package/dist/ucsc-trackhub/model.js.map +1 -1
  84. package/dist/ucsc-trackhub/ucscAssemblies.js +197 -1
  85. package/dist/ucsc-trackhub/ucscAssemblies.js.map +1 -1
  86. package/dist/ucsc-trackhub/ucscTrackHub.js +43 -132
  87. package/dist/ucsc-trackhub/ucscTrackHub.js.map +1 -1
  88. package/esm/AddTrackWidget/components/AddTrackWidget.d.ts +2 -2
  89. package/esm/AddTrackWidget/components/AddTrackWidget.js +22 -135
  90. package/esm/AddTrackWidget/components/AddTrackWidget.js.map +1 -1
  91. package/esm/AddTrackWidget/components/ConfirmTrack.js +5 -6
  92. package/esm/AddTrackWidget/components/ConfirmTrack.js.map +1 -1
  93. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.d.ts +7 -0
  94. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js +134 -0
  95. package/esm/AddTrackWidget/components/DefaultAddTrackWorkflow.js.map +1 -0
  96. package/esm/HierarchicalTrackSelectorWidget/components/Header.d.ts +10 -0
  97. package/esm/HierarchicalTrackSelectorWidget/components/Header.js +149 -0
  98. package/esm/HierarchicalTrackSelectorWidget/components/Header.js.map +1 -0
  99. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js +24 -223
  100. package/esm/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.js.map +1 -1
  101. package/esm/HierarchicalTrackSelectorWidget/components/Node.d.ts +29 -0
  102. package/esm/HierarchicalTrackSelectorWidget/components/Node.js +144 -0
  103. package/esm/HierarchicalTrackSelectorWidget/components/Node.js.map +1 -0
  104. package/esm/HierarchicalTrackSelectorWidget/components/util.d.ts +3 -0
  105. package/esm/HierarchicalTrackSelectorWidget/components/util.js +5 -0
  106. package/esm/HierarchicalTrackSelectorWidget/components/util.js.map +1 -0
  107. package/esm/HierarchicalTrackSelectorWidget/configSchema.d.ts +2 -0
  108. package/esm/HierarchicalTrackSelectorWidget/configSchema.js +4 -0
  109. package/esm/HierarchicalTrackSelectorWidget/configSchema.js.map +1 -0
  110. package/esm/HierarchicalTrackSelectorWidget/index.d.ts +4 -2
  111. package/esm/HierarchicalTrackSelectorWidget/index.js +3 -3
  112. package/esm/HierarchicalTrackSelectorWidget/index.js.map +1 -1
  113. package/esm/HierarchicalTrackSelectorWidget/model.d.ts +10 -2
  114. package/esm/HierarchicalTrackSelectorWidget/model.js +36 -32
  115. package/esm/HierarchicalTrackSelectorWidget/model.js.map +1 -1
  116. package/esm/PluginStoreWidget/components/PluginStoreWidget.js +1 -2
  117. package/esm/PluginStoreWidget/components/PluginStoreWidget.js.map +1 -1
  118. package/esm/index.d.ts +4 -1
  119. package/esm/index.js +1 -1
  120. package/esm/index.js.map +1 -1
  121. package/package.json +4 -5
  122. package/src/AddConnectionWidget/components/__snapshots__/AddConnectionWidget.test.js.snap +7 -7
  123. package/src/AddTrackWidget/components/{AddTrackWidget.test.js → AddTrackWidget.test.tsx} +17 -32
  124. package/src/AddTrackWidget/components/AddTrackWidget.tsx +36 -200
  125. package/src/AddTrackWidget/components/ConfirmTrack.tsx +10 -10
  126. package/src/AddTrackWidget/components/DefaultAddTrackWorkflow.tsx +205 -0
  127. package/src/HierarchicalTrackSelectorWidget/components/Header.tsx +287 -0
  128. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.test.js +5 -4
  129. package/src/HierarchicalTrackSelectorWidget/components/HierarchicalTrackSelector.tsx +19 -438
  130. package/src/HierarchicalTrackSelectorWidget/components/Node.tsx +282 -0
  131. package/src/HierarchicalTrackSelectorWidget/components/__snapshots__/HierarchicalTrackSelector.test.js.snap +24 -48
  132. package/src/HierarchicalTrackSelectorWidget/components/util.ts +11 -0
  133. package/src/HierarchicalTrackSelectorWidget/configSchema.ts +3 -0
  134. package/src/HierarchicalTrackSelectorWidget/index.ts +4 -6
  135. package/src/HierarchicalTrackSelectorWidget/model.ts +45 -41
  136. package/src/PluginStoreWidget/components/PluginStoreWidget.test.js +16 -4
  137. package/src/PluginStoreWidget/components/PluginStoreWidget.tsx +1 -2
  138. package/src/PluginStoreWidget/components/__snapshots__/PluginStoreWidget.test.js.snap +111 -123
  139. package/src/index.ts +4 -1
  140. package/src/AddTrackWidget/components/__snapshots__/AddTrackWidget.test.js.snap +0 -331
@@ -0,0 +1,287 @@
1
+ import React, { Suspense, lazy, useState } from 'react'
2
+ import { makeStyles } from 'tss-react/mui'
3
+ import { Badge, IconButton, InputAdornment, TextField } from '@mui/material'
4
+ // icons
5
+ import ClearIcon from '@mui/icons-material/Clear'
6
+ import MenuIcon from '@mui/icons-material/Menu'
7
+ import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'
8
+ import { Cable } from '@jbrowse/core/ui/Icons'
9
+
10
+ // other
11
+ import JBrowseMenu, { MenuItem } from '@jbrowse/core/ui/Menu'
12
+ import {
13
+ getSession,
14
+ isSessionModelWithWidgets,
15
+ isSessionModelWithConnections,
16
+ isSessionWithAddTracks,
17
+ } from '@jbrowse/core/util'
18
+ import {
19
+ AnyConfigurationModel,
20
+ readConfObject,
21
+ } from '@jbrowse/core/configuration'
22
+ import { observer } from 'mobx-react'
23
+ import { getEnv } from 'mobx-state-tree'
24
+
25
+ // locals
26
+ import { HierarchicalTrackSelectorModel } from '../model'
27
+
28
+ // lazy components
29
+ const CloseConnectionDialog = lazy(() => import('./CloseConnectionDialog'))
30
+ const DeleteConnectionDialog = lazy(() => import('./DeleteConnectionDialog'))
31
+ const ManageConnectionsDialog = lazy(() => import('./ManageConnectionsDialog'))
32
+ const ToggleConnectionsDialog = lazy(() => import('./ToggleConnectionsDialog'))
33
+
34
+ const useStyles = makeStyles()(theme => ({
35
+ searchBox: {
36
+ margin: theme.spacing(2),
37
+ },
38
+ menuIcon: {
39
+ marginRight: theme.spacing(1),
40
+ marginBottom: 0,
41
+ },
42
+ }))
43
+
44
+ interface ModalArgs {
45
+ connectionConf: AnyConfigurationModel
46
+ safelyBreakConnection: Function
47
+ dereferenceTypeCount: { [key: string]: number }
48
+ name: string
49
+ }
50
+
51
+ interface DialogDetails {
52
+ name: string
53
+ connectionConf: AnyConfigurationModel
54
+ }
55
+
56
+ function HierarchicalTrackSelectorHeader({
57
+ model,
58
+ setHeaderHeight,
59
+ setAssemblyIdx,
60
+ assemblyIdx,
61
+ }: {
62
+ model: HierarchicalTrackSelectorModel
63
+ setHeaderHeight: (n: number) => void
64
+ setAssemblyIdx: (n: number) => void
65
+ assemblyIdx: number
66
+ }) {
67
+ const { classes } = useStyles()
68
+ const session = getSession(model)
69
+ const [connectionEl, setConnectionEl] = useState<HTMLButtonElement>()
70
+ const [selectionEl, setSelectionEl] = useState<HTMLButtonElement>()
71
+ const [menuEl, setMenuEl] = useState<HTMLButtonElement>()
72
+ const [modalInfo, setModalInfo] = useState<ModalArgs>()
73
+ const [deleteDlgDetails, setDeleteDlgDetails] = useState<DialogDetails>()
74
+ const [connectionManagerOpen, setConnectionManagerOpen] = useState(false)
75
+ const [connectionToggleOpen, setConnectionToggleOpen] = useState(false)
76
+ const { assemblyNames } = model
77
+ const assemblyName = assemblyNames[assemblyIdx]
78
+
79
+ function breakConnection(
80
+ connectionConf: AnyConfigurationModel,
81
+ deletingConnection?: boolean,
82
+ ) {
83
+ const name = readConfObject(connectionConf, 'name')
84
+
85
+ // @ts-ignore
86
+ const result = session.prepareToBreakConnection(connectionConf)
87
+ if (result) {
88
+ const [safelyBreakConnection, dereferenceTypeCount] = result
89
+ if (Object.keys(dereferenceTypeCount).length > 0) {
90
+ setModalInfo({
91
+ connectionConf,
92
+ safelyBreakConnection,
93
+ dereferenceTypeCount,
94
+ name,
95
+ })
96
+ } else {
97
+ safelyBreakConnection()
98
+ }
99
+ }
100
+ if (deletingConnection) {
101
+ setDeleteDlgDetails({ name, connectionConf })
102
+ }
103
+ }
104
+
105
+ const connectionMenuItems = [
106
+ {
107
+ label: 'Turn on/off connections...',
108
+ onClick: () => setConnectionToggleOpen(true),
109
+ },
110
+ ]
111
+
112
+ if (isSessionModelWithConnections(session)) {
113
+ connectionMenuItems.unshift({
114
+ label: 'Add connection',
115
+ onClick: () => {
116
+ if (isSessionModelWithWidgets(session)) {
117
+ session.showWidget(
118
+ session.addWidget('AddConnectionWidget', 'addConnectionWidget'),
119
+ )
120
+ }
121
+ },
122
+ })
123
+
124
+ connectionMenuItems.push({
125
+ label: 'Delete connections...',
126
+ onClick: () => setConnectionManagerOpen(true),
127
+ })
128
+ }
129
+
130
+ const assemblyMenuItems =
131
+ assemblyNames.length > 1
132
+ ? [
133
+ {
134
+ label: 'Select assembly...',
135
+ subMenu: assemblyNames.map((name, idx) => ({
136
+ label: name,
137
+ onClick: () => setAssemblyIdx(idx),
138
+ })),
139
+ },
140
+ ]
141
+ : []
142
+
143
+ const menuItems = [
144
+ {
145
+ label: 'Add track...',
146
+ onClick: () => {
147
+ if (isSessionModelWithWidgets(session)) {
148
+ session.showWidget(
149
+ session.addWidget('AddTrackWidget', 'addTrackWidget', {
150
+ view: model.view.id,
151
+ }),
152
+ )
153
+ }
154
+ },
155
+ },
156
+
157
+ ...assemblyMenuItems,
158
+ ]
159
+
160
+ const items = getEnv(model).pluginManager.evaluateExtensionPoint(
161
+ 'TrackSelector-multiTrackMenuItems',
162
+ ) as MenuItem[]
163
+ return (
164
+ <div
165
+ ref={ref => setHeaderHeight(ref?.getBoundingClientRect().height || 0)}
166
+ data-testid="hierarchical_track_selector"
167
+ >
168
+ <div style={{ display: 'flex' }}>
169
+ {isSessionWithAddTracks(session) && (
170
+ <IconButton
171
+ className={classes.menuIcon}
172
+ onClick={event => setMenuEl(event.currentTarget)}
173
+ >
174
+ <MenuIcon />
175
+ </IconButton>
176
+ )}
177
+
178
+ {session.makeConnection && (
179
+ <IconButton
180
+ className={classes.menuIcon}
181
+ onClick={event => setConnectionEl(event.currentTarget)}
182
+ >
183
+ <Cable />
184
+ </IconButton>
185
+ )}
186
+
187
+ {model.selection.length ? (
188
+ <IconButton
189
+ className={classes.menuIcon}
190
+ onClick={event => setSelectionEl(event.currentTarget)}
191
+ >
192
+ <Badge badgeContent={model.selection.length} color="primary">
193
+ <ShoppingCartIcon />
194
+ </Badge>
195
+ </IconButton>
196
+ ) : null}
197
+
198
+ <TextField
199
+ className={classes.searchBox}
200
+ label="Filter tracks"
201
+ value={model.filterText}
202
+ onChange={event => model.setFilterText(event.target.value)}
203
+ fullWidth
204
+ InputProps={{
205
+ endAdornment: (
206
+ <InputAdornment position="end">
207
+ <IconButton color="secondary" onClick={model.clearFilterText}>
208
+ <ClearIcon />
209
+ </IconButton>
210
+ </InputAdornment>
211
+ ),
212
+ }}
213
+ />
214
+ </div>
215
+ <JBrowseMenu
216
+ anchorEl={connectionEl}
217
+ open={Boolean(connectionEl)}
218
+ onMenuItemClick={(_, callback) => {
219
+ callback()
220
+ setConnectionEl(undefined)
221
+ }}
222
+ onClose={() => setConnectionEl(undefined)}
223
+ menuItems={connectionMenuItems}
224
+ />
225
+ <JBrowseMenu
226
+ anchorEl={menuEl}
227
+ open={Boolean(menuEl)}
228
+ onMenuItemClick={(_, callback) => {
229
+ callback()
230
+ setMenuEl(undefined)
231
+ }}
232
+ onClose={() => setMenuEl(undefined)}
233
+ menuItems={menuItems}
234
+ />
235
+ <JBrowseMenu
236
+ anchorEl={selectionEl}
237
+ open={Boolean(selectionEl)}
238
+ onMenuItemClick={(_, callback) => {
239
+ callback()
240
+ setSelectionEl(undefined)
241
+ }}
242
+ onClose={() => setSelectionEl(undefined)}
243
+ menuItems={[
244
+ { label: 'Clear', onClick: () => model.clearSelection() },
245
+ ...items.map(item => ({
246
+ ...item,
247
+ ...('onClick' in item
248
+ ? { onClick: () => item.onClick(model) }
249
+ : {}),
250
+ })),
251
+ ]}
252
+ />
253
+ <Suspense fallback={<div />}>
254
+ {modalInfo ? (
255
+ <CloseConnectionDialog
256
+ modalInfo={modalInfo}
257
+ setModalInfo={setModalInfo}
258
+ />
259
+ ) : null}
260
+ {deleteDlgDetails ? (
261
+ <DeleteConnectionDialog
262
+ handleClose={() => setDeleteDlgDetails(undefined)}
263
+ deleteDialogDetails={deleteDlgDetails}
264
+ session={session}
265
+ />
266
+ ) : null}
267
+ {connectionManagerOpen ? (
268
+ <ManageConnectionsDialog
269
+ handleClose={() => setConnectionManagerOpen(false)}
270
+ breakConnection={breakConnection}
271
+ session={session}
272
+ />
273
+ ) : null}
274
+ {connectionToggleOpen ? (
275
+ <ToggleConnectionsDialog
276
+ handleClose={() => setConnectionToggleOpen(false)}
277
+ session={session}
278
+ breakConnection={breakConnection}
279
+ assemblyName={assemblyName}
280
+ />
281
+ ) : null}
282
+ </Suspense>
283
+ </div>
284
+ )
285
+ }
286
+
287
+ export default observer(HierarchicalTrackSelectorHeader)
@@ -1,5 +1,6 @@
1
+ import { createJBrowseTheme } from '@jbrowse/core/ui'
1
2
  import { createTestSession } from '@jbrowse/web/src/rootModel'
2
- import { createTheme, ThemeProvider } from '@mui/material/styles'
3
+ import { ThemeProvider } from '@mui/material/styles'
3
4
  import { cleanup, render } from '@testing-library/react'
4
5
  import React from 'react'
5
6
  import HierarchicalTrackSelector from './HierarchicalTrackSelector'
@@ -17,7 +18,7 @@ describe('HierarchicalTrackSelector widget', () => {
17
18
  const model = firstView.activateTrackSelector()
18
19
 
19
20
  const { container } = render(
20
- <ThemeProvider theme={createTheme()}>
21
+ <ThemeProvider theme={createJBrowseTheme()}>
21
22
  <HierarchicalTrackSelector model={model} />
22
23
  </ThemeProvider>,
23
24
  )
@@ -72,7 +73,7 @@ describe('HierarchicalTrackSelector widget', () => {
72
73
  const model = firstView.activateTrackSelector()
73
74
 
74
75
  const { container, findByTestId } = render(
75
- <ThemeProvider theme={createTheme()}>
76
+ <ThemeProvider theme={createJBrowseTheme()}>
76
77
  <HierarchicalTrackSelector model={model} />
77
78
  </ThemeProvider>,
78
79
  )
@@ -133,7 +134,7 @@ describe('HierarchicalTrackSelector widget', () => {
133
134
  const model = firstView.activateTrackSelector()
134
135
 
135
136
  const { container, findByTestId } = render(
136
- <ThemeProvider theme={createTheme()}>
137
+ <ThemeProvider theme={createJBrowseTheme()}>
137
138
  <HierarchicalTrackSelector model={model} />
138
139
  </ThemeProvider>,
139
140
  )