on master help sign in
grants: make pushOrDropQuery function
2cd7c70Matilde Park
package-lock.json+11
@@ -22,6 +22,7 @@
22 "gray-matter": "^4.0.3",
22 "gray-matter": "^4.0.3",
23 "html-entities": "^2.3.2",
23 "html-entities": "^2.3.2",
24 "lodash.debounce": "^4.0.8",
24 "lodash.debounce": "^4.0.8",
25+ "lodash.omit": "^4.5.0",
25 "luxon": "^2.0.2",
26 "luxon": "^2.0.2",
26 "next": "^12.1.5",
27 "next": "^12.1.5",
27 "path-browserify": "^1.0.1",
28 "path-browserify": "^1.0.1",
@@ -2078,6 +2079,11 @@
2078 "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
2079 "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
2079 "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
2080 "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
2080 },
2081 },
2082+ "node_modules/lodash.omit": {
2083+ "version": "4.5.0",
2084+ "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
2085+ "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA="
2086+ },
2081 "node_modules/longest-streak": {
2087 "node_modules/longest-streak": {
2082 "version": "3.0.1",
2088 "version": "3.0.1",
2083 "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz",
2089 "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz",
@@ -6665,6 +6671,11 @@
6665 "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
6671 "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
6666 "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
6672 "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
6667 },
6673 },
6674+ "lodash.omit": {
6675+ "version": "4.5.0",
6676+ "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz",
6677+ "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA="
6678+ },
6668 "longest-streak": {
6679 "longest-streak": {
6669 "version": "3.0.1",
6680 "version": "3.0.1",
6670 "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz",
6681 "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz",
package.json+1
@@ -32,6 +32,7 @@
32 "gray-matter": "^4.0.3",
32 "gray-matter": "^4.0.3",
33 "html-entities": "^2.3.2",
33 "html-entities": "^2.3.2",
34 "lodash.debounce": "^4.0.8",
34 "lodash.debounce": "^4.0.8",
35+ "lodash.omit": "^4.5.0",
35 "luxon": "^2.0.2",
36 "luxon": "^2.0.2",
36 "next": "^12.1.5",
37 "next": "^12.1.5",
37 "path-browserify": "^1.0.1",
38 "path-browserify": "^1.0.1",
pages/grants.js+22−28
@@ -9,6 +9,7 @@ import SingleColumn from "../components/SingleColumn";
9import Section from "../components/Section";
9import Section from "../components/Section";
10import GrantPreview from "../components/GrantPreview";
10import GrantPreview from "../components/GrantPreview";
11import JoinGroup from "../components/JoinGroup";
11import JoinGroup from "../components/JoinGroup";
12+import omit from "lodash.omit";
12import { getAllPosts, getGrantsCategories, getGrantsTypes } from "../lib/lib";
13import { getAllPosts, getGrantsCategories, getGrantsTypes } from "../lib/lib";
13
14
14function isArray(arr) {
15function isArray(arr) {
@@ -41,6 +42,25 @@ export default function Grants({ posts, categories, types, search }) {
41 );
42 );
42 }
43 }
43
44
45+ function pushOrDropQuery(queryName, currentQuery, item) {
46+ let to, toWithQuery;
47+ if (isArray(currentQuery)) {
48+ to = isOrIsIn(item, currentQuery)
49+ ? currentQuery.filter((e) => e !== item)
50+ : [...currentQuery, item];
51+ } else {
52+ to = isOrIsIn(item, currentQuery)
53+ ? null
54+ : [currentQuery, item].filter((e) => e !== undefined);
55+ }
56+ if (!to) {
57+ toWithQuery = omit(router.query, queryName);
58+ } else {
59+ toWithQuery = { ...router.query, [queryName]: to };
60+ }
61+ return toWithQuery;
62+ }
63+
44 const annotatedPosts = posts.map((post) => {
64 const annotatedPosts = posts.map((post) => {
45 if (post.extra.canceled) {
65 if (post.extra.canceled) {
46 return { ...post, status: "canceled" };
66 return { ...post, status: "canceled" };
@@ -304,21 +324,7 @@ export default function Grants({ posts, categories, types, search }) {
304 const active = isOrIsIn(each, category)
324 const active = isOrIsIn(each, category)
305 ? "bg-green-400 text-white"
325 ? "bg-green-400 text-white"
306 : "bg-wall-100 text-wall-500";
326 : "bg-wall-100 text-wall-500";
307− let to, categoryQuery;
327+ const categoryQuery = pushOrDropQuery("category", category, each);
308− if (isArray(category)) {
309− to = isOrIsIn(each, category)
310− ? category.filter((e) => e !== each)
311− : [...category, each];
312− } else {
313− to = isOrIsIn(each, category)
314− ? null
315− : [category, each].filter((e) => e !== undefined);
316− }
317− if (!to) {
318− categoryQuery = (({ category, ...obj }) => obj)(router.query);
319− } else {
320− categoryQuery = { ...router.query, category: to };
321− }
322 return (
328 return (
323 <button
329 <button
324 className={`${active} badge-sm mr-1 my-1`}
330 className={`${active} badge-sm mr-1 my-1`}
@@ -348,19 +354,7 @@ export default function Grants({ posts, categories, types, search }) {
348 ? "Exclude In Progress"
354 ? "Exclude In Progress"
349 : "Include In Progress";
355 : "Include In Progress";
350 }
356 }
351− let to, statusQuery;
357+ const statusQuery = pushOrDropQuery("status", status, each);
352− if (isArray(status)) {
353− to = isOrIsIn(each, status)
354− ? status.filter((e) => e !== each)
355− : [...status, each];
356− } else {
357− to = isOrIsIn(each, status) ? null : [status, each];
358− }
359− if (!to) {
360− statusQuery = (({ status, ...obj }) => obj)(router.query);
361− } else {
362− statusQuery = { ...router.query, status: to };
363− }
364 return (
358 return (
365 <button
359 <button
366 className="mr-4 badge-sm bg-black text-white"
360 className="mr-4 badge-sm bg-black text-white"