@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 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 { PanelLayout, Widget } from '@lumino/widgets';
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 Widget {
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
- private _trans;
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 { FilenameSearcher, showErrorMessage, Toolbar } from '@jupyterlab/apputils';
3
+ import { showErrorMessage } from '@jupyterlab/apputils';
4
4
  import { ServerConnection } from '@jupyterlab/services';
5
5
  import { nullTranslator } from '@jupyterlab/translation';
6
- import { PanelLayout, Widget } from '@lumino/widgets';
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 Widget {
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
- super();
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: this.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.listing.addClass(LISTING_CLASS);
80
- this.layout = new PanelLayout();
81
- this.layout.addWidget(this.toolbar);
82
- this.layout.addWidget(this._filenameSearcher);
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.layout.removeWidget(this._filenameSearcher);
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
  *
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
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;AAExD,OAAO,EAAY,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAe,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EACL,gBAAgB,EAGhB,SAAS,EACV,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC;;GAEG;AACH,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;AAE5C;;GAEG;AACH,MAAM,wBAAwB,GAAG,sBAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C;;GAEG;AACH,MAAM,eAAe,GAAG,0BAA0B,CAAC;AAEnD;;GAEG;AACH,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C;;GAEG;AACH,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,OAAO,WAAY,SAAQ,SAAS;IACxC;;;;OAIG;IACH,YAAY,OAA6B;;QACvC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QA2W1D,4BAAuB,GAAY,IAAI,CAAC;QACxC,oBAAe,GAAY,IAAI,CAAC;QAChC,qBAAgB,GAAY,KAAK,CAAC;QAClC,wBAAmB,GAAY,KAAK,CAAC;QA7W3C,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACrB,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,MAAA,OAAO,CAAC,UAAU,mCAAI,cAAc,CAAC,CAAC;QAE5E,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAElC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAE9B,OAAO;QACP,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAC5B,YAAY,EACZ,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAC/B,CAAC;QAEF,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QAE/B,iCAAiC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACnC,KAAK;YACL,QAAQ;YACR,UAAU;SACX,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAErC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;YACxC,YAAY,EAAE,CACZ,QAAkD,EAClD,KAAc,EACd,EAAE;gBACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;oBACnC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;YACL,CAAC;YACD,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAEjD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEvC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE/B,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;YAC7B,KAAK,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAC7B;IACH,CAAC;IAOD;;OAEG;IACH,IAAI,0BAA0B;QAC5B,OAAO,IAAI,CAAC,2BAA2B,CAAC;IAC1C,CAAC;IAED,IAAI,0BAA0B,CAAC,KAAc;QAC3C,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,uBAAuB,CAAC;IACtC,CAAC;IAED,IAAI,sBAAsB,CAAC,KAAc;QACvC,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;SACtC;aAAM;YACL,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;SACrE;IACH,CAAC;IAED;;OAEG;IACH,IAAI,cAAc,CAAC,KAAc;QAC/B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAE7B,wCAAwC;QACxC,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QAEjC,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;YACxC,YAAY,EAAE,CACZ,QAAkD,EAClD,KAAc,EACd,EAAE;gBACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;oBACnC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;YACL,CAAC;YACD,cAAc,EAAE,IAAI,CAAC,eAAe;YACpC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC;YACnD,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAEjD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAED,IAAI,eAAe,CAAC,KAAc;QAChC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,IAAI,kBAAkB,CAAC,KAAc;QACnC,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;YACpC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;SAClC;aAAM;YACL,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;SACrE;IACH,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,GAAG;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE;YACnC,OAAO;SACR;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,+CAA+C;QAC/C,iDAAiD;QACjD,+CAA+C;QAC/C,iDAAiD;QACjD,WAAW;QACX,KAAK,IAAI,CAAC,QAAQ;aACf,WAAW,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,IAAI,EAAE,WAAW;SAClB,CAAC;aACD,IAAI,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;YAClB,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,KAAK,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAiC;QAC7C,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,EAAE;YAC9B,OAAO;SACR;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,+CAA+C;QAC/C,4CAA4C;QAC5C,0CAA0C;QAC1C,4CAA4C;QAC5C,WAAW;QACX,KAAK,IAAI,CAAC,QAAQ;aACf,WAAW,CAAC;YACX,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC;aACD,IAAI,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;YAClB,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,KAAK,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,aAAa,CAAC,KAAiB;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;OAMG;IACO,gBAAgB,CAAC,OAA4B;QACrD,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAID;;OAEG;IACK,oBAAoB,CAC1B,MAA8B,EAC9B,IAAW;QAEX,IACE,IAAI,YAAY,gBAAgB,CAAC,aAAa;YAC9C,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,EAC5B;YACA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC;YACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAC3B,2BAA2B,EAC3B,IAAI,CAAC,KAAK,CAAC,IAAI,CAChB,CAAC;YACF,KAAK,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SACpC;IACH,CAAC;CAeF"}
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 root or preferred node.
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(item => {
677
- item.classList.remove(SELECTED_CLASS);
678
- item.classList.remove(RUNNING_CLASS);
679
- item.classList.remove(CUT_CLASS);
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 state = this.renderer.handleHeaderClick(header, event);
745
- if (state) {
746
- this.sort(state);
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) || (!IS_MAC && event.ctrlKey)) {
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 ((_a = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _a === void 0 ? void 0 : _a.call(hiddenColumns, 'last_modified')) {
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 ((_a = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _a === void 0 ? void 0 : _a.call(hiddenColumns, 'last_modified')) {
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
- if ((_a = hiddenColumns === null || hiddenColumns === void 0 ? void 0 : hiddenColumns.has) === null || _a === void 0 ? void 0 : _a.call(hiddenColumns, 'last_modified')) {
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
  *