feat: Aktualisieren-Button auf Projektkarten (Re-Deploy gehosteter Projekte)

Dritter Aktions-Button neben Bearbeiten/Vorschau: stoesst fuer bereits
gehostete/deployte Projekte den Deploy erneut an (updateWebsiteProject
mit gleichem Typ), damit eine ueberarbeitete Website neu geladen wird.
Spinner waehrend der Aktualisierung.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-07-12 17:54:31 +00:00
parent 8855fe92ba
commit 5270084ff0

View File

@@ -109,6 +109,7 @@ export default function ProjectsPage() {
const [notice, setNotice] = useState('')
const [assignBusyId, setAssignBusyId] = useState('')
const [hostBusyId, setHostBusyId] = useState('')
const [refreshBusyId, setRefreshBusyId] = useState('')
// Bearbeiten-Modal
const [editProject, setEditProject] = useState(null)
@@ -272,6 +273,25 @@ export default function ProjectsPage() {
}
}
// Bereits gehostetes Projekt erneut deployen (nach Website-Ueberarbeitung neu laden)
const handleRefresh = async (project) => {
setRefreshBusyId(project.$id)
setNotice('')
try {
const r = await updateWebsiteProject(project.$id, { projectType: typeOf(project) })
setNotice(
r.deploy?.deployed
? `"${project.projectName}" wurde aktualisiert${r.previewUrl ? ': ' + r.previewUrl : ''}`
: `Aktualisierung angestossen, aber nicht bestaetigt: ${r.deploy?.error || 'siehe Server-Logs'}`
)
await fetchAllProjects()
} catch (err) {
setNotice('Aktualisieren fehlgeschlagen: ' + (err.message || 'unbekannt'))
} finally {
setRefreshBusyId('')
}
}
const openEdit = (project) => {
setEditError('')
setEditProject(project)
@@ -543,6 +563,21 @@ export default function ProjectsPage() {
) : (
<PreviewLinkButton href={project.previewUrl} />
)}
{hosted && ready && !project.archived && (
<button
type="button"
className="btn btn-dark"
style={{ padding: '6px 12px', fontSize: '13px' }}
onClick={() => handleRefresh(project)}
disabled={refreshBusyId === project.$id}
title="Projekt neu deployen / Website neu laden"
>
<FaArrowsRotate
style={refreshBusyId === project.$id ? { animation: 'spin 1s linear infinite' } : undefined}
/>{' '}
{refreshBusyId === project.$id ? 'Aktualisiere…' : 'Aktualisieren'}
</button>
)}
<GiteaLinkButton href={project.giteaRepoUrl} />
</div>
</div>