Added query update functionality in the front-end
This commit is contained in:
@@ -207,26 +207,70 @@
|
|||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
|
||||||
<!-- Access times -->
|
<!-- Access times -->
|
||||||
<h3>Access times</h3>
|
<h3>@T["Access times"]</h3>
|
||||||
<ul id="queryAccessTimes" class="list-group mb-4"></ul>
|
<ul id="queryDetailsAccessTimes" class="list-group mb-4"></ul>
|
||||||
|
|
||||||
<!-- Results -->
|
<!-- Results -->
|
||||||
<h3>Results</h3>
|
<h3>@T["Results"]</h3>
|
||||||
<table class="table table-sm table-striped">
|
<table class="table table-sm table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Score</th>
|
<th>@T["Score"]</th>
|
||||||
<th>Name</th>
|
<th>@T["Name"]</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="queryResultsBody"></tbody>
|
<tbody id="queryDetailsResultsBody"></tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
|
||||||
Close
|
@T["Close"]
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Query Update Modal -->
|
||||||
|
<div class="modal fade" id="queryUpdateModal" tabindex="-1" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-xl modal-dialog-scrollable">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header bg-warning">
|
||||||
|
<h2 class="modal-title" id="queryUpdateTitle">@T["Query Update"] - <span id="queryUpdateQueryName"></span></h2>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
|
||||||
|
<!-- Access times -->
|
||||||
|
<h3>@T["Access times"]</h3>
|
||||||
|
<ul id="queryUpdateAccessTimes" class="list-group mb-4"></ul>
|
||||||
|
|
||||||
|
<!-- Results -->
|
||||||
|
<h3>@T["Results"]</h3>
|
||||||
|
<table class="table table-sm table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th style="width: 85px;">@T["Score"]</th>
|
||||||
|
<th>@T["Name"]</th>
|
||||||
|
<th>@T["Action"]</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="queryUpdateResultsBody"></tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-warning" id="queryUpdateConfirm" data-bs-dismiss="modal">
|
||||||
|
@T["Update"]
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">
|
||||||
|
@T["Close"]
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -537,6 +581,60 @@
|
|||||||
var queries = null;
|
var queries = null;
|
||||||
var models = JSON.parse('@Html.Raw(System.Text.Json.JsonSerializer.Serialize(models))');
|
var models = JSON.parse('@Html.Raw(System.Text.Json.JsonSerializer.Serialize(models))');
|
||||||
|
|
||||||
|
let draggedRow = null;
|
||||||
|
document.addEventListener("dragstart", e => {
|
||||||
|
if (e.target.tagName === "TR") {
|
||||||
|
draggedRow = e.target;
|
||||||
|
e.target.classList.add("table-warning");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("dragend", e => {
|
||||||
|
if (e.target.tagName === "TR") {
|
||||||
|
e.target.classList.remove("table-warning");
|
||||||
|
}
|
||||||
|
document.querySelectorAll(".table-warning").forEach(x => x.classList.remove("table-warning"));
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("dragenter", e => {
|
||||||
|
if (e.target.tagName === "TR") {
|
||||||
|
e.target.classList.add("table-warning");
|
||||||
|
} else if (e.target.tagName == "TD") {
|
||||||
|
e.target.parentElement.classList.add("table-warning");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("dragleave", e => {
|
||||||
|
if (e.target.tagName === "TR") {
|
||||||
|
e.target.classList.remove("table-warning");
|
||||||
|
} else if (e.target.tagName == "TD") {
|
||||||
|
e.target.parentElement.classList.remove("table-warning");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
document.addEventListener("dragover", e => {
|
||||||
|
if (e.target.closest("tr")) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener("drop", e => {
|
||||||
|
const targetRow = e.target.closest("tr");
|
||||||
|
if (draggedRow && targetRow && draggedRow !== targetRow && targetRow.parentElement.tagName !== "THEAD") {
|
||||||
|
if (!draggedRow || !targetRow || draggedRow === targetRow) return;
|
||||||
|
|
||||||
|
const rect = targetRow.getBoundingClientRect();
|
||||||
|
const isAfter = e.clientY > rect.top + rect.height / 2;
|
||||||
|
|
||||||
|
const parent = targetRow.parentNode;
|
||||||
|
|
||||||
|
if (isAfter) {
|
||||||
|
parent.insertBefore(draggedRow, targetRow.nextSibling);
|
||||||
|
} else {
|
||||||
|
parent.insertBefore(draggedRow, targetRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
const filterInput = document.getElementById('entitiesFilter');
|
const filterInput = document.getElementById('entitiesFilter');
|
||||||
|
|
||||||
@@ -814,6 +912,33 @@
|
|||||||
console.error('Error creating entity:', error);
|
console.error('Error creating entity:', error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
document
|
||||||
|
.getElementById('queryUpdateConfirm')
|
||||||
|
.addEventListener('click', () => {
|
||||||
|
let searchdomain = domains[getSelectedDomainKey()];
|
||||||
|
let query = document.getElementById('queryUpdateQueryName').textContent;
|
||||||
|
let data = getQueryUpdateTableData();
|
||||||
|
console.log()
|
||||||
|
fetch(`/Searchdomain/Searches?searchdomain=${searchdomain}&query=${query}`, {
|
||||||
|
method: 'PATCH',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(data)
|
||||||
|
}).then(async response => {
|
||||||
|
result = await response.json();
|
||||||
|
if (response.ok && result.Success) {
|
||||||
|
// TODO add toast
|
||||||
|
console.log('Search query was deleted successfully');
|
||||||
|
selectDomain(getSelectedDomainKey());
|
||||||
|
} else {
|
||||||
|
// TODO add toast
|
||||||
|
console.error('Failed to delete query:', result.Message);
|
||||||
|
}
|
||||||
|
}).catch(error => {
|
||||||
|
console.error('Error creating entity:', error);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function deleteSearchdomain(domainKey) {
|
function deleteSearchdomain(domainKey) {
|
||||||
@@ -1112,6 +1237,13 @@
|
|||||||
btnDetails.addEventListener('click', () => {
|
btnDetails.addEventListener('click', () => {
|
||||||
showQueryDetails(query);
|
showQueryDetails(query);
|
||||||
});
|
});
|
||||||
|
const btnUpdate = document.createElement('button');
|
||||||
|
btnUpdate.className = 'btn btn-sm btn-warning';
|
||||||
|
btnUpdate.textContent = '@T["Update"]';
|
||||||
|
btnUpdate.addEventListener('click', () => {
|
||||||
|
showQueryUpdate(query);
|
||||||
|
});
|
||||||
|
|
||||||
const btnDelete = document.createElement('button');
|
const btnDelete = document.createElement('button');
|
||||||
btnDelete.className = 'btn btn-sm btn-danger';
|
btnDelete.className = 'btn btn-sm btn-danger';
|
||||||
btnDelete.textContent = '@T["Delete"]';
|
btnDelete.textContent = '@T["Delete"]';
|
||||||
@@ -1127,6 +1259,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
actionCell.appendChild(btnDetails);
|
actionCell.appendChild(btnDetails);
|
||||||
|
actionCell.appendChild(btnUpdate);
|
||||||
actionCell.appendChild(btnDelete);
|
actionCell.appendChild(btnDelete);
|
||||||
row.appendChild(actionCell);
|
row.appendChild(actionCell);
|
||||||
|
|
||||||
@@ -1216,7 +1349,7 @@
|
|||||||
document.getElementById('queryDetailsQueryName').innerText = query.Name;
|
document.getElementById('queryDetailsQueryName').innerText = query.Name;
|
||||||
|
|
||||||
/* ---------- Access times ---------- */
|
/* ---------- Access times ---------- */
|
||||||
const accessList = document.getElementById('queryAccessTimes');
|
const accessList = document.getElementById('queryDetailsAccessTimes');
|
||||||
accessList.innerHTML = '';
|
accessList.innerHTML = '';
|
||||||
|
|
||||||
if (!query.AccessDateTimes || query.AccessDateTimes.length === 0) {
|
if (!query.AccessDateTimes || query.AccessDateTimes.length === 0) {
|
||||||
@@ -1234,7 +1367,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ---------- Results ---------- */
|
/* ---------- Results ---------- */
|
||||||
const resultsBody = document.getElementById('queryResultsBody');
|
const resultsBody = document.getElementById('queryDetailsResultsBody');
|
||||||
resultsBody.innerHTML = '';
|
resultsBody.innerHTML = '';
|
||||||
|
|
||||||
if (!query.Results || query.Results.length === 0) {
|
if (!query.Results || query.Results.length === 0) {
|
||||||
@@ -1262,6 +1395,73 @@
|
|||||||
modal.show();
|
modal.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showQueryUpdate(query) {
|
||||||
|
// Title
|
||||||
|
document.getElementById('queryUpdateQueryName').innerText = query.Name;
|
||||||
|
|
||||||
|
/* ---------- Access times ---------- */
|
||||||
|
const accessList = document.getElementById('queryUpdateAccessTimes');
|
||||||
|
accessList.innerHTML = '';
|
||||||
|
|
||||||
|
if (!query.AccessDateTimes || query.AccessDateTimes.length === 0) {
|
||||||
|
accessList.innerHTML = `
|
||||||
|
<li class="list-group-item text-muted text-center">
|
||||||
|
No access times
|
||||||
|
</li>`;
|
||||||
|
} else {
|
||||||
|
query.AccessDateTimes.forEach(dt => {
|
||||||
|
const li = document.createElement('li');
|
||||||
|
li.className = 'list-group-item';
|
||||||
|
li.textContent = new Date(dt).toLocaleString();
|
||||||
|
accessList.appendChild(li);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------- Results ---------- */
|
||||||
|
const resultsBody = document.getElementById('queryUpdateResultsBody');
|
||||||
|
resultsBody.innerHTML = '';
|
||||||
|
|
||||||
|
if (!query.Results || query.Results.length === 0) {
|
||||||
|
resultsBody.innerHTML = `
|
||||||
|
<tr>
|
||||||
|
<td colspan="2" class="text-muted text-center">
|
||||||
|
No results
|
||||||
|
</td>
|
||||||
|
</tr>`;
|
||||||
|
} else {
|
||||||
|
query.Results.forEach(r => {
|
||||||
|
const row = document.createElement('tr');
|
||||||
|
row.setAttribute("draggable", true);
|
||||||
|
const tdScore = document.createElement('td');
|
||||||
|
const scoreInput = document.createElement('input');
|
||||||
|
scoreInput.classList.add('form-control');
|
||||||
|
scoreInput.value = r.Score.toFixed(4);
|
||||||
|
tdScore.append(scoreInput);
|
||||||
|
const tdName = document.createElement('td');
|
||||||
|
tdName.classList.add("text-break");
|
||||||
|
tdName.innerText = r.Name;
|
||||||
|
const tdAction = document.createElement('td');
|
||||||
|
const deleteButton = document.createElement('button');
|
||||||
|
deleteButton.classList.add('btn', 'btn-danger', 'btn-sm');
|
||||||
|
deleteButton.innerText = '@T["Delete"]';
|
||||||
|
deleteButton.onclick = function() {
|
||||||
|
row.remove();
|
||||||
|
};
|
||||||
|
tdAction.append(deleteButton);
|
||||||
|
row.append(tdScore);
|
||||||
|
row.append(tdName);
|
||||||
|
row.append(tdAction);
|
||||||
|
resultsBody.appendChild(row);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show modal
|
||||||
|
const modal = new bootstrap.Modal(
|
||||||
|
document.getElementById('queryUpdateModal')
|
||||||
|
);
|
||||||
|
modal.show();
|
||||||
|
}
|
||||||
|
|
||||||
function NumberOfBytesAsHumanReadable(bytes, decimals = 2) {
|
function NumberOfBytesAsHumanReadable(bytes, decimals = 2) {
|
||||||
if (bytes === 0) return '0 B';
|
if (bytes === 0) return '0 B';
|
||||||
if (bytes > 1.20892581961*(10**27)) return "∞ B";
|
if (bytes > 1.20892581961*(10**27)) return "∞ B";
|
||||||
@@ -1456,4 +1656,26 @@
|
|||||||
tr.append(tdAction);
|
tr.append(tdAction);
|
||||||
entityDatapointsContainer.append(tr);
|
entityDatapointsContainer.append(tr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getQueryUpdateTableData() {
|
||||||
|
const tbody = document.getElementById('queryUpdateResultsBody');
|
||||||
|
const rows = tbody.getElementsByTagName('tr');
|
||||||
|
const result = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < rows.length; i++) {
|
||||||
|
const row = rows[i];
|
||||||
|
const cells = row.getElementsByTagName('td');
|
||||||
|
|
||||||
|
// Get the text content from the second cell (index 1) which contains the path
|
||||||
|
const score = parseFloat(cells[0].firstChild.value);
|
||||||
|
const name = cells[1].textContent.trim();
|
||||||
|
|
||||||
|
result.push({
|
||||||
|
"Score": score,
|
||||||
|
"Name": name
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
Reference in New Issue
Block a user