// Карточка КИО. Один и тот же компонент рисуется у курсанта, на пульте, // на внешнем мониторе и на АРМ ДДС — там в режиме `readOnly`. import { useSigns } from "@/shared/api/http"; import { type CardState, display } from "./merge"; import { type Field, type FieldGroup, visibleGroups } from "./fields"; interface Props { state: CardState; /** Обязательные поля приходят сценарием в `call.incoming`. */ required?: string[]; readOnly?: boolean; referenceArm?: boolean; onChange?: (path: string, value: unknown) => void; } export function KioCard({ state, required = [], readOnly = false, referenceArm = false, onChange }: Props) { const dds = display(state, "dds") as string | null; const groups = visibleGroups(dds); const section = (group: FieldGroup) => (
{(!referenceArm || group.area !== "header") &&
{group.title}
}
{(referenceArm && group.area === "incident" ? [...group.fields].sort((a, b) => Number(b.path === "incident_type") - Number(a.path === "incident_type")) : group.fields).map((field) => ( ))}
); return (
{groups.filter((group) => group.title === "Звонящий").map(section)} {groups.filter((group) => group.title === "Служебное").map(section)}
{groups.filter((group) => group.area === "address" || group.area === "description").map(section)}
{groups.filter((group) => group.area === "incident" || group.area === "dispatch" || group.area === "details").map(section)}
); } function Row({ field, value, pending, required, readOnly, referenceArm, onChange, }: { field: Field; value: unknown; pending: boolean; required: boolean; readOnly?: boolean; referenceArm: boolean; onChange?: (path: string, value: unknown) => void; }) { const empty = value === null || value === undefined || value === "" || (Array.isArray(value) && value.length === 0); return (
{referenceArm && field.path === "incident_type" ? "Что случилось?" : referenceArm && field.path === "caller_number" ? "АОН" : referenceArm && field.path === "caller_contact" ? "Предоставленный" : referenceArm && field.path === "caller_name" ? "Фамилия и имя заявителя" : field.label} {required && ·}
{readOnly ? ( {formatValue(value, field)} ) : ( )}
); } function Input({ field, value, referenceArm, onChange, }: { field: Field; value: unknown; referenceArm: boolean; onChange?: (path: string, value: unknown) => void; }) { const emit = (next: unknown) => onChange?.(field.path, next); if (field.kind === "list") { return {formatValue(value)}; } if (field.kind === "bool") { return (
); } if (field.kind === "select") { if (referenceArm && field.path === "incident_type") { return (
{field.options?.map((option) => ( ))}
); } return ( ); } if (field.kind === "signs") { return emit(next)} />; } if (field.kind === "textarea") { return