feat(auth): add 2FA with OTP, backup codes and trusted devices

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-02-24 17:25:00 +00:00
parent b001b94e37
commit 1839285ac3
26 changed files with 2402 additions and 312 deletions

View File

@@ -431,7 +431,10 @@ const handleLogout = async () => {
// Handle server switch completed - reload data for new server
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany();
periodStore.reset();
// Reload data for the new server
await companyStore.loadCompanies();
if (companyStore.selectedCompany?.id_firma) {

View File

@@ -428,7 +428,10 @@ const handleLogout = async () => {
// Handle server switched event from drawer menu
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany();
periodStore.reset();
// Reload data for the new server
await companyStore.loadCompanies();
if (companyStore.selectedCompany?.id_firma) {

View File

@@ -428,7 +428,10 @@ const handleLogout = async () => {
// Handle server switched event from drawer menu
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany();
periodStore.reset();
// Reload data for the new server
await companyStore.loadCompanies();
if (companyStore.selectedCompany?.id_firma) {

View File

@@ -791,7 +791,10 @@ const handleLogout = async () => {
// Handle server switched from drawer menu (password already verified in modal)
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany();
periodStore.reset();
// Reload companies and periods for the new server
await companyStore.loadCompanies();
if (companyStore.selectedCompany?.id_firma) {

View File

@@ -768,7 +768,10 @@ const handleLogout = async () => {
// Handle server switch completed - reload data for new server
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany()
periodStore.reset()
// Reload data for the new server
await companyStore.loadCompanies()
if (companyStore.selectedCompany?.id_firma) {

View File

@@ -442,7 +442,10 @@ const handleLogout = async () => {
// Handle server switched event from drawer menu
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany();
periodStore.reset();
// Reload data for the new server
await companyStore.loadCompanies();
if (companyStore.selectedCompany?.id_firma) {

View File

@@ -172,7 +172,10 @@ const handleLogout = async () => {
// Handle server switch completed - reload data for new server
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany()
periodStore.reset()
// Reload data for the new server
await companyStore.loadCompanies()
if (companyStore.selectedCompany?.id_firma) {

View File

@@ -92,10 +92,12 @@ import { useRouter } from 'vue-router'
import MobileTopBar from '@shared/components/mobile/MobileTopBar.vue'
import MobileBottomNav from '@shared/components/mobile/MobileBottomNav.vue'
import MobileDrawerMenu from '@shared/components/mobile/MobileDrawerMenu.vue'
import { useAuthStore } from '@reports/stores/sharedStores'
import { useAuthStore, useCompanyStore, useAccountingPeriodStore } from '@reports/stores/sharedStores'
const router = useRouter()
const authStore = useAuthStore()
const companyStore = useCompanyStore()
const periodStore = useAccountingPeriodStore()
// State
const showDrawer = ref(false)
@@ -117,8 +119,9 @@ const handleLogout = async () => {
// Handle server switch completed
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// SettingsHubView doesn't need to reload data - it's just a navigation hub
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany()
periodStore.reset()
}
// US-307: Removed custom mobileNavItems - using MobileBottomNav defaults

View File

@@ -409,7 +409,10 @@ const handleLogout = async () => {
// Handle server switch completed - reload data for new server
const handleServerSwitched = async (newServerId) => {
// Server switch already completed in MobileDrawerMenu modal
// Clear selected company and period FIRST to prevent stale data from old server
companyStore.clearSelectedCompany();
periodStore.reset();
// Reload data for the new server
await companyStore.loadCompanies();
if (companyStore.selectedCompany?.id_firma) {