From 3b0514fc6b0e645ca8b533eb59a0b64a8cf41ecb Mon Sep 17 00:00:00 2001 From: DrMint <thomas@barillot.net> Date: Wed, 13 Apr 2022 03:06:51 +0200 Subject: [PATCH] Added more info for scans of covers --- src/components/Library/ScanSetCover.tsx | 92 +++++++++++++++++-- .../operations/getLibraryItemScans.graphql | 46 ++++++++-- src/pages/library/[slug]/index.tsx | 21 ++++- 3 files changed, 143 insertions(+), 16 deletions(-) diff --git a/src/components/Library/ScanSetCover.tsx b/src/components/Library/ScanSetCover.tsx index 468ada1..50540e2 100644 --- a/src/components/Library/ScanSetCover.tsx +++ b/src/components/Library/ScanSetCover.tsx @@ -1,5 +1,8 @@ +import Chip from "components/Chip"; import Img, { getAssetURL, ImageQuality } from "components/Img"; import LanguageSwitcher from "components/LanguageSwitcher"; +import RecorderChip from "components/RecorderChip"; +import ToolTip from "components/ToolTip"; import { useAppLayout } from "contexts/AppLayoutContext"; import { GetLibraryItemScansQuery, @@ -7,7 +10,7 @@ import { } from "graphql/generated"; import { useRouter } from "next/router"; import { AppStaticProps } from "queries/getAppStaticProps"; -import { getPreferredLanguage } from "queries/helpers"; +import { getPreferredLanguage, getStatusDescription } from "queries/helpers"; import { Dispatch, SetStateAction, useEffect, useMemo, useState } from "react"; interface Props { @@ -69,13 +72,13 @@ export default function ScanSetCover(props: Props): JSX.Element { const coverImages: UploadImageFragment[] = []; if (selectedScan?.obi_belt?.full?.data?.attributes) - coverImages.push(selectedScan.obi_belt?.full?.data?.attributes); + coverImages.push(selectedScan.obi_belt?.full?.data?.attributes); if (selectedScan?.obi_belt?.inside_full?.data?.attributes) - coverImages.push(selectedScan.obi_belt?.inside_full?.data?.attributes); + coverImages.push(selectedScan.obi_belt?.inside_full?.data?.attributes); if (selectedScan?.dust_jacket?.full?.data?.attributes) - coverImages.push(selectedScan.dust_jacket?.full?.data?.attributes); + coverImages.push(selectedScan.dust_jacket?.full?.data?.attributes); if (selectedScan?.dust_jacket?.inside_full?.data?.attributes) - coverImages.push(selectedScan.dust_jacket?.inside_full?.data?.attributes); + coverImages.push(selectedScan.dust_jacket?.inside_full?.data?.attributes); if (selectedScan?.cover?.full?.data?.attributes) coverImages.push(selectedScan.cover?.full?.data?.attributes); if (selectedScan?.cover?.inside_full?.data?.attributes) @@ -87,7 +90,16 @@ export default function ScanSetCover(props: Props): JSX.Element { {selectedScan && ( <div> <div className="flex flex-row flex-wrap place-items-center gap-6 text-base pt-10 first-of-type:pt-0"> - <h2 className="text-2xl">{"Cover"}</h2> + <h2 id={"cover"} className="text-2xl"> + {"Cover"} + </h2> + + <Chip> + {selectedScan.language?.data?.attributes?.code === + selectedScan.source_language?.data?.attributes?.code + ? "Scan" + : "Scanlation"} + </Chip> </div> <div className="flex flex-row flex-wrap gap-4 pb-6 place-items-center"> @@ -97,6 +109,74 @@ export default function ScanSetCover(props: Props): JSX.Element { localesIndex={selectedScanIndex} setLocalesIndex={setSelectedScanIndex} /> + + <div className="grid place-items-center place-content-center"> + <p className="font-headers">{langui.status}:</p> + <ToolTip + content={getStatusDescription(selectedScan.status, langui)} + maxWidth={"20rem"} + > + <Chip>{selectedScan.status}</Chip> + </ToolTip> + </div> + + {selectedScan.scanners && selectedScan.scanners.data.length > 0 && ( + <div> + <p className="font-headers">{"Scanners"}:</p> + <div className="grid place-items-center place-content-center gap-2"> + {selectedScan.scanners.data.map((scanner) => ( + <> + {scanner.attributes && ( + <RecorderChip + key={scanner.id} + langui={langui} + recorder={scanner.attributes} + /> + )} + </> + ))} + </div> + </div> + )} + + {selectedScan.cleaners && selectedScan.cleaners.data.length > 0 && ( + <div> + <p className="font-headers">{"Cleaners"}:</p> + <div className="grid place-items-center place-content-center gap-2"> + {selectedScan.cleaners.data.map((cleaner) => ( + <> + {cleaner.attributes && ( + <RecorderChip + key={cleaner.id} + langui={langui} + recorder={cleaner.attributes} + /> + )} + </> + ))} + </div> + </div> + )} + + {selectedScan.typesetters && + selectedScan.typesetters.data.length > 0 && ( + <div> + <p className="font-headers">{"Typesetters"}:</p> + <div className="grid place-items-center place-content-center gap-2"> + {selectedScan.typesetters.data.map((typesetter) => ( + <> + {typesetter.attributes && ( + <RecorderChip + key={typesetter.id} + langui={langui} + recorder={typesetter.attributes} + /> + )} + </> + ))} + </div> + </div> + )} </div> <div className="grid gap-8 items-end mobile:grid-cols-2 desktop:grid-cols-[repeat(auto-fill,_minmax(10rem,1fr))] pb-12 border-b-[3px] border-dotted last-of-type:border-0"> diff --git a/src/graphql/operations/getLibraryItemScans.graphql b/src/graphql/operations/getLibraryItemScans.graphql index 4a4b0fa..d2aaa8d 100644 --- a/src/graphql/operations/getLibraryItemScans.graphql +++ b/src/graphql/operations/getLibraryItemScans.graphql @@ -7,6 +7,45 @@ query getLibraryItemScans($slug: String, $language_code: String) { title subtitle images { + status + language { + data { + attributes { + code + } + } + } + source_language { + data { + attributes { + code + } + } + } + scanners { + data { + id + attributes { + ...recorderChip + } + } + } + cleaners { + data { + id + attributes { + ...recorderChip + } + } + } + typesetters { + data { + id + attributes { + ...recorderChip + } + } + } cover { full { data { @@ -55,13 +94,6 @@ query getLibraryItemScans($slug: String, $language_code: String) { } } } - language { - data { - attributes { - code - } - } - } } thumbnail { data { diff --git a/src/pages/library/[slug]/index.tsx b/src/pages/library/[slug]/index.tsx index 88958a6..f4b6c13 100644 --- a/src/pages/library/[slug]/index.tsx +++ b/src/pages/library/[slug]/index.tsx @@ -68,6 +68,16 @@ export default function LibrarySlug(props: Props): JSX.Element { const [lightboxImages, setLightboxImages] = useState([""]); const [lightboxIndex, setLightboxIndex] = useState(0); + let displayOpenScans = false; + if (item?.contents?.data) + for (const content of item.contents.data) { + if ( + content.attributes?.scan_set && + content.attributes.scan_set.length > 0 + ) + displayOpenScans = true; + } + const subPanel = ( <SubPanel> <ReturnButton @@ -201,10 +211,10 @@ export default function LibrarySlug(props: Props): JSX.Element { "relation-set") ) && ( <> - {item?.urls && item?.urls?.length ? ( + {item?.urls && item.urls.length ? ( <div className="flex flex-row place-items-center gap-3"> <p>Available at</p> - {item?.urls?.map((url) => ( + {item.urls.map((url) => ( <> {url?.url && ( <Button @@ -428,7 +438,12 @@ export default function LibrarySlug(props: Props): JSX.Element { {item?.contents && item.contents.data.length > 0 && ( <div id="contents" className="w-full grid place-items-center gap-8"> - <h2 className="text-2xl">{langui.contents}</h2> + <h2 className="text-2xl -mb-6">{langui.contents}</h2> + {displayOpenScans && ( + <Button href={`/library/${item.slug}/scans`}> + {langui.view_scans} + </Button> + )} <div className="grid gap-4 w-full"> {item.contents.data.map((content) => ( <ContentTOCLine