diff --git a/src/components/query/QueryCatalogs.js b/src/components/query/QueryCatalogs.js index 898bbc6a76b0b2f8940a43182d4b9d930a8fdc68..0adc7688eb8de8fafcdb5557ef40d75db3aefe8c 100644 --- a/src/components/query/QueryCatalogs.js +++ b/src/components/query/QueryCatalogs.js @@ -36,6 +36,9 @@ export default function QueryCatalogs() { case "zooniverse": setConfigName("zooniverse"); break; + case "esap_rucio": + setConfigName("esap_rucio"); + break; case "astron_vo": setConfigName("astron_vo"); break; diff --git a/src/components/query/QueryResults.js b/src/components/query/QueryResults.js index 9350c83c30aedc7977b4ebdbb74c8587a15b1016..69e23c17de7eb00bbe9e39e62a16a18c98bbbd0b 100644 --- a/src/components/query/QueryResults.js +++ b/src/components/query/QueryResults.js @@ -4,6 +4,7 @@ import ASTRONVOResults from "./ASTRONVOResults"; import ZooniverseResults from "./ZooniverseResults"; import VORegListResults from "./VORegListResults"; import LOFARResults from "./LOFARResults"; +import RucioResults from "./RucioResults"; export default function QueryResults({ catalog }) { switch (catalog) { @@ -19,6 +20,8 @@ export default function QueryResults({ catalog }) { return <VORegListResults catalog={catalog} />; case "lofar": return <LOFARResults catalog={catalog} />; + case "rucio": + return <RucioResults catalog={catalog} />; default: return null; } diff --git a/src/components/query/RucioResults.js b/src/components/query/RucioResults.js new file mode 100644 index 0000000000000000000000000000000000000000..8620405f7410720041a3ffc83be7ab38dc5310f1 --- /dev/null +++ b/src/components/query/RucioResults.js @@ -0,0 +1,132 @@ +import React, { useContext, useState } from "react"; +import { Table, Alert, Form, Button } from "react-bootstrap"; +import * as deepEqual from "deep-equal"; +import { QueryContext } from "../../contexts/QueryContext"; +// import { BasketContext } from "../../contexts/BasketContext"; +import LoadingSpinner from "../LoadingSpinner"; +import Paginate, { pagination_fields } from "../Paginate"; +// import SaveBasket from "../basket/savebasket"; + +function titleCase(string) { + var sentence = string.toLowerCase().split(" "); + for (var i = 0; i < sentence.length; i++) { + sentence[i] = sentence[i][0].toUpperCase() + sentence[i].slice(1); + } + return sentence.join(" "); +} + +function newPageCallback(setPage) { + return (args) => { + if (args.target) { + setPage(parseFloat(args.target.text)); + } + }; +} + +export default function RucioResults({ catalog }) { + const context = useContext(QueryContext); + // const basketContext = useContext(BasketContext); + const { queryMap, page, setPage } = context; + + // console.log(queryMap, page, context.queryMap.get(catalog).status); + + if (!context.queryMap) return null; + if (context.queryMap.get(catalog).status === "fetched") { + if (context.queryMap.get(catalog).results.results.length === 0) + return <Alert variant="warning">No matching results found!</Alert>; + else if (catalog === "rucio") { + const result = queryMap.get("rucio").results.results[0]; + const numPages = queryMap.get("rucio").results.pages; + + const fields = Object.keys(result).map( + (key) => key + ); + const headers = Object.keys(result).map((field) => { + const title = titleCase(field.replace("_", " ")); + return <th key={`header_${field}`}>{title}</th>; + }); + + return ( + <> + <Paginate + getNewPage={newPageCallback(setPage)} + currentPage={page} + numAdjacent={3} + numPages={numPages} + /> + <Form> + {/*<SaveBasket />*/} + <Table className="mt-3" responsive> + <thead> + <tr className="bg-light"> + {/* <th> + <InputGroup> + <InputGroup.Checkbox /> + </InputGroup> + </th> */} + {headers} + </tr> + </thead> + <tbody> + {queryMap + .get("rucio") + .results.results.map((result, resultCounter) => { + const cells = fields.map((field) => { + const reactKey = `item_${resultCounter}_${field}`; + return ( + <td key={reactKey}> + {result[field]} + </td> + ); + }); + return ( + <tr key={`item_${resultCounter}`}> + {/* <th> + <InputGroup> + <InputGroup.Checkbox /> + </InputGroup> + </th> */} + {/*<td> + <Form.Check id={`selectClassifications_${result.project_id}`} type="checkbox" onChange={(event) => { + const action = event.target.checked ? addToBasket : removeFromBasket; + action(result.project_id, basketContext, "project", "classifications"); + }} checked={isInBasket(result.project_id, basketContext, "project", "classifications") ? "checked" : ""} /> + </td> + <td> + <Form.Check id={`selectSubjects_${result.project_id}`} type="checkbox" onChange={(event) => { + const action = event.target.checked ? addToBasket : removeFromBasket; + action(result.project_id, basketContext, "project", "subjects"); + }} checked={isInBasket(result.project_id, basketContext, "project", "subjects") ? "checked" : ""} /> + </td>*/} + {/*<td>{result.project_id}</td> + <td>{result.display_name}</td> + <td>{created_at}</td> + <td>{updated_at}</td> + <td>{launch_date}</td> + <td>{live}</td> + <td> + <a href={`https://zooniverse.org/projects/${result.slug}`}> + Link + </a> + </td>*/} + {cells} + </tr> + ); + })} + </tbody> + </Table> + </Form> + <Paginate + getNewPage={newPageCallback(setPage)} + currentPage={page} + numAdjacent={3} + numPages={numPages} + /> + </> + ); + } + } + else { + return <LoadingSpinner />; + } +} diff --git a/src/utils/form/parseQueryForm.js b/src/utils/form/parseQueryForm.js index 08c3162b9737e8e0a72772702312f88c60d0951b..62d7ec47344ccab0d0631caf302fb3369b441a42 100644 --- a/src/utils/form/parseQueryForm.js +++ b/src/utils/form/parseQueryForm.js @@ -4,6 +4,7 @@ import parseLOFARForm from "./parseLOFARForm"; import parseIVOAForm from "./parseIVOAForm"; import parseApertifForm from "./parseApertifForm"; import parseASTRONVOForm from "./parseASTRONVOForm"; +import parseRucioForm from "./parseRucioForm"; export default function parseQueryForm(gui, formData, page) { switch (gui) { @@ -19,6 +20,8 @@ export default function parseQueryForm(gui, formData, page) { return parseASTRONVOForm(formData, page); case "ivoa": return parseIVOAForm(formData, page); + case "rucio": + return parseRucioForm(formData, page); default: return null; } diff --git a/src/utils/form/parseRucioForm.js b/src/utils/form/parseRucioForm.js new file mode 100644 index 0000000000000000000000000000000000000000..a0571bb15f2f15432fc230ea49a9d0309eaa281c --- /dev/null +++ b/src/utils/form/parseRucioForm.js @@ -0,0 +1,21 @@ +export default function parseRucioForm(formData, page) { + let formInput = Object.entries(formData); + + let query = ""; + + for (let [key, value] of formInput) { + query += `${`${query}` ? "&" : ""}` + key + "=" + value; + } + + let esapquery = [ + query, + "archive_uri=esap_rucio", + `catalog=rucio`, + ].join("&"); + + console.log("Rucio Query", query); + return [{ + catalog: "rucio", + esapquery: esapquery + `&page=${page}` + }]; +}