Skip to content

Commit 3aa1feb

Browse files
committed
Refactor URLs to generate /job/:jobid pages
Also some tweaks to job rendering, and refactored Page component so that pages share a common header.
1 parent 3c2d7d0 commit 3aa1feb

File tree

12 files changed

+120
-36
lines changed

12 files changed

+120
-36
lines changed

gatsby-node.esm.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import jobs from "./src/jobs";
2+
import path from "path";
3+
4+
export const createPages = async ({ graphql, actions }) => {
5+
const { createPage } = actions;
6+
jobs.map((job) =>
7+
createPage({
8+
path: `job/${job.id}`,
9+
component: path.resolve('./src/pages/job.jsx'),
10+
context: {
11+
job
12+
}
13+
})
14+
);
15+
}

gatsby-node.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
require = require('esm')(module)
2+
module.exports = require('./gatsby-node.esm.js')

package-lock.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"react-hook-form": "^6.11.1"
2424
},
2525
"devDependencies": {
26+
"esm": "^3.2.25",
2627
"prettier": "2.1.2"
2728
},
2829
"repository": {

src/components/Job.jsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import React from "react";
2+
import { Link } from "gatsby";
23

34
import Badge from "./Badge";
45

5-
const Job = ({ job }) => (
6+
const Job = ({ job }) => {
7+
return (
68
<div className="job">
79
<div className="badges">
810
{ job.badges &&
@@ -14,8 +16,10 @@ const Job = ({ job }) => (
1416
<Badge type="Pure OSS"/>
1517
}
1618
</div>
17-
<div className="meta">
19+
<Link to={`/job/${job.id}`}>
1820
<div className="title">{ job.entity } / { job.title }</div>
21+
</Link>
22+
<div className="meta">
1923
<div className="percentTime">This job is { job.percentTime }% time.</div>
2024
<div className="percentOSS">
2125
{ job.percentOSS }% of that time is on open source
@@ -31,6 +35,6 @@ const Job = ({ job }) => (
3135
dangerouslySetInnerHTML={{__html: job.description}}
3236
/>
3337
</div>
34-
);
38+
)};
3539

3640
export default Job;

src/components/Page.jsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React from "react";
2+
import { Link } from "gatsby";
3+
4+
const Page = ({ children }) => (
5+
<>
6+
<div className="header">
7+
<Link to="/">
8+
<h1>NumFOCUS Jobs Board</h1>
9+
</Link>
10+
</div>
11+
{ children }
12+
</>
13+
);
14+
15+
export default Page;

src/filter-jobs.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
const filterJobs = (jobs, filter) => {
2+
// Filter out expired jobs. Use Howland Island timezone to ensure
3+
// that everyone sees the job on its last day.
4+
const today = new Date();
5+
jobs = jobs.filter((job) => new Date(`${job.expires}T23:59:59.999-12:00`) > today);
6+
27
if (filter.fullTime) {
38
jobs = jobs.filter((job) => job.percentTime === 100)
49
}
10+
511
if (filter.ossTimeGt) {
612
jobs = jobs.filter((job) => job.percentOSS >= parseInt(filter.ossTimeGt))
713
}

src/pages/index.js

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/pages/index.jsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import React from "react";
2+
3+
import Page from "../components/Page";
4+
import JobsFilter from "../components/JobsFilter";
5+
6+
export default function Home() {
7+
return <Page>
8+
<JobsFilter/>
9+
</Page>
10+
}

src/pages/job.jsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from "react";
2+
import { Link } from "gatsby";
3+
4+
import Page from '../components/Page';
5+
import Job from '../components/Job';
6+
7+
// pageContext comes from createPage in
8+
// gatsby-node.esm.js
9+
const job = ({ pageContext }) => {
10+
const { job } = pageContext;
11+
return (
12+
<Page>
13+
<Job job={job}/>
14+
Return to <Link to="/">jobs listing</Link>.
15+
</Page>
16+
);
17+
};
18+
19+
export default job;

0 commit comments

Comments
 (0)