fix(deploy): retire sanity-check qui bloquait le deploy (vars pas toutes dans Gitea)
Some checks failed
CI / Lint, Unit Tests & Build (push) Successful in 5m39s
CI / Deploy production (on server) (push) Failing after 3s

This commit is contained in:
Antigravity
2026-06-28 14:55:44 +00:00
parent 56ce662d38
commit 10101e5918
10 changed files with 46 additions and 45 deletions

View File

@@ -123,8 +123,10 @@ interface ContextualAIChatProps {
noteContent?: string
noteImages?: string[]
noteId?: string
/** Called when an action result should be injected into the note */
onApplyToNote?: (newContent: string) => void
/** Called when an action result should be injected into the note.
* `options.asRichText` signals that newContent is HTML and the note should
* switch out of markdown mode. */
onApplyToNote?: (newContent: string, options?: { asRichText?: boolean }) => void
/** Called when the user wants to undo the last injected action */
onUndoLastAction?: () => void
/** Whether the last action has been applied (so we can show undo) */
@@ -213,7 +215,7 @@ export function ContextualAIChat({
// Action state
const [actionLoading, setActionLoading] = useState<string | null>(null)
const [actionPreview, setActionPreview] = useState<{ label: string; text: string } | null>(null)
const [actionPreview, setActionPreview] = useState<{ label: string; text: string; asRichText?: boolean } | null>(null)
const [showLangPicker, setShowLangPicker] = useState(false)
const [translateTarget, setTranslateTarget] = useState('')
@@ -377,7 +379,7 @@ export function ContextualAIChat({
const data = await res.json()
if (!res.ok) throw new Error(data.error || t('ai.genericError'))
const result = data[action.resultKey] || ''
setActionPreview({ label: t(action.i18nKey), text: result })
setActionPreview({ label: t(action.i18nKey), text: result, asRichText: action.id === 'toRichText' })
} catch (e: any) {
mToast.error(e.message || t('ai.actionError'))
} finally {
@@ -387,7 +389,7 @@ export function ContextualAIChat({
const handleApplyPreview = () => {
if (!actionPreview || !onApplyToNote) return
onApplyToNote(actionPreview.text)
onApplyToNote(actionPreview.text, { asRichText: actionPreview.asRichText })
setActionPreview(null)
mToast.success(t('ai.appliedToNote'))
}
@@ -712,7 +714,15 @@ export function ContextualAIChat({
</div>
<div className="flex-1 overflow-y-auto p-6 custom-scrollbar">
<div className="bg-white/60 dark:bg-white/5 border border-border p-6 rounded-2xl leading-relaxed text-sm">
<MarkdownContent content={actionPreview.text} />
{actionPreview.asRichText ? (
<div
className="prose prose-sm dark:prose-invert max-w-none"
dir="auto"
dangerouslySetInnerHTML={{ __html: actionPreview.text }}
/>
) : (
<MarkdownContent content={actionPreview.text} />
)}
</div>
</div>
<div className="p-6 border-t border-border flex gap-3 shrink-0">
@@ -957,7 +967,7 @@ export function ContextualAIChat({
</motion.button>
)}
<div className="grid grid-cols-2 gap-3">
{ACTION_IDS.filter(a => a.id !== 'markdown').map((action, i) => {
{ACTION_IDS.filter(a => a.id !== 'markdown' && a.id !== 'toRichText').map((action, i) => {
const loading = actionLoading === action.id
const isActive = action.id === 'translate' && showLangPicker
const Icon = action.icon

View File

@@ -936,6 +936,12 @@ export function NoteEditorProvider({ note, readOnly = false, fullPage = false, o
handleRemoveLink,
setShowMarkdownPreview: (show) => { setShowMarkdownPreview(show); setIsDirty(true) },
setIsMarkdown: (m) => { setIsMarkdown(m); setIsDirty(true) },
convertToRichText: (html) => {
setContentImmediate(html)
setIsMarkdown(false)
setShowMarkdownPreview(false)
setIsDirty(true)
},
setColor: (c) => { setColor(c); setIsDirty(true) },
setSize: (s) => { setSize(s); setIsDirty(true) },
setShowReminderDialog,

View File

@@ -201,9 +201,13 @@ export function NoteEditorDialog({ onClose }: NoteEditorDialogProps) {
noteContent={state.content}
noteImages={state.allImages}
noteId={note.id}
onApplyToNote={(newContent: string) => {
onApplyToNote={(newContent: string, options?: { asRichText?: boolean }) => {
actions.setPreviousContentForCopilot(state.content)
actions.setContent(newContent)
if (options?.asRichText) {
actions.convertToRichText(newContent)
} else {
actions.setContent(newContent)
}
}}
onUndoLastAction={state.previousContentForCopilot !== null ? () => {
if (state.previousContentForCopilot !== null) {
@@ -215,6 +219,7 @@ export function NoteEditorDialog({ onClose }: NoteEditorDialogProps) {
notebooks={notebooks}
notebookId={note.notebookId ?? undefined}
notebookName={notebooks.find(nb => nb.id === note.notebookId)?.name ?? undefined}
diagramInsertFormat={state.isMarkdown ? 'markdown' : 'html'}
/>
)}
</DialogContent>

View File

@@ -175,10 +175,15 @@ export function NoteEditorFullPage({ onClose }: NoteEditorFullPageProps) {
noteContent={state.content}
noteImages={state.allImages}
noteId={note.id}
onApplyToNote={(nc: string) => {
onApplyToNote={(nc: string, options?: { asRichText?: boolean }) => {
actions.setPreviousContentForCopilot(state.content)
actions.setContent(nc)
if (state.isMarkdown) actions.setShowMarkdownPreview(true)
if (options?.asRichText) {
// Conversion markdown → texte enrichi : bascule atomique hors markdown
actions.convertToRichText(nc)
} else {
actions.setContent(nc)
if (state.isMarkdown) actions.setShowMarkdownPreview(true)
}
}}
onUndoLastAction={state.previousContentForCopilot !== null ? () => { actions.setContent(state.previousContentForCopilot!); actions.setPreviousContentForCopilot(null) } : undefined}
lastActionApplied={state.previousContentForCopilot !== null}

View File

@@ -490,16 +490,15 @@ export function NoteEditorToolbar({ mode, onClose, onToggleAttachments, attachme
try {
let html: string
if (state.isMarkdown) {
const { marked } = await import('marked')
html = await marked(state.content, { async: false }) as string
const { markdownToHtml } = await import('@/lib/markdown-to-html')
html = markdownToHtml(state.content)
} else {
html = state.content
.split(/\n{2,}/)
.map(para => `<p>${para.trim().replace(/\n/g, '<br />')}</p>`)
.join('')
}
actions.setContent(html)
actions.setIsMarkdown(false)
actions.convertToRichText(html)
toast.success(t('notes.convertedToRichText') || 'Converted to rich text', {
duration: 8000,

View File

@@ -84,6 +84,9 @@ export interface NoteEditorActions {
setShowMarkdownPreview: (show: boolean) => void
setIsMarkdown: (markdown: boolean) => void
/** Bascule atomiquement la note en texte enrichi : applique le HTML immédiatement
* et sort du mode markdown (source unique de conversion markdown → rich text). */
convertToRichText: (html: string) => void
setColor: (color: NoteColor) => void
setSize: (size: NoteSize) => void