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

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";
import LoadingSpinner from "../LoadingSpinner";
export default function QueryIVOARegistry() {
// queryMap is a map of dictionaries, where each dictionary consists of
// {"catalog": "catalogname",
// "catalogquery": "querystring",
// "status": "fetching|fechted",
// "results": null}
const {setConfigName, defaultConf, queryMap, formData, setFormData, page, setPage, setDPLevel, setCollection} = useContext(QueryContext);
const { api_host } = useContext(
const { selectedServices, setSelectedServices, queryStep, setQueryStep, regPage } = useContext(

Zheng Meyer
committed
IVOAContext
);
const [config, setConfig] = useState();
const [url, setURL] = useState("");
const [dplevel] = useState();
const [collection] = useState();
const [configName] = useState(defaultConf);
const [preview, setPreview] = useState(false);
const [ds9, setDS9] = useState(false);
const {loginAgain } = useContext(GlobalContext);
const [categories, setCategories] = useState([]);
const history = useHistory();
const { uri } = useParams();
console.log("uri:", uri);
console.log("default conf: ", defaultConf);
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
if (config==null){
fetchConfiguration(defaultConf);
}
function fetchConfiguration(configName) {
let configNameString = configName;
if (configName) {
configNameString = `?name=${configName}`;
}
axios
.get(api_host + "query/configuration" + configNameString)
.then((response) => {
let props = response.data["configuration"].query_schema.properties;
Object.keys(props).map((key) => {
if (key === "collection" && collection) {
console.log("has key collection, default value is: ", props[key]["default"]);
props[key]["default"] = collection;
}
if (key === "level" && dplevel) {
console.log("has key dplevel, default value is: ", props[key]["default"]);
props[key]["default"] = dplevel;
}
return null;
});
setConfig(response.data["configuration"]);
}).catch((error) => {
let description = ". Configuration not loaded. Is ESAP-API online? " + api_host
console.log(error.toString() + description)
// alert(description)
//const loginUrl = api_host + "oidc/authenticate"
// window.location = loginUrl
// loginAgain()
});
}
console.log("config:", config);
// set ConfigName for archive
useEffect(() => {

Zheng Meyer
committed
console.log("cleaned up");
queryMap.clear();
setFormData();
// load the GUI for this configuration
if (config) {
console.log("query schema:", config.query_schema);
}
if (!formData) return;
console.log("formData:", formData);

Zheng Meyer
committed
const gui = config.query_schema.name;

Zheng Meyer
committed
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()));
let uiSchemaProp = {}
if (config){
uiSchemaProp = config.ui_schema ? { uiSchema: config.ui_schema } : {};
console.log("UI Schema props:", uiSchemaProp);
console.log("Form Data:", formData);
} else {
uiSchemaProp = {};
}

Zheng Meyer
committed
if (queryStep === "run-query") {
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
if (config){
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" },
};
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>;
})}
</RBForm.Control>
<div>
<Button className="mt-3" type="submit">
Query VO Resource
</Button>

Zheng Meyer
committed
</div>
</Form>
{selectedServices.map((service) => {
const details = queryMap.get(service);
console.log("Details:", details);
return (

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

Zheng Meyer
committed
</div>
);
})}
</Container>
);
}
} else {
if (config){
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>
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
</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
// )
// ];
return (
<div key={catalog} className="mt-3">
<Row>
<Col>
<h4>List of VO Resources</h4>
</Col>
<Col>
{selectedServices.length === 0 ? (
<></>
) : (
<Button
type="submit"
onClick={() => {
setQueryStep("run-query");
}}
>
Query selected VO Resources
</Button>
)}
</Col>
</Row>
<div className="mt-3">
<QueryResults catalog={catalog} />
</div>
</div>
);
})}
</Container>
);
} else {
return (<LoadingSpinner />);
}

Zheng Meyer
committed
}