feat(unified-mobile-desktop-ui): Complete US-505 - Meniu Hamburger Desktop = Mobil
Implemented by Ralph autonomous loop. Iteration: 5 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -133,8 +133,8 @@
|
|||||||
"npm run build passes",
|
"npm run build passes",
|
||||||
"Verify in browser desktop: meniul arată la fel ca pe mobil ca structură"
|
"Verify in browser desktop: meniul arată la fel ca pe mobil ca structură"
|
||||||
],
|
],
|
||||||
"passes": false,
|
"passes": true,
|
||||||
"notes": ""
|
"notes": "Completed in iteration 5"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "US-506",
|
"id": "US-506",
|
||||||
|
|||||||
@@ -94,3 +94,9 @@ Design Reference: src/modules/reports/views/InvoicesView.vue
|
|||||||
[2026-01-12 22:23:53] Working on story: US-504
|
[2026-01-12 22:23:53] Working on story: US-504
|
||||||
[2026-01-12 22:23:53] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_4_US-504.log)
|
[2026-01-12 22:23:53] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_4_US-504.log)
|
||||||
[2026-01-12 22:27:34] SUCCESS: Story US-504 passed!
|
[2026-01-12 22:27:34] SUCCESS: Story US-504 passed!
|
||||||
|
[2026-01-12 22:27:34] Changes committed
|
||||||
|
[2026-01-12 22:27:34] Progress: 4/19 stories completed
|
||||||
|
[2026-01-12 22:27:36] === Iteration 5/100 ===
|
||||||
|
[2026-01-12 22:27:36] Working on story: US-505
|
||||||
|
[2026-01-12 22:27:36] Running Claude... (log: /workspace/roa2web/scripts/ralph/logs/iteration_5_US-505.log)
|
||||||
|
[2026-01-12 22:29:44] SUCCESS: Story US-505 passed!
|
||||||
|
|||||||
@@ -7,83 +7,75 @@
|
|||||||
@click="closeMenu"
|
@click="closeMenu"
|
||||||
></div>
|
></div>
|
||||||
|
|
||||||
<!-- Slide Menu -->
|
<!-- Slide Menu - Unified structure matching MobileDrawerMenu -->
|
||||||
<nav class="slide-menu" :class="{ open: isOpen }">
|
<nav class="slide-menu" :class="{ open: isOpen }">
|
||||||
<!-- Navigation Section -->
|
<!-- PRINCIPALE Section -->
|
||||||
<div class="menu-section">
|
<div class="menu-section">
|
||||||
<h3 class="menu-title">Navigare</h3>
|
<h3 class="menu-title">Principale</h3>
|
||||||
<ul class="menu-list">
|
<ul class="menu-list">
|
||||||
<li class="menu-item">
|
<li class="menu-item" v-for="item in principaleItems" :key="item.to">
|
||||||
<router-link
|
<router-link
|
||||||
to="/reports/dashboard"
|
:to="item.to"
|
||||||
class="menu-link"
|
class="menu-link"
|
||||||
:class="{ active: $route.name === 'Dashboard' }"
|
:class="{ active: isActive(item.to, item.exactMatch) }"
|
||||||
@click="closeMenu"
|
@click="closeMenu"
|
||||||
>
|
>
|
||||||
<i class="menu-icon pi pi-home"></i>
|
<i :class="['menu-icon', item.icon]"></i>
|
||||||
<span>Dashboard</span>
|
<span>{{ item.label }}</span>
|
||||||
</router-link>
|
|
||||||
</li>
|
|
||||||
<li class="menu-item">
|
|
||||||
<router-link
|
|
||||||
to="/reports/invoices"
|
|
||||||
class="menu-link"
|
|
||||||
:class="{ active: $route.name === 'Invoices' }"
|
|
||||||
@click="closeMenu"
|
|
||||||
>
|
|
||||||
<i class="menu-icon pi pi-file"></i>
|
|
||||||
<span>Facturi</span>
|
|
||||||
</router-link>
|
|
||||||
</li>
|
|
||||||
<li class="menu-item">
|
|
||||||
<router-link
|
|
||||||
to="/reports/bank-cash"
|
|
||||||
class="menu-link"
|
|
||||||
:class="{ active: $route.name === 'BankCash' }"
|
|
||||||
@click="closeMenu"
|
|
||||||
>
|
|
||||||
<i class="menu-icon pi pi-money-bill"></i>
|
|
||||||
<span>Casa și Banca</span>
|
|
||||||
</router-link>
|
|
||||||
</li>
|
|
||||||
<li class="menu-item">
|
|
||||||
<router-link
|
|
||||||
to="/reports/trial-balance"
|
|
||||||
class="menu-link"
|
|
||||||
:class="{ active: $route.name === 'TrialBalance' }"
|
|
||||||
@click="closeMenu"
|
|
||||||
>
|
|
||||||
<i class="menu-icon pi pi-calculator"></i>
|
|
||||||
<span>Balanță de Verificare</span>
|
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- System Section -->
|
<!-- RAPOARTE Section -->
|
||||||
<div class="menu-section">
|
<div class="menu-section">
|
||||||
<h3 class="menu-title">Sistem</h3>
|
<h3 class="menu-title">Rapoarte</h3>
|
||||||
<ul class="menu-list">
|
<ul class="menu-list">
|
||||||
<li class="menu-item">
|
<li class="menu-item" v-for="item in rapoarteItems" :key="item.to">
|
||||||
<router-link
|
<router-link
|
||||||
to="/reports/cache-stats"
|
:to="item.to"
|
||||||
class="menu-link"
|
class="menu-link"
|
||||||
:class="{ active: $route.name === 'CacheStats' }"
|
:class="{ active: isActive(item.to, item.exactMatch) }"
|
||||||
@click="closeMenu"
|
@click="closeMenu"
|
||||||
>
|
>
|
||||||
<i class="menu-icon pi pi-chart-bar"></i>
|
<i :class="['menu-icon', item.icon]"></i>
|
||||||
<span>Statistici cache</span>
|
<span>{{ item.label }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li class="menu-item">
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ANALIZE Section -->
|
||||||
|
<div class="menu-section">
|
||||||
|
<h3 class="menu-title">Analize</h3>
|
||||||
|
<ul class="menu-list">
|
||||||
|
<li class="menu-item" v-for="item in analizeItems" :key="item.to">
|
||||||
<router-link
|
<router-link
|
||||||
to="/reports/server-logs"
|
:to="item.to"
|
||||||
class="menu-link"
|
class="menu-link"
|
||||||
:class="{ active: $route.name === 'ServerLogs' }"
|
:class="{ active: isActive(item.to, item.exactMatch) }"
|
||||||
@click="closeMenu"
|
@click="closeMenu"
|
||||||
>
|
>
|
||||||
<i class="menu-icon pi pi-file-edit"></i>
|
<i :class="['menu-icon', item.icon]"></i>
|
||||||
<span>Server Logs</span>
|
<span>{{ item.label }}</span>
|
||||||
|
</router-link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ADMINISTRARE Section -->
|
||||||
|
<div class="menu-section">
|
||||||
|
<h3 class="menu-title">Administrare</h3>
|
||||||
|
<ul class="menu-list">
|
||||||
|
<li class="menu-item" v-for="item in administrareItems" :key="item.to">
|
||||||
|
<router-link
|
||||||
|
:to="item.to"
|
||||||
|
class="menu-link"
|
||||||
|
:class="{ active: isActive(item.to, item.exactMatch) }"
|
||||||
|
@click="closeMenu"
|
||||||
|
>
|
||||||
|
<i :class="['menu-icon', item.icon]"></i>
|
||||||
|
<span>{{ item.label }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -97,18 +89,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<ul class="menu-list">
|
<ul class="menu-list">
|
||||||
<li class="menu-item">
|
<li class="menu-item">
|
||||||
<router-link
|
<a href="#" class="menu-link menu-link-logout" @click.prevent="handleLogout">
|
||||||
to="/reports/telegram"
|
|
||||||
class="menu-link"
|
|
||||||
:class="{ active: $route.name === 'Telegram' }"
|
|
||||||
@click="closeMenu"
|
|
||||||
>
|
|
||||||
<i class="menu-icon pi pi-telegram"></i>
|
|
||||||
<span>Telegram Bot</span>
|
|
||||||
</router-link>
|
|
||||||
</li>
|
|
||||||
<li class="menu-item">
|
|
||||||
<a href="#" class="menu-link" @click.prevent="handleLogout">
|
|
||||||
<i class="menu-icon pi pi-sign-out"></i>
|
<i class="menu-icon pi pi-sign-out"></i>
|
||||||
<span>Deconectare</span>
|
<span>Deconectare</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -120,8 +101,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { computed } from "vue";
|
import { computed, ref } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import { useAuthStore } from "@reports/stores/sharedStores";
|
import { useAuthStore } from "@reports/stores/sharedStores";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -134,13 +115,51 @@ export default {
|
|||||||
},
|
},
|
||||||
emits: ["close"],
|
emits: ["close"],
|
||||||
setup(props, { emit }) {
|
setup(props, { emit }) {
|
||||||
console.log('[HamburgerMenu] Component loaded - Server Logs should be visible in Sistem section');
|
const route = useRoute();
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const authStore = useAuthStore();
|
const authStore = useAuthStore();
|
||||||
|
|
||||||
const currentUser = computed(() => authStore.currentUser);
|
const currentUser = computed(() => authStore.currentUser);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Navigation items organized by category - matching MobileDrawerMenu structure
|
||||||
|
*/
|
||||||
|
|
||||||
|
// PRINCIPALE: Dashboard, Bonuri
|
||||||
|
const principaleItems = ref([
|
||||||
|
{ to: '/dashboard', icon: 'pi pi-home', label: 'Dashboard', exactMatch: true },
|
||||||
|
{ to: '/data-entry', icon: 'pi pi-receipt', label: 'Bonuri', exactMatch: false }
|
||||||
|
]);
|
||||||
|
|
||||||
|
// RAPOARTE: Facturi, Balanță, Casa și Banca
|
||||||
|
const rapoarteItems = ref([
|
||||||
|
{ to: '/reports/invoices', icon: 'pi pi-file', label: 'Facturi', exactMatch: true },
|
||||||
|
{ to: '/reports/trial-balance', icon: 'pi pi-calculator', label: 'Balanță', exactMatch: true },
|
||||||
|
{ to: '/reports/bank-cash', icon: 'pi pi-money-bill', label: 'Casa și Banca', exactMatch: true }
|
||||||
|
]);
|
||||||
|
|
||||||
|
// ANALIZE: Scadențe, Facturi Detaliate
|
||||||
|
const analizeItems = ref([
|
||||||
|
{ to: '/reports/maturity-analysis', icon: 'pi pi-clock', label: 'Scadențe', exactMatch: true },
|
||||||
|
{ to: '/reports/detailed-invoices', icon: 'pi pi-list', label: 'Facturi Detaliate', exactMatch: true }
|
||||||
|
]);
|
||||||
|
|
||||||
|
// ADMINISTRARE: Setări
|
||||||
|
const administrareItems = ref([
|
||||||
|
{ to: '/settings', icon: 'pi pi-cog', label: 'Setări', exactMatch: false }
|
||||||
|
]);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a navigation item is active based on current route
|
||||||
|
*/
|
||||||
|
const isActive = (to, exactMatch) => {
|
||||||
|
if (exactMatch) {
|
||||||
|
return route.path === to;
|
||||||
|
}
|
||||||
|
// For non-exact match, check if current path starts with the route
|
||||||
|
return route.path.startsWith(to);
|
||||||
|
};
|
||||||
|
|
||||||
const closeMenu = () => {
|
const closeMenu = () => {
|
||||||
emit("close");
|
emit("close");
|
||||||
};
|
};
|
||||||
@@ -157,9 +176,57 @@ export default {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
currentUser,
|
currentUser,
|
||||||
|
principaleItems,
|
||||||
|
rapoarteItems,
|
||||||
|
analizeItems,
|
||||||
|
administrareItems,
|
||||||
|
isActive,
|
||||||
closeMenu,
|
closeMenu,
|
||||||
handleLogout,
|
handleLogout,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
/* Logout link styling - matches MobileDrawerMenu */
|
||||||
|
.menu-link-logout {
|
||||||
|
color: var(--color-error);
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link-logout .menu-icon {
|
||||||
|
color: var(--color-error);
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-link-logout:hover {
|
||||||
|
background: var(--red-50);
|
||||||
|
color: var(--color-error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dark mode support */
|
||||||
|
[data-theme="dark"] .menu-link-logout {
|
||||||
|
color: var(--red-400);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="dark"] .menu-link-logout .menu-icon {
|
||||||
|
color: var(--red-400);
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-theme="dark"] .menu-link-logout:hover {
|
||||||
|
background: var(--red-900);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root:not([data-theme]) .menu-link-logout {
|
||||||
|
color: var(--red-400);
|
||||||
|
}
|
||||||
|
|
||||||
|
:root:not([data-theme]) .menu-link-logout .menu-icon {
|
||||||
|
color: var(--red-400);
|
||||||
|
}
|
||||||
|
|
||||||
|
:root:not([data-theme]) .menu-link-logout:hover {
|
||||||
|
background: var(--red-900);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
Reference in New Issue
Block a user