diff --git a/frontend/src/components/requests/RequestListItem.tsx b/frontend/src/components/requests/RequestListItem.tsx
index ffb04638..eaacbbbe 100644
--- a/frontend/src/components/requests/RequestListItem.tsx
+++ b/frontend/src/components/requests/RequestListItem.tsx
@@ -7,7 +7,17 @@ import {
} from "@/hooks/useRequestsPage";
import { displayUserName, formatDate, formatDateTime, userProfileLink } from "@/lib/shared";
import type { Request, RequestComment, User } from "@/types/api";
-import { Ban, ChevronDown, ChevronRight, MessageSquare, Paperclip, Pencil, ThumbsDown, ThumbsUp, Trash2 } from "lucide-react";
+import {
+ Ban,
+ ChevronDown,
+ ChevronRight,
+ MessageSquare,
+ Paperclip,
+ Pencil,
+ ThumbsDown,
+ ThumbsUp,
+ Trash2,
+} from "lucide-react";
import type { ReactNode, Ref } from "react";
import { RequestAvatar } from "./RequestAvatar";
import { RequestUserBadge } from "./RequestUserBadge";
@@ -54,9 +64,9 @@ type RequestAudienceRowProps = {
function RequestMetaField({ label, value }: RequestMetaFieldProps) {
return (
-
+
{label}
-
{value}
+
{value}
);
}
@@ -69,10 +79,10 @@ function RequestAudienceRow({
people,
}: RequestAudienceRowProps) {
return (
-
+
{label}
{people.length > 0 ? (
-
+
{people.slice(0, 2).map((person) => (
) : (
- {count ? count : emptyText}
+ {count ? count : emptyText}
)}
);
@@ -171,9 +181,9 @@ export function RequestListItem({
-
-
-
+
+
+
-
+
-
+
{authorLink ? (
@@ -226,14 +236,20 @@ export function RequestListItem({
{authorName}
)}
-
+
{typeLabel}
-
-
{summary ? (
-
+
{summary}
) : null}
-
-
+
+
{status.label}
+
+ {canProcess ? (
+ <>
+
void onApprove(request.id)}
+ disabled={busyKey === `approve-${request.id}`}
+ className="app-feedback-success inline-flex h-8 w-8 items-center justify-center rounded-lg disabled:opacity-60"
+ >
+
+
+
void onReject(request.id)}
+ disabled={busyKey === `reject-${request.id}`}
+ className="app-action-danger inline-flex h-8 w-8 items-center justify-center rounded-lg disabled:opacity-60"
+ >
+
+
+ >
+ ) : null}
+
{hasSecondaryActions ? (
) : null}
-
- {canProcess ? (
-
- void onApprove(request.id)}
- disabled={busyKey === `approve-${request.id}`}
- className="app-feedback-success inline-flex items-center justify-center rounded-lg p-2 disabled:opacity-60"
- >
-
-
- void onReject(request.id)}
- disabled={busyKey === `reject-${request.id}`}
- className="app-action-danger inline-flex items-center justify-center rounded-lg p-2 disabled:opacity-60"
- >
-
-
-
- ) : null}
{hasExpandedPanels ? (
-
- {rowOpen ? (
-
-
-
Подробности
- {attachmentUrl ? (
-
onPreviewAttachment({ url: attachmentUrl, name: attachmentName })}
- className="app-action-secondary inline-flex min-w-0 items-center gap-2 rounded-lg px-3 py-2 text-xs font-medium"
- >
-
- {attachmentName}
-
- ) : null}
-
+
+
+ {rowOpen ? (
+
+
+
+ Подробности
+
+ {attachmentUrl ? (
+
onPreviewAttachment({ url: attachmentUrl, name: attachmentName })}
+ className="app-action-secondary inline-flex min-w-0 items-center gap-1.5 rounded-lg px-2.5 py-1.5 text-xs font-medium"
+ >
+
+ {attachmentName}
+
+ ) : null}
+
-
-
-
+
-
-
- ) : null}
+
+ ) : null}
- {commentsOpen ? (
-
-
-
Комментарии
-
- {commentCount}
-
-
+ {commentsOpen ? (
+
+
+
+ Комментарии
+
+
+ {commentCount}
+
+
-
- {comments.length === 0 ? (
-
Комментариев пока нет
- ) : comments.map((comment) => (
-
-
-
{displayUserName(comment.author)}
-
-
{formatDateTime(comment.created_at) || "-"}
- {Boolean(comment.author?.id && currentUserId === comment.author.id) ? (
-
void onDeleteComment(request.id, comment.id)}
- disabled={busyKey === `comment-delete-${comment.id}`}
- className="app-action-danger inline-flex rounded-lg px-2 py-1 text-xs font-medium disabled:opacity-60"
- >
- Удалить
-
- ) : null}
+
+ {comments.length === 0 ? (
+
+ Комментариев пока нет
+
+ ) : comments.map((comment) => (
+
+
+
{displayUserName(comment.author)}
+
+
+ {formatDateTime(comment.created_at) || "-"}
+
+ {Boolean(comment.author?.id && currentUserId === comment.author.id) ? (
+ void onDeleteComment(request.id, comment.id)}
+ disabled={busyKey === `comment-delete-${comment.id}`}
+ className="app-action-danger inline-flex rounded-lg px-2 py-1 text-xs font-medium disabled:opacity-60"
+ >
+ Удалить
+
+ ) : null}
+
+
+ {comment.text}
+
-
{comment.text}
-
- ))}
-
+ ))}
+
-
- onSetCommentDraft(request.id, event.target.value)}
- placeholder="Добавить комментарий"
- className="app-input flex-1 rounded-lg px-3 py-2.5 text-sm"
- />
- void onAddComment(request.id)}
- disabled={busyKey === `comment-${request.id}` || !trimmedCommentDraft}
- className="app-action-primary rounded-lg px-4 py-2.5 text-sm font-medium disabled:opacity-60"
- >
- Отправить
-
-
-
- ) : null}
+
+ onSetCommentDraft(request.id, event.target.value)}
+ placeholder="Добавить комментарий"
+ className="app-input flex-1 rounded-lg px-3 py-2.5 text-sm"
+ />
+ void onAddComment(request.id)}
+ disabled={busyKey === `comment-${request.id}` || !trimmedCommentDraft}
+ className="app-action-primary rounded-lg px-4 py-2.5 text-sm font-medium disabled:opacity-60"
+ >
+ Отправить
+
+
+
+ ) : null}
+
) : null}
diff --git a/frontend/src/components/requests/RequestListSection.tsx b/frontend/src/components/requests/RequestListSection.tsx
index dc7d946c..2cc1500d 100644
--- a/frontend/src/components/requests/RequestListSection.tsx
+++ b/frontend/src/components/requests/RequestListSection.tsx
@@ -65,7 +65,7 @@ export function RequestListSection({
}: RequestListSectionProps) {
return (
<>
-
+
{requests.length === 0 ? (