// 全屏预览:读完整方案 + 就地裁决
function GatePreview({ item, t, onDecide, onClose }) {
const { ComplexityBadge, Button, Textarea } = window.MaestroDesignSystem_a6a290;
const [rejecting, setRejecting] = React.useState(false);
const [reason, setReason] = React.useState('');
React.useEffect(() => {
const onKey = (e) => { if (e.key === 'Escape') onClose(); };
window.addEventListener('keydown', onKey);
return () => window.removeEventListener('keydown', onKey);
}, [onClose]);
if (!item) return null;
return (
{t.gates[item.gate]}
{item.title}
{item.meta}
{item.docLabel ?
{item.docLabel}
: null}
{item.doc}
{rejecting ? (
) : (
)}
);
}
// 审批闸区:斜纹条 + GateCard 列表(accept/reject + 驳回必填理由)
function GateSection({ approvals, onDecide, t }) {
const { GateCard, GateStripe, Button, Textarea, SectionHead } = window.MaestroDesignSystem_a6a290;
const [rejecting, setRejecting] = React.useState(null);
const [reason, setReason] = React.useState('');
const [preview, setPreview] = React.useState(null);
const [folded, setFolded] = React.useState(() => new Set());
const toggleFold = (id) => setFolded((prev) => {
const next = new Set(prev); next.has(id) ? next.delete(id) : next.add(id); return next;
});
if (approvals.length === 0) return null;
return (
{approvals.map((a) => {
const isFolded = folded.has(a.id);
return (
toggleFold(a.id)}
foldTitle={isFolded ? t.gateExpand : t.gateCollapse}
onHeaderDoubleClick={() => setPreview(a)} headerTitle={t.gateDblTip}
headerExtra={}
actions={
}>
{rejecting === a.id ? (
) : null}
);
})}
setPreview(null)} />
);
}
window.MaestroKitGateSection = GateSection;