From 6bc7bf2a4f8b162e506442b439383f5a78cb38c2 Mon Sep 17 00:00:00 2001 From: SongmingFan123 <121742950+SongmingFan@users.noreply.github.com> Date: Sun, 20 Jul 2025 20:47:13 -0400 Subject: [PATCH 1/5] Remove career page and references of it from the app --- public/data/job-openings.json | 98 ---------------- src/PolicyEngine.jsx | 3 - src/__tests__/pages/About.test.js | 7 -- src/layout/Header.jsx | 5 - src/pages/About.jsx | 11 +- src/pages/Jobs.jsx | 185 ------------------------------ 6 files changed, 1 insertion(+), 308 deletions(-) delete mode 100644 public/data/job-openings.json delete mode 100644 src/pages/Jobs.jsx diff --git a/public/data/job-openings.json b/public/data/job-openings.json deleted file mode 100644 index 95ebf9a29..000000000 --- a/public/data/job-openings.json +++ /dev/null @@ -1,98 +0,0 @@ -[ - { - "title": "Software Engineering Intern", - "type": "Internship", - "content": { - "summary": "Developing accessible policy analysis tools", - "location": "Remote (US-based preferred)", - "duration": "Spring, Summer, or Fall semester (possibility of extension)", - "description": "As a Software Engineering Intern at PolicyEngine, you will contribute to making policy analysis tools more accessible, from our web app users to our internal team of developers. This internship offers a unique opportunity to work on cutting-edge technology in the realm of public policy analysis.", - "responsibilities": [ - "Develop and enhance Python libraries", - "Build new applications using emerging technologies like generative AI", - "Work on React-based front-end in the policyengine-app repo", - "Contribute to Flask/Python back-end development in the policyengine-api and policyengine-core libraries", - "Develop and review code collaboratively in GitHub" - ], - "qualifications": "Currently pursuing a degree in Computer Science or related field; proficiency in Python and JavaScript; familiarity with React and Flask is a plus.", - "benefits": "Paid stipend, flexible remote work, mentorship from experienced developers, and exposure to the intersection of technology and public policy." - } - }, - { - "title": "Policy Modeling Intern", - "type": "Internship", - "content": { - "summary": "Powering PolicyEngine's core rules engine", - "location": "Remote (US, UK, or Canada-based preferred)", - "duration": "Spring, Summer, or Fall semester (possibility of extension)", - "description": "As a Policy Modeling Intern, you will play a crucial role in developing and enhancing the models of tax and benefit policies that power PolicyEngine's rules engine, the heart of our software. This internship provides a unique opportunity to directly impact the accuracy and comprehensiveness of our policy analysis tools.", - "responsibilities": [ - "Augment the policyengine-us, policyengine-uk, and policyengine-canada Python packages", - "Model additional tax and benefit rules and regulations for the US, UK, and Canada", - "Monitor legislative and policy proposals", - "Strategize the integration of new policies into PolicyEngine", - "Develop and review code collaboratively in GitHub" - ], - "qualifications": "Currently pursuing a degree in Economics, Public Policy, or related field; strong analytical skills; proficiency in Python; interest in tax and benefit systems.", - "benefits": "Paid stipend, flexible remote work, exposure to cutting-edge policy modeling techniques, and the opportunity to contribute to impactful open-source projects." - } - }, - { - "title": "Data Science Intern", - "type": "Internship", - "content": { - "summary": "Revealing quantitative implications of policy reforms", - "location": "Remote (US-based preferred)", - "duration": "Spring, Summer, or Fall semester (possibility of extension)", - "description": "As a Data Science Intern at PolicyEngine, you will work on revealing the quantitative implications of the most visible policy reforms. This role offers a unique blend of data analysis, visualization, and policy research, allowing you to make a tangible impact on public understanding of complex policy issues.", - "responsibilities": [ - "Work with policy analysts to analyze tax and benefit policies", - "Create custom analyses using advanced statistical methods", - "Develop mini-apps and interactive visualizations using tools like Plotly and Streamlit", - "Contribute to data-driven policy reports and blog posts", - "Collaborate with the team to improve data processing and analysis pipelines" - ], - "qualifications": "Currently pursuing a degree in Data Science, Statistics, or related field; strong programming skills in Python; experience with data visualization libraries; interest in public policy.", - "benefits": "Paid stipend, flexible remote work, opportunity to work with large-scale policy datasets, and exposure to real-world applications of data science in policy analysis." - } - }, - { - "title": "Economic Research Intern", - "type": "Internship", - "content": { - "summary": "Applying PolicyEngine to influence policy debates", - "location": "Remote (US, UK, or Canada-based preferred)", - "duration": "Spring, Summer, or Fall semester (possibility of extension)", - "description": "As an Economic Research Intern at PolicyEngine, you will apply our software to discussions that influence top public policy debates. This role offers a unique opportunity to bridge economic theory with practical policy analysis, contributing to some of the most pressing economic discussions of our time.", - "responsibilities": [ - "Research and summarize economic data and academic research", - "Contribute to policy analysis discussions and write blog posts", - "Use PolicyEngine tools to model and analyze proposed economic policies", - "Engage with policymakers and research institutions", - "Assist in preparing reports and presentations for various stakeholders" - ], - "qualifications": "Currently pursuing a degree in Economics, Public Policy, or related field; strong analytical and writing skills; familiarity with economic research methods; interest in applied policy analysis.", - "benefits": "Paid stipend, flexible remote work, opportunity to contribute to high-level policy discussions, and exposure to cutting-edge economic modeling techniques." - } - }, - { - "title": "Communications Intern", - "type": "Internship", - "content": { - "summary": "Amplifying PolicyEngine's impact through strategic communication", - "location": "Remote (US-based preferred)", - "duration": "Spring, Summer, or Fall semester (possibility of extension)", - "description": "As a Communications Intern at PolicyEngine, you will play a crucial role in amplifying our impact by connecting diverse audiences to relevant policy insights. This internship offers a unique opportunity to develop your strategic communications skills while contributing to important policy discussions.", - "responsibilities": [ - "Assist in distributing PolicyEngine's findings and analyses", - "Engage in digital communications, including managing social media accounts", - "Create content for and help organize webinars and online events", - "Monitor media coverage of PolicyEngine and relevant policy topics", - "Maintain and expand contact lists for media, policymakers, and other stakeholders", - "Contribute to the development of communication strategies for new policy analyses" - ], - "qualifications": "Currently pursuing a degree in Communications, Journalism, Public Relations, or related field; excellent writing and editing skills; familiarity with social media platforms; interest in public policy and data-driven communication.", - "benefits": "Paid stipend, flexible remote work, opportunity to build a professional network in policy and media circles, and hands-on experience in strategic communications for a cutting-edge policy organization." - } - } -] diff --git a/src/PolicyEngine.jsx b/src/PolicyEngine.jsx index 91b8627a3..3a4efdc60 100644 --- a/src/PolicyEngine.jsx +++ b/src/PolicyEngine.jsx @@ -1,7 +1,6 @@ import Home from "./pages/Home"; import Research from "./pages/Research"; import About from "./pages/About"; -import Jobs from "./pages/Jobs"; import Supporters from "./pages/Supporters"; import { Navigate, @@ -299,7 +298,6 @@ export default function PolicyEngine() { // If the path is /, redirect to /[countryId] // If the path is /[countryId], render the homepage // If the path is /[countryId]/about, render the about page - // If the path is /[countryId]/jobs, render the jobs page // If the path is /[countryId]/research, render the research page // If the path is not recognized, redirect to /[countryId] @@ -322,7 +320,6 @@ export default function PolicyEngine() { }> } /> } /> - } /> } /> } /> } /> diff --git a/src/__tests__/pages/About.test.js b/src/__tests__/pages/About.test.js index 1dcae6a9b..56ca0b843 100644 --- a/src/__tests__/pages/About.test.js +++ b/src/__tests__/pages/About.test.js @@ -24,13 +24,6 @@ describe("About Page", () => { // Check for the section with a heading "Team" const teamSection = screen.getByRole("heading", { name: /Team/i }); expect(teamSection).toBeInTheDocument(); - - // Check that the link to jobs page exists - const link = screen.getByRole("link", { - name: /Learn about opportunities to join us./i, - }); - expect(link).toBeInTheDocument(); - expect(link).toHaveAttribute("href", expect.stringContaining("/jobs")); }); test("each founder has an image, a name, and a description", async () => { diff --git a/src/layout/Header.jsx b/src/layout/Header.jsx index 6a4e4917f..b595a0e18 100644 --- a/src/layout/Header.jsx +++ b/src/layout/Header.jsx @@ -71,11 +71,6 @@ export const ABOUT_DROPDOWN_LINKS = [ link: "about", icon: , }, - { - title: "Careers", - link: "jobs", - icon: , - }, { title: "Supporters", link: "supporters", diff --git a/src/pages/About.jsx b/src/pages/About.jsx index 072113377..1926b2675 100644 --- a/src/pages/About.jsx +++ b/src/pages/About.jsx @@ -27,16 +27,7 @@ export default function About() {

PolicyEngine's team leads a global movement of open-source - contributors.{" "} - - Learn about opportunities to join us. - + contributors.

diff --git a/src/pages/Jobs.jsx b/src/pages/Jobs.jsx deleted file mode 100644 index 36fc5e711..000000000 --- a/src/pages/Jobs.jsx +++ /dev/null @@ -1,185 +0,0 @@ -import React, { useState, useEffect } from "react"; -import Header from "../layout/Header"; -import Footer from "../layout/Footer"; -import Section from "../layout/Section"; -import style from "../style"; -import PageHeader from "../layout/PageHeader"; -import { HoverBox } from "../layout/HoverBox"; - -function ApplyButton() { - return ( - - - Apply - - - ); -} - -function JobContent({ content }) { - return ( -
-

- {content.summary} -

-

- Location: {content.location} -

-

- - {content.type === "Full-Time" ? "Contract" : "Duration"}: - {" "} - {content.contract || content.duration} -

-

{content.description}

-

- Key Responsibilities: -

-
    - {content.responsibilities.map((resp, index) => ( -
  • {resp}
  • - ))} -
-

- Qualifications: {content.qualifications} -

-

- Benefits: {content.benefits} -

-
- ); -} - -export default function Jobs() { - const [jobOpenings, setJobOpenings] = useState([]); - const [isLoading, setIsLoading] = useState(true); - const [error, setError] = useState(null); - - useEffect(() => { - fetch("/data/job-openings.json") - .then((response) => { - if (!response.ok) { - throw new Error("Failed to fetch job openings"); - } - return response.json(); - }) - .then((data) => { - setJobOpenings(data); - setIsLoading(false); - }) - .catch((error) => { - setError(error.message); - setIsLoading(false); - }); - }, []); - - const fullTimePositions = jobOpenings.filter( - (job) => job.type === "Full-Time", - ); - const internshipPositions = jobOpenings.filter( - (job) => job.type === "Internship", - ); - - const renderJobSection = (position, index, isFullTime) => ( -
- -
- ); - - if (isLoading) { - return
Loading job openings...
; - } - - if (error) { - return
Error: {error}
; - } - - return ( -
-
- -

- Join PolicyEngine's team and contribute to a global movement of - open-source software development for public policy analysis and - benefit access. -

-
-
-

Ready to make an impact?

-

- At PolicyEngine, we're revolutionizing public policy analysis and - benefit access with open-source software. Be part of a team - that's shaping the future of economic policy and making a real - difference in society. -

- - {/* Update this section depending on open positions */} -

- We're currently accepting applications for internship positions. -

-
-
-

About PolicyEngine

-

- PolicyEngine is an innovative platform dedicated to making public - policy more accessible, transparent, and evidence-based. By leveraging - cutting-edge technology, we empower individuals and organizations to - understand and analyze the impacts of tax and benefit policies on - budgets, economic growth, poverty, and inequality. -

-
- {fullTimePositions.length > 0 && ( -
-

Full-Time Positions

- {fullTimePositions.map((position, index) => - renderJobSection(position, index, true), - )} -
- )} - {internshipPositions.length > 0 && ( -
-

Internship opportunities

- {internshipPositions.map((position, index) => - renderJobSection(position, index, false), - )} -
- )} -
-

Take the next step

-

- If you're passionate about transforming public policy analysis - and want to contribute to meaningful change, we'd love to hear - from you. -

- -
-
-
- ); -} From 569727e5d19f7751f376563f1d12882cd721ef75 Mon Sep 17 00:00:00 2001 From: SongmingFan123 <121742950+SongmingFan@users.noreply.github.com> Date: Wed, 23 Jul 2025 21:22:43 -0400 Subject: [PATCH 2/5] Remove unused imports and data members --- src/layout/Header.jsx | 1 - src/pages/About.jsx | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/layout/Header.jsx b/src/layout/Header.jsx index b595a0e18..abf44e26e 100644 --- a/src/layout/Header.jsx +++ b/src/layout/Header.jsx @@ -23,7 +23,6 @@ import { DownOutlined, DeploymentUnitOutlined, TeamOutlined, - UserAddOutlined, BankOutlined, } from "@ant-design/icons"; import { loginOptions, logoutOptions } from "../auth/authUtils"; diff --git a/src/pages/About.jsx b/src/pages/About.jsx index 1926b2675..6e79cc44b 100644 --- a/src/pages/About.jsx +++ b/src/pages/About.jsx @@ -5,13 +5,9 @@ import style from "../style/index.js"; import PageHeader from "../layout/PageHeader.jsx"; import { founders, staff, advisors } from "../data/staff.js"; import useDisplayCategory from "../hooks/useDisplayCategory.js"; -import { Link, useLocation } from "react-router-dom"; import { Helmet } from "react-helmet"; export default function About() { - const location = useLocation(); - const pathParts = location.pathname.split("/"); - const countryId = pathParts[1]; // Assumes the countryId is always the second segment in the path Object.keys(founders).map((founder) => { return founder; From 22d9af50bf51364a6e51e1ce63744b8ee18ba9be Mon Sep 17 00:00:00 2001 From: SongmingFan123 <121742950+SongmingFan@users.noreply.github.com> Date: Wed, 30 Jul 2025 19:37:01 -0400 Subject: [PATCH 3/5] Restore jobs screen and keep cleared the job openings json --- public/data/job-openings.json | 1 + src/PolicyEngine.jsx | 2 + src/layout/Header.jsx | 5 + src/pages/About.jsx | 14 ++- src/pages/Jobs.jsx | 197 ++++++++++++++++++++++++++++++++++ 5 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 public/data/job-openings.json create mode 100644 src/pages/Jobs.jsx diff --git a/public/data/job-openings.json b/public/data/job-openings.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/public/data/job-openings.json @@ -0,0 +1 @@ +[] diff --git a/src/PolicyEngine.jsx b/src/PolicyEngine.jsx index 3a4efdc60..81276134b 100644 --- a/src/PolicyEngine.jsx +++ b/src/PolicyEngine.jsx @@ -59,6 +59,7 @@ import EducationPage from "./pages/learn/EducationPage"; import OpenSourcePage from "./pages/learn/OpenSourcePage"; import BenefitAccessPage from "./pages/learn/BenefitAccessPage"; import { updateDeprecatedSearchParams } from "./routing/updateDeprecatedSearchParams"; +import Jobs from "./pages/Jobs"; const PolicyPage = lazy(() => import("./pages/PolicyPage")); const HouseholdPage = lazy(() => import("./pages/HouseholdPage")); @@ -320,6 +321,7 @@ export default function PolicyEngine() { }> } /> } /> + } /> } /> } /> } /> diff --git a/src/layout/Header.jsx b/src/layout/Header.jsx index abf44e26e..040d2d353 100644 --- a/src/layout/Header.jsx +++ b/src/layout/Header.jsx @@ -70,6 +70,11 @@ export const ABOUT_DROPDOWN_LINKS = [ link: "about", icon: , }, + { + title: "Jobs", + link: "jobs", + icon: , + }, { title: "Supporters", link: "supporters", diff --git a/src/pages/About.jsx b/src/pages/About.jsx index 6e79cc44b..e49e59f90 100644 --- a/src/pages/About.jsx +++ b/src/pages/About.jsx @@ -6,8 +6,11 @@ import PageHeader from "../layout/PageHeader.jsx"; import { founders, staff, advisors } from "../data/staff.js"; import useDisplayCategory from "../hooks/useDisplayCategory.js"; import { Helmet } from "react-helmet"; +import { Link } from "react-router-dom"; +import useCountryId from "../hooks/useCountryId.js"; export default function About() { + const countryId = useCountryId(); Object.keys(founders).map((founder) => { return founder; @@ -23,7 +26,16 @@ export default function About() {

PolicyEngine's team leads a global movement of open-source - contributors. + contributors.{" "} + + Learn about opportunities to join us. +

diff --git a/src/pages/Jobs.jsx b/src/pages/Jobs.jsx new file mode 100644 index 000000000..25498f692 --- /dev/null +++ b/src/pages/Jobs.jsx @@ -0,0 +1,197 @@ +import React, { useEffect, useState } from "react"; +import Footer from "../layout/Footer"; +import Header from "../layout/Header"; +import { HoverBox } from "../layout/HoverBox"; +import PageHeader from "../layout/PageHeader"; +import Section from "../layout/Section"; +import style from "../style"; + +function ApplyButton() { + return ( + + + Apply + + + ); +} + +function JobContent({ content }) { + return ( +
+

+ {content.summary} +

+

+ Location: {content.location} +

+

+ + {content.type === "Full-Time" ? "Contract" : "Duration"}: + {" "} + {content.contract || content.duration} +

+

{content.description}

+

+ Key Responsibilities: +

+
    + {content.responsibilities.map((resp, index) => ( +
  • {resp}
  • + ))} +
+

+ Qualifications: {content.qualifications} +

+

+ Benefits: {content.benefits} +

+
+ ); +} + +export default function Jobs() { + const [jobOpenings, setJobOpenings] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + fetch("/data/job-openings.json") + .then((response) => { + if (!response.ok) { + throw new Error("Failed to fetch job openings"); + } + return response.json(); + }) + .then((data) => { + setJobOpenings(data); + setIsLoading(false); + }) + .catch((error) => { + setError(error.message); + setIsLoading(false); + }); + }, []); + + const fullTimePositions = jobOpenings.filter( + (job) => job.type === "Full-Time", + ); + const internshipPositions = jobOpenings.filter( + (job) => job.type === "Internship", + ); + + const renderJobSection = (position, index, isFullTime) => ( +
+ +
+ ); + + if (isLoading) { + return
Loading job openings...
; + } + + if (error) { + return
Error: {error}
; + } + + return ( +
+
+ +

+ Join PolicyEngine's team and contribute to a global movement of + open-source software development for public policy analysis and + benefit access. +

+
+
+

Ready to make an impact?

+

+ At PolicyEngine, we're revolutionizing public policy analysis and + benefit access with open-source software. Be part of a team + that's shaping the future of economic policy and making a real + difference in society. +

+ + {/* Update this section depending on open positions */} +

+ We're currently accepting applications for internship positions. +

+
+
+

About PolicyEngine

+

+ PolicyEngine is an innovative platform dedicated to making public + policy more accessible, transparent, and evidence-based. By leveraging + cutting-edge technology, we empower individuals and organizations to + understand and analyze the impacts of tax and benefit policies on + budgets, economic growth, poverty, and inequality. +

+
+ {jobOpenings.length === 0 ? ( +
+

Current Openings

+

+ PolicyEngine does not currently have job openings. Please check back + later. +

+
+ ) : ( + <> + {fullTimePositions.length > 0 && ( +
+

Full-Time Positions

+ {fullTimePositions.map((position, index) => + renderJobSection(position, index, true), + )} +
+ )} + {internshipPositions.length > 0 && ( +
+

Internship opportunities

+ {internshipPositions.map((position, index) => + renderJobSection(position, index, false), + )} +
+ )} + + )} +
+

Take the next step

+

+ If you're passionate about transforming public policy analysis + and want to contribute to meaningful change, we'd love to hear + from you. +

+ +
+
+
+ ); +} From 00c11fc520d50a03c658458c5b5e2afbc8db7618 Mon Sep 17 00:00:00 2001 From: SongmingFan123 <121742950+SongmingFan@users.noreply.github.com> Date: Sun, 10 Aug 2025 20:19:00 -0400 Subject: [PATCH 4/5] Remove job applications --- src/pages/Jobs.jsx | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/pages/Jobs.jsx b/src/pages/Jobs.jsx index 25498f692..bf754fdb4 100644 --- a/src/pages/Jobs.jsx +++ b/src/pages/Jobs.jsx @@ -130,20 +130,6 @@ export default function Jobs() { benefit access.

-
-

Ready to make an impact?

-

- At PolicyEngine, we're revolutionizing public policy analysis and - benefit access with open-source software. Be part of a team - that's shaping the future of economic policy and making a real - difference in society. -

- - {/* Update this section depending on open positions */} -

- We're currently accepting applications for internship positions. -

-

About PolicyEngine

@@ -182,15 +168,6 @@ export default function Jobs() { )} )} -

-

Take the next step

-

- If you're passionate about transforming public policy analysis - and want to contribute to meaningful change, we'd love to hear - from you. -

- -