Skip to content

Commit 0cf877d

Browse files
Upload refactors (#110)
* WIP separate upload calls. * Split upload calls. * Upload cleanup, refactors/renaming. * Update src/FssTreeItem.ts * Update src/FssTreeItem.ts * Update src/FssTreeItem.ts --------- Co-authored-by: Rosio <[email protected]>
1 parent 88e0b28 commit 0cf877d

File tree

3 files changed

+171
-91
lines changed

3 files changed

+171
-91
lines changed

src/FssTreeItem.ts

+25
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export class FssTreeItem {
2323
clickSlots: any;
2424
getBytesSlots: any;
2525
uploadUserDataSlots: any;
26+
uploadFromBrowserPickerSlots: any;
27+
uploadFromJupyterBrowserSlots: any;
2628
isDir = false;
2729
treeItemObserver: MutationObserver;
2830
pendingExpandAction = false;
@@ -35,6 +37,10 @@ export class FssTreeItem {
3537
clickSlots: any,
3638
userGetBytesSlots: any,
3739
uploadUserDataSlots: any,
40+
41+
uploadFromBrowserPickerSlots: any,
42+
uploadFromJupyterBrowserSlots: any,
43+
3844
autoExpand: boolean,
3945
expandOnClickAnywhere: boolean,
4046
notebookTracker: INotebookTracker
@@ -53,6 +59,8 @@ export class FssTreeItem {
5359
this.clickSlots = clickSlots;
5460
this.getBytesSlots = userGetBytesSlots; // TODO fix its horrible
5561
this.uploadUserDataSlots = uploadUserDataSlots;
62+
this.uploadFromBrowserPickerSlots = uploadFromBrowserPickerSlots;
63+
this.uploadFromJupyterBrowserSlots = uploadFromJupyterBrowserSlots;
5664
this.lazyLoadAutoExpand = autoExpand;
5765
this.clickAnywhereDoesAutoExpand = expandOnClickAnywhere;
5866
this.notebookTracker = notebookTracker;
@@ -117,6 +125,23 @@ export class FssTreeItem {
117125
}
118126
}
119127

128+
async handleUploadFromBrowserPicker(options: any) {
129+
this.model.queuedPickerUploadInfo = {}; // Context click always resets this data
130+
Logger.debug('Treeitem upload user data');
131+
for (const slot of this.uploadFromBrowserPickerSlots) {
132+
Logger.debug(slot);
133+
await slot(this.root.dataset.fss, this.isDir);
134+
}
135+
}
136+
137+
async handleUploadFromJupyterBrowser(options: any) {
138+
Logger.debug('Treeitem upload user data');
139+
for (const slot of this.uploadFromJupyterBrowserSlots) {
140+
Logger.debug(slot);
141+
await slot(this.root.dataset.fss, this.isDir);
142+
}
143+
}
144+
120145
async handleUploadUserData(options: any) {
121146
let is_browser_file_picker = false;
122147
let is_jup_browser_file = false;

src/FssTreeItemContext.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -145,20 +145,23 @@ export class FssTreeItemContext {
145145
this.parentControl.handleRequestBytes();
146146
}
147147
} else if (event.target.dataset.fssContextType === 'uploadUserData') {
148+
Logger.debug('XX1');
148149
if (this.parentControl) {
149150
this.parentControl.handleUploadUserData();
150151
}
151152
} else if (event.target.dataset.fssContextType === 'uploadBrowserFile') {
153+
Logger.debug('XX2');
152154
if (this.parentControl) {
153-
this.parentControl.handleUploadUserData({
155+
this.parentControl.handleUploadFromBrowserPicker({
154156
is_browser_file_picker: true
155157
});
156158
}
157159
} else if (
158160
event.target.dataset.fssContextType === 'uploadJupyterBrowserFile'
159161
) {
162+
Logger.debug('XX3');
160163
if (this.parentControl) {
161-
this.parentControl.handleUploadUserData({
164+
this.parentControl.handleUploadFromJupyterBrowser({
162165
is_jup_browser_file: true
163166
});
164167
}

src/index.ts

+141-89
Original file line numberDiff line numberDiff line change
@@ -416,23 +416,26 @@ class FsspecWidget extends Widget {
416416
// this.openInputHidden.click();
417417
// }
418418

419-
async handleJupyterFileBrowserUpload(userFile: any, fileBrowser: any) {
420-
Logger.debug(
421-
`FBrowser choose: B ${fileBrowser}} / D "${fileBrowser.model.driveName}" / R "${fileBrowser.model.rootPath}"`
422-
);
423-
Logger.debug(` pth ${userFile.value.path}`);
424-
Logger.debug(` srvpth ${userFile.value.serverPath}`);
425-
Logger.debug(` sz ${userFile.value.size}`);
426-
Logger.debug(` type ${userFile.value.type}`);
427-
Logger.debug(` mtype ${userFile.value.mimetype}`);
428-
Logger.debug(` fmt ${userFile.value.format}`);
429-
Logger.debug(` wrt ${userFile.value.writable}`);
419+
async handleJupyterFileBrowserSetBytesTarget(
420+
userFile: any,
421+
fileBrowser: any
422+
) {
423+
// Logger.debug(
424+
// `FBrowser choose: B ${fileBrowser}} / D "${fileBrowser.model.driveName}" / R "${fileBrowser.model.rootPath}"`
425+
// );
426+
// Logger.debug(` pth ${userFile.value.path}`);
427+
// Logger.debug(` srvpth ${userFile.value.serverPath}`);
428+
// Logger.debug(` sz ${userFile.value.size}`);
429+
// Logger.debug(` type ${userFile.value.type}`);
430+
// Logger.debug(` mtype ${userFile.value.mimetype}`);
431+
// Logger.debug(` fmt ${userFile.value.format}`);
432+
// Logger.debug(` wrt ${userFile.value.writable}`);
430433

431434
const fileData = await this.app.serviceManager.contents.get(
432435
userFile.value.path,
433436
{ content: true, format: 'base64', type: 'base64' }
434437
);
435-
Logger.debug(`xFILE CONTs:\n${JSON.stringify(fileData)}`);
438+
// Logger.debug(`xFILE CONTs:\n${JSON.stringify(fileData)}`);
436439
this.queuedJupyterFileBrowserUploadInfo = { fileData: fileData };
437440
}
438441

@@ -447,7 +450,7 @@ class FsspecWidget extends Widget {
447450
fileData = this.openInputHidden.files[0];
448451
this.queuedPickerUploadInfo['fileData'] = fileData;
449452
Logger.debug(`FData ${fileData}`);
450-
this.handleContextUploadUserData(
453+
this.handleBrowserPickerUpload(
451454
this.queuedPickerUploadInfo.user_path,
452455
this.queuedPickerUploadInfo.is_dir,
453456
this.queuedPickerUploadInfo.is_browser_file_picker,
@@ -463,12 +466,128 @@ class FsspecWidget extends Widget {
463466
}
464467
}
465468

466-
async handleContextUploadUserData(
469+
async handleJupyterFileBrowserUpload(user_path: string, is_dir: boolean) {
470+
Logger.debug('BB a1');
471+
472+
// Get the desired path for this upload from a dialog box
473+
Logger.debug(`Upath ${user_path}`);
474+
if (is_dir) {
475+
// TODO make dialog box and grab filename when uploading to folder
476+
const result: any = await this.promptForFilename();
477+
Logger.debug(`Resultvalue ${result?.value}`);
478+
if (result?.value) {
479+
user_path += '/' + result.value;
480+
} else {
481+
Logger.error('Error, no filename provided!');
482+
return;
483+
}
484+
Logger.debug(`Popup path ${result?.value}`);
485+
}
486+
Logger.debug(`Upath2 ${user_path}`);
487+
488+
if (this.queuedJupyterFileBrowserUploadInfo) {
489+
// We have file information from the Lab file browser
490+
Logger.debug('Jup file browser result get!');
491+
Logger.debug(
492+
`Dump jbrowser info ${JSON.stringify(this.queuedJupyterFileBrowserUploadInfo)}`
493+
);
494+
const base64String =
495+
this.queuedJupyterFileBrowserUploadInfo.fileData.content;
496+
Logger.debug(`B64 content str:\n${base64String}`);
497+
498+
// TODO error handling and data checks
499+
await this.model.post(
500+
this.model.activeFilesystem,
501+
user_path,
502+
base64String,
503+
true
504+
);
505+
Logger.debug('Finish upload');
506+
507+
this.fetchAndDisplayFileInfo(this.model.activeFilesystem);
508+
509+
return;
510+
} else {
511+
Logger.error('Error, no Jupyter file browser data available!');
512+
return;
513+
}
514+
}
515+
516+
async handleBrowserPickerUpload(
467517
user_path: string,
468518
is_dir: boolean,
469519
is_browser_file_picker: boolean,
470520
is_jup_browser_file: boolean
471521
) {
522+
Logger.debug('BB a2');
523+
524+
// Get the desired path for this upload from a dialog box
525+
Logger.debug(`Upath ${user_path}`);
526+
if (is_dir) {
527+
// TODO make dialog box and grab filename when uploading to folder
528+
const result: any = await this.promptForFilename();
529+
Logger.debug(`Resultvalue ${result?.value}`);
530+
if (result?.value) {
531+
user_path += '/' + result.value;
532+
} else {
533+
Logger.error('Error, no filename provided!');
534+
return;
535+
}
536+
Logger.debug(`Popup path ${result?.value}`);
537+
}
538+
Logger.debug(`Upath2 ${user_path}`);
539+
540+
// Get the path of the file to upload
541+
if (!this.queuedPickerUploadInfo) {
542+
// First we have to obtain info from the browser file picker (async user selection)
543+
this.queuedPickerUploadInfo = {
544+
user_path: user_path,
545+
is_dir: is_dir,
546+
is_browser_file_picker: is_browser_file_picker,
547+
fileData: null
548+
};
549+
this.openInputHidden.click();
550+
Logger.debug('WAIT FOR FILE PICKER');
551+
return;
552+
} else if (this.queuedPickerUploadInfo) {
553+
// We have obtained file info from the user's selection (our call above)
554+
Logger.debug('File Result get!');
555+
Logger.debug(
556+
`Dump picker info ${JSON.stringify(this.queuedPickerUploadInfo)}`
557+
);
558+
// Logger.debug(`File ${this.queuedPickerUploadInfo.fileData.name}`);
559+
// Logger.debug(
560+
// `File ${this.queuedPickerUploadInfo.fileData.webkitRelativePath}`
561+
// );
562+
563+
const binRaw = await this.queuedPickerUploadInfo.fileData.arrayBuffer();
564+
const binData: any = new Uint8Array(binRaw);
565+
const base64String = Buffer.from(binData).toString('base64');
566+
567+
await this.model.post(
568+
this.model.activeFilesystem,
569+
user_path,
570+
base64String,
571+
true
572+
);
573+
Logger.debug('Finish upload');
574+
575+
this.fetchAndDisplayFileInfo(this.model.activeFilesystem);
576+
577+
return;
578+
} else {
579+
Logger.error('Error, no browser file data available!');
580+
return;
581+
}
582+
}
583+
584+
async handleKernelHelperUpload(
585+
user_path: string,
586+
is_dir: boolean,
587+
is_browser_file_picker: boolean,
588+
is_jup_browser_file: boolean
589+
) {
590+
Logger.debug('BB a3');
472591
const target = this.notebookTracker.currentWidget;
473592

474593
if (!is_browser_file_picker && !is_jup_browser_file) {
@@ -503,79 +622,10 @@ class FsspecWidget extends Widget {
503622

504623
// Get the path of the file to upload
505624
let tempfilePath: any = '';
506-
if (is_browser_file_picker || is_jup_browser_file) {
507-
if (is_browser_file_picker && !this.queuedPickerUploadInfo) {
508-
// First we have to obtain info from the browser file picker (async user selection)
509-
this.queuedPickerUploadInfo = {
510-
user_path: user_path,
511-
is_dir: is_dir,
512-
is_browser_file_picker: is_browser_file_picker,
513-
fileData: null
514-
};
515-
this.openInputHidden.click();
516-
Logger.debug('WAIT FOR FILE PICKER');
517-
return;
518-
} else if (is_browser_file_picker && this.queuedPickerUploadInfo) {
519-
// We have obtained file info from the user's selection (our call above)
520-
Logger.debug('File Result get!');
521-
Logger.debug(
522-
`Dump picker info ${JSON.stringify(this.queuedPickerUploadInfo)}`
523-
);
524-
// Logger.debug(`File ${this.queuedPickerUploadInfo.fileData.name}`);
525-
// Logger.debug(
526-
// `File ${this.queuedPickerUploadInfo.fileData.webkitRelativePath}`
527-
// );
528-
529-
const binRaw = await this.queuedPickerUploadInfo.fileData.arrayBuffer();
530-
const binData: any = new Uint8Array(binRaw);
531-
const base64String = Buffer.from(binData).toString('base64');
532-
533-
await this.model.post(
534-
this.model.activeFilesystem,
535-
user_path,
536-
base64String,
537-
true
538-
);
539-
Logger.debug('Finish upload');
540-
541-
this.fetchAndDisplayFileInfo(this.model.activeFilesystem);
542-
543-
return;
544-
} else if (
545-
is_jup_browser_file &&
546-
this.queuedJupyterFileBrowserUploadInfo
547-
) {
548-
// We have file information from the Lab file browser
549-
Logger.debug('Jup file browser result get!');
550-
Logger.debug(
551-
`Dump jbrowser info ${JSON.stringify(this.queuedJupyterFileBrowserUploadInfo)}`
552-
);
553-
const base64String =
554-
this.queuedJupyterFileBrowserUploadInfo.fileData.content;
555-
Logger.debug(`B64 content str:\n${base64String}`);
556-
557-
// TODO error handling and data checks
558-
await this.model.post(
559-
this.model.activeFilesystem,
560-
user_path,
561-
base64String,
562-
true
563-
);
564-
Logger.debug('Finish upload');
565-
566-
this.fetchAndDisplayFileInfo(this.model.activeFilesystem);
567-
568-
return;
569-
} else {
570-
return;
571-
}
572-
} else {
573-
// We are obtaining bytes from the user's kernel, get a
574-
// serialized tempfile path from the server
575-
tempfilePath = await this.getKernelUserBytesTempfilePath();
576-
Logger.debug(`Debugx2: ${tempfilePath}`);
577-
}
578-
625+
// We are obtaining bytes from the user's kernel, get a
626+
// serialized tempfile path from the server
627+
tempfilePath = await this.getKernelUserBytesTempfilePath();
628+
Logger.debug(`Debugx2: ${tempfilePath}`);
579629
if (!tempfilePath) {
580630
Logger.error('Error fetching serialized user_data!');
581631
return;
@@ -826,7 +876,9 @@ class FsspecWidget extends Widget {
826876
this.model,
827877
[this.lazyLoad.bind(this)],
828878
[this.handleContextGetBytes.bind(this)],
829-
[this.handleContextUploadUserData.bind(this)],
879+
[this.handleKernelHelperUpload.bind(this)],
880+
[this.handleBrowserPickerUpload.bind(this)],
881+
[this.handleJupyterFileBrowserUpload.bind(this)],
830882
true,
831883
true,
832884
this.notebookTracker
@@ -1017,7 +1069,7 @@ const plugin: JupyterFrontEndPlugin<void> = {
10171069
const file = fileModel.value;
10181070

10191071
if (file) {
1020-
await fsspec_widget.handleJupyterFileBrowserUpload(
1072+
await fsspec_widget.handleJupyterFileBrowserSetBytesTarget(
10211073
fileModel,
10221074
fileBrowserFactory.tracker?.currentWidget
10231075
);

0 commit comments

Comments
 (0)