@@ -33,7 +33,7 @@ export default function Grants({ posts, categories, types, search }) {
33 const router = useRouter();
33 const router = useRouter();
34 let { status, type, category } = router.query;
34 let { status, type, category } = router.query;
35 if (status === undefined) {
35 if (status === undefined) {
36− status = "open";
36+ status = ["open", "wip"];
39 function push(toQuery) {
39 function push(toQuery) {
@@ -82,8 +82,8 @@ export default function Grants({ posts, categories, types, search }) {
82 const byStatus = (post) => {
82 const byStatus = (post) => {
84 (isOrIsIn("open", status) ? post.status === "open" : false) ||
84 (isOrIsIn("open", status) ? post.status === "open" : false) ||
85− (isOrIsIn("complete", status) ? post.status === "completed" : false) ||
85+ (isOrIsIn("complete", status) ? post.status === "completed" : false) ||
86− (isOrIsIn("wip", status) ? post.status === "wip" : false)
86+ (isOrIsIn("wip", status) ? post.status === "wip" : false)
@@ -91,10 +91,10 @@ export default function Grants({ posts, categories, types, search }) {
92 const filteredPosts = postsByStatus.filter((post) => {
92 const filteredPosts = postsByStatus.filter((post) => {
93 const hasCategory = category
93 const hasCategory = category
94− ? isArray(category)
94+ ? isArray(category)
95− ? post.taxonomies.grant_category.some((cat) => category.includes(cat))
95+ ? post.taxonomies.grant_category.some((cat) => category.includes(cat))
96− : post.taxonomies.grant_category.includes(category)
96+ : post.taxonomies.grant_category.includes(category)
99 const notCanceled = !post.extra.canceled;
99 const notCanceled = !post.extra.canceled;
100 const hasType = type ? post.taxonomies.grant_type.includes(type) : true;
100 const hasType = type ? post.taxonomies.grant_type.includes(type) : true;
@@ -107,6 +107,9 @@ export default function Grants({ posts, categories, types, search }) {
107 Bounty: postsByStatus.filter((post) =>
107 Bounty: postsByStatus.filter((post) =>
108 post.taxonomies.grant_type.includes("Bounty")
108 post.taxonomies.grant_type.includes("Bounty")
109 ).length,
109 ).length,
110+ RFP: postsByStatus.filter((post) =>
111+ post.taxonomies.grant_type.includes("RFP")
110 Apprenticeship: postsByStatus.filter((post) =>
113 Apprenticeship: postsByStatus.filter((post) =>
111 post.taxonomies.grant_type.includes("Apprenticeship")
114 post.taxonomies.grant_type.includes("Apprenticeship")
112 ).length,
115 ).length,
@@ -122,7 +125,7 @@ export default function Grants({ posts, categories, types, search }) {
123 title: "Grants",
126 title: "Grants",
124 description:
127 description:
125− "Contribute to the Urbit project while earning address space.",
128+ "Contribute to the Urbit project while earning address space.",
128 <IntraNav ourSite="https://urbit.org" search={search} />
131 <IntraNav ourSite="https://urbit.org" search={search} />
@@ -157,11 +160,18 @@ export default function Grants({ posts, categories, types, search }) {
157 fund all kinds projects, not strictly technical ones, so don't
160 fund all kinds projects, not strictly technical ones, so don't
158 hesitate to pitch your idea!
161 hesitate to pitch your idea!
163+ <div className="flex flex-wrap mb-8">
160− <Link href="/grants/proposals" passHref>
164+ <Link href="/grants/proposals" passHref>
161− <a className="button-sm bg-blue-400 text-white mb-8 max-w-fit">
165+ <a className="button-sm bg-blue-400 text-white mb-8 max-w-fit mr-2">
162− Submit a Proposal
166+ Submit a Proposal
169+ <Link href="/grants?program=rfps&type=RFP#view-grants" passHref>
170+ <a className="button-sm bg-purple text-white mb-8 max-w-fit">
166 {/* Apprenticeships */}
176 {/* Apprenticeships */}
167 <h3>Apprenticeships</h3>
177 <h3>Apprenticeships</h3>
@@ -197,15 +207,7 @@ export default function Grants({ posts, categories, types, search }) {
204− <p className="mb-4">
205− Grant applications and proposals are approved on a bi-weekly basis. The next deadlines are <b>March 14th & 28th</b>.
207− <p>If you any questions regarding grants, feel free to email grants@urbit.org.</p>
211 </Section>
213 </Section>
@@ -235,6 +237,12 @@ export default function Grants({ posts, categories, types, search }) {
235 by those that post them.
237 by those that post them.
240+ <li className="mb-2">
242+ <Link href="/grants/rfps">RFPs</Link>{" "}
243+ are suitable for people experienced with hoon development but who need some ideas on what to work on.
238 <li className="mb-2">
246 <li className="mb-2">
240 <Link href="/grants/apprenticeships">Apprenticeships</Link>{" "}
248 <Link href="/grants/apprenticeships">Apprenticeships</Link>{" "}
@@ -248,9 +256,16 @@ export default function Grants({ posts, categories, types, search }) {
248 <div className="md:basis-1/2">
256 <div className="md:basis-1/2">
249 <p className="mb-8">
257 <p className="mb-8">
250 Whether you're gearing up to submit your proposal or just
258 Whether you're gearing up to submit your proposal or just
251− thinking about it, the best way to get started is to join the <Link href="/groups/~halbex-palheb/uf-public">Urbit Foundation</Link> group.
259+ thinking about it, the best way to get started is to join the <Link href="/groups/~halbex-palheb/uf-public">Urbit Foundation</Link> group, ask questions there or come find our grants office hours in the group.
261+ <p className="mb-8">
262+ Feel free to contact <a href="/ids/~poldec-tonteg">~poldec-tonteg</a> with general questions or <a href="/ids/~marfun-pacpet">~marfun-pacpet</a> regarding administrative matters.
264+ <p className="mb-8">
267+ <p className="mb-8">Grant applications and proposals are approved on a bi-weekly basis. The next deadlines are <b>March 14th & 28th</b>.
253− <p className="mb-8">Feel free to contact <a href="/ids/~poldec-tonteg">~poldec-tonteg</a> with general questions or <a href="/ids/~marfun-pacpet">~marfun-pacpet</a> regarding administrative matters.</p>
256 </Section>
271 </Section>
@@ -272,17 +287,20 @@ export default function Grants({ posts, categories, types, search }) {
272 {types.map((each) => {
287 {types.map((each) => {
273 let activeBg;
288 let activeBg;
274 switch (each) {
289 switch (each) {
275− case "Proposal":
290+ case "Proposal":
276− activeBg = "bg-blue-400 text-white";
291+ activeBg = "bg-blue-400 text-white";
278− case "Bounty":
293+ case "Bounty":
279− activeBg = "bg-yellow-300 text-white";
294+ activeBg = "bg-yellow-300 text-white";
297+ activeBg = "bg-purple-400 text-white";
281− case "Apprenticeship":
299+ case "Apprenticeship":
282− activeBg = "bg-green-400 text-white";
300+ activeBg = "bg-green-400 text-white";
284− default:
302+ default:
285− activeBg = "bg-black";
303+ activeBg = "bg-black";
@@ -302,8 +320,8 @@ export default function Grants({ posts, categories, types, search }) {
302 <div className="flex flex-wrap mb-12">
320 <div className="flex flex-wrap mb-12">
303 {categories.map((each) => {
321 {categories.map((each) => {
304 const active = isOrIsIn(each, category)
322 const active = isOrIsIn(each, category)
305− ? "bg-green-400 text-white"
323+ ? "bg-green-400 text-white"
306− : "bg-wall-100 text-wall-500";
324+ : "bg-wall-100 text-wall-500";
307 const categoryQuery = pushOrDropQuery("category", category, each);
325 const categoryQuery = pushOrDropQuery("category", category, each);
@@ -319,20 +337,20 @@ export default function Grants({ posts, categories, types, search }) {
319 {["open", "complete", "wip"].map((each) => {
337 {["open", "complete", "wip"].map((each) => {
320 let title;
338 let title;
321 switch (each) {
339 switch (each) {
322− case "open":
340+ case "open":
323− title = isOrIsIn(each, status)
341+ title = isOrIsIn(each, status)
324− ? "Exclude Open"
342+ ? "Exclude Open"
325− : "Include Open";
343+ : "Include Open";
327− case "complete":
345+ case "complete":
328− title = isOrIsIn(each, status)
346+ title = isOrIsIn(each, status)
329− ? "Exclude Completed"
347+ ? "Exclude Completed"
330− : "Include Completed";
348+ : "Include Completed";
332− case "wip":
350+ case "wip":
333− title = isOrIsIn(each, status)
351+ title = isOrIsIn(each, status)
334− ? "Exclude In Progress"
352+ ? "Exclude In Progress"
335− : "Include In Progress";
353+ : "Include In Progress";
337 const statusQuery = pushOrDropQuery("status", status, each);
355 const statusQuery = pushOrDropQuery("status", status, each);
@@ -371,7 +389,7 @@ export async function getStaticProps() {
373 }).flat()
391 }).flat()
374− .sort((a, b) => new Date(b.date) - new Date(a.date));
392+ .sort((a, b) => new Date(b.date) - new Date(a.date));