7474 <div v-if =" !coreStore?.config?.settingPages || coreStore?.config?.settingPages.length === 0" >
7575 <p >No setting pages configured or still loading...</p >
7676 </div >
77- <VerticalTabs v-else >
77+ <VerticalTabs v-else ref = " VerticalTabsRef " >
7878 <template v-for =" (c ,i ) in coreStore ?.config ?.settingPages " :key =" ` tab:${settingPageSlotName (c ,i )} ` " v-slot :[' tab:' + settingPageSlotName (c ,i ) ]>
79- <div class =" flex items-center justify-center whitespace-nowrap px-4 mx-4 gap-2" >
79+ <div class =" flex items-center justify-center whitespace-nowrap px-8 py-3 gap-2" @click = " setURL(c) " >
8080 <component v-if =" c.icon" :is =" getIcon(c.icon)" class =" w-5 h-5 group-hover:text-lightSidebarIconsHover transition duration-75 dark:group-hover:text-darkSidebarIconsHover dark:text-darkSidebarIcons" ></component >
8181 {{ c.pageLabel }}
8282 </div >
@@ -103,7 +103,9 @@ import { Dropdown } from 'flowbite';
103103import { IconMoonSolid , IconSunSolid } from ' @iconify-prerendered/vue-flowbite' ;
104104import adminforth from ' @/adminforth' ;
105105import { VerticalTabs } from ' @/afcl'
106+ import { useRoute } from ' vue-router'
106107
108+ const route = useRoute ()
107109const coreStore = useCoreStore ();
108110const userStore = useUserStore ();
109111const router = useRouter ();
@@ -114,6 +116,7 @@ const loginRedirectCheckIsReady = ref(false);
114116const sideBarOpen = ref (false );
115117const theme = ref (' light' );
116118const dropdownUserButton = ref <HTMLElement | null >(null );
119+ const VerticalTabsRef = ref ();
117120
118121async function initRouter() {
119122 await router .isReady ();
@@ -155,8 +158,27 @@ onMounted(async () => {
155158 await loadMenu ();
156159 await loadPublicConfig ();
157160 loginRedirectCheckIsReady .value = true ;
158- console .log (' Setting pages:' , coreStore ?.config ?.settingPages );
159- console .log (' Full config:' , coreStore ?.config );
161+ const routeParamsPage = route ?.params ?.page ;
162+ if (! routeParamsPage ) {
163+ if (coreStore .config ?.settingPages ?.[0 ]) {
164+ setURL (coreStore .config .settingPages [0 ]);
165+ }
166+ } else {
167+ let isParamInTabs;
168+ for (const c of coreStore ?.config ?.settingPages || []) {
169+ if (c .slug ? c .slug === routeParamsPage : slugifyString (c .pageLabel ) === routeParamsPage ) {
170+ isParamInTabs = true ;
171+ break ;
172+ }
173+ }
174+ if (isParamInTabs ) {
175+ VerticalTabsRef .value .setActiveTab (routeParamsPage );
176+ } else {
177+ if (coreStore .config ?.settingPages ?.[0 ]) {
178+ setURL (coreStore .config .settingPages [0 ]);
179+ }
180+ }
181+ }
160182});
161183
162184async function loadPublicConfig() {
@@ -168,4 +190,32 @@ async function loadMenu() {
168190 await coreStore .fetchMenuAndResource ();
169191}
170192
193+ function slugifyString(str : string ): string {
194+ return str
195+ .toString ()
196+ .toLowerCase ()
197+ .replace (/ \s + / g , ' -' )
198+ .replace (/ [^ a-z0-9 -_] / g , ' -' );
199+ }
200+
201+ function setURL(item : {
202+ icon? : string | undefined ;
203+ pageLabel: string ;
204+ slug? : string | undefined ;
205+ component? : string | undefined ;
206+ }) {
207+ const slug = item ?.slug ;
208+ if (slug ) {
209+ router .replace ({
210+ name: ' settings' ,
211+ params: { page: slug }
212+ });
213+ } else {
214+ const slugified = slugifyString (item .pageLabel );
215+ router .replace ({
216+ name: ' settings' ,
217+ params: { page: slugified }
218+ });
219+ }
220+ }
171221 </script >
0 commit comments