- Notifications
You must be signed in to change notification settings - Fork5.5k
Add the layout restorer#7747
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:main
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
brichet commentedOct 21, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
EDIT this error has been fixed There is a conflict on the title of the browser tab with this PR. BEFORE THE PRrecord-2025-10-21_11.29.54.webmAFTER THE PRrecord-2025-10-21_11.30.28.webmThe tab title is not updated correctly anymore, probably because ofhttps://github.com/jupyterlab/jupyterlab/blob/21f9c73298d7a450dba9927d404c87aae3011f7a/packages/apputils-extension/src/index.ts#L462-L469. Maybe we should provide the |
brichet commentedOct 21, 2025
Added inc1b056e |
jtpio left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Many thanks@brichet for working on this!
Just did a first pass on the diff without testing locally for now, and overall the changes look good 👍
Left a couple of small comments before checking it locally.
| /** | ||
| * The default layout restorer provider. | ||
| */ | ||
| constlayoutRestorer:JupyterFrontEndPlugin<ILayoutRestorer|null>={ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Since the left and right panels can also be opened on other pages, maybe this plugin should always provide aLayoutRestorer?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I though only the Notebook has side panel, but the tree view also have one indeed. And the header is also expandable for all the view.
To avoid confusion, we'll probably need a workspace file for each view (tree, notebook, console, terminal, file), because each view has its own panels.
Currently the workspace filename is set tonb-default in thestate plugin, but we can probably have a dedicated one according to the URL, or the main widget in the shell.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Right, we could look into that separately, and only support the notebook page for now.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
There is now one workspace file per view (notebooks,tree, ...), so we can restore the layout for each view.
I tried to change the workspaces directory in the backend to clarify, and have a dedicated directory for Notebook application, without success so far.
I couldn't make it work by replacing
Lines 310 to 311 infd9c4b4
| def_default_workspaces_dir(self)->str: | |
| returnt.cast(str,get_workspaces_dir()) |
with
@default("workspaces_dir")def_default_workspaces_dir(self)->str:workspaces_dir=Path(jupyter_data_dir())/"workspaces"/"notebook_app"workspaces_dir.mkdir(parents=True,exist_ok=True)returnt.cast(str,str(workspaces_dir))
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
| }, | ||
| }); | ||
| commands.addCommand(CommandIDs.resetOnLoad,{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Wondering if this command should be exposed somewhere in the UI? Like in JupyterLab under the Workspaces menu.
Users would then have a way to reset the UI to the defaults and clean things up.
It could be part of the command palette or the menu, or both.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
yes, sounds good. It could be in thefile menu, like in lab.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Actually we should probably create another command (reset) to expose it to the UI. This one checks the URL to find areset in the query parameters.
brichet commentedOct 24, 2025 • edited
Loading Uh oh!
There was an error while loading.Please reload this page.
edited
Uh oh!
There was an error while loading.Please reload this page.
I converted it to draft to explore layout restoration on other views than Notebook, and workspace reset in the UI. |
| asyncrestore( | ||
| tracker:WidgetTracker, | ||
| options:IRestorer.IOptions<Widget> | ||
| ):Promise<any>{ | ||
| // no-op as we don't want to restore widgets, only the layout. | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
It looks like this prevents the down area to be restored, at least the log panel.
Overriding the restore function is required AFAIK, to prevent the main area widget to be tracked, and therefore to be restored. Otherwise, loading the page calls a reload of the page (in a new tab) and this can be infinite, because it tries to restore the main area widget.
record-2025-10-27_11.50.22.webm
Not sure how we could handle it yet.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Uh oh!
There was an error while loading.Please reload this page.
Adds the layout restorer, to restore the state of the side/down panels.
It includes the current widgets opened in each panel, and the size of the panels.
record-2025-10-17_20.16.35.webm
Fixes#6990
User facing change
nb-default.Code changes
RestoreLayoutandSaveLayoutfunction to the shell, which uses some dedicated function to "dehydrate" and "rehydrate" the shell'@jupyter-notebook/application-extension:layout', which handle the shell layout restoration'@jupyter-notebook/apputils-extension:state', which was previously activated from jupyterlab. Providing our ownIStateDBallow to avoid some side effect, that the tab title update (which does not work correctly in Notebook, seeAdd the layout restorer #7747 (comment))