33 * Distributed under the terms of the Modified BSD License.
44 */
55
6- import { CommandRegistry } from '@lumino/commands' ;
76import {
8- ILabShell ,
9- IRouter ,
7+ IEditorWidgetFactory ,
8+ FileEditorFactory
9+ } from '@jupyterlab/fileeditor' ;
10+ import {
11+ INotebookWidgetFactory ,
12+ NotebookWidgetFactory
13+ } from '@jupyterlab/notebook' ;
14+ import { ContentsManager } from '@jupyterlab/services' ;
15+ import { RtcContentProvider } from '@jupyter/my-shared-docprovider' ;
16+ import {
1017 JupyterFrontEnd ,
1118 JupyterFrontEndPlugin
1219} from '@jupyterlab/application' ;
13- import {
14- FileBrowser ,
15- IDefaultFileBrowser ,
16- IFileBrowserFactory
17- } from '@jupyterlab/filebrowser' ;
1820import { ISettingRegistry } from '@jupyterlab/settingregistry' ;
1921import { ITranslator , nullTranslator } from '@jupyterlab/translation' ;
2022
2123import { YFile , YNotebook } from '@jupyter/ydoc' ;
2224
23- import { ICollaborativeDrive } from '@jupyter/collaborative-drive' ;
24- import { MySharedDrive } from '@jupyter/my-shared-docprovider' ;
25-
26- /**
27- * The command IDs used by the file browser plugin.
28- */
29- namespace CommandIDs {
30- export const openPath = 'filebrowser:open-path' ;
31- }
25+ import { ICollaborativeContentProvider } from '@jupyter/collaborative-drive' ;
3226
3327/**
3428 * The shared drive provider.
3529 */
36- export const drive : JupyterFrontEndPlugin < ICollaborativeDrive > = {
37- id : '@jupyter/docprovider-extension:drive' ,
38- description : 'The default collaborative drive provider' ,
39- provides : ICollaborativeDrive ,
40- optional : [ ITranslator ] ,
41- activate : (
42- app : JupyterFrontEnd ,
43- translator : ITranslator | null
44- ) : ICollaborativeDrive => {
45- translator = translator ?? nullTranslator ;
46- const trans = translator . load ( 'my-jupyter-shared-drive' ) ;
47- const drive = new MySharedDrive (
48- app ,
49- trans
50- ) ;
51- app . serviceManager . contents . addDrive ( drive ) ;
52- return drive ;
53- }
54- } ;
30+ export const rtcContentProvider : JupyterFrontEndPlugin < ICollaborativeContentProvider > =
31+ {
32+ id : '@jupyter/docprovider-extension:content-provider' ,
33+ description : 'The RTC content provider' ,
34+ provides : ICollaborativeContentProvider ,
35+ optional : [ ITranslator ] ,
36+ activate : (
37+ app : JupyterFrontEnd ,
38+ translator : ITranslator | null
39+ ) : ICollaborativeContentProvider => {
40+ translator = translator ?? nullTranslator ;
41+ const trans = translator . load ( 'my-jupyter-shared-drive' ) ;
42+ const defaultDrive = ( app . serviceManager . contents as ContentsManager )
43+ . defaultDrive ;
44+ if ( ! defaultDrive ) {
45+ throw Error (
46+ 'Cannot initialize content provider: default drive property not accessible on contents manager instance.'
47+ ) ;
48+ }
49+ const registry = defaultDrive . contentProviderRegistry ;
50+ if ( ! registry ) {
51+ throw Error (
52+ 'Cannot initialize content provider: no content provider registry.'
53+ ) ;
54+ }
55+ const rtcContentProvider = new RtcContentProvider ( app , {
56+ apiEndpoint : '/api/contents' ,
57+ serverSettings : defaultDrive . serverSettings ,
58+ user : app . serviceManager . user ,
59+ trans
60+ } ) ;
61+ registry . register ( 'rtc' , rtcContentProvider ) ;
62+ return rtcContentProvider ;
63+ }
64+ } ;
5565
5666/**
5767 * Plugin to register the shared model factory for the content type 'file'.
@@ -61,13 +71,21 @@ export const yfile: JupyterFrontEndPlugin<void> = {
6171 description :
6272 "Plugin to register the shared model factory for the content type 'file'" ,
6373 autoStart : true ,
64- requires : [ ICollaborativeDrive ] ,
74+ requires : [ ICollaborativeContentProvider , IEditorWidgetFactory ] ,
6575 optional : [ ] ,
66- activate : ( app : JupyterFrontEnd , drive : ICollaborativeDrive ) : void => {
76+ activate : (
77+ app : JupyterFrontEnd ,
78+ contentProvider : ICollaborativeContentProvider ,
79+ editorFactory : FileEditorFactory . IFactory
80+ ) : void => {
6781 const yFileFactory = ( ) => {
6882 return new YFile ( ) ;
6983 } ;
70- drive . sharedModelFactory . registerDocumentFactory ( 'file' , yFileFactory ) ;
84+ contentProvider . sharedModelFactory . registerDocumentFactory (
85+ 'file' ,
86+ yFileFactory
87+ ) ;
88+ editorFactory . contentProviderId = 'rtc' ;
7189 }
7290} ;
7391
@@ -79,11 +97,12 @@ export const ynotebook: JupyterFrontEndPlugin<void> = {
7997 description :
8098 "Plugin to register the shared model factory for the content type 'notebook'" ,
8199 autoStart : true ,
82- requires : [ ICollaborativeDrive ] ,
100+ requires : [ ICollaborativeContentProvider , INotebookWidgetFactory ] ,
83101 optional : [ ISettingRegistry ] ,
84102 activate : (
85103 app : JupyterFrontEnd ,
86- drive : ICollaborativeDrive ,
104+ contentProvider : ICollaborativeContentProvider ,
105+ notebookFactory : NotebookWidgetFactory . IFactory ,
87106 settingRegistry : ISettingRegistry | null
88107 ) : void => {
89108 let disableDocumentWideUndoRedo = true ;
@@ -113,112 +132,10 @@ export const ynotebook: JupyterFrontEndPlugin<void> = {
113132 disableDocumentWideUndoRedo
114133 } ) ;
115134 } ;
116- drive . sharedModelFactory . registerDocumentFactory (
135+ contentProvider . sharedModelFactory . registerDocumentFactory (
117136 'notebook' ,
118137 yNotebookFactory
119138 ) ;
139+ notebookFactory . contentProviderId = 'rtc' ;
120140 }
121141} ;
122-
123- /**
124- * The shared file browser factory provider.
125- */
126- export const mySharedFileBrowser : JupyterFrontEndPlugin < IDefaultFileBrowser > = {
127- id : 'my-jupyter-shared-drive:mySharedFileBrowser' ,
128- description : 'The shared file browser factory provider' ,
129- autoStart : true ,
130- provides : IDefaultFileBrowser ,
131- requires : [ ICollaborativeDrive , IFileBrowserFactory ] ,
132- optional : [ IRouter , JupyterFrontEnd . ITreeResolver , ILabShell , ITranslator ] ,
133- activate : async (
134- app : JupyterFrontEnd ,
135- drive : ICollaborativeDrive ,
136- fileBrowserFactory : IFileBrowserFactory ,
137- router : IRouter | null ,
138- tree : JupyterFrontEnd . ITreeResolver | null ,
139- labShell : ILabShell | null ,
140- translator : ITranslator | null
141- ) : Promise < IDefaultFileBrowser > => {
142- const { commands } = app ;
143- const trans = ( translator ?? nullTranslator ) . load ( 'jupyterlab' ) ;
144- app . serviceManager . contents . addDrive ( drive ) ;
145-
146- // Manually restore and load the default file browser.
147- const defaultBrowser = fileBrowserFactory . createFileBrowser ( 'filebrowser' , {
148- auto : false ,
149- restore : false ,
150- driveName : drive . name
151- } ) ;
152- defaultBrowser . node . setAttribute ( 'role' , 'region' ) ;
153- defaultBrowser . node . setAttribute (
154- 'aria-label' ,
155- trans . __ ( 'File Browser Section' )
156- ) ;
157-
158- void Private . restoreBrowser (
159- defaultBrowser ,
160- commands ,
161- router ,
162- tree ,
163- labShell
164- ) ;
165-
166- return defaultBrowser ;
167- }
168- } ;
169-
170- namespace Private {
171- /**
172- * Restores file browser state and overrides state if tree resolver resolves.
173- */
174- export async function restoreBrowser (
175- browser : FileBrowser ,
176- commands : CommandRegistry ,
177- router : IRouter | null ,
178- tree : JupyterFrontEnd . ITreeResolver | null ,
179- labShell : ILabShell | null
180- ) : Promise < void > {
181- const restoring = 'jp-mod-restoring' ;
182-
183- browser . addClass ( restoring ) ;
184-
185- if ( ! router ) {
186- await browser . model . restore ( browser . id ) ;
187- await browser . model . refresh ( ) ;
188- browser . removeClass ( restoring ) ;
189- return ;
190- }
191-
192- const listener = async ( ) => {
193- router . routed . disconnect ( listener ) ;
194-
195- const paths = await tree ?. paths ;
196-
197- if ( paths ?. file || paths ?. browser ) {
198- // Restore the model without populating it.
199- await browser . model . restore ( browser . id , false ) ;
200- if ( paths . file ) {
201- await commands . execute ( CommandIDs . openPath , {
202- path : paths . file ,
203- dontShowBrowser : true
204- } ) ;
205- }
206- if ( paths . browser ) {
207- await commands . execute ( CommandIDs . openPath , {
208- path : paths . browser ,
209- dontShowBrowser : true
210- } ) ;
211- }
212- } else {
213- await browser . model . restore ( browser . id ) ;
214- await browser . model . refresh ( ) ;
215- }
216- browser . removeClass ( restoring ) ;
217-
218- if ( labShell ?. isEmpty ( 'main' ) ) {
219- void commands . execute ( 'launcher:create' ) ;
220- }
221- } ;
222- router . routed . connect ( listener ) ;
223- }
224- }
0 commit comments