diff --git a/front/devices.php b/front/devices.php index 19095e52..e08fdbc4 100755 --- a/front/devices.php +++ b/front/devices.php @@ -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 diff --git a/front/php/components/devices_filters.php b/front/php/components/devices_filters.php index 0a376b4f..9f36d792 100755 --- a/front/php/components/devices_filters.php +++ b/front/php/components/devices_filters.php @@ -10,9 +10,18 @@ require_once $_SERVER['DOCUMENT_ROOT'] . '/php/templates/language/lang.php'; function renderFilterDropdown($headerKey, $columnName, $values) { // Generate dropdown options $optionsHtml = ''; // Default "All" option - foreach ($values as $value) { - $escapedValue = htmlspecialchars($value); - $optionsHtml .= ''; + 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 .= ''; } // Generate the dropdown HTML diff --git a/server/const.py b/server/const.py index 1e554c9b..34cd033a 100755 --- a/server/const.py +++ b/server/const.py @@ -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; """