Skip to content

Commit 6b06071

Browse files
Use jupyterlab 4.4.0 content provider (#7)
1 parent 6962756 commit 6b06071

File tree

6 files changed

+1304
-585
lines changed

6 files changed

+1304
-585
lines changed

packages/my-shared-docprovider-extension/package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,14 @@
5353
"watch:labextension": "jupyter labextension watch ."
5454
},
5555
"dependencies": {
56-
"@jupyter/collaborative-drive": "^3.1.0",
56+
"@jupyter/collaborative-drive": "^4.0.0",
5757
"@jupyter/my-shared-docprovider": "^0.1.0",
58-
"@jupyterlab/filebrowser": "^4.2.0"
58+
"@jupyterlab/filebrowser": "^4.4.0",
59+
"@jupyterlab/fileeditor": "^4.4.0",
60+
"@jupyterlab/notebook": "^4.4.0"
5961
},
6062
"devDependencies": {
61-
"@jupyterlab/builder": "^4.0.5",
63+
"@jupyterlab/builder": "^4.4.0",
6264
"npm-run-all": "^4.1.5",
6365
"rimraf": "^4.1.2",
6466
"typescript": "~5.0.4"

packages/my-shared-docprovider-extension/src/filebrowser.ts

Lines changed: 62 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -3,55 +3,65 @@
33
* Distributed under the terms of the Modified BSD License.
44
*/
55

6-
import { CommandRegistry } from '@lumino/commands';
76
import {
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';
1820
import { ISettingRegistry } from '@jupyterlab/settingregistry';
1921
import { ITranslator, nullTranslator } from '@jupyterlab/translation';
2022

2123
import { 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-
}

packages/my-shared-docprovider-extension/src/index.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,15 @@
77

88
import { JupyterFrontEndPlugin } from '@jupyterlab/application';
99

10-
import { drive, yfile, ynotebook, mySharedFileBrowser } from './filebrowser';
10+
import { rtcContentProvider, yfile, ynotebook } from './filebrowser';
1111

1212
/**
1313
* Export the plugins as default.
1414
*/
1515
const plugins: JupyterFrontEndPlugin<any>[] = [
16-
drive,
16+
rtcContentProvider,
1717
yfile,
18-
ynotebook,
19-
mySharedFileBrowser
18+
ynotebook
2019
];
2120

2221
export default plugins;

packages/my-shared-docprovider/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,15 @@
4141
"watch": "tsc -b --watch"
4242
},
4343
"dependencies": {
44-
"@jupyter/collaborative-drive": "^3.0.0",
45-
"@jupyter/ydoc": "^2.0.0 || ^3.0.0-a3",
46-
"@jupyterlab/application": "^4.2.0",
47-
"@jupyterlab/services": "^7.0.5",
48-
"@jupyterlab/translation": "^4.2.0",
44+
"@jupyter/collaborative-drive": "^4.0.0",
45+
"@jupyter/ydoc": "^2.0.0 || ^3.0.0",
46+
"@jupyterlab/application": "^4.4.0",
47+
"@jupyterlab/services": "^7.4.0",
48+
"@jupyterlab/translation": "^4.4.0",
4949
"@lumino/signaling": "^2.1.0"
5050
},
5151
"devDependencies": {
52-
"@jupyterlab/testing": "^4.0.5",
52+
"@jupyterlab/testing": "^4.4.0",
5353
"@types/jest": "^29.2.0",
5454
"jest": "^29.5.0",
5555
"rimraf": "^4.1.2",

0 commit comments

Comments
 (0)