From c897f403639b01e48d80e1dd83f30ca7e9009ea3 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Sun, 26 Jul 2026 23:35:10 +0300 Subject: [PATCH] =?UTF-8?q?feat(calendar):=20=D0=B8=D0=BD=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE=D0=BD=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D0=BE=D0=BA=D0=BD=D0=BE=20=D0=B2=D1=85=D0=BE=D0=B6=D0=B4=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=E2=80=94=20=D1=81=D1=82=D0=B0=D1=82=D1=83?= =?UTF-8?q?=D1=81,=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0=20=C2=AB=D0=A0?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D1=82=D1=8C=C2=BB=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D1=8C=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ConferenceOccurrenceDialog расширен под общий информационный диалог (клик по чипу — и для чужих, и для своих конференций): статус-бейдж (общая логика occurrenceBadge вынесена в lib/occurrenceStatus.ts, переиспользуется с ConferenceCalendar), кнопка «Редактировать», открывающая модалку формы — только когда передан ownedConference (текущий пользователь — организатор). Плюс Escape и возврат фокуса (useModalDismiss). --- .../calendar/ConferenceOccurrenceDialog.tsx | 47 ++++++++++++++----- frontend/src/lib/occurrenceStatus.ts | 24 ++++++++++ 2 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 frontend/src/lib/occurrenceStatus.ts diff --git a/frontend/src/components/calendar/ConferenceOccurrenceDialog.tsx b/frontend/src/components/calendar/ConferenceOccurrenceDialog.tsx index ff01426..6468c72 100644 --- a/frontend/src/components/calendar/ConferenceOccurrenceDialog.tsx +++ b/frontend/src/components/calendar/ConferenceOccurrenceDialog.tsx @@ -1,10 +1,15 @@ import { Link, useNavigate } from 'react-router-dom' -import { Calendar, Lock, Play, Repeat, X } from 'lucide-react' -import type { OccurrenceOut } from '@/api/conferences' +import { Calendar, Hash, Lock, Pencil, Play, Repeat, X } from 'lucide-react' +import type { ConferenceOut, OccurrenceOut } from '@/api/conferences' +import { occurrenceBadge, OCCURRENCE_BADGE_ICON } from '@/lib/occurrenceStatus' +import { useModalDismiss } from '@/hooks/useModalDismiss' interface ConferenceOccurrenceDialogProps { occurrence: OccurrenceOut + /** Присутствует только когда текущий пользователь — организатор этого вхождения (`is_owner`) — показывает кнопку «Редактировать». */ + ownedConference?: ConferenceOut onClose: () => void + onEdit?: (conference: ConferenceOut) => void } function formatRange(startsAt: string, endsAt: string): string { @@ -18,14 +23,19 @@ function formatRange(startsAt: string, endsAt: string): string { /** * Быстрый просмотр вхождения конференции по клику на чип в календаре — для - * конференций, которые пользователь не организует (не владелец — - * `is_owner`): свои конференции CalendarPage открывает сразу в форме - * редактирования (`ConferenceFormCard`). Здесь — минимум: когда, статус, вход - * и ссылка на управление; подробности состава участников/организатора — в - * ховер-карточке при наведении/фокусе на чип (`ConferenceHoverCard`). + * всех конференций, включая свои: редактирование теперь отдельное действие + * (карандашик на чипе или кнопка «Редактировать» здесь, у владельца), сам + * клик по чипу всегда открывает это окно. Показывает статус, время, номер и, + * для владельца, вход в редактирование; подробности состава + * участников/организатора — в ховер-карточке при наведении/фокусе на чип + * (`ConferenceHoverCard`). */ -export function ConferenceOccurrenceDialog({ occurrence, onClose }: ConferenceOccurrenceDialogProps) { +export function ConferenceOccurrenceDialog({ occurrence, ownedConference, onClose, onEdit }: ConferenceOccurrenceDialogProps) { const navigate = useNavigate() + useModalDismiss(onClose) + + const badge = occurrenceBadge(occurrence, new Date(occurrence.starts_at), new Date(occurrence.ends_at)) + const BadgeIcon = OCCURRENCE_BADGE_ICON[badge.kind] return (
@@ -40,13 +50,18 @@ export function ConferenceOccurrenceDialog({ occurrence, onClose }: ConferenceOc
+ + +
-
@@ -63,10 +78,18 @@ export function ConferenceOccurrenceDialog({ occurrence, onClose }: ConferenceOc