index.coffee 8.8 KB

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