# обязательно подключение глобальных массивов globalThis.renderFns = require 'pug.json' globalThis.stylFns = require 'styl.json' # подключение мета информации (строго в данном фиде) document.head.insertAdjacentHTML 'beforeend','' document.head.insertAdjacentHTML 'beforeend','' document.head.insertAdjacentHTML('beforeend','Кохи Борбад - Концертный зал Душанбе') # Настройка tailwind tailwind.config = require 'tailwind.config.js' # подключение основных стилей ## tailwind document.head.insertAdjacentHTML('beforeend','') ## базовой стиль приложения document.head.insertAdjacentHTML('beforeend','') # Подключаем ядро системы CouchDBService = require 'app/core/CouchdbClass' # Маршруты routes = [ { path: '/', component: require 'app/pages/Home' } { path: '/events', component: require 'app/pages/Events' } { path: '/events/:id', component: require 'app/pages/EventDetail' } { path: '/about', component: require 'app/pages/About' } { path: '/contacts', component: require 'app/pages/Contacts' } ] # Глобальное определение vuejs приложения app = Vue.createApp name: 'app' data: ()-> return theme: 'light' appState: events: [] featuredEvents: [] sliderEvents: [] loading: true error: null modalState: isVisible: false component: null props: {} couchDBService: new CouchDBService() beforeMount: ()-> debug.log "start beforeMount" # определение контекста vuejs приложения как глобальной переменной _ globalThis._ = @ render: (new Function '_ctx', '_cache', renderFns['app/temp.pug'])() mounted: -> # Предзагрузка темы if localStorage.theme == 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches) @theme = 'dark' document.documentElement.classList.add('dark') else @theme = 'light' document.documentElement.classList.remove('dark') # Загрузка данных из CouchDB @loadEventsData() methods: toggleTheme: -> @theme = if @theme == 'light' then 'dark' else 'light' localStorage.setItem 'theme', @theme document.documentElement.classList.toggle 'dark' openModal: (component, props = {}) -> @modalState.component = component @modalState.props = props @modalState.isVisible = true closeModal: -> @modalState.isVisible = false @modalState.component = null @modalState.props = {} loadEventsData: -> @appState.loading = true @couchDBService.getAllEvents() .then (events) => @appState.events = events @appState.featuredEvents = events.filter((event) -> event.isFeatured).slice(0, 6) @appState.sliderEvents = events.filter((event) -> event.inSlider).map (event) -> id: event._id image: event.image || '/images/default-event.jpg' title: event.title description: event.shortDescription || event.description cta: event.cta || 'Подробнее' category: event.category @appState.error = null .catch (error) => debug.log "Ошибка загрузки данных: "+error @appState.error = 'Не удалось загрузить данные мероприятий' .finally => @appState.loading = false getEvents: -> @appState.events getFeaturedEvents: -> @appState.featuredEvents getSliderEvents: -> @appState.sliderEvents isLoading: -> @appState.loading hasError: -> @appState.error components: 'themetoggle': require 'app/shared/ThemeToggle' 'multilevelmenu': require 'app/shared/MultiLevelMenu' 'imageslider': require 'app/shared/ImageSlider' 'modalwindow': require 'app/shared/ModalWindow' 'formvalidator': require 'app/shared/FormValidator' 'filtersort': require 'app/shared/FilterSort' 'eventdetailmodal': require 'app/shared/EventDetailModal' 'successmodal': require 'app/shared/SuccessModal' 'app-link': require 'app/shared/AppLink' app.use(VueRouter.createRouter({ routes: routes history: VueRouter.createWebHistory() scrollBehavior: (to, from, savedPosition) -> if savedPosition return savedPosition else return { x: 0, y: 0 } })) # подключаем в body ОБЯЗАТЕЛЬНО!!! app.mount('body') debug.log "Vue application initialized successfully"