index.coffee 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. # Глобальная инициализация debug
  2. globalThis.log = debug.log
  3. # Главный файл приложения
  4. log '🚀 Инициализация приложения Браер-Колор'
  5. # Загрузка конфигурации
  6. config = require 'app/config'
  7. DataTypes = require 'app/types/data'
  8. EventTypes = require 'app/types/events'
  9. # Инициализация глобальных переменных
  10. globalThis.renderFns = require 'pug.json'
  11. globalThis.stylFns = require 'styl.json'
  12. # Мета-теги
  13. document.head.insertAdjacentHTML 'beforeend', '<meta charset="UTF-8">'
  14. document.head.insertAdjacentHTML 'beforeend', '<meta name="viewport" content="width=device-width, initial-scale=1.0">'
  15. document.head.insertAdjacentHTML 'beforeend', '<title>Браер-Колор - Интернет-магазин лакокрасочной продукции</title>'
  16. # Добавление глобальных стилей
  17. if stylFns['app/index.styl']
  18. styleElement = document.createElement('style')
  19. styleElement.type = 'text/css'
  20. styleElement.textContent = stylFns['app/index.styl']
  21. document.head.appendChild(styleElement)
  22. else
  23. log '⚠️ Глобальные стили не найдены'
  24. # Добавить в секцию импортов
  25. PouchDBService = require 'app/utils/pouch'
  26. SiteDesignDocuments = require 'app/design/site'
  27. ProductService = require 'app/services/ProductService'
  28. CategoryService = require 'app/services/CategoryService'
  29. DomainService = require 'app/services/DomainService'
  30. # Создание Vue приложения
  31. app = Vue.createApp({
  32. data: ->
  33. {
  34. theme: localStorage.getItem('theme') or config.defaultTheme
  35. companyName: config.companyName
  36. loading: false
  37. currentDomain: window.location.hostname
  38. currentDomainSettings: null
  39. availableDomains: []
  40. languages: config.languages
  41. currentLanguage: localStorage.getItem('language') or config.defaultLanguage
  42. user: null
  43. cartItems: []
  44. notifications: []
  45. }
  46. computed:
  47. isAdmin: ->
  48. @user?.role == 'admin'
  49. domainConfig: ->
  50. DomainService.getDomainConfig?(@currentDomain) or {}
  51. methods:
  52. # Управление темой
  53. toggleTheme: ->
  54. @theme = if @theme == 'light' then 'dark' else 'light'
  55. localStorage.setItem 'theme', @theme
  56. document.documentElement.classList.toggle 'dark'
  57. @$emit EventTypes.THEME_CHANGED, @theme
  58. log '🎨 Тема изменена:', @theme
  59. # Управление языком
  60. setLanguage: (lang) ->
  61. if @languages.includes lang
  62. @currentLanguage = lang
  63. localStorage.setItem 'language', @currentLanguage
  64. @$emit EventTypes.LANGUAGE_CHANGED, lang
  65. log '🌐 Язык изменен:', lang
  66. else
  67. log '⚠️ Язык не поддерживается:', lang
  68. # Смена домена
  69. changeDomain: (domain) ->
  70. log '🌐 Смена домена на:', domain
  71. @currentDomain = domain
  72. @loadDomainData()
  73. # Переход в корзину
  74. goToCart: ->
  75. @$router.push '/cart'
  76. log '🛒 Переход в корзину'
  77. # Загрузка настроек домена
  78. loadDomainData: ->
  79. log '📡 Загрузка настроек домена:', @currentDomain
  80. DomainService.loadDomainSettings(@currentDomain)
  81. .then (settings) =>
  82. @currentDomainSettings = settings
  83. document.title = settings?.companyName or @companyName
  84. log '✅ Настройки домена загружены', settings
  85. .catch (error) =>
  86. log '⚠️ Настройки домена не найдены, используются значения по умолчанию'
  87. @currentDomainSettings = new DataTypes.DomainSettings()
  88. @currentDomainSettings.companyName = @companyName
  89. # Управление корзиной
  90. updateCart: (items) ->
  91. @cartItems = items
  92. localStorage.setItem 'cart', JSON.stringify(items)
  93. @$emit EventTypes.CART_UPDATE, items
  94. log '🛒 Корзина обновлена:', items.length, 'товаров'
  95. # Уведомления
  96. showNotification: (message, type = 'info') ->
  97. notification = {
  98. id: Date.now(),
  99. message,
  100. type,
  101. visible: true,
  102. timestamp: new Date()
  103. }
  104. @notifications.push notification
  105. log '📢 Показано уведомление:', message
  106. setTimeout (=>
  107. notification.visible = false
  108. setTimeout (=>
  109. @notifications = @notifications.filter (n) -> n.id != notification.id
  110. ), 300
  111. ), 5000
  112. # Закрытие уведомления
  113. closeNotification: (id) ->
  114. @notifications = @notifications.filter (notification) -> notification.id != id
  115. log '📢 Уведомление закрыто:', id
  116. # Загрузка пользователя
  117. loadUserData: ->
  118. userData = localStorage.getItem 'user'
  119. if userData
  120. try
  121. @user = JSON.parse userData
  122. log '👤 Пользователь загружен:', @user.username
  123. catch error
  124. log '❌ Ошибка загрузки пользователя:', error
  125. @user = null
  126. else
  127. @user = null
  128. # Загрузка корзины
  129. loadCartData: ->
  130. cartData = localStorage.getItem 'cart'
  131. if cartData
  132. try
  133. @cartItems = JSON.parse cartData
  134. log '🛒 Корзина загружена:', @cartItems.length, 'товаров'
  135. catch error
  136. log '❌ Ошибка загрузки корзины:', error
  137. @cartItems = []
  138. else
  139. @cartItems = []
  140. initializeApp: ->
  141. log '🔧 Начало инициализации приложения'
  142. @loading = true
  143. try
  144. # Инициализация PouchDB и сервисов
  145. await PouchDBService.init()
  146. log '✅ PouchDB инициализирован'
  147. # Сохранение дизайн-документов
  148. await SiteDesignDocuments.saveDesignDocs(PouchDBService)
  149. log '✅ Дизайн-документы сохранены'
  150. # Инициализация сервисов
  151. await ProductService.init()
  152. await CategoryService.init()
  153. await DomainService.init()
  154. log '✅ Все сервисы инициализированы'
  155. # Загрузка данных
  156. await @loadDomainData()
  157. await @loadUserData()
  158. await @loadCartData()
  159. log '✅ Приложение успешно инициализировано'
  160. @showNotification('Приложение готово к работе', 'success')
  161. catch error
  162. log '❌ Ошибка инициализации приложения:', error
  163. @showNotification('Ошибка загрузки приложения', 'error')
  164. finally
  165. @loading = false
  166. mounted: ->
  167. await @initializeApp()
  168. # Рендер функция из Pug
  169. render: (new Function '_ctx', '_cache', globalThis.renderFns['app/index.pug'])()
  170. })
  171. Router = require 'app/router/index.coffee'
  172. # Регистрация глобальных компонентов
  173. app.component('ui-button', require 'app/components/UI/Button/index.coffee')
  174. app.component('notification-container', require 'app/components/UI/Notification/index.coffee')
  175. app.component('app-loader', require 'app/components/UI/AppLoader/index.coffee')
  176. app.component('multilevel-menu', require 'app/components/Domain/MultilevelMenu/index.coffee')
  177. app.component('theme-toggle', require 'app/components/UI/ThemeToggle/index.coffee')
  178. app.component('language-toggle', require 'app/components/UI/LanguageToggle/index.coffee')
  179. app.component('cart-widget', require 'app/components/Domain/CartWidget/index.coffee')
  180. # Подключение роутера
  181. app.use Router
  182. # Глобальная обработка ошибок Vue
  183. app.config.errorHandler = (err, vm, info) ->
  184. log '💥 Vue ошибка:', err, info
  185. console.error('Vue ошибка:', err, info)
  186. # Глобальная обработка предупреждений
  187. app.config.warnHandler = (msg, vm, trace) ->
  188. log '⚠️ Vue предупреждение:', msg, trace
  189. # Монтирование приложения
  190. try
  191. app.mount('body')
  192. log '✅ Приложение успешно смонтировано'
  193. catch error
  194. log '❌ Ошибка монтирования приложения:', error
  195. console.error('Ошибка монтирования:', error)