diff --git a/front/deviceDetails.php b/front/deviceDetails.php
index fd61f163..26d58d45 100755
--- a/front/deviceDetails.php
+++ b/front/deviceDetails.php
@@ -416,9 +416,25 @@ async function renderSmallBoxes() {
showSpinner();
// Get data from the server
- const response = await fetch(`php/server/devices.php?action=getServerDeviceData&mac=${getMac()}&period=${period}`);
+ const protocol = window.location.protocol.replace(':', '');
+ const host = window.location.hostname;
+ const apiToken = getSetting("API_TOKEN");
+ const port = getSetting("GRAPHQL_PORT"); // same port your Flask app runs on
+
+ const apiBase = `${protocol}://${host}:${port}`;
+ const url = `${apiBase}/device/${getMac()}?period=${encodeURIComponent(period)}`;
+
+ const response = await fetch(url, {
+ method: "GET",
+ headers: {
+ "Authorization": `Bearer ${apiToken}`,
+ "Content-Type": "application/json"
+ }
+ });
+
if (!response.ok) {
- throw new Error(`Error fetching device data: ${response.statusText}`);
+ const text = await response.text();
+ throw new Error(`Error fetching device data: ${response.status} ${text}`);
}
const deviceData = await response.json();
diff --git a/front/deviceDetailsEdit.php b/front/deviceDetailsEdit.php
index e18b188d..69472e93 100755
--- a/front/deviceDetailsEdit.php
+++ b/front/deviceDetailsEdit.php
@@ -1,280 +1,319 @@
+//------------------------------------------------------------------------------
+// check if authenticated
+require_once $_SERVER["DOCUMENT_ROOT"] . "/php/templates/security.php"; ?>
-
+
-
-
-
-
-
+
+
+
+
+
\ No newline at end of file
diff --git a/front/php/server/devices.php b/front/php/server/devices.php
index 88095a0e..67d02854 100755
--- a/front/php/server/devices.php
+++ b/front/php/server/devices.php
@@ -31,7 +31,6 @@
$action = $_REQUEST['action'];
switch ($action) {
// check server/api_server/api_server_start.py for equivalents
- case 'getServerDeviceData': getServerDeviceData(); break; // equivalent: get_device_data
case 'deleteDevice': deleteDevice(); break; // equivalent: delete_device(mac)
case 'deleteAllWithEmptyMACs': deleteAllWithEmptyMACs(); break; // equivalent: delete_all_with_empty_macs
@@ -55,150 +54,6 @@
}
-
-//------------------------------------------------------------------------------
-// Query Device Data
-//------------------------------------------------------------------------------
-function getServerDeviceData() {
- global $db;
-
- // Request Parameters
- $periodDate = getDateFromPeriod();
- $mac = $_REQUEST['mac'];
-
- // Check for "new" MAC case
- if ($mac === "new") {
- $now = date('Y-m-d H:i');
- $deviceData = [
- "devMac" => "",
- "devName" => "",
- "devOwner" => "",
- "devType" => "",
- "devVendor" => "",
- "devFavorite" => 0,
- "devGroup" => "",
- "devComments" => "",
- "devFirstConnection" => $now,
- "devLastConnection" => $now,
- "devLastIP" => "",
- "devStaticIP" => 0,
- "devScan" => 0,
- "devLogEvents" => 0,
- "devAlertEvents" => 0,
- "devAlertDown" => 0,
- "devParentRelType" => "default",
- "devReqNicsOnline" => 0,
- "devSkipRepeated" => 0,
- "devLastNotification" => "",
- "devPresentLastScan" => 0,
- "devIsNew" => 1,
- "devLocation" => "",
- "devIsArchived" => 0,
- "devParentMAC" => "",
- "devParentPort" => "",
- "devIcon" => "",
- "devGUID" => "",
- "devSite" => "",
- "devSSID" => "",
- "devSyncHubNode" => "",
- "devSourcePlugin" => "",
- "devCustomProps" => "",
- "devStatus" => "Unknown",
- "devIsRandomMAC" => false,
- "devSessions" => 0,
- "devEvents" => 0,
- "devDownAlerts" => 0,
- "devPresenceHours" => 0,
- "devFQDN" => ""
- ];
- echo json_encode($deviceData);
- return;
- }
-
-
- // Get current date (used in presence calc)
- $currentdate = date("Y-m-d H:i:s");
-
- // Fetch Device Info + Children + Events Stats
- $sql =<<= $periodDate OR
- ses_DateTimeDisconnection >= $periodDate OR
- ses_StillConnected = 1
- )
- ) AS devSessions,
-
- (SELECT COUNT(*) FROM Events
- WHERE eve_MAC = d.devMac AND
- eve_DateTime >= $periodDate AND
- eve_EventType NOT IN ("Connected", "Disconnected")
- ) AS devEvents,
-
- (SELECT COUNT(*) FROM Events
- WHERE eve_MAC = d.devMac AND
- eve_DateTime >= $periodDate AND
- eve_EventType = "Device Down"
- ) AS devDownAlerts,
-
- (SELECT CAST(( MAX (0, SUM (julianday (IFNULL (ses_DateTimeDisconnection,'$currentdate'))
- - julianday (CASE WHEN ses_DateTimeConnection < $periodDate
- THEN $periodDate
- ELSE ses_DateTimeConnection END)) *24 )) AS INT)
- FROM Sessions
- WHERE ses_MAC = d.devMac AND
- ses_DateTimeConnection IS NOT NULL AND
- (ses_DateTimeDisconnection IS NOT NULL OR ses_StillConnected = 1) AND
- (
- ses_DateTimeConnection >= $periodDate OR
- ses_DateTimeDisconnection >= $periodDate OR
- ses_StillConnected = 1
- )
- ) AS devPresenceHours
-
- FROM Devices d
- WHERE d.devMac = "$mac" OR CAST(d.rowid AS TEXT) = "$mac"
- SQL;
-
- $row = $db->query($sql)->fetchArray(SQLITE3_ASSOC);
- $deviceData = $row;
- $mac = $deviceData['devMac'];
-
- $deviceData['devFirstConnection'] = formatDate($deviceData['devFirstConnection']);
- $deviceData['devLastConnection'] = formatDate($deviceData['devLastConnection']);
- $deviceData['devIsRandomMAC'] = isRandomMAC($mac);
-
- // Fetch children once and split in PHP
- $sql = 'SELECT rowid, * FROM Devices WHERE devParentMAC = "' . $mac . '" ORDER BY devPresentLastScan DESC';
- $result = $db->query($sql);
- $children = [];
- $childrenNics = [];
-
- while ($row = $result->fetchArray(SQLITE3_ASSOC)) {
- $children[] = $row;
- if ($row['devParentRelType'] === 'nic') {
- $childrenNics[] = $row;
- }
- }
-
- $deviceData['devChildrenDynamic'] = $children;
- $deviceData['devChildrenNicsDynamic'] = $childrenNics;
-
- // Return JSON
- echo json_encode($deviceData);
-
-}
-
//------------------------------------------------------------------------------
// Delete Device
//------------------------------------------------------------------------------
diff --git a/server/api_server/graphql_endpoint.py b/server/api_server/graphql_endpoint.py
index c9465d63..6feb37e1 100755
--- a/server/api_server/graphql_endpoint.py
+++ b/server/api_server/graphql_endpoint.py
@@ -366,9 +366,9 @@ class Query(ObjectType):
return DeviceResult(devices=devices, count=total_count)
# --- SETTINGS ---
- settings = Field(SettingResult)
+ settings = Field(SettingResult, filters=List(FilterOptionsInput))
- def resolve_settings(root, info):
+ def resolve_settings(root, info, filters=None):
try:
with open(folder + "table_settings.json", "r") as f:
settings_data = json.load(f)["data"]
@@ -379,7 +379,18 @@ class Query(ObjectType):
mylog("trace", f"[graphql_schema] settings_data: {settings_data}")
# Convert to Setting objects
- settings = [Setting(**setting) for setting in settings_data]
+ settings = [Setting(**s) for s in settings_data]
+
+ # Apply dynamic filters (OR)
+ if filters:
+ filtered_settings = []
+ for s in settings:
+ for f in filters:
+ if f.filterColumn and f.filterValue is not None:
+ if str(getattr(s, f.filterColumn, "")).lower() == str(f.filterValue).lower():
+ filtered_settings.append(s)
+ break # match one filter is enough (OR)
+ settings = filtered_settings
return SettingResult(settings=settings, count=len(settings))