diff --git a/lib/collections.js b/lib/collections.js index 24cd241b..0e40e7dd 100644 --- a/lib/collections.js +++ b/lib/collections.js @@ -82,7 +82,7 @@ const topics = (collection) => { carry.set(`list/${(post.data?.list_slug ?? post.fileSlug)}`, post); break; case 'series': - carry.set(`series/${post.fileSlug}`, post); + carry.set(post.data?.sidebar_topic ?? `series/${post.fileSlug}`, post); break; case 'index': (post.data?.topic || post.data?.sidebar_topic || post.data?.sidebar_resource) && diff --git a/lib/filters.js b/lib/filters.js index 1dae5ad4..2112d27b 100644 --- a/lib/filters.js +++ b/lib/filters.js @@ -300,6 +300,18 @@ export const includesTag = memoize( {cacheKey: arguments_ => `${arguments_[0].join(',')}_${arguments_[1]}`} ); +/** + * Check if a given tag list contains a special tag. + * + * @param tags {Array} + * @param slug {string} + * @returns {boolean} + */ +export const includesSpecialTag = memoize( + (tags, slug) => tags.find(tag => tag.toLowerCase().startsWith(slug.toLowerCase())) !== undefined, + {cacheKey: arguments_ => `${arguments_[0].join(',')}_${arguments_[1]}`} +) + /** * Excludes special tags matching key. If key is empty then it excludes all special tags. * @@ -919,6 +931,9 @@ export const registerFilters = (eleventyConfig) => { eleventyConfig.addFilter('includesTag', includesTag); eleventyConfig.addFilter('excerpt', excerpt); + // This is used by page.njk for displaying the series sidebar component + eleventyConfig.addFilter('includesSpecialTag', includesSpecialTag); + // Used for debugging eleventyConfig.addFilter('debug', debug); eleventyConfig.addFilter('json', json); diff --git a/src/_includes/components/side-bars/series.njk b/src/_includes/components/side-bars/series.njk new file mode 100644 index 00000000..53483d03 --- /dev/null +++ b/src/_includes/components/side-bars/series.njk @@ -0,0 +1,16 @@ +{% set seriesId = tags | specialTagValue('series') %} +{% set seriesMeta = collections.topics | whereKeyEquals('topic', 'series/' + seriesId) | first %} + +
+
+

{{ seriesMeta.name }}

{{ seriesMeta.items.length }} {% if seriesMeta.items.length > 1 %}items{% else %}item{% endif %} +
+
    + {%- for post in seriesMeta.items -%} + {% include "components/post-list-line.njk" %} + {%- endfor -%} +
+ +
diff --git a/src/_includes/layouts/page.njk b/src/_includes/layouts/page.njk index a99c7793..5fc1bf86 100644 --- a/src/_includes/layouts/page.njk +++ b/src/_includes/layouts/page.njk @@ -14,6 +14,9 @@ {% endblock %} {% block sidebar %} + {% if tags | includesSpecialTag('series') %} + {% include 'components/side-bars/series.njk' %} + {% endif %} {% if sidebar_component %} {% set sidebar_component_include = 'components/side-bars/' + sidebar_component + '.njk' %} {% include sidebar_component_include %}