@jupyterlab/settingeditor-extension 4.3.4 → 4.4.0-alpha.1

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.
@@ -0,0 +1,45 @@
1
+ import { ITranslator } from '@jupyterlab/translation';
2
+ import { ReactWidget } from '@jupyterlab/ui-components';
3
+ /**
4
+ * A namespace for ImportSettings.
5
+ */
6
+ declare namespace ImportSettings {
7
+ /**
8
+ * The props for the ImportSettings component.
9
+ */
10
+ interface IOptions {
11
+ importedSettings: string[];
12
+ handleImport: (settings: string[]) => void;
13
+ translator: ITranslator;
14
+ }
15
+ /**
16
+ * The props for the ImportSettings DialogBox body.
17
+ */
18
+ interface IDialogBodyBodyOptions {
19
+ successMessage: string;
20
+ failureMessage?: string;
21
+ failedSettings?: string[];
22
+ }
23
+ }
24
+ /**
25
+ * A widget for importing settings with checkboxes.
26
+ */
27
+ export declare class ImportSettingsWidget extends ReactWidget {
28
+ /**
29
+ * Constructs a new ImportSettingsWidget.
30
+ *
31
+ * @param importedSettings - The settings to display.
32
+ * @param handleImport - A callback for handling imports.
33
+ */
34
+ constructor(options: ImportSettings.IOptions);
35
+ render(): JSX.Element;
36
+ private importedSettings;
37
+ private handleImport;
38
+ private translator;
39
+ }
40
+ export declare class ImportSettingsDialogBodyWidget extends ReactWidget {
41
+ private _props;
42
+ constructor(_props: ImportSettings.IDialogBodyBodyOptions);
43
+ render(): JSX.Element;
44
+ }
45
+ export {};
@@ -0,0 +1,67 @@
1
+ /*
2
+ * Copyright (c) Jupyter Development Team.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+ import { ReactWidget } from '@jupyterlab/ui-components';
6
+ import React, { useState } from 'react';
7
+ const SettingsImport = (props) => {
8
+ const trans = props.translator.load('jupyterlab');
9
+ const [checkedStates, setCheckedStates] = useState(props.importedSettings.reduce((acc, key) => {
10
+ acc[key] = true;
11
+ return acc;
12
+ }, {}));
13
+ const handleCheckboxChange = (key, isChecked) => {
14
+ const updatedStates = { ...checkedStates, [key]: isChecked };
15
+ setCheckedStates(updatedStates);
16
+ };
17
+ return (React.createElement("div", { className: "jp-SettingsImport-container" },
18
+ React.createElement("div", { className: "jp-SettingsImport-header" },
19
+ React.createElement("span", { className: "jp-SettingsImport-title" }, trans.__('Select settings sections to import')),
20
+ React.createElement("button", { className: "jp-Button jp-mod-styled jp-mod-accept", onClick: () => {
21
+ props.handleImport(Object.keys(checkedStates).filter(key => !checkedStates[key]));
22
+ } }, trans.__('Import'))),
23
+ React.createElement("div", { className: "jp-SettingsImport-list" }, props.importedSettings.map(key => (React.createElement("label", { key: key, className: "jp-SettingsImport-item" },
24
+ React.createElement("span", { className: "jp-SettingsImport-itemKey" }, key),
25
+ React.createElement("input", { type: "checkbox", checked: checkedStates[key], onChange: e => handleCheckboxChange(key, e.target.checked), className: "jp-SettingsImport-checkbox" })))))));
26
+ };
27
+ /**
28
+ * A widget for importing settings with checkboxes.
29
+ */
30
+ export class ImportSettingsWidget extends ReactWidget {
31
+ /**
32
+ * Constructs a new ImportSettingsWidget.
33
+ *
34
+ * @param importedSettings - The settings to display.
35
+ * @param handleImport - A callback for handling imports.
36
+ */
37
+ constructor(options) {
38
+ const { importedSettings, handleImport, translator } = options;
39
+ super();
40
+ this.importedSettings = importedSettings;
41
+ this.handleImport = handleImport;
42
+ this.addClass('jp-SettingsImport-widget');
43
+ this.translator = translator;
44
+ }
45
+ render() {
46
+ return (React.createElement(SettingsImport, { importedSettings: this.importedSettings, handleImport: this.handleImport, translator: this.translator }));
47
+ }
48
+ }
49
+ const ImportSettingsDialogBody = (props) => {
50
+ return (React.createElement("div", null,
51
+ React.createElement("div", null, props.successMessage),
52
+ props.failureMessage && (React.createElement("div", null,
53
+ React.createElement("br", null),
54
+ React.createElement("div", null, props.failureMessage),
55
+ props.failedSettings &&
56
+ props.failedSettings.map((setting, index) => (React.createElement("div", { key: index }, setting)))))));
57
+ };
58
+ export class ImportSettingsDialogBodyWidget extends ReactWidget {
59
+ constructor(_props) {
60
+ super();
61
+ this._props = _props;
62
+ }
63
+ render() {
64
+ return React.createElement(ImportSettingsDialogBody, { ...this._props });
65
+ }
66
+ }
67
+ //# sourceMappingURL=importSettingsWidget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importSettingsWidget.js","sourceRoot":"","sources":["../src/importSettingsWidget.tsx"],"names":[],"mappings":"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"}
package/lib/index.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * @module settingeditor-extension
8
8
  */
9
9
  import { ILabStatus, ILayoutRestorer } from '@jupyterlab/application';
10
- import { ICommandPalette, MainAreaWidget, WidgetTracker } from '@jupyterlab/apputils';
10
+ import { Dialog, ICommandPalette, MainAreaWidget, showDialog, showErrorMessage, WidgetTracker } from '@jupyterlab/apputils';
11
11
  import { IEditorServices } from '@jupyterlab/codeeditor';
12
12
  import { CommandToolbarButton, IFormRendererRegistry, launchIcon, Toolbar, ToolbarButton } from '@jupyterlab/ui-components';
13
13
  import { IRenderMimeRegistry } from '@jupyterlab/rendermime';
@@ -16,7 +16,8 @@ import { IPluginManager } from '@jupyterlab/pluginmanager';
16
16
  import { ISettingRegistry } from '@jupyterlab/settingregistry';
17
17
  import { IStateDB } from '@jupyterlab/statedb';
18
18
  import { ITranslator } from '@jupyterlab/translation';
19
- import { saveIcon, settingsIcon, undoIcon } from '@jupyterlab/ui-components';
19
+ import { downloadIcon, fileUploadIcon, saveIcon, settingsIcon, undoIcon } from '@jupyterlab/ui-components';
20
+ import { ImportSettingsDialogBodyWidget, ImportSettingsWidget } from './importSettingsWidget';
20
21
  /**
21
22
  * The command IDs used by the setting editor.
22
23
  */
@@ -26,6 +27,8 @@ var CommandIDs;
26
27
  CommandIDs.openJSON = 'settingeditor:open-json';
27
28
  CommandIDs.revert = 'settingeditor:revert';
28
29
  CommandIDs.save = 'settingeditor:save';
30
+ CommandIDs.exportSettings = 'settingeditor:export';
31
+ CommandIDs.importSettings = 'settingeditor:import';
29
32
  })(CommandIDs || (CommandIDs = {}));
30
33
  /**
31
34
  * The default setting editor extension.
@@ -94,6 +97,20 @@ function activate(app, registry, state, translator, editorRegistry, status, rest
94
97
  query: args.query
95
98
  })
96
99
  });
100
+ editor.toolbar.addItem('export-settings', new CommandToolbarButton({
101
+ commands,
102
+ id: CommandIDs.exportSettings,
103
+ icon: downloadIcon,
104
+ label: trans.__('Export'),
105
+ caption: trans.__('Export settings to a JSON file')
106
+ }));
107
+ editor.toolbar.addItem('import-settings', new CommandToolbarButton({
108
+ commands,
109
+ id: CommandIDs.importSettings,
110
+ icon: fileUploadIcon,
111
+ label: trans.__('Import'),
112
+ caption: trans.__('Import settings from a JSON file')
113
+ }));
97
114
  editor.toolbar.addItem('spacer', Toolbar.createSpacerItem());
98
115
  if (pluginManager) {
99
116
  editor.toolbar.addItem('open-plugin-manager', new ToolbarButton({
@@ -277,6 +294,133 @@ function activateJSON(app, registry, editorServices, state, rendermime, status,
277
294
  label: trans.__('Save User Settings'),
278
295
  isEnabled: () => { var _a, _b; return (_b = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.content.canSaveRaw) !== null && _b !== void 0 ? _b : false; }
279
296
  });
297
+ commands.addCommand(CommandIDs.exportSettings, {
298
+ execute: () => {
299
+ const userSettings = collectUserSettings(registry);
300
+ const jsonContent = JSON.stringify(userSettings, null, 2);
301
+ downloadSettings(jsonContent, 'overrides.json');
302
+ },
303
+ label: trans.__('Export Settings'),
304
+ icon: downloadIcon
305
+ });
306
+ commands.addCommand(CommandIDs.importSettings, {
307
+ execute: () => {
308
+ const fileInput = document.createElement('input');
309
+ fileInput.type = 'file';
310
+ fileInput.accept = '.json'; // Accept only JSON files
311
+ const JSON_INDENTATION = 4; // Indentation for the JSON file to be uploaded
312
+ fileInput.addEventListener('change', async (event) => {
313
+ var _a;
314
+ const file = (_a = event.target.files) === null || _a === void 0 ? void 0 : _a[0];
315
+ if (!file) {
316
+ return;
317
+ }
318
+ try {
319
+ const fileContent = await file.text();
320
+ const importedSettings = JSON.parse(fileContent);
321
+ // Validate the JSON structure
322
+ if (typeof importedSettings !== 'object' ||
323
+ Array.isArray(importedSettings)) {
324
+ throw new Error('Invalid settings file format');
325
+ }
326
+ const errorUploading = [];
327
+ const applySettings = async (settings) => {
328
+ var _a;
329
+ const settingsEntries = Object.entries(importedSettings);
330
+ for (const [pluginId, pluginSettings] of settingsEntries) {
331
+ if (typeof pluginSettings === 'object' &&
332
+ !Array.isArray(pluginSettings)) {
333
+ try {
334
+ await registry.upload(pluginId, JSON.stringify(pluginSettings, undefined, JSON_INDENTATION));
335
+ }
336
+ catch (error) {
337
+ console.warn(`Failed to save settings for ${pluginId}:`, error);
338
+ errorUploading.push(pluginId);
339
+ }
340
+ }
341
+ else {
342
+ console.warn(`Invalid settings for plugin ${pluginId}. Skipping.`);
343
+ }
344
+ }
345
+ (_a = app.shell.currentWidget) === null || _a === void 0 ? void 0 : _a.close();
346
+ if (settingsEntries.length) {
347
+ const successCount = settingsEntries.length - errorUploading.length;
348
+ const successMessage = trans.__(`Imported settings across ${successCount} ${successCount === 1 ? 'category' : 'categories'} successfully.`);
349
+ const failureMessage = errorUploading.length
350
+ ? trans.__(`Failed to upload settings for the following ${errorUploading.length} ${errorUploading.length === 1 ? 'plugin' : 'plugins'}`)
351
+ : '';
352
+ const body = new ImportSettingsDialogBodyWidget({
353
+ successMessage,
354
+ failureMessage,
355
+ failedSettings: errorUploading
356
+ });
357
+ await showDialog({
358
+ title: trans.__('Settings Imported'),
359
+ body,
360
+ buttons: [Dialog.okButton()]
361
+ });
362
+ }
363
+ };
364
+ const settingsKeys = Object.keys(importedSettings);
365
+ const content = new ImportSettingsWidget({
366
+ importedSettings: settingsKeys,
367
+ handleImport: applySettings,
368
+ translator: translator
369
+ });
370
+ const widget = new MainAreaWidget({ content });
371
+ widget.title.label = trans.__('Import Settings');
372
+ widget.title.icon = fileUploadIcon;
373
+ app.shell.add(widget, 'main');
374
+ app.shell.activateById(widget.id);
375
+ }
376
+ catch (error) {
377
+ await showErrorMessage('Failed to import settings', error);
378
+ }
379
+ });
380
+ // Trigger the file input
381
+ fileInput.click();
382
+ },
383
+ label: trans.__('Import Settings'),
384
+ icon: fileUploadIcon
385
+ });
386
+ /**
387
+ * Collect user settings from the registry.
388
+ */
389
+ function collectUserSettings(registry) {
390
+ const userSettings = {};
391
+ for (const [pluginId, plugin] of Object.entries(registry.plugins)) {
392
+ if (plugin) {
393
+ try {
394
+ if (plugin.raw) {
395
+ const withoutSingleLineComments = plugin.raw.replace(/\/\/.*$/gm, '');
396
+ const withoutComments = withoutSingleLineComments.replace(/\/\*[\s\S]*?\*\//g, '');
397
+ const preferredSettings = JSON.parse(withoutComments);
398
+ if (Object.keys(preferredSettings).length > 0) {
399
+ userSettings[pluginId] = preferredSettings;
400
+ }
401
+ }
402
+ }
403
+ catch (error) {
404
+ console.error(`Error loading settings for plugin ${pluginId}:`, error);
405
+ }
406
+ }
407
+ }
408
+ return userSettings;
409
+ }
410
+ /**
411
+ * Trigger a download of the settings as a JSON file.
412
+ */
413
+ function downloadSettings(jsonContent, filename) {
414
+ const blob = new Blob([jsonContent], { type: 'application/json' });
415
+ const url = URL.createObjectURL(blob);
416
+ const a = document.createElement('a');
417
+ a.href = url;
418
+ a.download = filename;
419
+ document.body.appendChild(a);
420
+ a.click();
421
+ document.body.removeChild(a);
422
+ URL.revokeObjectURL(url);
423
+ }
280
424
  return tracker;
281
425
  }
282
426
  export default [plugin, jsonPlugin];
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jupyterlab/settingeditor-extension",
3
- "version": "4.3.4",
3
+ "version": "4.4.0-alpha.1",
4
4
  "description": "JupyterLab - Setting Editor Extension",
5
5
  "homepage": "https://github.com/jupyterlab/jupyterlab",
6
6
  "bugs": {
@@ -37,17 +37,18 @@
37
37
  "watch": "tsc -b --watch"
38
38
  },
39
39
  "dependencies": {
40
- "@jupyterlab/application": "^4.3.4",
41
- "@jupyterlab/apputils": "^4.4.4",
42
- "@jupyterlab/codeeditor": "^4.3.4",
43
- "@jupyterlab/pluginmanager": "^4.3.4",
44
- "@jupyterlab/rendermime": "^4.3.4",
45
- "@jupyterlab/settingeditor": "^4.3.4",
46
- "@jupyterlab/settingregistry": "^4.3.4",
47
- "@jupyterlab/statedb": "^4.3.4",
48
- "@jupyterlab/translation": "^4.3.4",
49
- "@jupyterlab/ui-components": "^4.3.4",
50
- "@lumino/disposable": "^2.1.3"
40
+ "@jupyterlab/application": "^4.4.0-alpha.1",
41
+ "@jupyterlab/apputils": "^4.5.0-alpha.1",
42
+ "@jupyterlab/codeeditor": "^4.4.0-alpha.1",
43
+ "@jupyterlab/pluginmanager": "^4.4.0-alpha.1",
44
+ "@jupyterlab/rendermime": "^4.4.0-alpha.1",
45
+ "@jupyterlab/settingeditor": "^4.4.0-alpha.1",
46
+ "@jupyterlab/settingregistry": "^4.4.0-alpha.1",
47
+ "@jupyterlab/statedb": "^4.4.0-alpha.1",
48
+ "@jupyterlab/translation": "^4.4.0-alpha.1",
49
+ "@jupyterlab/ui-components": "^4.4.0-alpha.1",
50
+ "@lumino/disposable": "^2.1.3",
51
+ "react": "^18.2.0"
51
52
  },
52
53
  "devDependencies": {
53
54
  "rimraf": "~5.0.5",
@@ -0,0 +1,145 @@
1
+ /*
2
+ * Copyright (c) Jupyter Development Team.
3
+ * Distributed under the terms of the Modified BSD License.
4
+ */
5
+
6
+ import { ITranslator } from '@jupyterlab/translation';
7
+ import { ReactWidget } from '@jupyterlab/ui-components';
8
+ import React, { useState } from 'react';
9
+
10
+ /**
11
+ * A namespace for ImportSettings.
12
+ */
13
+ namespace ImportSettings {
14
+ /**
15
+ * The props for the ImportSettings component.
16
+ */
17
+ export interface IOptions {
18
+ importedSettings: string[];
19
+ handleImport: (settings: string[]) => void;
20
+ translator: ITranslator;
21
+ }
22
+ /**
23
+ * The props for the ImportSettings DialogBox body.
24
+ */
25
+ export interface IDialogBodyBodyOptions {
26
+ successMessage: string;
27
+ failureMessage?: string;
28
+ failedSettings?: string[];
29
+ }
30
+ }
31
+
32
+ const SettingsImport = (props: ImportSettings.IOptions): JSX.Element => {
33
+ const trans = props.translator.load('jupyterlab');
34
+ const [checkedStates, setCheckedStates] = useState<Record<string, boolean>>(
35
+ props.importedSettings.reduce(
36
+ (acc, key) => {
37
+ acc[key] = true;
38
+ return acc;
39
+ },
40
+ {} as Record<string, boolean>
41
+ )
42
+ );
43
+
44
+ const handleCheckboxChange = (key: string, isChecked: boolean) => {
45
+ const updatedStates = { ...checkedStates, [key]: isChecked };
46
+ setCheckedStates(updatedStates);
47
+ };
48
+
49
+ return (
50
+ <div className="jp-SettingsImport-container">
51
+ <div className="jp-SettingsImport-header">
52
+ <span className="jp-SettingsImport-title">
53
+ {trans.__('Select settings sections to import')}
54
+ </span>
55
+ <button
56
+ className="jp-Button jp-mod-styled jp-mod-accept"
57
+ onClick={() => {
58
+ props.handleImport(
59
+ Object.keys(checkedStates).filter(key => !checkedStates[key])
60
+ );
61
+ }}
62
+ >
63
+ {trans.__('Import')}
64
+ </button>
65
+ </div>
66
+ <div className="jp-SettingsImport-list">
67
+ {props.importedSettings.map(key => (
68
+ <label key={key} className="jp-SettingsImport-item">
69
+ <span className="jp-SettingsImport-itemKey">{key}</span>
70
+ <input
71
+ type="checkbox"
72
+ checked={checkedStates[key]}
73
+ onChange={e => handleCheckboxChange(key, e.target.checked)}
74
+ className="jp-SettingsImport-checkbox"
75
+ />
76
+ </label>
77
+ ))}
78
+ </div>
79
+ </div>
80
+ );
81
+ };
82
+
83
+ /**
84
+ * A widget for importing settings with checkboxes.
85
+ */
86
+ export class ImportSettingsWidget extends ReactWidget {
87
+ /**
88
+ * Constructs a new ImportSettingsWidget.
89
+ *
90
+ * @param importedSettings - The settings to display.
91
+ * @param handleImport - A callback for handling imports.
92
+ */
93
+ constructor(options: ImportSettings.IOptions) {
94
+ const { importedSettings, handleImport, translator } = options;
95
+ super();
96
+ this.importedSettings = importedSettings;
97
+ this.handleImport = handleImport;
98
+ this.addClass('jp-SettingsImport-widget');
99
+ this.translator = translator;
100
+ }
101
+
102
+ render(): JSX.Element {
103
+ return (
104
+ <SettingsImport
105
+ importedSettings={this.importedSettings}
106
+ handleImport={this.handleImport}
107
+ translator={this.translator}
108
+ />
109
+ );
110
+ }
111
+
112
+ private importedSettings: string[];
113
+ private handleImport: (settings: string[]) => void;
114
+ private translator: ITranslator;
115
+ }
116
+
117
+ const ImportSettingsDialogBody = (
118
+ props: ImportSettings.IDialogBodyBodyOptions
119
+ ): JSX.Element => {
120
+ return (
121
+ <div>
122
+ <div>{props.successMessage}</div>
123
+ {props.failureMessage && (
124
+ <div>
125
+ <br />
126
+ <div>{props.failureMessage}</div>
127
+ {props.failedSettings &&
128
+ props.failedSettings.map((setting, index) => (
129
+ <div key={index}>{setting}</div>
130
+ ))}
131
+ </div>
132
+ )}
133
+ </div>
134
+ );
135
+ };
136
+
137
+ export class ImportSettingsDialogBodyWidget extends ReactWidget {
138
+ constructor(private _props: ImportSettings.IDialogBodyBodyOptions) {
139
+ super();
140
+ }
141
+
142
+ render(): JSX.Element {
143
+ return <ImportSettingsDialogBody {...this._props} />;
144
+ }
145
+ }
package/src/index.ts CHANGED
@@ -14,8 +14,11 @@ import {
14
14
  JupyterFrontEndPlugin
15
15
  } from '@jupyterlab/application';
16
16
  import {
17
+ Dialog,
17
18
  ICommandPalette,
18
19
  MainAreaWidget,
20
+ showDialog,
21
+ showErrorMessage,
19
22
  WidgetTracker
20
23
  } from '@jupyterlab/apputils';
21
24
  import { IEditorServices } from '@jupyterlab/codeeditor';
@@ -31,16 +34,23 @@ import {
31
34
  IJSONSettingEditorTracker,
32
35
  ISettingEditorTracker
33
36
  } from '@jupyterlab/settingeditor/lib/tokens';
34
- import type {
35
- JsonSettingEditor,
36
- SettingsEditor
37
- } from '@jupyterlab/settingeditor';
37
+ import { JsonSettingEditor, SettingsEditor } from '@jupyterlab/settingeditor';
38
38
  import { IPluginManager } from '@jupyterlab/pluginmanager';
39
39
  import { ISettingRegistry } from '@jupyterlab/settingregistry';
40
40
  import { IStateDB } from '@jupyterlab/statedb';
41
41
  import { ITranslator } from '@jupyterlab/translation';
42
- import { saveIcon, settingsIcon, undoIcon } from '@jupyterlab/ui-components';
42
+ import {
43
+ downloadIcon,
44
+ fileUploadIcon,
45
+ saveIcon,
46
+ settingsIcon,
47
+ undoIcon
48
+ } from '@jupyterlab/ui-components';
43
49
  import { IDisposable } from '@lumino/disposable';
50
+ import {
51
+ ImportSettingsDialogBodyWidget,
52
+ ImportSettingsWidget
53
+ } from './importSettingsWidget';
44
54
 
45
55
  /**
46
56
  * The command IDs used by the setting editor.
@@ -53,6 +63,10 @@ namespace CommandIDs {
53
63
  export const revert = 'settingeditor:revert';
54
64
 
55
65
  export const save = 'settingeditor:save';
66
+
67
+ export const exportSettings = 'settingeditor:export';
68
+
69
+ export const importSettings = 'settingeditor:import';
56
70
  }
57
71
 
58
72
  type SettingEditorType = 'ui' | 'json';
@@ -142,6 +156,28 @@ function activate(
142
156
  })
143
157
  });
144
158
 
159
+ editor.toolbar.addItem(
160
+ 'export-settings',
161
+ new CommandToolbarButton({
162
+ commands,
163
+ id: CommandIDs.exportSettings,
164
+ icon: downloadIcon,
165
+ label: trans.__('Export'),
166
+ caption: trans.__('Export settings to a JSON file')
167
+ })
168
+ );
169
+
170
+ editor.toolbar.addItem(
171
+ 'import-settings',
172
+ new CommandToolbarButton({
173
+ commands,
174
+ id: CommandIDs.importSettings,
175
+ icon: fileUploadIcon,
176
+ label: trans.__('Import'),
177
+ caption: trans.__('Import settings from a JSON file')
178
+ })
179
+ );
180
+
145
181
  editor.toolbar.addItem('spacer', Toolbar.createSpacerItem());
146
182
  if (pluginManager) {
147
183
  editor.toolbar.addItem(
@@ -357,6 +393,173 @@ function activateJSON(
357
393
  isEnabled: () => tracker.currentWidget?.content.canSaveRaw ?? false
358
394
  });
359
395
 
396
+ commands.addCommand(CommandIDs.exportSettings, {
397
+ execute: () => {
398
+ const userSettings = collectUserSettings(registry);
399
+ const jsonContent = JSON.stringify(userSettings, null, 2);
400
+ downloadSettings(jsonContent, 'overrides.json');
401
+ },
402
+ label: trans.__('Export Settings'),
403
+ icon: downloadIcon
404
+ });
405
+
406
+ commands.addCommand(CommandIDs.importSettings, {
407
+ execute: () => {
408
+ const fileInput = document.createElement('input');
409
+ fileInput.type = 'file';
410
+ fileInput.accept = '.json'; // Accept only JSON files
411
+ const JSON_INDENTATION = 4; // Indentation for the JSON file to be uploaded
412
+
413
+ fileInput.addEventListener('change', async event => {
414
+ const file = (event.target as HTMLInputElement).files?.[0];
415
+ if (!file) {
416
+ return;
417
+ }
418
+
419
+ try {
420
+ const fileContent = await file.text();
421
+ const importedSettings = JSON.parse(fileContent);
422
+
423
+ // Validate the JSON structure
424
+ if (
425
+ typeof importedSettings !== 'object' ||
426
+ Array.isArray(importedSettings)
427
+ ) {
428
+ throw new Error('Invalid settings file format');
429
+ }
430
+ const errorUploading: string[] = [];
431
+ const applySettings = async (settings: string[]) => {
432
+ const settingsEntries = Object.entries(importedSettings);
433
+ for (const [pluginId, pluginSettings] of settingsEntries) {
434
+ if (
435
+ typeof pluginSettings === 'object' &&
436
+ !Array.isArray(pluginSettings)
437
+ ) {
438
+ try {
439
+ await registry.upload(
440
+ pluginId,
441
+ JSON.stringify(pluginSettings, undefined, JSON_INDENTATION)
442
+ );
443
+ } catch (error) {
444
+ console.warn(
445
+ `Failed to save settings for ${pluginId}:`,
446
+ error
447
+ );
448
+ errorUploading.push(pluginId);
449
+ }
450
+ } else {
451
+ console.warn(
452
+ `Invalid settings for plugin ${pluginId}. Skipping.`
453
+ );
454
+ }
455
+ }
456
+
457
+ app.shell.currentWidget?.close();
458
+
459
+ if (settingsEntries.length) {
460
+ const successCount =
461
+ settingsEntries.length - errorUploading.length;
462
+ const successMessage = trans.__(
463
+ `Imported settings across ${successCount} ${
464
+ successCount === 1 ? 'category' : 'categories'
465
+ } successfully.`
466
+ );
467
+ const failureMessage = errorUploading.length
468
+ ? trans.__(
469
+ `Failed to upload settings for the following ${
470
+ errorUploading.length
471
+ } ${errorUploading.length === 1 ? 'plugin' : 'plugins'}`
472
+ )
473
+ : '';
474
+
475
+ const body = new ImportSettingsDialogBodyWidget({
476
+ successMessage,
477
+ failureMessage,
478
+ failedSettings: errorUploading
479
+ });
480
+
481
+ await showDialog({
482
+ title: trans.__('Settings Imported'),
483
+ body,
484
+ buttons: [Dialog.okButton()]
485
+ });
486
+ }
487
+ };
488
+
489
+ const settingsKeys = Object.keys(importedSettings);
490
+ const content = new ImportSettingsWidget({
491
+ importedSettings: settingsKeys,
492
+ handleImport: applySettings,
493
+ translator: translator
494
+ });
495
+ const widget = new MainAreaWidget<ImportSettingsWidget>({ content });
496
+ widget.title.label = trans.__('Import Settings');
497
+ widget.title.icon = fileUploadIcon;
498
+ app.shell.add(widget, 'main');
499
+ app.shell.activateById(widget.id);
500
+ } catch (error) {
501
+ await showErrorMessage('Failed to import settings', error);
502
+ }
503
+ });
504
+
505
+ // Trigger the file input
506
+ fileInput.click();
507
+ },
508
+ label: trans.__('Import Settings'),
509
+ icon: fileUploadIcon
510
+ });
511
+
512
+ /**
513
+ * Collect user settings from the registry.
514
+ */
515
+ function collectUserSettings(
516
+ registry: ISettingRegistry
517
+ ): Record<string, any> {
518
+ const userSettings: Record<string, any> = {};
519
+ for (const [pluginId, plugin] of Object.entries(registry.plugins)) {
520
+ if (plugin) {
521
+ try {
522
+ if (plugin.raw) {
523
+ const withoutSingleLineComments = plugin.raw.replace(
524
+ /\/\/.*$/gm,
525
+ ''
526
+ );
527
+ const withoutComments = withoutSingleLineComments.replace(
528
+ /\/\*[\s\S]*?\*\//g,
529
+ ''
530
+ );
531
+ const preferredSettings = JSON.parse(withoutComments);
532
+ if (Object.keys(preferredSettings).length > 0) {
533
+ userSettings[pluginId] = preferredSettings;
534
+ }
535
+ }
536
+ } catch (error) {
537
+ console.error(
538
+ `Error loading settings for plugin ${pluginId}:`,
539
+ error
540
+ );
541
+ }
542
+ }
543
+ }
544
+ return userSettings;
545
+ }
546
+
547
+ /**
548
+ * Trigger a download of the settings as a JSON file.
549
+ */
550
+ function downloadSettings(jsonContent: string, filename: string): void {
551
+ const blob = new Blob([jsonContent], { type: 'application/json' });
552
+ const url = URL.createObjectURL(blob);
553
+
554
+ const a = document.createElement('a');
555
+ a.href = url;
556
+ a.download = filename;
557
+ document.body.appendChild(a);
558
+ a.click();
559
+ document.body.removeChild(a);
560
+ URL.revokeObjectURL(url);
561
+ }
562
+
360
563
  return tracker;
361
564
  }
362
565