Three content areas: Tips, News, Modules
This commit is contained in:
1 parent
e577e52a08
commit
309cd7a381
5 files changed
+50
-79
No files matched your search
+23
-49
@@ -1,13 +1,12 @@
|
||||
/* The OC Guy — post feed.
|
||||
One manifest (data/posts.json) written by scripts/sync_posts.py, three views:
|
||||
Tips & Tricks, Community news and the Blog. Search is client-side over
|
||||
headline + teaser + category, the same technique as blog/index.json on
|
||||
odoo4projects.com. No JS, no feed: the sections say so instead of lying. */
|
||||
One manifest (data/posts.json) written by scripts/sync_posts.py, three views that are also
|
||||
the three categories: Tips & Tricks, News, Modules. A post appears in exactly one of them,
|
||||
because the category is the area. No JS, no feed: the sections say so instead of lying. */
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var SOURCE = 'data/posts.json';
|
||||
var BADGE = { tips: 'Tips & Tricks', news: 'Community news', blog: 'Blog' };
|
||||
var BADGE = { tips: 'Tips & Tricks', news: 'News', modules: 'Modules' };
|
||||
|
||||
function el(tag, cls, text) {
|
||||
var n = document.createElement(tag);
|
||||
@@ -32,9 +31,11 @@
|
||||
function emptyState(node, kind) {
|
||||
node.textContent = '';
|
||||
var box = el('p', 'feed-empty');
|
||||
box.textContent = kind === 'news'
|
||||
? 'No community news published yet. Posts from the daily feed land here.'
|
||||
: 'Nothing published in this section yet.';
|
||||
box.textContent = kind === 'modules'
|
||||
? 'No module write-ups yet. Posts in the Modules category land here.'
|
||||
: kind === 'news'
|
||||
? 'No news published yet. Posts from the daily feed land here.'
|
||||
: 'Nothing published in this section yet.';
|
||||
node.appendChild(box);
|
||||
}
|
||||
|
||||
@@ -57,31 +58,9 @@
|
||||
return a;
|
||||
}
|
||||
|
||||
function newsRow(p) {
|
||||
var li = el('li');
|
||||
var when = el('span', 'news-date');
|
||||
var t = el('time');
|
||||
t.dateTime = p.date;
|
||||
t.textContent = fmtDate(p.date);
|
||||
when.appendChild(t);
|
||||
|
||||
var body = el('div', 'news-body');
|
||||
var h3 = el('h3');
|
||||
var a = el('a', null, p.headline);
|
||||
a.href = p.link;
|
||||
h3.appendChild(a);
|
||||
body.appendChild(h3);
|
||||
body.appendChild(el('p', null, p.teaser));
|
||||
|
||||
li.appendChild(when);
|
||||
li.appendChild(body);
|
||||
li.appendChild(el('span', 'news-source', p.category === 'tips' ? 'Tips & Tricks' : 'Community'));
|
||||
return li;
|
||||
}
|
||||
|
||||
function render(view, posts, term) {
|
||||
var list = posts.filter(function (p) {
|
||||
return (view.all || p.category === view.category) && matches(p, term);
|
||||
return p.category === view.category && matches(p, term);
|
||||
});
|
||||
var node = view.node;
|
||||
if (view.countBox) {
|
||||
@@ -92,17 +71,12 @@
|
||||
return;
|
||||
}
|
||||
node.textContent = '';
|
||||
if (view.kind === 'news') {
|
||||
list.slice(0, view.limit || 5).forEach(function (p) { node.appendChild(newsRow(p)); });
|
||||
} else {
|
||||
list.slice(0, view.limit || 50).forEach(function (p) { node.appendChild(card(p)); });
|
||||
}
|
||||
if (view.count) view.count.textContent = String(list.length);
|
||||
list.slice(0, view.limit || 50).forEach(function (p) { node.appendChild(card(p)); });
|
||||
}
|
||||
|
||||
function pickCategory(p) {
|
||||
var c = (p.category || 'blog').toLowerCase();
|
||||
return BADGE[c] ? c : 'blog';
|
||||
var c = (p.category || 'news').toLowerCase();
|
||||
return BADGE[c] ? c : 'news';
|
||||
}
|
||||
|
||||
fetch(SOURCE + '?_=' + Date.now())
|
||||
@@ -117,12 +91,14 @@
|
||||
});
|
||||
|
||||
var views = [
|
||||
{ node: document.getElementById('tipsGrid'), category: 'tips', kind: 'cards',
|
||||
search: document.getElementById('tipsSearch'), count: document.getElementById('tipsCount'), limit: 3 },
|
||||
{ node: document.getElementById('newsList'), category: 'news', kind: 'news',
|
||||
search: document.getElementById('newsSearch'), count: document.getElementById('newsCount'), limit: 6 },
|
||||
{ node: document.getElementById('blogGrid'), category: 'blog', kind: 'cards', all: true,
|
||||
search: document.getElementById('blogSearch'), count: document.getElementById('blogCount'), limit: 60 }
|
||||
{ node: document.getElementById('tipsGrid'), category: 'tips', kind: 'tips',
|
||||
search: document.getElementById('tipsSearch'),
|
||||
count: document.getElementById('tipsCount'), limit: 3 },
|
||||
{ node: document.getElementById('newsGrid'), category: 'news', kind: 'news',
|
||||
search: document.getElementById('newsSearch'),
|
||||
count: document.getElementById('newsCount'), limit: 60 },
|
||||
{ node: document.getElementById('modulesGrid'), category: 'modules', kind: 'modules',
|
||||
search: null, count: null, limit: 6 }
|
||||
].filter(function (v) { return v.node; });
|
||||
|
||||
views.forEach(function (v) {
|
||||
@@ -137,15 +113,13 @@
|
||||
}
|
||||
});
|
||||
|
||||
/* posts tagged both tips and blog are listed twice on purpose:
|
||||
the sections are channels, not storage. */
|
||||
var total = document.getElementById('feedTotal');
|
||||
if (total) total.textContent = String(posts.length);
|
||||
})
|
||||
.catch(function () {
|
||||
['tipsGrid', 'newsList', 'blogGrid'].forEach(function (id) {
|
||||
['tipsGrid', 'newsGrid', 'modulesGrid'].forEach(function (id) {
|
||||
var n = document.getElementById(id);
|
||||
if (n) emptyState(n, id === 'newsList' ? 'news' : 'cards');
|
||||
if (n) emptyState(n, id.replace('Grid', '').toLowerCase());
|
||||
});
|
||||
});
|
||||
})();
|
||||
Reference in new issue
Block a user