Skip to content

Commit fe7a25b

Browse files
committed
tabsets-379 Pin Tabs
1 parent b929e4b commit fe7a25b

File tree

6 files changed

+88
-16
lines changed

6 files changed

+88
-16
lines changed

layouts/SidePanelPageTabList.vue

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,19 @@
22
<!-- SidePanelPageTabList -->
33
<div style="width: 100%; max-width: 100%">
44
<q-list class="q-ma-none">
5-
<!-- supporting drag & drop when not on mobile -->
5+
<template v-if="useUiStore().folderStyle === 'goInto'">
6+
<SidePanelTabListHelper
7+
v-for="(tab, index) in pinnedTabs"
8+
:key="index"
9+
v-once
10+
:tab="tab.tab as Tab"
11+
:index="tab.index"
12+
:tabset="props.tabset!"
13+
:filter="props.filter || ''" />
14+
15+
<q-separator v-if="pinnedTabs.length > 0" class="q-mt-xs" />
16+
</template>
17+
618
<vue-draggable-next
719
v-if="tabs.length > 0"
820
class="q-ma-none"
@@ -15,11 +27,7 @@
1527
v-once
1628
:tab="tab.tab as Tab"
1729
:index="tab.index"
18-
:type="props.type"
19-
:sorting="props.sorting"
20-
:preventDragAndDrop="false"
2130
:tabset="props.tabset!"
22-
:show-tabsets="props.showTabsets"
2331
:hide-menu="props.hideMenu"
2432
:filter="props.filter || ''" />
2533
</vue-draggable-next>
@@ -54,6 +62,7 @@ import { Tab, TabSorting } from 'src/tabsets/models/Tab'
5462
import { Tabset, TabsetType } from 'src/tabsets/models/Tabset'
5563
import TabsetService from 'src/tabsets/services/TabsetService'
5664
import { useTabsetService } from 'src/tabsets/services/TabsetService2'
65+
import { useTabsetsStore } from 'src/tabsets/stores/tabsetsStore'
5766
import { useUiStore } from 'src/ui/stores/uiStore'
5867
import { PropType, ref, watch } from 'vue'
5968
import { VueDraggableNext } from 'vue-draggable-next'
@@ -72,6 +81,7 @@ const props = defineProps({
7281
const emits = defineEmits(['tabs-found'])
7382
7483
const tabs = ref<IndexedTab[]>([])
84+
const pinnedTabs = ref<IndexedTab[]>([])
7585
7686
watch(
7787
() => props.filter,
@@ -148,7 +158,37 @@ const tabsForColumn = (): IndexedTab[] => {
148158
.map((t: Tab, index: number) => new IndexedTab(index, t))
149159
}
150160
161+
const calcPinnedTabs = (): IndexedTab[] => {
162+
const result: IndexedTab[] = []
163+
if (!props.tabset) {
164+
return result
165+
}
166+
const activeFolder = useTabsetsStore().getActiveFolder(props.tabset)
167+
if (!activeFolder) {
168+
return result
169+
}
170+
const folderChain = useTabsetsStore().getFolderChain(activeFolder.id)
171+
console.log('folderChain', folderChain)
172+
if (folderChain.length > 0) {
173+
const rootTabset = useTabsetsStore().getTabset(folderChain[folderChain.length - 1]!)
174+
for (var i = 1; i < folderChain.length; i++) {
175+
console.log('checking', folderChain[i])
176+
const parentFolder = useTabsetsStore().getActiveFolder(rootTabset!, folderChain[i])
177+
console.log('parentFolder', parentFolder)
178+
const pinnedInListTabs = parentFolder?.tabs
179+
.filter((t: Tab) => t.pinnedInList)
180+
.map((t: Tab, index: number) => new IndexedTab(index, t))
181+
if (pinnedInListTabs) {
182+
result.push(...pinnedInListTabs)
183+
}
184+
}
185+
}
186+
return result
187+
}
188+
151189
tabs.value = tabsForColumn()
190+
pinnedTabs.value = calcPinnedTabs()
191+
152192
// console.log('---')
153193
emits('tabs-found', tabs.value.length)
154194
</script>

layouts/SidePanelTabListHelper.vue

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<script setup lang="ts">
2424
import { FeatureIdent } from 'src/app/models/FeatureIdent'
2525
import { useFeaturesStore } from 'src/features/stores/featuresStore'
26-
import { Tab, TabSorting } from 'src/tabsets/models/Tab'
26+
import { Tab } from 'src/tabsets/models/Tab'
2727
import { Tabset } from 'src/tabsets/models/Tabset'
2828
import PanelTabListElementWidget from 'src/tabsets/widgets/PanelTabListElementWidget.vue'
2929
import { useUiStore } from 'src/ui/stores/uiStore'
@@ -32,12 +32,7 @@ import { PropType } from 'vue'
3232
const props = defineProps({
3333
tab: { type: Object as PropType<Tab>, required: true },
3434
index: { type: Number, required: true },
35-
hideMenu: { type: Boolean, default: false },
36-
sorting: { type: String as PropType<TabSorting>, default: TabSorting.CUSTOM },
37-
type: { type: String, default: 'sidepanel' },
3835
tabset: { type: Object as PropType<Tabset>, required: false },
39-
showTabsets: { type: Boolean, default: false },
40-
preventDragAndDrop: { type: Boolean, default: false },
4136
filter: { type: String, required: false },
4237
})
4338

models/Tab.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ export class Tab {
111111
pinned: boolean
112112
groupId: number
113113

114+
pinnedInList: boolean = false // appears in subfolders
115+
114116
// from tabsets' columns
115117
columnId: string | undefined
116118

stores/tabsetsStore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ export const useTabsetsStore = defineStore('tabsets', () => {
397397
folderActive: string | undefined = root.folderActive,
398398
level = 0,
399399
): Tabset | undefined => {
400-
//console.log(`get active folder: root# ${root.id}, folderActive: ${folderActive}, level: ${level}`)
400+
console.log(`get active folder: root# ${root.id}, folderActive: ${folderActive}, level: ${level}`)
401401
if (level > 10) {
402402
console.warn('runaway method')
403403
return undefined

widgets/PanelTabListContextMenu.vue

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,17 @@
3636
</q-item>
3737
</template>
3838

39+
<template v-if="(hasSubfolder() && useUiStore().folderStyle === 'goInto') || props.tab?.pinnedInList">
40+
<q-separator inset />
41+
<q-item clickable v-close-popup @click.stop="togglePin()">
42+
<q-item-section style="padding-right: 0; min-width: 25px; max-width: 25px">
43+
<q-icon size="xs" :name="props.tab?.pinnedInList ? 'sym_o_keep_off' : 'sym_o_keep'" color="warning" />
44+
</q-item-section>
45+
<q-item-section v-if="props.tab?.pinnedInList">Unpin Tab</q-item-section>
46+
<q-item-section v-else>Pin Tab</q-item-section>
47+
</q-item>
48+
</template>
49+
3950
<template
4051
v-if="
4152
useFeaturesStore().hasFeature(FeatureIdent.ADVANCED_TAB_MANAGEMENT) &&
@@ -132,6 +143,7 @@ import { PlaceholdersType } from 'src/tabsets/models/Placeholders'
132143
import { Tab } from 'src/tabsets/models/Tab'
133144
import { MonitoredTab, Tabset, TabsetType } from 'src/tabsets/models/Tabset'
134145
import { useTabsetsStore } from 'src/tabsets/stores/tabsetsStore'
146+
import { useUiStore } from 'src/ui/stores/uiStore'
135147
import { PropType, ref } from 'vue'
136148
import { useRoute, useRouter } from 'vue-router'
137149
@@ -228,4 +240,20 @@ const isMonitoring = () => {
228240
const ts = useTabsetsStore().getCurrentTabset
229241
return ts && ts.monitoredTabs && ts.monitoredTabs.find((mt: MonitoredTab) => mt.tabId === props.tab.id)
230242
}
243+
244+
const hasSubfolder = () => {
245+
if (!props.tabset) {
246+
return false
247+
}
248+
const activeFolder = useTabsetsStore().getActiveFolder(props.tabset)
249+
return activeFolder ? activeFolder.folders.length > 0 : false
250+
}
251+
252+
const togglePin = () => {
253+
if (!props.tabset) {
254+
return
255+
}
256+
props.tab.pinnedInList = props.tab.pinnedInList ? !props.tab.pinnedInList : true
257+
useTabsetsStore().saveTabset(props.tabset)
258+
}
231259
</script>

widgets/tabListItems/TabListMainItem.vue

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,17 @@
4747
<q-tooltip class="tooltip-small">Click here to open in Reading Mode</q-tooltip>
4848
</q-icon>
4949
</span>
50+
<span>
51+
<q-icon
52+
v-if="props.tab.pinnedInList && useUiStore().folderStyle === 'goInto'"
53+
name="sym_o_keep"
54+
size="12px"
55+
color="primary"
56+
style="position: relative; top: -5px"
57+
class="q-mr-xs">
58+
<q-tooltip class="tooltip-small">This tab is pinned, i.e. it appears in all subfolders</q-tooltip>
59+
</q-icon>
60+
</span>
5061
<!-- <span v-if="showRssReferencesInfo()">-->
5162
<!-- <q-icon-->
5263
<!-- name="rss_feed"-->
@@ -416,13 +427,9 @@ const props = defineProps<{
416427
}>()
417428
418429
const showButtonsProp = ref<boolean>(false)
419-
const hoveredTab = ref<string | undefined>(undefined)
420430
const tsBadges = ref<object[]>([])
421-
const newState = ref(false)
422431
const showCommentList = ref(false)
423432
const showPlaceholderList = ref(false)
424-
const groupName = ref<string | undefined>(undefined)
425-
const groups = ref<Map<string, chrome.tabGroups.TabGroup>>(new Map())
426433
const placeholders = ref<Object[]>([])
427434
const suggestion = ref<Suggestion | undefined>(undefined)
428435
const pngs = ref<SavedBlob[]>([])

0 commit comments

Comments
 (0)