mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-19 01:04:25 +08:00
migrate app and user setting page framework to composition API and typescript
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user