Enhance device filters: support label for dropdown options and improve SQL queries #1611

This commit is contained in:
Jokob @NetAlertX
2026-04-14 20:38:37 +00:00
parent 98a1ac1336
commit 285bd3ec22
3 changed files with 40 additions and 21 deletions

View File

@@ -436,22 +436,28 @@ function initFilters() {
if (existingFilter) {
// Add the unique columnValue to options if not already present
if (!existingFilter.options.includes(entry.columnValue)) {
existingFilter.options.push(entry.columnValue);
if (!existingFilter.options.some(opt => opt.value === entry.columnValue)) {
existingFilter.options.push({
value: entry.columnValue,
label: entry.columnLabel || entry.columnValue
});
}
} else {
// Create a new filter entry
transformed.filters.push({
column: entry.columnName,
headerKey: entry.columnHeaderStringKey,
options: [entry.columnValue]
options: [{
value: entry.columnValue,
label: entry.columnLabel || entry.columnValue
}]
});
}
});
// Sort options alphabetically for better readability
// Sort options alphabetically by label for better readability
transformed.filters.forEach(filter => {
filter.options.sort();
filter.options.sort((a, b) => a.label.localeCompare(b.label));
});
// Output the result

View File

@@ -10,9 +10,18 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/language/lang.php';
function renderFilterDropdown($headerKey, $columnName, $values) {
// Generate dropdown options
$optionsHtml = '<option value="" selected>All</option>'; // Default "All" option
foreach ($values as $value) {
$escapedValue = htmlspecialchars($value);
$optionsHtml .= '<option value="' . $escapedValue . '">' . $escapedValue . '</option>';
foreach ($values as $item) {
// Support both {value, label} objects and plain strings (backward compat)
if (is_array($item)) {
$val = $item['value'] ?? '';
$label = $item['label'] ?? $val;
} else {
$val = $item;
$label = $item;
}
$escapedValue = htmlspecialchars($val);
$escapedLabel = htmlspecialchars($label);
$optionsHtml .= '<option value="' . $escapedValue . '">' . $escapedLabel . '</option>';
}
// Generate the dropdown HTML

View File

@@ -69,40 +69,44 @@ sql_devices_all = """
sql_appevents = """select * from AppEvents order by dateTimeCreated desc"""
sql_devices_filters = """
SELECT DISTINCT 'devSite' AS columnName, devSite AS columnValue
SELECT DISTINCT 'devSite' AS columnName, devSite AS columnValue, devSite AS columnLabel
FROM Devices WHERE devSite NOT IN ('', 'null') AND devSite IS NOT NULL
UNION
SELECT DISTINCT 'devSourcePlugin' AS columnName, devSourcePlugin AS columnValue
SELECT DISTINCT 'devSourcePlugin' AS columnName, devSourcePlugin AS columnValue, devSourcePlugin AS columnLabel
FROM Devices WHERE devSourcePlugin NOT IN ('', 'null') AND devSourcePlugin IS NOT NULL
UNION
SELECT DISTINCT 'devOwner' AS columnName, devOwner AS columnValue
SELECT DISTINCT 'devOwner' AS columnName, devOwner AS columnValue, devOwner AS columnLabel
FROM Devices WHERE devOwner NOT IN ('', 'null') AND devOwner IS NOT NULL
UNION
SELECT DISTINCT 'devType' AS columnName, devType AS columnValue
SELECT DISTINCT 'devType' AS columnName, devType AS columnValue, devType AS columnLabel
FROM Devices WHERE devType NOT IN ('', 'null') AND devType IS NOT NULL
UNION
SELECT DISTINCT 'devGroup' AS columnName, devGroup AS columnValue
SELECT DISTINCT 'devGroup' AS columnName, devGroup AS columnValue, devGroup AS columnLabel
FROM Devices WHERE devGroup NOT IN ('', 'null') AND devGroup IS NOT NULL
UNION
SELECT DISTINCT 'devLocation' AS columnName, devLocation AS columnValue
SELECT DISTINCT 'devLocation' AS columnName, devLocation AS columnValue, devLocation AS columnLabel
FROM Devices WHERE devLocation NOT IN ('', 'null') AND devLocation IS NOT NULL
UNION
SELECT DISTINCT 'devVendor' AS columnName, devVendor AS columnValue
SELECT DISTINCT 'devVendor' AS columnName, devVendor AS columnValue, devVendor AS columnLabel
FROM Devices WHERE devVendor NOT IN ('', 'null') AND devVendor IS NOT NULL
UNION
SELECT DISTINCT 'devSyncHubNode' AS columnName, devSyncHubNode AS columnValue
SELECT DISTINCT 'devSyncHubNode' AS columnName, devSyncHubNode AS columnValue, devSyncHubNode AS columnLabel
FROM Devices WHERE devSyncHubNode NOT IN ('', 'null') AND devSyncHubNode IS NOT NULL
UNION
SELECT DISTINCT 'devVlan' AS columnName, devVlan AS columnValue
SELECT DISTINCT 'devVlan' AS columnName, devVlan AS columnValue, devVlan AS columnLabel
FROM Devices WHERE devVlan NOT IN ('', 'null') AND devVlan IS NOT NULL
UNION
SELECT DISTINCT 'devParentMAC' AS columnName, devParentMAC AS columnValue
FROM Devices WHERE devParentMAC NOT IN ('', 'null') AND devParentMAC IS NOT NULL
SELECT 'devParentMAC' AS columnName, d.devParentMAC AS columnValue,
COALESCE(p.devName, d.devParentMAC) AS columnLabel
FROM Devices d
LEFT JOIN Devices p ON LOWER(p.devMac) = LOWER(d.devParentMAC)
WHERE d.devParentMAC NOT IN ('', 'null') AND d.devParentMAC IS NOT NULL
GROUP BY d.devParentMAC COLLATE NOCASE
UNION
SELECT DISTINCT 'devParentRelType' AS columnName, devParentRelType AS columnValue
SELECT DISTINCT 'devParentRelType' AS columnName, devParentRelType AS columnValue, devParentRelType AS columnLabel
FROM Devices WHERE devParentRelType NOT IN ('', 'null') AND devParentRelType IS NOT NULL
UNION
SELECT DISTINCT 'devSSID' AS columnName, devSSID AS columnValue
SELECT DISTINCT 'devSSID' AS columnName, devSSID AS columnValue, devSSID AS columnLabel
FROM Devices WHERE devSSID NOT IN ('', 'null') AND devSSID IS NOT NULL
ORDER BY columnName;
"""