feat: Rework preserve last visited tab

This commit is contained in:
gopikrishnan13 2024-09-25 17:42:51 +05:30
parent b5078b94a6
commit 0b6d071fdc
3 changed files with 74 additions and 3 deletions

View File

@ -0,0 +1,68 @@
import { ref, watch } from 'vue';
// Debounce function to delay updates
function debounce(fn, delay) {
let timeout;
return (...args) => {
clearTimeout(timeout);
timeout = setTimeout(() => fn(...args), delay);
};
}
export function useActiveTabManager(tabs, storageKey) {
const preserveLastVisitedTab = debounce((tabName) => {
localStorage.setItem(storageKey, tabName.toLowerCase());
}, 300);
function setActiveTabInUrl(tabName) {
window.location.hash = '#' + tabName.toLowerCase();
}
function getActiveTabFromUrl() {
return window.location.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 localStorage.getItem(storageKey);
}
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);
});
return { tabIndex };
}

View File

@ -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()
@ -513,7 +515,6 @@ usePageMeta(() => {
}
})
const tabIndex = ref(0)
const tabs = computed(() => {
let tabOptions = [
{
@ -556,6 +557,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',

View File

@ -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()
@ -463,8 +464,6 @@ usePageMeta(() => {
}
})
const tabIndex = ref(0)
const tabs = computed(() => {
let tabOptions = [
{
@ -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(