From 30cd0c51f58721004e770f162dcc2dcd986ed50c Mon Sep 17 00:00:00 2001 From: dnviti Date: Fri, 28 Nov 2025 11:51:29 +0100 Subject: [PATCH] - --- CLAUDE.md | 113 +- frontend/src/components/Layout.tsx | 141 +- .../reportEditor/DataBindingPanel.tsx | 59 +- .../reportEditor/DatasetSelector.tsx | 180 +- .../components/reportEditor/EditorToolbar.tsx | 2567 ++++++++++++++--- .../reportEditor/ImageUploadDialog.tsx | 192 +- .../components/reportEditor/PageNavigator.tsx | 33 +- .../components/reportEditor/PreviewDialog.tsx | 633 ++-- .../reportEditor/PropertiesPanel.tsx | 127 +- frontend/src/pages/ReportEditorPage.tsx | 366 ++- frontend/src/pages/ReportTemplatesPage.tsx | 221 +- frontend/src/types/report.ts | 1 + src/Apollinare.API/apollinare.db-shm | Bin 32768 -> 0 bytes src/Apollinare.API/apollinare.db-wal | Bin 144232 -> 0 bytes 14 files changed, 3622 insertions(+), 1011 deletions(-) delete mode 100644 src/Apollinare.API/apollinare.db-shm delete mode 100644 src/Apollinare.API/apollinare.db-wal diff --git a/CLAUDE.md b/CLAUDE.md index a1d43e4..e417976 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -46,12 +46,56 @@ XX. **Nome Problema (FIX/IMPLEMENTATO DATA):** - **Problema:** Descrizione breve ## Quick Start - Session Recovery -**Ultima sessione:** 28 Novembre 2025 (sera) +**Ultima sessione:** 28 Novembre 2025 (tarda notte) **Stato progetto:** Migrazione Oracle APEX → .NET + React TypeScript in corso **Lavoro completato nell'ultima sessione:** +- **NUOVA FEATURE: Toolbar Report Designer Migliorata Drasticamente** - COMPLETATO + - Design moderno stile Canva/Figma con gradient buttons e animazioni fluide + - **Sezioni etichettate** su desktop (INSERISCI, MODIFICA, CRONOLOGIA, VISTA, ZOOM, PAGINA) + - **Toolbar contestuale** dinamica che appare quando un elemento è selezionato: + - Per testo: formattazione (grassetto, corsivo, sottolineato), allineamento, color picker + - Per forme/linee: color picker riempimento/bordo, spessore bordo + - Per immagini: indicatore mantieni proporzioni + - Mostra tipo elemento, nome e dimensioni in tempo reale + - **Color Picker integrato** con palette di 20 colori predefiniti + - **Indicatore stato salvataggio** visivo: Salvato (verde), Non salvato (arancione), Salvataggio... (spinner) + - **Badge** sul pulsante Snap che mostra quante opzioni sono attive + - **Zoom esteso** fino al 300% con pulsante "Adatta alla finestra" + - Pannello scorciatoie tastiera ampliato + - Aggiunto `textDecoration` a `AprtStyle` per supportare sottolineato + +- **FIX: Indicatore "Non Salvato" errato** - RISOLTO + - Prima usava `canUndo` che indicava solo presenza di history + - Ora usa `undoCount` confrontato con `lastSavedUndoCount` per tracking accurato + +- **NUOVA FEATURE: Auto-Save con Toggle** - COMPLETATO + - Salvataggio automatico dopo 1 secondo di inattività (debounce) + - **Abilitato di default** + - Toggle nella toolbar (icona AutoMode) per attivare/disattivare + - Quando auto-save è attivo, il pulsante "Salva" manuale è nascosto + - Quando auto-save è disattivo, il pulsante "Salva" appare + - Non si attiva per template nuovi (richiede primo salvataggio manuale) + - Non si attiva durante salvataggio in corso + +**Lavoro completato nelle sessioni precedenti (28 Novembre 2025 notte):** + +- **NUOVA FEATURE: Responsive Design Completo** - COMPLETATO + - Tutta l'applicazione è ora responsive per mobile, tablet e desktop + - Breakpoints: mobile (<600px), tablet (600-900px), desktop (>900px) + - **Layout.tsx**: Sidebar collassata con icone su tablet, drawer mobile + - **ReportTemplatesPage**: Header stackato su mobile, FAB per nuovo template, dialog fullScreen + - **ReportEditorPage**: BottomNavigation + SwipeableDrawer (70vh) per pannelli su mobile, auto-zoom + - **EditorToolbar**: 3 varianti (mobile compatta con riga collassabile, tablet media, desktop completa) + - **Pannelli laterali** (DataBindingPanel, PropertiesPanel, PageNavigator): larghezza piena su mobile + - **DatasetSelector**: Header collassabile su mobile + - **PreviewDialog**: fullScreen su mobile con navigazione step-by-step (dataset → entity) + - **ImageUploadDialog**: fullScreen su mobile, area drag-drop ottimizzata, bottoni stacked + +**Lavoro completato nelle sessioni precedenti (28 Novembre 2025 sera):** + - **FIX: Variabili Globali Report ({{$pageNumber}}, {{$totalPages}}, ecc.)** - RISOLTO - Le variabili speciali ora vengono correttamente risolte nel PDF finale - Aggiunta classe `PageContext` per passare numero pagina e totale pagine durante il rendering @@ -625,9 +669,9 @@ Formato JSON esportabile/importabile per portabilità template: - [x] Editor visuale drag-and-drop con Fabric.js - [x] Supporto elementi: testo, forme, linee, tabelle, immagini (placeholder) -- [x] Gestione zoom (25% - 200%) +- [x] Gestione zoom (25% - 300%) - [x] Griglia e snap to grid -- [x] Undo/Redo (max 20 stati) +- [x] Undo/Redo (max 100 stati) - [x] Shortcuts tastiera (Ctrl+Z, Ctrl+Y, Ctrl+S, Delete) - [x] Pannello proprietà con posizione, stile, contenuto - [x] Data binding con browser campi disponibili @@ -638,6 +682,12 @@ Formato JSON esportabile/importabile per portabilità template: - [x] Clone template - [x] Generazione PDF default per eventi - [x] Formattazione campi (valuta, data, numero, percentuale) +- [x] **Responsive design completo** (mobile, tablet, desktop) +- [x] **Toolbar professionale** stile Canva/Figma con sezioni etichettate +- [x] **Toolbar contestuale** per formattazione rapida (testo, forme, immagini) +- [x] **Color picker integrato** con palette preset +- [x] **Auto-save** con toggle (abilitato di default, 1s debounce) +- [x] **Indicatore stato salvataggio** accurato (Salvato/Non salvato/Salvataggio...) ### Cosa Manca per Completare @@ -700,6 +750,7 @@ Formato JSON esportabile/importabile per portabilità template: - [x] Keyboard shortcuts - [x] PageNavigator (gestione multi-pagina) - [x] Navigazione pagine in toolbar +- [x] **Responsive design** (mobile/tablet/desktop) - [ ] Upload e gestione immagini nell'editor - [ ] Editor tabelle avanzato (colonne, binding dati) - [ ] UI relazioni tra dataset @@ -943,6 +994,62 @@ frontend/src/ ``` - **File:** `ReportGeneratorService.cs` - Metodi `GeneratePdfAsync()`, `RenderContentToBitmap()`, `RenderElementToCanvas()`, `RenderTextToCanvas()`, `ResolveContent()`, `ResolveBindingWithFormat()`, `ResolveBinding()`, `ResolveExpression()`, `ResolveBindingPath()` +16. **Responsive Design Completo (IMPLEMENTATO 28/11/2025 notte):** + - **Obiettivo:** Rendere tutta l'applicazione responsive per mobile, tablet e desktop + - **Breakpoints MUI utilizzati:** + - Mobile: `theme.breakpoints.down("sm")` → < 600px + - Tablet: `theme.breakpoints.between("sm", "md")` → 600-900px + - Desktop: `theme.breakpoints.up("md")` → > 900px + - **Pattern principale per Report Editor su mobile:** + - `BottomNavigation` per switch tra pannelli (Pagine, Dati, Proprietà) + - `SwipeableDrawer` con `anchor="bottom"` e altezza 70vh per contenuto pannelli + - Auto-zoom canvas: 0.5 mobile, 0.75 tablet, 1 desktop + - **Pattern per toolbar mobile:** + - Riga primaria con azioni essenziali sempre visibili + - Riga secondaria collassabile con `` per azioni secondarie + - **Pattern per dialog mobile:** + - `fullScreen` prop su Dialog + - AppBar con pulsante back invece di DialogTitle + - Navigazione step-by-step invece di layout side-by-side + - **File modificati:** + - `Layout.tsx` - Sidebar collassata su tablet + - `ReportTemplatesPage.tsx` - FAB, fullScreen dialogs + - `ReportEditorPage.tsx` - BottomNavigation + SwipeableDrawer + - `EditorToolbar.tsx` - 3 varianti layout (mobile/tablet/desktop) + - `DataBindingPanel.tsx`, `PropertiesPanel.tsx`, `PageNavigator.tsx` - Width responsive + - `DatasetSelector.tsx` - Header collapsible + - `PreviewDialog.tsx`, `ImageUploadDialog.tsx` - fullScreen + step navigation + +17. **Indicatore "Non Salvato" Errato (FIX 28/11/2025 tarda notte):** + - **Problema:** Dopo il salvataggio, l'indicatore continuava a mostrare "Non salvato" + - **Causa:** `hasUnsavedChanges` era basato su `templateHistory.canUndo` che indica solo se c'è history disponibile, non se ci sono modifiche non salvate + - **Soluzione:** Introdotto `lastSavedUndoCount` che viene aggiornato dopo ogni salvataggio riuscito. `hasUnsavedChanges` ora confronta `templateHistory.undoCount !== lastSavedUndoCount` + - **File:** `ReportEditorPage.tsx` + +18. **Auto-Save Feature (IMPLEMENTATO 28/11/2025 tarda notte):** + - **Funzionalità:** Salvataggio automatico dopo 1 secondo di inattività + - **Implementazione:** + - Stato `autoSaveEnabled` (default: true) in `ReportEditorPage.tsx` + - `useEffect` con debounce di 1000ms che triggera `saveMutation.mutate()` + - Non si attiva se: `isNew`, `!hasUnsavedChanges`, `saveMutation.isPending` + - Toggle nella toolbar con icona `AutoSaveIcon` (da @mui/icons-material) + - Pulsante "Salva" nascosto quando auto-save è attivo + - **Props toolbar:** `autoSaveEnabled`, `onAutoSaveToggle` + - **File:** `ReportEditorPage.tsx`, `EditorToolbar.tsx` + +19. **Toolbar Migliorata Stile Canva/Figma (IMPLEMENTATO 28/11/2025 tarda notte):** + - **Miglioramenti:** + - Design moderno con gradient buttons e animazioni fluide + - Sezioni etichettate su desktop (INSERISCI, MODIFICA, CRONOLOGIA, VISTA, ZOOM, PAGINA) + - Toolbar contestuale dinamica basata su tipo elemento selezionato + - Color picker integrato con 20 colori preset + - Indicatore stato salvataggio visivo + - Badge su pulsante Snap + - Zoom esteso fino a 300% + - **Componenti aggiunti:** `ToolbarSection`, `StyledIconButton`, `ColorPickerButton` + - **Type aggiunto:** `textDecoration` in `AprtStyle` + - **File:** `EditorToolbar.tsx`, `types/report.ts` + ### Schema Database Report System Le tabelle sono già nel DbContext (`AppollinareDbContext.cs`): diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index 0e3b353..9638816 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -13,6 +13,8 @@ import { ListItemButton, ListItemIcon, ListItemText, + useMediaQuery, + useTheme, } from "@mui/material"; import { Menu as MenuIcon, @@ -24,9 +26,11 @@ import { Person as PersonIcon, CalendarMonth as CalendarIcon, Print as PrintIcon, + Close as CloseIcon, } from "@mui/icons-material"; -const drawerWidth = 240; +const DRAWER_WIDTH = 240; +const DRAWER_WIDTH_COLLAPSED = 64; const menuItems = [ { text: "Dashboard", icon: , path: "/" }, @@ -43,53 +47,97 @@ export default function Layout() { const [mobileOpen, setMobileOpen] = useState(false); const navigate = useNavigate(); const location = useLocation(); + const theme = useTheme(); + + // Breakpoints + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); // < 600px + const isTablet = useMediaQuery(theme.breakpoints.between("sm", "md")); // 600-900px + + // Drawer width based on screen size + const drawerWidth = isTablet ? DRAWER_WIDTH_COLLAPSED : DRAWER_WIDTH; const handleDrawerToggle = () => { setMobileOpen(!mobileOpen); }; const drawer = ( -
- - - Apollinare - + + + {!isTablet && ( + + Apollinare + + )} + {isMobile && ( + + + + )} - + {menuItems.map((item) => ( - + { navigate(item.path); - setMobileOpen(false); + if (isMobile) setMobileOpen(false); + }} + sx={{ + borderRadius: 1, + minHeight: 48, + justifyContent: isTablet ? "center" : "flex-start", + px: isTablet ? 1 : 2, }} > - {item.icon} - + + {item.icon} + + {!isTablet && } ))} -
+ {!isTablet && ( + + + © 2025 Apollinare + + + )} + ); return ( - + - + - - Catering & Banqueting Management + + {isMobile ? "Apollinare" : "Catering & Banqueting Management"} + + {/* Mobile Drawer */} {drawer} + + {/* Desktop/Tablet Drawer */} + + {/* Main Content */} - + {/* Toolbar spacer */} + + + {/* Content */} + + + ); diff --git a/frontend/src/components/reportEditor/DataBindingPanel.tsx b/frontend/src/components/reportEditor/DataBindingPanel.tsx index 385a770..cc9413b 100644 --- a/frontend/src/components/reportEditor/DataBindingPanel.tsx +++ b/frontend/src/components/reportEditor/DataBindingPanel.tsx @@ -15,6 +15,8 @@ import { Tooltip, Divider, alpha, + useMediaQuery, + useTheme, } from "@mui/material"; import { ExpandLess, @@ -59,6 +61,9 @@ export default function DataBindingPanel({ onInsertBinding, onRemoveDataset, }: DataBindingPanelProps) { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [expanded, setExpanded] = useState(["special"]); const [search, setSearch] = useState(""); const [copiedField, setCopiedField] = useState(null); @@ -200,12 +205,16 @@ export default function DataBindingPanel({ return count; }, [search, schemas]); + // Panel width based on context (full width in mobile drawer) + const panelWidth = isMobile ? "100%" : 300; + if (selectedDatasets.length === 0) { return ( @@ -231,24 +241,28 @@ export default function DataBindingPanel({ return ( {/* Header con ricerca */} - - Campi Disponibili - + {!isMobile && ( + + Campi Disponibili + + )} - Clicca su un campo per inserirlo nell'elemento selezionato, oppure usa - l'icona copia per copiare il binding negli appunti. + {isMobile + ? "Tocca un campo per inserirlo" + : "Clicca su un campo per inserirlo nell'elemento selezionato, oppure usa l'icona copia per copiare il binding negli appunti."} diff --git a/frontend/src/components/reportEditor/DatasetSelector.tsx b/frontend/src/components/reportEditor/DatasetSelector.tsx index fc57938..52a591d 100644 --- a/frontend/src/components/reportEditor/DatasetSelector.tsx +++ b/frontend/src/components/reportEditor/DatasetSelector.tsx @@ -13,6 +13,9 @@ import { ListSubheader, Badge, Button, + useMediaQuery, + useTheme, + Collapse, } from "@mui/material"; import { Add as AddIcon, @@ -30,6 +33,8 @@ import { Info as InfoIcon, Settings as SettingsIcon, Dataset as DatasetIcon, + ExpandMore as ExpandMoreIcon, + ExpandLess as ExpandLessIcon, } from "@mui/icons-material"; import type { DatasetTypeDto } from "../../types/report"; @@ -48,10 +53,15 @@ export default function DatasetSelector({ onRemoveDataset, onOpenDatasetManager, }: DatasetSelectorProps) { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const isTablet = useMediaQuery(theme.breakpoints.between("sm", "md")); + const [anchorEl, setAnchorEl] = useState(null); const [hoveredDataset, setHoveredDataset] = useState( null, ); + const [expanded, setExpanded] = useState(!isMobile); const handleOpenMenu = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); @@ -152,18 +162,169 @@ export default function DatasetSelector({ return [...baseCategories, ...additionalCategories]; }, [groupedDatasets]); + // Compact mobile view + if (isMobile) { + return ( + + {/* Header - always visible */} + setExpanded(!expanded)} + > + + + + Dataset ({selectedDatasets.length}) + + + + {expanded ? : } + + + + {/* Expandable content */} + + + {selectedDatasets.map((dataset) => ( + onRemoveDataset(dataset.id)} + sx={{ fontWeight: 500 }} + /> + ))} + + {selectedDatasets.length === 0 && ( + + Nessun dataset selezionato + + )} + + {unselectedDatasets.length > 0 && ( + + + + )} + + + + {/* Menu - shared */} + + + + Seleziona Dataset + + + + + {categoryOrder.map((category) => { + const datasets = groupedDatasets[category]; + if (!datasets || datasets.length === 0) return null; + + return ( + + + {category} + + {datasets.map((dataset) => ( + handleSelectDataset(dataset)} + sx={{ py: 1 }} + > + + {getDatasetIcon(dataset.icon)} + + + + ))} + + ); + })} + + {onOpenDatasetManager && [ + , + { + handleCloseMenu(); + onOpenDatasetManager(); + }} + > + + + + + , + ]} + + + ); + } + + // Tablet/Desktop view return ( - - - setAddMenuAnchor(null)} - anchorOrigin={{ vertical: "bottom", horizontal: "left" }} - transformOrigin={{ vertical: "top", horizontal: "left" }} - TransitionComponent={Fade} - slotProps={{ - paper: { - sx: { mt: 0.5, borderRadius: 2, minWidth: 200 }, - }, - }} - > - - {ELEMENT_TYPES.map(({ type, icon: Icon, label, shortcut, color }) => ( - handleAddElement(type)} - sx={{ - py: 1, - "&:hover": { - bgcolor: `${color}10`, - }, - }} + {/* Text formatting */} + + handleTextFormat("bold")} > - - - - - - - ))} - - + + + handleTextFormat("italic")} + > + + + handleTextFormat("underline")} + > + + + - + - {/* Quick Add Buttons */} - - {ELEMENT_TYPES.map(({ type, icon: Icon, label, color }) => ( - - onAddElement(type)} + {/* Text alignment */} + value && handleTextAlign(value)} + sx={{ "& .MuiToggleButton-root": { border: 0, borderRadius: 1 } }} + > + + + + + + + + + + + + + + {/* Colors */} + + onUpdateSelectedElement({ style: { ...currentStyle, color } }) + } + label="Colore testo" + icon={TextColorIcon} + /> + + onUpdateSelectedElement({ + style: { ...currentStyle, backgroundColor: color }, + }) + } + label="Sfondo" + icon={FillColorIcon} + /> + + + + {/* Data binding indicator */} + {selectedElement.content?.type === "binding" && ( + } + label="Data Bound" size="small" + color="info" + variant="outlined" + sx={{ height: 24 }} + /> + )} + + ); + } + + // Shape/Line toolbar + if (selectedElement.type === "shape" || selectedElement.type === "line") { + return ( + + + onUpdateSelectedElement({ + style: { ...currentStyle, backgroundColor: color }, + }) + } + label="Riempimento" + icon={FillColorIcon} + /> + + onUpdateSelectedElement({ + style: { ...currentStyle, borderColor: color }, + }) + } + label="Bordo" + icon={StrokeColorIcon} + /> + + + + {/* Border width */} + + + + Bordo: + + + onUpdateSelectedElement({ + style: { + ...currentStyle, + borderWidth: Number(e.target.value), + }, + }) + } + inputProps={{ min: 0, max: 20, step: 0.5 }} + sx={{ width: 60, "& input": { py: 0.5, fontSize: "0.75rem" } }} + /> + + + + ); + } + + // Image toolbar + if (selectedElement.type === "image") { + return ( + + } + label={selectedElement.name || "Immagine"} + size="small" + variant="outlined" + sx={{ height: 24, maxWidth: 150 }} + /> + + + + + + + + ); + } + + return null; + }; + + // Save status indicator + const renderSaveStatus = () => { + return ( + + {/* Auto-save toggle */} + {onAutoSaveToggle && ( + + onAutoSaveToggle(!autoSaveEnabled)} sx={{ borderRadius: 1.5, + bgcolor: autoSaveEnabled + ? alpha(theme.palette.success.main, 0.1) + : alpha(theme.palette.grey[500], 0.1), + color: autoSaveEnabled ? "success.main" : "text.disabled", "&:hover": { - bgcolor: `${color}15`, - color: color, + bgcolor: autoSaveEnabled + ? alpha(theme.palette.success.main, 0.2) + : alpha(theme.palette.grey[500], 0.2), }, }} > - + - ))} + )} + + {/* Save status */} + {isSaving ? ( + + + + + Salvo... + + + + ) : hasUnsavedChanges ? ( + + + + + Non salvato + + + + ) : ( + + + + + {formatTimeAgo(lastSavedAt) || "Salvato"} + + + + )} + ); + }; - + // Mobile: Compact toolbar with essential actions + if (isMobile) { + return ( + + {/* Primary Row */} + + {/* Add Element */} + - {/* Selection Actions */} - - - - + + {/* Undo/Redo */} + + + + + + + + + + {/* Delete */} + + + + + + + {/* Page Navigation - Compact */} + + + + + {/* Save/Preview */} + + + + {!autoSaveEnabled && ( + - - - - - - - + ) : ( + + )} + + )} + + {/* Expand/Collapse */} + setShowSecondRow(!showSecondRow)} + > + {showSecondRow ? : } + + + + {/* Secondary Row - Collapsible */} + + + {/* Zoom */} + onZoomChange(Math.max(0.25, zoom - 0.25))} + > + + + + + + + {/* Quick Add Buttons */} + {ELEMENT_TYPES.slice(0, 3).map( + ({ type, icon: Icon, label, color }) => ( + onAddElement(type)} + color={color} + > + + + ), + )} + + + + {/* Selection Actions */} + + + + + + + + {isLocked ? ( + + ) : ( + + )} + + + + + {/* Undo/Redo */} + + + + + + + + + + {/* View Controls */} + {showGrid ? ( ) : ( )} - - + + setSnapMenuAnchor(e.currentTarget)} + active={activeSnapCount > 0} + badge={activeSnapCount || undefined} + > + + - + + + {/* Zoom */} + onZoomChange(Math.max(0.25, zoom - 0.25))} + > + + - + onZoomChange(Math.min(3, zoom + 0.25))} + > + + + + + + {/* Page Navigation */} + + + + + + + = totalPages - 1} + > + + + + + + {/* Actions */} + + {!autoSaveEnabled && ( + + )} + + + {/* Contextual toolbar for text/shape */} + {selectedElement && onUpdateSelectedElement && ( + + {renderContextualToolbar()} + + )} + + {/* Shared Popovers */} + setAddMenuAnchor(null)} + PaperProps={{ sx: { borderRadius: 2, minWidth: 220 } }} + > + {ELEMENT_TYPES.map( + ({ type, icon: Icon, label, color, description, shortcut }) => ( + handleAddElement(type)} + sx={{ py: 1.5 }} + > + + + + + + + + + ), + )} + setSnapMenuAnchor(null)} anchorOrigin={{ vertical: "bottom", horizontal: "left" }} - transformOrigin={{ vertical: "top", horizontal: "left" }} - slotProps={{ - paper: { - sx: { mt: 0.5, borderRadius: 2, minWidth: 280, p: 1 }, - }, - }} + PaperProps={{ sx: { borderRadius: 2 } }} > - + } - label={ - - Tutti - - } + label={Tutti} labelPlacement="start" sx={{ mr: 0 }} /> - - {SNAP_OPTIONS_CONFIG.map( - ({ key, icon: Icon, label, description }) => ( - handleToggleSnapOption(key)} - sx={{ - py: 0.75, - borderRadius: 1, - mb: 0.5, - bgcolor: snapOptions[key] ? "primary.50" : "transparent", - "&:hover": { - bgcolor: snapOptions[key] - ? "primary.100" - : "action.hover", - }, + {SNAP_OPTIONS_CONFIG.map( + ({ key, icon: Icon, label, description }) => ( + handleToggleSnapOption(key)} + sx={{ + py: 0.5, + borderRadius: 1, + bgcolor: snapOptions[key] + ? alpha(theme.palette.primary.main, 0.08) + : "transparent", + }} + > + + + + - - - - - e.stopPropagation()} - onChange={() => handleToggleSnapOption(key)} - /> - - ), - )} - + secondaryTypographyProps={{ variant: "caption" }} + /> + + + ), + )} - - - - - {/* Zoom Controls */} - - - onZoomChange(Math.max(0.25, zoom - 0.25))} - size="small" - sx={{ borderRadius: 1.5 }} - > - - - - - - - setZoomMenuAnchor(null)} anchorOrigin={{ vertical: "bottom", horizontal: "center" }} - transformOrigin={{ vertical: "top", horizontal: "center" }} - slotProps={{ - paper: { - sx: { mt: 0.5, borderRadius: 2, p: 1 }, - }, - }} + PaperProps={{ sx: { borderRadius: 2 } }} > - - - Livello zoom - + onZoomChange(value as number)} size="small" - sx={{ mt: 1, mx: 1, width: "calc(100% - 16px)" }} + valueLabelDisplay="auto" + valueLabelFormat={(v) => `${Math.round(v * 100)}%`} /> - + {ZOOM_PRESETS.map(({ value, label }) => ( ))} - - - - { - onZoomChange(0.75); - setZoomMenuAnchor(null); - }} - > - - - - - - - - - - - onZoomChange(Math.min(2, zoom + 0.25))} - size="small" - sx={{ borderRadius: 1.5 }} - > - - - - - - - - {/* Page Navigation */} - - - - - - - - - - - - - - {currentPageIndex + 1} / {totalPages} + setPageMenuAnchor(null)} + > + + + {currentPageName} - + + { + onPrevPage(); + setPageMenuAnchor(null); + }} + disabled={currentPageIndex <= 0} + > + + + + Pagina precedente + + { + onNextPage(); + setPageMenuAnchor(null); + }} + disabled={currentPageIndex >= totalPages - 1} + > + + + + Pagina successiva + + + + ); + } - - - = totalPages - 1} - sx={{ borderRadius: 1.5 }} - > - - - - - - - - - {/* Keyboard Shortcuts Help */} - - setShortcutsAnchor(e.currentTarget)} - sx={{ borderRadius: 1.5, mr: 1 }} - > - - - - - setShortcutsAnchor(null)} - anchorOrigin={{ vertical: "bottom", horizontal: "right" }} - transformOrigin={{ vertical: "top", horizontal: "right" }} - slotProps={{ - paper: { - sx: { mt: 0.5, borderRadius: 2, p: 2, minWidth: 280 }, - }, + // Desktop: Full professional toolbar + return ( + + {/* Main Toolbar Row */} + - - Scorciatoie Tastiera - - - - {[ - ["Ctrl + Z", "Annulla"], - ["Ctrl + Y", "Ripeti"], - ["Ctrl + S", "Salva"], - ["Ctrl + D", "Duplica"], - ["Canc / Backspace", "Elimina"], - ["Frecce", "Sposta (1px)"], - ["Shift + Frecce", "Sposta (10px)"], - ["G", "Mostra/nascondi griglia"], - ["+ / -", "Zoom"], - ].map(([key, action]) => ( - - - - - - - {action} - - - - ))} - - - + {/* Add Element - Primary Action */} + - {/* Actions */} - + {/* Add Menu with rich descriptions */} + setAddMenuAnchor(null)} + anchorOrigin={{ vertical: "bottom", horizontal: "left" }} + PaperProps={{ + sx: { mt: 1, borderRadius: 3, minWidth: 280, overflow: "hidden" }, + }} + > + + + Inserisci elemento + + + {ELEMENT_TYPES.map( + ({ type, icon: Icon, label, shortcut, color, description }) => ( + handleAddElement(type)} + sx={{ + py: 1.5, + px: 1.5, + borderRadius: 2, + mb: 0.5, + transition: "all 0.15s ease", + "&:hover": { + bgcolor: alpha(color, 0.08), + transform: "translateX(4px)", + }, + }} + > + + + + + + + ), + )} + + + + + + + {/* Quick Add Toolbar */} + + {ELEMENT_TYPES.map(({ type, icon: Icon, label, color }) => ( + e.type === type)?.shortcut})`} + onClick={() => onAddElement(type)} + color={color} + > + + + ))} + + + + + {/* Selection Actions */} + + + + + + + + + {isLocked ? ( + + ) : ( + + )} + + + + + + {/* History */} + + + + + + + + {onOpenHistory && ( + + + + )} + + + + + {/* View Controls */} + + + {showGrid ? ( + + ) : ( + + )} + + + + + + {/* Snap Popover */} + setSnapMenuAnchor(null)} + anchorOrigin={{ vertical: "bottom", horizontal: "left" }} + PaperProps={{ sx: { mt: 1, borderRadius: 2, minWidth: 300 } }} + > + + + + Allineamento automatico + + + } + label={ + + Tutti + + } + labelPlacement="start" + sx={{ mr: 0 }} + /> + + + + {SNAP_OPTIONS_CONFIG.map( + ({ key, icon: Icon, label, description }) => ( + handleToggleSnapOption(key)} + sx={{ + py: 1, + px: 1.5, + borderRadius: 2, + bgcolor: snapOptions[key] + ? alpha(theme.palette.primary.main, 0.08) + : "transparent", + transition: "all 0.15s ease", + "&:hover": { + bgcolor: snapOptions[key] + ? alpha(theme.palette.primary.main, 0.15) + : "action.hover", + }, + }} + > + + + + + e.stopPropagation()} + /> + + ), + )} + + + + + + + {/* Zoom Controls */} + + onZoomChange(Math.max(0.25, zoom - 0.25))} + > + + + + + + onZoomChange(Math.min(3, zoom + 0.25))} + > + + + + onZoomChange(0.75)} + > + + + + + {/* Zoom Popover */} + setZoomMenuAnchor(null)} + anchorOrigin={{ vertical: "bottom", horizontal: "center" }} + PaperProps={{ sx: { mt: 1, borderRadius: 2, p: 2, width: 220 } }} + > + + Livello zoom: {Math.round(zoom * 100)}% + + onZoomChange(value as number)} + valueLabelDisplay="auto" + valueLabelFormat={(v) => `${Math.round(v * 100)}%`} + sx={{ mt: 1, mb: 2 }} + /> + + Preset + + + {ZOOM_PRESETS.map(({ value, label }) => ( + { + onZoomChange(value); + setZoomMenuAnchor(null); + }} + sx={{ cursor: "pointer" }} + /> + ))} + + + + + + {/* Page Navigation */} + + + + + + + + = totalPages - 1} + > + + + + + {/* Page Menu */} + setPageMenuAnchor(null)} + PaperProps={{ sx: { borderRadius: 2, minWidth: 200 } }} + > + + + Pagina corrente + + + {currentPageName} + + + + { + onPrevPage(); + setPageMenuAnchor(null); + }} + disabled={currentPageIndex <= 0} + > + + + + + + { + onNextPage(); + setPageMenuAnchor(null); + }} + disabled={currentPageIndex >= totalPages - 1} + > + + + + + + + + + + {/* Save Status */} + + {renderSaveStatus()} + + + {/* Command Palette / Search */} + {onOpenCommandPalette && ( + + + + )} + + {/* Keyboard Shortcuts */} + setShortcutsAnchor(e.currentTarget)} + > + + + + {/* Shortcuts Popover */} + setShortcutsAnchor(null)} + anchorOrigin={{ vertical: "bottom", horizontal: "right" }} + transformOrigin={{ vertical: "top", horizontal: "right" }} + PaperProps={{ sx: { mt: 1, borderRadius: 2, p: 2, minWidth: 300 } }} + > + + Scorciatoie Tastiera + + + + + {[ + ["Ctrl + Z", "Annulla"], + ["Ctrl + Y", "Ripeti"], + ["Ctrl + S", "Salva"], + ["Ctrl + D", "Duplica"], + ["Ctrl + K", "Cerca comando"], + ["Canc / Backspace", "Elimina"], + ["Frecce", "Sposta (1px)"], + ["Shift + Frecce", "Sposta (10px)"], + ["G", "Mostra/nascondi griglia"], + ["+ / -", "Zoom in/out"], + ["PgUp / PgDn", "Cambia pagina"], + ].map(([key, action]) => ( + + + + + + + {action} + + + + ))} + + + + + + + {/* Primary Actions */} - + )} + + + {/* Contextual Toolbar Row - appears when element is selected */} + {selectedElement && onUpdateSelectedElement && ( + - {isSaving ? "Salvo..." : "Salva"} - - + {/* Element type indicator */} + e.type === selectedElement.type)?.icon + ? (() => { + const Icon = ELEMENT_TYPES.find( + (e) => e.type === selectedElement.type, + )!.icon; + return ; + })() + : undefined + } + label={ + ELEMENT_TYPES.find((e) => e.type === selectedElement.type) + ?.label || selectedElement.type + } + size="small" + variant="outlined" + sx={{ + borderColor: ELEMENT_TYPES.find( + (e) => e.type === selectedElement.type, + )?.color, + color: ELEMENT_TYPES.find((e) => e.type === selectedElement.type) + ?.color, + }} + /> + + + + {/* Contextual formatting options */} + {renderContextualToolbar()} + + + + {/* Element name */} + {selectedElement.name && ( + + {selectedElement.name} + + )} + + {/* Position info */} + + {Math.round(selectedElement.position.x)}× + {Math.round(selectedElement.position.y)} |{" "} + {Math.round(selectedElement.position.width)}× + {Math.round(selectedElement.position.height)}mm + + + )} ); } diff --git a/frontend/src/components/reportEditor/ImageUploadDialog.tsx b/frontend/src/components/reportEditor/ImageUploadDialog.tsx index 0fbcace..18326a6 100644 --- a/frontend/src/components/reportEditor/ImageUploadDialog.tsx +++ b/frontend/src/components/reportEditor/ImageUploadDialog.tsx @@ -13,12 +13,17 @@ import { CircularProgress, Alert, IconButton, + useMediaQuery, + useTheme, + AppBar, + Toolbar, } from "@mui/material"; import { CloudUpload as UploadIcon, Link as LinkIcon, Close as CloseIcon, Image as ImageIcon, + ArrowBack as ArrowBackIcon, } from "@mui/icons-material"; interface ImageUploadDialogProps { @@ -54,6 +59,9 @@ export default function ImageUploadDialog({ onClose, onImageSelected, }: ImageUploadDialogProps) { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [tab, setTab] = useState(0); const [url, setUrl] = useState(""); const [loading, setLoading] = useState(false); @@ -132,7 +140,7 @@ export default function ImageUploadDialog({ setLoading(false); } }, - [processFile] + [processFile], ); const handleDragOver = useCallback((e: React.DragEvent) => { @@ -151,7 +159,7 @@ export default function ImageUploadDialog({ setIsDragging(false); handleFileSelect(e.dataTransfer.files); }, - [handleFileSelect] + [handleFileSelect], ); const handleUrlLoad = useCallback(async () => { @@ -220,7 +228,7 @@ export default function ImageUploadDialog({ setError( innerErr instanceof Error ? innerErr.message - : "Errore nel caricamento dell'immagine" + : "Errore nel caricamento dell'immagine", ); } } finally { @@ -236,20 +244,46 @@ export default function ImageUploadDialog({ }, [preview, onImageSelected, handleClose]); return ( - - - - - - Inserisci Immagine + + {isMobile ? ( + // Mobile: AppBar header + + + + + + + + Inserisci Immagine + + + + ) : ( + // Desktop: Standard DialogTitle + + + + + Inserisci Immagine + + + + - - - - - + + )} - + { @@ -258,9 +292,20 @@ export default function ImageUploadDialog({ setPreview(null); }} sx={{ borderBottom: 1, borderColor: "divider" }} + variant={isMobile ? "fullWidth" : "standard"} > - } label="Carica File" iconPosition="start" /> - } label="Da URL" iconPosition="start" /> + } + label={isMobile ? "Carica" : "Carica File"} + iconPosition="start" + sx={{ minHeight: isMobile ? 56 : 48 }} + /> + } + label={isMobile ? "URL" : "Da URL"} + iconPosition="start" + sx={{ minHeight: isMobile ? 56 : 48 }} + /> {error && ( @@ -277,11 +322,16 @@ export default function ImageUploadDialog({ borderStyle: "dashed", borderColor: isDragging ? "primary.main" : "divider", borderRadius: 2, - p: 4, + p: isMobile ? 3 : 4, textAlign: "center", bgcolor: isDragging ? "primary.50" : "grey.50", cursor: "pointer", transition: "all 0.2s", + minHeight: isMobile ? 150 : "auto", + display: "flex", + flexDirection: "column", + justifyContent: "center", + alignItems: "center", "&:hover": { borderColor: "primary.light", bgcolor: "primary.50", @@ -304,16 +354,30 @@ export default function ImageUploadDialog({ ) : ( <> - Trascina un'immagine qui + {isMobile + ? "Tocca per selezionare" + : "Trascina un'immagine qui"} - - oppure clicca per selezionare un file - - - Formati supportati: JPG, PNG, GIF, WebP, SVG (max 10MB) + {!isMobile && ( + + oppure clicca per selezionare un file + + )} + + {isMobile + ? "JPG, PNG, GIF, WebP (max 10MB)" + : "Formati supportati: JPG, PNG, GIF, WebP, SVG (max 10MB)"} )} @@ -330,6 +394,7 @@ export default function ImageUploadDialog({ onChange={(e) => setUrl(e.target.value)} fullWidth disabled={loading} + size={isMobile ? "medium" : "small"} onKeyDown={(e) => { if (e.key === "Enter") { handleUrlLoad(); @@ -340,7 +405,11 @@ export default function ImageUploadDialog({ variant="outlined" onClick={handleUrlLoad} disabled={loading || !url.trim()} - startIcon={loading ? : } + startIcon={ + loading ? : + } + size={isMobile ? "large" : "medium"} + fullWidth={isMobile} > {loading ? "Caricamento..." : "Carica da URL"} @@ -378,17 +447,32 @@ export default function ImageUploadDialog({ alt="Preview" style={{ maxWidth: "100%", - maxHeight: 200, + maxHeight: isMobile ? 150 : 200, objectFit: "contain", }} /> - + {preview.originalWidth} × {preview.originalHeight} px {preview.fileName && ( - + {preview.fileName} )} @@ -397,16 +481,46 @@ export default function ImageUploadDialog({ )} - - - + + {isMobile ? ( + // Mobile: Stacked full-width buttons + <> + + + + ) : ( + // Desktop: Standard layout + <> + + + + )} ); diff --git a/frontend/src/components/reportEditor/PageNavigator.tsx b/frontend/src/components/reportEditor/PageNavigator.tsx index 8fea4c9..d92ec14 100644 --- a/frontend/src/components/reportEditor/PageNavigator.tsx +++ b/frontend/src/components/reportEditor/PageNavigator.tsx @@ -19,6 +19,8 @@ import { DialogContent, DialogActions, TextField, + useMediaQuery, + useTheme, } from "@mui/material"; import { Add as AddIcon, @@ -54,6 +56,9 @@ export default function PageNavigator({ onRenamePage, onMovePage, }: PageNavigatorProps) { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [menuAnchor, setMenuAnchor] = useState<{ element: HTMLElement; pageId: string; @@ -153,15 +158,20 @@ export default function PageNavigator({ const currentMenuIndex = menuAnchor ? getPageIndex(menuAnchor.pageId) : -1; + // Width based on context + const panelWidth = isMobile ? "100%" : 220; + return ( {/* Header */} @@ -212,7 +222,7 @@ export default function PageNavigator({ onClick={() => onSelectPage(page.id)} sx={{ borderRadius: 1, - py: 1, + py: isMobile ? 1.5 : 1, "&.Mui-selected": { bgcolor: "primary.light", color: "primary.contrastText", @@ -230,8 +240,8 @@ export default function PageNavigator({ > {index + 1} @@ -286,7 +297,7 @@ export default function PageNavigator({ @@ -392,6 +405,7 @@ export default function PageNavigator({ variant="contained" onClick={handleRenameConfirm} disabled={!renameDialog.currentName.trim()} + fullWidth={isMobile} > Rinomina @@ -405,6 +419,7 @@ export default function PageNavigator({ setDeleteConfirm({ open: false, pageId: "", pageName: "" }) } maxWidth="xs" + fullScreen={isMobile} > Elimina Pagina @@ -415,11 +430,12 @@ export default function PageNavigator({ Tutti gli elementi sulla pagina verranno eliminati. - + @@ -427,6 +443,7 @@ export default function PageNavigator({ variant="contained" color="error" onClick={handleDeleteConfirm} + fullWidth={isMobile} > Elimina diff --git a/frontend/src/components/reportEditor/PreviewDialog.tsx b/frontend/src/components/reportEditor/PreviewDialog.tsx index 5cb0163..3cbb737 100644 --- a/frontend/src/components/reportEditor/PreviewDialog.tsx +++ b/frontend/src/components/reportEditor/PreviewDialog.tsx @@ -21,6 +21,10 @@ import { IconButton, Tooltip, alpha, + useMediaQuery, + useTheme, + AppBar, + Toolbar, } from "@mui/material"; import { Search as SearchIcon, @@ -36,6 +40,8 @@ import { TableChart as TableIcon, Check as CheckIcon, Clear as ClearIcon, + Close as CloseIcon, + ArrowBack as BackIcon, } from "@mui/icons-material"; import { useQueries } from "@tanstack/react-query"; import { reportGeneratorService } from "../../services/reportService"; @@ -60,11 +66,15 @@ export default function PreviewDialog({ onGeneratePreview, isGenerating, }: PreviewDialogProps) { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [selections, setSelections] = useState>( {}, ); const [searchTerms, setSearchTerms] = useState>({}); const [activeDataset, setActiveDataset] = useState(null); + const [mobileShowList, setMobileShowList] = useState(true); // Mobile: show dataset list or entity list // Fetch entities for each selected dataset const entityQueries = useQueries({ @@ -90,6 +100,7 @@ export default function PreviewDialog({ setActiveDataset( selectedDatasets.length > 0 ? selectedDatasets[0].id : null, ); + setMobileShowList(true); } }, [open, selectedDatasets]); @@ -99,6 +110,11 @@ export default function PreviewDialog({ [datasetId]: entityId, })); + // On mobile, go back to list after selection + if (isMobile) { + setMobileShowList(true); + } + // Passa al prossimo dataset non selezionato const currentIndex = selectedDatasets.findIndex( (ds) => ds.id === datasetId, @@ -108,6 +124,9 @@ export default function PreviewDialog({ ); if (nextUnselected) { setActiveDataset(nextUnselected.id); + if (isMobile) { + setTimeout(() => setMobileShowList(false), 300); + } } }; @@ -142,6 +161,13 @@ export default function PreviewDialog({ onGeneratePreview(dataSources); }; + const handleSelectDataset = (datasetId: string) => { + setActiveDataset(datasetId); + if (isMobile) { + setMobileShowList(false); + } + }; + const getDatasetIcon = (icon: string) => { switch (icon) { case "event": @@ -205,31 +231,318 @@ export default function PreviewDialog({ searchTerms[activeDataset || ""] || "", ); + // Render dataset list (sidebar on desktop, main view on mobile) + const renderDatasetList = () => ( + + {selectedDatasets.map((dataset, index) => { + const isSelected = selections[dataset.id] !== null; + const isActive = activeDataset === dataset.id; + const query = entityQueries[index]; + const selectedEntity = isSelected + ? ((query.data as EntityListItemDto[]) || []).find( + (e) => e.id === selections[dataset.id], + ) + : null; + + return ( + handleSelectDataset(dataset.id)} + sx={{ + borderBottom: 1, + borderColor: "divider", + bgcolor: isSelected + ? (theme) => alpha(theme.palette.success.main, 0.08) + : "inherit", + py: isMobile ? 1.5 : 1, + }} + > + + {isSelected ? ( + + ) : ( + getDatasetIcon(dataset.icon) + )} + + + {isSelected && ( + + { + e.stopPropagation(); + handleClearSelection(dataset.id); + }} + > + + + + )} + + ); + })} + + ); + + // Render entity list for active dataset + const renderEntityList = () => { + if (!activeDatasetObj) return null; + + return ( + + {/* Header dataset attivo */} + + {isMobile && ( + + setMobileShowList(true)}> + + + Seleziona + + )} + + {getDatasetIcon(activeDatasetObj.icon)} + + {activeDatasetObj.name} + + {!isMobile && ( + + )} + + {!isMobile && ( + + {activeDatasetObj.description} + + )} + + {/* Ricerca */} + handleSearchChange(activeDataset!, e.target.value)} + InputProps={{ + startAdornment: ( + + + + ), + endAdornment: searchTerms[activeDataset || ""] && ( + + handleSearchChange(activeDataset!, "")} + > + + + + ), + }} + /> + + + {/* Lista entità */} + + {activeQuery?.isLoading ? ( + + + + ) : filteredEntities.length === 0 ? ( + + + {searchTerms[activeDataset || ""] + ? "Nessun risultato trovato" + : "Nessuna entità disponibile"} + + + ) : ( + + {filteredEntities.map((entity) => { + const isEntitySelected = + selections[activeDataset!] === entity.id; + + return ( + + handleSelectionChange(activeDataset!, entity.id) + } + selected={isEntitySelected} + sx={{ + borderBottom: 1, + borderColor: "divider", + bgcolor: isEntitySelected + ? (theme) => alpha(theme.palette.primary.main, 0.12) + : "inherit", + py: isMobile ? 1.5 : 1, + }} + > + + {isEntitySelected ? ( + + ) : ( + + )} + + + {entity.description} + {entity.secondaryInfo && !isMobile && ( + + {entity.secondaryInfo} + + )} + + } + primaryTypographyProps={{ + variant: "body2", + fontWeight: isEntitySelected ? 600 : 400, + }} + secondaryTypographyProps={{ + variant: "caption", + }} + /> + {entity.status && ( + + )} + + ); + })} + + )} + + + {/* Footer con conteggio */} + + + {filteredEntities.length} risultati + + + + ); + }; + return ( - - - Anteprima Report - - - - Seleziona un'entità per ogni dataset da utilizzare nell'anteprima - - + {/* Mobile AppBar */} + {isMobile ? ( + + + + + + + Anteprima Report + + + + + ) : ( + + + Anteprima Report + + + + Seleziona un'entità per ogni dataset da utilizzare nell'anteprima + + + )} - + {hasError && ( Errore nel caricamento dei dati disponibili @@ -243,7 +556,38 @@ export default function PreviewDialog({ almeno un dataset per poter generare l'anteprima. + ) : isMobile ? ( + // Mobile: Switch between dataset list and entity list + + {mobileShowList ? ( + + + + Seleziona un'entità per ogni dataset + + + {renderDatasetList()} + + ) : ( + renderEntityList() + )} + ) : ( + // Desktop: Side by side <> {/* Lista dataset (sidebar) */} - - {selectedDatasets.map((dataset, index) => { - const isSelected = selections[dataset.id] !== null; - const isActive = activeDataset === dataset.id; - const query = entityQueries[index]; - const selectedEntity = isSelected - ? ((query.data as EntityListItemDto[]) || []).find( - (e) => e.id === selections[dataset.id], - ) - : null; - - return ( - setActiveDataset(dataset.id)} - sx={{ - borderBottom: 1, - borderColor: "divider", - bgcolor: isSelected - ? (theme) => alpha(theme.palette.success.main, 0.08) - : "inherit", - }} - > - - {isSelected ? ( - - ) : ( - getDatasetIcon(dataset.icon) - )} - - - {isSelected && ( - - { - e.stopPropagation(); - handleClearSelection(dataset.id); - }} - > - - - - )} - - ); - })} - + {renderDatasetList()} {/* Area principale con lista entità */} - - {activeDatasetObj && ( - <> - {/* Header dataset attivo */} - - - {getDatasetIcon(activeDatasetObj.icon)} - - {activeDatasetObj.name} - - - - - {activeDatasetObj.description} - - - {/* Ricerca */} - - handleSearchChange(activeDataset!, e.target.value) - } - InputProps={{ - startAdornment: ( - - - - ), - endAdornment: searchTerms[activeDataset || ""] && ( - - - handleSearchChange(activeDataset!, "") - } - > - - - - ), - }} - /> - - - {/* Lista entità */} - - {activeQuery?.isLoading ? ( - - - - ) : filteredEntities.length === 0 ? ( - - - {searchTerms[activeDataset || ""] - ? "Nessun risultato trovato per la ricerca" - : "Nessuna entità disponibile"} - - - ) : ( - - {filteredEntities.map((entity) => { - const isEntitySelected = - selections[activeDataset!] === entity.id; - - return ( - - handleSelectionChange(activeDataset!, entity.id) - } - selected={isEntitySelected} - sx={{ - borderBottom: 1, - borderColor: "divider", - bgcolor: isEntitySelected - ? (theme) => - alpha(theme.palette.primary.main, 0.12) - : "inherit", - }} - > - - {isEntitySelected ? ( - - ) : ( - - )} - - - {entity.description} - {entity.secondaryInfo && ( - - {entity.secondaryInfo} - - )} - - } - primaryTypographyProps={{ - variant: "body2", - fontWeight: isEntitySelected ? 600 : 400, - }} - secondaryTypographyProps={{ - variant: "caption", - }} - /> - {entity.status && ( - - )} - - ); - })} - - )} - - - {/* Footer con conteggio */} - - - {filteredEntities.length} risultati - {searchTerms[activeDataset || ""] && - ` per "${searchTerms[activeDataset || ""]}"`} - - - - )} - + {renderEntityList()} )} - - + + diff --git a/frontend/src/components/reportEditor/PropertiesPanel.tsx b/frontend/src/components/reportEditor/PropertiesPanel.tsx index 40302e5..a9df476 100644 --- a/frontend/src/components/reportEditor/PropertiesPanel.tsx +++ b/frontend/src/components/reportEditor/PropertiesPanel.tsx @@ -22,6 +22,8 @@ import { ListItemSecondaryAction, Button, Chip, + useMediaQuery, + useTheme, } from "@mui/material"; import { ExpandMore as ExpandMoreIcon, @@ -92,6 +94,9 @@ export default function PropertiesPanel({ currentPage, onUpdateCurrentPage, }: PropertiesPanelProps) { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [expanded, setExpanded] = useState([ "position", "style", @@ -175,23 +180,37 @@ export default function PropertiesPanel({ } }; + // Panel width based on context + const panelWidth = isMobile ? "100%" : 280; + if (!element) { // Show page settings when no element selected return ( - - {currentPage ? `Pagina: ${currentPage.name}` : "Impostazioni Pagina"} - + {!isMobile && ( + + {currentPage + ? `Pagina: ${currentPage.name}` + : "Impostazioni Pagina"} + + )} - + {/* Page name (only if currentPage is available) */} {currentPage && onUpdateCurrentPage && ( <> @@ -354,10 +373,12 @@ export default function PropertiesPanel({ return ( @@ -373,11 +394,13 @@ export default function PropertiesPanel({ }> Posizione - + }> Stile - + {element.type === "text" && ( <> @@ -474,7 +499,12 @@ export default function PropertiesPanel({ - + updateStyle("fontSize", Number(e.target.value)) } - sx={{ width: 100 }} + sx={{ width: isMobile ? "100%" : 100 }} /> - + - + Colore Bordo }> Immagine - + {/* Image Preview or Upload Button */} {element.imageSettings?.src ? ( @@ -642,7 +674,7 @@ export default function PropertiesPanel({ - Mantieni proporzioni + Proporzioni - {/* Alignment */} - - - Allineamento Orizzontale - - - value && updateImageSettings("horizontalAlign", value) - } - size="small" - fullWidth - > - - - - - - - - - - - - - - - Allineamento Verticale - - - value && updateImageSettings("verticalAlign", value) - } - size="small" - fullWidth - > - Alto - Centro - Basso - - - {/* Opacity */} @@ -878,11 +867,13 @@ export default function PropertiesPanel({ }> Contenuto - + Tipo @@ -915,7 +906,7 @@ export default function PropertiesPanel({ placeholder="{{evento.codice}}" value={element.content?.expression || ""} onChange={(e) => updateContent("expression", e.target.value)} - helperText="Es: {{evento.codice}}, {{cliente.ragioneSociale}}" + helperText={isMobile ? undefined : "Es: {{evento.codice}}"} /> )} @@ -959,11 +950,13 @@ export default function PropertiesPanel({ }> Sezione - + Sezione + + {/* Mobile import button inline with filter */} + {isMobile && ( + + )} + {/* Empty State */} {templates.length === 0 ? ( - + Nessun template trovato @@ -194,11 +247,16 @@ export default function ReportTemplatesPage() { Crea il tuo primo template di report o importane uno esistente - + @@ -206,27 +264,44 @@ export default function ReportTemplatesPage() { variant="contained" startIcon={} onClick={() => navigate("/report-editor")} + fullWidth={isMobile} > Crea Template - + ) : ( - + /* Template Grid */ + {templates.map((template) => ( - + + {/* Thumbnail */} {template.thumbnailBase64 ? ( - + )} - + + {/* Content */} + - + {template.nome} {template.descrizione && ( {template.descrizione} @@ -276,7 +370,17 @@ export default function ReportTemplatesPage() { : "Orizzontale"} - + + {/* Actions */} + - + @@ -293,7 +397,7 @@ export default function ReportTemplatesPage() { size="small" onClick={() => cloneMutation.mutate(template.id)} > - + @@ -301,7 +405,9 @@ export default function ReportTemplatesPage() { size="small" onClick={() => handleExport(template)} > - + @@ -311,7 +417,7 @@ export default function ReportTemplatesPage() { color="error" onClick={() => setDeleteDialog({ open: true, template })} > - + @@ -321,10 +427,32 @@ export default function ReportTemplatesPage() { )} + {/* Mobile FAB */} + {isMobile && ( + + navigate("/report-editor")} + sx={{ + position: "fixed", + bottom: 16, + right: 16, + zIndex: 1000, + }} + > + + + + )} + {/* Delete Dialog */} setDeleteDialog({ open: false, template: null })} + fullWidth + maxWidth="xs" + fullScreen={isMobile} > Conferma Eliminazione @@ -336,9 +464,10 @@ export default function ReportTemplatesPage() { Questa azione non può essere annullata. - + @@ -350,6 +479,7 @@ export default function ReportTemplatesPage() { deleteMutation.mutate(deleteDialog.template.id) } disabled={deleteMutation.isPending} + fullWidth={isMobile} > {deleteMutation.isPending ? "Eliminazione..." : "Elimina"} @@ -363,6 +493,9 @@ export default function ReportTemplatesPage() { setImportDialog(false); setImportFile(null); }} + fullWidth + maxWidth="xs" + fullScreen={isMobile} > Importa Template @@ -379,12 +512,13 @@ export default function ReportTemplatesPage() { /> - + @@ -392,6 +526,7 @@ export default function ReportTemplatesPage() { variant="contained" onClick={handleImport} disabled={!importFile || importMutation.isPending} + fullWidth={isMobile} > {importMutation.isPending ? "Importazione..." : "Importa"} diff --git a/frontend/src/types/report.ts b/frontend/src/types/report.ts index c95972a..4e9440e 100644 --- a/frontend/src/types/report.ts +++ b/frontend/src/types/report.ts @@ -125,6 +125,7 @@ export interface AprtStyle { fontSize: number; fontWeight: "normal" | "bold"; fontStyle: "normal" | "italic"; + textDecoration?: "none" | "underline" | "line-through"; color: string; backgroundColor?: string; textAlign: "left" | "center" | "right" | "justify"; diff --git a/src/Apollinare.API/apollinare.db-shm b/src/Apollinare.API/apollinare.db-shm deleted file mode 100644 index b16d5fc8220e737712aa236412d4df6ca223508c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)NlHUO6ouhu6ODarqOpzL)GdgDv7I<{3u52*hKwA#1zm(A_aF{M965CndP+qc zmQwKEef$N7K)BpG^)28PUMC`Vs=ksN({Dw|6yF|iu5YvVmC2{^(rWo-wN$H^W*MsP^Oe=Wkx9}v&x(@uPi8w%966ItSRfthO((_Dcj19va9SV z`^tfGs2nNB%87ESoGItZg>tEs758=y0tg_000IagfB*srAb| zfcsM?P-o^voo1R+)QUj8m7-CXnWhxAB9OIGG|HQ4N>M8U?i;r@PPdJkv@|5p7<1QZ z@B4eaCmBS*PoT+fECEx61azQ6x&)fdJg3)8Q;H%GTA(lVLiQnGMxftJQ;H%GT3{gb zLiQnGMqtoPQ;J#8Zy(Aq6mZ*D286hJ_O7N44Y|6Q3OH@jD%juJ_O7NjGAdm NQ3TQ^P!scmJ^=ZcHkSYZ diff --git a/src/Apollinare.API/apollinare.db-wal b/src/Apollinare.API/apollinare.db-wal deleted file mode 100644 index b6c8af8d4d4932d3c81e40b50b35491bdf832d17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144232 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