+
+
+
+
+
+
+
@T["Access times"]
+
+
+
+
@T["Results"]
+
+
+
+ | @T["Score"] |
+ @T["Name"] |
+ @T["Action"] |
+
+
+
+
+
+
+
+
@@ -537,6 +581,60 @@
var queries = null;
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', () => {
const filterInput = document.getElementById('entitiesFilter');
@@ -814,6 +912,33 @@
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) {
@@ -1112,6 +1237,13 @@
btnDetails.addEventListener('click', () => {
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');
btnDelete.className = 'btn btn-sm btn-danger';
btnDelete.textContent = '@T["Delete"]';
@@ -1127,6 +1259,7 @@
});
actionCell.appendChild(btnDetails);
+ actionCell.appendChild(btnUpdate);
actionCell.appendChild(btnDelete);
row.appendChild(actionCell);
@@ -1216,7 +1349,7 @@
document.getElementById('queryDetailsQueryName').innerText = query.Name;
/* ---------- Access times ---------- */
- const accessList = document.getElementById('queryAccessTimes');
+ const accessList = document.getElementById('queryDetailsAccessTimes');
accessList.innerHTML = '';
if (!query.AccessDateTimes || query.AccessDateTimes.length === 0) {
@@ -1234,7 +1367,7 @@
}
/* ---------- Results ---------- */
- const resultsBody = document.getElementById('queryResultsBody');
+ const resultsBody = document.getElementById('queryDetailsResultsBody');
resultsBody.innerHTML = '';
if (!query.Results || query.Results.length === 0) {
@@ -1262,6 +1395,73 @@
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 = `
+
+ No access times
+ `;
+ } 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 = `
+
+ |
+ No results
+ |
+
`;
+ } 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) {
if (bytes === 0) return '0 B';
if (bytes > 1.20892581961*(10**27)) return "∞ B";
@@ -1456,4 +1656,26 @@
tr.append(tdAction);
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;
+ }
\ No newline at end of file