Skip to content
Snippets Groups Projects
Commit 4d718cf6 authored by Nico Vermaas's avatar Nico Vermaas
Browse files

Merge branch '64_multiple_archive_query' into 'master'

adding dataset selection to mulit-query

See merge request astron-sdc/esap-gui!78
parents 7d78e67c 3c4d72ae
No related branches found
No related tags found
1 merge request!78adding dataset selection to mulit-query
Pipeline #20824 passed
...@@ -15,19 +15,23 @@ import { MAQContext, ...@@ -15,19 +15,23 @@ import { MAQContext,
FETCHED_SELECTED_QUERIES, FETCHED_SELECTED_QUERIES,
ERROR_FETCHING_QUERY } from "../../contexts/MAQContext"; ERROR_FETCHING_QUERY } from "../../contexts/MAQContext";
import AvailableDatasets from "../services/query_results/AvailableDatasets";
import RunMultiQueryResults from "../services/query_results/RunMultiQueryResults"; import RunMultiQueryResults from "../services/query_results/RunMultiQueryResults";
import { getQueryIcon } from "../../utils/styling"; import { getQueryIcon } from "../../utils/styling";
import LoadingSpinner from "../LoadingSpinner"; import LoadingSpinner from "../LoadingSpinner";
export default function QueryMultipleArchives() { export default function QueryMultipleArchives() {
const { api_host } = useContext(GlobalContext); const { api_host, datasets, getDataset } = useContext(GlobalContext);
const { config, setConfigName, defaultConf, formData, setFormData } = useContext(QueryContext); const { config, setConfigName, defaultConf, formData, setFormData } = useContext(QueryContext);
const { const {
queryStep, setQueryStep, queryStep, setQueryStep,
selectedDatasets, setSelectedDatasets,
availableDatasets, setAvailableDatasets,
selectedQueries, setSelectedQueries, selectedQueries, setSelectedQueries,
queryResults, setQueryResults, queryResults, setQueryResults,
status, setStatus } = useContext(MAQContext); status, setStatus } = useContext(MAQContext);
const maqContext = useContext(MAQContext); const maqContext = useContext(MAQContext);
...@@ -36,15 +40,24 @@ export default function QueryMultipleArchives() { ...@@ -36,15 +40,24 @@ export default function QueryMultipleArchives() {
//alert('prepareQueries') //alert('prepareQueries')
if (!config) return null if (!config) return null
let datasets_enabled = config.datasets_enabled // list of dataset uri's from the backend
let selected = [] if (config.datasets_enabled) {
// convert the list of uri's to a list of available datasets which have all their properties
// nv: 16nov2021, although this works and shows pretty names, it is noticably slow
// when users click checkboxes.
//available_datasets.forEach((available_dataset) => {
// let dataset = getDataset(available_dataset)[0]
// available.push(dataset)
//})
// setSelectedDatasets(available)
// setAvailableDatasets(available)
if (datasets_enabled) { // faster option
setSelectedDatasets(config.datasets_enabled)
setAvailableDatasets(config.datasets_enabled)
datasets_enabled.forEach((archive_dataset) => {
selected.push(archive_dataset)
})
setSelectedQueries(selected)
setStatus(PREPARED_QUERIES) setStatus(PREPARED_QUERIES)
} }
} }
...@@ -58,7 +71,7 @@ export default function QueryMultipleArchives() { ...@@ -58,7 +71,7 @@ export default function QueryMultipleArchives() {
let base_query = parseQueryForm(query_schema_name, formData); let base_query = parseQueryForm(query_schema_name, formData);
// create a list of queries based on the filled in form // create a list of queries based on the filled in form
selectedQueries.forEach((query) => { selectedDatasets.forEach((dataset) => {
// add archive and collection parameters // add archive and collection parameters
//let url = api_host + "query/query?" + "" + //let url = api_host + "query/query?" + "" +
//"&collection=" + query.result.collection + //"&collection=" + query.result.collection +
...@@ -66,7 +79,7 @@ export default function QueryMultipleArchives() { ...@@ -66,7 +79,7 @@ export default function QueryMultipleArchives() {
// "&category=" + query.result.category // "&category=" + query.result.category
// construct the url // construct the url
let url = api_host + "query/query?dataset_uri=" + query.dataset + '&' + base_query let url = api_host + "query/query?dataset_uri=" + dataset.dataset + '&' + base_query
setStatus(FETCHING_SELECTED_QUERIES) setStatus(FETCHING_SELECTED_QUERIES)
console.log('status = '+status) console.log('status = '+status)
...@@ -149,10 +162,12 @@ export default function QueryMultipleArchives() { ...@@ -149,10 +162,12 @@ export default function QueryMultipleArchives() {
// RENDER // RENDER
if (!config) return <LoadingSpinner /> if (!config) return <LoadingSpinner />
if (status === PREPARE_QUERIES) { if (status === PREPARE_QUERIES) {
prepareQueries(config) prepareQueries(config)
} }
// load the GUI for this configuration // load the GUI for this configuration
const uiSchemaProp = config.ui_schema ? { uiSchema: config.ui_schema } : {}; const uiSchemaProp = config.ui_schema ? { uiSchema: config.ui_schema } : {};
...@@ -179,6 +194,7 @@ export default function QueryMultipleArchives() { ...@@ -179,6 +194,7 @@ export default function QueryMultipleArchives() {
return ( return (
<Container fluid> <Container fluid>
<AvailableDatasets results={availableDatasets}/>
<Form <Form
schema={config.query_schema} schema={config.query_schema}
ObjectFieldTemplate={myObjectFieldTemplate} ObjectFieldTemplate={myObjectFieldTemplate}
......
import React, { useContext, useState } from "react";
import {Container, Card, Table } from 'react-bootstrap'
import SelectDatasetCheckBox from "./SelectDatasetCheckBox";
function createItem(result){
return {
query_step: "dataset",
result: result,
};
}
export default function AvailableDatasets(props) {
return (
<Container fluid>
<Card>
<Table>
<thead>
<th>Select Datasets to query</th>
</thead>
<tbody>
<tr>
{props.results.map((result, index) => (
<td key={result.dataset}>
<td>
<SelectDatasetCheckBox id={result.dataset} item={result} />
</td>
<td>{result.dataset} ({result.archive})</td>
</td>
))}
</tr>
</tbody>
</Table>
</Card>
</Container>
);
}
\ No newline at end of file
import React, { useContext, useState } from "react"; import React, { useContext, useState } from "react";
import {Container, Card, Table } from 'react-bootstrap' import {Container, Card, Table } from 'react-bootstrap'
import AddToBasket from "../../basket/AddToBasketCheckBox"; import AddToBasketCheckBox from "../../basket/AddToBasketCheckBox";
//import { QueryContext } from "../../../contexts/QueryContext"; //import { QueryContext } from "../../../contexts/QueryContext";
//import HandlePreview from "../../query/HandlePreview"; //import HandlePreview from "../../query/HandlePreview";
//import Preview from "../../query/Preview"; //import Preview from "../../query/Preview";
...@@ -25,6 +25,7 @@ export default function RunQueryResults(props) { ...@@ -25,6 +25,7 @@ export default function RunQueryResults(props) {
<tr className="bg-light"> <tr className="bg-light">
<th>Basket</th> <th>Basket</th>
<th>Name</th> <th>Name</th>
<th>Dataset</th>
<th>Collection</th> <th>Collection</th>
<th>Level</th> <th>Level</th>
<th>RA</th> <th>RA</th>
...@@ -38,9 +39,10 @@ export default function RunQueryResults(props) { ...@@ -38,9 +39,10 @@ export default function RunQueryResults(props) {
<> <>
<tr key={result.url}> <tr key={result.url}>
<td> <td>
<AddToBasket id={result.url} item={createItem(result)} /> <AddToBasketCheckBox id={result.url} item={createItem(result)} />
</td> </td>
<td>{result.name}</td> <td>{result.name}</td>
<td>{result.dataset}</td>
<td>{result.collection}</td> <td>{result.collection}</td>
<td>{result.level}</td> <td>{result.level}</td>
<td>{result.ra}</td> <td>{result.ra}</td>
......
import React, { useContext, useEffect } from "react";
import * as deepEqual from "deep-equal";
import { Form } from "react-bootstrap";
import { MAQContext } from "../../../contexts/MAQContext";
export default function SelectDatasetCheckBox(props) {
const maqContext = useContext(MAQContext);
function isSelected(testItem) {
const found = maqContext.selectedDatasets.some(item => deepEqual(item, testItem));
console.log('found = '+found+' testItem = '+testItem)
return found;
}
function selectItem(item) {
maqContext.selectDataset(item);
console.log('selectItem: '+[item, maqContext]);
}
function unselectItem(item) {
maqContext.unselectDataset(item);
console.log('unselectItem: '+[item, maqContext]);
}
return (
<Form.Check id={props.id} type="checkbox" label={props.label} onChange={(event) => {
const action = event.target.checked ? selectItem : unselectItem;
action(props.item);
}} checked={isSelected(props.item) ? "checked" : ""} />
);
}
...@@ -47,7 +47,8 @@ export function GlobalContextProvider({ children }) { ...@@ -47,7 +47,8 @@ export function GlobalContextProvider({ children }) {
? "http://localhost:5555/esap-api/" ? "http://localhost:5555/esap-api/"
: "https://sdc-dev.astron.nl/esap-api/"; : "https://sdc-dev.astron.nl/esap-api/";
const [archives, setArchives] = useState(); const [archives, setArchives] = useState([]);
const [datasets, setDatasets] = useState([]);
const [navbar, setNavbar] = useState(); const [navbar, setNavbar] = useState();
const [loggedInUserName, setLoggedInUserName] = useState(); const [loggedInUserName, setLoggedInUserName] = useState();
const [idToken, setIdToken] = useState([]); const [idToken, setIdToken] = useState([]);
...@@ -60,15 +61,21 @@ export function GlobalContextProvider({ children }) { ...@@ -60,15 +61,21 @@ export function GlobalContextProvider({ children }) {
.then((response) => setArchives(response.data.results)); .then((response) => setArchives(response.data.results));
}, [api_host]); }, [api_host]);
useEffect(() => { useEffect(() => {
axios axios
.get(api_host + "query/configuration?name=navbar") .get(api_host + "query/datasets-uri")
.then((response) => { .then((response) => setDatasets(response.data.results));
console.log("navbar response", response.data.configuration);
setNavbar(response.data.configuration);
});
}, [api_host]); }, [api_host]);
useEffect(() => {
axios
.get(api_host + "query/configuration?name=navbar")
.then((response) => {
console.log("navbar response", response.data.configuration);
setNavbar(response.data.configuration);
});
}, [api_host]);
// Zheng: "!!!!! Still need to look at sessionid and stuff" // Zheng: "!!!!! Still need to look at sessionid and stuff"
const [sessionid, setSessionid] = useState(getCookie("sessionid")); const [sessionid, setSessionid] = useState(getCookie("sessionid"));
console.log("waah", sessionid, getCookie("sessionid"), document.cookie); console.log("waah", sessionid, getCookie("sessionid"), document.cookie);
...@@ -131,7 +138,7 @@ export function GlobalContextProvider({ children }) { ...@@ -131,7 +138,7 @@ export function GlobalContextProvider({ children }) {
return (expiration - now)/1000 return (expiration - now)/1000
} }
const handleError = (event) => { const handleError = (event) => {
setIsAuthenticated(false); setIsAuthenticated(false);
setSessionid(null); setSessionid(null);
...@@ -142,7 +149,15 @@ export function GlobalContextProvider({ children }) { ...@@ -142,7 +149,15 @@ export function GlobalContextProvider({ children }) {
</> </>
); );
}; };
// find a dataset record in the list of datasets
const getDataset = (uri) => {
return datasets.filter(
function(datasets) {
return datasets.uri == uri
}
)
}
return ( return (
<GlobalContext.Provider <GlobalContext.Provider
...@@ -151,6 +166,7 @@ export function GlobalContextProvider({ children }) { ...@@ -151,6 +166,7 @@ export function GlobalContextProvider({ children }) {
isAuthenticated, isAuthenticated,
sessionid, sessionid,
archives, archives,
datasets,
navbar, navbar,
handleLogin, handleLogin,
handleLogout, handleLogout,
...@@ -161,7 +177,8 @@ export function GlobalContextProvider({ children }) { ...@@ -161,7 +177,8 @@ export function GlobalContextProvider({ children }) {
tokenExpiration, tokenExpiration,
refreshLogin, refreshLogin,
isTokenValid, isTokenValid,
loginAgain loginAgain,
getDataset
}} }}
> >
{children} {children}
......
...@@ -18,7 +18,9 @@ export const ERROR_FETCHING_QUERY = 'error-fetching-query' ...@@ -18,7 +18,9 @@ export const ERROR_FETCHING_QUERY = 'error-fetching-query'
export const MAQContext = createContext(); export const MAQContext = createContext();
export function MAQContextProvider({ children }) { export function MAQContextProvider({ children }) {
const [selectedArchives, setSelectedArchives] = useState([]); const [datasets, setDatasets] = useState([]);
const [selectedDatasets, setSelectedDatasets] = useState([]);
const [availableDatasets, setAvailableDatasets] = useState([]);
const [queryStep, setQueryStep] = useState("create-queries"); const [queryStep, setQueryStep] = useState("create-queries");
const [archiveQueries, setArchiveQueries] = useState([]); const [archiveQueries, setArchiveQueries] = useState([]);
const [selectedQueries, setSelectedQueries] = useState([]); const [selectedQueries, setSelectedQueries] = useState([]);
...@@ -31,15 +33,15 @@ export function MAQContextProvider({ children }) { ...@@ -31,15 +33,15 @@ export function MAQContextProvider({ children }) {
2. run-query 2. run-query
*/ */
function handleAddArchive(access_url) { function handleAddDataset(access_url) {
setSelectedArchives([...selectedArchives, access_url]); setSelectedDatasets([...selectedDatasets, access_url]);
} }
function handleRemoveArchive(access_url) { function handleRemoveDataset(access_url) {
const copy = [...selectedArchives]; const copy = [...selectedDatasets];
const index = copy.findIndex((url) => url === access_url); const index = copy.findIndex((url) => url === access_url);
copy.splice(index, 1); copy.splice(index, 1);
setSelectedArchives(copy); setSelectedDatasets(copy);
} }
function handleSelectQuery(query) { function handleSelectQuery(query) {
...@@ -58,20 +60,25 @@ export function MAQContextProvider({ children }) { ...@@ -58,20 +60,25 @@ export function MAQContextProvider({ children }) {
return ( return (
<MAQContext.Provider <MAQContext.Provider
value={{ value={{
selectedArchives, datasets,
setSelectedArchives, setDatasets,
addArchive: handleAddArchive, availableDatasets,
removeArchive: handleRemoveArchive, setAvailableDatasets,
selectedDatasets,
setSelectedDatasets,
selectDataset: handleAddDataset,
unselectDataset: handleRemoveDataset,
queryStep, queryStep,
setQueryStep, setQueryStep,
archiveQueries,
setArchiveQueries,
status, status,
setStatus, setStatus,
selectedQueries, selectedQueries,
setSelectedQueries, setSelectedQueries,
selectQuery: handleSelectQuery, selectQuery: handleSelectQuery,
unselectQuery: handleUnselectQuery, unselectQuery: handleUnselectQuery,
queryResults, queryResults,
setQueryResults, setQueryResults,
}} }}
......
...@@ -100,7 +100,7 @@ export default function Routes() { ...@@ -100,7 +100,7 @@ export default function Routes() {
</Switch> </Switch>
<footer><small>esap-gui version 12 nov 2021 - 8:00</small></footer> <footer><small>esap-gui version 16 nov 2021 - 8:00</small></footer>
</Router> </Router>
); );
} }
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