Skip to content

Commit

Permalink
Improve API
Browse files Browse the repository at this point in the history
  • Loading branch information
Frederic Collonval committed May 23, 2019
1 parent 165d36a commit 71d21ce
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 92 deletions.
167 changes: 90 additions & 77 deletions packages/filebrowser/src/opendialog.ts
Expand Up @@ -19,52 +19,101 @@ import { IFileBrowserFactory } from './factory';
const OPEN_DIALOG_CLASS = 'jp-Open-Dialog';

/**
* Create and show a open files dialog.
*
* Note: if nothing is selected when `getValue` will return the browser
* model current path.
*
* @param options - The dialog setup options.
*
* @returns A promise that resolves with whether the dialog was accepted.
* Namespace for file dialog
*/
export function getOpenFiles(
options: OpenFileDialog.IOptions
): Promise<Dialog.IResult<Contents.IModel[]>> {
let dialogOptions: Partial<Dialog.IOptions<Contents.IModel[]>> = {
title: options.title,
buttons: [
Dialog.cancelButton(),
Dialog.okButton({
label: 'Select'
})
],
focusNodeSelector: options.focusNodeSelector,
host: options.host,
renderer: options.renderer,
body: new OpenDialog(options.manager, options.filter)
};
let dialog = new Dialog(dialogOptions);
return dialog.launch();
export namespace FileDialog {
/**
* Options for the open directory dialog
*/
export interface IDirectoryOptions
extends Partial<
Pick<
Dialog.IOptions<Promise<Contents.IModel[]>>,
Exclude<
keyof Dialog.IOptions<Promise<Contents.IModel[]>>,
'body' | 'buttons' | 'defaultButton'
>
>
> {
/**
* Document manager
*/
manager: IDocumentManager;
}

/**
* Options for the open file dialog
*/
export interface IFileOptions extends IDirectoryOptions {
/**
* Filter function on file browser item model
*/
filter?: (value: Contents.IModel) => boolean;
}

/**
* Create and show a open files dialog.
*
* Note: if nothing is selected when `getValue` will return the browser
* model current path.
*
* @param options - The dialog setup options.
*
* @returns A promise that resolves with whether the dialog was accepted.
*/
export function getOpenFiles(
options: IFileOptions
): Promise<Dialog.IResult<Contents.IModel[]>> {
let dialogOptions: Partial<Dialog.IOptions<Contents.IModel[]>> = {
title: options.title,
buttons: [
Dialog.cancelButton(),
Dialog.okButton({
label: 'Select'
})
],
focusNodeSelector: options.focusNodeSelector,
host: options.host,
renderer: options.renderer,
body: new OpenDialog(options.manager, options.filter)
};
let dialog = new Dialog(dialogOptions);
return dialog.launch();
}

/**
* Create and show a open directory dialog.
*
* Note: if nothing is selected when `getValue` will return the browser
* model current path.
*
* @param options - The dialog setup options.
*
* @returns A promise that resolves with whether the dialog was accepted.
*/
export function getExistingDirectory(
options: IDirectoryOptions
): Promise<Dialog.IResult<Contents.IModel[]>> {
return getOpenFiles({
...options,
filter: model => false
});
}
}

/**
* Create and show a open directory dialog.
*
* Note: if nothing is selected when `getValue` will return the browser
* model current path.
*
* @param options - The dialog setup options.
*
* @returns A promise that resolves with whether the dialog was accepted.
* Namespace for the filtered file browser model
*/
export function getExistingDirectory(
options: OpenDirectoryDialog.IOptions
): Promise<Dialog.IResult<Contents.IModel[]>> {
return getOpenFiles({
...options,
filter: model => false
});
export namespace FilterFileBrowserModel {
/**
* Constructor options
*/
export interface IOptions extends FileBrowserModel.IOptions {
/**
* Filter function on file browser item model
*/
filter?: (value: Contents.IModel) => boolean;
}
}

/**
Expand Down Expand Up @@ -149,42 +198,6 @@ class OpenDialog extends Widget
private _browser: FileBrowser;
}

export namespace OpenDirectoryDialog {
export interface IOptions
extends Partial<
Pick<
Dialog.IOptions<Promise<Contents.IModel[]>>,
Exclude<
keyof Dialog.IOptions<Promise<Contents.IModel[]>>,
'body' | 'buttons' | 'defaultButton'
>
>
> {
/**
* Document manager
*/
manager: IDocumentManager;
}
}

export namespace OpenFileDialog {
export interface IOptions extends OpenDirectoryDialog.IOptions {
/**
* Filter function on file browser item model
*/
filter?: (value: Contents.IModel) => boolean;
}
}

namespace FilterFileBrowserModel {
export interface IOptions extends FileBrowserModel.IOptions {
/**
* Filter function on file browser item model
*/
filter?: (value: Contents.IModel) => boolean;
}
}

namespace Private {
/**
* Create a new file browser instance.
Expand Down
26 changes: 11 additions & 15 deletions tests/test-filebrowser/src/openfiledialog.spec.ts
Expand Up @@ -5,11 +5,7 @@ import { toArray } from '@phosphor/algorithm';

import { DocumentManager, IDocumentManager } from '@jupyterlab/docmanager';
import { DocumentRegistry, TextModelFactory } from '@jupyterlab/docregistry';
import {
getExistingDirectory,
getOpenFiles,
FilterFileBrowserModel
} from '@jupyterlab/filebrowser';
import { FileDialog, FilterFileBrowserModel } from '@jupyterlab/filebrowser';
import { ServiceManager } from '@jupyterlab/services';
import { expect } from 'chai';
import {
Expand Down Expand Up @@ -102,9 +98,9 @@ describe('@jupyterlab/filebrowser', () => {
});
});

describe('getOpenFiles()', () => {
describe('FileDialog.getOpenFiles()', () => {
it('should create a dialog', async () => {
let dialog = getOpenFiles({
let dialog = FileDialog.getOpenFiles({
manager
});

Expand All @@ -121,7 +117,7 @@ describe('@jupyterlab/filebrowser', () => {

document.body.appendChild(node);

let dialog = getOpenFiles({
let dialog = FileDialog.getOpenFiles({
manager,
title: 'Select a notebook',
host: node,
Expand All @@ -144,7 +140,7 @@ describe('@jupyterlab/filebrowser', () => {

document.body.appendChild(node);

let dialog = getOpenFiles({
let dialog = FileDialog.getOpenFiles({
manager,
title: 'Select a notebook',
host: node,
Expand Down Expand Up @@ -185,7 +181,7 @@ describe('@jupyterlab/filebrowser', () => {
});

it('should return current path if nothing is selected', async () => {
let dialog = getOpenFiles({
let dialog = FileDialog.getOpenFiles({
manager
});

Expand All @@ -200,9 +196,9 @@ describe('@jupyterlab/filebrowser', () => {
});
});

describe('getExistingDirectory()', () => {
describe('FileDialog.getExistingDirectory()', () => {
it('should create a dialog', async () => {
let dialog = getExistingDirectory({
let dialog = FileDialog.getExistingDirectory({
manager
});

Expand All @@ -219,7 +215,7 @@ describe('@jupyterlab/filebrowser', () => {

document.body.appendChild(node);

let dialog = getExistingDirectory({
let dialog = FileDialog.getExistingDirectory({
manager,
title: 'Select a folder',
host: node
Expand All @@ -240,7 +236,7 @@ describe('@jupyterlab/filebrowser', () => {

document.body.appendChild(node);

let dialog = getExistingDirectory({
let dialog = FileDialog.getExistingDirectory({
manager,
title: 'Select a folder',
host: node
Expand Down Expand Up @@ -280,7 +276,7 @@ describe('@jupyterlab/filebrowser', () => {
});

it('should return current path if nothing is selected', async () => {
let dialog = getExistingDirectory({
let dialog = FileDialog.getExistingDirectory({
manager
});

Expand Down

0 comments on commit 71d21ce

Please sign in to comment.