const m = require('mithril') const ApiArticle = require('../api/article.p') const Authentication = require('../authentication') const Fileinfo = require('../widgets/fileinfo') const EditorBlock = require('../widgets/editorblock') const Article = { oninit: function(vnode) { this.error = '' this.loading = false this.showLoading = null this.data = { article: null, files: [], pictureFallback: null, pictureJpeg: null, pictureAvif: null, pictureCover: null, } this.showcomments = false if (window.__nfpdata) { this.path = m.route.param('id') this.data.article = window.__nfpdata window.__nfpdata = null } else { this.fetchArticle(vnode) } }, onbeforeupdate: function(vnode) { if (this.path !== m.route.param('id')) { this.fetchArticle(vnode) } }, fetchArticle: function(vnode) { this.error = '' this.path = m.route.param('id') this.showcomments = false if (this.showLoading) { clearTimeout(this.showLoading) } if (this.data.article) { this.showLoading = setTimeout(() => { this.showLoading = null this.loading = true m.redraw() }, 150) } else { this.loading = true } ApiArticle.getArticle(this.path) .then((result) => { this.data = result if (this.data.article.media_alt_prefix) { this.data.article.pictureFallback = this.data.article.media_alt_prefix + '_small.jpg' this.data.article.pictureJpeg = this.data.article.media_alt_prefix + '_small.jpg' + ' 720w, ' + this.data.article.media_alt_prefix + '_medium.jpg' + ' 1300w, ' + this.data.article.media_alt_prefix + '_large.jpg 1920w' this.data.article.pictureAvif = this.data.article.media_alt_prefix + '_small.avif' + ' 720w, ' + this.data.article.media_alt_prefix + '_medium.avif' + ' 1300w, ' + this.data.article.media_alt_prefix + '_large.avif 1920w' this.data.article.pictureCover = '(max-width: 840px) calc(100vw - 82px), ' + '758px' } else { this.data.article.pictureFallback = null this.data.article.pictureJpeg = null this.data.article.pictureAvif = null this.data.article.pictureCover = null } if (!this.data.article) { this.error = 'Article not found' } }, (err) => { this.error = err.message }) .then(() => { clearTimeout(this.showLoading) this.showLoading = null this.loading = false m.redraw() }) }, view: function(vnode) { let article = this.data.article return ( this.loading ? m('article.article', m('div.loading-spinner')) : this.error ? m('div.error-wrapper', m('div.error', { onclick: function() { vnode.state.error = '' vnode.state.fetchArticle(vnode) }, }, 'Article error: ' + this.error)) : m('article.article', [ article.page_path ? m('div.goback', ['« ', m(m.route.Link, { href: '/page/' + article.page_path }, article.page_name)]) : null, m('header', m('h1', article.name)), m('.fr-view', [ article.pictureFallback ? m('a.cover', { rel: 'noopener', href: article.media_path, }, [ m('picture', [ m('source', { srcset: article.pictureAvif, sizes: article.pictureCover, type: 'image/avif', }), m('img', { srcset: article.pictureJpeg, sizes: article.pictureCover, alt: 'Image for news item ' + article.name, src: article.pictureFallback, }), ]), ]) : null, article.content.blocks.map(block => { return m(EditorBlock, { block: block }) }), this.data.files.map(function(file) { return m(Fileinfo, { file: file }) }), m('div.entrymeta', [ 'Posted ', article.page_path ? [ 'in', m(m.route.Link, { href: '/page/' + article.page_path }, article.page_name) ] : '', 'at ' + (article.publish_at.replace('T', ' ').split('.')[0]).substr(0, 16), ' by ' + (article.admin_name || 'Admin'), ]), ]), Authentication.currentUser ? m('div.admin-actions', [ m('span', 'Admin controls:'), m(m.route.Link, { href: '/admin/articles/' + article.path }, 'Edit article'), ]) : null, this.showcomments ? m('div.commentcontainer', [ m('div#disqus_thread', { oncreate: function() { let fullhost = window.location.protocol + '//' + window.location.host /*eslint-disable */ window.disqus_config = function () { this.page.url = fullhost + '/article/' + vnode.state.article.path this.page.identifier = 'article-' + vnode.state.article.id }; (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://nfp-moe.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })() /*eslint-enable */ }}, m('div.loading-spinner')), ]) : m('button.opencomments', { onclick: function() { vnode.state.showcomments = true }, }, 'Open comment discussion'), ]) ) }, } module.exports = Article /*
*/