Revízny systém - kompletná implementácia

- Backend: CRUD revízií, schedule endpoint (agregovaný plán), skip revízia, stats
- Shared utility revisionSchedule.ts - centralizovaná logika výpočtu cyklov
- Equipment detail s revíznym plánom, históriou a prílohami
- Frontend: RevisionsList s tabmi (nadchádzajúce/po termíne/vykonané/preskočené)
- Pozičné labeling cyklov (eliminuje drift 4×90≠365)
- EquipmentRevisionSchedule model (many-to-many typy revízií)
- Aktualizovaná dokumentácia HELPDESK_INIT_V2.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 21:59:23 +01:00
parent 2ca0c4f4d8
commit da265ff097
28 changed files with 4587 additions and 149 deletions

View File

@@ -5,6 +5,7 @@ import {
CheckSquare,
Users,
Wrench,
ClipboardCheck,
RotateCcw,
X,
} from 'lucide-react';
@@ -17,6 +18,7 @@ const navItems = [
{ to: '/projects', icon: FolderKanban, label: 'Zákazky' },
{ to: '/customers', icon: Users, label: 'Zákazníci' },
{ to: '/equipment', icon: Wrench, label: 'Zariadenia' },
{ to: '/revisions', icon: ClipboardCheck, label: 'Revízie' },
{ to: '/rma', icon: RotateCcw, label: 'RMA' },
];

View File

@@ -10,7 +10,7 @@ interface ModalProps {
title?: string;
children: ReactNode;
className?: string;
size?: 'sm' | 'md' | 'lg' | 'xl';
size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';
}
export function Modal({ isOpen, onClose, title, children, className, size = 'md' }: ModalProps) {
@@ -37,6 +37,10 @@ export function Modal({ isOpen, onClose, title, children, className, size = 'md'
md: 'max-w-md',
lg: 'max-w-lg',
xl: 'max-w-xl',
'2xl': 'max-w-2xl',
'3xl': 'max-w-3xl',
'4xl': 'max-w-4xl',
'5xl': 'max-w-5xl',
};
return createPortal(
@@ -44,7 +48,7 @@ export function Modal({ isOpen, onClose, title, children, className, size = 'md'
<div className="fixed inset-0 bg-black/50" onClick={onClose} />
<div
className={cn(
'relative z-50 w-full rounded-lg bg-background p-6 shadow-lg',
'relative z-50 w-full rounded-lg bg-background p-6 shadow-lg max-h-[90vh] overflow-y-auto',
sizes[size],
className
)}