@jupyterlab/workspaces-extension 4.2.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/commands.d.ts +7 -0
- package/lib/commands.js +475 -0
- package/lib/commands.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +40 -0
- package/lib/index.js.map +1 -0
- package/lib/sidebar.d.ts +5 -0
- package/lib/sidebar.js +75 -0
- package/lib/sidebar.js.map +1 -0
- package/package.json +62 -0
- package/schema/menu.json +70 -0
- package/schema/sidebar.json +51 -0
- package/src/commands.ts +597 -0
- package/src/index.ts +58 -0
- package/src/sidebar.ts +106 -0
- package/style/index.css +11 -0
- package/style/index.js +11 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { JupyterFrontEndPlugin } from '@jupyterlab/application';
|
|
2
|
+
import { IWorkspaceCommands } from '@jupyterlab/workspaces';
|
|
3
|
+
export declare const WORKSPACE_ITEM_CLASS = "jp-mod-workspace";
|
|
4
|
+
/**
|
|
5
|
+
* The workspace commands
|
|
6
|
+
*/
|
|
7
|
+
export declare const commandsPlugin: JupyterFrontEndPlugin<IWorkspaceCommands>;
|
package/lib/commands.js
ADDED
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
// Copyright (c) Jupyter Development Team.
|
|
2
|
+
// Distributed under the terms of the Modified BSD License.
|
|
3
|
+
import { IRouter, JupyterFrontEnd } from '@jupyterlab/application';
|
|
4
|
+
import { Dialog, InputDialog, IWindowResolver, showDialog } from '@jupyterlab/apputils';
|
|
5
|
+
import { URLExt } from '@jupyterlab/coreutils';
|
|
6
|
+
import { FileDialog, IDefaultFileBrowser } from '@jupyterlab/filebrowser';
|
|
7
|
+
import { IStateDB } from '@jupyterlab/statedb';
|
|
8
|
+
import { ITranslator, nullTranslator } from '@jupyterlab/translation';
|
|
9
|
+
import { ICommandPalette } from '@jupyterlab/apputils';
|
|
10
|
+
import { IWorkspaceCommands, IWorkspacesModel } from '@jupyterlab/workspaces';
|
|
11
|
+
var CommandIDs;
|
|
12
|
+
(function (CommandIDs) {
|
|
13
|
+
/**
|
|
14
|
+
* Open a workspace by identifier. When no identifier is supplied, falls back to a simple choice dialog.
|
|
15
|
+
*/
|
|
16
|
+
CommandIDs.open = 'workspace-ui:open';
|
|
17
|
+
/**
|
|
18
|
+
* Save the current workspace.
|
|
19
|
+
*/
|
|
20
|
+
CommandIDs.save = 'workspace-ui:save';
|
|
21
|
+
/**
|
|
22
|
+
* Save the current workspace under a different path.
|
|
23
|
+
*/
|
|
24
|
+
CommandIDs.saveAs = 'workspace-ui:save-as';
|
|
25
|
+
/**
|
|
26
|
+
* Create a new workspace.
|
|
27
|
+
*/
|
|
28
|
+
CommandIDs.createNew = 'workspace-ui:create-new';
|
|
29
|
+
/**
|
|
30
|
+
* Delete a workspace.
|
|
31
|
+
*/
|
|
32
|
+
CommandIDs.deleteWorkspace = 'workspace-ui:delete';
|
|
33
|
+
/**
|
|
34
|
+
* Clone a given workspace.
|
|
35
|
+
*/
|
|
36
|
+
CommandIDs.clone = 'workspace-ui:clone';
|
|
37
|
+
/**
|
|
38
|
+
* Rename a workspace.
|
|
39
|
+
*/
|
|
40
|
+
CommandIDs.rename = 'workspace-ui:rename';
|
|
41
|
+
/**
|
|
42
|
+
* Reset a workspace.
|
|
43
|
+
*/
|
|
44
|
+
CommandIDs.reset = 'workspace-ui:reset';
|
|
45
|
+
/**
|
|
46
|
+
* Import a workspace.
|
|
47
|
+
*/
|
|
48
|
+
CommandIDs.importWorkspace = 'workspace-ui:import';
|
|
49
|
+
/**
|
|
50
|
+
* Export a workspace.
|
|
51
|
+
*/
|
|
52
|
+
CommandIDs.exportWorkspace = 'workspace-ui:export';
|
|
53
|
+
})(CommandIDs || (CommandIDs = {}));
|
|
54
|
+
const WORKSPACE_NAME = 'jupyterlab-workspace';
|
|
55
|
+
const WORKSPACE_EXT = '.' + WORKSPACE_NAME;
|
|
56
|
+
const LAST_SAVE_ID = 'workspace-ui:lastSave';
|
|
57
|
+
export const WORKSPACE_ITEM_CLASS = 'jp-mod-workspace';
|
|
58
|
+
/**
|
|
59
|
+
* The workspace commands
|
|
60
|
+
*/
|
|
61
|
+
export const commandsPlugin = {
|
|
62
|
+
id: '@jupyterlab/workspaces:commands',
|
|
63
|
+
description: 'Add workspace commands.',
|
|
64
|
+
autoStart: true,
|
|
65
|
+
requires: [
|
|
66
|
+
IWorkspacesModel,
|
|
67
|
+
IDefaultFileBrowser,
|
|
68
|
+
IWindowResolver,
|
|
69
|
+
IStateDB,
|
|
70
|
+
ITranslator,
|
|
71
|
+
JupyterFrontEnd.IPaths
|
|
72
|
+
],
|
|
73
|
+
provides: IWorkspaceCommands,
|
|
74
|
+
optional: [IRouter, ICommandPalette],
|
|
75
|
+
activate: (app, model, fileBrowser, resolver, state, translator, paths, router, palette) => {
|
|
76
|
+
const trans = translator.load('jupyterlab');
|
|
77
|
+
const namingHintLabel = trans.__('Naming the workspace will create a unique URL. The name may contain letters, numbers, hyphens (-), and underscores (_).');
|
|
78
|
+
const workspacesBase = URLExt.join(paths.urls.app, 'workspaces');
|
|
79
|
+
const resourcePrefix = workspacesBase + '/';
|
|
80
|
+
// `-` needs double backslashes to be escaped in `v` mode used for patterns
|
|
81
|
+
const namePattern = '[a-zA-Z0-9\\-_]+';
|
|
82
|
+
const getNameForWorkspace = async (options) => {
|
|
83
|
+
return InputDialog.getText({
|
|
84
|
+
label: namingHintLabel,
|
|
85
|
+
prefix: resourcePrefix,
|
|
86
|
+
pattern: namePattern,
|
|
87
|
+
required: true,
|
|
88
|
+
placeholder: trans.__('workspace-name'),
|
|
89
|
+
...options
|
|
90
|
+
});
|
|
91
|
+
};
|
|
92
|
+
const test = (node) => node.classList.contains(WORKSPACE_ITEM_CLASS);
|
|
93
|
+
app.commands.addCommand(CommandIDs.open, {
|
|
94
|
+
label: args => {
|
|
95
|
+
const workspaceId = args.workspace;
|
|
96
|
+
return workspaceId
|
|
97
|
+
? trans.__('Open Workspace')
|
|
98
|
+
: trans.__('Open Workspace…');
|
|
99
|
+
},
|
|
100
|
+
execute: async (args) => {
|
|
101
|
+
let workspaceId = args.workspace;
|
|
102
|
+
if (!workspaceId) {
|
|
103
|
+
const result = await InputDialog.getItem({
|
|
104
|
+
title: trans.__('Choose Workspace To Open'),
|
|
105
|
+
label: trans.__('Choose an existing workspace to open.'),
|
|
106
|
+
items: model.identifiers,
|
|
107
|
+
okLabel: trans.__('Choose'),
|
|
108
|
+
prefix: resourcePrefix
|
|
109
|
+
});
|
|
110
|
+
if (!result.value || !result.button.accept) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
workspaceId = result.value;
|
|
114
|
+
}
|
|
115
|
+
if (!workspaceId) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const url = URLExt.join(workspacesBase, workspaceId);
|
|
119
|
+
if (!url.startsWith(workspacesBase)) {
|
|
120
|
+
throw new Error('Can only be used for workspaces');
|
|
121
|
+
}
|
|
122
|
+
if (router) {
|
|
123
|
+
router.navigate(url, { hard: true });
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
document.location.href = url;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
app.commands.addCommand(CommandIDs.deleteWorkspace, {
|
|
131
|
+
label: trans.__('Delete Workspace…'),
|
|
132
|
+
execute: async (args) => {
|
|
133
|
+
var _a;
|
|
134
|
+
const node = app.contextMenuHitTest(test);
|
|
135
|
+
let workspaceId = (_a = args.workspace) !== null && _a !== void 0 ? _a : node === null || node === void 0 ? void 0 : node.dataset['context'];
|
|
136
|
+
if (!workspaceId) {
|
|
137
|
+
const result = await InputDialog.getItem({
|
|
138
|
+
title: trans.__('Choose Workspace To Delete'),
|
|
139
|
+
label: trans.__('Choose an existing workspace to delete.'),
|
|
140
|
+
items: model.identifiers,
|
|
141
|
+
okLabel: trans.__('Choose')
|
|
142
|
+
});
|
|
143
|
+
if (!result.value || !result.button.accept) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
workspaceId = result.value;
|
|
147
|
+
}
|
|
148
|
+
if (!workspaceId) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const result = await showDialog({
|
|
152
|
+
title: trans.__('Delete workspace'),
|
|
153
|
+
body: trans.__('Deleting workspace "%1" will also delete its URL. A deleted workspace cannot be recovered.', workspaceId),
|
|
154
|
+
buttons: [
|
|
155
|
+
Dialog.cancelButton(),
|
|
156
|
+
Dialog.warnButton({ label: trans.__('Delete') })
|
|
157
|
+
],
|
|
158
|
+
defaultButton: 0
|
|
159
|
+
});
|
|
160
|
+
if (result.button.accept) {
|
|
161
|
+
await model.remove(workspaceId);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
app.commands.addCommand(CommandIDs.createNew, {
|
|
166
|
+
label: trans.__('Create New Workspace…'),
|
|
167
|
+
execute: async (args) => {
|
|
168
|
+
let workspaceId = args.workspace;
|
|
169
|
+
if (!workspaceId) {
|
|
170
|
+
const result = await getNameForWorkspace({
|
|
171
|
+
title: trans.__('Create New Workspace'),
|
|
172
|
+
okLabel: trans.__('Create')
|
|
173
|
+
});
|
|
174
|
+
if (!result.value || !result.button.accept) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
workspaceId = result.value;
|
|
178
|
+
}
|
|
179
|
+
if (!workspaceId) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
await model.create(workspaceId);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
app.commands.addCommand(CommandIDs.clone, {
|
|
186
|
+
label: trans.__('Clone Workspace…'),
|
|
187
|
+
execute: async (args) => {
|
|
188
|
+
var _a;
|
|
189
|
+
const node = app.contextMenuHitTest(test);
|
|
190
|
+
let workspaceId = (_a = args.workspace) !== null && _a !== void 0 ? _a : node === null || node === void 0 ? void 0 : node.dataset['context'];
|
|
191
|
+
if (!workspaceId) {
|
|
192
|
+
const result = await InputDialog.getItem({
|
|
193
|
+
title: trans.__('Choose Workspace To Clone'),
|
|
194
|
+
label: trans.__('Choose an existing workspace to clone.'),
|
|
195
|
+
items: model.identifiers,
|
|
196
|
+
okLabel: trans.__('Choose')
|
|
197
|
+
});
|
|
198
|
+
if (!result.value || !result.button.accept) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
workspaceId = result.value;
|
|
202
|
+
}
|
|
203
|
+
const result = await getNameForWorkspace({
|
|
204
|
+
title: trans.__('Clone Workspace'),
|
|
205
|
+
text: trans.__('%1-clone', workspaceId),
|
|
206
|
+
okLabel: trans.__('Clone')
|
|
207
|
+
});
|
|
208
|
+
if (!result.button.accept || !result.value) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
let newName = result.value;
|
|
212
|
+
await model.saveAs(workspaceId, newName);
|
|
213
|
+
if (workspaceId === resolver.name) {
|
|
214
|
+
// If the current workspace was cloned, open the cloned copy
|
|
215
|
+
return app.commands.execute(CommandIDs.open, { workspace: newName });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
app.commands.addCommand(CommandIDs.rename, {
|
|
220
|
+
label: trans.__('Rename Workspace…'),
|
|
221
|
+
execute: async (args) => {
|
|
222
|
+
var _a, _b;
|
|
223
|
+
const node = app.contextMenuHitTest(test);
|
|
224
|
+
const workspaceId = (_b = (_a = args.workspace) !== null && _a !== void 0 ? _a : node === null || node === void 0 ? void 0 : node.dataset['context']) !== null && _b !== void 0 ? _b : resolver.name;
|
|
225
|
+
const oldName = workspaceId;
|
|
226
|
+
const result = await getNameForWorkspace({
|
|
227
|
+
title: trans.__('Rename Workspace'),
|
|
228
|
+
text: oldName,
|
|
229
|
+
okLabel: trans.__('Rename')
|
|
230
|
+
});
|
|
231
|
+
if (!result.button.accept || !result.value) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
let newName = result.value;
|
|
235
|
+
await model.rename(workspaceId, newName);
|
|
236
|
+
if (workspaceId === resolver.name) {
|
|
237
|
+
// If the current workspace was renamed, reopen it to ensure consistent state
|
|
238
|
+
return app.commands.execute(CommandIDs.open, { workspace: newName });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
app.commands.addCommand(CommandIDs.reset, {
|
|
243
|
+
label: trans.__('Reset Workspace…'),
|
|
244
|
+
execute: async (args) => {
|
|
245
|
+
var _a, _b, _c, _d, _e, _f;
|
|
246
|
+
const node = app.contextMenuHitTest(test);
|
|
247
|
+
const workspaceId = (_b = (_a = args.workspace) !== null && _a !== void 0 ? _a : node === null || node === void 0 ? void 0 : node.dataset['context']) !== null && _b !== void 0 ? _b : resolver.name;
|
|
248
|
+
const workspace = await app.serviceManager.workspaces.fetch(workspaceId);
|
|
249
|
+
const tabs = (_f = (_e = (_d = (_c = workspace.data['layout-restorer:data']) === null || _c === void 0 ? void 0 : _c.main) === null || _d === void 0 ? void 0 : _d.dock) === null || _e === void 0 ? void 0 : _e.widgets) === null || _f === void 0 ? void 0 : _f.length;
|
|
250
|
+
const result = await showDialog({
|
|
251
|
+
title: trans.__('Reset Workspace'),
|
|
252
|
+
body: trans._n('Resetting workspace %2 will close its %1 tab and return to default layout.', 'Resetting workspace %2 will close its %1 tabs and return to default layout.', tabs, workspaceId),
|
|
253
|
+
buttons: [
|
|
254
|
+
Dialog.cancelButton(),
|
|
255
|
+
Dialog.warnButton({ label: trans.__('Reset') })
|
|
256
|
+
],
|
|
257
|
+
defaultButton: 0
|
|
258
|
+
});
|
|
259
|
+
if (!result.button.accept) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
await model.reset(workspaceId);
|
|
263
|
+
if (workspaceId === resolver.name) {
|
|
264
|
+
// If the current workspace was reset, refresh it to take effect
|
|
265
|
+
return app.commands.execute(CommandIDs.open, {
|
|
266
|
+
workspace: workspaceId
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
await model.refresh();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
/**
|
|
275
|
+
* Commands persisting (or reading from) Jupyter file system
|
|
276
|
+
*/
|
|
277
|
+
app.commands.addCommand(CommandIDs.importWorkspace, {
|
|
278
|
+
label: trans.__('Import Workspace…'),
|
|
279
|
+
execute: async () => {
|
|
280
|
+
const { contents } = app.serviceManager;
|
|
281
|
+
const result = await FileDialog.getOpenFiles({
|
|
282
|
+
manager: fileBrowser.model.manager,
|
|
283
|
+
title: trans.__('Select Workspace Files to Import'),
|
|
284
|
+
filter: (model) => model.type === 'directory' || model.path.endsWith(WORKSPACE_EXT)
|
|
285
|
+
? {}
|
|
286
|
+
: null,
|
|
287
|
+
label: trans.__('You choose one or more workspace files to import. A Jupyter Workspace File has %1 extension.', WORKSPACE_EXT),
|
|
288
|
+
translator
|
|
289
|
+
});
|
|
290
|
+
if (result.button.accept && result.value && result.value.length >= 1) {
|
|
291
|
+
for (const fileModel of result.value) {
|
|
292
|
+
// Get the file contents too
|
|
293
|
+
const fullFile = await contents.get(fileModel.path, {
|
|
294
|
+
content: true
|
|
295
|
+
});
|
|
296
|
+
const workspace = JSON.parse(fullFile.content);
|
|
297
|
+
await app.serviceManager.workspaces.save(workspace.metadata.id, workspace);
|
|
298
|
+
}
|
|
299
|
+
await model.refresh();
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
app.commands.addCommand(CommandIDs.exportWorkspace, {
|
|
304
|
+
label: trans.__('Export Workspace…'),
|
|
305
|
+
execute: async (args) => {
|
|
306
|
+
var _a, _b;
|
|
307
|
+
const { contents } = app.serviceManager;
|
|
308
|
+
const node = app.contextMenuHitTest(test);
|
|
309
|
+
let workspaceId = (_b = (_a = args.workspace) !== null && _a !== void 0 ? _a : node === null || node === void 0 ? void 0 : node.dataset['context']) !== null && _b !== void 0 ? _b : resolver.name;
|
|
310
|
+
if (!workspaceId) {
|
|
311
|
+
// When invoked from main menu or command palette we need to ask which workspace to export
|
|
312
|
+
const result = await InputDialog.getItem({
|
|
313
|
+
title: trans.__('Choose Workspace To Export'),
|
|
314
|
+
label: trans.__('Choose an existing workspace to export.'),
|
|
315
|
+
items: model.identifiers,
|
|
316
|
+
okLabel: trans.__('Choose')
|
|
317
|
+
});
|
|
318
|
+
if (!result.value || !result.button.accept) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
workspaceId = result.value;
|
|
322
|
+
}
|
|
323
|
+
const data = app.serviceManager.workspaces.fetch(workspaceId);
|
|
324
|
+
const result = await FileDialog.getExistingDirectory({
|
|
325
|
+
title: trans.__('Choose Workspace Export Directory'),
|
|
326
|
+
defaultPath: fileBrowser.model.path,
|
|
327
|
+
manager: fileBrowser.model.manager,
|
|
328
|
+
label: trans.__('The "%1" workspace will be saved in the chosen directory as "%1%2".', workspaceId, WORKSPACE_EXT),
|
|
329
|
+
translator
|
|
330
|
+
});
|
|
331
|
+
if (!result.button.accept ||
|
|
332
|
+
!result.value ||
|
|
333
|
+
result.value.length === 0) {
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
if (result.value.length > 1) {
|
|
337
|
+
console.warn('More than one directory was selected; the workspace will be exported to the first directory only');
|
|
338
|
+
}
|
|
339
|
+
const exportPath = result.value[0].path + '/' + workspaceId + WORKSPACE_EXT;
|
|
340
|
+
if (exportPath) {
|
|
341
|
+
await Private.save(exportPath, contents, data, state, false);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
app.commands.addCommand(CommandIDs.saveAs, {
|
|
346
|
+
label: trans.__('Save Current Workspace As…'),
|
|
347
|
+
execute: async () => {
|
|
348
|
+
const { contents } = app.serviceManager;
|
|
349
|
+
const data = app.serviceManager.workspaces.fetch(resolver.name);
|
|
350
|
+
await Private.saveAs(fileBrowser, contents, data, state, translator);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
app.commands.addCommand(CommandIDs.save, {
|
|
354
|
+
label: trans.__('Save Current Workspace…'),
|
|
355
|
+
execute: async () => {
|
|
356
|
+
const { contents } = app.serviceManager;
|
|
357
|
+
const data = app.serviceManager.workspaces.fetch(resolver.name);
|
|
358
|
+
const lastSave = (await state.fetch(LAST_SAVE_ID));
|
|
359
|
+
if (lastSave === undefined) {
|
|
360
|
+
await Private.saveAs(fileBrowser, contents, data, state, translator);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
await Private.save(lastSave, contents, data, state);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
});
|
|
367
|
+
if (palette) {
|
|
368
|
+
const category = trans.__('Workspaces');
|
|
369
|
+
const commands = [
|
|
370
|
+
CommandIDs.open,
|
|
371
|
+
CommandIDs.save,
|
|
372
|
+
CommandIDs.saveAs,
|
|
373
|
+
CommandIDs.createNew,
|
|
374
|
+
CommandIDs.rename,
|
|
375
|
+
CommandIDs.clone,
|
|
376
|
+
CommandIDs.exportWorkspace,
|
|
377
|
+
CommandIDs.importWorkspace,
|
|
378
|
+
CommandIDs.reset,
|
|
379
|
+
CommandIDs.deleteWorkspace
|
|
380
|
+
];
|
|
381
|
+
for (const command of commands) {
|
|
382
|
+
palette.addItem({
|
|
383
|
+
command,
|
|
384
|
+
category
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return {
|
|
389
|
+
open: CommandIDs.open,
|
|
390
|
+
deleteWorkspace: CommandIDs.deleteWorkspace
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
var Private;
|
|
395
|
+
(function (Private) {
|
|
396
|
+
function createNameFromPath(path) {
|
|
397
|
+
let name = path.split('/').pop();
|
|
398
|
+
if (name === undefined) {
|
|
399
|
+
return 'unnamed-workspace';
|
|
400
|
+
}
|
|
401
|
+
// Remove the workspace suffix if present
|
|
402
|
+
if (name.endsWith(WORKSPACE_EXT)) {
|
|
403
|
+
name = name.slice(0, -WORKSPACE_EXT.length);
|
|
404
|
+
}
|
|
405
|
+
return name;
|
|
406
|
+
}
|
|
407
|
+
Private.createNameFromPath = createNameFromPath;
|
|
408
|
+
/**
|
|
409
|
+
* Save workspace to a user provided location
|
|
410
|
+
*/
|
|
411
|
+
async function save(userPath, contents, data, state, rememberAsLastSave = true) {
|
|
412
|
+
const name = createNameFromPath(userPath);
|
|
413
|
+
// Add extension if not provided
|
|
414
|
+
if (!userPath.endsWith(WORKSPACE_EXT)) {
|
|
415
|
+
userPath = userPath + WORKSPACE_EXT;
|
|
416
|
+
}
|
|
417
|
+
if (rememberAsLastSave) {
|
|
418
|
+
// Save last save location, for save button to work
|
|
419
|
+
await state.save(LAST_SAVE_ID, userPath);
|
|
420
|
+
}
|
|
421
|
+
const resolvedData = await data;
|
|
422
|
+
resolvedData.metadata.id = `${name}`;
|
|
423
|
+
await contents.save(userPath, {
|
|
424
|
+
type: 'file',
|
|
425
|
+
format: 'text',
|
|
426
|
+
content: JSON.stringify(resolvedData)
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
Private.save = save;
|
|
430
|
+
/**
|
|
431
|
+
* Ask user for location, and save workspace.
|
|
432
|
+
* Default location is the current directory in the file browser
|
|
433
|
+
*/
|
|
434
|
+
async function saveAs(browser, contents, data, state, translator) {
|
|
435
|
+
var _a;
|
|
436
|
+
translator = translator || nullTranslator;
|
|
437
|
+
const lastSave = await state.fetch(LAST_SAVE_ID);
|
|
438
|
+
let defaultName;
|
|
439
|
+
if (lastSave === undefined) {
|
|
440
|
+
defaultName = 'new-workspace';
|
|
441
|
+
}
|
|
442
|
+
else {
|
|
443
|
+
defaultName = (_a = lastSave.split('/').pop()) === null || _a === void 0 ? void 0 : _a.split('.')[0];
|
|
444
|
+
}
|
|
445
|
+
const defaultPath = browser.model.path + '/' + defaultName + WORKSPACE_EXT;
|
|
446
|
+
const userPath = await getSavePath(defaultPath, translator);
|
|
447
|
+
if (userPath) {
|
|
448
|
+
await save(userPath, contents, data, state);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
Private.saveAs = saveAs;
|
|
452
|
+
/**
|
|
453
|
+
* Ask user for a path to save to.
|
|
454
|
+
* @param defaultPath Path already present when the dialog is shown
|
|
455
|
+
*/
|
|
456
|
+
async function getSavePath(defaultPath, translator) {
|
|
457
|
+
translator = translator || nullTranslator;
|
|
458
|
+
const trans = translator.load('jupyterlab');
|
|
459
|
+
const result = await InputDialog.getText({
|
|
460
|
+
title: trans.__('Save Current Workspace As…'),
|
|
461
|
+
text: defaultPath,
|
|
462
|
+
placeholder: trans.__('Path to save the workspace in'),
|
|
463
|
+
okLabel: trans.__('Save'),
|
|
464
|
+
// select the path without extension
|
|
465
|
+
selectionRange: defaultPath.length - WORKSPACE_EXT.length
|
|
466
|
+
});
|
|
467
|
+
if (result.button.accept) {
|
|
468
|
+
return result.value;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
})(Private || (Private = {}));
|
|
475
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* @module workspaces-extension
|
|
4
|
+
*/
|
|
5
|
+
import { JupyterFrontEndPlugin } from '@jupyterlab/application';
|
|
6
|
+
/**
|
|
7
|
+
* Export the plugins as default.
|
|
8
|
+
*/
|
|
9
|
+
declare const plugins: JupyterFrontEndPlugin<any>[];
|
|
10
|
+
export default plugins;
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { IWorkspaceCommands, IWorkspacesModel, WorkspacesModel } from '@jupyterlab/workspaces';
|
|
2
|
+
import { commandsPlugin } from './commands';
|
|
3
|
+
import { workspacesSidebar } from './sidebar';
|
|
4
|
+
/**
|
|
5
|
+
* The extension populating sidebar with workspaces list.
|
|
6
|
+
*/
|
|
7
|
+
const workspacesModel = {
|
|
8
|
+
id: '@jupyterlab/workspaces-extension:model',
|
|
9
|
+
description: 'Provides a model for available workspaces.',
|
|
10
|
+
provides: IWorkspacesModel,
|
|
11
|
+
autoStart: true,
|
|
12
|
+
activate: (app) => {
|
|
13
|
+
return new WorkspacesModel({
|
|
14
|
+
manager: app.serviceManager.workspaces
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The extension providing workspace sub-menu in the "File" main menu.
|
|
20
|
+
*/
|
|
21
|
+
const workspacesMenu = {
|
|
22
|
+
id: '@jupyterlab/workspaces-extension:menu',
|
|
23
|
+
description: 'Populates "File" main menu with Workspaces submenu.',
|
|
24
|
+
requires: [IWorkspaceCommands],
|
|
25
|
+
autoStart: true,
|
|
26
|
+
activate: () => {
|
|
27
|
+
// no-op - the menu items come from schema matching the name of the plugin
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Export the plugins as default.
|
|
32
|
+
*/
|
|
33
|
+
const plugins = [
|
|
34
|
+
workspacesModel,
|
|
35
|
+
commandsPlugin,
|
|
36
|
+
workspacesSidebar,
|
|
37
|
+
workspacesMenu
|
|
38
|
+
];
|
|
39
|
+
export default plugins;
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C;;GAEG;AACH,MAAM,eAAe,GAA4C;IAC/D,EAAE,EAAE,wCAAwC;IAC5C,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,gBAAgB;IAC1B,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,CAAC,GAAoB,EAAE,EAAE;QACjC,OAAO,IAAI,eAAe,CAAC;YACzB,OAAO,EAAE,GAAG,CAAC,cAAc,CAAC,UAAU;SACvC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,cAAc,GAAgC;IAClD,EAAE,EAAE,uCAAuC;IAC3C,WAAW,EAAE,qDAAqD;IAClE,QAAQ,EAAE,CAAC,kBAAkB,CAAC;IAC9B,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,GAAG,EAAE;QACb,0EAA0E;IAC5E,CAAC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,GAAiC;IAC5C,eAAe;IACf,cAAc;IACd,iBAAiB;IACjB,cAAc;CACf,CAAC;AACF,eAAe,OAAO,CAAC"}
|
package/lib/sidebar.d.ts
ADDED
package/lib/sidebar.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { IWindowResolver } from '@jupyterlab/apputils';
|
|
2
|
+
import { IWorkspaceCommands, IWorkspacesModel } from '@jupyterlab/workspaces';
|
|
3
|
+
import { IRunningSessionManagers } from '@jupyterlab/running';
|
|
4
|
+
import { ITranslator, nullTranslator } from '@jupyterlab/translation';
|
|
5
|
+
import { WORKSPACE_ITEM_CLASS } from './commands';
|
|
6
|
+
import { blankIcon, checkIcon, deleteIcon } from '@jupyterlab/ui-components';
|
|
7
|
+
/**
|
|
8
|
+
* The extension populating sidebar with workspaces list.
|
|
9
|
+
*/
|
|
10
|
+
export const workspacesSidebar = {
|
|
11
|
+
id: '@jupyterlab/workspaces-extension:sidebar',
|
|
12
|
+
description: 'Populates running sidebar with workspaces.',
|
|
13
|
+
requires: [
|
|
14
|
+
IWorkspaceCommands,
|
|
15
|
+
IWorkspacesModel,
|
|
16
|
+
IRunningSessionManagers,
|
|
17
|
+
IWindowResolver
|
|
18
|
+
],
|
|
19
|
+
optional: [ITranslator],
|
|
20
|
+
autoStart: true,
|
|
21
|
+
activate: async (app, commands, model, managers, resolver, translator) => {
|
|
22
|
+
const trans = (translator !== null && translator !== void 0 ? translator : nullTranslator).load('jupyterlab');
|
|
23
|
+
class WorkspaceItem {
|
|
24
|
+
constructor(workspace) {
|
|
25
|
+
this._workspace = workspace;
|
|
26
|
+
this.context = workspace.metadata.id;
|
|
27
|
+
this.className = WORKSPACE_ITEM_CLASS;
|
|
28
|
+
}
|
|
29
|
+
open() {
|
|
30
|
+
return app.commands.execute(commands.open, {
|
|
31
|
+
workspace: this._workspace.metadata.id
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async shutdown() {
|
|
35
|
+
await app.commands.execute(commands.deleteWorkspace, {
|
|
36
|
+
workspace: this._workspace.metadata.id
|
|
37
|
+
});
|
|
38
|
+
await model.refresh();
|
|
39
|
+
}
|
|
40
|
+
icon() {
|
|
41
|
+
return resolver.name === this._workspace.metadata.id
|
|
42
|
+
? checkIcon
|
|
43
|
+
: blankIcon;
|
|
44
|
+
}
|
|
45
|
+
label() {
|
|
46
|
+
return this._workspace.metadata.id;
|
|
47
|
+
}
|
|
48
|
+
labelTitle() {
|
|
49
|
+
var _a, _b, _c, _d;
|
|
50
|
+
return trans.__('%1 workspace with %2 tabs, last modified on %3', this._workspace.metadata.id, (_d = (_c = (_b = (_a = this._workspace.data['layout-restorer:data']) === null || _a === void 0 ? void 0 : _a.main) === null || _b === void 0 ? void 0 : _b.dock) === null || _c === void 0 ? void 0 : _c.widgets) === null || _d === void 0 ? void 0 : _d.length, this._workspace.metadata['last_modified']);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
managers.add({
|
|
54
|
+
name: trans.__('Workspaces'),
|
|
55
|
+
running: () => {
|
|
56
|
+
return model.workspaces.map((workspace) => {
|
|
57
|
+
return new WorkspaceItem(workspace);
|
|
58
|
+
});
|
|
59
|
+
},
|
|
60
|
+
shutdownAll: async () => {
|
|
61
|
+
await Promise.all(model.workspaces.map(workspace => model.remove(workspace.metadata.id)));
|
|
62
|
+
await model.refresh();
|
|
63
|
+
},
|
|
64
|
+
shutdownItemIcon: deleteIcon,
|
|
65
|
+
refreshRunning: async () => {
|
|
66
|
+
await model.refresh();
|
|
67
|
+
},
|
|
68
|
+
runningChanged: model.refreshed,
|
|
69
|
+
shutdownLabel: (item) => trans.__('Delete %1', item.label()),
|
|
70
|
+
shutdownAllLabel: trans.__('Delete All'),
|
|
71
|
+
shutdownAllConfirmationText: trans.__('Are you sure you want to delete all workspaces? Deleted workspaces cannot be recovered.')
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../src/sidebar.ts"],"names":[],"mappings":"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"}
|