feat(mobile-navigation-improvements): Complete US-213 - Actualizare Hamburger Menu în toate paginile
Implemented by Ralph autonomous loop. Iteration: 10 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -183,8 +183,8 @@
|
|||||||
"Desktop păstrează navigarea existentă",
|
"Desktop păstrează navigarea existentă",
|
||||||
"npm run build passes"
|
"npm run build passes"
|
||||||
],
|
],
|
||||||
"passes": false,
|
"passes": true,
|
||||||
"notes": ""
|
"notes": "Completed in iteration 10"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "US-210",
|
"id": "US-210",
|
||||||
|
|||||||
@@ -58,3 +58,9 @@ User Stories: 14 (US-201 to US-214)
|
|||||||
[2026-01-12 12:23:52] Working on story: US-207
|
[2026-01-12 12:23:52] Working on story: US-207
|
||||||
[2026-01-12 12:23:52] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_9_US-207.log)
|
[2026-01-12 12:23:52] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_9_US-207.log)
|
||||||
[2026-01-12 12:28:03] SUCCESS: Story US-207 passed!
|
[2026-01-12 12:28:03] SUCCESS: Story US-207 passed!
|
||||||
|
[2026-01-12 12:28:03] Changes committed
|
||||||
|
[2026-01-12 12:28:03] Progress: 9/14 stories completed
|
||||||
|
[2026-01-12 12:28:05] === Iteration 10/100 ===
|
||||||
|
[2026-01-12 12:28:05] Working on story: US-213
|
||||||
|
[2026-01-12 12:28:05] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_10_US-213.log)
|
||||||
|
[2026-01-12 12:36:45] SUCCESS: Story US-213 passed!
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
:selection-active="mobileSelectionMode"
|
:selection-active="mobileSelectionMode"
|
||||||
:actions="mobileTopBarActions"
|
:actions="mobileTopBarActions"
|
||||||
@back-click="exitMobileSelectionMode"
|
@back-click="exitMobileSelectionMode"
|
||||||
@menu-click="toggleMobileMenu"
|
@menu-click="showDrawer = true"
|
||||||
@action-click="handleTopBarAction"
|
@action-click="handleTopBarAction"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -128,28 +128,12 @@
|
|||||||
<!-- Mobile More Menu -->
|
<!-- Mobile More Menu -->
|
||||||
<Menu ref="moreMenuRef" :model="moreMenuItems" :popup="true" />
|
<Menu ref="moreMenuRef" :model="moreMenuItems" :popup="true" />
|
||||||
|
|
||||||
<!-- Mobile Hamburger Menu -->
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
<Sidebar v-model:visible="mobileMenuVisible" position="left" class="mobile-sidebar">
|
<MobileDrawerMenu
|
||||||
<template #header>
|
v-model="showDrawer"
|
||||||
<div class="sidebar-header">
|
:user="authStore.user"
|
||||||
<span class="sidebar-title">ROA2WEB</span>
|
@logout="handleLogout"
|
||||||
</div>
|
/>
|
||||||
</template>
|
|
||||||
<div class="sidebar-menu">
|
|
||||||
<router-link to="/data-entry" class="sidebar-item active">
|
|
||||||
<i class="pi pi-receipt"></i>
|
|
||||||
<span>Bonuri</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/dashboard" class="sidebar-item">
|
|
||||||
<i class="pi pi-chart-bar"></i>
|
|
||||||
<span>Rapoarte</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/settings" class="sidebar-item">
|
|
||||||
<i class="pi pi-cog"></i>
|
|
||||||
<span>Setări</span>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</Sidebar>
|
|
||||||
|
|
||||||
<!-- Main Card -->
|
<!-- Main Card -->
|
||||||
<!-- Page Header (centered, no icon) - Desktop only -->
|
<!-- Page Header (centered, no icon) - Desktop only -->
|
||||||
@@ -971,14 +955,14 @@ import { useRouter } from 'vue-router'
|
|||||||
import { useToast } from 'primevue/usetoast'
|
import { useToast } from 'primevue/usetoast'
|
||||||
import { useConfirm } from 'primevue/useconfirm'
|
import { useConfirm } from 'primevue/useconfirm'
|
||||||
import { useReceiptsStore } from '@data-entry/stores/receiptsStore'
|
import { useReceiptsStore } from '@data-entry/stores/receiptsStore'
|
||||||
import { useCompanyStore } from '@data-entry/stores/sharedStores'
|
import { useCompanyStore, useAuthStore } from '@data-entry/stores/sharedStores'
|
||||||
import { useBatchProgressStore } from '@data-entry/stores/batchProgressStore'
|
import { useBatchProgressStore } from '@data-entry/stores/batchProgressStore'
|
||||||
import Menu from 'primevue/menu'
|
import Menu from 'primevue/menu'
|
||||||
import Dialog from 'primevue/dialog'
|
import Dialog from 'primevue/dialog'
|
||||||
import Textarea from 'primevue/textarea'
|
import Textarea from 'primevue/textarea'
|
||||||
import Dropdown from 'primevue/dropdown'
|
import Dropdown from 'primevue/dropdown'
|
||||||
import Checkbox from 'primevue/checkbox'
|
import Checkbox from 'primevue/checkbox'
|
||||||
import Sidebar from 'primevue/sidebar' // US-040: Mobile hamburger menu
|
import MobileDrawerMenu from '@shared/components/mobile/MobileDrawerMenu.vue'
|
||||||
import DragDropOverlay from '@data-entry/components/bulk/DragDropOverlay.vue'
|
import DragDropOverlay from '@data-entry/components/bulk/DragDropOverlay.vue'
|
||||||
// US-103: Mobile Material Design common components
|
// US-103: Mobile Material Design common components
|
||||||
import MobileTopBar from '@shared/components/mobile/MobileTopBar.vue'
|
import MobileTopBar from '@shared/components/mobile/MobileTopBar.vue'
|
||||||
@@ -996,6 +980,7 @@ const confirm = useConfirm()
|
|||||||
const store = useReceiptsStore()
|
const store = useReceiptsStore()
|
||||||
const companyStore = useCompanyStore()
|
const companyStore = useCompanyStore()
|
||||||
const batchProgressStore = useBatchProgressStore()
|
const batchProgressStore = useBatchProgressStore()
|
||||||
|
const authStore = useAuthStore()
|
||||||
|
|
||||||
// Rejection dialog state
|
// Rejection dialog state
|
||||||
const rejectDialogVisible = ref(false)
|
const rejectDialogVisible = ref(false)
|
||||||
@@ -1053,15 +1038,16 @@ const handleResize = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// US-040: Mobile Android-Native Layout State
|
// US-040: Mobile Android-Native Layout State
|
||||||
const mobileMenuVisible = ref(false)
|
const showDrawer = ref(false)
|
||||||
const moreMenuRef = ref(null)
|
const moreMenuRef = ref(null)
|
||||||
const fabVisible = ref(true)
|
const fabVisible = ref(true)
|
||||||
let lastScrollY = 0
|
let lastScrollY = 0
|
||||||
let scrollTimeout = null
|
let scrollTimeout = null
|
||||||
|
|
||||||
// US-040: Toggle mobile hamburger menu
|
// Handle logout from drawer menu
|
||||||
const toggleMobileMenu = () => {
|
const handleLogout = async () => {
|
||||||
mobileMenuVisible.value = !mobileMenuVisible.value
|
await authStore.logout()
|
||||||
|
router.push('/login')
|
||||||
}
|
}
|
||||||
|
|
||||||
// US-040: Toggle more menu (3-dot menu)
|
// US-040: Toggle more menu (3-dot menu)
|
||||||
|
|||||||
@@ -6,36 +6,16 @@
|
|||||||
title="Trezorerie"
|
title="Trezorerie"
|
||||||
:show-menu="true"
|
:show-menu="true"
|
||||||
:actions="mobileTopBarActions"
|
:actions="mobileTopBarActions"
|
||||||
@menu-click="toggleMobileMenu"
|
@menu-click="showDrawer = true"
|
||||||
@action-click="handleTopBarAction"
|
@action-click="handleTopBarAction"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- US-109: Mobile Hamburger Menu -->
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
<Sidebar v-model:visible="mobileMenuVisible" position="left" class="mobile-sidebar">
|
<MobileDrawerMenu
|
||||||
<template #header>
|
v-model="showDrawer"
|
||||||
<div class="sidebar-header">
|
:user="authStore.user"
|
||||||
<span class="sidebar-title">ROA2WEB</span>
|
@logout="handleLogout"
|
||||||
</div>
|
/>
|
||||||
</template>
|
|
||||||
<div class="sidebar-menu">
|
|
||||||
<router-link to="/data-entry" class="sidebar-item">
|
|
||||||
<i class="pi pi-receipt"></i>
|
|
||||||
<span>Bonuri</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/bank-cash-register" class="sidebar-item active">
|
|
||||||
<i class="pi pi-wallet"></i>
|
|
||||||
<span>Trezorerie</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/dashboard" class="sidebar-item">
|
|
||||||
<i class="pi pi-chart-bar"></i>
|
|
||||||
<span>Rapoarte</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/settings" class="sidebar-item">
|
|
||||||
<i class="pi pi-cog"></i>
|
|
||||||
<span>Setări</span>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</Sidebar>
|
|
||||||
|
|
||||||
<!-- US-109: Filter BottomSheet for mobile -->
|
<!-- US-109: Filter BottomSheet for mobile -->
|
||||||
<BottomSheet v-model="showFilters">
|
<BottomSheet v-model="showFilters">
|
||||||
@@ -413,7 +393,7 @@
|
|||||||
import { ref, computed, onMounted, onUnmounted, watch } from "vue";
|
import { ref, computed, onMounted, onUnmounted, watch } from "vue";
|
||||||
import { useToast } from "primevue/usetoast";
|
import { useToast } from "primevue/usetoast";
|
||||||
import { useTreasuryStore } from "@reports/stores/treasury";
|
import { useTreasuryStore } from "@reports/stores/treasury";
|
||||||
import { useCompanyStore } from "@reports/stores/sharedStores";
|
import { useCompanyStore, useAuthStore } from "@reports/stores/sharedStores";
|
||||||
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
||||||
import { format } from "date-fns";
|
import { format } from "date-fns";
|
||||||
import { exportToExcel, exportBankCashRegisterPDF } from "@reports/utils/exportUtils";
|
import { exportToExcel, exportBankCashRegisterPDF } from "@reports/utils/exportUtils";
|
||||||
@@ -422,12 +402,15 @@ import { exportToExcel, exportBankCashRegisterPDF } from "@reports/utils/exportU
|
|||||||
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
||||||
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
||||||
import BottomSheet from "@shared/components/mobile/BottomSheet.vue";
|
import BottomSheet from "@shared/components/mobile/BottomSheet.vue";
|
||||||
import Sidebar from "primevue/sidebar";
|
import MobileDrawerMenu from "@shared/components/mobile/MobileDrawerMenu.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
const toast = useToast();
|
const toast = useToast();
|
||||||
|
const router = useRouter();
|
||||||
const treasuryStore = useTreasuryStore();
|
const treasuryStore = useTreasuryStore();
|
||||||
const companyStore = useCompanyStore();
|
const companyStore = useCompanyStore();
|
||||||
const periodStore = useAccountingPeriodStore();
|
const periodStore = useAccountingPeriodStore();
|
||||||
|
const authStore = useAuthStore();
|
||||||
|
|
||||||
// State for company selection
|
// State for company selection
|
||||||
const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
||||||
@@ -436,11 +419,12 @@ const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
|||||||
const isMobile = ref(window.innerWidth < 768);
|
const isMobile = ref(window.innerWidth < 768);
|
||||||
const showFilters = ref(false);
|
const showFilters = ref(false);
|
||||||
const actionsMenu = ref(null);
|
const actionsMenu = ref(null);
|
||||||
const mobileMenuVisible = ref(false);
|
const showDrawer = ref(false);
|
||||||
|
|
||||||
// US-109: Toggle mobile hamburger menu
|
// Handle logout from drawer menu
|
||||||
const toggleMobileMenu = () => {
|
const handleLogout = async () => {
|
||||||
mobileMenuVisible.value = !mobileMenuVisible.value;
|
await authStore.logout();
|
||||||
|
router.push('/login');
|
||||||
};
|
};
|
||||||
|
|
||||||
// US-109: Mobile TopBar actions (filter, refresh, export)
|
// US-109: Mobile TopBar actions (filter, refresh, export)
|
||||||
|
|||||||
@@ -6,36 +6,16 @@
|
|||||||
title="Statistici Cache"
|
title="Statistici Cache"
|
||||||
:show-menu="true"
|
:show-menu="true"
|
||||||
:actions="mobileTopBarActions"
|
:actions="mobileTopBarActions"
|
||||||
@menu-click="toggleMobileMenu"
|
@menu-click="showDrawer = true"
|
||||||
@action-click="handleTopBarAction"
|
@action-click="handleTopBarAction"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- US-111: Mobile Hamburger Menu -->
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
<Sidebar v-if="isMobile" v-model:visible="mobileMenuVisible" position="left" class="mobile-sidebar">
|
<MobileDrawerMenu
|
||||||
<template #header>
|
v-model="showDrawer"
|
||||||
<div class="sidebar-header">
|
:user="authStore.user"
|
||||||
<span class="sidebar-title">ROA2WEB</span>
|
@logout="handleLogout"
|
||||||
</div>
|
/>
|
||||||
</template>
|
|
||||||
<div class="sidebar-menu">
|
|
||||||
<router-link to="/data-entry" class="sidebar-item">
|
|
||||||
<i class="pi pi-receipt"></i>
|
|
||||||
<span>Bonuri</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/cache-stats" class="sidebar-item active">
|
|
||||||
<i class="pi pi-database"></i>
|
|
||||||
<span>Statistici Cache</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/dashboard" class="sidebar-item">
|
|
||||||
<i class="pi pi-chart-bar"></i>
|
|
||||||
<span>Rapoarte</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/settings" class="sidebar-item">
|
|
||||||
<i class="pi pi-cog"></i>
|
|
||||||
<span>Setări</span>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</Sidebar>
|
|
||||||
|
|
||||||
<!-- Desktop Header -->
|
<!-- Desktop Header -->
|
||||||
<div class="stats-header" v-if="!isMobile">
|
<div class="stats-header" v-if="!isMobile">
|
||||||
@@ -225,7 +205,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onMounted, onUnmounted } from "vue";
|
import { ref, computed, onMounted, onUnmounted } from "vue";
|
||||||
import { useCacheStore } from "@reports/stores/cacheStore";
|
import { useCacheStore } from "@reports/stores/cacheStore";
|
||||||
import { useCompanyStore } from "@reports/stores/sharedStores";
|
import { useCompanyStore, useAuthStore } from "@reports/stores/sharedStores";
|
||||||
import { useToast } from "primevue/usetoast";
|
import { useToast } from "primevue/usetoast";
|
||||||
import Button from "primevue/button";
|
import Button from "primevue/button";
|
||||||
import Card from "primevue/card";
|
import Card from "primevue/card";
|
||||||
@@ -237,15 +217,17 @@ import InputSwitch from "primevue/inputswitch";
|
|||||||
import Dialog from "primevue/dialog";
|
import Dialog from "primevue/dialog";
|
||||||
import RadioButton from "primevue/radiobutton";
|
import RadioButton from "primevue/radiobutton";
|
||||||
import Message from "primevue/message";
|
import Message from "primevue/message";
|
||||||
import Sidebar from "primevue/sidebar";
|
|
||||||
|
|
||||||
// US-111: Mobile Material Design components
|
// US-111: Mobile Material Design components
|
||||||
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
||||||
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
||||||
|
import MobileDrawerMenu from "@shared/components/mobile/MobileDrawerMenu.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
const cacheStore = useCacheStore();
|
const cacheStore = useCacheStore();
|
||||||
const companyStore = useCompanyStore();
|
const companyStore = useCompanyStore();
|
||||||
const toast = useToast();
|
const toast = useToast();
|
||||||
|
const authStore = useAuthStore();
|
||||||
|
|
||||||
const loading = computed(() => cacheStore.isLoading);
|
const loading = computed(() => cacheStore.isLoading);
|
||||||
const error = computed(() => cacheStore.error);
|
const error = computed(() => cacheStore.error);
|
||||||
@@ -257,11 +239,12 @@ const clearScope = ref("current");
|
|||||||
|
|
||||||
// US-111: Mobile state
|
// US-111: Mobile state
|
||||||
const isMobile = ref(window.innerWidth < 768);
|
const isMobile = ref(window.innerWidth < 768);
|
||||||
const mobileMenuVisible = ref(false);
|
const showDrawer = ref(false);
|
||||||
|
|
||||||
// US-111: Toggle mobile hamburger menu
|
// Handle logout from drawer menu
|
||||||
const toggleMobileMenu = () => {
|
const handleLogout = async () => {
|
||||||
mobileMenuVisible.value = !mobileMenuVisible.value;
|
await authStore.logout();
|
||||||
|
router.push('/login');
|
||||||
};
|
};
|
||||||
|
|
||||||
// US-111: Mobile TopBar actions (refresh only for cache stats)
|
// US-111: Mobile TopBar actions (refresh only for cache stats)
|
||||||
|
|||||||
@@ -4,7 +4,14 @@
|
|||||||
v-if="isMobile"
|
v-if="isMobile"
|
||||||
title="Dashboard"
|
title="Dashboard"
|
||||||
:show-menu="true"
|
:show-menu="true"
|
||||||
@menu-click="handleMenuClick"
|
@menu-click="showDrawer = true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
|
<MobileDrawerMenu
|
||||||
|
v-model="showDrawer"
|
||||||
|
:user="authStore.user"
|
||||||
|
@logout="handleLogout"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<main class="main-content" :class="{ 'mobile-layout': isMobile }">
|
<main class="main-content" :class="{ 'mobile-layout': isMobile }">
|
||||||
@@ -191,7 +198,8 @@ import TreasuryDualCard from "@reports/components/dashboard/cards/TreasuryDualCa
|
|||||||
import SwipeableCards from "@shared/components/mobile/SwipeableCards.vue";
|
import SwipeableCards from "@shared/components/mobile/SwipeableCards.vue";
|
||||||
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
||||||
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
||||||
import { useCompanyStore } from "@reports/stores/sharedStores";
|
import MobileDrawerMenu from "@shared/components/mobile/MobileDrawerMenu.vue";
|
||||||
|
import { useCompanyStore, useAuthStore } from "@reports/stores/sharedStores";
|
||||||
import { useDashboardStore } from "@reports/stores/dashboard";
|
import { useDashboardStore } from "@reports/stores/dashboard";
|
||||||
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
||||||
import api from "@reports/services/api";
|
import api from "@reports/services/api";
|
||||||
@@ -206,10 +214,12 @@ const router = useRouter();
|
|||||||
const companyStore = useCompanyStore();
|
const companyStore = useCompanyStore();
|
||||||
const dashboardStore = useDashboardStore();
|
const dashboardStore = useDashboardStore();
|
||||||
const periodStore = useAccountingPeriodStore();
|
const periodStore = useAccountingPeriodStore();
|
||||||
|
const authStore = useAuthStore();
|
||||||
|
|
||||||
// State
|
// State
|
||||||
const filteredCompanies = ref([]);
|
const filteredCompanies = ref([]);
|
||||||
const isLoading = ref(false);
|
const isLoading = ref(false);
|
||||||
|
const showDrawer = ref(false);
|
||||||
|
|
||||||
// State pentru carduri
|
// State pentru carduri
|
||||||
const monthlyInflows = ref(0);
|
const monthlyInflows = ref(0);
|
||||||
@@ -537,10 +547,10 @@ const mobileNavItems = computed(() => [
|
|||||||
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
|
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări' }
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Handle hamburger menu click
|
// Handle logout from drawer menu
|
||||||
const handleMenuClick = () => {
|
const handleLogout = async () => {
|
||||||
// TODO: Will be handled by MobileDrawerMenu in US-202
|
await authStore.logout();
|
||||||
console.log('Menu clicked - drawer will be implemented in US-202');
|
router.push('/login');
|
||||||
};
|
};
|
||||||
|
|
||||||
// Computed property pentru luna curentă - folosește perioada din period selector
|
// Computed property pentru luna curentă - folosește perioada din period selector
|
||||||
|
|||||||
@@ -6,36 +6,16 @@
|
|||||||
title="Facturi"
|
title="Facturi"
|
||||||
:show-menu="true"
|
:show-menu="true"
|
||||||
:actions="mobileTopBarActions"
|
:actions="mobileTopBarActions"
|
||||||
@menu-click="toggleMobileMenu"
|
@menu-click="showDrawer = true"
|
||||||
@action-click="handleTopBarAction"
|
@action-click="handleTopBarAction"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- US-107: Mobile Hamburger Menu -->
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
<Sidebar v-model:visible="mobileMenuVisible" position="left" class="mobile-sidebar">
|
<MobileDrawerMenu
|
||||||
<template #header>
|
v-model="showDrawer"
|
||||||
<div class="sidebar-header">
|
:user="authStore.user"
|
||||||
<span class="sidebar-title">ROA2WEB</span>
|
@logout="handleLogout"
|
||||||
</div>
|
/>
|
||||||
</template>
|
|
||||||
<div class="sidebar-menu">
|
|
||||||
<router-link to="/data-entry" class="sidebar-item">
|
|
||||||
<i class="pi pi-receipt"></i>
|
|
||||||
<span>Bonuri</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/invoices" class="sidebar-item active">
|
|
||||||
<i class="pi pi-file-text"></i>
|
|
||||||
<span>Facturi</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/dashboard" class="sidebar-item">
|
|
||||||
<i class="pi pi-chart-bar"></i>
|
|
||||||
<span>Rapoarte</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/settings" class="sidebar-item">
|
|
||||||
<i class="pi pi-cog"></i>
|
|
||||||
<span>Setări</span>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</Sidebar>
|
|
||||||
|
|
||||||
<!-- US-107: Filter BottomSheet for mobile -->
|
<!-- US-107: Filter BottomSheet for mobile -->
|
||||||
<BottomSheet v-model="showFilters">
|
<BottomSheet v-model="showFilters">
|
||||||
@@ -395,7 +375,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onMounted, onUnmounted, watch } from "vue";
|
import { ref, computed, onMounted, onUnmounted, watch } from "vue";
|
||||||
import { useToast } from "primevue/usetoast";
|
import { useToast } from "primevue/usetoast";
|
||||||
import { useCompanyStore } from "@reports/stores/sharedStores";
|
import { useCompanyStore, useAuthStore } from "@reports/stores/sharedStores";
|
||||||
import { useInvoicesStore } from "@reports/stores/invoices";
|
import { useInvoicesStore } from "@reports/stores/invoices";
|
||||||
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
||||||
import { format } from "date-fns";
|
import { format } from "date-fns";
|
||||||
@@ -406,12 +386,15 @@ import { exportToExcel, exportToPDF } from "@reports/utils/exportUtils";
|
|||||||
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
||||||
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
||||||
import BottomSheet from "@shared/components/mobile/BottomSheet.vue";
|
import BottomSheet from "@shared/components/mobile/BottomSheet.vue";
|
||||||
import Sidebar from "primevue/sidebar";
|
import MobileDrawerMenu from "@shared/components/mobile/MobileDrawerMenu.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
const toast = useToast();
|
const toast = useToast();
|
||||||
|
const router = useRouter();
|
||||||
const companyStore = useCompanyStore();
|
const companyStore = useCompanyStore();
|
||||||
const invoicesStore = useInvoicesStore();
|
const invoicesStore = useInvoicesStore();
|
||||||
const periodStore = useAccountingPeriodStore();
|
const periodStore = useAccountingPeriodStore();
|
||||||
|
const authStore = useAuthStore();
|
||||||
|
|
||||||
// State
|
// State
|
||||||
const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
||||||
@@ -419,12 +402,13 @@ const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
|||||||
// Mobile state
|
// Mobile state
|
||||||
const isMobile = ref(window.innerWidth < 768);
|
const isMobile = ref(window.innerWidth < 768);
|
||||||
const showFilters = ref(false);
|
const showFilters = ref(false);
|
||||||
const mobileMenuVisible = ref(false);
|
const showDrawer = ref(false);
|
||||||
const actionsMenu = ref(null);
|
const actionsMenu = ref(null);
|
||||||
|
|
||||||
// US-107: Toggle mobile hamburger menu
|
// Handle logout from drawer menu
|
||||||
const toggleMobileMenu = () => {
|
const handleLogout = async () => {
|
||||||
mobileMenuVisible.value = !mobileMenuVisible.value;
|
await authStore.logout();
|
||||||
|
router.push('/login');
|
||||||
};
|
};
|
||||||
|
|
||||||
// US-107: Mobile TopBar actions (refresh + export)
|
// US-107: Mobile TopBar actions (refresh + export)
|
||||||
|
|||||||
@@ -6,36 +6,16 @@
|
|||||||
title="Loguri Server"
|
title="Loguri Server"
|
||||||
:show-menu="true"
|
:show-menu="true"
|
||||||
:actions="mobileTopBarActions"
|
:actions="mobileTopBarActions"
|
||||||
@menu-click="toggleMobileMenu"
|
@menu-click="showDrawer = true"
|
||||||
@action-click="handleTopBarAction"
|
@action-click="handleTopBarAction"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- US-110: Mobile Hamburger Menu -->
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
<Sidebar v-if="isMobile" v-model:visible="mobileMenuVisible" position="left" class="mobile-sidebar">
|
<MobileDrawerMenu
|
||||||
<template #header>
|
v-model="showDrawer"
|
||||||
<div class="sidebar-header">
|
:user="authStore.user"
|
||||||
<span class="sidebar-title">ROA2WEB</span>
|
@logout="handleLogout"
|
||||||
</div>
|
/>
|
||||||
</template>
|
|
||||||
<div class="sidebar-menu">
|
|
||||||
<router-link to="/data-entry" class="sidebar-item">
|
|
||||||
<i class="pi pi-receipt"></i>
|
|
||||||
<span>Bonuri</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/server-logs" class="sidebar-item active">
|
|
||||||
<i class="pi pi-file-edit"></i>
|
|
||||||
<span>Loguri Server</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/dashboard" class="sidebar-item">
|
|
||||||
<i class="pi pi-chart-bar"></i>
|
|
||||||
<span>Rapoarte</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/settings" class="sidebar-item">
|
|
||||||
<i class="pi pi-cog"></i>
|
|
||||||
<span>Setări</span>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</Sidebar>
|
|
||||||
|
|
||||||
<!-- Desktop Header -->
|
<!-- Desktop Header -->
|
||||||
<div class="stats-header" v-if="!isMobile">
|
<div class="stats-header" v-if="!isMobile">
|
||||||
@@ -160,12 +140,14 @@ import InputText from 'primevue/inputtext'
|
|||||||
import Message from 'primevue/message'
|
import Message from 'primevue/message'
|
||||||
import ProgressSpinner from 'primevue/progressspinner'
|
import ProgressSpinner from 'primevue/progressspinner'
|
||||||
import Tag from 'primevue/tag'
|
import Tag from 'primevue/tag'
|
||||||
import Sidebar from 'primevue/sidebar'
|
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
// US-110: Mobile Material Design components
|
// US-110: Mobile Material Design components
|
||||||
import MobileTopBar from '@shared/components/mobile/MobileTopBar.vue'
|
import MobileTopBar from '@shared/components/mobile/MobileTopBar.vue'
|
||||||
import MobileBottomNav from '@shared/components/mobile/MobileBottomNav.vue'
|
import MobileBottomNav from '@shared/components/mobile/MobileBottomNav.vue'
|
||||||
|
import MobileDrawerMenu from '@shared/components/mobile/MobileDrawerMenu.vue'
|
||||||
|
import { useAuthStore } from '@reports/stores/sharedStores'
|
||||||
|
|
||||||
// System API - endpoint separat de reports
|
// System API - endpoint separat de reports
|
||||||
const systemApi = axios.create({
|
const systemApi = axios.create({
|
||||||
@@ -182,6 +164,9 @@ systemApi.interceptors.request.use((config) => {
|
|||||||
return config
|
return config
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
const authStore = useAuthStore()
|
||||||
|
|
||||||
// State
|
// State
|
||||||
const logs = ref([])
|
const logs = ref([])
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
@@ -202,11 +187,12 @@ let refreshTimer = null
|
|||||||
|
|
||||||
// US-110: Mobile state
|
// US-110: Mobile state
|
||||||
const isMobile = ref(window.innerWidth < 768)
|
const isMobile = ref(window.innerWidth < 768)
|
||||||
const mobileMenuVisible = ref(false)
|
const showDrawer = ref(false)
|
||||||
|
|
||||||
// US-110: Toggle mobile hamburger menu
|
// Handle logout from drawer menu
|
||||||
const toggleMobileMenu = () => {
|
const handleLogout = async () => {
|
||||||
mobileMenuVisible.value = !mobileMenuVisible.value
|
await authStore.logout()
|
||||||
|
router.push('/login')
|
||||||
}
|
}
|
||||||
|
|
||||||
// US-110: Mobile TopBar actions (refresh, export)
|
// US-110: Mobile TopBar actions (refresh, export)
|
||||||
|
|||||||
@@ -4,7 +4,14 @@
|
|||||||
v-if="isMobile"
|
v-if="isMobile"
|
||||||
title="Setări"
|
title="Setări"
|
||||||
:show-menu="true"
|
:show-menu="true"
|
||||||
@menu-click="handleMenuClick"
|
@menu-click="showDrawer = true"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
|
<MobileDrawerMenu
|
||||||
|
v-model="showDrawer"
|
||||||
|
:user="authStore.user"
|
||||||
|
@logout="handleLogout"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<main class="main-content" :class="{ 'mobile-layout': isMobile }">
|
<main class="main-content" :class="{ 'mobile-layout': isMobile }">
|
||||||
@@ -77,8 +84,17 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
import { ref, computed, onMounted, onUnmounted } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
import MobileTopBar from '@shared/components/mobile/MobileTopBar.vue'
|
import MobileTopBar from '@shared/components/mobile/MobileTopBar.vue'
|
||||||
import MobileBottomNav from '@shared/components/mobile/MobileBottomNav.vue'
|
import MobileBottomNav from '@shared/components/mobile/MobileBottomNav.vue'
|
||||||
|
import MobileDrawerMenu from '@shared/components/mobile/MobileDrawerMenu.vue'
|
||||||
|
import { useAuthStore } from '@reports/stores/sharedStores'
|
||||||
|
|
||||||
|
const router = useRouter()
|
||||||
|
const authStore = useAuthStore()
|
||||||
|
|
||||||
|
// State
|
||||||
|
const showDrawer = ref(false)
|
||||||
|
|
||||||
// Detectare mobile - reactive with resize listener
|
// Detectare mobile - reactive with resize listener
|
||||||
const windowWidth = ref(window.innerWidth)
|
const windowWidth = ref(window.innerWidth)
|
||||||
@@ -89,10 +105,10 @@ const handleResize = () => {
|
|||||||
windowWidth.value = window.innerWidth
|
windowWidth.value = window.innerWidth
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle hamburger menu click
|
// Handle logout from drawer menu
|
||||||
const handleMenuClick = () => {
|
const handleLogout = async () => {
|
||||||
// TODO: Will be handled by MobileDrawerMenu
|
await authStore.logout()
|
||||||
console.log('Menu clicked - drawer integration pending')
|
router.push('/login')
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mobile navigation items - Settings is active on this page
|
// Mobile navigation items - Settings is active on this page
|
||||||
|
|||||||
@@ -6,36 +6,16 @@
|
|||||||
title="Balanță de Verificare"
|
title="Balanță de Verificare"
|
||||||
:show-menu="true"
|
:show-menu="true"
|
||||||
:actions="mobileTopBarActions"
|
:actions="mobileTopBarActions"
|
||||||
@menu-click="toggleMobileMenu"
|
@menu-click="showDrawer = true"
|
||||||
@action-click="handleTopBarAction"
|
@action-click="handleTopBarAction"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- US-108: Mobile Hamburger Menu -->
|
<!-- Mobile Drawer Menu (replaces old Sidebar) -->
|
||||||
<Sidebar v-model:visible="mobileMenuVisible" position="left" class="mobile-sidebar">
|
<MobileDrawerMenu
|
||||||
<template #header>
|
v-model="showDrawer"
|
||||||
<div class="sidebar-header">
|
:user="authStore.user"
|
||||||
<span class="sidebar-title">ROA2WEB</span>
|
@logout="handleLogout"
|
||||||
</div>
|
/>
|
||||||
</template>
|
|
||||||
<div class="sidebar-menu">
|
|
||||||
<router-link to="/data-entry" class="sidebar-item">
|
|
||||||
<i class="pi pi-receipt"></i>
|
|
||||||
<span>Bonuri</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/trial-balance" class="sidebar-item active">
|
|
||||||
<i class="pi pi-calculator"></i>
|
|
||||||
<span>Balanță</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/reports/dashboard" class="sidebar-item">
|
|
||||||
<i class="pi pi-chart-bar"></i>
|
|
||||||
<span>Rapoarte</span>
|
|
||||||
</router-link>
|
|
||||||
<router-link to="/settings" class="sidebar-item">
|
|
||||||
<i class="pi pi-cog"></i>
|
|
||||||
<span>Setări</span>
|
|
||||||
</router-link>
|
|
||||||
</div>
|
|
||||||
</Sidebar>
|
|
||||||
|
|
||||||
<!-- US-108: Filter BottomSheet for mobile -->
|
<!-- US-108: Filter BottomSheet for mobile -->
|
||||||
<BottomSheet v-model="showFilters">
|
<BottomSheet v-model="showFilters">
|
||||||
@@ -391,7 +371,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed, onMounted, onUnmounted, watch } from "vue";
|
import { ref, computed, onMounted, onUnmounted, watch } from "vue";
|
||||||
import { useToast } from "primevue/usetoast";
|
import { useToast } from "primevue/usetoast";
|
||||||
import { useCompanyStore } from "@reports/stores/sharedStores";
|
import { useCompanyStore, useAuthStore } from "@reports/stores/sharedStores";
|
||||||
import { useTrialBalanceStore } from "@reports/stores/trialBalance";
|
import { useTrialBalanceStore } from "@reports/stores/trialBalance";
|
||||||
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
import { useAccountingPeriodStore } from "@reports/stores/sharedStores";
|
||||||
import { exportToExcel, exportToPDF } from "@reports/utils/exportUtils";
|
import { exportToExcel, exportToPDF } from "@reports/utils/exportUtils";
|
||||||
@@ -400,12 +380,15 @@ import { exportToExcel, exportToPDF } from "@reports/utils/exportUtils";
|
|||||||
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
import MobileTopBar from "@shared/components/mobile/MobileTopBar.vue";
|
||||||
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
import MobileBottomNav from "@shared/components/mobile/MobileBottomNav.vue";
|
||||||
import BottomSheet from "@shared/components/mobile/BottomSheet.vue";
|
import BottomSheet from "@shared/components/mobile/BottomSheet.vue";
|
||||||
import Sidebar from "primevue/sidebar";
|
import MobileDrawerMenu from "@shared/components/mobile/MobileDrawerMenu.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
const toast = useToast();
|
const toast = useToast();
|
||||||
|
const router = useRouter();
|
||||||
const companyStore = useCompanyStore();
|
const companyStore = useCompanyStore();
|
||||||
const trialBalanceStore = useTrialBalanceStore();
|
const trialBalanceStore = useTrialBalanceStore();
|
||||||
const periodStore = useAccountingPeriodStore();
|
const periodStore = useAccountingPeriodStore();
|
||||||
|
const authStore = useAuthStore();
|
||||||
|
|
||||||
// State
|
// State
|
||||||
const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
||||||
@@ -413,12 +396,13 @@ const selectedCompanyId = ref(companyStore.selectedCompany?.id_firma || null);
|
|||||||
// Mobile state
|
// Mobile state
|
||||||
const isMobile = ref(window.innerWidth < 768);
|
const isMobile = ref(window.innerWidth < 768);
|
||||||
const showFilters = ref(false);
|
const showFilters = ref(false);
|
||||||
const mobileMenuVisible = ref(false);
|
const showDrawer = ref(false);
|
||||||
const actionsMenu = ref(null);
|
const actionsMenu = ref(null);
|
||||||
|
|
||||||
// US-108: Toggle mobile hamburger menu
|
// Handle logout from drawer menu
|
||||||
const toggleMobileMenu = () => {
|
const handleLogout = async () => {
|
||||||
mobileMenuVisible.value = !mobileMenuVisible.value;
|
await authStore.logout();
|
||||||
|
router.push('/login');
|
||||||
};
|
};
|
||||||
|
|
||||||
// US-108: Mobile TopBar actions (filter + export)
|
// US-108: Mobile TopBar actions (filter + export)
|
||||||
|
|||||||
Reference in New Issue
Block a user