« get me outta code hell

hsmusic-wiki - HSMusic - static wiki software cataloguing collaborative creation
about summary refs log tree commit diff
path: root/src/content/dependencies/generateNewsIndexPage.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/content/dependencies/generateNewsIndexPage.js')
-rw-r--r--src/content/dependencies/generateNewsIndexPage.js93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/content/dependencies/generateNewsIndexPage.js b/src/content/dependencies/generateNewsIndexPage.js
new file mode 100644
index 0000000..539af80
--- /dev/null
+++ b/src/content/dependencies/generateNewsIndexPage.js
@@ -0,0 +1,93 @@
+import {sortChronologically} from '#sort';
+import {stitchArrays} from '#sugar';
+
+export default {
+  contentDependencies: [
+    'generatePageLayout',
+    'linkNewsEntry',
+    'transformContent',
+  ],
+
+  extraDependencies: ['html', 'language', 'wikiData'],
+
+  sprawl({newsData}) {
+    return {newsData};
+  },
+
+  query({newsData}) {
+    return {
+      entries:
+        sortChronologically(
+          newsData.slice(),
+          {latestFirst: true}),
+    };
+  },
+
+  relations(relation, query) {
+    const relations = {};
+
+    relations.layout =
+      relation('generatePageLayout');
+
+    relations.entryLinks =
+      query.entries
+        .map(entry => relation('linkNewsEntry', entry));
+
+    relations.viewRestLinks =
+      query.entries
+        .map(entry =>
+          (entry.content === entry.contentShort
+            ? null
+            : relation('linkNewsEntry', entry)));
+
+    relations.entryContents =
+      query.entries
+        .map(entry => relation('transformContent', entry.contentShort));
+
+    return relations;
+  },
+
+  data(query) {
+    return {
+      entryDates:
+        query.entries.map(entry => entry.date),
+
+      entryDirectories:
+        query.entries.map(entry => entry.directory),
+    };
+  },
+
+  generate(data, relations, {html, language}) {
+    return relations.layout.slots({
+      title: language.$('newsIndex.title'),
+      headingMode: 'sticky',
+
+      mainClasses: ['long-content', 'news-index'],
+      mainContent:
+        stitchArrays({
+          entryLink: relations.entryLinks,
+          viewRestLink: relations.viewRestLinks,
+          content: relations.entryContents,
+          date: data.entryDates,
+          directory: data.entryDirectories,
+        }).map(({entryLink, viewRestLink, content, date, directory}) =>
+            html.tag('article', {id: directory}, [
+              html.tag('h2', [
+                html.tag('time', language.formatDate(date)),
+                entryLink,
+              ]),
+
+              content,
+
+              viewRestLink
+                ?.slot('content', language.$('newsIndex.entry.viewRest')),
+            ])),
+
+      navLinkStyle: 'hierarchical',
+      navLinks: [
+        {auto: 'home'},
+        {auto: 'current'},
+      ],
+    });
+  },
+};