Skip to content

Commit f95dc01

Browse files
committed
Aggiunto render in DialogLLM
1 parent 4935ae8 commit f95dc01

File tree

4 files changed

+565
-428
lines changed

4 files changed

+565
-428
lines changed

backend/adapters/output/prompt_builder_adapter.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,11 @@ def build_generate_prompt(
285285
- Se è presente un "TESTO DI CONTESTO", usalo come riferimento per stile, tono o continuazione logica.
286286
- FORMATTAZIONE OBBLIGATORIA: DEVI strutturare il testo usando il Markdown in modo ricco. Usa titoli (##, ###) per dividere le sezioni, liste puntate o numerate per elencare i punti chiave, e usa il **grassetto** per evidenziare i concetti più importanti. Non restituire un muro di testo continuo.
287287
- STRICT OUTPUT: Rispondi SOLO con il testo generato inserito nel JSON. NON aggiungere introduzioni (es. "Ecco il testo:"). ASSOLUTAMENTE NON aggiungere note finali, disclaimer, conclusioni o commenti sul fatto che hai usato il Markdown o su quale lingua hai scelto (es. "Nota: Il testo è stato scritto in..."). Il testo deve contenere solo il contenuto richiesto, pronto per essere inserito in un documento.
288+
- Per scrivere sezioni di codice di programmazione usa i caratteri: ``` ``` non ` `. Subito dopo il carattere ```, inserisci il linguaggio di programmazione utilizzato, poi vai a capo e scrivi il codice. Esempio:
289+
```js
290+
let i=0;
291+
function ciao()
292+
```
288293
289294
SCHEMA OUTPUT OBBLIGATORIO:
290295
{{

frontend/src/components/DialogLLM.tsx

Lines changed: 121 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -5,117 +5,135 @@ import DialogActions from '@mui/material/DialogActions';
55
import DialogContent from '@mui/material/DialogContent';
66
import DialogContentText from '@mui/material/DialogContentText';
77
import DialogTitle from '@mui/material/DialogTitle';
8+
import 'easymde/dist/easymde.min.css';
9+
import 'highlight.js/styles/vs.css';
10+
import { marked } from 'marked';
11+
import '../style/md-editor.css';
812

913
interface DialogLLMProps {
10-
text: string;
11-
open: boolean;
12-
loading: boolean;
13-
actionType?: 'insert' | 'analysis' | 'summary' | 'improve' | 'translate';
14-
hasSelection?: boolean;
15-
onClose: () => void;
16-
onCancel?: () => void;
17-
onCopySuccess?: () => void;
18-
onReplace?: () => void;
19-
onInsertBelow?: () => void;
20-
onCreateNewNote?: () => void;
14+
text: string;
15+
open: boolean;
16+
loading: boolean;
17+
actionType?: 'insert' | 'analysis' | 'summary' | 'improve' | 'translate';
18+
hasSelection?: boolean;
19+
onClose: () => void;
20+
onCancel?: () => void;
21+
onCopySuccess?: () => void;
22+
onReplace?: () => void;
23+
onInsertBelow?: () => void;
24+
onCreateNewNote?: () => void;
2125
}
2226

2327
export default function DialogLLM({
24-
text,
25-
open,
26-
loading,
27-
actionType = 'insert',
28-
hasSelection = false,
29-
onClose,
30-
onCancel,
31-
onCopySuccess,
32-
onReplace,
33-
onInsertBelow,
34-
onCreateNewNote
28+
text,
29+
open,
30+
loading,
31+
actionType = 'insert',
32+
hasSelection = false,
33+
onClose,
34+
onCancel,
35+
onCopySuccess,
36+
onReplace,
37+
onInsertBelow,
38+
onCreateNewNote
3539
}: DialogLLMProps) {
36-
const isInvalidResult =
37-
text === "Generazione annullata dall'utente." ||
38-
text.startsWith("Errore") ||
39-
text.startsWith("Richiesta rifiutata") ||
40-
text.startsWith("Input non valido") ||
41-
text === "Nessun testo generato.";
40+
const isInvalidResult =
41+
text === "Generazione annullata dall'utente." ||
42+
text.startsWith('Errore') ||
43+
text.startsWith('Richiesta rifiutata') ||
44+
text.startsWith('Input non valido') ||
45+
text === 'Nessun testo generato.';
4246

43-
const handleCopy = () => {
44-
if (!text || isInvalidResult) return;
45-
navigator.clipboard.writeText(text)
46-
.then(() => {
47-
if (onCopySuccess) onCopySuccess();
48-
})
49-
.catch(err => {
50-
console.error("Errore durante la copia:", err);
51-
});
52-
};
47+
const handleCopy = () => {
48+
if (!text || isInvalidResult) return;
49+
navigator.clipboard
50+
.writeText(text)
51+
.then(() => {
52+
if (onCopySuccess) onCopySuccess();
53+
})
54+
.catch((err) => {
55+
console.error('Errore durante la copia:', err);
56+
});
57+
};
5358

54-
return (
55-
<Dialog open={open} onClose={onClose} maxWidth="md" fullWidth>
56-
<DialogTitle>Risultato LLM</DialogTitle>
59+
return (
60+
<Dialog open={open} onClose={onClose} maxWidth='md' fullWidth>
61+
<DialogTitle>Risultato LLM</DialogTitle>
5762

58-
<DialogContent
59-
dividers
60-
className={`dialog-content-custom ${loading ? 'is-loading' : ''}`}
61-
>
62-
{loading ? (
63-
<div className="dialog-loading-box">
64-
<CircularProgress size={24} />
65-
<DialogContentText className="dialog-loading-text">
66-
LLM sta generando la risposta…
67-
</DialogContentText>
68-
</div>
69-
) : (
70-
<DialogContentText className="dialog-text-pre">
71-
{text || 'Nessun risultato'}
72-
</DialogContentText>
73-
)}
74-
</DialogContent>
63+
<DialogContent
64+
dividers
65+
className={`dialog-content-custom ${loading ? 'is-loading' : ''}`}>
66+
{loading ? (
67+
<div className='dialog-loading-box'>
68+
<CircularProgress size={24} />
69+
<DialogContentText className='dialog-loading-text'>
70+
LLM sta generando la risposta…
71+
</DialogContentText>
72+
</div>
73+
) : (
74+
<div className='editor-preview-side editor-preview editor-preview-active-side dialog-preview'>
75+
{text ? (
76+
<div dangerouslySetInnerHTML={{ __html: marked.parse(text) }} />
77+
) : (
78+
'Nessun risultato'
79+
)}
80+
</div>
81+
)}
82+
</DialogContent>
7583

76-
<DialogActions>
77-
{loading ? (
78-
<Button onClick={onCancel} color="error">
79-
Annulla
80-
</Button>
81-
) : (
82-
<>
83-
{!isInvalidResult && actionType === 'insert' && (
84-
<>
85-
{hasSelection ? (
86-
<>
87-
<Button onClick={onReplace} variant="outlined" disabled={!text}>
88-
Sostituisci Testo
89-
</Button>
90-
<Button onClick={onInsertBelow} variant="contained" disabled={!text}>
91-
Inserisci Sotto
92-
</Button>
93-
</>
94-
) : (
95-
<Button onClick={onReplace} variant="contained" disabled={!text}>
96-
Inserisci Testo
97-
</Button>
98-
)}
99-
</>
100-
)}
101-
102-
{!isInvalidResult && actionType !== 'insert' && onCreateNewNote && (
103-
<Button onClick={onCreateNewNote} variant="contained" disabled={!text}>
104-
Salva come nota
105-
</Button>
106-
)}
84+
<DialogActions>
85+
{loading ? (
86+
<Button onClick={onCancel} color='error'>
87+
Annulla
88+
</Button>
89+
) : (
90+
<>
91+
{!isInvalidResult && actionType === 'insert' && (
92+
<>
93+
{hasSelection ? (
94+
<>
95+
<Button
96+
onClick={onReplace}
97+
variant='outlined'
98+
disabled={!text}>
99+
Sostituisci Testo
100+
</Button>
101+
<Button
102+
onClick={onInsertBelow}
103+
variant='contained'
104+
disabled={!text}>
105+
Inserisci Sotto
106+
</Button>
107+
</>
108+
) : (
109+
<Button
110+
onClick={onReplace}
111+
variant='contained'
112+
disabled={!text}>
113+
Inserisci Testo
114+
</Button>
115+
)}
116+
</>
117+
)}
107118

108-
{!isInvalidResult && (
109-
<Button onClick={handleCopy} disabled={!text}>
110-
Copia
111-
</Button>
112-
)}
113-
<Button onClick={onClose}>
114-
Chiudi
115-
</Button>
116-
</>
117-
)}
118-
</DialogActions>
119-
</Dialog>
120-
);
121-
}
119+
{!isInvalidResult && actionType !== 'insert' && onCreateNewNote && (
120+
<Button
121+
onClick={onCreateNewNote}
122+
variant='contained'
123+
disabled={!text}>
124+
Salva come nota
125+
</Button>
126+
)}
127+
128+
{!isInvalidResult && (
129+
<Button onClick={handleCopy} disabled={!text}>
130+
Copia
131+
</Button>
132+
)}
133+
<Button onClick={onClose}>Chiudi</Button>
134+
</>
135+
)}
136+
</DialogActions>
137+
</Dialog>
138+
);
139+
}

0 commit comments

Comments
 (0)