Newer
Older
import React, { useContext, useEffect } from "react";
import { useParams } from "react-router-dom";
import axios from "axios";

Zheng Meyer
committed
import { Container, Button, Row, Col, Form as RBForm } from "react-bootstrap";
import Form from "react-jsonschema-form";
import { GlobalContext } from "../../contexts/GlobalContext";
import { QueryContext } from "../../contexts/QueryContext";

Nico Vermaas
committed
import QueryResults from "../services/query_results/QueryResults";
import parseQueryForm from "../../utils/form/parseQueryForm";
import { IVOAContext } from "../../contexts/IVOAContext";

Zheng Meyer
committed
import parseVOServiceForm from "../../utils/form/parseVOServiceForm";
import VOServiceResults from "../services/query_results/IVOAResults";
import { getQueryIcon } from "../../utils/styling";
import "../../assets/IVOA.css";
export default function QueryIVOARegistry() {
// queryMap is a map of dictionaries, where each dictionary consists of
// {"catalog": "catalogname",
// "catalogquery": "querystring",
// "status": "fetching|fechted",
// "results": null}

Zheng Meyer
committed
const { config, setConfigName, defaultConf, queryMap, formData, setFormData, page, setPage } = useContext(QueryContext);
const { api_host } = useContext(
const { selectedServices, setSelectedServices, queryStep, setQueryStep, regPage } = useContext(

Zheng Meyer
committed
IVOAContext
);
const { uri } = useParams();
console.log("uri:", uri);
console.log("default conf: ", defaultConf);
// set ConfigName for archive
useEffect(() => {

Zheng Meyer
committed
console.log("cleaned up");
queryMap.clear();
setFormData();
// load the GUI for this configuration

Zheng Meyer
committed
console.log("query schema:", config.query_schema);
if (!formData) return;
console.log("formData:", formData);

Zheng Meyer
committed
const gui = config.query_schema.name;
let queries = [];
if (queryStep === "run-query") {
selectedServices.forEach((access_url) => {
queries = [
...queries,
...parseVOServiceForm(formData, access_url, page),
];

Zheng Meyer
committed
});
} else {

Zheng Meyer
committed
queries = parseQueryForm(gui, formData, regPage);

Zheng Meyer
committed
}
console.log("queries:", queries);
queryMap.clear();
queries.forEach((query) => {
queryMap.set(query.catalog, {
catalog: query.catalog,
esapquery: query.esapquery,
status: "fetching",
results: null,
});
let url = api_host + "query/" + query.esapquery;
axios
.get(url)
.then((queryResponse) => {
let tf_url = api_host + "query/get-tables-fields/?dataset_uri=vo_reg&access_url=" + query.catalog;
console.log("table fields url: ", tf_url);
axios
.get(tf_url)
.then((tfResponse) => {
queryMap.set(query.catalog, {
catalog: query.catalog,
service_type: query.service_type,
vo_table_schema: queryResponse.data.results[0],
esapquery: query.esapquery,
status: "fetched",
results: queryResponse.data,
});
}).catch(() => {
queryMap.set(query.catalog, {
catalog: query.catalog,
service_type: query.service_type,
vo_table_schema:"",
esapquery: query.esapquery,
status: "error",
results: queryResponse.data,
});
});
}
else {
queryMap.set(query.catalog, {
catalog: query.catalog,
service_type: query.service_type,
esapquery: query.esapquery,
status: "fetched",
results: queryResponse.data,
})
.catch(() => {
queryMap.set(query.catalog, {
catalog: query.catalog,
esapquery: query.esapquery,
status: "error",
results: null,
});
});
});

Zheng Meyer
committed
}, [formData, page, regPage]);
function formTemplate({ TitleField, properties, title, description }) {
return (
<div>
<TitleField title={title} />
<div className="row">
{properties.filter(property => property.content.props.uiSchema["ui:widget"]!="hidden").map((prop) => (
<div
className="col-lg-2 col-md-4 col-sm-6 col-xs-12"
key={prop.content.key}
>
{prop.content}
</div>
))}
</div>
{description}
</div>
);
}
console.log("queryMap:", Array.from(queryMap.values()));
const uiSchemaProp = config.ui_schema ? { uiSchema: config.ui_schema } : {};
console.log("UI Schema props:", uiSchemaProp);

Zheng Meyer
committed
console.log("Form Data:", formData);

Zheng Meyer
committed
if (queryStep === "run-query") {
uiSchemaProp.uiSchema = {
adql_query: { "ui:widget": "textarea" },
keyword: { "ui:widget": "hidden" },
service_type: { "ui:widget": "hidden" },
catalog: { "ui:widget": "hidden" },
tap_schema: { "ui:widget": "hidden" },
waveband: { "ui:widget": "hidden" },

Zheng Meyer
committed
console.log("new ui schema:", uiSchemaProp);
return (
<Container fluid>
<Form
schema={config.query_schema}
ObjectFieldTemplate={formTemplate}
formData={formData}
onSubmit={({ formData }) => setFormData(formData)}
{...uiSchemaProp}
>
<label class="control-label">Selected Services</label>
<RBForm.Control as="select" className="selectedServices" multiple>
{selectedServices.map((service) => {
return <option>{service}</option>;

Zheng Meyer
committed
})}
</RBForm.Control>
<div>
<Button className="mt-3" type="submit">
Query VO Resource

Zheng Meyer
committed
</Button>

Zheng Meyer
committed
</Form>
{selectedServices.map((service) => {
const details = queryMap.get(service);

Zheng Meyer
committed
console.log("Details:", details);

Zheng Meyer
committed
return (
<div className="mt-3">
<VOServiceResults catalog={service} />

Zheng Meyer
committed
</div>
);

Zheng Meyer
committed
})}
</Container>
);
} else {
return (
<Container fluid>
<Form
schema={config.query_schema}
ObjectFieldTemplate={formTemplate}
formData={formData}
onSubmit={({ formData }) => setFormData(formData)}
{...uiSchemaProp}
>
<div>
<Button type="submit">{getQueryIcon()} Query VO Registry</Button>

Zheng Meyer
committed
</div>
</Form>
{Array.from(queryMap.keys()).map((catalog) => {
console.log("catalog:", catalog);
const details = queryMap.get(catalog);
console.log("Details:", details);
console.log("Results:", details.results);
// let catalogName =
// config.query_schema.properties.catalog.enumNames[
// config.query_schema.properties.catalog.enum.findIndex(
// (name) => name === catalog
// )
// ];

Zheng Meyer
committed
return (
<div key={catalog} className="mt-3">
<Row>
<Col>
<h4>List of VO Resources</h4>

Zheng Meyer
committed
</Col>
<Col>
{selectedServices.length === 0 ? (

Zheng Meyer
committed
<></>
) : (
<Button
type="submit"
onClick={() => {
setQueryStep("run-query");
}}
>
Query selected VO Resources

Zheng Meyer
committed
</Button>
)}
</Col>
</Row>

Zheng Meyer
committed
<div className="mt-3">
<QueryResults catalog={catalog} />
</div>

Zheng Meyer
committed
</div>
);
})}
</Container>
);
}