From e0449bed8e69bdd2d6ac43b00a8a31d60d97d51c Mon Sep 17 00:00:00 2001 From: jokob-sk Date: Sun, 5 Jul 2026 22:38:29 +1000 Subject: [PATCH] BE+FE: change log --- back/app.conf | 4 +- docs/API_GRAPHQL.md | 52 +-- docs/PERFORMANCE.md | 8 + docs/WHERE_NETALERTX_FITS.md | 284 ++++++++++++++++ .../img/DEVICE_MANAGEMENT/device_presence.png | Bin 0 -> 100925 bytes docs/index.md | 17 + front/changeLog.php | 17 + front/changeLogCore.php | 311 ++++++++++++++++++ front/change_history.php | 210 ------------ front/css/app.css | 3 +- front/deviceDetails.php | 169 +--------- front/js/cache.js | 39 +++ front/php/templates/header.php | 6 +- front/php/templates/language/ar_ar.json | 17 + front/php/templates/language/ca_ca.json | 19 +- front/php/templates/language/cs_cz.json | 19 +- front/php/templates/language/de_de.json | 19 +- front/php/templates/language/en_us.json | 25 +- front/php/templates/language/es_es.json | 19 +- front/php/templates/language/fa_fa.json | 17 + front/php/templates/language/fi_fi.json | 17 + front/php/templates/language/fr_fr.json | 25 +- front/php/templates/language/he_il.json | 17 + front/php/templates/language/id_id.json | 17 + front/php/templates/language/it_it.json | 25 +- front/php/templates/language/ja_jp.json | 19 +- front/php/templates/language/nb_no.json | 17 + front/php/templates/language/pl_pl.json | 17 + front/php/templates/language/pt_br.json | 17 + front/php/templates/language/pt_pt.json | 19 +- front/php/templates/language/ru_ru.json | 19 +- front/php/templates/language/sv_sv.json | 17 + front/php/templates/language/tr_tr.json | 17 + front/php/templates/language/uk_ua.json | 17 + front/php/templates/language/vi_vn.json | 17 + front/php/templates/language/zh_cn.json | 19 +- front/php/templates/skel_change_log.php | 26 ++ front/pluginsCore.php | 2 +- server/api_server/api_server_start.py | 4 +- server/api_server/graphql_endpoint.py | 125 ++++--- server/api_server/graphql_helpers.py | 26 ++ server/api_server/graphql_types.py | 6 +- server/initialise.py | 61 ++-- server/models/device_history_instance.py | 87 ++++- 44 files changed, 1346 insertions(+), 542 deletions(-) create mode 100644 docs/WHERE_NETALERTX_FITS.md create mode 100644 docs/img/DEVICE_MANAGEMENT/device_presence.png create mode 100644 front/changeLog.php create mode 100644 front/changeLogCore.php delete mode 100644 front/change_history.php create mode 100644 front/php/templates/skel_change_log.php diff --git a/back/app.conf b/back/app.conf index a37991a1..105e4159 100755 --- a/back/app.conf +++ b/back/app.conf @@ -23,8 +23,8 @@ TIMEZONE='Europe/Berlin' LOADED_PLUGINS=['ARPSCAN', 'AVAHISCAN', 'CSVBCKP','DBCLNP', 'DIGSCAN', 'INTRNT', 'MAINT', 'NEWDEV', 'NBTSCAN', 'NSLOOKUP','NTFPRCS', 'SETPWD', 'SMTP', 'SYNC', 'VNDRPDT', 'WORKFLOWS', 'UI'] DAYS_TO_KEEP_EVENTS=90 -DEV_HIST_DAYS=14 -DEV_HIST_TRACKED=['devMac','devName','devOwner','devType','devVendor','devFavorite','devGroup','devComments','devLastIP','devFQDN','devPrimaryIPv4','devPrimaryIPv6','devVlan','devForceStatus','devStaticIP','devScan','devAlertDown','devCanSleep','devSkipRepeated','devLocation','devIsArchived','devParentMAC','devParentPort','devParentRelType','devReqNicsOnline','devIcon','devSite','devSSID','devSyncHubNode','devSourcePlugin','devMacSource','devNameSource','devFQDNSource','devLastIPSource','devVendorSource','devSSIDSource','devParentMACSource','devParentPortSource','devParentRelTypeSource','devVlanSource','devCustomProps'] +DEV_HIST_DAYS=1 +DEV_HIST_TRACKED=['devMac','devName','devOwner','devType','devVendor','devFavorite','devGroup','devComments','devLastIP','devFQDN','devPrimaryIPv4','devPrimaryIPv6','devVlan','devForceStatus','devStaticIP','devScan','devAlertDown','devCanSleep','devSkipRepeated','devLocation','devIsArchived','devParentMAC','devParentPort','devParentRelType','devReqNicsOnline','devIcon','devSite','devSSID','devSyncHubNode'] # Used for generating links in emails. Make sure not to add a trailing slash! REPORT_DASHBOARD_URL='update_REPORT_DASHBOARD_URL_setting' diff --git a/docs/API_GRAPHQL.md b/docs/API_GRAPHQL.md index 199cd30f..ff36a3f2 100755 --- a/docs/API_GRAPHQL.md +++ b/docs/API_GRAPHQL.md @@ -427,9 +427,9 @@ Device field change history is stored in `DevicesHistory` and exposed via two qu Returns grouped change events for one device. Events are grouped by `(timestamp, changedBy)` so that simultaneous field changes are returned as a single object. ```graphql -query DeviceHistory($devGuid: String!, $changedColumn: String, $changedBy: String, $limit: Int, $offset: Int) { +query DeviceHistory($devGUID: String!, $changedColumn: String, $changedBy: String, $limit: Int, $offset: Int) { deviceHistoryGrouped( - devGuid: $devGuid + devGUID: $devGUID changedColumn: $changedColumn changedBy: $changedBy limit: $limit @@ -454,7 +454,7 @@ query DeviceHistory($devGuid: String!, $changedColumn: String, $changedBy: Strin | Parameter | Type | Required | Description | |-----------------|----------|----------|----------------------------------------------------------------------| -| `devGuid` | `String` | ✅ | GUID of the device to fetch history for | +| `devGUID` | `String` | No | GUID of the device to fetch history for | | `changedColumn` | `String` | No | Filter to groups containing a change to this specific column | | `changedBy` | `String` | No | Filter to a specific attribution source (`USER`, `ARPSCAN`, etc.) | | `limit` | `Int` | No | Max grouped events to return (default `50`) | @@ -479,9 +479,9 @@ curl -X POST http://localhost:20212/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_TOKEN" \ -d '{ - "query": "query($devGuid:String!,$limit:Int,$offset:Int){deviceHistoryGrouped(devGuid:$devGuid,limit:$limit,offset:$offset){count history{timestamp changedBy changes{changedColumn oldValue newValue}}}}", + "query": "query($devGUID:String!,$limit:Int,$offset:Int){deviceHistoryGrouped(devGUID:$devGUID,limit:$limit,offset:$offset){count history{timestamp changedBy changes{changedColumn oldValue newValue}}}}", "variables": { - "devGuid": "your-device-guid-here", + "devGUID": "your-device-guid-here", "limit": 25, "offset": 0 } @@ -490,47 +490,7 @@ curl -X POST http://localhost:20212/graphql \ --- -### `allDeviceHistoryGrouped` — All Devices (Global View) -Identical to `deviceHistoryGrouped` but returns changes across **all devices**. Used by the Change History page under Monitoring. Does not accept a `devGuid` parameter. - -```graphql -query AllHistory($changedColumn: String, $changedBy: String, $limit: Int, $offset: Int) { - allDeviceHistoryGrouped( - changedColumn: $changedColumn - changedBy: $changedBy - limit: $limit - offset: $offset - ) { - count - history { - devGUID - timestamp - changedBy - changes { - changedColumn - oldValue - newValue - } - } - } -} -``` - -#### `curl` Example - -```sh -curl -X POST http://localhost:20212/graphql \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer YOUR_API_TOKEN" \ - -d '{ - "query": "query($changedBy:String,$limit:Int){allDeviceHistoryGrouped(changedBy:$changedBy,limit:$limit){count history{devGUID timestamp changedBy changes{changedColumn oldValue newValue}}}}", - "variables": { - "changedBy": "USER", - "limit": 50 - } - }' -``` --- @@ -539,7 +499,7 @@ curl -X POST http://localhost:20212/graphql \ To populate dynamic filter dropdowns, fetch available `changedBy` and `changedColumn` values via the REST endpoint: ```sh -GET /devices/history/filters?devGuid= # scoped to one device +GET /devices/history/filters?devGUID= # scoped to one device GET /devices/history/filters # all devices ``` diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md index 8abd4d34..a6c74f6d 100755 --- a/docs/PERFORMANCE.md +++ b/docs/PERFORMANCE.md @@ -132,6 +132,14 @@ When **any** name-resolution plugin has `devName` in its `SET_ALWAYS` list, the The actual number of DB rows updated is logged at `verbose` level under `[Update Device Name] SET_ALWAYS re-resolve - DB rows updated`. + +--- + +## Disable change log tracking + +To improve performance, you can reduce or disable change log tracking. Use the `DEV_HIST_TRACKED` setting to limit tracking to specific columns, and adjust `DEV_HIST_DAYS` to control how long history is retained. Setting `DEV_HIST_DAYS` to `0` disables history tracking entirely. + + --- ## Storing Temporary Files in Memory diff --git a/docs/WHERE_NETALERTX_FITS.md b/docs/WHERE_NETALERTX_FITS.md new file mode 100644 index 00000000..0b56bd63 --- /dev/null +++ b/docs/WHERE_NETALERTX_FITS.md @@ -0,0 +1,284 @@ +# Where NetAlertX Fits + +Understanding where NetAlertX fits in your network management toolkit makes it easier to get the most from it. + +Modern networks are typically managed using several specialized tools. One application may monitor uptime, another may capture packets, another may enforce firewall rules, while another documents the network. + +NetAlertX fills a different role: it provides **continuous network visibility** by discovering devices, maintaining an accurate asset inventory, detecting changes, and notifying you when something important happens. + +It answers one of the most common questions in network administration: + +> **What is on my network, and what has changed?** + +--- + +## What NetAlertX Does + +NetAlertX continuously discovers devices using one or more discovery plugins and builds a living inventory of your network. + +Depending on your configuration, it can collect information including: + +* IP addresses +* MAC addresses +* Hostnames +* Vendors +* Device types +* Open ports +* Network interfaces +* Parent/child relationships +* First and last seen timestamps +* Custom metadata + +Because discovery runs continuously, your inventory stays up to date automatically. + +Learn more about the available discovery methods in the [Plugins](./PLUGINS.md) documentation. + +--- + +## Detecting Change + +Knowing what exists on your network is useful. + +Knowing **what changed** is often even more valuable. + +NetAlertX continuously records changes such as: + +* New devices +* Devices going offline or coming back online +* IP address changes +* Hostname changes +* Vendor identification +* Open port changes (via the `NMAP` [plugin](./PLUGINS.md)) +* Devices returning after long periods offline +* Configuration updates + +These changes become events that can be viewed historically, filtered, searched, or used to trigger automation. + +--- + +## Notifications + +![Global notification settings](./img/NOTIFICATIONS/Global-notification-settings.png) + +Not every event deserves immediate attention. + +NetAlertX lets you choose which events [generate notifications](./NOTIFICATIONS.md) so that important alerts stand out without creating unnecessary noise. + +Examples include: + +* Unknown devices joining the network +* Critical infrastructure becoming unavailable +* IP address changes +* Port changes +* Custom workflow events + +Notification publishers can be enabled independently, allowing NetAlertX to integrate with your existing communication channels. + +--- + +## Automation + +![Workflow Action target](./img/WORKFLOWS/actions_target.png) + +As networks grow, manually responding to every event quickly becomes impractical. + +NetAlertX includes a [workflow engine](./WORKFLOWS.md) that can automatically react to events. + +Typical automations include: + +* Mark trusted devices automatically +* Assign devices to groups +* Update fields +* Archive old devices with the same IP +* Assign devices to the right parent node + +Automation helps keep device management consistent while reducing repetitive administrative work. + +--- + +## Device Relationships + +![Hover relationships detail](./img/NETWORK_TREE/Network_tree_setup_hover.png) + +Networks are more than collections of independent devices. + +Devices often depend on one another. + +Examples include: + +* Access points connected to switches +* Virtual machines hosted by physical servers +* Containers running on hosts +* Network interfaces belonging to a parent device +* IoT gateways connected to sensors + +NetAlertX supports [device relationships](./NETWORK_TREE.md) to better represent how devices are connected and how they depend on each other. + +--- + +## Historical Visibility + +![Device presence](./img/DEVICE_MANAGEMENT/device_presence.png) + +Many monitoring systems focus only on the current state. + +NetAlertX also records historical information so you can answer questions like: + +* When was this device first discovered? +* When was it last online? +* Which ports have changed over time? + +Historical information provides valuable operational context without requiring a separate logging platform. + +--- + +## Plugin Architecture + +![Action target](./img/plugins_json_settings.png) + +Every environment is different. + +Some users prefer simple ARP scanning. + +Others rely on: + +* SNMP +* DHCP leases +* Router integrations +* Pi-hole +* Virtualization platforms +* Cloud services +* External asset inventories + +NetAlertX is built around a plugin architecture that allows multiple discovery sources to work together, improving accuracy while remaining flexible. + +See the complete list in [Plugins](./PLUGINS.md). + +--- + +## Integrations + +NetAlertX is designed to complement your existing infrastructure rather than replace it. + +It integrates with many popular platforms, including: + +* Home Assistant +* Pi-hole +* MQTT +* Notification services +* REST APIs +* Custom workflows + +This allows NetAlertX to become part of your existing automation and monitoring ecosystem. + +--- + +## How NetAlertX Compares + +The following diagram illustrates how NetAlertX complements other common network tools. + +| Need | Typical Tool | NetAlertX Role | +| --- | --- | --- | +| Device discovery | ✅ | **Core capability** | +| Asset inventory | ✅ | **Core capability** | +| Detect network changes | ✅ | **Core capability** | +| Historical device tracking | ✅ | **Core capability** | +| Notifications | ✅ | **Core capability** | +| Automation | ✅ | **Core capability** | +| Packet inspection | Wireshark | Not intended | +| Firewall enforcement | pfSense, OPNsense | Not intended | +| IDS/IPS | Suricata, Snort | Not intended | +| Network documentation | NetBox, NetMap | Complements them | +| Uptime monitoring | Uptime Kuma, Nagios | Complements them | + +NetAlertX works best alongside these tools, providing the continuously updated device inventory that many monitoring platforms lack. + +--- + +## Typical Deployments + +### 🏠 Home Networks + +Monitor: + +* Family devices +* Smart home equipment +* NAS systems +* TVs and media devices +* Game consoles +* IoT devices + +Receive alerts whenever new or unknown devices join your network. + +--- + +### 🧪 Homelabs + +Track constantly changing environments including: + +* Docker containers +* Virtual machines +* Kubernetes nodes +* Development systems +* Test networks + +Maintain an accurate inventory without manual documentation. + +--- + +### 🏢 Small Businesses + +Maintain visibility across office networks by tracking: + +* Unauthorized devices and shadow IT +* Office infrastructure and critical core systems +* Real-time asset inventory drift + +--- + +### 🌍 Remote Sites + +Deploy NetAlertX at branch offices or remote locations to maintain local visibility while monitoring multiple sites centrally. + +--- + +## What NetAlertX Is Designed To Do + +NetAlertX is designed to excel at: + +* Continuous device discovery +* Asset inventory +* Network visibility +* Change detection +* Historical tracking +* Notifications +* Workflow automation +* Plugin extensibility + +By focusing on these capabilities, NetAlertX remains lightweight, flexible, and easy to integrate into existing environments. + +--- + +## What NetAlertX Is Not + +NetAlertX is **not** intended to replace: + +* Firewalls +* Packet analyzers +* IDS/IPS platforms +* Configuration management systems +* Network documentation platforms +* Dedicated uptime monitoring systems + +Instead, it complements these tools by providing continuous awareness of the devices connected to your network. + +--- + +## Next Steps + +Now that you understand where NetAlertX fits, continue with one of the following guides: + +* **[Installation](INSTALLATION.md)** — Install NetAlertX on your platform. +* **[Plugins](./PLUGINS.md)** — Configure device discovery. +* **[Features](FEATURES.md)** — Explore everything NetAlertX can do. +* **[API](API.md)** — Integrate NetAlertX with your own applications. \ No newline at end of file diff --git a/docs/img/DEVICE_MANAGEMENT/device_presence.png b/docs/img/DEVICE_MANAGEMENT/device_presence.png new file mode 100644 index 0000000000000000000000000000000000000000..493a31d3c58f496b2f4c4d39958298ea5ec1b36e GIT binary patch literal 100925 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 a@5tFPLwwsw9~k|)pps&8q7}jhf&UBEg!S71 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 720842a2..dc8e80e9 100755 --- a/docs/index.md +++ b/docs/index.md @@ -56,6 +56,23 @@ hide: --- +## What is NetAlertX? + +NetAlertX continuously discovers the devices on your network, builds a living asset inventory, detects changes, and alerts you when something important happens. + +Whether you're monitoring a home network, homelab, business, or remote site, NetAlertX helps answer questions like: + +- What devices are currently connected? +- Has a new or unknown device appeared? +- Which servers or services are offline? +- Has a device changed IP address, hostname, or open ports? +- When was a device first or last seen? + +Unlike packet analyzers or firewall appliances, NetAlertX focuses on **network visibility**, **asset discovery**, **change detection**, **historical tracking**, and **automation**. + +> [!TIP] +> **New to NetAlertX?** Start with **[Where NetAlertX Fits](./WHERE_NETALERTX_FITS)** to understand how it complements the rest of your network tools. + ## Help and Support If you need help or run into issues, here are some resources to guide you: diff --git a/front/changeLog.php b/front/changeLog.php new file mode 100644 index 00000000..c5003212 --- /dev/null +++ b/front/changeLog.php @@ -0,0 +1,17 @@ + +

+
+

+ + +

+
+ +
+ + + diff --git a/front/changeLogCore.php b/front/changeLogCore.php new file mode 100644 index 00000000..0d320f69 --- /dev/null +++ b/front/changeLogCore.php @@ -0,0 +1,311 @@ + + +
+
+
+
+ + +
+ + +
+ + +
+ + + + + + + + + + + + +
+ +
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/front/change_history.php b/front/change_history.php deleted file mode 100644 index 678b113f..00000000 --- a/front/change_history.php +++ /dev/null @@ -1,210 +0,0 @@ - - - - -
- -
-

- - -

-
- -
-
-
-
- - -
- - -
- - -
- - - - - - - - - - - - -
Device
- -
-
- - - - -
-
-
-
-
- - - - diff --git a/front/css/app.css b/front/css/app.css index b851c5ed..5824f4b5 100755 --- a/front/css/app.css +++ b/front/css/app.css @@ -2677,7 +2677,7 @@ table.dataTable tbody > tr.selected /* Page-level overlay base */ #settings-skeleton, #devices-skeleton, #device-details-skeleton, -#events-skeleton, #presence-skeleton, #report-skeleton, #skel-app-events, +#events-skeleton, #presence-skeleton, #report-skeleton, #skel-app-events, #change-log-skeleton #notifications-skeleton, #workflows-skeleton, #plugins-skeleton, .skel-tab-pane { position: absolute; top: 0; @@ -2699,6 +2699,7 @@ table.dataTable tbody > tr.selected #notifications-skeleton { margin: 15px; top: 50px; min-height: 400px; } #workflows-skeleton { top: 50px; width: 770px; margin: 0 auto; min-height: 300px; } #plugins-skeleton { top: 50px; padding: 0; min-height: 400px; } +#change-log-skeleton { display: block; min-height: 400px; z-index: 1; position: absolute; margin-left: 15px; padding-top: 15px; width:100%;} #skel-tab-sessions, #skel-tab-events, #skel-tab-presence {margin: -10px; padding: 20px;} /* Hide scrollbars */ diff --git a/front/deviceDetails.php b/front/deviceDetails.php index 93cf58c3..5e0b76e4 100755 --- a/front/deviceDetails.php +++ b/front/deviceDetails.php @@ -168,44 +168,10 @@
- - -
- - -
- - - - - - - - - - - - -
- -
- -
- - 1 - -
-
+
@@ -647,136 +613,11 @@ setTimeout(function() { }, 15000); } -// --------------------------------------------------------------------------- -// Change Log tab — device-scoped history -// --------------------------------------------------------------------------- - -var _histPage = 0; -var _histLimit = 50; -var _histTotal = 0; -var _histLoaded = false; - -function loadHistoryData() { - var devGuid = getDevDataByMac(mac, 'devGUID'); - // Devices without a GUID (created before GUIDs were introduced) cannot be - // queried — show a clear message instead of spinning indefinitely. - if (devGuid === null || devGuid === undefined || devGuid === '') { - _renderHistoryTable([]); - return; - } - - var changedBy = (document.getElementById('histFilterBy') || {}).value || null; - var changedColumn = (document.getElementById('histFilterCol') || {}).value || null; - - var query = [ - 'query($devGuid:String!,$changedBy:String,$changedColumn:String,$limit:Int,$offset:Int){', - ' deviceHistoryGrouped(devGuid:$devGuid,changedBy:$changedBy,changedColumn:$changedColumn,limit:$limit,offset:$offset){', - ' count history{timestamp changedBy changes{changedColumn oldValue newValue}}', - ' }', - '}' - ].join(''); - - var variables = { - devGuid: devGuid, - changedBy: changedBy || null, - changedColumn: changedColumn || null, - limit: _histLimit, - offset: _histPage * _histLimit - }; - - $.ajax({ - url: getApiBase() + '/graphql', - method: 'POST', - contentType: 'application/json', - headers: { 'Authorization': 'Bearer ' + getSetting('API_TOKEN') }, - data: JSON.stringify({ query: query, variables: variables }), - success: function(resp) { - if (!resp.data || !resp.data.deviceHistoryGrouped) return; - var result = resp.data.deviceHistoryGrouped; - _histTotal = result.count; - _renderHistoryTable(result.history); - _updateHistoryPagination(); - - // Populate filter dropdowns once on first load - if (!_histLoaded) { - _histLoaded = true; - _populateHistoryFilters(devGuid); - } - } - }); -} - -function _populateHistoryFilters(devGuid) { - $.ajax({ - url: getApiBase() + '/devices/history/filters?devGuid=' + encodeURIComponent(devGuid), - method: 'GET', - headers: { 'Authorization': 'Bearer ' + getSetting('API_TOKEN') }, - success: function(resp) { - if (!resp.data) return; - var byEl = document.getElementById('histFilterBy'); - var colEl = document.getElementById('histFilterCol'); - (resp.data.changedBy || []).forEach(function(v) { byEl.add(new Option(v, v)); }); - (resp.data.changedColumn || []).forEach(function(v) { colEl.add(new Option(v, v)); }); - } - }); -} - -function _renderHistoryTable(groups) { - var tbody = document.getElementById('historyTableBody'); - if (!tbody) return; - // Always hide the loading skeleton once we have a result (even empty) - $('#skel-tab-history').fadeOut(0, function() { $(this).hide(); }); - if (!groups || groups.length === 0) { - tbody.innerHTML = ''; - return; - } - var html = ''; - groups.forEach(function(g) { - var iconHtml = (g.changedBy === 'user:api' || g.changedBy === 'USER') - ? '' - : ''; - var changesHtml = g.changes.map(function(c) { - return '
' + _histEsc(c.changedColumn) + ': ' - + '' + _histEsc(c.oldValue || '\u2205') + '' - + ' \u2192 ' - + '' + _histEsc(c.newValue || '\u2205') + '' - + '
'; - }).join(''); - html += '' - + '' + _histEsc(g.timestamp) + '' - + '' + iconHtml + ' ' + _histEsc(g.changedBy) + '' - + '' + changesHtml + '' - + ''; - }); - tbody.innerHTML = html; -} - -function _updateHistoryPagination() { - var totalPages = Math.max(1, Math.ceil(_histTotal / _histLimit)); - var lbl = document.getElementById('histPageLabel'); - var info = document.getElementById('histInfo'); - var prev = document.getElementById('histBtnPrev'); - var next = document.getElementById('histBtnNext'); - if (lbl) lbl.textContent = (_histPage + 1) + ' / ' + totalPages; - if (info) info.textContent = _histTotal + ' '; - if (prev) prev.disabled = _histPage <= 0; - if (next) next.disabled = (_histPage + 1) >= totalPages; -} - -function histChangePage(delta) { - _histPage = Math.max(0, _histPage + delta); - loadHistoryData(); -} - -function _histEsc(str) { - if (str === null || str === undefined) return ''; - return String(str).replace(/&/g,'&').replace(//g,'>').replace(/"/g,'"'); -} // Load history when the tab becomes visible $(document).on('shown.bs.tab', 'a[id="tabHistory"]', function() { _histPage = 0; - loadHistoryData(); + // loadHistoryData(); }); diff --git a/front/js/cache.js b/front/js/cache.js index dcae0d18..8fb675e6 100644 --- a/front/js/cache.js +++ b/front/js/cache.js @@ -509,6 +509,45 @@ function getDevDataByMac(macAddress, dbColumn) { return null; // Return a default value if MAC address is not found } + +// ----------------------------------------------------------------------------- +// Get a device property using GUID as key and DB column name as parameter +function getDevDataByGuid(devGUID, dbColumn) { + + const sessionDataKey = CACHE_KEYS.DEVICES_ALL; + const devicesCache = getCache(sessionDataKey); + + if (!devicesCache || devicesCache == "") { + console.warn(`[getDevDataByGuid] Cache key "${sessionDataKey}" is empty — cache may not be initialized yet.`); + return null; + } + + const devices = parseDeviceCache(devicesCache); + + if (devices.length === 0) { + return null; + } + + const guid = devGUID?.toLowerCase(); + + + for (const device of devices) { + + if ((device["devGUID"] || "").toLowerCase() === guid) { + + if (dbColumn) { + return device[dbColumn]; + } + + return device; + } + } + + console.error("⚠ Device with GUID not found: " + devGUID); + return null; +} + + // ----------------------------------------------------------------------------- /** * Fetches the full device list from table_devices.json and stores it in diff --git a/front/php/templates/header.php b/front/php/templates/header.php index c401754d..577ba986 100755 --- a/front/php/templates/header.php +++ b/front/php/templates/header.php @@ -332,14 +332,14 @@ -