const Article = require('../api/article') const pagination = require('../api/pagination') const Dialogue = require('../widgets/dialogue') const Pages = require('../widgets/pages') const AdminArticles = { oninit: function(vnode) { this.error = '' this.lastpage = m.route.param('page') || '1' this.articles = [] this.removeArticle = null this.fetchArticles(vnode) }, onupdate: function(vnode) { if (m.route.param('page') && m.route.param('page') !== this.lastpage) { this.fetchArticles(vnode) } }, fetchArticles: function(vnode) { this.loading = true this.links = null this.lastpage = m.route.param('page') || '1' document.title = 'Articles Page ' + this.lastpage + ' - Admin NFP Moe' return pagination.fetchPage(Article.getAllArticlesPagination({ per_page: 20, page: this.lastpage, includes: ['parent', 'staff'], })) .then(function(result) { vnode.state.articles = result.data vnode.state.links = result.links }) .catch(function(err) { vnode.state.error = err.message }) .then(function() { vnode.state.loading = false m.redraw() }) }, confirmRemoveArticle: function(vnode) { let removingArticle = this.removeArticle this.removeArticle = null this.loading = true Article.removeArticle(removingArticle, removingArticle.id) .then(this.oninit.bind(this, vnode)) .catch(function(err) { vnode.state.error = err.message vnode.state.loading = false m.redraw() }) }, drawArticle: function(vnode, article) { let parent if (article.parent) { parent = { path: '/page/' + article.parent.path, name: article.parent.name, } } else { parent = { path: '/', name: '-- Frontpage --', } } let className = '' if (new Date() < new Date(article.published_at)) { className = 'rowhidden' } else if (article.is_featured) { className = 'rowfeatured' } return [ m('tr', { class: className }, [ m('td', m(m.route.Link, { href: '/admin/articles/' + article.id }, article.name)), m('td', m(m.route.Link, { href: parent.path }, parent.name)), m('td', m(m.route.Link, { href: '/article/' + article.path }, '/article/' + article.path)), m('td.right', article.published_at.replace('T', ' ').split('.')[0]), m('td.right', article.staff && article.staff.fullname || 'Admin'), m('td.right', m('button', { onclick: function() { vnode.state.removeArticle = article } }, 'Remove')), ]), ] }, view: function(vnode) { return [ m('div.admin-wrapper', [ m('div.admin-actions', [ m('span', 'Actions:'), m(m.route.Link, { href: '/admin/articles/add' }, 'Create new article'), ]), m('article.editarticle', [ m('header', m('h1', 'All articles')), m('div.error', { hidden: !this.error, onclick: function() { vnode.state.error = '' }, }, this.error), (this.loading ? m('div.loading-spinner.full') : m('table', [ m('thead', m('tr', [ m('th', 'Title'), m('th', 'Page'), m('th', 'Path'), m('th.right', 'Publish'), m('th.right', 'By'), m('th.right', 'Actions'), ]) ), m('tbody', this.articles.map(AdminArticles.drawArticle.bind(this, vnode))), ]) ), m(Pages, { base: '/admin/articles', links: this.links, }), ]), ]), m(Dialogue, { hidden: vnode.state.removeArticle === null, title: 'Delete ' + (vnode.state.removeArticle ? vnode.state.removeArticle.name : ''), message: 'Are you sure you want to remove "' + (vnode.state.removeArticle ? vnode.state.removeArticle.name : '') + '" (' + (vnode.state.removeArticle ? vnode.state.removeArticle.path : '') + ')', yes: 'Remove', yesclass: 'alert', no: 'Cancel', noclass: 'cancel', onyes: this.confirmRemoveArticle.bind(this, vnode), onno: function() { vnode.state.removeArticle = null }, }), ] }, } module.exports = AdminArticles