import { useState } from 'react' import { CRITERION_KIND_LABELS, CRITERION_STATUS_LABELS, } from '../constants/status.js' import { Modal } from './Modal.jsx' import { GateCriterionForm } from './GateCriterionForm.jsx' import { createRoadmapItemCriterion, deleteRoadmapCriterion, deferRoadmapCriterion, satisfyRoadmapCriterion, updateRoadmapCriterion, waiveRoadmapCriterion, } from '../api/roadmap.js' function CriterionDecisionForm({ label, onSubmit, busy, onCancel }) { const [title, setTitle] = useState('') const [description, setDescription] = useState('') return (
) } export function GateCriteriaSection({ itemId, itemStatus = 'planned', criteria = [], progress = null, canManage = false, busy = false, onChanged, onAction, }) { const [showCreate, setShowCreate] = useState(false) const [editingCriterion, setEditingCriterion] = useState(null) const [decisionModal, setDecisionModal] = useState(null) const closedCount = progress?.closed ?? criteria.filter((c) => ['satisfied', 'waived', 'deferred'].includes(c.status), ).length const totalCount = progress?.total ?? criteria.length const itemReached = itemStatus === 'reached' async function runAction(fn) { if (onAction) { await onAction(fn) return } await fn() await onChanged?.() } return ({closedCount}/{totalCount} Kriterien abgeschlossen — prüfbare Akzeptanz statt Freitext-DoD.
Noch keine Kriterien — lege prüfbare Akzeptanzpunkte an.
)}{CRITERION_KIND_LABELS[crit.criterion_kind] || crit.criterion_kind}
{crit.description &&{crit.description}
}