migrate app and user setting page framework to composition API and typescript

This commit is contained in:
MaysWind
2025-01-12 12:55:45 +08:00
parent 1414f54a12
commit f2ebd751d4
2 changed files with 107 additions and 106 deletions
+47 -47
View File
@@ -3,15 +3,15 @@
<v-tabs show-arrows v-model="activeTab"> <v-tabs show-arrows v-model="activeTab">
<v-tab value="basicSetting" @click="pushRouter('basicSetting')"> <v-tab value="basicSetting" @click="pushRouter('basicSetting')">
<v-icon size="20" start :icon="icons.basicSetting"/> <v-icon size="20" start :icon="icons.basicSetting"/>
{{ $t('Basic') }} {{ tt('Basic') }}
</v-tab> </v-tab>
<v-tab value="applicationLockSetting" @click="pushRouter('applicationLockSetting')"> <v-tab value="applicationLockSetting" @click="pushRouter('applicationLockSetting')">
<v-icon size="20" start :icon="icons.applicationLockSetting"/> <v-icon size="20" start :icon="icons.applicationLockSetting"/>
{{ $t('Application Lock') }} {{ tt('Application Lock') }}
</v-tab> </v-tab>
<v-tab value="statisticsSetting" @click="pushRouter('statisticsSetting')"> <v-tab value="statisticsSetting" @click="pushRouter('statisticsSetting')">
<v-icon size="20" start :icon="icons.statisticsSetting"/> <v-icon size="20" start :icon="icons.statisticsSetting"/>
{{ $t('Statistics') }} {{ tt('Statistics') }}
</v-tab> </v-tab>
</v-tabs> </v-tabs>
@@ -31,61 +31,61 @@
</div> </div>
</template> </template>
<script> <script setup lang="ts">
import AppBasicSettingTab from './settings/tabs/AppBasicSettingTab.vue'; import AppBasicSettingTab from './settings/tabs/AppBasicSettingTab.vue';
import AppLockSettingTab from './settings/tabs/AppLockSettingTab.vue'; import AppLockSettingTab from './settings/tabs/AppLockSettingTab.vue';
import AppStatisticsSettingTab from './settings/tabs/AppStatisticsSettingTab.vue'; import AppStatisticsSettingTab from './settings/tabs/AppStatisticsSettingTab.vue';
import { ref } from 'vue';
import { useRouter, onBeforeRouteUpdate } from 'vue-router';
import { useI18n } from '@/locales/helpers.ts';
import { import {
mdiCogOutline, mdiCogOutline,
mdiLockOpenOutline, mdiLockOpenOutline,
mdiChartPieOutline mdiChartPieOutline
} from '@mdi/js'; } from '@mdi/js';
export default { const props = defineProps<{
components: { initTab?: string;
AppBasicSettingTab, }>();
AppLockSettingTab,
AppStatisticsSettingTab
},
props: [
'initTab'
],
data() {
let queryActiveTab = this.initTab || 'basicSetting';
if ([ const router = useRouter();
'basicSetting',
'applicationLockSetting',
'statisticsSetting'
].indexOf(queryActiveTab) === -1) {
queryActiveTab = 'basicSetting';
}
return { const { tt } = useI18n();
activeTab: queryActiveTab,
icons: { const ALL_TABS: string[] = [
basicSetting: mdiCogOutline, 'basicSetting',
applicationLockSetting: mdiLockOpenOutline, 'applicationLockSetting',
statisticsSetting: mdiChartPieOutline 'statisticsSetting'
} ];
};
}, const icons = {
beforeRouteUpdate(to) { basicSetting: mdiCogOutline,
if (to.query && to.query.tab && [ applicationLockSetting: mdiLockOpenOutline,
'basicSetting', statisticsSetting: mdiChartPieOutline
'applicationLockSetting', };
'statisticsSetting'
].indexOf(to.query.tab) >= 0) { const activeTab = ref<string>((() => {
this.activeTab = to.query.tab; let queryActiveTab = props.initTab || 'basicSetting';
} else {
this.activeTab = 'basicSetting'; if (ALL_TABS.indexOf(queryActiveTab) < 0) {
} queryActiveTab = 'basicSetting';
},
methods: {
pushRouter(tab) {
this.$router.push(`/app/settings?tab=${tab}`);
}
} }
}
return queryActiveTab;
})());
const pushRouter = (tab: string) => {
router.push(`/app/settings?tab=${tab}`);
};
onBeforeRouteUpdate((to) => {
if (to.query && to.query.tab && ALL_TABS.indexOf(to.query.tab) >= 0) {
activeTab.value = to.query.tab;
} else {
activeTab.value = 'basicSetting';
}
});
</script> </script>
+60 -59
View File
@@ -3,19 +3,19 @@
<v-tabs show-arrows v-model="activeTab"> <v-tabs show-arrows v-model="activeTab">
<v-tab value="basicSetting" @click="pushRouter('basicSetting')"> <v-tab value="basicSetting" @click="pushRouter('basicSetting')">
<v-icon size="20" start :icon="icons.basicSetting"/> <v-icon size="20" start :icon="icons.basicSetting"/>
{{ $t('Basic') }} {{ tt('Basic') }}
</v-tab> </v-tab>
<v-tab value="securitySetting" @click="pushRouter('securitySetting')"> <v-tab value="securitySetting" @click="pushRouter('securitySetting')">
<v-icon size="20" start :icon="icons.securitySetting"/> <v-icon size="20" start :icon="icons.securitySetting"/>
{{ $t('Security') }} {{ tt('Security') }}
</v-tab> </v-tab>
<v-tab value="twoFactorSetting" @click="pushRouter('twoFactorSetting')"> <v-tab value="twoFactorSetting" @click="pushRouter('twoFactorSetting')">
<v-icon size="20" start :icon="icons.twoFactorSetting"/> <v-icon size="20" start :icon="icons.twoFactorSetting"/>
{{ $t('Two-Factor Authentication') }} {{ tt('Two-Factor Authentication') }}
</v-tab> </v-tab>
<v-tab value="dataManagementSetting" @click="pushRouter('dataManagementSetting')"> <v-tab value="dataManagementSetting" @click="pushRouter('dataManagementSetting')">
<v-icon size="20" start :icon="icons.dataManagementSetting"/> <v-icon size="20" start :icon="icons.dataManagementSetting"/>
{{ $t('Data Management') }} {{ tt('Data Management') }}
</v-tab> </v-tab>
</v-tabs> </v-tabs>
@@ -39,12 +39,17 @@
</div> </div>
</template> </template>
<script> <script setup lang="ts">
import UserBasicSettingTab from './settings/tabs/UserBasicSettingTab.vue'; import UserBasicSettingTab from './settings/tabs/UserBasicSettingTab.vue';
import UserSecuritySettingTab from './settings/tabs/UserSecuritySettingTab.vue'; import UserSecuritySettingTab from './settings/tabs/UserSecuritySettingTab.vue';
import UserTwoFactorAuthSettingTab from './settings/tabs/UserTwoFactorAuthSettingTab.vue'; import UserTwoFactorAuthSettingTab from './settings/tabs/UserTwoFactorAuthSettingTab.vue';
import UserDataManagementSettingTab from './settings/tabs/UserDataManagementSettingTab.vue'; import UserDataManagementSettingTab from './settings/tabs/UserDataManagementSettingTab.vue';
import { ref, useTemplateRef, watch } from 'vue';
import { useRouter, onBeforeRouteUpdate } from 'vue-router';
import { useI18n } from '@/locales/helpers.ts';
import { import {
mdiAccountOutline, mdiAccountOutline,
mdiLockOpenOutline, mdiLockOpenOutline,
@@ -52,61 +57,57 @@ import {
mdiDatabaseCogOutline mdiDatabaseCogOutline
} from '@mdi/js'; } from '@mdi/js';
export default { type TwoFactorSettingTabType = InstanceType<typeof UserTwoFactorAuthSettingTab>;
components: {
UserBasicSettingTab,
UserSecuritySettingTab,
UserTwoFactorAuthSettingTab,
UserDataManagementSettingTab
},
props: [
'initTab'
],
data() {
let queryActiveTab = this.initTab || 'basicSetting';
if ([ const props = defineProps<{
'basicSetting', initTab?: string;
'securitySetting', }>();
'twoFactorSetting',
'dataManagementSetting'
].indexOf(queryActiveTab) === -1) {
queryActiveTab = 'basicSetting';
}
return { const router = useRouter();
activeTab: queryActiveTab,
icons: { const { tt } = useI18n();
basicSetting: mdiAccountOutline,
securitySetting: mdiLockOpenOutline, const ALL_TABS: string[] = [
twoFactorSetting: mdiOnepassword, 'basicSetting',
dataManagementSetting: mdiDatabaseCogOutline 'securitySetting',
} 'twoFactorSetting',
}; 'dataManagementSetting'
}, ];
watch: {
'activeTab': function (newValue, oldValue) { const icons = {
if (oldValue === 'twoFactorSetting' && newValue !== 'twoFactorSetting') { basicSetting: mdiAccountOutline,
this.$refs.twoFactorSettingTab.reset(); securitySetting: mdiLockOpenOutline,
} twoFactorSetting: mdiOnepassword,
} dataManagementSetting: mdiDatabaseCogOutline
}, };
beforeRouteUpdate(to) {
if (to.query && to.query.tab && [ const twoFactorSettingTab = useTemplateRef<TwoFactorSettingTabType>('twoFactorSettingTab');
'basicSetting',
'securitySetting', const activeTab = ref<string>((() => {
'twoFactorSetting', let queryActiveTab = props.initTab || 'basicSetting';
'dataManagementSetting'
].indexOf(to.query.tab) >= 0) { if (ALL_TABS.indexOf(queryActiveTab) < 0) {
this.activeTab = to.query.tab; queryActiveTab = 'basicSetting';
} else {
this.activeTab = 'basicSetting';
}
},
methods: {
pushRouter(tab) {
this.$router.push(`/user/settings?tab=${tab}`);
}
} }
}
return queryActiveTab;
})());
const pushRouter = (tab: string) => {
router.push(`/user/settings?tab=${tab}`);
};
onBeforeRouteUpdate((to) => {
if (to.query && to.query.tab && ALL_TABS.indexOf(to.query.tab) >= 0) {
activeTab.value = to.query.tab;
} else {
activeTab.value = 'basicSetting';
}
});
watch(activeTab, (newValue, oldValue) => {
if (oldValue === 'twoFactorSetting' && newValue !== 'twoFactorSetting') {
twoFactorSettingTab.value?.reset();
}
});
</script> </script>