Skip to content

Commit

Permalink
Merge pull request #4001 from dymani/reopen-in-place
Browse files Browse the repository at this point in the history
Reopen recently closed tab/split in place
  • Loading branch information
zadam authored Jul 24, 2023
2 parents cc06701 + 50ec174 commit 0599891
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 5 deletions.
37 changes: 32 additions & 5 deletions src/public/app/components/tab_manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export default class TabManager extends Component {

this.activeNtxId = null;

// elements are arrays of note contexts for each tab (one main context + subcontexts [splits])
// elements are arrays of {contexts, position}, storing note contexts for each tab (one main context + subcontexts [splits]), and the original position of the tab
this.recentlyClosedTabs = [];

this.tabsUpdate = new SpacedUpdate(async () => {
Expand Down Expand Up @@ -448,21 +448,23 @@ export default class TabManager extends Component {
removeNoteContexts(noteContextsToRemove) {
const ntxIdsToRemove = noteContextsToRemove.map(nc => nc.ntxId);

const position = this.noteContexts.findIndex(nc => ntxIdsToRemove.includes(nc.ntxId));

this.children = this.children.filter(nc => !ntxIdsToRemove.includes(nc.ntxId));

this.addToRecentlyClosedTabs(noteContextsToRemove);
this.addToRecentlyClosedTabs(noteContextsToRemove, position);

this.triggerEvent('noteContextRemoved', {ntxIds: ntxIdsToRemove});

this.tabsUpdate.scheduleUpdate();
}

addToRecentlyClosedTabs(noteContexts) {
addToRecentlyClosedTabs(noteContexts, position) {
if (noteContexts.length === 1 && noteContexts[0].isEmpty()) {
return;
}

this.recentlyClosedTabs.push(noteContexts);
this.recentlyClosedTabs.push({contexts: noteContexts, position: position});
}

tabReorderEvent({ntxIdsInOrder}) {
Expand Down Expand Up @@ -574,14 +576,39 @@ export default class TabManager extends Component {
closeLastEmptyTab = this.noteContexts[0];
}

const noteContexts = this.recentlyClosedTabs.pop();
const lastClosedTab = this.recentlyClosedTabs.pop();
const noteContexts = lastClosedTab.contexts;

for (const noteContext of noteContexts) {
this.child(noteContext);

await this.triggerEvent('newNoteContextCreated', {noteContext});
}

// restore last position of contexts stored in tab manager
const ntxsInOrder = [
...this.noteContexts.slice(0, lastClosedTab.position),
...this.noteContexts.slice(-noteContexts.length),
...this.noteContexts.slice(lastClosedTab.position, -noteContexts.length),
]
await this.noteContextReorderEvent({ntxIdsInOrder: ntxsInOrder.map(nc => nc.ntxId)});

let mainNtx = noteContexts.find(nc => nc.isMainContext());
if (mainNtx) {
// reopened a tab, need to reorder new tab widget in tab row
await this.triggerEvent('contextsReopened', {
mainNtxId: mainNtx.ntxId,
tabPosition: ntxsInOrder.filter(nc => nc.isMainContext()).findIndex(nc => nc.ntxId === mainNtx.ntxId)
});
} else {
// reopened a single split, need to reorder the pane widget in split note container
await this.triggerEvent('contextsReopened', {
ntxId: ntxsInOrder[lastClosedTab.position].ntxId,
// this is safe since lastClosedTab.position can never be 0 in this case
afterNtxId: ntxsInOrder[lastClosedTab.position - 1].ntxId
});
}

const noteContextToActivate = noteContexts.length === 1
? noteContexts[0]
: noteContexts.find(nc => nc.isMainContext());
Expand Down
4 changes: 4 additions & 0 deletions src/public/app/widgets/buttons/move_pane_button.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,8 @@ export default class MovePaneButton extends OnClickButtonWidget {
async noteContextReorderEvent() {
this.refresh();
}

async contextsReopenedEvent() {
this.refresh();
}
}
9 changes: 9 additions & 0 deletions src/public/app/widgets/containers/split_note_container.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,15 @@ export default class SplitNoteContainer extends FlexContainer {
}
}

contextsReopenedEvent({ntxId, afterNtxId}) {
if (ntxId === undefined || afterNtxId === undefined) {
// no single split reopened
return;
}
this.$widget.find(`[data-ntx-id="${ntxId}"]`)
.insertAfter(this.$widget.find(`[data-ntx-id="${afterNtxId}"]`));
}

async refresh() {
this.toggleExt(true);
}
Expand Down
9 changes: 9 additions & 0 deletions src/public/app/widgets/tab_row.js
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,15 @@ export default class TabRowWidget extends BasicWidget {
this.updateTabById(newMainNtxId);
}

contextsReopenedEvent({mainNtxId, tabPosition}) {
if (mainNtxId === undefined || tabPosition === undefined) {
// no tab reopened
return;
}
const tabEl = this.getTabById(mainNtxId)[0];
tabEl.parentNode.insertBefore(tabEl, this.tabEls[tabPosition]);
}

updateTabById(ntxId) {
const $tab = this.getTabById(ntxId);

Expand Down

0 comments on commit 0599891

Please sign in to comment.