Gogs 3 tuần trước cách đây
mục cha
commit
5013253b12

+ 10 - 2
README.md

@@ -5,6 +5,12 @@
 
 
 # применяй правила:
 # применяй правила:
 
 
+## оформление ссылок
+a(href="[ссылка]") - не правильно
+router-link(to="[ссылка]") - не правильно
+app-link(to="[ссылка]") - правильно (должен быть подключен компанент: 'app-link':   require 'app/shared/AppLink')
+
+
 ## Корневой каталог и мета данные
 ## Корневой каталог и мета данные
 Важно: мета данные добавляются через app/temp.coffe
 Важно: мета данные добавляются через app/temp.coffe
 базовым тегоьм для vuejs является body, app/index.pug начинается с div,
 базовым тегоьм для vuejs является body, app/index.pug начинается с div,
@@ -108,12 +114,14 @@ globalThis.EventBus = new AppEventBus()
 следи за строгим соблюдением синтаксиса используемых языков (coffeescript, pug, stylus)
 следи за строгим соблюдением синтаксиса используемых языков (coffeescript, pug, stylus)
 в pug не используй многострочные вычисляемые атрибуты
 в pug не используй многострочные вычисляемые атрибуты
 
 
-## работа с консолью
+## работа с консолью и текстовыми константами/переменными
 используй для вывода в консоль debug.log
 используй для вывода в консоль debug.log
-
 console.log "переменная temp = #{temp}" - не правильно
 console.log "переменная temp = #{temp}" - не правильно
 debug.log "переменная temp = "+temp     - правильно
 debug.log "переменная temp = "+temp     - правильно
 
 
+shareUrl = "https://twitter.com/intent/tweet?text=#{text}" - не правильно
+shareUrl = "https://twitter.com/intent/tweet?text="+text   - правильно
+
 ## Цвета и управление темами
 ## Цвета и управление темами
 во всех *.styl файлах используй цвета в виде переменных, определённых в файле tailwind.config.js
 во всех *.styl файлах используй цвета в виде переменных, определённых в файле tailwind.config.js
 
 

+ 2 - 2
vue/app/pages/Events/index.coffee

@@ -198,11 +198,11 @@ module.exports =
       @selectedEvent = event
       @selectedEvent = event
       @showEventModal = true
       @showEventModal = true
       # Можно также сразу перейти к покупке
       # Можно также сразу перейти к покупке
-      console.log 'Бронирование билета на:', event.title
+      debug.log 'Бронирование билета на:', event.title
 
 
     handleTicketBooking: (event) ->
     handleTicketBooking: (event) ->
       # Логика обработки покупки билетов
       # Логика обработки покупки билетов
-      console.log 'Обработка покупки билета на:', event.title
+      debug.log 'Обработка покупки билета на:', event.title
       @$root.$emit('open-modal', {
       @$root.$emit('open-modal', {
         component: 'SuccessModal'
         component: 'SuccessModal'
         props: {
         props: {

+ 19 - 18
vue/app/pages/Home/index.coffee

@@ -31,30 +31,30 @@ module.exports =
     events: [
     events: [
       {
       {
         id: 1,
         id: 1,
-        title: 'Концерт симфонического оркестра',
-        date: '15 октября 2025',
-        description: 'Произведения Чайковского и Рахманинова в исполнении Национального симфонического оркестра',
-        image: 'https://avesta.tj/wp-content/uploads/2023/10/photo_2023-10-09_13-20-44.jpg',
-        category: 'classical',
-        price: 'от 50 сомони'
+        title: 'ШОМИ ДӮСТӢ»-И ТОҶИКИСТОНУ ҚАЗОҚИСТОН',
+        date: '22 августа 2024',
+        description: 'Асосгузори сулҳу ваҳдати миллӣ — Пешвои миллат, Президенти Ҷумҳурии Тоҷикистон муҳтарам Эмомалӣ Раҳмон ва Раиси Маҷлиси миллии Маҷлиси Олии Ҷумҳурии Тоҷикистон, Раиси шаҳри Душанбе муҳтарам Рустам Эмомалӣ Президенти Ҷумҳурии Қазоқистон муҳтарам Қосим-Жомарт Токаев дар барномаи консертии «Шоми дӯстӣ» дар Маҷмааи давлатии «Кохи Борбад», ки дар доираи Рӯзҳои фарҳанги Қазоқистон баргузор мегардад, ҳузур доранд.',
+        image: 'https://borbad.s5l.ru/assets/borbad.s5l.ru/001.jpg',
+        category: '',
+        price: ''
       },
       },
       {
       {
         id: 2,
         id: 2,
-        title: 'Вечер таджикской народной музыки',
-        date: '20 октября 2025', 
-        description: 'Выступление фольклорного ансамбля "Шашмаком"',
-        image: 'https://avatars.mds.yandex.net/get-altay/892711/2a0000018d08049ba81df206f02ee2ec7e1d/XXL_height',
-        category: 'folk',
-        price: 'от 30 сомони'
+        title: 'ШОМИ ДӮСТӢ»-И ТОҶИКИСТОНУ ҚИРҒИЗИСТОН',
+        date: '22 августа 2024', 
+        description: "Шоми 8 июл дар доираи сафари давлатии Президенти Қирғизистон ба Тоҷикистон дар толори бошукуҳи “Кохи Борбад” барномаи фарҳангии арбобони санъати Тоҷикистону Қирғизистон бо номи “Дӯстии абадӣ” баргузор гардид. Дар чорабинии фарҳангӣ Президенти мамлакат Эмомалӣ Раҳмон ва Президенти Қирғизистон Садир Жапаров иштирок намуданд.",
+        image: 'https://borbad.s5l.ru/assets/borbad.s5l.ru/002.jpg',
+        category: '',
+        price: ''
       },
       },
       {
       {
         id: 3,
         id: 3,
-        title: 'Джазовый фестиваль',
-        date: '25 октября 2025',
-        description: 'Международные джазовые коллективы в уникальной акустике зала',
-        image: 'https://avatars.mds.yandex.net/get-altay/9822373/2a0000019377c5d52c95d3175340aab4a35a/XXL_height',
-        category: 'jazz', 
-        price: 'от 70 сомони'
+        title: 'ШОМИ ДӮСТӢ»-И ТОҶИКИСТОНУ ӮЗБЕКИСТОН',
+        date: '22 августа 2024',
+        description: '10 июн Президенти Ҷумҳурии Тоҷикистон муҳтарам Эмомалӣ Раҳмон бо Президенти Ҷумҳурии Ӯзбекистон муҳтарам Шавкат Мирзиёев дар консерти тантанавии ходимони фарҳангу санъати Тоҷикистон ва Ӯзбекистон таҳти унвони “Шоми дӯстӣ”, ки дар Кохи Борбад баргузор шуд, иштирок намуданд.',
+        image: 'https://borbad.s5l.ru/assets/borbad.s5l.ru/003.jpg',
+        category: '', 
+        price: ''
       }
       }
     ]
     ]
     eventFilters: [
     eventFilters: [
@@ -81,6 +81,7 @@ module.exports =
     handleSortChange: (sortedItems) ->
     handleSortChange: (sortedItems) ->
       @filteredEvents = sortedItems
       @filteredEvents = sortedItems
     openEventModal: (event) ->
     openEventModal: (event) ->
+      debug.log event
       @$root.$emit('open-modal', {
       @$root.$emit('open-modal', {
         component: 'EventDetailModal',
         component: 'EventDetailModal',
         props: { event }
         props: { event }

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

@@ -25,7 +25,7 @@ section
                     :class="'animation-delay-' + (($index % 6) * 100)"
                     :class="'animation-delay-' + (($index % 6) * 100)"
                     @click="openEventModal(event)"
                     @click="openEventModal(event)"
                 )
                 )
-                    img(:src="event.image" :alt="event.title" class="w-full h-48 object-cover")
+                    img(:src="event.image" :alt="event.title" class="w-full h-96 object-cover")
                     div(class="p-6")
                     div(class="p-6")
                         h3(class="text-xl font-bold text-gray-800 dark:text-white mb-2") {{ event.title }}
                         h3(class="text-xl font-bold text-gray-800 dark:text-white mb-2") {{ event.title }}
                         p(class="text-gray-600 dark:text-gray-300 mb-4") {{ event.date }}
                         p(class="text-gray-600 dark:text-gray-300 mb-4") {{ event.date }}

+ 5 - 0
vue/app/shared/MultiLevelMenu/index.coffee

@@ -14,10 +14,12 @@ module.exports =
             {
             {
                 id: 1
                 id: 1
                 title: 'Мероприятия'
                 title: 'Мероприятия'
+                path: '/events'
                 children: [
                 children: [
                     {
                     {
                         id: 11
                         id: 11
                         title: 'Концерты'
                         title: 'Концерты'
+                        path: '/events?category=pop'
                         children: [
                         children: [
                             { id: 111, title: 'Классическая музыка', path: '/events?category=classical' }
                             { id: 111, title: 'Классическая музыка', path: '/events?category=classical' }
                             { id: 112, title: 'Фольклорные концерты', path: '/events?category=folk' }
                             { id: 112, title: 'Фольклорные концерты', path: '/events?category=folk' }
@@ -28,6 +30,7 @@ module.exports =
                     {
                     {
                         id: 12
                         id: 12
                         title: 'Фестивали'
                         title: 'Фестивали'
+                        path: '/events?category=pop'
                         children: [
                         children: [
                             { id: 121, title: 'Музыкальные фестивали', path: '/events?type=festival' }
                             { id: 121, title: 'Музыкальные фестивали', path: '/events?type=festival' }
                             { id: 122, title: 'Международные события', path: '/events?type=international' }
                             { id: 122, title: 'Международные события', path: '/events?type=international' }
@@ -39,6 +42,7 @@ module.exports =
             {
             {
                 id: 2
                 id: 2
                 title: 'О зале'
                 title: 'О зале'
+                path: '/about'
                 children: [
                 children: [
                     { id: 21, title: 'История', path: '/about#history' }
                     { id: 21, title: 'История', path: '/about#history' }
                     { id: 22, title: 'Архитектура', path: '/about#architecture' }
                     { id: 22, title: 'Архитектура', path: '/about#architecture' }
@@ -49,6 +53,7 @@ module.exports =
             {
             {
                 id: 3
                 id: 3
                 title: 'Посетителям'
                 title: 'Посетителям'
+                path: '/contacts'
                 children: [
                 children: [
                     { id: 31, title: 'Как добраться', path: '/contacts#location' }
                     { id: 31, title: 'Как добраться', path: '/contacts#location' }
                     { id: 32, title: 'Правила посещения', path: '/contacts#rules' }
                     { id: 32, title: 'Правила посещения', path: '/contacts#rules' }

+ 16 - 10
vue/app/shared/MultiLevelMenu/index.pug

@@ -12,7 +12,8 @@ nav(class="relative")
                 :class="getMenuItemClasses(item)"
                 :class="getMenuItemClasses(item)"
                 :aria-expanded="openSubmenu === item.id"
                 :aria-expanded="openSubmenu === item.id"
             )
             )
-                span {{ item.title }}
+                router-link(:to="item.path")
+                   span {{ item.title }}
                 svg(
                 svg(
                     v-if="item.children"
                     v-if="item.children"
                     class="w-4 h-4 ml-1 transition-transform duration-200"
                     class="w-4 h-4 ml-1 transition-transform duration-200"
@@ -41,7 +42,8 @@ nav(class="relative")
                             :class="{'rounded-lg': !child.children}"
                             :class="{'rounded-lg': !child.children}"
                             @click="handleMenuClick(child)"
                             @click="handleMenuClick(child)"
                         )
                         )
-                            span {{ child.title }}
+                            router-link(:to="child.path")
+                                span {{ child.title }}
                             svg(
                             svg(
                                 v-if="child.children"
                                 v-if="child.children"
                                 class="w-4 h-4 transition-transform duration-200"
                                 class="w-4 h-4 transition-transform duration-200"
@@ -62,7 +64,8 @@ nav(class="relative")
                                     :key="subchild.id"
                                     :key="subchild.id"
                                     class="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors duration-200"
                                     class="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors duration-200"
                                     @click="handleMenuClick(subchild)"
                                     @click="handleMenuClick(subchild)"
-                                ) {{ subchild.title }}
+                                ) 
+                                    router-link(:to="subchild.path") {{ subchild.title }}
 
 
     button(
     button(
         class="md:hidden p-2 rounded-md text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"
         class="md:hidden p-2 rounded-md text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"
@@ -74,14 +77,14 @@ nav(class="relative")
 
 
     div(
     div(
         v-if="isMobileMenuOpen"
         v-if="isMobileMenuOpen"
-        class="fixed inset-0 z-50 md:hidden"
+        class="fixed inset-0 z-50 md:hidden min-h-max"
     )
     )
         div(
         div(
             class="fixed inset-0 bg-black bg-opacity-50"
             class="fixed inset-0 bg-black bg-opacity-50"
             @click="closeMobileMenu"
             @click="closeMobileMenu"
         )
         )
         div(
         div(
-            class="fixed inset-y-0 left-0 w-64 bg-white dark:bg-gray-800 shadow-xl transform transition-transform duration-300 ease-in-out"
+            class="fixed inset-y-0 left-0 w-64 bg-white dark:bg-gray-800 shadow-xl transform transition-transform duration-300 ease-in-out" min-h-max
             :class="{'translate-x-0': isMobileMenuOpen, '-translate-x-full': !isMobileMenuOpen}"
             :class="{'translate-x-0': isMobileMenuOpen, '-translate-x-full': !isMobileMenuOpen}"
         )
         )
             div(class="flex flex-col h-full")
             div(class="flex flex-col h-full")
@@ -95,8 +98,8 @@ nav(class="relative")
                         svg(class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24")
                         svg(class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24")
                             path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12")
                             path(stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12")
                 
                 
-                div(class="flex-1 overflow-y-auto")
-                    div(class="py-2")
+                div(class="flex-1 overflow-y-auto min-h-max")
+                    div(class="py-2 min-h-max")
                         div(
                         div(
                             v-for="item in menuItems"
                             v-for="item in menuItems"
                             :key="item.id"
                             :key="item.id"
@@ -106,7 +109,8 @@ nav(class="relative")
                                 class="flex items-center justify-between px-4 py-3 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors"
                                 class="flex items-center justify-between px-4 py-3 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors"
                                 @click="toggleMobileSubmenu(item)"
                                 @click="toggleMobileSubmenu(item)"
                             )
                             )
-                                span(class="font-medium") {{ item.title }}
+                                router-link(:to="item.path")
+                                     span(class="font-medium") {{ item.title }}
                                 svg(
                                 svg(
                                     v-if="item.children"
                                     v-if="item.children"
                                     class="w-4 h-4 transition-transform duration-200"
                                     class="w-4 h-4 transition-transform duration-200"
@@ -130,7 +134,8 @@ nav(class="relative")
                                         class="flex items-center justify-between px-6 py-3 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors"
                                         class="flex items-center justify-between px-6 py-3 text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer transition-colors"
                                         @click="toggleMobileSubsubmenu(child)"
                                         @click="toggleMobileSubsubmenu(child)"
                                     )
                                     )
-                                        span {{ child.title }}
+                                        router-link(:to="child.path")
+                                            span {{ child.title }}
                                         svg(
                                         svg(
                                             v-if="child.children"
                                             v-if="child.children"
                                             class="w-4 h-4 transition-transform duration-200"
                                             class="w-4 h-4 transition-transform duration-200"
@@ -150,4 +155,5 @@ nav(class="relative")
                                             :key="subchild.id"
                                             :key="subchild.id"
                                             class="px-8 py-2 text-gray-500 dark:text-gray-500 hover:bg-gray-200 dark:hover:bg-gray-600 cursor-pointer transition-colors"
                                             class="px-8 py-2 text-gray-500 dark:text-gray-500 hover:bg-gray-200 dark:hover:bg-gray-600 cursor-pointer transition-colors"
                                             @click="handleMobileMenuClick(subchild)"
                                             @click="handleMobileMenuClick(subchild)"
-                                        ) {{ subchild.title }}
+                                        ) 
+                                            router-link(:to="subchild.path") {{ subchild.title }}

+ 1 - 0
vue/app/temp.coffee

@@ -243,6 +243,7 @@ app = Vue.createApp
         'filtersort':     require 'app/shared/FilterSort'
         'filtersort':     require 'app/shared/FilterSort'
         'eventdetailmodal': require 'app/shared/EventDetailModal'
         'eventdetailmodal': require 'app/shared/EventDetailModal'
         'successmodal':   require 'app/shared/SuccessModal'
         'successmodal':   require 'app/shared/SuccessModal'
+        'applink':   require 'app/shared/AppLink'
 
 
 app.use(VueRouter.createRouter({
 app.use(VueRouter.createRouter({
     routes: routes
     routes: routes

+ 10 - 5
vue/app/temp.pug

@@ -4,7 +4,8 @@ div(id="app" class="min-h-full bg-gray-50 dark:bg-gray-900 transition-colors dur
                 header(class="bg-primary text-white shadow-lg")
                 header(class="bg-primary text-white shadow-lg")
                     div(class="container mx-auto px-4 py-4")
                     div(class="container mx-auto px-4 py-4")
                         div(class="flex justify-between items-center")
                         div(class="flex justify-between items-center")
-                            a(href="/" class="text-2xl font-bold text-accent") Кохи Борбад
+                            div
+                                router-link(to="/" class="text-2xl font-bold text-accent") Кохи Борбад
                             div(class="flex items-center space-x-4")
                             div(class="flex items-center space-x-4")
                                 MultiLevelMenu
                                 MultiLevelMenu
                                 ThemeToggle
                                 ThemeToggle
@@ -21,14 +22,18 @@ 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") Контакты
                                 h3(class="text-xl font-bold text-accent mb-4") Контакты
                                 p пр. И. Сомони, 26, Душанбе
                                 p пр. И. Сомони, 26, Душанбе
                                 p Телефон: +992 372 27 09 46
                                 p Телефон: +992 372 27 09 46
-                                p Email: info@kohi-borbad.tj
+                                p Email: info@borbad.tj
+                                br
+                                p
+                                    img(src="https://borbad.s5l.ru/assets/borbad.s5l.ru/000.png")
                             
                             
                             div(class="footer-section")
                             div(class="footer-section")
                                 h3(class="text-xl font-bold text-accent mb-4") Быстрые ссылки
                                 h3(class="text-xl font-bold text-accent mb-4") Быстрые ссылки
                                 div(class="flex flex-col space-y-2")
                                 div(class="flex flex-col space-y-2")
-                                    a(href="/events" class="hover:text-accent transition-colors") Мероприятия
-                                    a(href="/about" class="hover:text-accent transition-colors") О зале
-                                    a(href="/contacts" class="hover:text-accent transition-colors") Контакты
+                                    router-link(to="/events" class="hover:text-accent transition-colors") Мероприятия
+                                    router-link(to="/about" class="hover:text-accent transition-colors") О зале
+                                    router-link(to="/contacts" class="hover:text-accent transition-colors") Контакты
+                                    
                             
                             
                             div(class="footer-section")
                             div(class="footer-section")
                                 h3(class="text-xl font-bold text-accent mb-4") Подписка
                                 h3(class="text-xl font-bold text-accent mb-4") Подписка