0 LEFT JOIN vendors ON vendor_id = network_vendor_id AND network_vendor_id > 0"; // The views and the type $shows = [ '' => ['label' => 'Active', 'icon' => 'fa-network-wired', 'where' => 'network_archived_at IS NULL'], 'starred' => ['label' => 'Starred', 'icon' => 'fa-star', 'where' => 'network_archived_at IS NULL AND network_favorite = 1'], 'archived' => ['label' => 'Archived', 'icon' => 'fa-archive', 'where' => 'network_archived_at IS NOT NULL'], ]; $show = isset($shows[$_GET['show'] ?? '']) ? ($_GET['show'] ?? '') : ''; $type_filter = isset(NETWORK_TYPES[$_GET['type'] ?? '']) ? $_GET['type'] : ''; $view_query = 'AND ' . $shows[$show]['where'] . ($type_filter ? " AND network_type = '$type_filter'" : ''); // Only these sort - an unknown column would take the page down $sortable_columns = [ 'network_name' => "network_name $order", 'client_name' => "client_name $order, network_name ASC", 'network' => "INET6_ATON(SUBSTRING_INDEX(network, '/', 1)) $order, network_name ASC", 'network_vlan' => "network_vlan IS NULL, network_vlan $order, network_name ASC", 'network_type' => "FIELD(network_type, '" . implode("', '", array_keys(NETWORK_TYPES)) . "') $order, network_name ASC", 'location_name' => "location_name IS NULL, location_name $order, network_name ASC", ]; if (!isset($sortable_columns[$sort])) { $sort = 'network_name'; } $sql = mysqli_query($mysqli, "SELECT SQL_CALC_FOUND_ROWS networks.*, client_name, location_name, vendor_name FROM networks $joins WHERE $filters $view_query ORDER BY network_favorite DESC, {$sortable_columns[$sort]}, network_id DESC LIMIT $record_from, $record_to"); $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $networks = []; while ($row = mysqli_fetch_assoc($sql)) { $networks[intval($row['network_id'])] = $row; } $addresses = networkAddresses(array_keys($networks)); $networks_tags = tagsForRecords('network', array_keys($networks)); $usage = networkUsage($networks, $addresses); $problems = []; foreach ($networks as $network_id => $row) { $problems[$network_id] = networkAddressPlan($row, $addresses)['problems']; } // How many of each, for the pills - the views over what the filters leave, the types within the view $view_counts = []; $row = mysqli_fetch_row(mysqli_query($mysqli, "SELECT " . implode(', ', array_map(function ($s) { return "COALESCE(SUM({$s['where']}), 0)"; }, $shows)) . " FROM networks $joins WHERE $filters")); foreach (array_keys($shows) as $i => $key) { $view_counts[$key] = intval($row[$i]); } $type_counts = []; $sql_types = mysqli_query($mysqli, "SELECT network_type, COUNT(*) FROM networks $joins WHERE $filters AND {$shows[$show]['where']} GROUP BY network_type"); while ($row = mysqli_fetch_row($sql_types)) { $key = isset(NETWORK_TYPES[$row[0]]) ? $row[0] : 'Other'; $type_counts[$key] = ($type_counts[$key] ?? 0) + intval($row[1]); } $filter_url = function ($changes) { $params = array_merge($_GET, $changes); unset($params['page']); return '?' . http_build_query(array_filter($params, function ($v) { return $v !== '' && $v !== null; })); }; $sort_link = function ($column, $label) use ($url_query_strings_sort, $sort, $disp, $order_icon) { return '' . $label . ($sort === $column ? " $order_icon" : '') . ''; }; $csrf = $_SESSION['csrf_token']; ?>