Skip to content

Commit

Permalink
Merge pull request frappe#293 from gopikrishnan13/last_visited_tab
Browse files Browse the repository at this point in the history
feat: Preserve last visited tab
  • Loading branch information
shariquerik authored Sep 27, 2024
2 parents beaf544 + 028ad81 commit 454973c
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 3 deletions.
80 changes: 80 additions & 0 deletions frontend/src/composables/useActiveTabManager.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { useDebounceFn, useStorage } from '@vueuse/core'

export function useActiveTabManager(tabs, storageKey) {
const activieTab = useStorage(storageKey, 'activity')
const route = useRoute()

const preserveLastVisitedTab = useDebounceFn((tabName) => {
activieTab.value = tabName.toLowerCase()
}, 300)

function setActiveTabInUrl(tabName) {
window.location.hash = '#' + tabName.toLowerCase()
}

function getActiveTabFromUrl() {
return route.hash.replace('#', '')
}

function findTabIndex(tabName) {
return tabs.value.findIndex(
(tabOptions) => tabOptions.name.toLowerCase() === tabName,
)
}

function getTabIndex(tabName) {
let index = findTabIndex(tabName)
return index !== -1 ? index : 0 // Default to the first tab if not found
}

function getActiveTabFromLocalStorage() {
return activieTab.value
}

function getActiveTab() {
let activeTab = getActiveTabFromUrl()
if (activeTab) {
let index = findTabIndex(activeTab)
if (index !== -1) {
preserveLastVisitedTab(activeTab)
return index
}
return 0
}

let lastVisitedTab = getActiveTabFromLocalStorage()
if (lastVisitedTab) {
setActiveTabInUrl(lastVisitedTab)
return getTabIndex(lastVisitedTab)
}

return 0 // Default to the first tab if nothing is found
}

const tabIndex = ref(getActiveTab())

watch(tabIndex, (tabIndexValue) => {
let currentTab = tabs.value[tabIndexValue].name
setActiveTabInUrl(currentTab)
preserveLastVisitedTab(currentTab)
})

watch(
() => route.hash,
(tabValue) => {
if (!tabValue) return

let tabName = tabValue.replace('#', '')
let index = findTabIndex(tabName)
if (index === -1) index = 0

let currentTab = tabs.value[index].name
preserveLastVisitedTab(currentTab)
tabIndex.value = index
},
)

return { tabIndex }
}
4 changes: 3 additions & 1 deletion frontend/src/pages/Deal.vue
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,8 @@ import {
} from 'frappe-ui'
import { ref, computed, h, onMounted, onBeforeUnmount } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useActiveTabManager } from '@/composables/useActiveTabManager'
const { $dialog, $socket, makeCall } = globalStore()
const { statusOptions, getDealStatus } = statusesStore()
Expand Down Expand Up @@ -516,7 +518,6 @@ usePageMeta(() => {
}
})
const tabIndex = ref(0)
const tabs = computed(() => {
let tabOptions = [
{
Expand Down Expand Up @@ -559,6 +560,7 @@ const tabs = computed(() => {
]
return tabOptions.filter((tab) => (tab.condition ? tab.condition() : true))
})
const { tabIndex } = useActiveTabManager(tabs, 'lastDealTab')
const fieldsLayout = createResource({
url: 'crm.api.doc.get_sidebar_fields',
Expand Down
5 changes: 3 additions & 2 deletions frontend/src/pages/Lead.vue
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,7 @@ import {
} from 'frappe-ui'
import { ref, computed, onMounted, watch } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { useActiveTabManager } from '@/composables/useActiveTabManager'
const { $dialog, $socket, makeCall } = globalStore()
const { getContactByName, contacts } = contactsStore()
Expand Down Expand Up @@ -463,8 +464,6 @@ usePageMeta(() => {
}
})
const tabIndex = ref(0)
const tabs = computed(() => {
let tabOptions = [
{
Expand Down Expand Up @@ -508,6 +507,8 @@ const tabs = computed(() => {
return tabOptions.filter((tab) => (tab.condition ? tab.condition() : true))
})
const { tabIndex } = useActiveTabManager(tabs, 'lastLeadTab')
watch(tabs, (value) => {
if (value && route.params.tabName) {
let index = value.findIndex(
Expand Down

0 comments on commit 454973c

Please sign in to comment.