document.head.insertAdjacentHTML('beforeend','')
PouchDB = require 'app/utils/pouch'
module.exports =
name: 'AdminBlog'
render: (new Function '_ctx', '_cache', renderFns['app/pages/Admin/Blog/index.pug'])()
data: ->
return {
articles: []
searchQuery: ''
selectedStatus: ''
showArticleModal: false
editingArticle: null
availableDomains: []
articleForm: {
title: ''
slug: ''
excerpt: ''
image: ''
author: ''
content: ''
published: false
domains: []
}
}
computed:
filteredArticles: ->
articles = @articles
# Фильтр по поиску
if @searchQuery
query = @searchQuery.toLowerCase()
articles = articles.filter (article) =>
article.title?.toLowerCase().includes(query) ||
article.excerpt?.toLowerCase().includes(query)
# Фильтр по статусу
if @selectedStatus == 'published'
articles = articles.filter (article) => article.published
else if @selectedStatus == 'draft'
articles = articles.filter (article) => !article.published
return articles
methods:
loadArticles: ->
PouchDB.queryView('admin', 'blog_articles', { include_docs: true })
.then (result) =>
@articles = result.rows.map (row) -> row.doc
# Сортируем по дате создания (новые сначала)
@articles.sort (a, b) -> new Date(b.createdAt) - new Date(a.createdAt)
.catch (error) =>
console.error 'Ошибка загрузки статей:', error
@showNotification 'Ошибка загрузки статей', 'error'
loadDomains: ->
PouchDB.queryView('admin', 'domain_settings', { include_docs: true })
.then (result) =>
@availableDomains = result.rows.map (row) -> row.doc
.catch (error) =>
console.error 'Ошибка загрузки доменов:', error
editArticle: (article) ->
@editingArticle = article
@articleForm = {
title: article.title || ''
slug: article.slug || ''
excerpt: article.excerpt || ''
image: article.image || ''
author: article.author || ''
content: article.content || ''
published: article.published || false
domains: article.domains || []
}
@showArticleModal = true
saveArticle: ->
if !@articleForm.title
@showNotification 'Введите заголовок статьи', 'error'
return
if !@articleForm.slug
@showNotification 'Введите URL slug', 'error'
return
articleData = {
type: 'blog_article'
...@articleForm
updatedAt: new Date().toISOString()
}
if @editingArticle
articleData._id = @editingArticle._id
articleData._rev = @editingArticle._rev
articleData.createdAt = @editingArticle.createdAt
else
articleData._id = "blog_article:#{Date.now()}"
articleData.createdAt = new Date().toISOString()
PouchDB.saveToRemote(articleData)
.then (result) =>
@showArticleModal = false
@resetArticleForm()
@loadArticles()
@showNotification 'Статья успешно сохранена'
.catch (error) =>
console.error 'Ошибка сохранения статьи:', error
@showNotification 'Ошибка сохранения статьи', 'error'
deleteArticle: (articleId) ->
if confirm('Вы уверены, что хотите удалить эту статью?')
PouchDB.getDocument(articleId)
.then (doc) ->
PouchDB.saveToRemote({ ...doc, _deleted: true })
.then (result) =>
@loadArticles()
@showNotification 'Статья удалена'
.catch (error) =>
console.error 'Ошибка удаления статьи:', error
@showNotification 'Ошибка удаления статьи', 'error'
toggleArticleStatus: (article) ->
updatedArticle = {
...article
published: !article.published
updatedAt: new Date().toISOString()
}
PouchDB.saveToRemote(updatedArticle)
.then (result) =>
@loadArticles()
@showNotification 'Статус статьи обновлен'
.catch (error) =>
console.error 'Ошибка обновления статуса:', error
@showNotification 'Ошибка обновления статуса', 'error'
resetArticleForm: ->
@editingArticle = null
@articleForm = {
title: ''
slug: ''
excerpt: ''
image: ''
author: ''
content: ''
published: false
domains: []
}
formatDate: (dateString) ->
return '' if !dateString
date = new Date(dateString)
date.toLocaleDateString('ru-RU', {
year: 'numeric'
month: 'long'
day: 'numeric'
})
getStatusClass: (isPublished) ->
baseClass = 'admin-blog__item-status'
if isPublished
return "#{baseClass} admin-blog__item-status--published"
else
return "#{baseClass} admin-blog__item-status--draft"
getToggleBtnClass: (isPublished) ->
baseClass = 'admin-blog__btn'
if isPublished
return "#{baseClass} admin-blog__btn--secondary"
else
return "#{baseClass} admin-blog__btn--primary"
showNotification: (message, type = 'success') ->
@$root.showNotification?(message, type) || debug.log("#{type}: #{message}")
mounted: ->
@loadArticles()
@loadDomains()