// Карточка КИО. Один и тот же компонент рисуется у курсанта, на пульте,
// на внешнем мониторе и на АРМ ДДС — там в режиме `readOnly`.
import { useIncidentGroups, 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 incidentGroup = display(state, "incident_group") as number | 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, incidentGroup, onChange,
}: {
field: Field;
value: unknown;
pending: boolean;
required: boolean;
readOnly?: boolean;
referenceArm: boolean;
incidentGroup: number | null;
onChange?: (path: string, value: unknown) => void;
}) {
const empty = value === null || value === undefined || value === "" || (Array.isArray(value) && value.length === 0);
return (
);
}
function Input({
field, value, referenceArm, incidentGroup, onChange,
}: {
field: Field;
value: unknown;
referenceArm: boolean;
incidentGroup: number | null;
onChange?: (path: string, value: unknown) => void;
}) {
const emit = (next: unknown) => onChange?.(field.path, next);
if (field.kind === "list") {
return {formatValue(value)};
}
if (field.kind === "group") {
return {
onChange?.("incident_group", next);
onChange?.("signs", []);
}} />;
}
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