Skip to content

Commit f3d3f5a

Browse files
Display each drive filebrowser in a separate side panel.
1 parent 7063afd commit f3d3f5a

File tree

2 files changed

+53
-158
lines changed

2 files changed

+53
-158
lines changed

schema/widget.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
"name": "drive",
1313
"command": "drives:open-drives-dialog",
1414
"rank": 35
15-
},
16-
{ "name": "fileNameSearcher", "rank": 40 }
15+
}
1716
]
1817
},
1918
"title": "'@jupyter/drives",

src/index.ts

Lines changed: 52 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -5,31 +5,26 @@ import {
55
} from '@jupyterlab/application';
66

77
import { ITranslator } from '@jupyterlab/translation';
8-
import { addJupyterLabThemeChangeListener } from '@jupyter/web-components';
9-
import { Dialog, showDialog } from '@jupyterlab/apputils';
10-
import { DriveListModel, DriveListView } from './drivelistmanager';
118
import { DriveIcon } from './icons';
129
import { IDocumentManager } from '@jupyterlab/docmanager';
1310
import { Drive } from './contents';
14-
import { MultiDrivesFileBrowser } from './multidrivesbrowser';
15-
import { BreadCrumbs, FilterFileBrowserModel } from '@jupyterlab/filebrowser';
11+
import {
12+
FileBrowser,
13+
FilterFileBrowserModel,
14+
IFileBrowserFactory
15+
} from '@jupyterlab/filebrowser';
1616
import { ISettingRegistry } from '@jupyterlab/settingregistry';
1717
import {
1818
createToolbarFactory,
1919
IToolbarWidgetRegistry,
2020
setToolbar
2121
} from '@jupyterlab/apputils';
22-
import { DriveBrowser } from './drivebrowser';
22+
23+
import { SidePanel } from '@jupyterlab/ui-components';
2324

2425
const FILE_BROWSER_FACTORY = 'FileBrowser';
2526
const FILE_BROWSER_PLUGIN_ID = '@jupyter/drives:widget';
2627

27-
namespace CommandIDs {
28-
export const openDrivesDialog = 'drives:open-drives-dialog';
29-
export const openPath = 'filebrowser:open-path';
30-
}
31-
32-
3328
/**
3429
* Initialization data for the @jupyter/drives extension.
3530
*/
@@ -71,164 +66,65 @@ export async function activateAddDrivesPlugin(
7166
toolbarRegistry: IToolbarWidgetRegistry,
7267
translator: ITranslator,
7368
restorer: ILayoutRestorer | null,
74-
settingRegistry: ISettingRegistry
69+
settingRegistry: ISettingRegistry,
70+
factory: IFileBrowserFactory
7571
) {
7672
console.log('AddDrives plugin is activated!');
77-
const { commands } = app;
73+
//const { commands } = app;
7874
const cocoDrive = new Drive(app.docRegistry);
7975
cocoDrive.name = 'coconutDrive';
8076
cocoDrive.baseUrl = '/coconut/url';
8177
cocoDrive.region = '';
8278
cocoDrive.status = 'active';
8379
cocoDrive.provider = '';
84-
const peachDrive = new Drive(app.docRegistry);
85-
peachDrive.baseUrl = '/peach/url';
86-
peachDrive.name = 'peachDrive';
87-
const mangoDrive = new Drive(app.docRegistry);
88-
mangoDrive.baseUrl = '/mango/url';
89-
mangoDrive.name = 'mangoDrive';
90-
const kiwiDrive = new Drive(app.docRegistry);
91-
kiwiDrive.baseUrl = '/kiwi/url';
92-
kiwiDrive.name = 'kiwiDrive';
93-
const pearDrive = new Drive(app.docRegistry);
94-
pearDrive.baseUrl = '/pear/url';
95-
pearDrive.name = 'pearDrive';
96-
const customDrive = new Drive(app.docRegistry);
97-
customDrive.baseUrl = '/customDrive/url';
98-
const tomatoDrive = new Drive(app.docRegistry);
99-
tomatoDrive.baseUrl = '/tomato/url';
100-
tomatoDrive.name = 'tomatoDrive';
101-
const avocadoDrive = new Drive(app.docRegistry);
102-
avocadoDrive.baseUrl = '/avocado/url';
103-
avocadoDrive.name = 'avocadoDrive';
104-
105-
const selectedList1: Drive[] = [];
106-
const availableList1: Drive[] = [
107-
avocadoDrive,
108-
cocoDrive,
109-
customDrive,
110-
kiwiDrive,
111-
mangoDrive,
112-
peachDrive,
113-
pearDrive,
114-
tomatoDrive
115-
];
116-
117-
function createFilterFileBrowserModel(
118-
manager: IDocumentManager,
119-
drive?: Drive
120-
): FilterFileBrowserModel {
80+
manager.services.contents.addDrive(cocoDrive);
81+
const bananaDrive = new Drive(app.docRegistry);
82+
bananaDrive.name = 'bananaDrive';
83+
bananaDrive.baseUrl = '/banana/url';
84+
bananaDrive.region = '';
85+
bananaDrive.status = 'active';
86+
bananaDrive.provider = '';
87+
manager.services.contents.addDrive(bananaDrive);
88+
89+
const DriveList: Drive[] = [cocoDrive, bananaDrive];
90+
91+
function addNewDriveToPanel(drive: Drive) {
92+
const panel = new SidePanel();
12193
const driveModel = new FilterFileBrowserModel({
12294
manager: manager,
123-
driveName: drive?.name
95+
driveName: drive.name
12496
});
12597

126-
return driveModel;
127-
}
128-
function buildInitialBrowserModelList(selectedDrives: Drive[]) {
129-
const browserModelList: FilterFileBrowserModel[] = [];
130-
const localDriveModel = createFilterFileBrowserModel(manager);
131-
browserModelList.push(localDriveModel);
132-
return browserModelList;
133-
}
134-
const browserModelList = buildInitialBrowserModelList(selectedList1);
135-
const trans = translator.load('jupyter_drives');
136-
const panel = new MultiDrivesFileBrowser({
137-
modelList: browserModelList,
138-
id: '',
139-
manager
140-
});
141-
panel.title.icon = DriveIcon;
142-
panel.title.iconClass = 'jp-SideBar-tabIcon';
143-
panel.title.caption = 'Browse Drives';
144-
panel.id = 'panel-file-browser';
145-
if (restorer) {
146-
restorer.add(panel, 'drive-browser');
147-
}
148-
app.shell.add(panel, 'left', { rank: 102 });
149-
150-
setToolbar(
151-
panel,
152-
createToolbarFactory(
153-
toolbarRegistry,
154-
settingRegistry,
155-
FILE_BROWSER_FACTORY,
156-
FILE_BROWSER_PLUGIN_ID,
157-
translator
158-
)
159-
);
160-
function addToBrowserModelList(
161-
browserModelList: FilterFileBrowserModel[],
162-
addedDrive: Drive
163-
) {
164-
const addedDriveModel = createFilterFileBrowserModel(manager, addedDrive);
165-
browserModelList.push(addedDriveModel);
166-
return browserModelList;
167-
}
168-
function addDriveContentsToPanel(
169-
browserModelList: FilterFileBrowserModel[],
170-
addedDrive: Drive,
171-
panel: MultiDrivesFileBrowser
172-
) {
173-
const addedDriveModel = createFilterFileBrowserModel(manager, addedDrive);
174-
browserModelList = addToBrowserModelList(browserModelList, addedDrive);
175-
manager.services.contents.addDrive(addedDrive);
176-
const AddedDriveBrowser = new DriveBrowser({
177-
model: addedDriveModel,
178-
breadCrumbs: new BreadCrumbs({ model: addedDriveModel }),
179-
driveName: addedDrive.name
98+
const driveBrowser = new FileBrowser({
99+
id: drive.name + '-browser',
100+
model: driveModel
180101
});
181-
panel.addWidget(AddedDriveBrowser);
182-
}
183-
184-
/* Dialog to select the drive */
185-
addJupyterLabThemeChangeListener();
186-
const selectedDrivesModelMap = new Map<Drive[], DriveListModel>();
187-
let selectedDrives: Drive[] = selectedList1;
188-
const availableDrives: Drive[] = availableList1;
189-
let driveListModel = selectedDrivesModelMap.get(selectedDrives);
190102

191-
commands.addCommand(CommandIDs.openDrivesDialog, {
192-
execute: async args => {
193-
if (!driveListModel) {
194-
driveListModel = new DriveListModel(availableDrives, selectedDrives);
195-
selectedDrivesModelMap.set(selectedDrives, driveListModel);
196-
} else {
197-
selectedDrives = driveListModel.selectedDrives;
198-
selectedDrivesModelMap.set(selectedDrives, driveListModel);
199-
}
200-
async function onDriveAdded(selectedDrives: Drive[]) {
201-
if (driveListModel) {
202-
const response = driveListModel.sendConnectionRequest(selectedDrives);
203-
if ((await response) === true) {
204-
addDriveContentsToPanel(
205-
browserModelList,
206-
selectedDrives[selectedDrives.length - 1],
207-
panel
208-
);
209-
} else {
210-
console.warn('Connection with the drive was not possible');
211-
}
212-
}
213-
}
214-
215-
if (driveListModel) {
216-
showDialog({
217-
body: new DriveListView(driveListModel, app.docRegistry),
218-
buttons: [Dialog.cancelButton()]
219-
});
220-
}
221-
222-
driveListModel.stateChanged.connect(async () => {
223-
if (driveListModel) {
224-
onDriveAdded(driveListModel.selectedDrives);
225-
}
226-
});
227-
},
228-
229-
icon: DriveIcon.bindprops({ stylesheet: 'menuItem' }),
230-
caption: trans.__('Add drives to filebrowser.'),
231-
label: trans.__('Add Drives To Filebrowser')
103+
panel.addWidget(driveBrowser);
104+
panel.title.icon = DriveIcon;
105+
panel.title.iconClass = 'jp-SideBar-tabIcon';
106+
panel.title.caption = 'Browse Drives';
107+
108+
panel.id = drive.name + '-file-browser';
109+
110+
if (restorer) {
111+
restorer.add(panel, drive.name + '-browser');
112+
}
113+
app.shell.add(panel, 'left', { rank: 102 });
114+
115+
setToolbar(
116+
panel,
117+
createToolbarFactory(
118+
toolbarRegistry,
119+
settingRegistry,
120+
FILE_BROWSER_FACTORY,
121+
FILE_BROWSER_PLUGIN_ID,
122+
translator
123+
)
124+
);
125+
}
126+
DriveList.forEach(drive => {
127+
addNewDriveToPanel(drive);
232128
});
233129
}
234130

0 commit comments

Comments
 (0)