diff --git a/app/composables/useJournalItemList.ts b/app/composables/useJournalItemList.ts new file mode 100644 index 0000000..6962feb --- /dev/null +++ b/app/composables/useJournalItemList.ts @@ -0,0 +1,23 @@ +// The ItemList node of a listing page (index, category, tag, author; D-43): +// the posts shown, added to the page's one JSON-LD @graph through +// vue-seo-layer's useSchemaNode, so the page still has one JSON-LD script. +// The URLs are absolute on the CMS's site URL when the page has a resolve +// answer, else on the request's origin. + +import type { JournalPageMeta, JournalPost } from '../utils/types.ts' +import { journalItemList, journalSiteOrigin } from '../utils/seo.ts' + +export function useJournalItemList(posts: () => readonly JournalPost[] | null | undefined, meta: () => JournalPageMeta | null | undefined): void { + const answer = useSeoAnswer() + const route = useRoute() + const links = useJournalLinks() + const request = useRequestURL() + useSchemaNode(() => { + const a = answer.value?.action === 'ok' ? answer.value : null + const origin = journalSiteOrigin(a?.url, request.origin) + const pageUrl = a?.url && /^https?:\/\//i.test(a.url) ? a.url : `${origin}${route.fullPath}` + const m = meta() + const first = m ? (Math.max(1, m.current_page) - 1) * Math.max(1, m.per_page) + 1 : 1 + return journalItemList(pageUrl, origin, (posts() ?? []).map((p) => links.postLink(p.slug)), first) + }) +} diff --git a/app/journal-pages/AuthorPage.vue b/app/journal-pages/AuthorPage.vue index c2a6d1e..38e9d68 100644 --- a/app/journal-pages/AuthorPage.vue +++ b/app/journal-pages/AuthorPage.vue @@ -40,6 +40,7 @@ const name = `${author.first_name} ${author.last_name}`.trim() || author.slug const title = listTitle(t('journal.author.title', { name }), page, t('journal.pagination.pageTitle', { page })) useSeoMeta({ title, ogTitle: title, ogType: 'profile' }) const crumbs = journalBreadcrumbsOn(cfg.breadcrumbs) +useJournalItemList(() => data.value?.posts.data, () => data.value?.posts.meta) if (author.slug !== param) { const path = links.authorLink(author.slug) diff --git a/app/journal-pages/CategoryPage.vue b/app/journal-pages/CategoryPage.vue index 65be227..a5c2462 100644 --- a/app/journal-pages/CategoryPage.vue +++ b/app/journal-pages/CategoryPage.vue @@ -46,6 +46,7 @@ const title = listTitle(data.value.category.name, page, t('journal.pagination.pa const description = data.value.category.description ?? undefined useSeoMeta({ title, ogTitle: title, description, ogDescription: description }) const crumbs = journalBreadcrumbsOn(cfg.breadcrumbs) +useJournalItemList(() => data.value?.posts.data, () => data.value?.posts.meta)