# Компонент EventDetailModal - Полная документация ## Назначение компонента `EventDetailModal` - модальное окно для детального просмотра информации о мероприятиях. Компонент предоставляет полную информацию о событии, включая описание, даты, место проведения, цены, доступные билеты и галерею изображений. Поддерживает мультиязычность и адаптивный дизайн. ## git репозитарий https://gogs.osvoj.ru/s5l.ru/borbad.s5l.ru/src/master/vue/app/shared/EventDetailModal/ ## Импорт и регистрация ```coffee # В основном файле приложения (app/temp.coffee) components: 'event-detail-modal': require 'app/shared/EventDetailModal' ``` ## Базовое использование ### Открытие модального окна ```coffee # Через глобальную шину событий EventBus.emit('open_event_modal', eventData) # Через метод родительского компонента _.openModal(require('app/shared/EventDetailModal'), { event: eventData }) ``` ## Props ### `event` (обязательный) - **Тип:** `Object` - **Описание:** Объект события с полной информацией - **Структура:** ```coffee { _id: String type: "event" title: Array[String] # мультиязычный массив content: Array[String] excerpt: Array[String] image: Array[String] gallery: Array[Array[String]] event_data: { event_date: ISOString end_date: ISOString location: Array[String] price: Array[Number] currency: String available_tickets: Number total_tickets: Number status: String registration_required: Boolean age_restriction: Array[String] organizer: Array[String] performers: Array[Array[String]] duration: Number } # ... другие поля } ``` ### `show` (опциональный) - **Тип:** `Boolean` - **По умолчанию:** `false` - **Описание:** Управление видимостью модального окна ## События (Events) ### `@close` - **Описание:** Событие закрытия модального окна - **Payload:** `null` - **Использование:** ```pug event-detail-modal(:event="eventData" @close="handleModalClose") ``` ### `@register` - **Описание:** Событие регистрации на мероприятие - **Payload:** `{ event: Object, tickets: Number }` - **Использование:** ```pug event-detail-modal(:event="eventData" @register="handleEventRegistration") ``` ## Слоты (Slots) ### `[header]` (опциональный) - **Описание:** Кастомный заголовок модального окна - **Пример:** ```pug event-detail-modal(:event="eventData") template([header]) div(class="custom-header") h2 Специальное мероприятие badge(type="premium") ``` ### `[footer]` (опциональный) - **Описание:** Кастомный футер модального окна - **Пример:** ```pug event-detail-modal(:event="eventData") template([footer]) div(class="flex justify-between items-center") span Дополнительная информация button(@click="showExtraInfo") Подробнее ``` ## Методы компонента ### `open()` - **Описание:** Программное открытие модального окна - **Использование:** ```coffee modalRef = _.$refs.eventModal modalRef.open() ``` ### `close()` - **Описание:** Программное закрытие модального окна - **Использование:** ```coffee modalRef = _.$refs.eventModal modalRef.close() ``` ### `registerForEvent(tickets)` - **Описание:** Программная регистрация на мероприятие - **Параметры:** `tickets` - количество билетов - **Использование:** ```coffee modalRef = _.$refs.eventModal modalRef.registerForEvent(2) ``` ## Полные примеры использования ### 1. Базовое использование в компоненте ```pug //- Родительский компонент div button( @click="openEventModal(event)" class="btn btn-primary" ) Подробнее о мероприятии event-detail-modal( v-if="selectedEvent" :event="selectedEvent" :show="showModal" @close="closeEventModal" @register="handleRegistration" ) ``` ```coffee # Логика родительского компонента methods: openEventModal: (event) -> @selectedEvent = event @showModal = true closeEventModal: -> @showModal = false @selectedEvent = null handleRegistration: (data) -> debug.log "Регистрация на мероприятие: "+data.event.title debug.log "Билетов: "+data.tickets # Логика регистрации... ``` ### 2. Использование с глобальной шиной событий ```coffee # В любом месте приложения EventBus.emit('open_event_modal', { _id: "event_123" title: ["Концерт симфонической музыки", "Symphonic Concert"] content: ["Описание мероприятия...", "Event description..."] event_data: { event_date: "2024-03-20T19:00:00.000Z" location: ["Большой зал", "Main Hall"] price: [500, 500] currency: "TJS" available_tickets: 45 status: "upcoming" } # ... другие поля }) ``` ### 3. Программное управление ```pug div event-detail-modal( ref="eventModal" :event="currentEvent" @close="onModalClose" @register="onEventRegister" ) button(@click="openModalProgrammatically") Открыть программно ``` ```coffee methods: openModalProgrammatically: -> @currentEvent = this.getEventData() this.$nextTick(() => @$refs.eventModal.open() ) onModalClose: -> debug.log "Модальное окно закрыто" onEventRegister: (data) -> # Обработка регистрации this.registerUserForEvent(data.event, data.tickets) ``` ### 4. Использование с кастомными слотами ```pug event-detail-modal(:event="eventData" :show="isModalOpen") template([header]) div(class="bg-gradient-to-r from-blue-600 to-purple-600 text-white p-6") h1(class="text-2xl font-bold") {{ eventData.title }} div(class="flex items-center space-x-2 mt-2") icon(name="star" class="w-5 h-5") span Премиум мероприятие template([footer]) div(class="bg-gray-50 p-4 border-t") div(class="flex justify-between items-center") span(class="text-sm text-gray-600") Нужна помощь? app-link( to="/contacts" class="text-blue-600 hover:text-blue-800 text-sm" ) Связаться с нами ``` ### 5. Интеграция с системой бронирования ```pug event-detail-modal( :event="event" @register="handleBooking" ref="bookingModal" ) ``` ```coffee methods: handleBooking: (bookingData) -> # Интеграция с системой бронирования try result = await this.$api.events.register( eventId: bookingData.event._id tickets: bookingData.tickets userInfo: this.userData ) if result.success this.showSuccessMessage("Регистрация успешна!") this.$refs.bookingModal.close() else this.showErrorMessage(result.message) catch error debug.log "Ошибка бронирования: "+error this.showErrorMessage("Ошибка при регистрации") ``` ## Особенности работы ### Мультиязычность Компонент автоматически обрабатывает мультиязычные массивы: - `title`, `content`, `excerpt` - текстовые поля - `location`, `organizer`, `performers` - информация о месте и участниках - `age_restriction` - возрастные ограничения ### Адаптивный дизайн - Mobile-first подход - Оптимизация для различных размеров экранов - Горизонтальная прокрутка галереи на мобильных устройствах ### Галерея изображений - Поддержка multiple изображений - Lightbox-просмотр при клике - Оптимизированная загрузка изображений ### Система бронирования - Валидация количества билетов - Проверка доступности - Визуальная обратная связь ## Стили и кастомизация ### CSS-переменные для кастомизации ```styl .event-modal --modal-bg: theme('colors.white') --modal-border: theme('colors.gray.200') --primary-color: theme('colors.blue.600') --success-color: theme('colors.green.600') --error-color: theme('colors.red.600') ``` ### Кастомные темы ```pug event-detail-modal.event-modal--custom-theme(:event="eventData") ``` ```styl .event-modal--custom-theme --modal-bg: #1a202c --modal-border: #2d3748 --primary-color: #9f7aea ``` ## Интеграция с аналитикой ### Отслеживание событий ```coffee # В родительском компоненте methods: handleModalOpen: (event) -> analytics.track('event_modal_opened', { event_id: event._id event_title: event.title category: event.category }) handleRegistration: (data) -> analytics.track('event_registration_started', { event_id: data.event._id ticket_count: data.tickets }) ``` ## Best Practices ### 1. Загрузка данных ```coffee # Правильно - предзагрузка данных openEventModal: (eventId) -> try eventData = await AppDB.getDocumentById(eventId) @selectedEvent = eventData @showModal = true catch error debug.log "Ошибка загрузки мероприятия: "+error # Неправильно - открытие до загрузки данных openEventModal: (eventId) -> @showModal = true # Модальное окно откроется пустым # затем загрузка данных... ``` ### 2. Обработка ошибок ```coffee methods: handleRegistration: (data) -> try await this.processRegistration(data) this.showSuccessMessage("Успешная регистрация!") catch error debug.log "Ошибка регистрации: "+error this.showErrorMessage("Ошибка при регистрации") ``` ### 3. Доступность ```pug //- Правильно - с семантической разметкой event-detail-modal( :event="eventData" aria-labelledby="event-modal-title" aria-describedby="event-modal-description" ) ``` ### 4. Производительность ```pug //- Lazy loading модального окна event-detail-modal( v-if="showModal" :event="eventData" @close="showModal = false" ) ``` ## Отладка и разработка ### Логирование событий ```coffee # В родительском компоненте mounted: -> EventBus.on 'open_event_modal', (eventData) -> debug.log "Открытие модального окна мероприятия: "+eventData._id ``` ### Валидация props ```coffee # В дочерних компонентах при использовании props: eventData: type: Object required: true validator: (value) -> return value && value._id && value.event_data ``` Компонент EventDetailModal предоставляет полнофункциональное решение для отображения детальной информации о мероприятиях с поддержкой мультиязычности, адаптивным дизайном и интеграцией с системой бронирования.