import { useState, useEffect, useMemo } from 'react' import { FaFolder, FaPlus, FaArrowUpRightFromSquare } from 'react-icons/fa6' import { useWebsiteProjects } from '../hooks/useWebsiteProjects' import { useCustomers } from '../hooks/useCustomers' import { useWorkorders } from '../hooks/useWorkorders' import { createProjectFromTemplate } from '../lib/projectAdminApi' function slugify(value) { return String(value || '') .toLowerCase() .replace(/[^a-z0-9-]+/g, '-') .replace(/^-+|-+$/g, '') .slice(0, 100) } const WORKORDER_FILTERS = { limit: 500 } export default function ProjectsPage() { const { projects, loading, error, fetchAllProjects } = useWebsiteProjects() const { customers } = useCustomers() const { workorders } = useWorkorders(WORKORDER_FILTERS) const [filter, setFilter] = useState('all') const [showCreateModal, setShowCreateModal] = useState(false) const [createForm, setCreateForm] = useState({ displayName: '', subdomain: '', repoName: '', customerId: '', }) const [createLoading, setCreateLoading] = useState(false) const [createError, setCreateError] = useState('') useEffect(() => { fetchAllProjects() }, [fetchAllProjects]) const customerMap = useMemo(() => { const map = {} for (const c of customers) { map[c.$id] = c.name || c.code || c.$id } return map }, [customers]) const ticketMap = useMemo(() => { const map = {} for (const wo of workorders) { map[wo.$id] = wo.woid || wo.$id } return map }, [workorders]) const filteredProjects = useMemo(() => { if (filter === 'unassigned') { return projects.filter((p) => !p.customerId) } if (filter === 'assigned') { return projects.filter((p) => Boolean(p.customerId)) } return projects }, [projects, filter]) const handleCreate = async (e) => { e.preventDefault() setCreateLoading(true) setCreateError('') try { await createProjectFromTemplate({ repoName: createForm.repoName || createForm.subdomain, displayName: createForm.displayName, subdomain: slugify(createForm.subdomain), customerId: createForm.customerId || '', ticketId: '', }) setShowCreateModal(false) setCreateForm({ displayName: '', subdomain: '', repoName: '', customerId: '' }) await fetchAllProjects() } catch (err) { setCreateError(err.message || 'Projekt konnte nicht angelegt werden') } finally { setCreateLoading(false) } } return (
Projekte werden geladen...
) : filteredProjects.length === 0 ? (Keine Projekte gefunden.
| Name | Subdomain | Template | Kunde | Ticket (WOID) | Status | Preview |
|---|---|---|---|---|---|---|
| {project.projectName} | {project.subdomain} | {project.templateName || '-'} | {project.customerId ? customerMap[project.customerId] || project.customerId : '-'} | {project.ticketId ? ticketMap[project.ticketId] || project.ticketId : '-'} | {project.status || '-'} |
{project.previewUrl ? (
|