temp.coffee 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # обязательно подключение глобальных массивов
  2. globalThis.renderFns = require 'pug.json'
  3. globalThis.stylFns = require 'styl.json'
  4. # подключение мета информации (строго в данном фиде)
  5. document.head.insertAdjacentHTML 'beforeend','<meta charset="UTF-8">'
  6. document.head.insertAdjacentHTML 'beforeend','<meta name="viewport" content="width=device-width, initial-scale=1.0">'
  7. document.head.insertAdjacentHTML('beforeend','<title>Кохи Борбад - Концертный зал Душанбе</title>')
  8. # Настройка tailwind
  9. tailwind.config = require 'tailwind.config.js'
  10. # подключение основных стилей
  11. ## tailwind
  12. document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss" page="main">'+stylFns['main.css']+'</style>')
  13. ## базовой стиль приложения
  14. document.head.insertAdjacentHTML('beforeend','<style type="text/tailwindcss" page="root">'+stylFns['app/temp.styl']+'</style>')
  15. # Подключаем ядро системы
  16. CouchDBService = require 'app/core/CouchdbClass'
  17. # Маршруты
  18. routes = [
  19. { path: '/', component: require 'app/pages/Home' }
  20. { path: '/events', component: require 'app/pages/Events' }
  21. { path: '/events/:id', component: require 'app/pages/EventDetail' }
  22. { path: '/about', component: require 'app/pages/About' }
  23. { path: '/contacts', component: require 'app/pages/Contacts' }
  24. ]
  25. # Глобальное определение vuejs приложения
  26. app = Vue.createApp
  27. name: 'app'
  28. data: ()->
  29. return
  30. theme: 'light'
  31. appState:
  32. events: []
  33. featuredEvents: []
  34. sliderEvents: []
  35. loading: true
  36. error: null
  37. modalState:
  38. isVisible: false
  39. component: null
  40. props: {}
  41. couchDBService: new CouchDBService()
  42. beforeMount: ()->
  43. debug.log "start beforeMount"
  44. # определение контекста vuejs приложения как глобальной переменной _
  45. globalThis._ = @
  46. render: (new Function '_ctx', '_cache', renderFns['app/temp.pug'])()
  47. mounted: ->
  48. # Предзагрузка темы
  49. if localStorage.theme == 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)
  50. @theme = 'dark'
  51. document.documentElement.classList.add('dark')
  52. else
  53. @theme = 'light'
  54. document.documentElement.classList.remove('dark')
  55. # Загрузка данных из CouchDB
  56. @loadEventsData()
  57. methods:
  58. toggleTheme: ->
  59. @theme = if @theme == 'light' then 'dark' else 'light'
  60. localStorage.setItem 'theme', @theme
  61. document.documentElement.classList.toggle 'dark'
  62. openModal: (component, props = {}) ->
  63. @modalState.component = component
  64. @modalState.props = props
  65. @modalState.isVisible = true
  66. closeModal: ->
  67. @modalState.isVisible = false
  68. @modalState.component = null
  69. @modalState.props = {}
  70. loadEventsData: ->
  71. @appState.loading = true
  72. @couchDBService.getAllEvents()
  73. .then (events) =>
  74. @appState.events = events
  75. @appState.featuredEvents = events.filter((event) -> event.isFeatured).slice(0, 6)
  76. @appState.sliderEvents = events.filter((event) -> event.inSlider).map (event) ->
  77. id: event._id
  78. image: event.image || '/images/default-event.jpg'
  79. title: event.title
  80. description: event.shortDescription || event.description
  81. cta: event.cta || 'Подробнее'
  82. category: event.category
  83. @appState.error = null
  84. .catch (error) =>
  85. debug.log "Ошибка загрузки данных: "+error
  86. @appState.error = 'Не удалось загрузить данные мероприятий'
  87. .finally =>
  88. @appState.loading = false
  89. getEvents: -> @appState.events
  90. getFeaturedEvents: -> @appState.featuredEvents
  91. getSliderEvents: -> @appState.sliderEvents
  92. isLoading: -> @appState.loading
  93. hasError: -> @appState.error
  94. components:
  95. 'themetoggle': require 'app/shared/ThemeToggle'
  96. 'multilevelmenu': require 'app/shared/MultiLevelMenu'
  97. 'imageslider': require 'app/shared/ImageSlider'
  98. 'modalwindow': require 'app/shared/ModalWindow'
  99. 'formvalidator': require 'app/shared/FormValidator'
  100. 'filtersort': require 'app/shared/FilterSort'
  101. 'eventdetailmodal': require 'app/shared/EventDetailModal'
  102. 'successmodal': require 'app/shared/SuccessModal'
  103. 'app-link': require 'app/shared/AppLink'
  104. app.use(VueRouter.createRouter({
  105. routes: routes
  106. history: VueRouter.createWebHistory()
  107. scrollBehavior: (to, from, savedPosition) ->
  108. if savedPosition
  109. return savedPosition
  110. else
  111. return { x: 0, y: 0 }
  112. }))
  113. # подключаем в body ОБЯЗАТЕЛЬНО!!!
  114. app.mount('body')
  115. debug.log "Vue application initialized successfully"