import { OPERATOR_LABELS, REQUEST_UPDATE_EVENT_LABELS, TABLE_SERVER_CONFIG } from "../../shared/constants.js"; import { fmtDate, statusLabel } from "../../shared/utils.js"; import { AddIcon, FilterIcon } from "../../shared/icons.jsx"; function renderRequestUpdatesCell(row, role) { const hasServiceRequestUnread = Boolean(row?.has_service_requests_unread); const serviceRequestCount = Number(row?.service_requests_unread_count || 0); const viewerUnreadTotal = Number(row?.viewer_unread_total || 0); const viewerUnreadByEvent = row?.viewer_unread_by_event && typeof row.viewer_unread_by_event === "object" ? row.viewer_unread_by_event : {}; const viewerUnreadLabel = viewerUnreadTotal > 0 ? Object.entries(viewerUnreadByEvent) .map(([eventType, count]) => { const code = String(eventType || "").toUpperCase(); const label = REQUEST_UPDATE_EVENT_LABELS[code] || code.toLowerCase(); return label + ": " + String(count || 0); }) .join(", ") : ""; if (role === "LAWYER") { const has = Boolean(row.lawyer_has_unread_updates); const eventType = String(row.lawyer_unread_event_type || "").toUpperCase(); if (!has && !hasServiceRequestUnread && !viewerUnreadTotal) return нет; return ( {viewerUnreadTotal > 0 ? ( {"Мне: " + String(viewerUnreadTotal)} ) : null} {has ? ( {REQUEST_UPDATE_EVENT_LABELS[eventType] || "обновление"} ) : null} {hasServiceRequestUnread ? ( {"Запросы: " + String(serviceRequestCount || 1)} ) : null} ); } const clientHas = Boolean(row.client_has_unread_updates); const clientType = String(row.client_unread_event_type || "").toUpperCase(); const lawyerHas = Boolean(row.lawyer_has_unread_updates); const lawyerType = String(row.lawyer_unread_event_type || "").toUpperCase(); if (!clientHas && !lawyerHas && !hasServiceRequestUnread && !viewerUnreadTotal) return нет; return ( {viewerUnreadTotal > 0 ? ( {"Мне: " + String(viewerUnreadTotal)} ) : null} {clientHas ? ( {"Клиент: " + (REQUEST_UPDATE_EVENT_LABELS[clientType] || "обновление")} ) : null} {lawyerHas ? ( {"Юрист: " + (REQUEST_UPDATE_EVENT_LABELS[lawyerType] || "обновление")} ) : null} {hasServiceRequestUnread ? ( {"Запросы: " + String(serviceRequestCount || 1)} ) : null} ); } export function RequestsSection({ role, tables, status, getStatus, getFieldDef, getFilterValuePreview, resolveReferenceLabel, onRefresh, onCreate, onOpenFilter, onRemoveFilter, onEditFilter, onSort, onPrev, onNext, onLoadAll, onClaimRequest, onOpenReassign, onOpenRequest, onEditRecord, onDeleteRecord, FilterToolbarComponent, DataTableComponent, TablePagerComponent, StatusLineComponent, IconButtonComponent, }) { const tableState = tables?.requests || { rows: [], filters: [], sort: [] }; const FilterToolbar = FilterToolbarComponent; const DataTable = DataTableComponent; const TablePager = TablePagerComponent; const StatusLine = StatusLineComponent; const IconButton = IconButtonComponent; return ( <>

Заявки

Серверная фильтрация и просмотр клиентских заявок.

{onCreate ? ( ) : null}
{ const fieldDef = getFieldDef("requests", clause.field); return (fieldDef ? fieldDef.label : clause.field) + " " + OPERATOR_LABELS[clause.op] + " " + getFilterValuePreview("requests", clause); }} /> ( {row.client_name || "-"} {row.client_phone || "-"} {statusLabel(row.status_code)} {row.topic_code || "-"} {resolveReferenceLabel({ table: "admin_users", value_field: "id", label_field: "name" }, row.assigned_lawyer_id)} {row.invoice_amount == null ? "-" : String(row.invoice_amount)} {fmtDate(row.paid_at)} {renderRequestUpdatesCell(row, role)} {fmtDate(row.created_at)}
{role === "LAWYER" ? ( onClaimRequest(row.id)} disabled={Boolean(row.assigned_lawyer_id)} /> ) : null} {role === "ADMIN" && row.assigned_lawyer_id ? ( onOpenReassign(row)} /> ) : null} onEditRecord(row)} /> onDeleteRecord(row.id)} tone="danger" />
)} /> ); } export default RequestsSection;