Skip to content
Snippets Groups Projects
Commit dd13e3ea authored by Zheng Meyer's avatar Zheng Meyer
Browse files

add archive_name in url for archive-specific query form routing

parent 2520813a
No related branches found
No related tags found
1 merge request!2Pagination
Showing
with 309 additions and 61 deletions
import React from "react";
import { Alert } from "react-bootstrap";
export default function Interactive() {
return <Alert variant="info">This service is under development!</Alert>;
}
import React from "react";
import { Alert } from "react-bootstrap";
export default function Rucio() {
return (
<Alert variant="warning">
<p>You will leave ESAP GUI and be redirected to</p>
<a target="_blank" href="https://escape-dios-dl.cern.ch/ui/">
Rucio Web UI
</a>
</Alert>
);
}
import React, { useContext } from "react"; import React, { useContext } from "react";
import { useParams } from "react-router-dom"; import { useParams } from "react-router-dom";
import { GlobalContext } from "../../contexts/GlobalContext"; import { GlobalContext } from "../../contexts/GlobalContext";
import { Container, Row, Col, Card, Table, Alert, Image } from "react-bootstrap"; import {
Container,
Row,
Col,
Card,
Table,
Alert,
Image,
} from "react-bootstrap";
import DataProductCategories from "./DataProductCategories"; import DataProductCategories from "./DataProductCategories";
export default function ArchiveDetails(props) { export default function ArchiveDetails(props) {
const { uri } = useParams(); const { uri } = useParams();
console.log(uri); console.log(uri);
const { archives, defaultConfigName, setConfigName } = useContext(GlobalContext); const { archives } = useContext(GlobalContext);
if (!archives) return null; if (!archives) return null;
/* This is a nasty hack. There must be a better way! */
if (uri.search("zooniverse") >= 0){
setConfigName("zooniverse");
}
else{
setConfigName(defaultConfigName);
}
const archive = archives.find((archive) => archive.uri === uri); const archive = archives.find((archive) => archive.uri === uri);
if (!archive) return <Alert variant="danger">No Archive found!</Alert>; if (!archive) return <Alert variant="danger">No Archive found!</Alert>;
console.log(archive); console.log(archive);
...@@ -46,15 +46,19 @@ export default function ArchiveDetails(props) { ...@@ -46,15 +46,19 @@ export default function ArchiveDetails(props) {
</tbody> </tbody>
</Table> </Table>
<Card> <Card>
<Image <Image
className="mx-auto d-block" className="mx-auto d-block"
src={archive.thumbnail} src={archive.thumbnail}
alt="" alt=""
rounded rounded
fluid fluid
/> />
<Card.Title className="text-center h4 pt-3">{archive.short_description}</Card.Title> <Card.Title className="text-center h4 pt-3">
<Card.Text className="text-justify m-3">{archive.long_description}</Card.Text> {archive.short_description}
</Card.Title>
<Card.Text className="text-justify m-3">
{archive.long_description}
</Card.Text>
</Card> </Card>
</Card.Body> </Card.Body>
</Card> </Card>
......
import React, { useContext } from "react"; import React, { useContext } from "react";
import { CardColumns} from "react-bootstrap"; import { CardColumns } from "react-bootstrap";
import ArchiveCard from "./ArchiveCard"; import ArchiveCard from "./ArchiveCard";
import { GlobalContext } from "../../contexts/GlobalContext"; import { GlobalContext } from "../../contexts/GlobalContext";
export function Archives() { export function Archives() {
const { archives, defaultConfigName, setConfigName} = useContext(GlobalContext); const { archives } = useContext(GlobalContext);
if (!archives) return null; if (!archives) return null;
setConfigName(defaultConfigName);
console.log("archives: ", { archives }); console.log("archives: ", { archives });
return ( return (
<CardColumns className="row-2"> <CardColumns className="row-2">
{archives.map((archive) => { {archives.map((archive) => {
let key = "archive-" + archive.id; let key = "archive-" + archive.id;
return ( return <ArchiveCard key={key} archive={archive} />;
<ArchiveCard key={key} archive={archive} /> })}
);
})}
</CardColumns> </CardColumns>
); );
} }
import React, { useState, useContext, useEffect } from "react"; import React, { useState, useContext, useEffect } from "react";
import { NavLink } from "react-router-dom"; import { NavLink } from "react-router-dom";
import { import { ListGroup, Card, Button, Row, Col } from "react-bootstrap";
ListGroup,
Card,
Button,
Row,
Col,
} from "react-bootstrap";
import { GlobalContext } from "../../contexts/GlobalContext"; import { GlobalContext } from "../../contexts/GlobalContext";
import axios from "axios"; import axios from "axios";
...@@ -37,13 +31,15 @@ export default function DataProductCategories({ archive }) { ...@@ -37,13 +31,15 @@ export default function DataProductCategories({ archive }) {
{categories {categories
.filter((category) => archive.datasets.includes(category.uri)) .filter((category) => archive.datasets.includes(category.uri))
.map((category) => { .map((category) => {
console.log(category); console.log("category:", category);
let button; let button;
let extra_info; let extra_info;
let documentation; let documentation;
if (category.service_connector) { if (category.service_connector) {
let query_url = `${category.archive_uri_derived}/query`;
console.log("query_url:", query_url);
button = ( button = (
<Button as={NavLink} variant="outline-info" to="/query"> <Button as={NavLink} variant="outline-info" to={query_url}>
Browse Catalog & Run Queries Browse Catalog & Run Queries
</Button> </Button>
); );
......
import React, { useContext, useEffect } from "react"; import React, { useContext, useEffect } from "react";
import { useParams } from "react-router-dom";
import axios from "axios"; import axios from "axios";
import { Container } from "react-bootstrap"; import { Container } from "react-bootstrap";
import Form from "react-jsonschema-form"; import Form from "react-jsonschema-form";
...@@ -14,16 +15,38 @@ export default function QueryCatalogs() { ...@@ -14,16 +15,38 @@ export default function QueryCatalogs() {
// "status": "fetching|fechted", // "status": "fetching|fechted",
// "results": null} // "results": null}
const { queryMap, formData, setFormData } = useContext(QueryContext); const { queryMap, formData, setFormData } = useContext(QueryContext);
const { config, api_host } = useContext(GlobalContext); const { config, api_host, setConfigName } = useContext(GlobalContext);
const { uri } = useParams();
console.log(uri);
console.log(config.query_schema); // set ConfigName for archive
useEffect(() => { useEffect(() => {
switch (uri) {
case "adex":
setConfigName("adex");
break;
case "apertif":
setConfigName("apertif");
break;
case "zooniverse":
setConfigName("zooniverse");
break;
case "astron_vo":
setConfigName("astron_vo");
break;
case "lofar":
setConfigName("lofar");
break;
default:
setConfigName("esap_ivoa");
}
}, [uri]);
useEffect(() => {
console.log(config.query_schema);
if (!formData) return; if (!formData) return;
let catalogs = config.query_schema.properties.catalog.enum.filter(
(name) => name !== "all"
);
let gui = config.query_schema.name; let gui = config.query_schema.name;
const queries = parseQueryForm(gui, formData, catalogs); const queries = parseQueryForm(gui, formData);
// Ideally query for each catalog is sent to ESAP API Gateway, and query results is returned // Ideally query for each catalog is sent to ESAP API Gateway, and query results is returned
// This is under development in the backend at the moment // This is under development in the backend at the moment
...@@ -78,7 +101,7 @@ export default function QueryCatalogs() { ...@@ -78,7 +101,7 @@ export default function QueryCatalogs() {
console.log("queryMap", Array.from(queryMap.values())); console.log("queryMap", Array.from(queryMap.values()));
const uiSchemaProp = config.ui_schema ? { uiSchema : config.ui_schema } : {}; const uiSchemaProp = config.ui_schema ? { uiSchema: config.ui_schema } : {};
return ( return (
<Container fluid> <Container fluid>
<Form <Form
......
...@@ -8,17 +8,16 @@ export function GlobalContextProvider({ children }) { ...@@ -8,17 +8,16 @@ export function GlobalContextProvider({ children }) {
console.log("ASTRON ESAP version 14 aug 2020"); console.log("ASTRON ESAP version 14 aug 2020");
const api_host = const api_host =
process.env.NODE_ENV === "development" process.env.NODE_ENV === "development"
? "http://sdc.astron.nl:15671/esap-api/" ? "http://localhost:8000/esap-api/"
: "/esap-api/"; : "/esap-api/";
const [config, setConfig] = useState(); const [config, setConfig] = useState();
const [configName, setConfigName] = useState("esap_config"); const [configName, setConfigName] = useState("esap_ivoa");
const [defaultConfigName, setDefaultConfigName] = useState("esap_config");
useEffect(() => { useEffect(() => {
let configNameString="" let configNameString = "";
if (configName){ if (configName) {
configNameString=`?name=${configName}` configNameString = `?name=${configName}`;
} }
axios axios
.get(api_host + "query/configuration" + configNameString) .get(api_host + "query/configuration" + configNameString)
...@@ -63,7 +62,7 @@ export function GlobalContextProvider({ children }) { ...@@ -63,7 +62,7 @@ export function GlobalContextProvider({ children }) {
archives, archives,
handleLogin, handleLogin,
handleLogout, handleLogout,
setConfigName setConfigName,
}} }}
> >
{children} {children}
......
...@@ -7,6 +7,8 @@ import QueryCatalogs from "../components/query/QueryCatalogs"; ...@@ -7,6 +7,8 @@ import QueryCatalogs from "../components/query/QueryCatalogs";
import { BrowserRouter as Router } from "react-router-dom"; import { BrowserRouter as Router } from "react-router-dom";
import NavBar from "../components/NavBar"; import NavBar from "../components/NavBar";
import { QueryContextProvider } from "../contexts/QueryContext"; import { QueryContextProvider } from "../contexts/QueryContext";
import Rucio from "../components/Rucio";
import Interactive from "../components/Interactive";
export default function Routes() { export default function Routes() {
const { config, handleLogin, handleLogout } = useContext(GlobalContext); const { config, handleLogin, handleLogout } = useContext(GlobalContext);
...@@ -22,14 +24,25 @@ export default function Routes() { ...@@ -22,14 +24,25 @@ export default function Routes() {
<Route exact path="/archives"> <Route exact path="/archives">
<Archives /> <Archives />
</Route> </Route>
<Route path="/query"> <Route exact path="/query">
<QueryContextProvider> <QueryContextProvider>
<QueryCatalogs /> <QueryCatalogs />
</QueryContextProvider> </QueryContextProvider>
</Route> </Route>
<Route exact path="/rucio">
<Rucio />
</Route>
<Route exact path="/interactive">
<Interactive />
</Route>
<Route exact path="/login" component={handleLogin} /> <Route exact path="/login" component={handleLogin} />
<Route exact path="/logout" component={handleLogout} /> <Route exact path="/logout" component={handleLogout} />
<Route path="/archives/:uri" component={ArchiveDetails} /> <Route exact path="/archives/:uri" component={ArchiveDetails} />
<Route exact path="/archives/:uri/query">
<QueryContextProvider>
<QueryCatalogs />
</QueryContextProvider>
</Route>
</Switch> </Switch>
</Router> </Router>
); );
......
export default function ParseADEXForm(formData, catalogs) { export default function ParseADEXForm(formData) {
let catalogs = ["apertif", "astron_vo"];
let queries = []; let queries = [];
// queries is an array of dictionaries, where each dictionary consists of // queries is an array of dictionaries, where each dictionary consists of
// {"catalog": "catalogname", // {"catalog": "catalogname",
......
export default function ParseASTRONVOForm(formData) {
let catalogs = "astron_vo";
let queries = [];
// queries is an array of dictionaries, where each dictionary consists of
// {"catalog": "catalogname",
// "esapquery": "querystring"}
let query = "";
let formInput = Object.entries(formData);
console.log(formInput);
for (let [key, value] of formInput) {
console.log(`${key}: ${value}`);
if (value && value !== "all" && key !== "catalog") {
query += `${`${query}` ? "&" : ""}` + key + "=" + value;
}
}
console.log("Query:", query);
// If catalog is set to "all", query for each catalog needs to be generated {"catalog": "catalogname",
// "catalogquery": "querystring",
// "status": "null|fetching|fetched",
// "results": null}
let catalog = formInput.find(([key]) => key === "catalog")[1];
if (catalog === "all") {
console.log("Catalogs:", catalogs);
catalogs.map((catalog) => {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
return null;
});
} else {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
}
console.log("Queries:", queries);
return queries;
}
export default function ParseApertifForm(formData) {
let catalogs = "apertif";
let queries = [];
// queries is an array of dictionaries, where each dictionary consists of
// {"catalog": "catalogname",
// "esapquery": "querystring"}
let query = "";
let formInput = Object.entries(formData);
console.log("formInput:", formInput);
for (let [key, value] of formInput) {
console.log(`${key}: ${value}`);
if (value && value !== "all" && key !== "catalog") {
query += `${`${query}` ? "&" : ""}` + key + "=" + value;
}
}
console.log("Query:", query);
// If catalog is set to "all", query for each catalog needs to be generated {"catalog": "catalogname",
// "catalogquery": "querystring",
// "status": "null|fetching|fetched",
// "results": null}
let catalog = formInput.find(([key]) => key === "catalog")[1];
if (catalog === "all") {
console.log("Catalogs:", catalogs);
catalogs.map((catalog) => {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
return null;
});
} else {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
}
console.log("Queries:", queries);
return queries;
}
export default function ParseIVOAForm(formData) {
let catalogs = "ivoa";
let queries = [];
// queries is an array of dictionaries, where each dictionary consists of
// {"catalog": "catalogname",
// "esapquery": "querystring"}
let query = "";
let formInput = Object.entries(formData);
console.log(formInput);
for (let [key, value] of formInput) {
console.log(`${key}: ${value}`);
if (value && value !== "all" && key !== "catalog") {
query += `${`${query}` ? "&" : ""}` + key + "=" + value;
}
}
console.log("Query:", query);
// If catalog is set to "all", query for each catalog needs to be generated {"catalog": "catalogname",
// "catalogquery": "querystring",
// "status": "null|fetching|fetched",
// "results": null}
let catalog = formInput.find(([key]) => key === "catalog")[1];
if (catalog === "all") {
console.log("Catalogs:", catalogs);
catalogs.map((catalog) => {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
return null;
});
} else {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
}
console.log("Queries:", queries);
return queries;
}
export default function ParseLOFARForm(formData) {
let catalogs = "lofar";
let queries = [];
// queries is an array of dictionaries, where each dictionary consists of
// {"catalog": "catalogname",
// "esapquery": "querystring"}
let query = "";
let formInput = Object.entries(formData);
console.log(formInput);
for (let [key, value] of formInput) {
console.log(`${key}: ${value}`);
if (value && value !== "all" && key !== "catalog") {
query += `${`${query}` ? "&" : ""}` + key + "=" + value;
}
}
console.log("Query:", query);
// If catalog is set to "all", query for each catalog needs to be generated {"catalog": "catalogname",
// "catalogquery": "querystring",
// "status": "null|fetching|fetched",
// "results": null}
let catalog = formInput.find(([key]) => key === "catalog")[1];
if (catalog === "all") {
console.log("Catalogs:", catalogs);
catalogs.map((catalog) => {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
return null;
});
} else {
let esapquery = query + `${`${query}` ? "&" : ""}archive_uri=` + catalog;
queries.push({
catalog: catalog,
esapquery: esapquery,
});
}
console.log("Queries:", queries);
return queries;
}
import parseADEXForm from "./parseADEXForm"; import parseADEXForm from "./parseADEXForm";
import parseZooniverseForm from "./parseZooniverseForm"; import parseZooniverseForm from "./parseZooniverseForm";
import parseLOFARForm from "./parseLOFARForm";
import parseIVOAForm from "./parseIVOAForm";
import parseApertifForm from "./parseApertifForm";
import parseASTRONVOForm from "./parseASTRONVOForm";
export default function parseQueryForm(gui, formData, catalogs) { export default function parseQueryForm(gui, formData) {
switch (gui) { switch (gui) {
case "adex": case "adex":
return parseADEXForm(formData, catalogs); return parseADEXForm(formData);
case "zooniverse": case "zooniverse":
return parseZooniverseForm(formData, catalogs); return parseZooniverseForm(formData);
case "lofar":
return parseLOFARForm(formData);
case "apertif":
return parseApertifForm(formData);
case "astron_vo":
return parseASTRONVOForm(formData);
case "ivoa":
return parseIVOAForm(formData);
default: default:
return null; return null;
} }
......
export default function parseZooniverseForm(formData, catalogs) { export default function parseZooniverseForm(formData) {
let catalogs = "zooniverse";
let queries = []; let queries = [];
// queries is an array of dictionaries, where each dictionary consists of // queries is an array of dictionaries, where each dictionary consists of
// {"catalog": "catalogname", // {"catalog": "catalogname",
...@@ -23,7 +24,11 @@ export default function parseZooniverseForm(formData, catalogs) { ...@@ -23,7 +24,11 @@ export default function parseZooniverseForm(formData, catalogs) {
if (catalog === "all") { if (catalog === "all") {
console.log(`Catalogs: ${catalogs}`); console.log(`Catalogs: ${catalogs}`);
catalogs.map((catalog) => { catalogs.map((catalog) => {
let esapquery = [query, "archive_uri=zooniverse", `catalog=${catalog}`].join("&"); let esapquery = [
query,
"archive_uri=zooniverse",
`catalog=${catalog}`,
].join("&");
queries.push({ queries.push({
catalog: catalog, catalog: catalog,
...@@ -32,7 +37,11 @@ export default function parseZooniverseForm(formData, catalogs) { ...@@ -32,7 +37,11 @@ export default function parseZooniverseForm(formData, catalogs) {
return null; return null;
}); });
} else { } else {
let esapquery = [query, "archive_uri=zooniverse", `catalog=${catalog}`].join("&"); let esapquery = [
query,
"archive_uri=zooniverse",
`catalog=${catalog}`,
].join("&");
queries.push({ queries.push({
catalog: catalog, catalog: catalog,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment