Gogs il y a 3 semaines
Parent
commit
0d65f80d29

+ 8 - 5
README.md

@@ -1,9 +1,9 @@
 # Текущая ззадача
-данный вызов не открывает модальное окно, исправь с учётом реализации глобальной шины событий
-      @$root.$emit('open-modal', {
-        component: 'EventDetailModal',
-        props: { event }
-      })
+Провести полный рефакторинг кода.
+убрать EventBus так как он не работает,
+для работы с модальными окнати использовать _.modalState
+доработать страницу Events (доработать фильты, изменить дизайн сделать 2-3 колонки в десктопе), Сделать открытие /events/[id мероприятия]
+с главной странице убираем фильтры, и выводим минимум 6 анонсов
 
 # применяй правила:
 
@@ -81,6 +81,9 @@ template(#body)       - не правильно
 template(v-slot:body) - не правильно
 template([body])      - правильно
 
+## async в методах
+async loadData: -> - не правильно
+loadData: ->       - правильно
 
 ## определение глобальной шины событий в  app/temp.coffee
 ```

+ 5 - 6
vue/app/pages/Contacts/index.coffee

@@ -52,15 +52,14 @@ module.exports =
             document.querySelectorAll('.contacts-section .bg-white, .contacts-section .bg-gray-800').forEach (el) ->
                 observer.observe(el)
 
+        # Стало (правильно)
         handleContactSubmit: (formData) ->
             debug.log "Contact form submitted: " + JSON.stringify(formData)
             
-            @$root.$emit('open-modal', 
-                component: 'SuccessModal'
-                props:
-                    title: 'Сообщение отправлено'
-                    content: 'Мы получили ваше сообщение и свяжемся с вами в ближайшее время.'
-            )
+            openModal('SuccessModal', {
+                title: 'Сообщение отправлено'
+                content: 'Мы получили ваше сообщение и свяжемся с вами в ближайшее время.'
+            })
 
         showOnMap: ->
             debug.log "Showing location on map"

+ 10 - 13
vue/app/pages/Events/index.coffee

@@ -189,27 +189,24 @@ module.exports =
       @displayedEvents = filteredItems
       @currentPage = 1
 
+    # Стало (правильно)
     showEventDetails: (event) ->
-      @selectedEvent = event
-      @showEventModal = true
+        openModal('EventDetailModal', { event: event })
+    
+    handleTicketBooking: (event) ->
+        debug.log "Обработка покупки билета на: "+event.title
+        openModal('SuccessModal', {
+            title: 'Билет забронирован!'
+            content: "Вы успешно забронировали билет на \""+event.title+"\". Подробности отправлены на вашу почту."
+        })
 
     bookTicket: (event) ->
       # Открываем модальное окно покупки билетов
       @selectedEvent = event
       @showEventModal = true
       # Можно также сразу перейти к покупке
-      debug.log 'Бронирование билета на:', event.title
+      debug.log 'Бронирование билета на:'+ event.title
 
-    handleTicketBooking: (event) ->
-      # Логика обработки покупки билетов
-      debug.log 'Обработка покупки билета на:', event.title
-      @$root.$emit('open-modal', {
-        component: 'SuccessModal'
-        props: {
-          title: 'Билет забронирован!'
-          content: "Вы успешно забронировали билет на "+event.title+". Подробности отправлены на вашу почту."
-        }
-      })
 
     loadMoreEvents: ->
       @loading = true

+ 50 - 13
vue/app/pages/Home/index.coffee

@@ -32,7 +32,7 @@ module.exports =
       {
         id: 1,
         title: 'ШОМИ ДӮСТӢ»-И ТОҶИКИСТОНУ ҚАЗОҚИСТОН',
-        date: '22 августа 2024',
+        date: '18 апрель 2022',
         description: 'Асосгузори сулҳу ваҳдати миллӣ — Пешвои миллат, Президенти Ҷумҳурии Тоҷикистон муҳтарам Эмомалӣ Раҳмон ва Раиси Маҷлиси миллии Маҷлиси Олии Ҷумҳурии Тоҷикистон, Раиси шаҳри Душанбе муҳтарам Рустам Эмомалӣ Президенти Ҷумҳурии Қазоқистон муҳтарам Қосим-Жомарт Токаев дар барномаи консертии «Шоми дӯстӣ» дар Маҷмааи давлатии «Кохи Борбад», ки дар доираи Рӯзҳои фарҳанги Қазоқистон баргузор мегардад, ҳузур доранд.',
         image: 'https://borbad.s5l.ru/assets/borbad.s5l.ru/001.jpg',
         category: '',
@@ -50,7 +50,7 @@ module.exports =
       {
         id: 3,
         title: 'ШОМИ ДӮСТӢ»-И ТОҶИКИСТОНУ ӮЗБЕКИСТОН',
-        date: '22 августа 2024',
+        date: '08 июля 2025',
         description: '10 июн Президенти Ҷумҳурии Тоҷикистон муҳтарам Эмомалӣ Раҳмон бо Президенти Ҷумҳурии Ӯзбекистон муҳтарам Шавкат Мирзиёев дар консерти тантанавии ходимони фарҳангу санъати Тоҷикистон ва Ӯзбекистон таҳти унвони “Шоми дӯстӣ”, ки дар Кохи Борбад баргузор шуд, иштирок намуданд.',
         image: 'https://borbad.s5l.ru/assets/borbad.s5l.ru/003.jpg',
         category: '', 
@@ -74,18 +74,55 @@ module.exports =
     ]
     filteredEvents: []
   mounted: ->
-    @filteredEvents = [...@events]
+        #await this.loadData()
+        this.filteredEvents = [...this.events]
+
   methods:
-    handleFilterChange: (filteredItems) ->
-      @filteredEvents = filteredItems
-    handleSortChange: (sortedItems) ->
-      @filteredEvents = sortedItems
-    openEventModal: (event) ->
-      debug.log event
-      @$root.$emit('open-modal', {
-        component: 'EventDetailModal',
-        props: { event }
-      })
+        loadData: ->
+            # Получаем данные из глобального состояния
+            this.heroSlides = _.getSliderEvents() || []
+            this.events = _.getFeaturedEvents() || []
+            
+            # Если данных нет, ждем загрузки
+            if this.heroSlides.length == 0 || this.events.length == 0
+                setTimeout =>
+                    this.loadData()
+                , 100
+
+        handleFilterChange: (filteredItems) ->
+            this.filteredEvents = filteredItems
+
+        handleSortChange: (sortedItems) ->
+            this.filteredEvents = sortedItems
+
+        openEventModal: (event) ->
+            debug.log event
+            openModal('EventDetailModal', { event: event })
+
+        handleSlideClick: (slide) ->
+            if slide.category
+                this.filteredEvents = this.events.filter((event) -> event.category == slide.category)
+                this.scrollToEvents()
+            else
+                this.$router.push('/events')
+
+        scrollToEvents: ->
+            document.querySelector('.event-card')?.scrollIntoView({
+                behavior: 'smooth',
+                block: 'start'
+            })
+
+        handleSubscription: (formData) ->
+            debug.log "Подписка оформлена: "+JSON.stringify(formData)
+            openModal('SuccessModal', {
+                title: 'Подписка оформлена!'
+                content: 'Вы успешно подписались на рассылку анонсов мероприятий.'
+            })
+
+        preloadHeroImages: ->
+            this.heroSlides.forEach (slide) ->
+                img = new Image()
+                img.src = slide.image
   components:
       'imageslider': require 'app/shared/ImageSlider'
       'formvalidator': require 'app/shared/FormValidator'

+ 1 - 7
vue/app/pages/Home/index.pug

@@ -10,13 +10,7 @@ section
     section(class="py-16 bg-white dark:bg-gray-800")
         div(class="container mx-auto px-4")
             h2(class="text-3xl font-bold text-center mb-12 text-gray-800 dark:text-white") Ближайшие мероприятия
-            FilterSort(
-                :items="events"
-                :filters="eventFilters"
-                :sortOptions="eventSortOptions"
-                @filter-changed="handleFilterChange"
-                @sort-changed="handleSortChange"
-            )
+            //FilterSort( :items="events" :filters="eventFilters" :sortOptions="eventSortOptions" @filter-changed="handleFilterChange" @sort-changed="handleSortChange")
             div(class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 mt-8")
                 div(
                     v-for="event in filteredEvents"

+ 15 - 17
vue/app/shared/EventDetailModal/index.coffee

@@ -68,24 +68,22 @@ module.exports =
         console.error 'Error formatting date:', error
         "#{dateString}, #{timeString}"
 
+    # Стало (правильно)
     bookTickets: ->
-      if @event?.availableTickets > 0
-        console.log 'Бронирование билетов на:', @event.title
-        @$emit 'ticket-booking', @event
-        
-        # Имитация процесса покупки
-        @$root.$emit('open-modal', {
-          component: 'TicketPurchaseModal'
-          props: { event: @event }
-        })
-      else
-        @$root.$emit('open-modal', {
-          component: 'ErrorModal'
-          props: {
-            title: 'Билеты распроданы'
-            content: 'К сожалению, все билеты на это мероприятие уже распроданы.'
-          }
-        })
+        if @event?.availableTickets > 0
+            debug.log "Бронирование билетов на: "+@event.title
+            @$emit 'ticket-booking', @event
+            
+            # Имитация процесса покупки
+            openModal('SuccessModal', {
+                title: 'Билет забронирован'
+                content: "Вы успешно забронировали билет на \""+@event.title+"\""
+            })
+        else
+            openModal('SuccessModal', {
+                title: 'Билеты распроданы'
+                content: 'К сожалению, все билеты на это мероприятие уже распроданы.'
+            })
 
     addToCalendar: ->
       console.log 'Добавление в календарь:', @event.title

+ 1 - 1
vue/app/shared/ModalWindow/index.pug

@@ -1,6 +1,6 @@
 transition(name='modal-fade')
   .fixed.inset-0.overflow-y-auto.z-50(
-    v-if='isVisible'
+    
     role='dialog'
     :aria-labelledby='titleId'
     aria-modal='true'

+ 9 - 3
vue/app/temp.coffee

@@ -127,8 +127,9 @@ app = Vue.createApp
         # Загрузка данных из CouchDB
         await @loadEventsData()
         
-        # Обработчик открытия модальных окон
+        # Обработчик открытия модальных окон - ДОЛЖЕН БЫТЬ ЗДЕСЬ
         EventBus.on 'open-modal', (config) =>
+            debug.log "Opening modal: "+config.component
             @modalState.currentModal = config.component
             @modalState.modalProps = config.props || {}
     methods:
@@ -136,7 +137,12 @@ app = Vue.createApp
             @theme = if @theme == 'light' then 'dark' else 'light'
             localStorage.setItem 'theme', @theme
             document.documentElement.classList.toggle 'dark'
-        
+        handleTicketBooking: (event) ->
+            debug.log "Обработка покупки билета на: "+event.title
+            openModal('SuccessModal', {
+                title: 'Билет забронирован!'
+                content: "Вы успешно забронировали билет на \""+event.title+"\". Подробности отправлены на вашу почту."
+            })
         loadEventsData: ->
             @appState.loading = true
             try
@@ -164,7 +170,7 @@ app = Vue.createApp
                 {
                     _id: '1'
                     title: 'Концерт симфонического оркестра'
-                    date: '2025-10-15'
+                    date: '2020-04-18'
                     time: '19:00'
                     description: 'Произведения Чайковского и Рахманинова в исполнении Национального симфонического оркестра'
                     image: '/images/event-classical.jpg'

+ 36 - 1
vue/app/temp.pug

@@ -1,6 +1,6 @@
 div(id="app" class="min-h-full bg-gray-50 dark:bg-gray-900 transition-colors duration-300")
 
-            div(class="transition-all duration-300")
+    div(class="transition-all duration-300")
                 header(class="bg-primary text-white shadow-lg")
                     div(class="container mx-auto px-4 py-4")
                         div(class="flex justify-between items-center")
@@ -39,3 +39,38 @@ div(id="app" class="min-h-full bg-gray-50 dark:bg-gray-900 transition-colors dur
                                 h3(class="text-xl font-bold text-accent mb-4") Подписка
                                 p Подпишитесь на новости о мероприятиях
                                 FormValidator(placeholder="Ваш email" buttonText="Подписаться")
+
+
+//- Глобальные модальные окна - ДОЛЖНЫ БЫТЬ ЗДЕСЬ
+div(class="ModalContainer") {{ modalState.currentModal }} - {{ modalState.currentModal == 'EventDetailModal' }}
+    ModalWindow(
+        v-if="modalState.currentModal == 'EventDetailModal'"
+        :isVisible="true"
+        @update:isVisible="closeModal"
+        :title="modalState.modalProps.event?.title || 'Мероприятие'"
+        :contentClass="'max-w-4xl'"
+        :showFooter="false"
+    )
+        template([body])
+            EventDetailModal(
+                :event="modalState.modalProps.event"
+                :isVisible="true"
+                @update:isVisible="closeModal"
+                @ticket-booking="handleTicketBooking"
+            )
+
+    ModalWindow(
+        v-if="modalState.currentModal == 'SuccessModal'"
+        :isVisible="true"
+        @update:isVisible="closeModal"
+        :title="modalState.modalProps.title || 'Успешно!'"
+        :contentClass="'max-w-md'"
+        :showFooter="false"
+    )
+        template([body])
+            SuccessModal(
+                :title="modalState.modalProps.title"
+                :content="modalState.modalProps.content"
+                :isVisible="true"
+                @update:isVisible="closeModal"
+            )