nfp_sites/nfp_moe/app/admin/site_pages.js

125 lines
3.5 KiB
JavaScript

const PageTree = require('../page_tree')
const Dialogue = require('./dialogue')
const api = require('../api')
const AdminPages = {
oninit: function(vnode) {
this.error = ''
this.pages = []
document.title = 'Pages - Admin NFP Moe'
this.fetchPages(vnode)
},
fetchPages: function(vnode) {
this.loading = true
this.error = ''
return api.sendRequest({
method: 'GET',
url: '/api/auth/pages',
})
.then((result) => {
this.pages = result.tree
}, (err) => {
this.error = err.message
})
.then(() => {
this.loading = false
m.redraw()
})
},
confirmRemovePage: function(vnode, page) {
this.loading = true
m.redraw()
return api.sendRequest({
method: 'DELETE',
url: '/api/auth/pages/' + page.id,
})
.then(
() => Promise.all([
PageTree.refreshTree(),
this.fetchPages(),
]),
(err) => { this.error = err.message }
)
.then(() => {
this.loading = false
m.redraw()
})
},
askConfirmRemovePage: function(vnode, page) {
Dialogue.showDialogue(
'Delete ' + page.name,
'Are you sure you want to remove "' + page.name + '" (' + page.path + ')',
'Remove',
'alert',
'Don\'t remove',
'',
page,
this.confirmRemovePage.bind(this, vnode))
},
drawPage: function(vnode, page) {
return [
m('tr', [
m('td.nopadding', page.banner_alt_prefix
? m('a', { href: page.banner_path, target: '_blank' }, m('img', { src: page.banner_alt_prefix + '_small.avif' }))
: m.trust(' ') ),
m('td.nopadding', page.media_alt_prefix
? m('a', { href: page.media_path, target: '_blank' }, m('img', { src: page.media_alt_prefix + '_small.avif' }))
: m.trust(' ') ),
m('td', [
page.parent_id ? m('span.subpage', ' - ') : null,
m(m.route.Link, { href: '/admin/pages/' + page.id }, page.name),
]),
m('td', m(m.route.Link, { href: '/page/' + page.path }, '/page/' + page.path)),
m('td.right', page.updated_at.replace('T', ' ').split('.')[0]),
m('td.right', m('button', { onclick: this.askConfirmRemovePage.bind(this, vnode, page) }, 'Remove')),
]),
].concat(page.children ? page.children.map(AdminPages.drawPage.bind(this, vnode)) : [])
},
view: function(vnode) {
return [
m('div.admin', [
m('div.inside.vertical', [
m('div.actions', [
m('div.filler'),
m('span', 'Actions:'),
m(m.route.Link, { href: '/admin/pages/add' }, 'Create new page'),
]),
m('h2.title', 'All pages'),
m('div.container', [
m('div.error', {
hidden: !this.error,
onclick: function() { vnode.state.error = '' },
}, this.error),
this.loading
? m('div.loading-spinner')
: m('table', [
m('thead',
m('tr', [
m('th', 'Banner'),
m('th', 'Cover'),
m('th', 'Title'),
m('th', 'Path'),
m('th.right', 'Updated'),
m('th.right', 'Actions'),
])
),
m('tbody', this.pages.map(AdminPages.drawPage.bind(this, vnode))),
],
),
]),
]),
]),
]
},
}
module.exports = AdminPages