Switched to new content data model

This commit is contained in:
DrMint 2022-05-14 22:47:00 +02:00
parent 2e0af56aa8
commit 461bd08a3d
13 changed files with 461 additions and 568 deletions

View File

@ -39,12 +39,12 @@ export function ContentLine(props: Immutable<Props>): JSX.Element {
> >
<a> <a>
<h3 className="cursor-pointer" onClick={() => setOpened(!opened)}> <h3 className="cursor-pointer" onClick={() => setOpened(!opened)}>
{content.attributes.content?.data?.attributes?.titles?.[0] {content.attributes.content?.data?.attributes?.translations?.[0]
? prettyinlineTitle( ? prettyinlineTitle(
content.attributes.content.data.attributes.titles[0] content.attributes.content.data.attributes.translations[0]
?.pre_title, ?.pre_title,
content.attributes.content.data.attributes.titles[0]?.title, content.attributes.content.data.attributes.translations[0]?.title,
content.attributes.content.data.attributes.titles[0] content.attributes.content.data.attributes.translations[0]
?.subtitle ?.subtitle
) )
: prettySlug(content.attributes.slug, props.parentSlug)} : prettySlug(content.attributes.slug, props.parentSlug)}

View File

@ -55,10 +55,10 @@ export function ScanSet(props: Immutable<Props>): JSX.Element {
const [selectedScan, LanguageSwitcher] = useSmartLanguage({ const [selectedScan, LanguageSwitcher] = useSmartLanguage({
items: scanSet, items: scanSet,
languages: languages, languages: languages,
languageExtractor: (item) => item?.language?.data?.attributes?.code, languageExtractor: (item) => item.language?.data?.attributes?.code,
transform: (item) => { transform: (item) => {
const newItem = { ...item } as Props["scanSet"][number]; const newItem = { ...item } as Exclude<Props["scanSet"][number], null>;
newItem?.pages?.data.sort((a, b) => { newItem.pages?.data.sort((a, b) => {
if (a.attributes?.url && b.attributes?.url) { if (a.attributes?.url && b.attributes?.url) {
let aName = getAssetFilename(a.attributes.url); let aName = getAssetFilename(a.attributes.url);
let bName = getAssetFilename(b.attributes.url); let bName = getAssetFilename(b.attributes.url);

View File

@ -2,7 +2,7 @@ import { Chip } from "components/Chip";
import { Img } from "components/Img"; import { Img } from "components/Img";
import { InsetBox } from "components/InsetBox"; import { InsetBox } from "components/InsetBox";
import { Markdawn } from "components/Markdown/Markdawn"; import { Markdawn } from "components/Markdown/Markdawn";
import { GetContentQuery, UploadImageFragment } from "graphql/generated"; import { GetContentTextQuery, UploadImageFragment } from "graphql/generated";
import { AppStaticProps } from "graphql/getAppStaticProps"; import { AppStaticProps } from "graphql/getAppStaticProps";
import { prettyinlineTitle, prettySlug, slugify } from "helpers/formatters"; import { prettyinlineTitle, prettySlug, slugify } from "helpers/formatters";
import { getAssetURL, ImageQuality } from "helpers/img"; import { getAssetURL, ImageQuality } from "helpers/img";
@ -16,14 +16,14 @@ interface Props {
description?: string | null | undefined; description?: string | null | undefined;
type?: Exclude< type?: Exclude<
Exclude< Exclude<
GetContentQuery["contents"], GetContentTextQuery["contents"],
null | undefined null | undefined
>["data"][number]["attributes"], >["data"][number]["attributes"],
null | undefined null | undefined
>["type"]; >["type"];
categories?: Exclude< categories?: Exclude<
Exclude< Exclude<
GetContentQuery["contents"], GetContentTextQuery["contents"],
null | undefined null | undefined
>["data"][number]["attributes"], >["data"][number]["attributes"],
null | undefined null | undefined

View File

@ -14,7 +14,13 @@ query devGetContents {
id id
} }
} }
titles {
ranged_contents {
data {
id
}
}
translations {
language { language {
data { data {
id id
@ -22,18 +28,7 @@ query devGetContents {
} }
title title
description description
}
ranged_contents {
data {
id
}
}
text_set { text_set {
language {
data {
id
}
}
source_language { source_language {
data { data {
id id
@ -57,12 +52,8 @@ query devGetContents {
} }
text text
} }
video_set {
id
}
audio_set {
id
} }
thumbnail { thumbnail {
data { data {
id id

View File

@ -1,77 +0,0 @@
query getContent($slug: String, $language_code: String) {
contents(filters: { slug: { eq: $slug } }) {
data {
attributes {
slug
titles(filters: { language: { code: { eq: $language_code } } }) {
pre_title
title
subtitle
description
}
categories {
data {
id
attributes {
name
short
}
}
}
type {
data {
attributes {
slug
titles(filters: { language: { code: { eq: $language_code } } }) {
title
}
}
}
}
ranged_contents {
data {
id
attributes {
slug
scan_set {
id
}
library_item {
data {
attributes {
slug
title
subtitle
thumbnail {
data {
attributes {
...uploadImage
}
}
}
}
}
}
}
}
}
text_set {
id
}
video_set {
id
}
audio_set {
id
}
thumbnail {
data {
attributes {
...uploadImage
}
}
}
}
}
}
}

View File

@ -4,12 +4,7 @@ query getContentText($slug: String, $language_code: String) {
id id
attributes { attributes {
slug slug
titles {
pre_title
title
subtitle
description
}
categories { categories {
data { data {
id id
@ -56,9 +51,7 @@ query getContentText($slug: String, $language_code: String) {
} }
} }
} }
text_set { translations {
status
text
language { language {
data { data {
attributes { attributes {
@ -66,6 +59,13 @@ query getContentText($slug: String, $language_code: String) {
} }
} }
} }
pre_title
title
subtitle
description
text_set {
status
text
source_language { source_language {
data { data {
attributes { attributes {
@ -99,6 +99,8 @@ query getContentText($slug: String, $language_code: String) {
} }
notes notes
} }
}
thumbnail { thumbnail {
data { data {
attributes { attributes {
@ -110,7 +112,7 @@ query getContentText($slug: String, $language_code: String) {
data { data {
attributes { attributes {
slug slug
titles(filters: { language: { code: { eq: $language_code } } }) { translations {
pre_title pre_title
title title
subtitle subtitle
@ -149,7 +151,7 @@ query getContentText($slug: String, $language_code: String) {
data { data {
attributes { attributes {
slug slug
titles(filters: { language: { code: { eq: $language_code } } }) { translations {
pre_title pre_title
title title
subtitle subtitle

View File

@ -4,7 +4,14 @@ query getContents($language_code: String) {
id id
attributes { attributes {
slug slug
titles { translations {
language {
data {
attributes {
code
}
}
}
pre_title pre_title
title title
subtitle subtitle
@ -65,15 +72,6 @@ query getContents($language_code: String) {
id id
} }
} }
text_set {
id
}
video_set {
id
}
audio_set {
id
}
thumbnail { thumbnail {
data { data {
attributes { attributes {

View File

@ -362,22 +362,18 @@ query getLibraryItem($slug: String, $language_code: String) {
} }
} }
} }
titles( translations {
filters: { language: { code: { eq: $language_code } } } language {
) { data {
attributes {
code
}
}
}
pre_title pre_title
title title
subtitle subtitle
} }
text_set {
id
}
video_set {
id
}
audio_set {
id
}
} }
} }
} }

View File

@ -1,4 +1,4 @@
import { GetPostQuery } from "graphql/generated"; import { GetContentTextQuery, GetPostQuery } from "graphql/generated";
import React from "react"; import React from "react";
type Post = Exclude< type Post = Exclude<
@ -13,6 +13,18 @@ export interface PostWithTranslations extends Omit<Post, "translations"> {
translations: Exclude<Post["translations"], null | undefined>; translations: Exclude<Post["translations"], null | undefined>;
} }
type Content = Exclude<
Exclude<
GetContentTextQuery["contents"],
null | undefined
>["data"][number]["attributes"],
null | undefined
>;
export interface ContentWithTranslations extends Omit<Content, "translations"> {
translations: Exclude<Content["translations"], null | undefined>;
}
type ImmutableBlackList<T> = JSX.Element | React.ReactNode | Function; type ImmutableBlackList<T> = JSX.Element | React.ReactNode | Function;
export type Immutable<T> = { export type Immutable<T> = {

View File

@ -8,8 +8,12 @@ import { useEffect, useMemo, useState } from "react";
interface Props<T> { interface Props<T> {
items: Immutable<T[]>; items: Immutable<T[]>;
languages: AppStaticProps["languages"]; languages: AppStaticProps["languages"];
languageExtractor: (item: Immutable<T>) => string | undefined; languageExtractor: (
transform?: (item: Immutable<T>) => Immutable<T>; item: Exclude<Immutable<T>, null | undefined>
) => string | undefined;
transform?: (
item: Exclude<Immutable<T>, null | undefined>
) => Exclude<Immutable<T>, null | undefined>;
} }
function getPreferredLanguage( function getPreferredLanguage(
@ -45,8 +49,10 @@ export function useSmartLanguage<T>(
useEffect(() => { useEffect(() => {
items.map((elem, index) => { items.map((elem, index) => {
if (elem !== null && elem !== undefined) {
const result = languageExtractor(elem); const result = languageExtractor(elem);
if (result !== undefined) availableLocales.set(result, index); if (result !== undefined) availableLocales.set(result, index);
}
}); });
}, [availableLocales, items, languageExtractor]); }, [availableLocales, items, languageExtractor]);

View File

@ -13,7 +13,6 @@ import { PreviewLine } from "components/PreviewLine";
import { RecorderChip } from "components/RecorderChip"; import { RecorderChip } from "components/RecorderChip";
import { ThumbnailHeader } from "components/ThumbnailHeader"; import { ThumbnailHeader } from "components/ThumbnailHeader";
import { ToolTip } from "components/ToolTip"; import { ToolTip } from "components/ToolTip";
import { GetContentTextQuery } from "graphql/generated";
import { AppStaticProps, getAppStaticProps } from "graphql/getAppStaticProps"; import { AppStaticProps, getAppStaticProps } from "graphql/getAppStaticProps";
import { getReadySdk } from "graphql/sdk"; import { getReadySdk } from "graphql/sdk";
import { import {
@ -22,7 +21,7 @@ import {
prettySlug, prettySlug,
} from "helpers/formatters"; } from "helpers/formatters";
import { getStatusDescription } from "helpers/others"; import { getStatusDescription } from "helpers/others";
import { Immutable } from "helpers/types"; import { ContentWithTranslations, Immutable } from "helpers/types";
import { useMediaMobile } from "hooks/useMediaQuery"; import { useMediaMobile } from "hooks/useMediaQuery";
import { useSmartLanguage } from "hooks/useSmartLanguage"; import { useSmartLanguage } from "hooks/useSmartLanguage";
import { import {
@ -32,28 +31,19 @@ import {
} from "next"; } from "next";
interface Props extends AppStaticProps { interface Props extends AppStaticProps {
content: Exclude< content: ContentWithTranslations;
GetContentTextQuery["contents"],
null | undefined
>["data"][number]["attributes"];
contentId: Exclude<
GetContentTextQuery["contents"],
null | undefined
>["data"][number]["id"];
} }
export default function Content(props: Immutable<Props>): JSX.Element { export default function Content(props: Immutable<Props>): JSX.Element {
const { langui, content, languages } = props; const { langui, content, languages } = props;
const isMobile = useMediaMobile(); const isMobile = useMediaMobile();
const [selectedTextSet, LanguageSwitcher] = useSmartLanguage({ const [selectedTranslation, LanguageSwitcher] = useSmartLanguage({
items: content?.text_set, items: content.translations,
languages: languages, languages: languages,
languageExtractor: (item) => item?.language?.data?.attributes?.code, languageExtractor: (item) => item.language?.data?.attributes?.code,
}); });
const selectedTitle = content?.titles?.[0];
const subPanel = ( const subPanel = (
<SubPanel> <SubPanel>
<ReturnButton <ReturnButton
@ -64,22 +54,26 @@ export default function Content(props: Immutable<Props>): JSX.Element {
horizontalLine horizontalLine
/> />
{selectedTextSet?.source_language?.data?.attributes && ( {selectedTranslation?.text_set && (
<div className="grid gap-5"> <div className="grid gap-5">
<h2 className="text-xl"> <h2 className="text-xl">
{selectedTextSet.source_language.data.attributes.code === {selectedTranslation.text_set.source_language?.data?.attributes
selectedTextSet.language?.data?.attributes?.code ?.code === selectedTranslation.language?.data?.attributes?.code
? langui.transcript_notice ? langui.transcript_notice
: langui.translation_notice} : langui.translation_notice}
</h2> </h2>
{selectedTextSet.source_language.data.attributes.code !== {selectedTranslation.text_set.source_language?.data?.attributes
selectedTextSet.language?.data?.attributes?.code && ( ?.code &&
selectedTranslation.text_set.source_language.data.attributes
.code !==
selectedTranslation.language?.data?.attributes?.code && (
<div className="grid place-items-center gap-2"> <div className="grid place-items-center gap-2">
<p className="font-headers">{langui.source_language}:</p> <p className="font-headers">{langui.source_language}:</p>
<Chip> <Chip>
{prettyLanguage( {prettyLanguage(
selectedTextSet.source_language.data.attributes.code, selectedTranslation.text_set.source_language.data.attributes
.code,
languages languages
)} )}
</Chip> </Chip>
@ -90,19 +84,23 @@ export default function Content(props: Immutable<Props>): JSX.Element {
<p className="font-headers">{langui.status}:</p> <p className="font-headers">{langui.status}:</p>
<ToolTip <ToolTip
content={getStatusDescription(selectedTextSet.status, langui)} content={getStatusDescription(
selectedTranslation.text_set.status,
langui
)}
maxWidth={"20rem"} maxWidth={"20rem"}
> >
<Chip>{selectedTextSet.status}</Chip> <Chip>{selectedTranslation.text_set.status}</Chip>
</ToolTip> </ToolTip>
</div> </div>
{selectedTextSet.transcribers && {selectedTranslation.text_set.transcribers &&
selectedTextSet.transcribers.data.length > 0 && ( selectedTranslation.text_set.transcribers.data.length > 0 && (
<div> <div>
<p className="font-headers">{langui.transcribers}:</p> <p className="font-headers">{langui.transcribers}:</p>
<div className="grid place-items-center place-content-center gap-2"> <div className="grid place-items-center place-content-center gap-2">
{selectedTextSet.transcribers.data.map((recorder) => ( {selectedTranslation.text_set.transcribers.data.map(
(recorder) => (
<> <>
{recorder.attributes && ( {recorder.attributes && (
<RecorderChip <RecorderChip
@ -112,17 +110,19 @@ export default function Content(props: Immutable<Props>): JSX.Element {
/> />
)} )}
</> </>
))} )
)}
</div> </div>
</div> </div>
)} )}
{selectedTextSet.translators && {selectedTranslation.text_set.translators &&
selectedTextSet.translators.data.length > 0 && ( selectedTranslation.text_set.translators.data.length > 0 && (
<div> <div>
<p className="font-headers">{langui.translators}:</p> <p className="font-headers">{langui.translators}:</p>
<div className="grid place-items-center place-content-center gap-2"> <div className="grid place-items-center place-content-center gap-2">
{selectedTextSet.translators.data.map((recorder) => ( {selectedTranslation.text_set.translators.data.map(
(recorder) => (
<> <>
{recorder.attributes && ( {recorder.attributes && (
<RecorderChip <RecorderChip
@ -132,17 +132,19 @@ export default function Content(props: Immutable<Props>): JSX.Element {
/> />
)} )}
</> </>
))} )
)}
</div> </div>
</div> </div>
)} )}
{selectedTextSet.proofreaders && {selectedTranslation.text_set.proofreaders &&
selectedTextSet.proofreaders.data.length > 0 && ( selectedTranslation.text_set.proofreaders.data.length > 0 && (
<div> <div>
<p className="font-headers">{langui.proofreaders}:</p> <p className="font-headers">{langui.proofreaders}:</p>
<div className="grid place-items-center place-content-center gap-2"> <div className="grid place-items-center place-content-center gap-2">
{selectedTextSet.proofreaders.data.map((recorder) => ( {selectedTranslation.text_set.proofreaders.data.map(
(recorder) => (
<> <>
{recorder.attributes && ( {recorder.attributes && (
<RecorderChip <RecorderChip
@ -152,36 +154,33 @@ export default function Content(props: Immutable<Props>): JSX.Element {
/> />
)} )}
</> </>
))} )
)}
</div> </div>
</div> </div>
)} )}
{selectedTextSet.notes && ( {selectedTranslation.text_set.notes && (
<div> <div>
<p className="font-headers">{"Notes"}:</p> <p className="font-headers">{"Notes"}:</p>
<div className="grid place-items-center place-content-center gap-2"> <div className="grid place-items-center place-content-center gap-2">
<Markdawn text={selectedTextSet.notes} /> <Markdawn text={selectedTranslation.text_set.notes} />
</div> </div>
</div> </div>
)} )}
</div> </div>
)} )}
{selectedTextSet && content?.text_set && selectedTextSet.text && ( {selectedTranslation?.text_set?.text && (
<> <>
<HorizontalLine /> <HorizontalLine />
<TOC <TOC
text={selectedTextSet.text} text={selectedTranslation.text_set.text}
title={ title={prettyinlineTitle(
content.titles && content.titles.length > 0 && selectedTitle selectedTranslation.pre_title,
? prettyinlineTitle( selectedTranslation.title,
selectedTitle.pre_title, selectedTranslation.subtitle
selectedTitle.title, )}
selectedTitle.subtitle
)
: prettySlug(content.slug)
}
/> />
</> </>
)} )}
@ -190,7 +189,7 @@ export default function Content(props: Immutable<Props>): JSX.Element {
const contentPanel = ( const contentPanel = (
<ContentPanel> <ContentPanel>
<ReturnButton <ReturnButton
href={`/contents/${content?.slug}`} href={`/contents/${content.slug}`}
title={langui.content} title={langui.content}
langui={langui} langui={langui}
displayOn={ReturnButtonType.mobile} displayOn={ReturnButtonType.mobile}
@ -201,14 +200,10 @@ export default function Content(props: Immutable<Props>): JSX.Element {
<div className="grid place-items-center"> <div className="grid place-items-center">
<ThumbnailHeader <ThumbnailHeader
thumbnail={content.thumbnail?.data?.attributes} thumbnail={content.thumbnail?.data?.attributes}
pre_title={ pre_title={selectedTranslation?.pre_title}
selectedTitle?.pre_title ?? content.titles?.[0]?.pre_title title={selectedTranslation?.title}
} subtitle={selectedTranslation?.subtitle}
title={selectedTitle?.title ?? content.titles?.[0]?.title} description={selectedTranslation?.description}
subtitle={selectedTitle?.subtitle ?? content.titles?.[0]?.subtitle}
description={
selectedTitle?.description ?? content.titles?.[0]?.description
}
type={content.type} type={content.type}
categories={content.categories} categories={content.categories}
langui={langui} langui={langui}
@ -221,16 +216,16 @@ export default function Content(props: Immutable<Props>): JSX.Element {
<PreviewLine <PreviewLine
href={`/contents/${content.previous_recommended.data.attributes.slug}`} href={`/contents/${content.previous_recommended.data.attributes.slug}`}
pre_title={ pre_title={
content.previous_recommended.data.attributes.titles?.[0] content.previous_recommended.data.attributes.translations?.[0]
?.pre_title ?.pre_title
} }
title={ title={
content.previous_recommended.data.attributes.titles?.[0] content.previous_recommended.data.attributes.translations?.[0]
?.title ?? ?.title ??
prettySlug(content.previous_recommended.data.attributes.slug) prettySlug(content.previous_recommended.data.attributes.slug)
} }
subtitle={ subtitle={
content.previous_recommended.data.attributes.titles?.[0] content.previous_recommended.data.attributes.translations?.[0]
?.subtitle ?.subtitle
} }
thumbnail={ thumbnail={
@ -268,7 +263,7 @@ export default function Content(props: Immutable<Props>): JSX.Element {
<HorizontalLine /> <HorizontalLine />
<Markdawn text={selectedTextSet?.text ?? ""} /> <Markdawn text={selectedTranslation?.text_set?.text ?? ""} />
{content.next_recommended?.data?.attributes && ( {content.next_recommended?.data?.attributes && (
<> <>
@ -277,15 +272,17 @@ export default function Content(props: Immutable<Props>): JSX.Element {
<PreviewLine <PreviewLine
href={`/contents/${content.next_recommended.data.attributes.slug}`} href={`/contents/${content.next_recommended.data.attributes.slug}`}
pre_title={ pre_title={
content.next_recommended.data.attributes.titles?.[0] content.next_recommended.data.attributes.translations?.[0]
?.pre_title ?.pre_title
} }
title={ title={
content.next_recommended.data.attributes.titles?.[0]?.title ?? content.next_recommended.data.attributes.translations?.[0]
?.title ??
prettySlug(content.next_recommended.data.attributes.slug) prettySlug(content.next_recommended.data.attributes.slug)
} }
subtitle={ subtitle={
content.next_recommended.data.attributes.titles?.[0]?.subtitle content.next_recommended.data.attributes.translations?.[0]
?.subtitle
} }
thumbnail={ thumbnail={
content.next_recommended.data.attributes.thumbnail?.data content.next_recommended.data.attributes.thumbnail?.data
@ -325,7 +322,7 @@ export default function Content(props: Immutable<Props>): JSX.Element {
); );
let description = ""; let description = "";
if (content?.type?.data) { if (content.type?.data) {
description += `${langui.type}: `; description += `${langui.type}: `;
description += description +=
@ -334,7 +331,7 @@ export default function Content(props: Immutable<Props>): JSX.Element {
description += "\n"; description += "\n";
} }
if (content?.categories?.data && content.categories.data.length > 0) { if (content.categories?.data && content.categories.data.length > 0) {
description += `${langui.categories}: `; description += `${langui.categories}: `;
description += content.categories.data description += content.categories.data
.map((category) => category.attributes?.short) .map((category) => category.attributes?.short)
@ -345,15 +342,15 @@ export default function Content(props: Immutable<Props>): JSX.Element {
return ( return (
<AppLayout <AppLayout
navTitle={ navTitle={
content?.titles && content.titles.length > 0 && content.titles[0] selectedTranslation
? prettyinlineTitle( ? prettyinlineTitle(
content.titles[0].pre_title, selectedTranslation.pre_title,
content.titles[0].title, selectedTranslation.title,
content.titles[0].subtitle selectedTranslation.subtitle
) )
: prettySlug(content?.slug) : prettySlug(content.slug)
} }
thumbnail={content?.thumbnail?.data?.attributes ?? undefined} thumbnail={content.thumbnail?.data?.attributes ?? undefined}
contentPanel={contentPanel} contentPanel={contentPanel}
subPanel={subPanel} subPanel={subPanel}
description={description} description={description}
@ -372,12 +369,12 @@ export async function getStaticProps(
language_code: context.locale ?? "en", language_code: context.locale ?? "en",
}); });
if (!content.contents || content.contents.data.length === 0) if (!content.contents || !content.contents.data[0].attributes?.translations) {
return { notFound: true }; return { notFound: true };
}
const props: Props = { const props: Props = {
...(await getAppStaticProps(context)), ...(await getAppStaticProps(context)),
content: content.contents.data[0].attributes, content: content.contents.data[0].attributes as ContentWithTranslations,
contentId: content.contents.data[0].id,
}; };
return { return {
props: props, props: props,

View File

@ -111,12 +111,12 @@ export default function Contents(props: Immutable<Props>): JSX.Element {
<PreviewCard <PreviewCard
key={item.id} key={item.id}
href={`/contents/${item.attributes.slug}`} href={`/contents/${item.attributes.slug}`}
pre_title={item.attributes.titles?.[0]?.pre_title} pre_title={item.attributes.translations?.[0]?.pre_title}
title={ title={
item.attributes.titles?.[0]?.title ?? item.attributes.translations?.[0]?.title ??
prettySlug(item.attributes.slug) prettySlug(item.attributes.slug)
} }
subtitle={item.attributes.titles?.[0]?.subtitle} subtitle={item.attributes.translations?.[0]?.subtitle}
thumbnail={item.attributes.thumbnail?.data?.attributes} thumbnail={item.attributes.thumbnail?.data?.attributes}
thumbnailAspectRatio="3/2" thumbnailAspectRatio="3/2"
stackEffect={ stackEffect={
@ -171,18 +171,18 @@ export async function getStaticProps(
}); });
if (!contents.contents) return { notFound: true }; if (!contents.contents) return { notFound: true };
contents.contents.data.sort((a, b) => { contents.contents.data.sort((a, b) => {
const titleA = a.attributes?.titles?.[0] const titleA = a.attributes?.translations?.[0]
? prettyinlineTitle( ? prettyinlineTitle(
a.attributes.titles[0].pre_title, a.attributes.translations[0].pre_title,
a.attributes.titles[0].title, a.attributes.translations[0].title,
a.attributes.titles[0].subtitle a.attributes.translations[0].subtitle
) )
: a.attributes?.slug ?? ""; : a.attributes?.slug ?? "";
const titleB = b.attributes?.titles?.[0] const titleB = b.attributes?.translations?.[0]
? prettyinlineTitle( ? prettyinlineTitle(
b.attributes.titles[0].pre_title, b.attributes.translations[0].pre_title,
b.attributes.titles[0].title, b.attributes.translations[0].title,
b.attributes.titles[0].subtitle b.attributes.translations[0].subtitle
) )
: b.attributes?.slug ?? ""; : b.attributes?.slug ?? "";
return titleA.localeCompare(titleB); return titleA.localeCompare(titleB);

View File

@ -6,10 +6,7 @@ import {
ContentPanelWidthSizes, ContentPanelWidthSizes,
} from "components/Panels/ContentPanel"; } from "components/Panels/ContentPanel";
import { ToolTip } from "components/ToolTip"; import { ToolTip } from "components/ToolTip";
import { import { DevGetContentsQuery } from "graphql/generated";
DevGetContentsQuery,
Enum_Componentsetstextset_Status,
} from "graphql/generated";
import { AppStaticProps, getAppStaticProps } from "graphql/getAppStaticProps"; import { AppStaticProps, getAppStaticProps } from "graphql/getAppStaticProps";
import { getReadySdk } from "graphql/sdk"; import { getReadySdk } from "graphql/sdk";
import { Immutable } from "helpers/types"; import { Immutable } from "helpers/types";
@ -196,7 +193,7 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
}); });
} }
if (content.attributes.titles?.length === 0) { if (content.attributes.translations?.length === 0) {
report.lines.push({ report.lines.push({
subitems: [content.attributes.slug], subitems: [content.attributes.slug],
name: "No Titles", name: "No Titles",
@ -210,10 +207,10 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
} else { } else {
const titleLanguages: string[] = []; const titleLanguages: string[] = [];
content.attributes.titles?.map((title, titleIndex) => { content.attributes.translations?.map((translation, titleIndex) => {
if (title && content.attributes) { if (translation && content.attributes) {
if (title.language?.data?.id) { if (translation.language?.data?.id) {
if (title.language.data.id in titleLanguages) { if (translation.language.data.id in titleLanguages) {
report.lines.push({ report.lines.push({
subitems: [ subitems: [
content.attributes.slug, content.attributes.slug,
@ -228,7 +225,7 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
frontendUrl: frontendUrl, frontendUrl: frontendUrl,
}); });
} else { } else {
titleLanguages.push(title.language.data.id); titleLanguages.push(translation.language.data.id);
} }
} else { } else {
report.lines.push({ report.lines.push({
@ -245,7 +242,7 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
frontendUrl: frontendUrl, frontendUrl: frontendUrl,
}); });
} }
if (!title.description) { if (!translation.description) {
report.lines.push({ report.lines.push({
subitems: [ subitems: [
content.attributes.slug, content.attributes.slug,
@ -260,51 +257,8 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
frontendUrl: frontendUrl, frontendUrl: frontendUrl,
}); });
} }
}
});
}
if ( if (translation.text_set) {
content.attributes.text_set?.length === 0 &&
content.attributes.audio_set?.length === 0 &&
content.attributes.video_set?.length === 0
) {
report.lines.push({
subitems: [content.attributes.slug],
name: "No Sets",
type: "Missing",
severity: "Medium",
description: "The Content has no Sets.",
recommandation: "",
backendUrl: backendUrl,
frontendUrl: frontendUrl,
});
} else {
if (content.attributes.video_set?.length === 0) {
report.lines.push({
subitems: [content.attributes.slug],
name: "No Video Sets",
type: "Missing",
severity: "Very Low",
description: "The Content has no Video Sets.",
recommandation: "",
backendUrl: backendUrl,
frontendUrl: frontendUrl,
});
}
if (content.attributes.audio_set?.length === 0) {
report.lines.push({
subitems: [content.attributes.slug],
name: "No Audio Sets",
type: "Missing",
severity: "Very Low",
description: "The Content has no Audio Sets.",
recommandation: "",
backendUrl: backendUrl,
frontendUrl: frontendUrl,
});
}
if (content.attributes.text_set?.length === 0) {
report.lines.push({ report.lines.push({
subitems: [content.attributes.slug], subitems: [content.attributes.slug],
name: "No Text Set", name: "No Text Set",
@ -318,7 +272,7 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
} else { } else {
const textSetLanguages: string[] = []; const textSetLanguages: string[] = [];
content.attributes.text_set?.map((textSet, textSetIndex) => { /*
if (content.attributes && textSet) { if (content.attributes && textSet) {
if (textSet.language?.data?.id) { if (textSet.language?.data?.id) {
if (textSet.language.data.id in textSetLanguages) { if (textSet.language.data.id in textSetLanguages) {
@ -403,7 +357,8 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
} }
if ( if (
textSet.source_language?.data?.id === textSet.language?.data?.id textSet.source_language?.data?.id ===
textSet.language?.data?.id
) { ) {
if (textSet.transcribers?.data.length === 0) { if (textSet.transcribers?.data.length === 0) {
report.lines.push({ report.lines.push({
@ -480,8 +435,21 @@ function testingContent(contents: Immutable<Props["contents"]>): Report {
} }
} }
} }
*/
}
report.lines.push({
subitems: [content.attributes.slug],
name: "No Sets",
type: "Missing",
severity: "Medium",
description: "The Content has no Sets.",
recommandation: "",
backendUrl: backendUrl,
frontendUrl: frontendUrl,
}); });
} }
});
} }
} }
}); });