index.coffee 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. document.head.insertAdjacentHTML('beforeend','<style type="text/css">'+stylFns['app/pages/Admin/Slider/index.styl']+'</style>')
  2. PouchDB = require 'app/utils/pouch'
  3. module.exports =
  4. name: 'AdminSlider'
  5. render: (new Function '_ctx', '_cache', renderFns['app/pages/Admin/Slider/index.pug'])()
  6. data: ->
  7. return {
  8. slides: []
  9. showSlideModal: false
  10. editingSlide: null
  11. availableDomains: []
  12. slideForm: {
  13. title: ''
  14. subtitle: ''
  15. image: ''
  16. buttonText: 'В каталог'
  17. buttonLink: '/catalog'
  18. order: 0
  19. active: true
  20. domains: []
  21. }
  22. }
  23. methods:
  24. loadSlides: ->
  25. PouchDB.queryView('admin', 'slides', { include_docs: true })
  26. .then (result) =>
  27. @slides = result.rows.map (row) -> row.doc
  28. # Сортируем по порядку
  29. @slides.sort (a, b) -> a.order - b.order
  30. .catch (error) =>
  31. console.error 'Ошибка загрузки слайдов:', error
  32. @showNotification 'Ошибка загрузки слайдов', 'error'
  33. loadDomains: ->
  34. PouchDB.queryView('admin', 'domain_settings', { include_docs: true })
  35. .then (result) =>
  36. @availableDomains = result.rows.map (row) -> row.doc
  37. .catch (error) =>
  38. console.error 'Ошибка загрузки доменов:', error
  39. editSlide: (slide) ->
  40. @editingSlide = slide
  41. @slideForm = {
  42. title: slide.title || ''
  43. subtitle: slide.subtitle || ''
  44. image: slide.image || ''
  45. buttonText: slide.buttonText || 'В каталог'
  46. buttonLink: slide.buttonLink || '/catalog'
  47. order: slide.order || 0
  48. active: slide.active != false
  49. domains: slide.domains || []
  50. }
  51. @showSlideModal = true
  52. saveSlide: ->
  53. if !@slideForm.title
  54. @showNotification 'Введите заголовок слайда', 'error'
  55. return
  56. slideData = {
  57. type: 'hero_slide'
  58. ...@slideForm
  59. updatedAt: new Date().toISOString()
  60. }
  61. if @editingSlide
  62. slideData._id = @editingSlide._id
  63. slideData._rev = @editingSlide._rev
  64. slideData.createdAt = @editingSlide.createdAt
  65. else
  66. slideData._id = "hero_slide:#{Date.now()}"
  67. slideData.createdAt = new Date().toISOString()
  68. # Автоматически устанавливаем порядок для нового слайда
  69. slideData.order = @slides.length
  70. PouchDB.saveToRemote(slideData)
  71. .then (result) =>
  72. @showSlideModal = false
  73. @resetSlideForm()
  74. @loadSlides()
  75. @showNotification 'Слайд успешно сохранен'
  76. .catch (error) =>
  77. console.error 'Ошибка сохранения слайда:', error
  78. @showNotification 'Ошибка сохранения слайда', 'error'
  79. deleteSlide: (slideId) ->
  80. if confirm('Вы уверены, что хотите удалить этот слайд?')
  81. PouchDB.getDocument(slideId)
  82. .then (doc) ->
  83. PouchDB.saveToRemote({ ...doc, _deleted: true })
  84. .then (result) =>
  85. @loadSlides()
  86. @showNotification 'Слайд удален'
  87. .catch (error) =>
  88. console.error 'Ошибка удаления слайда:', error
  89. @showNotification 'Ошибка удаления слайда', 'error'
  90. toggleSlideStatus: (slide) ->
  91. updatedSlide = {
  92. ...slide
  93. active: !slide.active
  94. updatedAt: new Date().toISOString()
  95. }
  96. PouchDB.saveToRemote(updatedSlide)
  97. .then (result) =>
  98. @loadSlides()
  99. @showNotification 'Статус слайда обновлен'
  100. .catch (error) =>
  101. console.error 'Ошибка обновления статуса:', error
  102. @showNotification 'Ошибка обновления статуса', 'error'
  103. resetSlideForm: ->
  104. @editingSlide = null
  105. @slideForm = {
  106. title: ''
  107. subtitle: ''
  108. image: ''
  109. buttonText: 'В каталог'
  110. buttonLink: '/catalog'
  111. order: @slides.length
  112. active: true
  113. domains: []
  114. }
  115. getStatusClass: (isActive) ->
  116. baseClass = 'admin-slider__item-status'
  117. if isActive
  118. return "#{baseClass} admin-slider__item-status--active"
  119. else
  120. return "#{baseClass} admin-slider__item-status--inactive"
  121. getToggleBtnClass: (isActive) ->
  122. baseClass = 'admin-slider__btn'
  123. if isActive
  124. return "#{baseClass} admin-slider__btn--delete"
  125. else
  126. return "#{baseClass} admin-slider__btn--primary"
  127. showNotification: (message, type = 'success') ->
  128. @$root.showNotification?(message, type) || debug.log("#{type}: #{message}")
  129. mounted: ->
  130. @loadSlides()
  131. @loadDomains()