| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- # Глобальная инициализация debug
- globalThis.log = debug.log
- # Главный файл приложения
- log '🚀 Инициализация приложения Браер-Колор'
- # Загрузка конфигурации
- config = require 'app/config'
- DataTypes = require 'app/types/data'
- EventTypes = require 'app/types/events'
- # Инициализация глобальных переменных
- globalThis.renderFns = require 'pug.json'
- globalThis.stylFns = require 'styl.json'
- # Мета-теги
- document.head.insertAdjacentHTML 'beforeend', '<meta charset="UTF-8">'
- document.head.insertAdjacentHTML 'beforeend', '<meta name="viewport" content="width=device-width, initial-scale=1.0">'
- document.head.insertAdjacentHTML 'beforeend', '<title>Браер-Колор - Интернет-магазин лакокрасочной продукции</title>'
- # Добавление глобальных стилей
- if stylFns['app/index.styl']
- styleElement = document.createElement('style')
- styleElement.type = 'text/css'
- styleElement.textContent = stylFns['app/index.styl']
- document.head.appendChild(styleElement)
- else
- log '⚠️ Глобальные стили не найдены'
- # Добавить в секцию импортов
- PouchDBService = require 'app/utils/pouch'
- SiteDesignDocuments = require 'app/design/site'
- ProductService = require 'app/services/ProductService'
- CategoryService = require 'app/services/CategoryService'
- DomainService = require 'app/services/DomainService'
- # Создание Vue приложения
- app = Vue.createApp({
- data: ->
- {
- theme: localStorage.getItem('theme') or config.defaultTheme
- companyName: config.companyName
- loading: false
- currentDomain: window.location.hostname
- currentDomainSettings: null
- availableDomains: []
- languages: config.languages
- currentLanguage: localStorage.getItem('language') or config.defaultLanguage
- user: null
- cartItems: []
- notifications: []
- }
-
- computed:
- isAdmin: ->
- @user?.role == 'admin'
-
- domainConfig: ->
- DomainService.getDomainConfig?(@currentDomain) or {}
-
- methods:
- # Управление темой
- toggleTheme: ->
- @theme = if @theme == 'light' then 'dark' else 'light'
- localStorage.setItem 'theme', @theme
- document.documentElement.classList.toggle 'dark'
- @$emit EventTypes.THEME_CHANGED, @theme
- log '🎨 Тема изменена:', @theme
-
- # Управление языком
- setLanguage: (lang) ->
- if @languages.includes lang
- @currentLanguage = lang
- localStorage.setItem 'language', @currentLanguage
- @$emit EventTypes.LANGUAGE_CHANGED, lang
- log '🌐 Язык изменен:', lang
- else
- log '⚠️ Язык не поддерживается:', lang
-
- # Смена домена
- changeDomain: (domain) ->
- log '🌐 Смена домена на:', domain
- @currentDomain = domain
- @loadDomainData()
-
- # Переход в корзину
- goToCart: ->
- @$router.push '/cart'
- log '🛒 Переход в корзину'
-
- # Загрузка настроек домена
- loadDomainData: ->
- log '📡 Загрузка настроек домена:', @currentDomain
-
- DomainService.loadDomainSettings(@currentDomain)
- .then (settings) =>
- @currentDomainSettings = settings
- document.title = settings?.companyName or @companyName
- log '✅ Настройки домена загружены', settings
- .catch (error) =>
- log '⚠️ Настройки домена не найдены, используются значения по умолчанию'
- @currentDomainSettings = new DataTypes.DomainSettings()
- @currentDomainSettings.companyName = @companyName
-
- # Управление корзиной
- updateCart: (items) ->
- @cartItems = items
- localStorage.setItem 'cart', JSON.stringify(items)
- @$emit EventTypes.CART_UPDATE, items
- log '🛒 Корзина обновлена:', items.length, 'товаров'
-
- # Уведомления
- showNotification: (message, type = 'info') ->
- notification = {
- id: Date.now(),
- message,
- type,
- visible: true,
- timestamp: new Date()
- }
-
- @notifications.push notification
- log '📢 Показано уведомление:', message
-
- setTimeout (=>
- notification.visible = false
- setTimeout (=>
- @notifications = @notifications.filter (n) -> n.id != notification.id
- ), 300
- ), 5000
-
- # Закрытие уведомления
- closeNotification: (id) ->
- @notifications = @notifications.filter (notification) -> notification.id != id
- log '📢 Уведомление закрыто:', id
-
- # Загрузка пользователя
- loadUserData: ->
- userData = localStorage.getItem 'user'
- if userData
- try
- @user = JSON.parse userData
- log '👤 Пользователь загружен:', @user.username
- catch error
- log '❌ Ошибка загрузки пользователя:', error
- @user = null
- else
- @user = null
-
- # Загрузка корзины
- loadCartData: ->
- cartData = localStorage.getItem 'cart'
- if cartData
- try
- @cartItems = JSON.parse cartData
- log '🛒 Корзина загружена:', @cartItems.length, 'товаров'
- catch error
- log '❌ Ошибка загрузки корзины:', error
- @cartItems = []
- else
- @cartItems = []
-
- initializeApp: ->
- log '🔧 Начало инициализации приложения'
- @loading = true
-
- try
- # Инициализация PouchDB и сервисов
- await PouchDBService.init()
- log '✅ PouchDB инициализирован'
-
- # Сохранение дизайн-документов
- await SiteDesignDocuments.saveDesignDocs(PouchDBService)
- log '✅ Дизайн-документы сохранены'
-
- # Инициализация сервисов
- await ProductService.init()
- await CategoryService.init()
- await DomainService.init()
- log '✅ Все сервисы инициализированы'
-
- # Загрузка данных
- await @loadDomainData()
- await @loadUserData()
- await @loadCartData()
-
- log '✅ Приложение успешно инициализировано'
- @showNotification('Приложение готово к работе', 'success')
-
- catch error
- log '❌ Ошибка инициализации приложения:', error
- @showNotification('Ошибка загрузки приложения', 'error')
- finally
- @loading = false
-
- mounted: ->
- await @initializeApp()
-
- # Рендер функция из Pug
- render: (new Function '_ctx', '_cache', globalThis.renderFns['app/index.pug'])()
- })
- Router = require 'app/router/index.coffee'
- # Регистрация глобальных компонентов
- app.component('ui-button', require 'app/components/UI/Button/index.coffee')
- app.component('notification-container', require 'app/components/UI/Notification/index.coffee')
- app.component('app-loader', require 'app/components/UI/AppLoader/index.coffee')
- app.component('multilevel-menu', require 'app/components/Domain/MultilevelMenu/index.coffee')
- app.component('theme-toggle', require 'app/components/UI/ThemeToggle/index.coffee')
- app.component('language-toggle', require 'app/components/UI/LanguageToggle/index.coffee')
- app.component('cart-widget', require 'app/components/Domain/CartWidget/index.coffee')
- # Подключение роутера
- app.use Router
- # Глобальная обработка ошибок Vue
- app.config.errorHandler = (err, vm, info) ->
- log '💥 Vue ошибка:', err, info
- console.error('Vue ошибка:', err, info)
- # Глобальная обработка предупреждений
- app.config.warnHandler = (msg, vm, trace) ->
- log '⚠️ Vue предупреждение:', msg, trace
- # Монтирование приложения
- try
- app.mount('body')
- log '✅ Приложение успешно смонтировано'
- catch error
- log '❌ Ошибка монтирования приложения:', error
- console.error('Ошибка монтирования:', error)
|