index.coffee 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. # app/pages/Admin/Media/index.coffee
  2. # Добавление стилей страницы
  3. if globalThis.stylFns and globalThis.stylFns['app/pages/Admin/Media/index.styl']
  4. styleElement = document.createElement('style')
  5. styleElement.type = 'text/css'
  6. styleElement.textContent = globalThis.stylFns['app/pages/Admin/Media/index.styl']
  7. document.head.appendChild(styleElement)
  8. else
  9. log '⚠️ Стили медиа-менеджера не найдены'
  10. FileUpload = require 'app/components/Admin/FileUpload/index.coffee'
  11. LazyImage = require 'app/components/Admin/LazyImage/index.coffee'
  12. MediaService = require 'app/services/MediaService'
  13. module.exports = {
  14. components: {
  15. 'file-upload': FileUpload
  16. 'lazy-image': LazyImage
  17. }
  18. data: ->
  19. {
  20. files: []
  21. visibleFiles: []
  22. selectedFiles: []
  23. uploading: false
  24. uploadProgress: 0
  25. filterType: ''
  26. searchQuery: ''
  27. loading: false
  28. loadingMore: false
  29. currentPage: 1
  30. pageSize: 24
  31. hasMoreFiles: true
  32. }
  33. computed:
  34. filteredFiles: ->
  35. files = @files
  36. if @filterType
  37. files = files.filter (file) => file.type == @filterType
  38. if @searchQuery
  39. query = @searchQuery.toLowerCase()
  40. files = files.filter (file) =>
  41. file.name.toLowerCase().includes(query)
  42. return files.sort (a, b) -> new Date(b.createdAt) - new Date(a.createdAt)
  43. watch:
  44. filteredFiles: ->
  45. @currentPage = 1
  46. @updateVisibleFiles()
  47. methods:
  48. initializeMediaService: ->
  49. try
  50. await MediaService.init()
  51. log '✅ MediaService инициализирован'
  52. return true
  53. catch error
  54. log '❌ Ошибка инициализации MediaService: '+error.message
  55. @$emit('show-notification', 'Ошибка инициализации медиа-сервиса', 'error')
  56. return false
  57. loadMediaFiles: ->
  58. @loading = true
  59. try
  60. # ✅ Сначала инициализируем сервис
  61. initialized = await @initializeMediaService()
  62. if not initialized
  63. return
  64. @files = await MediaService.getAllFiles()
  65. log '✅ Медиа-файлы загружены: '+@files.length
  66. @updateVisibleFiles()
  67. catch error
  68. log '❌ Ошибка загрузки медиа-файлов: '+error.message
  69. @$emit('show-notification', 'Ошибка загрузки файлов', 'error')
  70. finally
  71. @loading = false
  72. updateVisibleFiles: ->
  73. startIndex = 0
  74. endIndex = @currentPage * @pageSize
  75. @visibleFiles = @filteredFiles.slice(startIndex, endIndex)
  76. @hasMoreFiles = endIndex < @filteredFiles.length
  77. loadMoreFiles: ->
  78. @loadingMore = true
  79. setTimeout (=>
  80. @currentPage += 1
  81. @updateVisibleFiles()
  82. @loadingMore = false
  83. ), 300
  84. onFilesSelect: (files) ->
  85. log 'Выбрано файлов для загрузки: '+files.length
  86. uploadFiles: (files) ->
  87. # ✅ Инициализируем сервис перед загрузкой
  88. initialized = await @initializeMediaService()
  89. if not initialized
  90. return
  91. @uploading = true
  92. @uploadProgress = 0
  93. try
  94. for file, index in files
  95. # Имитация загрузки с прогрессом
  96. for i in [0..100] by 10
  97. await new Promise (resolve) -> setTimeout(resolve, 50)
  98. @uploadProgress = ((index * 100) + i) / files.length
  99. await MediaService.uploadFiles(files)
  100. @$emit('show-notification', 'Файлы успешно загружены', 'success')
  101. @loadMediaFiles()
  102. catch error
  103. log '❌ Ошибка загрузки файлов: '+error.message
  104. @$emit('show-notification', 'Ошибка загрузки файлов', 'error')
  105. finally
  106. @uploading = false
  107. @uploadProgress = 0
  108. getFileUrl: (file) ->
  109. # Формирование URL для доступа к файлу в CouchDB
  110. return '/d/braer_color_shop/'+file._id+'/'+file.name
  111. toggleSelect: (fileId) ->
  112. if @selectedFiles.includes(fileId)
  113. @selectedFiles = @selectedFiles.filter (id) -> id != fileId
  114. else
  115. @selectedFiles.push(fileId)
  116. deleteFile: (file) ->
  117. if not confirm('Удалить файл "'+file.name+'"?')
  118. return
  119. # ✅ Инициализируем сервис перед удалением
  120. initialized = await @initializeMediaService()
  121. if not initialized
  122. return
  123. try
  124. await MediaService.deleteFile(file._id)
  125. @$emit('show-notification', 'Файл удален', 'success')
  126. @loadMediaFiles()
  127. catch error
  128. log '❌ Ошибка удаления файла: '+error.message
  129. @$emit('show-notification', 'Ошибка удаления файла', 'error')
  130. deleteSelected: ->
  131. if not confirm('Удалить '+@selectedFiles.length+' выбранных файлов?')
  132. return
  133. # ✅ Инициализируем сервис перед удалением
  134. initialized = await @initializeMediaService()
  135. if not initialized
  136. return
  137. try
  138. await MediaService.deleteFiles(@selectedFiles)
  139. @$emit('show-notification', 'Файлы удалены', 'success')
  140. @selectedFiles = []
  141. @loadMediaFiles()
  142. catch error
  143. log '❌ Ошибка удаления файлов: '+error.message
  144. @$emit('show-notification', 'Ошибка удаления файлов', 'error')
  145. formatFileSize: (bytes) ->
  146. if bytes == 0
  147. return '0 Bytes'
  148. k = 1024
  149. sizes = ['Bytes', 'KB', 'MB', 'GB']
  150. i = Math.floor(Math.log(bytes) / Math.log(k))
  151. return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
  152. formatDate: (dateString) ->
  153. return new Date(dateString).toLocaleDateString('ru-RU')
  154. mounted: ->
  155. @loadMediaFiles()
  156. log '🖼️ Медиа-менеджер загружен'
  157. render: (new Function '_ctx', '_cache', globalThis.renderFns['app/pages/Admin/Media/index.pug'])()
  158. }