@jupyterlab/filebrowser 4.3.0-alpha.1 → 4.3.0-alpha.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.
- package/lib/browser.d.ts +12 -4
- package/lib/browser.js +61 -3
- package/lib/browser.js.map +1 -1
- package/package.json +11 -11
- package/src/browser.ts +78 -4
- package/style/base.css +22 -3
package/lib/browser.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Contents } from '@jupyterlab/services';
|
|
2
2
|
import { ITranslator } from '@jupyterlab/translation';
|
|
3
|
-
import { SidePanel } from '@jupyterlab/ui-components';
|
|
3
|
+
import { SidePanel, Toolbar } from '@jupyterlab/ui-components';
|
|
4
4
|
import { Panel } from '@lumino/widgets';
|
|
5
5
|
import { BreadCrumbs } from './crumbs';
|
|
6
6
|
import { DirListing } from './listing';
|
|
@@ -53,6 +53,11 @@ export declare class FileBrowser extends SidePanel {
|
|
|
53
53
|
*/
|
|
54
54
|
get showFileCheckboxes(): boolean;
|
|
55
55
|
set showFileCheckboxes(value: boolean);
|
|
56
|
+
/**
|
|
57
|
+
* Whether to show a text box to filter files by name.
|
|
58
|
+
*/
|
|
59
|
+
get showFileFilter(): boolean;
|
|
60
|
+
set showFileFilter(value: boolean);
|
|
56
61
|
/**
|
|
57
62
|
* Whether to sort notebooks above other files
|
|
58
63
|
*/
|
|
@@ -167,17 +172,20 @@ export declare class FileBrowser extends SidePanel {
|
|
|
167
172
|
* @returns the full drive path
|
|
168
173
|
*/
|
|
169
174
|
private _toDrivePath;
|
|
175
|
+
protected filterToolbar: Toolbar;
|
|
170
176
|
protected listing: DirListing;
|
|
171
177
|
protected crumbs: BreadCrumbs;
|
|
172
178
|
protected mainPanel: Panel;
|
|
173
|
-
private _manager;
|
|
174
179
|
private _directoryPending;
|
|
175
180
|
private _filePending;
|
|
181
|
+
private _fileFilterRef;
|
|
182
|
+
private _manager;
|
|
176
183
|
private _navigateToCurrentDirectory;
|
|
177
|
-
private
|
|
184
|
+
private _showFileCheckboxes;
|
|
185
|
+
private _showFileFilter;
|
|
178
186
|
private _showFileSizeColumn;
|
|
179
187
|
private _showHiddenFiles;
|
|
180
|
-
private
|
|
188
|
+
private _showLastModifiedColumn;
|
|
181
189
|
private _sortNotebooksFirst;
|
|
182
190
|
}
|
|
183
191
|
/**
|
package/lib/browser.js
CHANGED
|
@@ -4,8 +4,9 @@ import { showErrorMessage } from '@jupyterlab/apputils';
|
|
|
4
4
|
import { PathExt } from '@jupyterlab/coreutils';
|
|
5
5
|
import { ServerConnection } from '@jupyterlab/services';
|
|
6
6
|
import { nullTranslator } from '@jupyterlab/translation';
|
|
7
|
-
import { SidePanel } from '@jupyterlab/ui-components';
|
|
7
|
+
import { FilenameSearcher, SidePanel, Toolbar } from '@jupyterlab/ui-components';
|
|
8
8
|
import { Panel } from '@lumino/widgets';
|
|
9
|
+
import { createRef } from 'react';
|
|
9
10
|
import { BreadCrumbs } from './crumbs';
|
|
10
11
|
import { DirListing } from './listing';
|
|
11
12
|
/**
|
|
@@ -24,10 +25,18 @@ const CRUMBS_CLASS = 'jp-FileBrowser-crumbs';
|
|
|
24
25
|
* The class name added to the filebrowser toolbar node.
|
|
25
26
|
*/
|
|
26
27
|
const TOOLBAR_CLASS = 'jp-FileBrowser-toolbar';
|
|
28
|
+
/**
|
|
29
|
+
* The class name added to the filebrowser filter toolbar node.
|
|
30
|
+
*/
|
|
31
|
+
const FILTER_TOOLBAR_CLASS = 'jp-FileBrowser-filterToolbar';
|
|
27
32
|
/**
|
|
28
33
|
* The class name added to the filebrowser listing node.
|
|
29
34
|
*/
|
|
30
35
|
const LISTING_CLASS = 'jp-FileBrowser-listing';
|
|
36
|
+
/**
|
|
37
|
+
* The class name added to the filebrowser filterbox node.
|
|
38
|
+
*/
|
|
39
|
+
const FILTERBOX_CLASS = 'jp-FileBrowser-filterBox';
|
|
31
40
|
/**
|
|
32
41
|
* A widget which hosts a file browser.
|
|
33
42
|
*
|
|
@@ -46,10 +55,12 @@ export class FileBrowser extends SidePanel {
|
|
|
46
55
|
super({ content: new Panel(), translator: options.translator });
|
|
47
56
|
this._directoryPending = null;
|
|
48
57
|
this._filePending = null;
|
|
49
|
-
this.
|
|
58
|
+
this._fileFilterRef = createRef();
|
|
59
|
+
this._showFileCheckboxes = false;
|
|
60
|
+
this._showFileFilter = false;
|
|
50
61
|
this._showFileSizeColumn = false;
|
|
51
62
|
this._showHiddenFiles = false;
|
|
52
|
-
this.
|
|
63
|
+
this._showLastModifiedColumn = true;
|
|
53
64
|
this._sortNotebooksFirst = false;
|
|
54
65
|
this.addClass(FILE_BROWSER_CLASS);
|
|
55
66
|
this.toolbar.addClass(TOOLBAR_CLASS);
|
|
@@ -66,6 +77,24 @@ export class FileBrowser extends SidePanel {
|
|
|
66
77
|
this.mainPanel.title.label = this._trans.__('File Browser');
|
|
67
78
|
this.crumbs = new BreadCrumbs({ model, translator });
|
|
68
79
|
this.crumbs.addClass(CRUMBS_CLASS);
|
|
80
|
+
// The filter toolbar appears immediately below the breadcrumbs and above the directory listing.
|
|
81
|
+
const searcher = FilenameSearcher({
|
|
82
|
+
updateFilter: (filterFn, query) => {
|
|
83
|
+
this.model.setFilter(value => {
|
|
84
|
+
return filterFn(value.name.toLowerCase());
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
useFuzzyFilter: true,
|
|
88
|
+
placeholder: this._trans.__('Filter files by name'),
|
|
89
|
+
forceRefresh: false,
|
|
90
|
+
showIcon: false,
|
|
91
|
+
inputRef: this._fileFilterRef
|
|
92
|
+
});
|
|
93
|
+
searcher.addClass(FILTERBOX_CLASS);
|
|
94
|
+
this.filterToolbar = new Toolbar();
|
|
95
|
+
this.filterToolbar.addClass(FILTER_TOOLBAR_CLASS);
|
|
96
|
+
this.filterToolbar.addItem('fileNameSearcher', searcher);
|
|
97
|
+
this.filterToolbar.setHidden(!this.showFileFilter);
|
|
69
98
|
this.listing = this.createDirListing({
|
|
70
99
|
model,
|
|
71
100
|
renderer,
|
|
@@ -73,6 +102,7 @@ export class FileBrowser extends SidePanel {
|
|
|
73
102
|
});
|
|
74
103
|
this.listing.addClass(LISTING_CLASS);
|
|
75
104
|
this.mainPanel.addWidget(this.crumbs);
|
|
105
|
+
this.mainPanel.addWidget(this.filterToolbar);
|
|
76
106
|
this.mainPanel.addWidget(this.listing);
|
|
77
107
|
this.addWidget(this.mainPanel);
|
|
78
108
|
if (options.restore !== false) {
|
|
@@ -152,6 +182,34 @@ export class FileBrowser extends SidePanel {
|
|
|
152
182
|
console.warn('Listing does not support toggling column visibility');
|
|
153
183
|
}
|
|
154
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Whether to show a text box to filter files by name.
|
|
187
|
+
*/
|
|
188
|
+
get showFileFilter() {
|
|
189
|
+
return this._showFileFilter;
|
|
190
|
+
}
|
|
191
|
+
set showFileFilter(value) {
|
|
192
|
+
var _a;
|
|
193
|
+
// If the old value was true and the new value is false, clear the filter
|
|
194
|
+
const oldValue = this.showFileFilter;
|
|
195
|
+
if (oldValue && !value) {
|
|
196
|
+
// Clear the search box input
|
|
197
|
+
if (this._fileFilterRef.current) {
|
|
198
|
+
this._fileFilterRef.current.value = '';
|
|
199
|
+
}
|
|
200
|
+
// Set a filter that doesn't exclude anything.
|
|
201
|
+
this.model.setFilter(value => {
|
|
202
|
+
return {};
|
|
203
|
+
});
|
|
204
|
+
this.model.refresh().catch(console.warn);
|
|
205
|
+
}
|
|
206
|
+
this._showFileFilter = value;
|
|
207
|
+
// Update widget visibility
|
|
208
|
+
this.filterToolbar.setHidden(!this.showFileFilter);
|
|
209
|
+
if (this.showFileFilter) {
|
|
210
|
+
(_a = this._fileFilterRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
155
213
|
/**
|
|
156
214
|
* Whether to sort notebooks above other files
|
|
157
215
|
*/
|
package/lib/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,2DAA2D;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAY,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAe,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jupyterlab/filebrowser",
|
|
3
|
-
"version": "4.3.0-alpha.
|
|
3
|
+
"version": "4.3.0-alpha.2",
|
|
4
4
|
"description": "JupyterLab - FileBrowser Widget",
|
|
5
5
|
"homepage": "https://github.com/jupyterlab/jupyterlab",
|
|
6
6
|
"bugs": {
|
|
@@ -41,15 +41,15 @@
|
|
|
41
41
|
"watch": "tsc -b --watch"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@jupyterlab/apputils": "^4.4.0-alpha.
|
|
45
|
-
"@jupyterlab/coreutils": "^6.3.0-alpha.
|
|
46
|
-
"@jupyterlab/docmanager": "^4.3.0-alpha.
|
|
47
|
-
"@jupyterlab/docregistry": "^4.3.0-alpha.
|
|
48
|
-
"@jupyterlab/services": "^7.3.0-alpha.
|
|
49
|
-
"@jupyterlab/statedb": "^4.3.0-alpha.
|
|
50
|
-
"@jupyterlab/statusbar": "^4.3.0-alpha.
|
|
51
|
-
"@jupyterlab/translation": "^4.3.0-alpha.
|
|
52
|
-
"@jupyterlab/ui-components": "^4.3.0-alpha.
|
|
44
|
+
"@jupyterlab/apputils": "^4.4.0-alpha.2",
|
|
45
|
+
"@jupyterlab/coreutils": "^6.3.0-alpha.2",
|
|
46
|
+
"@jupyterlab/docmanager": "^4.3.0-alpha.2",
|
|
47
|
+
"@jupyterlab/docregistry": "^4.3.0-alpha.2",
|
|
48
|
+
"@jupyterlab/services": "^7.3.0-alpha.2",
|
|
49
|
+
"@jupyterlab/statedb": "^4.3.0-alpha.2",
|
|
50
|
+
"@jupyterlab/statusbar": "^4.3.0-alpha.2",
|
|
51
|
+
"@jupyterlab/translation": "^4.3.0-alpha.2",
|
|
52
|
+
"@jupyterlab/ui-components": "^4.3.0-alpha.2",
|
|
53
53
|
"@lumino/algorithm": "^2.0.1",
|
|
54
54
|
"@lumino/coreutils": "^2.1.2",
|
|
55
55
|
"@lumino/disposable": "^2.1.2",
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"react": "^18.2.0"
|
|
64
64
|
},
|
|
65
65
|
"devDependencies": {
|
|
66
|
-
"@jupyterlab/testing": "^4.3.0-alpha.
|
|
66
|
+
"@jupyterlab/testing": "^4.3.0-alpha.2",
|
|
67
67
|
"@types/jest": "^29.2.0",
|
|
68
68
|
"jest": "^29.2.0",
|
|
69
69
|
"rimraf": "~5.0.5",
|
package/src/browser.ts
CHANGED
|
@@ -6,8 +6,14 @@ import { PathExt } from '@jupyterlab/coreutils';
|
|
|
6
6
|
import { IDocumentManager } from '@jupyterlab/docmanager';
|
|
7
7
|
import { Contents, ServerConnection } from '@jupyterlab/services';
|
|
8
8
|
import { ITranslator, nullTranslator } from '@jupyterlab/translation';
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
FilenameSearcher,
|
|
11
|
+
IScore,
|
|
12
|
+
SidePanel,
|
|
13
|
+
Toolbar
|
|
14
|
+
} from '@jupyterlab/ui-components';
|
|
10
15
|
import { Panel } from '@lumino/widgets';
|
|
16
|
+
import { createRef } from 'react';
|
|
11
17
|
import { BreadCrumbs } from './crumbs';
|
|
12
18
|
import { DirListing } from './listing';
|
|
13
19
|
import { FilterFileBrowserModel } from './model';
|
|
@@ -32,11 +38,21 @@ const CRUMBS_CLASS = 'jp-FileBrowser-crumbs';
|
|
|
32
38
|
*/
|
|
33
39
|
const TOOLBAR_CLASS = 'jp-FileBrowser-toolbar';
|
|
34
40
|
|
|
41
|
+
/**
|
|
42
|
+
* The class name added to the filebrowser filter toolbar node.
|
|
43
|
+
*/
|
|
44
|
+
const FILTER_TOOLBAR_CLASS = 'jp-FileBrowser-filterToolbar';
|
|
45
|
+
|
|
35
46
|
/**
|
|
36
47
|
* The class name added to the filebrowser listing node.
|
|
37
48
|
*/
|
|
38
49
|
const LISTING_CLASS = 'jp-FileBrowser-listing';
|
|
39
50
|
|
|
51
|
+
/**
|
|
52
|
+
* The class name added to the filebrowser filterbox node.
|
|
53
|
+
*/
|
|
54
|
+
const FILTERBOX_CLASS = 'jp-FileBrowser-filterBox';
|
|
55
|
+
|
|
40
56
|
/**
|
|
41
57
|
* A widget which hosts a file browser.
|
|
42
58
|
*
|
|
@@ -76,6 +92,29 @@ export class FileBrowser extends SidePanel {
|
|
|
76
92
|
this.crumbs = new BreadCrumbs({ model, translator });
|
|
77
93
|
this.crumbs.addClass(CRUMBS_CLASS);
|
|
78
94
|
|
|
95
|
+
// The filter toolbar appears immediately below the breadcrumbs and above the directory listing.
|
|
96
|
+
const searcher = FilenameSearcher({
|
|
97
|
+
updateFilter: (
|
|
98
|
+
filterFn: (item: string) => Partial<IScore> | null,
|
|
99
|
+
query?: string
|
|
100
|
+
) => {
|
|
101
|
+
this.model.setFilter(value => {
|
|
102
|
+
return filterFn(value.name.toLowerCase());
|
|
103
|
+
});
|
|
104
|
+
},
|
|
105
|
+
useFuzzyFilter: true,
|
|
106
|
+
placeholder: this._trans.__('Filter files by name'),
|
|
107
|
+
forceRefresh: false,
|
|
108
|
+
showIcon: false,
|
|
109
|
+
inputRef: this._fileFilterRef
|
|
110
|
+
});
|
|
111
|
+
searcher.addClass(FILTERBOX_CLASS);
|
|
112
|
+
|
|
113
|
+
this.filterToolbar = new Toolbar();
|
|
114
|
+
this.filterToolbar.addClass(FILTER_TOOLBAR_CLASS);
|
|
115
|
+
this.filterToolbar.addItem('fileNameSearcher', searcher);
|
|
116
|
+
this.filterToolbar.setHidden(!this.showFileFilter);
|
|
117
|
+
|
|
79
118
|
this.listing = this.createDirListing({
|
|
80
119
|
model,
|
|
81
120
|
renderer,
|
|
@@ -84,6 +123,7 @@ export class FileBrowser extends SidePanel {
|
|
|
84
123
|
this.listing.addClass(LISTING_CLASS);
|
|
85
124
|
|
|
86
125
|
this.mainPanel.addWidget(this.crumbs);
|
|
126
|
+
this.mainPanel.addWidget(this.filterToolbar);
|
|
87
127
|
this.mainPanel.addWidget(this.listing);
|
|
88
128
|
|
|
89
129
|
this.addWidget(this.mainPanel);
|
|
@@ -180,6 +220,37 @@ export class FileBrowser extends SidePanel {
|
|
|
180
220
|
}
|
|
181
221
|
}
|
|
182
222
|
|
|
223
|
+
/**
|
|
224
|
+
* Whether to show a text box to filter files by name.
|
|
225
|
+
*/
|
|
226
|
+
get showFileFilter(): boolean {
|
|
227
|
+
return this._showFileFilter;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
set showFileFilter(value: boolean) {
|
|
231
|
+
// If the old value was true and the new value is false, clear the filter
|
|
232
|
+
const oldValue = this.showFileFilter;
|
|
233
|
+
if (oldValue && !value) {
|
|
234
|
+
// Clear the search box input
|
|
235
|
+
if (this._fileFilterRef.current) {
|
|
236
|
+
this._fileFilterRef.current.value = '';
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Set a filter that doesn't exclude anything.
|
|
240
|
+
this.model.setFilter(value => {
|
|
241
|
+
return {};
|
|
242
|
+
});
|
|
243
|
+
this.model.refresh().catch(console.warn);
|
|
244
|
+
}
|
|
245
|
+
this._showFileFilter = value;
|
|
246
|
+
|
|
247
|
+
// Update widget visibility
|
|
248
|
+
this.filterToolbar.setHidden(!this.showFileFilter);
|
|
249
|
+
if (this.showFileFilter) {
|
|
250
|
+
this._fileFilterRef.current?.focus();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
183
254
|
/**
|
|
184
255
|
* Whether to sort notebooks above other files
|
|
185
256
|
*/
|
|
@@ -426,18 +497,21 @@ export class FileBrowser extends SidePanel {
|
|
|
426
497
|
}
|
|
427
498
|
}
|
|
428
499
|
|
|
500
|
+
protected filterToolbar: Toolbar;
|
|
429
501
|
protected listing: DirListing;
|
|
430
502
|
protected crumbs: BreadCrumbs;
|
|
431
503
|
protected mainPanel: Panel;
|
|
432
504
|
|
|
433
|
-
private _manager: IDocumentManager;
|
|
434
505
|
private _directoryPending: Promise<Contents.IModel> | null = null;
|
|
435
506
|
private _filePending: Promise<Contents.IModel> | null = null;
|
|
507
|
+
private _fileFilterRef = createRef<HTMLInputElement>();
|
|
508
|
+
private _manager: IDocumentManager;
|
|
436
509
|
private _navigateToCurrentDirectory: boolean;
|
|
437
|
-
private
|
|
510
|
+
private _showFileCheckboxes: boolean = false;
|
|
511
|
+
private _showFileFilter: boolean = false;
|
|
438
512
|
private _showFileSizeColumn: boolean = false;
|
|
439
513
|
private _showHiddenFiles: boolean = false;
|
|
440
|
-
private
|
|
514
|
+
private _showLastModifiedColumn: boolean = true;
|
|
441
515
|
private _sortNotebooksFirst: boolean = false;
|
|
442
516
|
}
|
|
443
517
|
|
package/style/base.css
CHANGED
|
@@ -29,6 +29,20 @@
|
|
|
29
29
|
row-gap: 12px;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
.jp-FileBrowser-filterToolbar {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex: 0 0 auto;
|
|
35
|
+
flex-direction: column;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.jp-FileBrowser-filterToolbar.jp-Toolbar {
|
|
39
|
+
border-bottom: none;
|
|
40
|
+
height: auto;
|
|
41
|
+
margin: 0 12px 6px;
|
|
42
|
+
box-shadow: none;
|
|
43
|
+
padding: 0;
|
|
44
|
+
}
|
|
45
|
+
|
|
32
46
|
.jp-FileBrowser-Panel {
|
|
33
47
|
flex: 1 1 auto;
|
|
34
48
|
display: flex;
|
|
@@ -64,7 +78,8 @@
|
|
|
64
78
|
| Buttons
|
|
65
79
|
|----------------------------------------------------------------------------*/
|
|
66
80
|
|
|
67
|
-
.jp-FileBrowser-toolbar > .jp-Toolbar-item
|
|
81
|
+
.jp-FileBrowser-toolbar > .jp-Toolbar-item,
|
|
82
|
+
.jp-FileBrowser-filterToolbar > .jp-Toolbar-item {
|
|
68
83
|
flex: 0 0 auto;
|
|
69
84
|
padding-left: 0;
|
|
70
85
|
align-items: center;
|
|
@@ -72,7 +87,7 @@
|
|
|
72
87
|
}
|
|
73
88
|
|
|
74
89
|
.jp-FileBrowser-toolbar > .jp-Toolbar-item .jp-ToolbarButtonComponent {
|
|
75
|
-
width:
|
|
90
|
+
width: 28px;
|
|
76
91
|
}
|
|
77
92
|
|
|
78
93
|
/*-----------------------------------------------------------------------------
|
|
@@ -99,7 +114,11 @@
|
|
|
99
114
|
display: none;
|
|
100
115
|
}
|
|
101
116
|
|
|
102
|
-
.jp-FileBrowser-
|
|
117
|
+
.jp-FileBrowser-filterToolbar > .jp-FileBrowser-filterBox {
|
|
118
|
+
width: 100%;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.jp-FileBrowser-filterBox > .jp-FilterBox {
|
|
103
122
|
width: 100%;
|
|
104
123
|
}
|
|
105
124
|
|