setSearch(e.target.value)}
style={{ flex: '1 1 220px', minWidth: '180px', maxWidth: '320px' }}
/>
{notice && (
{notice}
)}
{hiddenHits.length > 0 && (
Weitere Treffer:
{hiddenHits.map((h, i) => (
{i > 0 && · }
))}
)}
{error && (
{error}
)}
{loading ? (
Projekte werden geladen...
) : filteredProjects.length === 0 ? (
{filter === 'archived' ? 'Keine archivierten Projekte.' : 'Keine Projekte gefunden.'}
) : (
{filteredProjects.map((project) => {
const type = typeOf(project)
const t = TYPES[type]
const hosted = HOSTED_TYPES.has(type)
const ready = isProjectReady(project)
const needsHosting = hosted && !ready && !project.archived
return (
{project.projectName || project.giteaRepoName || '(ohne Name)'}
{project.repoFullName && (
{project.repoFullName}
)}
{t.icon} {t.short}
{hosted && !project.archived && (
{ready ? 'gehostet' : 'nicht deployt'}
)}
{project.subdomain
? {project.subdomain}
: ohne Website}
{project.ticketId ? (ticketMap[project.ticketId] || project.ticketId) : -}
{project.archived ? 'archiviert' : (project.status || '-')}
{needsHosting ? (
) : (
)}
{hosted && ready && !project.archived && (
)}
)
})}
)}
{/* --- Neues Projekt --- */}
{showCreateModal && (
setShowCreateModal(false)}>×
Neues Website-Projekt
{createError && (
{createError}
)}
)}
{/* --- Projekt bearbeiten --- */}
{editProject && (
setEditProject(null)}>×
Projekt bearbeiten
{editProject.repoFullName}
{editError && (
{editError}
)}
{/* Nur mit gespeicherter Subdomain - sonst meldet der Block "keine Preview-Subdomain" */}
{editForm.projectType !== 'project' && editProject.subdomain && !editProject.archived && (
)}
)}
)
}
function Row({ label, children }) {
return (