Skip to content

Commit aa911ff

Browse files
committed
fix: tabs: possible tree breakage and changing configured behavior with 'do not move it' setting
- Added sub-setting for controlling branch creation logic. It works only for the 'do not move it' option. For the other options it's inactive and visualizes the behavior ('on' for the 'first/last child', 'off' otherwise). - Added the upgrade logic to preserve previous behavior with 'do not move it' option. - Fixed incorrectly found target panel with 'do not move it' option and the `browser.tabs.insertRelatedAfterCurrent` set to false (resolves #2280)
1 parent efb37f8 commit aa911ff

File tree

6 files changed

+73
-6
lines changed

6 files changed

+73
-6
lines changed

src/_locales/dict.setup-page.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3149,6 +3149,17 @@ Przykłady: "*", "ctrl+$", "ctrl+alt+g"`,
31493149
zh_TW: '使用一般規則',
31503150
ja: '一般ルールを使用する',
31513151
},
3152+
'settings.move_new_tab_parent_indent': {
3153+
en: 'Create and maintain a tree structure if possible',
3154+
de: 'Erstellen und pflegen Sie nach Möglichkeit eine Baumstruktur',
3155+
fr: 'Créer et maintenir une structure arborescente si possible',
3156+
hu: 'Ha lehetséges, hozzon létre és tartson fenn fa szerkezetet',
3157+
pl: 'Utwórz i zachowaj strukturę drzewa, jeśli to możliwe',
3158+
ru: 'Создавать и сохранять древовидную структуру, если это возможно',
3159+
zh_CN: '尽可能创建并维护树形结构',
3160+
zh_TW: '若可行,請建立並維護樹狀結構',
3161+
ja: '可能であればツリー構造を作成し維持する',
3162+
},
31523163
'settings.move_new_tab_parent_act_panel': {
31533164
en: 'Only if panel of parent tab is active',
31543165
de: 'Nur, wenn Panel des übergeordneten Tabs aktiv ist',

src/defaults/settings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ export const DEFAULT_SETTINGS: SettingsState = {
101101
// New tab position
102102
moveNewTabPin: 'start',
103103
moveNewTabParent: 'last_child',
104+
moveNewTabParentIndent: false,
104105
moveNewTabParentActPanel: false,
105106
moveNewTabButton: 'end',
106107
moveNewTabButtonActivePin: 'start',

src/page.setup/components/settings.tabs.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,16 @@ section(ref="el")
157157
:folded="true"
158158
@update:value="Settings.saveDebounced(150)")
159159
.sub-fields
160+
ToggleField(
161+
v-if="Settings.state.moveNewTabParent === 'default' && Settings.state.tabsTree"
162+
label="settings.move_new_tab_parent_indent"
163+
v-model:value="Settings.state.moveNewTabParentIndent"
164+
@update:value="Settings.saveDebounced(150)")
165+
ToggleField(
166+
v-else
167+
label="settings.move_new_tab_parent_indent"
168+
:inactive="true"
169+
v-bind:value="Settings.state.tabsTree && (Settings.state.moveNewTabParent === 'first_child' || Settings.state.moveNewTabParent === 'last_child')")
160170
ToggleField(
161171
label="settings.move_new_tab_parent_act_panel"
162172
:inactive="Settings.state.moveNewTabParent === 'none'"

src/services/settings.actions.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export async function loadSettings(): Promise<void> {
3939
}
4040

4141
Utils.normalizeObject(storedManaged.settings, storedLocal.settings)
42+
const groupOnOpen = storedManaged.settings.groupOnOpen
4243
Utils.normalizeObject(storedManaged.settings, DEFAULT_SETTINGS)
4344
Utils.updateObject(Settings.state, storedManaged.settings, Settings.state)
4445

@@ -47,6 +48,12 @@ export async function loadSettings(): Promise<void> {
4748
Settings.state.tabsPanelSwitchActMove = true
4849
}
4950

51+
// TMP
52+
// Try to keep previous behavior with moveNewTabParent === 'default' and groupOnOpen
53+
if (groupOnOpen && Settings.state.moveNewTabParent === 'default') {
54+
Settings.state.moveNewTabParentIndent = true
55+
}
56+
5057
parsePrefaceTemplate()
5158

5259
if (Info.isSidebar) {

src/services/tabs.fg.create.ts

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -647,9 +647,18 @@ export function getPanelForNewTab(tab: Tab): TabsPanel | undefined {
647647

648648
// Find panel for tab opened from another tab
649649
if (parentTab && !parentTab.pinned) {
650-
const panelOfParent = Sidebar.panelsById[parentTab.panelId] as TabsPanel
651-
if (!Settings.state.moveNewTabParentActPanel || panelOfParent === activePanel) {
652-
return panelOfParent
650+
// For the 'default' opt (do not move it / keep original position)
651+
// find the panel by tab index (e.g. if `browser.tabs.insertRelatedAfterCurrent` is false
652+
// Firefox will open new child tabs at the end of list)
653+
if (Settings.state.moveNewTabParent === 'default') {
654+
return findTabsPanelNearToTabIndex(tab.index)
655+
}
656+
// For the other cases (except 'none') use the panel of the parent tab
657+
else if (Settings.state.moveNewTabParent !== 'none') {
658+
const panelOfParent = Sidebar.panelsById[parentTab.panelId] as TabsPanel
659+
if (!Settings.state.moveNewTabParentActPanel || panelOfParent === activePanel) {
660+
return panelOfParent
661+
}
653662
}
654663
}
655664

@@ -804,6 +813,7 @@ export function getIndexForNewTab(panel: TabsPanel, conf?: IndexForNewTabConf):
804813
}
805814

806815
interface ParentForNewTabConf {
816+
index?: number
807817
openerTabId?: ID
808818
fromNewTabButton?: boolean
809819
}
@@ -812,8 +822,6 @@ interface ParentForNewTabConf {
812822
* Find and return parent id
813823
*/
814824
export function getParentForNewTab(panel: Panel, conf?: ParentForNewTabConf): ID | undefined {
815-
const activeTab = Tabs.byId[Tabs.activeId]
816-
817825
const openerTabId = conf?.openerTabId
818826
const fromNewTabButton = conf?.fromNewTabButton ?? false
819827

@@ -831,7 +839,33 @@ export function getParentForNewTab(panel: Panel, conf?: ParentForNewTabConf): ID
831839
if (Settings.state.moveNewTabParent === 'last_child') return openerTabId
832840
if (Settings.state.moveNewTabParent === 'start') return
833841
if (Settings.state.moveNewTabParent === 'end') return
834-
if (Settings.state.moveNewTabParent === 'default') return parent.parentId
842+
// Find appropriate parent for the unknown (not controlled by Sidebery) index
843+
if (Settings.state.moveNewTabParent === 'default') {
844+
const prevTab = conf?.index ? Tabs.list[conf.index - 1] : undefined
845+
const prevIsSiblingToParent = prevTab !== parent && prevTab?.parentId === parent.parentId
846+
const nextTab = conf?.index ? Tabs.list[conf.index] : undefined
847+
Logs.info('next tab:', nextTab?.url)
848+
849+
// If the prev tab is the parent, the sibling of the parent or is inside the parent branch
850+
// and if the next tab is not in the branch
851+
if (
852+
// prettier-ignore
853+
(prevTab &&
854+
(prevTab === parent ||
855+
prevIsSiblingToParent ||
856+
Tabs.findAncestor(prevTab, t => t === parent))
857+
) &&
858+
(!nextTab || (nextTab && !Tabs.findAncestor(nextTab, t => t === parent)))
859+
) {
860+
// Create branch or keep it flat
861+
if (Settings.state.moveNewTabParentIndent && !prevIsSiblingToParent) return parent.id
862+
else return parent.parentId
863+
}
864+
// or integrate the new tab inside existed tree/list
865+
else {
866+
return nextTab?.parentId
867+
}
868+
}
835869
}
836870

837871
// Place new tab (for the other cases)
@@ -841,6 +875,8 @@ export function getParentForNewTab(panel: Panel, conf?: ParentForNewTabConf): ID
841875

842876
if (moveNewTabSetting === 'start') return
843877
if (moveNewTabSetting === 'end') return
878+
879+
const activeTab = Tabs.byId[Tabs.activeId]
844880
if (activeTab && activeTab.panelId === panel.id && !activeTab.pinned) {
845881
if (moveNewTabSetting === 'before') return activeTab.parentId
846882
else if (moveNewTabSetting === 'after') return activeTab.parentId

src/types/settings.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ export interface SettingsState {
100100
// New tab position
101101
moveNewTabPin: (typeof SETTINGS_OPTIONS.moveNewTabPin)[number]
102102
moveNewTabParent: (typeof SETTINGS_OPTIONS.moveNewTabParent)[number]
103+
moveNewTabParentIndent: boolean
103104
moveNewTabParentActPanel: boolean
104105
moveNewTabButton: (typeof SETTINGS_OPTIONS.moveNewTab)[number]
105106
moveNewTabButtonActivePin: (typeof SETTINGS_OPTIONS.moveNewTabActivePin)[number]
@@ -116,6 +117,7 @@ export interface SettingsState {
116117

117118
// Tabs tree
118119
tabsTree: boolean
120+
groupOnOpen?: boolean // DEPR
119121
tabsTreeLimit: (typeof SETTINGS_OPTIONS.tabsTreeLimit)[number]
120122
autoFoldTabs: boolean
121123
autoFoldTabsExcept: (typeof SETTINGS_OPTIONS.autoFoldTabsExcept)[number]

0 commit comments

Comments
 (0)