From 53c366c20ec7b7815fba4c2b53a6c7ed0cc6a311 Mon Sep 17 00:00:00 2001 From: dnviti Date: Sat, 29 Nov 2025 01:59:19 +0100 Subject: [PATCH] - --- CLAUDE.md | 43 ++++ .../components/reportEditor/EditorCanvas.tsx | 8 + frontend/src/pages/ReportEditorPage.tsx | 207 ++++++++++++++++-- src/Apollinare.API/apollinare.db-shm | Bin 32768 -> 32768 bytes src/Apollinare.API/apollinare.db-wal | Bin 1013552 -> 2414352 bytes 5 files changed, 240 insertions(+), 18 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index ab54395..6c2910f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -52,6 +52,34 @@ XX. **Nome Problema (FIX/IMPLEMENTATO DATA):** - **Problema:** Descrizione breve **Lavoro completato nell'ultima sessione:** +- **NUOVA FEATURE: Scorciatoie da Tastiera Complete per Report Designer** - COMPLETATO + - **Problema:** Le scorciatoie da tastiera (Ctrl+X, Ctrl+C, etc.) venivano intercettate dal browser invece che dalla pagina + - **Soluzione:** Riscritto completamente l'handler delle scorciatoie con: + - Controllo se il focus è su campi input/textarea/contenteditable + - Nuovo metodo `isTextEditing()` esposto da EditorCanvasRef per verificare editing testo nel canvas + - `e.preventDefault()` per bloccare comportamento browser + - **Scorciatoie implementate:** + - `Ctrl+Z` - Annulla + - `Ctrl+Y` - Ripeti + - `Ctrl+S` - Salva + - `Ctrl+X` - Taglia + - `Ctrl+C` - Copia + - `Ctrl+V` - Incolla + - `Ctrl+D` - Duplica + - `Ctrl+A` - Seleziona tutto + - `Ctrl+L` - Blocca/Sblocca elemento + - `Ctrl+G` - Raggruppa + - `Ctrl+Shift+G` - Separa + - `Ctrl+]` - Porta avanti + - `Ctrl+Shift+]` - Porta in primo piano + - `Ctrl+[` - Porta indietro + - `Ctrl+Shift+[` - Porta in fondo + - `Delete/Backspace` - Elimina elemento + - `Escape` - Deseleziona + - **File modificati:** + - `EditorCanvas.tsx` - Aggiunto `isTextEditing()` a `EditorCanvasRef` + - `ReportEditorPage.tsx` - Importato `EditorCanvasRef`, aggiunto `canvasRef`, riscritto `useEffect` delle scorciatoie + - **FIX: Rimossa Toolbar Contestuale che causava Layout Shift** - COMPLETATO - **Problema:** Quando si selezionava un oggetto nel canvas, appariva una toolbar aggiuntiva sotto quella principale che causava uno scroll della pagina - **Soluzione:** Rimossa completamente la toolbar contestuale - le proprietà degli oggetti vengono gestite solo dal `PropertiesPanel` sulla destra @@ -233,6 +261,11 @@ cd src/Apollinare.API && dotnet run cd frontend && npm run dev ``` +**IMPORTANTE:** Dopo modifiche al codice, i servizi backend e frontend vanno **sempre riavviati** per vedere le modifiche: + +- Backend: fermare con `Ctrl+C` e rilanciare `dotnet run` +- Frontend: in dev mode (`npm run dev`) il hot-reload è automatico per la maggior parte delle modifiche, ma per modifiche strutturali (nuovi file, cambi a tipi, etc.) potrebbe essere necessario riavviare + --- ## Project Overview @@ -1202,6 +1235,16 @@ frontend/src/ - Import inutilizzati: `TextField`, `ToggleButton`, `ToggleButtonGroup`, icone formattazione - **File:** `EditorToolbar.tsx`, `ReportEditorPage.tsx` +28. **Scorciatoie da Tastiera Intercettate dal Browser (FIX 29/11/2025):** + - **Problema:** Le scorciatoie da tastiera (Ctrl+S, Ctrl+C, Ctrl+V, etc.) nel report designer venivano catturate dal browser invece che dalla pagina - ad esempio Ctrl+S apriva il dialog di salvataggio del browser invece di salvare il template + - **Causa:** L'handler delle scorciatoie non chiamava `e.preventDefault()` in modo consistente e non verificava se l'utente stava modificando testo in un input field o nel canvas + - **Soluzione:** Riscritto completamente l'handler delle scorciatoie: + - Verifica se il target è un campo input (`INPUT`, `TEXTAREA`, `contentEditable`) + - Nuovo metodo `isTextEditing()` esposto da `EditorCanvasRef` per verificare se un elemento testo è in editing nel canvas Fabric.js + - `e.preventDefault()` chiamato subito dopo il riconoscimento della scorciatoia + - Implementate tutte le scorciatoie dichiarate nel context menu (Ctrl+X/C/V/D/A/L/G, Ctrl+[/], Delete, Escape) + - **File:** `EditorCanvas.tsx` (aggiunto `isTextEditing()` a `EditorCanvasRef`), `ReportEditorPage.tsx` (riscritto `useEffect` delle scorciatoie, aggiunto `canvasRef`) + ### Schema Database Report System Le tabelle sono già nel DbContext (`AppollinareDbContext.cs`): diff --git a/frontend/src/components/reportEditor/EditorCanvas.tsx b/frontend/src/components/reportEditor/EditorCanvas.tsx index e681d47..3c9d29e 100644 --- a/frontend/src/components/reportEditor/EditorCanvas.tsx +++ b/frontend/src/components/reportEditor/EditorCanvas.tsx @@ -68,6 +68,8 @@ interface EditorCanvasProps { export interface EditorCanvasRef { getCanvas: () => fabric.Canvas | null; addElement: (element: AprtElement) => void; + /** Check if a text element is currently being edited */ + isTextEditing: () => boolean; } // Snap configuration @@ -155,6 +157,12 @@ const EditorCanvas = forwardRef( fabricRef.current.renderAll(); } }, + isTextEditing: () => { + if (!fabricRef.current) return false; + const activeObj = fabricRef.current.getActiveObject(); + if (!activeObj) return false; + return !!(activeObj as fabric.Textbox).isEditing; + }, })); // Clear guide lines diff --git a/frontend/src/pages/ReportEditorPage.tsx b/frontend/src/pages/ReportEditorPage.tsx index 5569fe5..947c890 100644 --- a/frontend/src/pages/ReportEditorPage.tsx +++ b/frontend/src/pages/ReportEditorPage.tsx @@ -46,6 +46,7 @@ import { } from "@mui/icons-material"; import EditorCanvas, { type ContextMenuEvent, + type EditorCanvasRef, } from "../components/reportEditor/EditorCanvas"; import EditorToolbar, { type SnapOptions, @@ -179,6 +180,9 @@ export default function ReportEditorPage() { // Template version for collaboration sync (increments on each save) const templateVersionRef = useRef(0); + // Ref to EditorCanvas for checking text editing state + const canvasRef = useRef(null); + // ============ COLLABORATION (using global context) ============ // Room key format: "report-template:{id}" const roomKey = id ? `report-template:${id}` : null; @@ -803,6 +807,28 @@ export default function ReportEditorPage() { setSelectedElementIds([]); // Clear selection when switching pages }, []); + // Navigate to previous page + const handlePrevPage = useCallback(() => { + const currentIndex = template.pages.findIndex( + (p) => p.id === currentPageId, + ); + if (currentIndex > 0) { + setCurrentPageId(template.pages[currentIndex - 1].id); + setSelectedElementIds([]); + } + }, [template.pages, currentPageId]); + + // Navigate to next page + const handleNextPage = useCallback(() => { + const currentIndex = template.pages.findIndex( + (p) => p.id === currentPageId, + ); + if (currentIndex < template.pages.length - 1) { + setCurrentPageId(template.pages[currentIndex + 1].id); + setSelectedElementIds([]); + } + }, [template.pages, currentPageId]); + // ============ END PAGE MANAGEMENT HANDLERS ============ // Add new element @@ -1487,24 +1513,161 @@ export default function ReportEditorPage() { // Keyboard shortcuts useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { - if (e.ctrlKey || e.metaKey) { - switch (e.key) { + // Don't handle shortcuts when typing in input fields + const target = e.target as HTMLElement; + const isInputField = + target.tagName === "INPUT" || + target.tagName === "TEXTAREA" || + target.isContentEditable; + + // Don't handle shortcuts when editing text in canvas + const isCanvasTextEditing = canvasRef.current?.isTextEditing() ?? false; + + // Allow browser defaults for input fields and text editing + if (isInputField || isCanvasTextEditing) { + return; + } + + const hasCtrl = e.ctrlKey || e.metaKey; + const hasShift = e.shiftKey; + + // Handle Ctrl/Cmd shortcuts + if (hasCtrl) { + switch (e.key.toLowerCase()) { + // Undo: Ctrl+Z case "z": - e.preventDefault(); - handleUndo(); + if (!hasShift) { + e.preventDefault(); + handleUndo(); + } break; + + // Redo: Ctrl+Y or Ctrl+Shift+Z case "y": e.preventDefault(); handleRedo(); break; + + // Save: Ctrl+S case "s": e.preventDefault(); handleSave(); break; + + // Cut: Ctrl+X + case "x": + if (selectedElementId) { + e.preventDefault(); + handleCut(); + } + break; + + // Copy: Ctrl+C + case "c": + if (selectedElementId) { + e.preventDefault(); + handleCopy(); + } + break; + + // Paste: Ctrl+V + case "v": + if (clipboard) { + e.preventDefault(); + handlePaste(); + } + break; + + // Duplicate: Ctrl+D + case "d": + if (selectedElementId) { + e.preventDefault(); + handleDuplicate(); + } + break; + + // Select All: Ctrl+A + case "a": + e.preventDefault(); + handleSelectAll(); + break; + + // Lock/Unlock: Ctrl+L + case "l": + if (selectedElementId) { + e.preventDefault(); + handleToggleLock(); + } + break; + + // Group: Ctrl+G / Ungroup: Ctrl+Shift+G + case "g": + if (selectedElementId) { + e.preventDefault(); + if (hasShift) { + handleUngroup(); + } else { + handleGroup(); + } + } + break; + + // Layer ordering with brackets + // Bring Forward: Ctrl+] / Bring to Front: Ctrl+Shift+] + case "]": + if (selectedElementId) { + e.preventDefault(); + if (hasShift) { + handleBringToFront(); + } else { + handleBringForward(); + } + } + break; + + // Send Backward: Ctrl+[ / Send to Back: Ctrl+Shift+[ + case "[": + if (selectedElementId) { + e.preventDefault(); + if (hasShift) { + handleSendToBack(); + } else { + handleSendBackward(); + } + } + break; } } - if (e.key === "Delete" && selectedElementId) { - handleDeleteElement(); + + // Non-Ctrl shortcuts + if (!hasCtrl) { + switch (e.key) { + // Delete element + case "Delete": + case "Backspace": + if (selectedElementId && !selectedElement?.locked) { + e.preventDefault(); + handleDeleteElement(); + } + break; + + // Escape to deselect + case "Escape": + e.preventDefault(); + handleDeselectAll(); + break; + + // Page navigation + case "PageUp": + e.preventDefault(); + handlePrevPage(); + break; + + case "PageDown": + e.preventDefault(); + handleNextPage(); + break; + } } }; @@ -1514,8 +1677,25 @@ export default function ReportEditorPage() { handleUndo, handleRedo, handleSave, + handleCut, + handleCopy, + handlePaste, + handleDuplicate, + handleSelectAll, + handleDeselectAll, + handleToggleLock, + handleGroup, + handleUngroup, + handleBringToFront, + handleBringForward, + handleSendToBack, + handleSendBackward, handleDeleteElement, + handlePrevPage, + handleNextPage, selectedElementId, + selectedElement, + clipboard, ]); // Auto-save: simple debounced save on every template change @@ -1701,18 +1881,8 @@ export default function ReportEditorPage() { currentPageIndex={currentPageIndex} totalPages={template.pages.length} currentPageName={currentPage?.name || "Pagina 1"} - onPrevPage={() => { - if (currentPageIndex > 0) { - setCurrentPageId(template.pages[currentPageIndex - 1].id); - setSelectedElementIds([]); - } - }} - onNextPage={() => { - if (currentPageIndex < template.pages.length - 1) { - setCurrentPageId(template.pages[currentPageIndex + 1].id); - setSelectedElementIds([]); - } - }} + onPrevPage={handlePrevPage} + onNextPage={handleNextPage} hasUnsavedChanges={hasUnsavedChanges} // Auto-save props autoSaveEnabled={autoSaveEnabled} @@ -1747,6 +1917,7 @@ export default function ReportEditorPage() { {/* Canvas - show only elements for current page */} rF_m+;tEiFYX*BBroo@5g#w^x=u)5-1|j* zytvo8A6{bD6RBfHiO}`#_kG8`kH*K1dk^%(P3(Fib~~Lf;SE|M4MId!*hUC2rMq>3*lN%?y|UGhhbHfEh3Y zX21-X0W)9*%zzm%17^Ssm;p0j2F!pNFau`54445kUZd8@;UjP0!~4vkmDwsCiJZuMq>-ovn^lZan>>;o(m$G5@V;~FbePizQOAO zUj3PrQ9B=JQI3PSo@tz%j++f^+dmCd#~5ryINR}Mo?vaW^iM^9>`AVy!_9xL$~t|2$;vMa}NDR=S;i{7Xxv(lLt;9HdEV7||^H}-p;T7n&@ zfw9)g9Y%*O1^=Xii+1M4cMdd|IuA5e`W_%SmDwoXsgz75pH zQ`m!S?8JpU#|CD~(|jrQTYL{m*o4pXEq=y}{GONi6Uzn8SuS;+T82xg&XN3tnFCj! zr()j+qVY8LB0KNpBA#bMGvzr0rPXP4J(991C-HOsz#n;;j#EB>#&WBt>T>*u8XU#V z%o4x~Jtg}*P!G>wA9CqI{66nAl8tdM~HG>Kl-Pw{a>Du~L9dawH}NxSa}2jJo9~qt TQpfsL_yy4%&s{9$`|*DR+4luF delta 1026 zcmb8tWmFVV7{>Actghp#t6&$R0%Bo{tzck)jol4m_lnBe9XNKOASS3Q*oEC9*kWRL z5MT9juOB>q^Pcn0Jm;C;y>rf-vD-~{yD6+_sux)+j~ES{GR1wSn3SN%pUEG+i~G67 zW>j-8tEYYO33bl=mHNM493@wVxc>TU{i(ylEY<*##jCN1@imf6uA0B`QVTKMwJBP# z;m|xa|8U1ABVKb4kNIv5{#P66ropn!dLk#zVX=9~C0GK@x|NQs;fZM6G;<9mbJB2F zqIEZh5yMZBZF+V>I6!h%wwiFqk02Hi%WcuP=y~bHTAs$q18OpbQz9m6dOkX{j%TW` zg^kmycOsDWJXd{frgBC^4^21IiY44J9F{2EnJ#SLg)-iRlAufuTClW3y(%gO=j+E@mG|qH)m+(~}6^s9g=Pb5ZTeO*>ZdNSG+S2))?K zTV)!GAM27dx%1#jdq!a35H3P5N^iFDPPs{FUE01ic$<@Cts9k#sY3CQHAjwmBN)l?Bc5u%~{ATC8{!k zV^Wl6FuVCCMZOlSB9X_WkxmAgqAa1At1*$|(w1Qed-yJ`xdW?75z#|4S7#C@q$tZ! Q_VPnyo4Fjr*)LM)Z>1G4&j0`b diff --git a/src/Apollinare.API/apollinare.db-wal b/src/Apollinare.API/apollinare.db-wal index fd0fdcf607c5c193dd7d63a4230a5b2f6232807c..035480285bf3ab49dee66ca3d6e8a497570a6604 100644 GIT binary patch delta 39114 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 PkZdN7&}OGR20FI7%_?v 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 v|F1@(6v9Jdg;?>=vsEP+a>kVvHPJpaD{<$nrq