print page now includes all results for a given search
This commit is contained in:
parent
357faa5b18
commit
dc479b2f77
@ -1,34 +1,103 @@
|
|||||||
import { LinkIcon } from "@heroicons/react/20/solid";
|
import { LinkIcon } from "@heroicons/react/20/solid";
|
||||||
import { PrinterIcon } from "@heroicons/react/24/solid";
|
import { PrinterIcon } from "@heroicons/react/24/solid";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import { useRouter } from "next/router";
|
import router, { useRouter } from "next/router";
|
||||||
import ResourceTable from "~/components/ResourceTable";
|
import ResourceTable from "~/components/ResourceTable";
|
||||||
import { api } from "~/utils/api";
|
import { api } from "~/utils/api";
|
||||||
import { parseQueryData } from "~/utils/parseSearchForm";
|
import { parseQueryData } from "~/utils/parseSearchForm";
|
||||||
import Footer from "~/components/Footer";
|
import Footer from "~/components/Footer";
|
||||||
import Header from "~/components/Header";
|
import Header from "~/components/Header";
|
||||||
import { useState } from "react";
|
import { type Dispatch, type SetStateAction, useEffect, useState, FormEvent } from "react";
|
||||||
|
|
||||||
const Resources = () => {
|
/**
|
||||||
const router = useRouter();
|
* Quick extension of the resource table designed to query all elements so they can be printed
|
||||||
const [queryState, setQueryState] = useState(parseQueryData(router.query));
|
*/
|
||||||
|
const PrintResourceTable = ({
|
||||||
const currentPage = queryState.page;
|
totalResources,
|
||||||
|
setLoaded,
|
||||||
|
}: {
|
||||||
|
totalResources: number;
|
||||||
|
setLoaded: Dispatch<SetStateAction<boolean>>;
|
||||||
|
}) => {
|
||||||
|
const queryData = parseQueryData(router.query);
|
||||||
|
|
||||||
const resourceQuery = api.auditoryResource.search.useQuery({
|
const resourceQuery = api.auditoryResource.search.useQuery({
|
||||||
skip: (queryState.page - 1) * queryState.perPage,
|
skip: 0,
|
||||||
take: queryState.perPage,
|
take: totalResources,
|
||||||
ages: queryState.age,
|
ages: queryData.age,
|
||||||
platforms: queryState.platforms,
|
platforms: queryData.platforms,
|
||||||
skill_levels: queryState.skill_levels,
|
skill_levels: queryData.skill_levels,
|
||||||
skills: queryState.skills,
|
skills: queryData.skills,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (resourceQuery.data) {
|
||||||
|
setLoaded(true);
|
||||||
|
}
|
||||||
|
}, [resourceQuery, setLoaded]);
|
||||||
|
|
||||||
if (!resourceQuery.data) {
|
if (!resourceQuery.data) {
|
||||||
return <></>;
|
return <></>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const totalPages = Math.ceil(resourceQuery.data.count / queryState.perPage);
|
return (
|
||||||
|
<ResourceTable
|
||||||
|
resourcesPerPage={queryData.perPage}
|
||||||
|
resources={resourceQuery.data.resources}
|
||||||
|
totalPages={1}
|
||||||
|
query={router.query}
|
||||||
|
currentPage={1}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const Resources = () => {
|
||||||
|
const router = useRouter();
|
||||||
|
const [printMode, setPrintMode] = useState(false);
|
||||||
|
const [printPreviewLoaded, setPrintPreviewLoaded] = useState(false);
|
||||||
|
|
||||||
|
const queryData = parseQueryData(router.query);
|
||||||
|
const currentPage = queryData.page;
|
||||||
|
|
||||||
|
const resourceQuery = api.auditoryResource.search.useQuery({
|
||||||
|
skip: (queryData.page - 1) * queryData.perPage,
|
||||||
|
take: queryData.perPage,
|
||||||
|
ages: queryData.age,
|
||||||
|
platforms: queryData.platforms,
|
||||||
|
skill_levels: queryData.skill_levels,
|
||||||
|
skills: queryData.skills,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handlePrint = (event: Event) => {
|
||||||
|
if (!printMode) {
|
||||||
|
event.preventDefault();
|
||||||
|
setPrintMode(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener("beforeprint", handlePrint);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
window.removeEventListener("beforeprint", handlePrint);
|
||||||
|
};
|
||||||
|
}, [printMode]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (printPreviewLoaded && printMode) {
|
||||||
|
window.onafterprint = () => {
|
||||||
|
setPrintMode(false);
|
||||||
|
setPrintPreviewLoaded(false);
|
||||||
|
};
|
||||||
|
window.print();
|
||||||
|
}
|
||||||
|
}, [printPreviewLoaded, printMode]);
|
||||||
|
|
||||||
|
if (!resourceQuery.data) {
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalPages = Math.ceil(resourceQuery.data.count / queryData.perPage);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -56,15 +125,7 @@ const Resources = () => {
|
|||||||
<section className="mt-auto">
|
<section className="mt-auto">
|
||||||
<button
|
<button
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
const queryAllResources = { ...queryState };
|
setPrintMode(true);
|
||||||
queryAllResources.page = 1;
|
|
||||||
queryAllResources.perPage = resourceQuery.data.count;
|
|
||||||
|
|
||||||
setQueryState(queryAllResources);
|
|
||||||
window.onafterprint = () => {
|
|
||||||
setQueryState(parseQueryData(router.query));
|
|
||||||
};
|
|
||||||
window.print();
|
|
||||||
}}
|
}}
|
||||||
className="inline-block space-x-2 rounded-md border border-neutral-900 bg-yellow-200 px-4 py-2 align-middle font-semibold shadow shadow-black/50 duration-200 ease-out hover:bg-yellow-300 hover:shadow-md print:hidden"
|
className="inline-block space-x-2 rounded-md border border-neutral-900 bg-yellow-200 px-4 py-2 align-middle font-semibold shadow shadow-black/50 duration-200 ease-out hover:bg-yellow-300 hover:shadow-md print:hidden"
|
||||||
>
|
>
|
||||||
@ -73,13 +134,20 @@ const Resources = () => {
|
|||||||
</button>
|
</button>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
<ResourceTable
|
{printMode ? (
|
||||||
resourcesPerPage={queryState.perPage}
|
<PrintResourceTable
|
||||||
resources={resourceQuery.data.resources}
|
setLoaded={setPrintPreviewLoaded}
|
||||||
totalPages={totalPages}
|
totalResources={resourceQuery.data.count}
|
||||||
query={router.query}
|
/>
|
||||||
currentPage={currentPage}
|
) : (
|
||||||
/>
|
<ResourceTable
|
||||||
|
resourcesPerPage={queryData.perPage}
|
||||||
|
resources={resourceQuery.data.resources}
|
||||||
|
totalPages={totalPages}
|
||||||
|
query={router.query}
|
||||||
|
currentPage={currentPage}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</main>
|
</main>
|
||||||
<Footer />
|
<Footer />
|
||||||
</>
|
</>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user