203 lines
7 KiB
JavaScript
203 lines
7 KiB
JavaScript
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
|
|
|
|
/*
|
|
<div id="disqus_thread"></div>
|
|
<script>
|
|
|
|
/**
|
|
* RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
|
|
* LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/
|
|
/*
|
|
var disqus_config = function () {
|
|
this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable
|
|
this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable
|
|
};
|
|
/
|
|
(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);
|
|
})();
|
|
</script>
|
|
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
|
*/
|