diff --git a/backend/api/v1/schedule/serializers.py b/backend/api/v1/schedule/serializers.py index 6629a045..2dc63615 100644 --- a/backend/api/v1/schedule/serializers.py +++ b/backend/api/v1/schedule/serializers.py @@ -309,6 +309,7 @@ class EventSerializer(serializers.ModelSerializer): calendar_name = serializers.CharField(source='calendar.name', read_only=True) rule_description = serializers.CharField(source='rule.description', read_only=True, allow_null=True) + rule_data = serializers.SerializerMethodField() class Meta: model = Event @@ -322,6 +323,7 @@ class EventSerializer(serializers.ModelSerializer): 'calendar_name', 'rule', 'rule_description', + 'rule_data', 'end_recurring_period', 'color_event', 'creator', @@ -330,6 +332,20 @@ class EventSerializer(serializers.ModelSerializer): ] read_only_fields = ['id', 'created_on', 'updated_on'] + def get_rule_data(self, obj): + """Возвращает детальную информацию о правиле повторения.""" + if not obj.rule: + return None + + rule = obj.rule + params = rule.get_params() + + return { + 'frequency': rule.frequency, + 'params': params, + 'description': rule.description, + } + def validate(self, attrs): """Валидация start/end.""" start = attrs.get('start') diff --git a/frontend/src/components/ViewEventDetailsModal.tsx b/frontend/src/components/ViewEventDetailsModal.tsx index 9055a2be..103c7e04 100644 --- a/frontend/src/components/ViewEventDetailsModal.tsx +++ b/frontend/src/components/ViewEventDetailsModal.tsx @@ -15,6 +15,28 @@ interface ViewEventDetailsModalProps { showParticipants?: boolean; } +// Маппинг частот на русский +const FREQUENCY_LABELS: Record = { + YEARLY: "Каждый год", + MONTHLY: "Каждый месяц", + WEEKLY: "Каждую неделю", + DAILY: "Каждый день", + HOURLY: "Каждый час", + MINUTELY: "Каждую минуту", + SECONDLY: "Каждую секунду", +}; + +// Маппинг дней недели (0 = Monday в dateutil.rrule) +const WEEKDAY_LABELS: Record = { + 0: "ПН", + 1: "ВТ", + 2: "СР", + 3: "ЧТ", + 4: "ПТ", + 5: "СБ", + 6: "ВС", +}; + export function ViewEventDetailsModal({ isOpen, onClose, @@ -111,14 +133,36 @@ export function ViewEventDetailsModal({ {/* Recurring Info */} - {event.rule && event.end_recurring_period && ( -
- -
-

Повторение

-

- До {formatDate(event.end_recurring_period)} -

+ {event.rule && event.rule_data && ( +
+
+ + Повторяющееся событие +
+
+
+ Частота: {FREQUENCY_LABELS[event.rule_data.frequency] || event.rule_data.frequency} +
+ {event.rule_data.params?.byweekday && ( +
+ Дни недели: + {event.rule_data.params.byweekday.map((day: number) => WEEKDAY_LABELS[day]).join(", ")} + +
+ )} + {event.rule_data.params?.count && ( +
+ Повторений: {event.rule_data.params.count} +
+ )} + {event.end_recurring_period && ( +
+ До: {formatDate(event.end_recurring_period)} +
+ )} +
+
+ 💡 Редактирование параметров повторения пока не поддерживается
)}