Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

next.js migration #2802

Open
wants to merge 55 commits into
base: main
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
5823a00
next.js migration
ChelseaKR Aug 21, 2024
f505e96
Update .gitignore
scwambach Aug 21, 2024
b28d081
Update .gitignore
scwambach Aug 21, 2024
81c5b9e
converted from GIF labeled as a PNG to a true PNG
ChelseaKR Aug 23, 2024
451d183
latest
ChelseaKR Aug 23, 2024
2404067
added a proxy to redirect API calls
ChelseaKR Sep 30, 2024
a092c62
layout cleanup
scwambach Nov 4, 2024
afd5c18
Update page.tsx
scwambach Nov 4, 2024
04c963f
data
scwambach Nov 4, 2024
d8b89f4
Update homePage.ts
scwambach Nov 4, 2024
49d9015
types organization
scwambach Nov 4, 2024
cc79ffa
test fixes
scwambach Nov 4, 2024
14a6198
various updates
scwambach Nov 4, 2024
3e2b9bb
Update _fancyBanner.scss
scwambach Nov 4, 2024
3e86eb7
Update _fancyBanner.scss
scwambach Nov 4, 2024
1c371f8
content and typography
scwambach Nov 4, 2024
144a84a
Update Footer.tsx
scwambach Nov 6, 2024
c649c4f
industry selector
scwambach Nov 6, 2024
6ae1b49
cp landing page
scwambach Nov 6, 2024
aafb96e
tooltip fix
scwambach Nov 6, 2024
be5715b
layout changes
scwambach Nov 7, 2024
08cf7bf
manufacturing select
scwambach Nov 7, 2024
b074139
Update ManufacturingSelect.tsx
scwambach Nov 7, 2024
dd1f94b
Update _manufacturingSelect.scss
scwambach Nov 7, 2024
9e9614f
occupationGroups
scwambach Nov 7, 2024
98a7d57
Update OccupationGroups.tsx
scwambach Nov 7, 2024
b102bd5
Update ManufacturingSelect.tsx
scwambach Nov 7, 2024
f75a2e9
career pathways
scwambach Nov 12, 2024
b8a08ce
backend update
scwambach Nov 12, 2024
884a176
occupation details
scwambach Nov 12, 2024
559d775
training fix
scwambach Nov 13, 2024
1c0a2fe
Update CardSlider.tsx
scwambach Nov 13, 2024
a6e0eb4
Update CardSlider.tsx
scwambach Nov 13, 2024
e86a74e
Update CardSlider.tsx
scwambach Nov 13, 2024
f1c756b
Update IntroBlocks.tsx
scwambach Nov 13, 2024
4b6415c
button on training page
scwambach Nov 18, 2024
ed6a2e8
sass and backend update
scwambach Nov 19, 2024
987fa35
pageProp fixes
scwambach Nov 19, 2024
4c1c875
Merge pull request #3022 from newjersey/production-design-updates
ChelseaKR Nov 19, 2024
722f096
search fix
scwambach Dec 4, 2024
55f5a69
program banner
scwambach Dec 5, 2024
8065c9d
content start
scwambach Dec 5, 2024
d5e8e27
styles
scwambach Dec 6, 2024
9ef2249
Update Content.tsx
scwambach Dec 6, 2024
e409452
code cleanup
scwambach Dec 6, 2024
8818d1e
Update DrawerButton.tsx
scwambach Dec 6, 2024
1127de2
Update _drawer.scss
scwambach Dec 6, 2024
aa651dd
Update _infoBlocks.scss
scwambach Dec 6, 2024
48751be
Update _buttons.scss
scwambach Dec 6, 2024
fb0b832
notes
scwambach Dec 11, 2024
35db192
quick fixes
scwambach Dec 11, 2024
a66c408
Merge pull request #3093 from newjersey/ce-styles
ChelseaKR Jan 3, 2025
adf89b9
NJWE-2519 / basic content (#3153)
scwambach Jan 16, 2025
b7cd730
Njwe 2406/scott training results page (#3169)
scwambach Jan 21, 2025
92ae718
bug fixes (#3187)
scwambach Jan 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
pageProp fixes
scwambach committed Nov 19, 2024
commit 987fa35fa8a0fe83f61ce83c0e2b55b1e5ddc482
10 changes: 6 additions & 4 deletions src/app/career-pathways/[industry]/page.tsx
Original file line number Diff line number Diff line change
@@ -54,11 +54,13 @@ export async function generateMetadata() {
export default async function PathwayPage({
params,
}: {
params: {
industry: string;
};
params: Promise<{ industry: string }>; // Adjust the type to expect a Promise
}) {
const { industryCollection } = (await getIndustryData(params.industry)) as {
const resolvedParams = await params; // Await the params before accessing them

const { industryCollection } = (await getIndustryData(
resolvedParams.industry
)) as {
industryCollection: {
items: IndustryProps[];
};
80 changes: 43 additions & 37 deletions src/app/occupation/[code]/page.tsx
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ import Script from "next/script";

async function getData(soc: string) {
const pageData = await fetch(
`${process.env.REACT_APP_API_URL}/api/occupations/${soc}`,
`${process.env.REACT_APP_API_URL}/api/occupations/${soc}`
);

return {
@@ -33,16 +33,19 @@ export const generateMetadata = async ({
params,
searchParams,
}: {
searchParams: {
searchParams: Promise<{
mockData: string;
};
params: { code: string };
}>;
params: Promise<{ code: string }>;
}) => {
const resolvedParams = await params;
const resolvedSearchParams = await searchParams;

const pageData = await fetch(
`${process.env.REACT_APP_API_URL}/api/occupations/${params.code}`,
`${process.env.REACT_APP_API_URL}/api/occupations/${resolvedParams.code}`
);

if (pageData.status !== 200 && !searchParams.mockData) {
if (pageData.status !== 200 && !resolvedSearchParams.mockData) {
notFound();
}

@@ -66,14 +69,17 @@ export default async function OccupationPage({
searchParams,
params,
}: {
searchParams: {
searchParams: Promise<{
mockData: string;
};
params: { code: string };
}>;
params: Promise<{ code: string }>;
}) {
const { pageData } = await getData(params.code);
const resolvedParams = await params;
const resolvedSearchParams = await searchParams;

if (pageData.status !== 200 && !searchParams.mockData) {
const { pageData } = await getData(resolvedParams.code);

if (pageData.status !== 200 && !resolvedSearchParams.mockData) {
notFound();
}

@@ -87,7 +93,7 @@ export default async function OccupationPage({
} as any;

const occupation =
(mockDataMap[searchParams.mockData] as OccupationPageProps) ||
(mockDataMap[resolvedSearchParams.mockData] as OccupationPageProps) ||
occupationData;

const tasks = occupation.tasks?.map((task: {}) => {
@@ -103,11 +109,11 @@ export default async function OccupationPage({
? occupation.counties.length === 1
? occupation.counties[0] + " County"
: occupation.counties.length === 2
? occupation.counties.join(" and ") + " Counties"
: occupation.counties.slice(0, -1).join(", ") +
", and " +
occupation.counties.slice(-1) +
" Counties"
? occupation.counties.join(" and ") + " Counties"
: occupation.counties.slice(0, -1).join(", ") +
", and " +
occupation.counties.slice(-1) +
" Counties"
: "N/A";

const generateJsonLd = {
@@ -161,7 +167,9 @@ export default async function OccupationPage({
}}
infoBlocks={{
titleBlock: {
copy: `In-Demand in ${occupation.inDemand ? "all of New Jersey" : counties}.`,
copy: `In-Demand in ${
occupation.inDemand ? "all of New Jersey" : counties
}.`,
message: "This training may be eligible for funding from your ",
link: {
copy: "One-Stop Career Center.",
@@ -265,25 +273,23 @@ export default async function OccupationPage({
/>
{occupation.relatedTrainings.length > 0 ? (
<>
{occupation.relatedTrainings
?.splice(0, 3)
.map((training) => (
<ResultCard
key={training.id}
title={training.name}
trainingId={training.id}
url={`/training/${training.id}`}
education={training.providerName}
percentEmployed={training.percentEmployed || undefined}
cipDefinition={training.cipDefinition}
cost={training.totalCost}
timeToComplete={training.calendarLength}
inDemandLabel={
training.inDemand ? "In Demand" : undefined
}
location={`${training.city}, ${training.county}`}
/>
))}
{occupation.relatedTrainings?.splice(0, 3).map((training) => (
<ResultCard
key={training.id}
title={training.name}
trainingId={training.id}
url={`/training/${training.id}`}
education={training.providerName}
percentEmployed={training.percentEmployed || undefined}
cipDefinition={training.cipDefinition}
cost={training.totalCost}
timeToComplete={training.calendarLength}
inDemandLabel={
training.inDemand ? "In Demand" : undefined
}
location={`${training.city}, ${training.county}`}
/>
))}
</>
) : (
"This data is not yet available for this occupation."
13 changes: 8 additions & 5 deletions src/app/support-resources/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -45,18 +45,20 @@ async function getData(slug: string) {
},
audience: {
items: [...audience.items].filter((tag) =>
usedAudience.includes(tag.title),
usedAudience.includes(tag.title)
),
},
cta,
};
}

export const generateMetadata = async ({
params: { slug },
params,
}: {
params: { slug: string };
params: Promise<{ slug: string }>;
}) => {
const { slug } = await params;

const data = (await getData(slug)) as ResourceCategoryPageProps;

if (data.page.items.length === 0) {
@@ -78,10 +80,11 @@ export const generateMetadata = async ({
export const revalidate = 1800;

export default async function ResourcesPage({
params: { slug },
params,
}: {
params: { slug: string };
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
const data = (await getData(slug)) as ResourceCategoryPageProps;

if (data.page.items.length === 0) {
14 changes: 8 additions & 6 deletions src/app/training/[code]/Content.tsx
Original file line number Diff line number Diff line change
@@ -11,9 +11,7 @@ import { Flex } from "@components/utility/Flex";
import { Tooltip } from "@components/utility/Tooltip";
import {
Baby,
Book,
BookBookmark,
Bookmark,
Briefcase,
CalendarBlank,
Clock,
@@ -24,7 +22,6 @@ import {
ListBullets,
MapPin,
Moon,
QrCode,
User,
WheelchairMotion,
} from "@phosphor-icons/react";
@@ -53,7 +50,8 @@ const Content = ({ training }: { training: TrainingProps }) => {
const componentRef = useRef<HTMLDivElement>(null);

const printReactContent = useReactToPrint({
content: () => componentRef.current,
pageStyle: "@page { size: auto; margin: 20mm; }",
documentTitle: "Training Content",
});

const [copy, setCopy] = useState<Copy | null>(null);
@@ -262,7 +260,9 @@ const Content = ({ training }: { training: TrainingProps }) => {
}
infoBlocks={{
titleBlock: {
copy: `In-Demand in ${training.inDemand ? "all of New Jersey" : counties}.`,
copy: `In-Demand in ${
training.inDemand ? "all of New Jersey" : counties
}.`,
message: "This training may be eligible for funding from your ",
link: {
copy: "One-Stop Career Center.",
@@ -356,7 +356,9 @@ const Content = ({ training }: { training: TrainingProps }) => {
<span>CIP Code: </span>
</Button>
<a
href={`https://nces.ed.gov/ipeds/cipcode/cipdetail.aspx?y=56&cip=${formatCip(training.cipDefinition.cipcode)}`}
href={`https://nces.ed.gov/ipeds/cipcode/cipdetail.aspx?y=56&cip=${formatCip(
training.cipDefinition.cipcode
)}`}
target="_blank"
rel="noopener noreferrer"
>
12 changes: 7 additions & 5 deletions src/app/training/[code]/page.tsx
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@ import { TrainingProps } from "@utils/types";

async function getData(soc: string) {
const pageData = await fetch(
`${process.env.REACT_APP_API_URL}/api/trainings/${soc}`,
`${process.env.REACT_APP_API_URL}/api/trainings/${soc}`
);

if (pageData.status !== 200) {
@@ -21,10 +21,11 @@ export const revalidate = 1800;
export const generateMetadata = async ({
params,
}: {
params: { code: string };
params: Promise<{ code: string }>;
}) => {
const resolvedParams = await params;
const pageData = await fetch(
`${process.env.REACT_APP_API_URL}/api/trainings/${params.code}`,
`${process.env.REACT_APP_API_URL}/api/trainings/${resolvedParams.code}`
);

if (pageData.status !== 200) {
@@ -45,9 +46,10 @@ export const generateMetadata = async ({
export default async function TrainingPage({
params,
}: {
params: { code: string };
params: Promise<{ code: string }>;
}) {
const { pageData } = await getData(params.code);
const resolvedParams = await params;
const { pageData } = await getData(resolvedParams.code);

if (pageData.status !== 200) {
notFound();
17 changes: 11 additions & 6 deletions src/app/training/search/page.tsx
Original file line number Diff line number Diff line change
@@ -7,13 +7,15 @@ export const revalidate = 0;
export const generateMetadata = async ({
searchParams,
}: {
searchParams: {
searchParams: Promise<{
[key: string]: string;
};
}>;
}) => {
const resolvedSearchParams = await searchParams;

return {
title: `${
searchParams.q ? `Results for "${searchParams.q}" | ` : ""
resolvedSearchParams.q ? `Results for "${resolvedSearchParams.q}" | ` : ""
}Search | ${process.env.REACT_APP_SITE_NAME}`,
openGraph: {
images: [globalOgImage.src],
@@ -25,11 +27,14 @@ export const generateMetadata = async ({
};

export default async function SearchPage(props: {
searchParams: {
searchParams: Promise<{
[key: string]: string;
};
}>;
}) {
const searchProps = await getSearchData(props);
const resolvedSearchParams = await props.searchParams;
const searchProps = await getSearchData({
searchParams: resolvedSearchParams,
});

const {
pageData = [],
5 changes: 3 additions & 2 deletions src/components/blocks/FancyBanner.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"use client";
import { Button } from "@components/modules/Button";
import { ContentfulRichText } from "@components/modules/ContentfulRichText";
import { ResponsiveImage } from "@components/modules/ResponsiveImage";
import { parseMarkdownToHTML } from "@utils/parseMarkdownToHTML";
import { PageBannerProps } from "@utils/types";
@@ -22,7 +21,9 @@ export const FancyBanner = ({
{message && (
<div
className="message"
dangerouslySetInnerHTML={{ __html: parseMarkdownToHTML(message) }}
dangerouslySetInnerHTML={{
__html: parseMarkdownToHTML(message as string),
}}
/>
)}
{buttonCopy && (
7 changes: 5 additions & 2 deletions src/components/modules/Spinner.tsx
Original file line number Diff line number Diff line change
@@ -9,9 +9,12 @@ interface SpinnerProps {

const Spinner = ({ className, style, size = 50, color }: SpinnerProps) => {
return (
<div style={style} className={`spinner${className ? ` ${className}` : ""}`}>
<span
style={style}
className={`spinner${className ? ` ${className}` : ""}`}
>
<SpinnerGap size={size} color={color} />
</div>
</span>
);
};