@jupyterlab/filebrowser 3.4.3 → 4.0.0-alpha.11
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 +10 -12
- package/lib/browser.js +44 -24
- package/lib/browser.js.map +1 -1
- package/lib/crumbs.js +1 -1
- package/lib/listing.d.ts +44 -1
- package/lib/listing.js +154 -15
- package/lib/listing.js.map +1 -1
- package/lib/model.d.ts +18 -3
- package/lib/model.js +18 -6
- package/lib/model.js.map +1 -1
- package/lib/opendialog.d.ts +3 -2
- package/lib/opendialog.js +8 -5
- package/lib/opendialog.js.map +1 -1
- package/lib/tokens.js +0 -1
- package/lib/tokens.js.map +1 -1
- package/lib/upload.d.ts +5 -1
- package/lib/upload.js +3 -2
- package/lib/upload.js.map +1 -1
- package/lib/uploadstatus.d.ts +2 -2
- package/lib/uploadstatus.js +1 -1
- package/lib/uploadstatus.js.map +1 -1
- package/package.json +23 -23
- package/style/base.css +61 -39
package/lib/browser.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Toolbar } from '@jupyterlab/apputils';
|
|
2
1
|
import { Contents } from '@jupyterlab/services';
|
|
3
2
|
import { ITranslator } from '@jupyterlab/translation';
|
|
3
|
+
import { SidePanel } from '@jupyterlab/ui-components';
|
|
4
4
|
import { IIterator } from '@lumino/algorithm';
|
|
5
|
-
import {
|
|
5
|
+
import { Panel } from '@lumino/widgets';
|
|
6
6
|
import { BreadCrumbs } from './crumbs';
|
|
7
7
|
import { DirListing } from './listing';
|
|
8
8
|
import { FilterFileBrowserModel } from './model';
|
|
@@ -13,7 +13,7 @@ import { FilterFileBrowserModel } from './model';
|
|
|
13
13
|
* and presents itself as a flat list of files and directories with
|
|
14
14
|
* breadcrumbs.
|
|
15
15
|
*/
|
|
16
|
-
export declare class FileBrowser extends
|
|
16
|
+
export declare class FileBrowser extends SidePanel {
|
|
17
17
|
/**
|
|
18
18
|
* Construct a new file browser.
|
|
19
19
|
*
|
|
@@ -24,14 +24,6 @@ export declare class FileBrowser extends Widget {
|
|
|
24
24
|
* The model used by the file browser.
|
|
25
25
|
*/
|
|
26
26
|
readonly model: FilterFileBrowserModel;
|
|
27
|
-
/**
|
|
28
|
-
* The toolbar used by the file browser.
|
|
29
|
-
*/
|
|
30
|
-
readonly toolbar: Toolbar<Widget>;
|
|
31
|
-
/**
|
|
32
|
-
* Override Widget.layout with a more specific PanelLayout type.
|
|
33
|
-
*/
|
|
34
|
-
layout: PanelLayout;
|
|
35
27
|
/**
|
|
36
28
|
* Whether to show active file in file browser
|
|
37
29
|
*/
|
|
@@ -51,6 +43,11 @@ export declare class FileBrowser extends Widget {
|
|
|
51
43
|
*/
|
|
52
44
|
get showHiddenFiles(): boolean;
|
|
53
45
|
set showHiddenFiles(value: boolean);
|
|
46
|
+
/**
|
|
47
|
+
* Whether to show checkboxes next to files and folders
|
|
48
|
+
*/
|
|
49
|
+
get showFileCheckboxes(): boolean;
|
|
50
|
+
set showFileCheckboxes(value: boolean);
|
|
54
51
|
/**
|
|
55
52
|
* Create an iterator over the listing's selected items.
|
|
56
53
|
*
|
|
@@ -145,7 +142,7 @@ export declare class FileBrowser extends Widget {
|
|
|
145
142
|
private _onConnectionFailure;
|
|
146
143
|
protected listing: DirListing;
|
|
147
144
|
protected crumbs: BreadCrumbs;
|
|
148
|
-
|
|
145
|
+
protected mainPanel: Panel;
|
|
149
146
|
private _filenameSearcher;
|
|
150
147
|
private _manager;
|
|
151
148
|
private _directoryPending;
|
|
@@ -154,6 +151,7 @@ export declare class FileBrowser extends Widget {
|
|
|
154
151
|
private _showLastModifiedColumn;
|
|
155
152
|
private _useFuzzyFilter;
|
|
156
153
|
private _showHiddenFiles;
|
|
154
|
+
private _showFileCheckboxes;
|
|
157
155
|
}
|
|
158
156
|
/**
|
|
159
157
|
* The namespace for the `FileBrowser` class statics.
|
package/lib/browser.js
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
// Copyright (c) Jupyter Development Team.
|
|
2
2
|
// Distributed under the terms of the Modified BSD License.
|
|
3
|
-
import {
|
|
3
|
+
import { showErrorMessage } from '@jupyterlab/apputils';
|
|
4
4
|
import { ServerConnection } from '@jupyterlab/services';
|
|
5
5
|
import { nullTranslator } from '@jupyterlab/translation';
|
|
6
|
-
import {
|
|
6
|
+
import { FilenameSearcher, SidePanel } from '@jupyterlab/ui-components';
|
|
7
|
+
import { Panel } from '@lumino/widgets';
|
|
7
8
|
import { BreadCrumbs } from './crumbs';
|
|
8
9
|
import { DirListing } from './listing';
|
|
9
10
|
/**
|
|
10
11
|
* The class name added to file browsers.
|
|
11
12
|
*/
|
|
12
13
|
const FILE_BROWSER_CLASS = 'jp-FileBrowser';
|
|
14
|
+
/**
|
|
15
|
+
* The class name added to file browser panel (gather filter, breadcrumbs and listing).
|
|
16
|
+
*/
|
|
17
|
+
const FILE_BROWSER_PANEL_CLASS = 'jp-FileBrowser-Panel';
|
|
13
18
|
/**
|
|
14
19
|
* The class name added to the filebrowser crumbs node.
|
|
15
20
|
*/
|
|
@@ -33,37 +38,43 @@ const LISTING_CLASS = 'jp-FileBrowser-listing';
|
|
|
33
38
|
* and presents itself as a flat list of files and directories with
|
|
34
39
|
* breadcrumbs.
|
|
35
40
|
*/
|
|
36
|
-
export class FileBrowser extends
|
|
41
|
+
export class FileBrowser extends SidePanel {
|
|
37
42
|
/**
|
|
38
43
|
* Construct a new file browser.
|
|
39
44
|
*
|
|
40
45
|
* @param options - The file browser options.
|
|
41
46
|
*/
|
|
42
47
|
constructor(options) {
|
|
43
|
-
|
|
48
|
+
var _a;
|
|
49
|
+
super({ content: new Panel(), translator: options.translator });
|
|
44
50
|
this._showLastModifiedColumn = true;
|
|
45
51
|
this._useFuzzyFilter = true;
|
|
46
52
|
this._showHiddenFiles = false;
|
|
53
|
+
this._showFileCheckboxes = false;
|
|
47
54
|
this.addClass(FILE_BROWSER_CLASS);
|
|
55
|
+
this.toolbar.addClass(TOOLBAR_CLASS);
|
|
48
56
|
this.id = options.id;
|
|
57
|
+
const translator = (this.translator = (_a = options.translator) !== null && _a !== void 0 ? _a : nullTranslator);
|
|
49
58
|
const model = (this.model = options.model);
|
|
50
59
|
const renderer = options.renderer;
|
|
51
|
-
const translator = this.translator;
|
|
52
60
|
model.connectionFailure.connect(this._onConnectionFailure, this);
|
|
53
|
-
this.translator = options.translator || nullTranslator;
|
|
54
61
|
this._manager = model.manager;
|
|
55
|
-
this._trans = this.translator.load('jupyterlab');
|
|
56
|
-
this.crumbs = new BreadCrumbs({ model, translator });
|
|
57
|
-
this.toolbar = new Toolbar();
|
|
58
62
|
// a11y
|
|
59
63
|
this.toolbar.node.setAttribute('role', 'navigation');
|
|
60
64
|
this.toolbar.node.setAttribute('aria-label', this._trans.__('file browser'));
|
|
61
65
|
this._directoryPending = false;
|
|
66
|
+
// File browser widgets container
|
|
67
|
+
this.mainPanel = new Panel();
|
|
68
|
+
this.mainPanel.addClass(FILE_BROWSER_PANEL_CLASS);
|
|
69
|
+
this.mainPanel.title.label = this._trans.__('File Browser');
|
|
70
|
+
this.crumbs = new BreadCrumbs({ model, translator });
|
|
71
|
+
this.crumbs.addClass(CRUMBS_CLASS);
|
|
62
72
|
this.listing = this.createDirListing({
|
|
63
73
|
model,
|
|
64
74
|
renderer,
|
|
65
|
-
translator
|
|
75
|
+
translator
|
|
66
76
|
});
|
|
77
|
+
this.listing.addClass(LISTING_CLASS);
|
|
67
78
|
this._filenameSearcher = FilenameSearcher({
|
|
68
79
|
updateFilter: (filterFn, query) => {
|
|
69
80
|
this.listing.model.setFilter(value => {
|
|
@@ -73,15 +84,11 @@ export class FileBrowser extends Widget {
|
|
|
73
84
|
useFuzzyFilter: this._useFuzzyFilter,
|
|
74
85
|
placeholder: this._trans.__('Filter files by name')
|
|
75
86
|
});
|
|
76
|
-
this.crumbs.addClass(CRUMBS_CLASS);
|
|
77
|
-
this.toolbar.addClass(TOOLBAR_CLASS);
|
|
78
87
|
this._filenameSearcher.addClass(FILTERBOX_CLASS);
|
|
79
|
-
this.
|
|
80
|
-
this.
|
|
81
|
-
this.
|
|
82
|
-
this.
|
|
83
|
-
this.layout.addWidget(this.crumbs);
|
|
84
|
-
this.layout.addWidget(this.listing);
|
|
88
|
+
this.mainPanel.addWidget(this._filenameSearcher);
|
|
89
|
+
this.mainPanel.addWidget(this.crumbs);
|
|
90
|
+
this.mainPanel.addWidget(this.listing);
|
|
91
|
+
this.addWidget(this.mainPanel);
|
|
85
92
|
if (options.restore !== false) {
|
|
86
93
|
void model.restore(this.id);
|
|
87
94
|
}
|
|
@@ -115,6 +122,9 @@ export class FileBrowser extends Widget {
|
|
|
115
122
|
*/
|
|
116
123
|
set useFuzzyFilter(value) {
|
|
117
124
|
this._useFuzzyFilter = value;
|
|
125
|
+
// Detach and dispose the current widget
|
|
126
|
+
this._filenameSearcher.parent = null;
|
|
127
|
+
this._filenameSearcher.dispose();
|
|
118
128
|
this._filenameSearcher = FilenameSearcher({
|
|
119
129
|
updateFilter: (filterFn, query) => {
|
|
120
130
|
this.listing.model.setFilter(value => {
|
|
@@ -126,12 +136,7 @@ export class FileBrowser extends Widget {
|
|
|
126
136
|
forceRefresh: true
|
|
127
137
|
});
|
|
128
138
|
this._filenameSearcher.addClass(FILTERBOX_CLASS);
|
|
129
|
-
this.
|
|
130
|
-
this.layout.removeWidget(this.crumbs);
|
|
131
|
-
this.layout.removeWidget(this.listing);
|
|
132
|
-
this.layout.addWidget(this._filenameSearcher);
|
|
133
|
-
this.layout.addWidget(this.crumbs);
|
|
134
|
-
this.layout.addWidget(this.listing);
|
|
139
|
+
this.mainPanel.insertWidget(0, this._filenameSearcher);
|
|
135
140
|
}
|
|
136
141
|
/**
|
|
137
142
|
* Whether to show hidden files
|
|
@@ -143,6 +148,21 @@ export class FileBrowser extends Widget {
|
|
|
143
148
|
this.model.showHiddenFiles(value);
|
|
144
149
|
this._showHiddenFiles = value;
|
|
145
150
|
}
|
|
151
|
+
/**
|
|
152
|
+
* Whether to show checkboxes next to files and folders
|
|
153
|
+
*/
|
|
154
|
+
get showFileCheckboxes() {
|
|
155
|
+
return this._showFileCheckboxes;
|
|
156
|
+
}
|
|
157
|
+
set showFileCheckboxes(value) {
|
|
158
|
+
if (this.listing.setColumnVisibility) {
|
|
159
|
+
this.listing.setColumnVisibility('is_selected', value);
|
|
160
|
+
this._showFileCheckboxes = value;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
console.warn('Listing does not support toggling column visibility');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
146
166
|
/**
|
|
147
167
|
* Create an iterator over the listing's selected items.
|
|
148
168
|
*
|
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,
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
package/lib/crumbs.js
CHANGED
|
@@ -267,7 +267,7 @@ var Private;
|
|
|
267
267
|
*/
|
|
268
268
|
function updateCrumbs(breadcrumbs, separators, path, hasPreferred) {
|
|
269
269
|
const node = breadcrumbs[0].parentNode;
|
|
270
|
-
// Remove all but the
|
|
270
|
+
// Remove all but the home or preferred node.
|
|
271
271
|
const firstChild = node.firstChild;
|
|
272
272
|
while (firstChild && firstChild.nextSibling) {
|
|
273
273
|
node.removeChild(firstChild.nextSibling);
|
package/lib/listing.d.ts
CHANGED
|
@@ -187,6 +187,10 @@ export declare class DirListing extends Widget {
|
|
|
187
187
|
protected onUpdateRequest(msg: Message): void;
|
|
188
188
|
onResize(msg: Widget.ResizeMessage): void;
|
|
189
189
|
setColumnVisibility(name: DirListing.ToggleableColumn, visible: boolean): void;
|
|
190
|
+
/**
|
|
191
|
+
* Would this click (or other event type) hit the checkbox by default?
|
|
192
|
+
*/
|
|
193
|
+
protected isWithinCheckboxHitArea(event: Event): boolean;
|
|
190
194
|
/**
|
|
191
195
|
* Handle the `'click'` event for the widget.
|
|
192
196
|
*/
|
|
@@ -355,7 +359,7 @@ export declare namespace DirListing {
|
|
|
355
359
|
/**
|
|
356
360
|
* Toggleable columns.
|
|
357
361
|
*/
|
|
358
|
-
type ToggleableColumn = 'last_modified';
|
|
362
|
+
type ToggleableColumn = 'last_modified' | 'is_selected';
|
|
359
363
|
/**
|
|
360
364
|
* A file contents model thunk.
|
|
361
365
|
*
|
|
@@ -421,6 +425,19 @@ export declare namespace DirListing {
|
|
|
421
425
|
* @returns The node containing the file name.
|
|
422
426
|
*/
|
|
423
427
|
getNameNode(node: HTMLElement): HTMLElement;
|
|
428
|
+
/**
|
|
429
|
+
* Get the checkbox input element node.
|
|
430
|
+
*
|
|
431
|
+
* Downstream interface implementations,such as jupyterlab-unfold, that
|
|
432
|
+
* don't support checkboxes should simply always return null for this
|
|
433
|
+
* function.
|
|
434
|
+
*
|
|
435
|
+
* @param node A node created by [[createItemNode]] or
|
|
436
|
+
* [[createHeaderItemNode]]
|
|
437
|
+
*
|
|
438
|
+
* @returns The checkbox node.
|
|
439
|
+
*/
|
|
440
|
+
getCheckboxNode: (node: HTMLElement) => HTMLInputElement | null;
|
|
424
441
|
/**
|
|
425
442
|
* Create an appropriate drag image for an item.
|
|
426
443
|
*
|
|
@@ -464,6 +481,23 @@ export declare namespace DirListing {
|
|
|
464
481
|
* @returns A new DOM node to use as a content item.
|
|
465
482
|
*/
|
|
466
483
|
createItemNode(hiddenColumns?: Set<DirListing.ToggleableColumn>): HTMLElement;
|
|
484
|
+
/**
|
|
485
|
+
* Creates a node containing a checkbox.
|
|
486
|
+
*
|
|
487
|
+
* We wrap the checkbox in a label element in order to increase its hit
|
|
488
|
+
* area. This is because the padding of the checkbox itself cannot be
|
|
489
|
+
* increased via CSS, as the CSS/form compatibility table at the following
|
|
490
|
+
* url from MDN shows:
|
|
491
|
+
* https://developer.mozilla.org/en-US/docs/Learn/Forms/Property_compatibility_table_for_form_controls#check_boxes_and_radio_buttons
|
|
492
|
+
*
|
|
493
|
+
* @param [options]
|
|
494
|
+
* @params options.alwaysVisible Should the checkbox be visible even when
|
|
495
|
+
* not hovered?
|
|
496
|
+
* @returns A new DOM node that contains a checkbox.
|
|
497
|
+
*/
|
|
498
|
+
createCheckboxWrapperNode(options?: {
|
|
499
|
+
alwaysVisible: boolean;
|
|
500
|
+
}): HTMLElement;
|
|
467
501
|
/**
|
|
468
502
|
* Update an item node to reflect the current state of a model.
|
|
469
503
|
*
|
|
@@ -483,6 +517,15 @@ export declare namespace DirListing {
|
|
|
483
517
|
* @returns The node containing the file name.
|
|
484
518
|
*/
|
|
485
519
|
getNameNode(node: HTMLElement): HTMLElement;
|
|
520
|
+
/**
|
|
521
|
+
* Get the checkbox input element node.
|
|
522
|
+
*
|
|
523
|
+
* @param node A node created by [[createItemNode]] or
|
|
524
|
+
* [[createHeaderItemNode]]
|
|
525
|
+
*
|
|
526
|
+
* @returns The checkbox node.
|
|
527
|
+
*/
|
|
528
|
+
getCheckboxNode(node: HTMLElement): HTMLInputElement | null;
|
|
486
529
|
/**
|
|
487
530
|
* Create a drag image for an item.
|
|
488
531
|
*
|
package/lib/listing.js
CHANGED
|
@@ -54,6 +54,11 @@ const ITEM_ICON_CLASS = 'jp-DirListing-itemIcon';
|
|
|
54
54
|
* The class name added to the listing item modified cell.
|
|
55
55
|
*/
|
|
56
56
|
const ITEM_MODIFIED_CLASS = 'jp-DirListing-itemModified';
|
|
57
|
+
/**
|
|
58
|
+
* The class name added to the label element that wraps each item's checkbox and
|
|
59
|
+
* the header's check-all checkbox.
|
|
60
|
+
*/
|
|
61
|
+
const CHECKBOX_WRAPPER_CLASS = 'jp-DirListing-checkboxWrapper';
|
|
57
62
|
/**
|
|
58
63
|
* The class name added to the dir listing editor node.
|
|
59
64
|
*/
|
|
@@ -673,11 +678,31 @@ export class DirListing extends Widget {
|
|
|
673
678
|
content.appendChild(node);
|
|
674
679
|
}
|
|
675
680
|
// Remove extra classes from the nodes.
|
|
676
|
-
nodes.forEach(
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
681
|
+
nodes.forEach(node => {
|
|
682
|
+
node.classList.remove(SELECTED_CLASS);
|
|
683
|
+
node.classList.remove(RUNNING_CLASS);
|
|
684
|
+
node.classList.remove(CUT_CLASS);
|
|
685
|
+
const checkbox = renderer.getCheckboxNode(node);
|
|
686
|
+
if (checkbox) {
|
|
687
|
+
// Uncheck each file checkbox
|
|
688
|
+
checkbox.checked = false;
|
|
689
|
+
}
|
|
680
690
|
});
|
|
691
|
+
// Put the check-all checkbox in the header into the correct state
|
|
692
|
+
const checkAllCheckbox = renderer.getCheckboxNode(this.headerNode);
|
|
693
|
+
if (checkAllCheckbox) {
|
|
694
|
+
const totalSelected = Object.keys(this.selection).length;
|
|
695
|
+
const allSelected = items.length > 0 && totalSelected === items.length;
|
|
696
|
+
const someSelected = !allSelected && totalSelected > 0;
|
|
697
|
+
checkAllCheckbox.checked = allSelected;
|
|
698
|
+
checkAllCheckbox.indeterminate = someSelected;
|
|
699
|
+
// Stash the state in data attributes so we can access them in the click
|
|
700
|
+
// handler (because in the click handler, checkbox.checked and
|
|
701
|
+
// checkbox.indeterminate do not hold the previous value; they hold the
|
|
702
|
+
// next value).
|
|
703
|
+
checkAllCheckbox.dataset.checked = String(allSelected);
|
|
704
|
+
checkAllCheckbox.dataset.indeterminate = String(someSelected);
|
|
705
|
+
}
|
|
681
706
|
// Add extra classes to item nodes based on widget state.
|
|
682
707
|
items.forEach((item, i) => {
|
|
683
708
|
const node = nodes[i];
|
|
@@ -688,6 +713,10 @@ export class DirListing extends Widget {
|
|
|
688
713
|
if (this._isCut && this._model.path === this._prevPath) {
|
|
689
714
|
node.classList.add(CUT_CLASS);
|
|
690
715
|
}
|
|
716
|
+
const checkbox = renderer.getCheckboxNode(node);
|
|
717
|
+
if (checkbox) {
|
|
718
|
+
checkbox.checked = true;
|
|
719
|
+
}
|
|
691
720
|
}
|
|
692
721
|
// add metadata to the node
|
|
693
722
|
node.setAttribute('data-isdir', item.type === 'directory' ? 'true' : 'false');
|
|
@@ -734,16 +763,50 @@ export class DirListing extends Widget {
|
|
|
734
763
|
this.headerNode.innerHTML = '';
|
|
735
764
|
this._renderer.populateHeaderNode(this.headerNode, this.translator, this._hiddenColumns);
|
|
736
765
|
}
|
|
766
|
+
/**
|
|
767
|
+
* Would this click (or other event type) hit the checkbox by default?
|
|
768
|
+
*/
|
|
769
|
+
isWithinCheckboxHitArea(event) {
|
|
770
|
+
let element = event.target;
|
|
771
|
+
while (element) {
|
|
772
|
+
if (element.classList.contains(CHECKBOX_WRAPPER_CLASS)) {
|
|
773
|
+
return true;
|
|
774
|
+
}
|
|
775
|
+
element = element.parentElement;
|
|
776
|
+
}
|
|
777
|
+
return false;
|
|
778
|
+
}
|
|
737
779
|
/**
|
|
738
780
|
* Handle the `'click'` event for the widget.
|
|
739
781
|
*/
|
|
740
782
|
_evtClick(event) {
|
|
741
783
|
const target = event.target;
|
|
742
784
|
const header = this.headerNode;
|
|
785
|
+
const renderer = this._renderer;
|
|
743
786
|
if (header.contains(target)) {
|
|
744
|
-
const
|
|
745
|
-
if (
|
|
746
|
-
|
|
787
|
+
const checkbox = renderer.getCheckboxNode(header);
|
|
788
|
+
if (checkbox && this.isWithinCheckboxHitArea(event)) {
|
|
789
|
+
const previouslyUnchecked = checkbox.dataset.indeterminate === 'false' &&
|
|
790
|
+
checkbox.dataset.checked === 'false';
|
|
791
|
+
// The only time a click on the check-all checkbox should check all is
|
|
792
|
+
// when it was previously unchecked; otherwise, if the checkbox was
|
|
793
|
+
// either checked (all selected) or indeterminate (some selected), the
|
|
794
|
+
// click should clear all.
|
|
795
|
+
if (previouslyUnchecked) {
|
|
796
|
+
// Select all items
|
|
797
|
+
this._sortedItems.forEach((item) => (this.selection[item.path] = true));
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
// Unselect all items
|
|
801
|
+
this.clearSelectedItems();
|
|
802
|
+
}
|
|
803
|
+
this.update();
|
|
804
|
+
}
|
|
805
|
+
else {
|
|
806
|
+
const state = this.renderer.handleHeaderClick(header, event);
|
|
807
|
+
if (state) {
|
|
808
|
+
this.sort(state);
|
|
809
|
+
}
|
|
747
810
|
}
|
|
748
811
|
return;
|
|
749
812
|
}
|
|
@@ -928,6 +991,12 @@ export class DirListing extends Widget {
|
|
|
928
991
|
if (event.ctrlKey || event.shiftKey || event.altKey || event.metaKey) {
|
|
929
992
|
return;
|
|
930
993
|
}
|
|
994
|
+
// Do nothing if the double click is on a checkbox. (Otherwise a rapid
|
|
995
|
+
// check-uncheck on the checkbox will cause the adjacent file/folder to
|
|
996
|
+
// open, which is probably not what the user intended.)
|
|
997
|
+
if (this.isWithinCheckboxHitArea(event)) {
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
931
1000
|
// Stop the event propagation.
|
|
932
1001
|
event.preventDefault();
|
|
933
1002
|
event.stopPropagation();
|
|
@@ -957,7 +1026,7 @@ export class DirListing extends Widget {
|
|
|
957
1026
|
}
|
|
958
1027
|
for (let i = 0; i < length; i++) {
|
|
959
1028
|
let entry = (_c = event.dataTransfer) === null || _c === void 0 ? void 0 : _c.items[i].webkitGetAsEntry();
|
|
960
|
-
if (entry.isDirectory) {
|
|
1029
|
+
if (entry === null || entry === void 0 ? void 0 : entry.isDirectory) {
|
|
961
1030
|
console.log('currently not supporting drag + drop for folders');
|
|
962
1031
|
void showDialog({
|
|
963
1032
|
title: this._trans.__('Error Uploading Folder'),
|
|
@@ -1173,8 +1242,14 @@ export class DirListing extends Widget {
|
|
|
1173
1242
|
this._softSelection = '';
|
|
1174
1243
|
const path = items[index].path;
|
|
1175
1244
|
const selected = Object.keys(this.selection);
|
|
1245
|
+
const isLeftClickOnCheckbox = event.button === 0 &&
|
|
1246
|
+
// On Mac, a left-click with the ctrlKey is treated as a right-click.
|
|
1247
|
+
!(IS_MAC && event.ctrlKey) &&
|
|
1248
|
+
this.isWithinCheckboxHitArea(event);
|
|
1176
1249
|
// Handle toggling.
|
|
1177
|
-
if ((IS_MAC && event.metaKey) ||
|
|
1250
|
+
if ((IS_MAC && event.metaKey) ||
|
|
1251
|
+
(!IS_MAC && event.ctrlKey) ||
|
|
1252
|
+
isLeftClickOnCheckbox) {
|
|
1178
1253
|
if (this.selection[path]) {
|
|
1179
1254
|
delete this.selection[path];
|
|
1180
1255
|
}
|
|
@@ -1433,7 +1508,7 @@ export class DirListing extends Widget {
|
|
|
1433
1508
|
* @param node - The header node to populate.
|
|
1434
1509
|
*/
|
|
1435
1510
|
populateHeaderNode(node, translator, hiddenColumns) {
|
|
1436
|
-
var _a;
|
|
1511
|
+
var _a, _b;
|
|
1437
1512
|
translator = translator || nullTranslator;
|
|
1438
1513
|
const trans = translator.load('jupyterlab');
|
|
1439
1514
|
const name = this.createHeaderItemNode(trans.__('Name'));
|
|
@@ -1444,10 +1519,16 @@ export class DirListing extends Widget {
|
|
|
1444
1519
|
modified.classList.add(MODIFIED_ID_CLASS);
|
|
1445
1520
|
narrow.classList.add(NARROW_ID_CLASS);
|
|
1446
1521
|
narrow.textContent = '...';
|
|
1522
|
+
if (!((_a = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _a === void 0 ? void 0 : _a.call(hiddenColumns, 'is_selected'))) {
|
|
1523
|
+
const checkboxWrapper = this.createCheckboxWrapperNode({
|
|
1524
|
+
alwaysVisible: true
|
|
1525
|
+
});
|
|
1526
|
+
node.appendChild(checkboxWrapper);
|
|
1527
|
+
}
|
|
1447
1528
|
node.appendChild(name);
|
|
1448
1529
|
node.appendChild(narrow);
|
|
1449
1530
|
node.appendChild(modified);
|
|
1450
|
-
if ((
|
|
1531
|
+
if ((_b = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _b === void 0 ? void 0 : _b.call(hiddenColumns, 'last_modified')) {
|
|
1451
1532
|
modified.classList.add(MODIFIED_COLUMN_HIDDEN);
|
|
1452
1533
|
}
|
|
1453
1534
|
else {
|
|
@@ -1527,7 +1608,7 @@ export class DirListing extends Widget {
|
|
|
1527
1608
|
* @returns A new DOM node to use as a content item.
|
|
1528
1609
|
*/
|
|
1529
1610
|
createItemNode(hiddenColumns) {
|
|
1530
|
-
var _a;
|
|
1611
|
+
var _a, _b;
|
|
1531
1612
|
const node = document.createElement('li');
|
|
1532
1613
|
const icon = document.createElement('span');
|
|
1533
1614
|
const text = document.createElement('span');
|
|
@@ -1535,6 +1616,10 @@ export class DirListing extends Widget {
|
|
|
1535
1616
|
icon.className = ITEM_ICON_CLASS;
|
|
1536
1617
|
text.className = ITEM_TEXT_CLASS;
|
|
1537
1618
|
modified.className = ITEM_MODIFIED_CLASS;
|
|
1619
|
+
if (!((_a = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _a === void 0 ? void 0 : _a.call(hiddenColumns, 'is_selected'))) {
|
|
1620
|
+
const checkboxWrapper = this.createCheckboxWrapperNode();
|
|
1621
|
+
node.appendChild(checkboxWrapper);
|
|
1622
|
+
}
|
|
1538
1623
|
node.appendChild(icon);
|
|
1539
1624
|
node.appendChild(text);
|
|
1540
1625
|
node.appendChild(modified);
|
|
@@ -1543,7 +1628,7 @@ export class DirListing extends Widget {
|
|
|
1543
1628
|
// text element gets substituted with input area during file name edits
|
|
1544
1629
|
// which conveniently deactivate irrelevant shortcuts.
|
|
1545
1630
|
text.tabIndex = 0;
|
|
1546
|
-
if ((
|
|
1631
|
+
if ((_b = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _b === void 0 ? void 0 : _b.call(hiddenColumns, 'last_modified')) {
|
|
1547
1632
|
modified.classList.add(MODIFIED_COLUMN_HIDDEN);
|
|
1548
1633
|
}
|
|
1549
1634
|
else {
|
|
@@ -1551,6 +1636,40 @@ export class DirListing extends Widget {
|
|
|
1551
1636
|
}
|
|
1552
1637
|
return node;
|
|
1553
1638
|
}
|
|
1639
|
+
/**
|
|
1640
|
+
* Creates a node containing a checkbox.
|
|
1641
|
+
*
|
|
1642
|
+
* We wrap the checkbox in a label element in order to increase its hit
|
|
1643
|
+
* area. This is because the padding of the checkbox itself cannot be
|
|
1644
|
+
* increased via CSS, as the CSS/form compatibility table at the following
|
|
1645
|
+
* url from MDN shows:
|
|
1646
|
+
* https://developer.mozilla.org/en-US/docs/Learn/Forms/Property_compatibility_table_for_form_controls#check_boxes_and_radio_buttons
|
|
1647
|
+
*
|
|
1648
|
+
* @param [options]
|
|
1649
|
+
* @params options.alwaysVisible Should the checkbox be visible even when
|
|
1650
|
+
* not hovered?
|
|
1651
|
+
* @returns A new DOM node that contains a checkbox.
|
|
1652
|
+
*/
|
|
1653
|
+
createCheckboxWrapperNode(options) {
|
|
1654
|
+
// Wrap the checkbox in a label element in order to increase its hit area.
|
|
1655
|
+
const labelWrapper = document.createElement('label');
|
|
1656
|
+
labelWrapper.classList.add(CHECKBOX_WRAPPER_CLASS);
|
|
1657
|
+
// The individual file checkboxes are visible on hover, but the header
|
|
1658
|
+
// check-all checkbox is always visible.
|
|
1659
|
+
if (options === null || options === void 0 ? void 0 : options.alwaysVisible) {
|
|
1660
|
+
labelWrapper.classList.add('jp-mod-visible');
|
|
1661
|
+
}
|
|
1662
|
+
const checkbox = document.createElement('input');
|
|
1663
|
+
checkbox.type = 'checkbox';
|
|
1664
|
+
// Prevent the user from clicking (via mouse, keyboard, or touch) the
|
|
1665
|
+
// checkbox since other code handles the mouse and keyboard events and
|
|
1666
|
+
// controls the checked state of the checkbox.
|
|
1667
|
+
checkbox.addEventListener('click', event => {
|
|
1668
|
+
event.preventDefault();
|
|
1669
|
+
});
|
|
1670
|
+
labelWrapper.appendChild(checkbox);
|
|
1671
|
+
return labelWrapper;
|
|
1672
|
+
}
|
|
1554
1673
|
/**
|
|
1555
1674
|
* Update an item node to reflect the current state of a model.
|
|
1556
1675
|
*
|
|
@@ -1562,7 +1681,7 @@ export class DirListing extends Widget {
|
|
|
1562
1681
|
*
|
|
1563
1682
|
*/
|
|
1564
1683
|
updateItemNode(node, model, fileType, translator, hiddenColumns) {
|
|
1565
|
-
var _a;
|
|
1684
|
+
var _a, _b;
|
|
1566
1685
|
translator = translator || nullTranslator;
|
|
1567
1686
|
fileType =
|
|
1568
1687
|
fileType || DocumentRegistry.getDefaultTextFileType(translator);
|
|
@@ -1572,7 +1691,16 @@ export class DirListing extends Widget {
|
|
|
1572
1691
|
const iconContainer = DOMUtils.findElement(node, ITEM_ICON_CLASS);
|
|
1573
1692
|
const text = DOMUtils.findElement(node, ITEM_TEXT_CLASS);
|
|
1574
1693
|
const modified = DOMUtils.findElement(node, ITEM_MODIFIED_CLASS);
|
|
1575
|
-
|
|
1694
|
+
const checkboxWrapper = DOMUtils.findElement(node, CHECKBOX_WRAPPER_CLASS);
|
|
1695
|
+
const showFileCheckboxes = !((_a = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _a === void 0 ? void 0 : _a.call(hiddenColumns, 'is_selected'));
|
|
1696
|
+
if (checkboxWrapper && !showFileCheckboxes) {
|
|
1697
|
+
node.removeChild(checkboxWrapper);
|
|
1698
|
+
}
|
|
1699
|
+
else if (showFileCheckboxes && !checkboxWrapper) {
|
|
1700
|
+
const checkboxWrapper = this.createCheckboxWrapperNode();
|
|
1701
|
+
node.insertBefore(checkboxWrapper, iconContainer);
|
|
1702
|
+
}
|
|
1703
|
+
if ((_b = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _b === void 0 ? void 0 : _b.call(hiddenColumns, 'last_modified')) {
|
|
1576
1704
|
modified.classList.add(MODIFIED_COLUMN_HIDDEN);
|
|
1577
1705
|
}
|
|
1578
1706
|
else {
|
|
@@ -1640,6 +1768,17 @@ export class DirListing extends Widget {
|
|
|
1640
1768
|
getNameNode(node) {
|
|
1641
1769
|
return DOMUtils.findElement(node, ITEM_TEXT_CLASS);
|
|
1642
1770
|
}
|
|
1771
|
+
/**
|
|
1772
|
+
* Get the checkbox input element node.
|
|
1773
|
+
*
|
|
1774
|
+
* @param node A node created by [[createItemNode]] or
|
|
1775
|
+
* [[createHeaderItemNode]]
|
|
1776
|
+
*
|
|
1777
|
+
* @returns The checkbox node.
|
|
1778
|
+
*/
|
|
1779
|
+
getCheckboxNode(node) {
|
|
1780
|
+
return node.querySelector(`.${CHECKBOX_WRAPPER_CLASS} input[type=checkbox]`);
|
|
1781
|
+
}
|
|
1643
1782
|
/**
|
|
1644
1783
|
* Create a drag image for an item.
|
|
1645
1784
|
*
|