fix: correct work-order navbar state and actions
Some checks failed
ERP CI/CD Pipeline / test (push) Has been cancelled
ERP CI/CD Pipeline / Deploy (server git pull + compose) (push) Has been cancelled

Use prefix path matching so nested putni-nalozi routes highlight the correct nav item, load current user data in Navbar when auth token exists, and group PDF/DOCX work-order download buttons in one action block.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
mariomitte
2026-08-07 07:36:58 +02:00
parent 27b7c31c13
commit ee18af7877
2 changed files with 29 additions and 19 deletions

View File

@@ -4,7 +4,7 @@ import AuthWidget from './AuthWidget';
import UserDisplay from './ui/UserDisplay'; import UserDisplay from './ui/UserDisplay';
import { useEffect, useRef, useState } from 'preact/hooks'; import { useEffect, useRef, useState } from 'preact/hooks';
import { useSpring, animated } from '@react-spring/web'; import { useSpring, animated } from '@react-spring/web';
import { hydrateAuthFromStorage } from '../stores/authStore'; import { hydrateAuthFromStorage, loadCurrentUser, $user, $accessToken } from '../stores/authStore';
const ITEMS = [ const ITEMS = [
{ id: 'dashboard', label: 'Dashboard', href: '/' }, { id: 'dashboard', label: 'Dashboard', href: '/' },
@@ -21,8 +21,12 @@ function normalizePath(p) {
} }
function getActiveIndex(path) { function getActiveIndex(path) {
const idx = ITEMS.findIndex((item) => item.href === path); // Exact match (e.g. '/' → Dashboard)
return idx >= 0 ? idx : 0; const exact = ITEMS.findIndex((item) => item.href === path);
if (exact >= 0) return exact;
// Prefix match for sub-paths (e.g. '/putni-nalozi/racuni' → Putni nalozi)
const prefix = ITEMS.findIndex((item) => item.href !== '/' && path.startsWith(item.href));
return prefix >= 0 ? prefix : 0;
} }
export default function Navbar({ minimal = false }) { export default function Navbar({ minimal = false }) {
@@ -55,6 +59,10 @@ export default function Navbar({ minimal = false }) {
// Mount: izmjeri početnu poziciju bez animacije, pa uključi animaciju za buduće navigacije // Mount: izmjeri početnu poziciju bez animacije, pa uključi animaciju za buduće navigacije
useEffect(() => { useEffect(() => {
hydrateAuthFromStorage(); hydrateAuthFromStorage();
// Učitaj korisnika ako token postoji ali $user još nije popunjen
if (!$user.get() && $accessToken.get()) {
loadCurrentUser();
}
const timer = setTimeout(() => { const timer = setTimeout(() => {
measureIndicator(); measureIndicator();

View File

@@ -321,22 +321,24 @@ export default function WorkOrderInvoicesPdfPage() {
{workOrder ? `Dizalica: ${workOrder.crane_label || workOrder.crane || '-'}` : 'Pregled računa prije kreiranja PDF-a.'} {workOrder ? `Dizalica: ${workOrder.crane_label || workOrder.crane || '-'}` : 'Pregled računa prije kreiranja PDF-a.'}
</p> </p>
</div> </div>
<button <div className="flex flex-wrap items-center gap-2">
type="button" <button
onClick={() => downloadWorkOrderPdf(workOrderId)} type="button"
disabled={!workOrderId} onClick={() => downloadWorkOrderPdf(workOrderId)}
className="rounded-lg bg-indigo-600 px-4 py-2 text-sm font-semibold text-white hover:bg-indigo-700 disabled:opacity-60" disabled={!workOrderId}
> className="rounded-lg bg-indigo-600 px-4 py-2 text-sm font-semibold text-white hover:bg-indigo-700 disabled:opacity-60"
Preuzmi PDF putnog naloga >
</button> Preuzmi PDF putnog naloga
<button </button>
type="button" <button
onClick={() => downloadWorkOrderDocx(workOrderId)} type="button"
disabled={!workOrderId} onClick={() => downloadWorkOrderDocx(workOrderId)}
className="rounded-lg border border-border-hairline px-4 py-2 text-sm font-semibold text-text-main hover:bg-canvas-deep disabled:opacity-60" disabled={!workOrderId}
> className="rounded-lg border border-border-hairline px-4 py-2 text-sm font-semibold text-text-main hover:bg-canvas-deep disabled:opacity-60"
Preuzmi DOCX putnog naloga >
</button> Preuzmi DOCX putnog naloga
</button>
</div>
</div> </div>
</div> </div>