diff --git a/frontend/js/apicalls.js b/frontend/js/apicalls.js index c066cf8c7a4ba3b7771aeda905ef946020b29a2f..a97f95b8d2ae077a6991cb8bf4fe8b2e32a46c4d 100644 --- a/frontend/js/apicalls.js +++ b/frontend/js/apicalls.js @@ -23,6 +23,24 @@ function getType() { return type } +// return the filterName attribute +function getFilterName() { + var url = new URL(window.location.href); + return url.searchParams.get("filterName"); +} + +// return the filterUrl attribute +function getFilterUrl() { + var url = new URL(window.location.href); + return url.searchParams.get("filterUrl"); +} + +// return the filterKeys attribute +function getFilterKeys() { + var url = new URL(window.location.href); + return url.searchParams.getAll("filterKey"); +} + // set the text of the typetext element function setTypeText() { $('#typetext').text(getType()) @@ -239,9 +257,20 @@ function getTypes() { } // get listing of datasets of the given type, put them in the list element (via listener) -function listDatasets(datatype) { - var fullUrl = apiUrl + datatype; - console.log("Sending GET request to " + fullUrl + " for listing datasets.") +function listDatasets(datatype, filterName = null, filterUrl = null, filterKeys = []) { + var fullUrl = apiUrl + datatype + "?"; + if (filterName != null) { + fullUrl = fullUrl + "name=" + filterName + "&"; + } + if (filterUrl != null) { + fullUrl = fullUrl + "url=" + filterUrl + "&"; + } + if (filterKeys.length > 0) { + for (key in filterKeys) { + fullUrl = fullUrl + "has_key=" + key + "&"; + } + } + console.log("Sending GET request to " + fullUrl + " for listing datasets."); var xmlhttp = new XMLHttpRequest(); xmlhttp.addEventListener("loadend", setDatasetList); xmlhttp.open("GET", fullUrl); @@ -381,7 +410,7 @@ async function showListingOrSingleDataset() { if (window.sessionStorage.auth_token) { $('#addNewDatasetForm').show(); } - listDatasets(getType()); + listDatasets(getType(), getFilterName, getFilterUrl, getFilterKeys); } else if (getId() == "new") { $('#datasetListTable').hide(); $('#storageTypeChooser').hide(); @@ -515,6 +544,53 @@ function saveButtonPressed() { // success is handled by the xmlhttp event listener } +function filterButtonPressed() { + // redirect to same page with filter queries set + var type = getType(); + var filterName = $('#filterFormName').val() + var filterUrl = $('#filterFormUrl').val() + var filterKeys = $('#filterFormKeys').val() + + var filterKeyArray = filterKeys.split(',') + var filterKeyString = '' + for (key in filterKeyArray) { + filterKeyString = filterKeyString + "filterKey=" + encodeURIComponent(filterKeyArray[key]) + "&" + } + + var new_location = window.location.href.split('?')[0] + "?type=" + type + + if (filterName.length > 0) { + new_location = new_location + '&filterName=' + encodeURIComponent(filterName); + } + + if (filterUrl.length > 0) { + new_location = new_location + '&filterUrl=' + encodeURIComponent(filterUrl); + } + + if (filterKeys.length > 0) { + new_location = new_location + '&' + filterKeyString; + } + + + window.location.href = new_location +} + +function prefillFilterForm() { + // fill the filter input elements with values from query + + var name = getFilterName(); + var url = getFilterUrl(); + var keys = getFilterKeys(); + + console.log('name = ' + name); + console.log('url = ' + url); + console.log('keys = ' + keys); + + if (name != null) $('#filterFormName').val(name); + if (url != null) $('#filterFormUrl').val(url); + if (keys.length > 0) $('#filterFormKeys').val(keys.join()); +} + function enableButtons(save, edit, del) { $('#button-save').attr('disabled', !save); $('#button-edit').attr('disabled', !edit); diff --git a/frontend/templates/storage_content.html.jinja b/frontend/templates/storage_content.html.jinja index 83be4d5fbde732f7588d987bd931d2fe915ba59a..257166fc05bf279b228a6c061ac0c465abc434ed 100644 --- a/frontend/templates/storage_content.html.jinja +++ b/frontend/templates/storage_content.html.jinja @@ -22,6 +22,23 @@ </select> </form> + + <hr/> + + <form class="form-inline" id="filterForm"> + <label class="my-1 mr-2">Filter Datasets: </label> + + <label class="sr-only" for="filterFormName">Name</label> + <input type="text" class="form-control mb-2 mr-sm-2" id="filterFormName" placeholder="Name"> + + <label class="sr-only" for="filterFormUrl">URL</label> + <input type="text" class="form-control mb-2 mr-sm-2" id="filterFormUrl" placeholder="URL"> + + <label class="sr-only" for="filterFormKeysLabel">Metadata Keys</label> + <input type="text" class="form-control mb-2 mr-sm-2" id="filterFormKeys" placeholder="Metadata Keys"> + + <button type="button" class="btn btn-primary mb-2" id="filterButton" onclick="filterButtonPressed()">Filter</button> + </form> <table class="table table-hover" id="datasetListTable"> <thead> @@ -68,6 +85,7 @@ showListingOrSingleDataset(); showElementsDependingOnLoginStatus(getInfo(false)); fillTemplateSelect(); - $('#templateSelector').change(updateTemplateParam) + $('#templateSelector').change(updateTemplateParam); + prefillFilterForm(); </script> {% endblock %} \ No newline at end of file