diff --git a/RELEASE_NOTES_v2.2.87.md b/RELEASE_NOTES_v2.2.87.md
new file mode 100644
index 0000000..84d9bdd
--- /dev/null
+++ b/RELEASE_NOTES_v2.2.87.md
@@ -0,0 +1,14 @@
+# Release Notes v2.2.87
+
+Dato: 2026-05-05
+
+## Hotfix
+
+- Telefoni: Foerste auto-load ignorerer nu browser-restored filterfelter (dato/user/uden sag).
+- Dette forhindrer at opkald vises ved load og derefter forsvinder efter ca. 1 sekund.
+- Filtre aktiveres stadig normalt ved brugerens egen interaktion.
+
+## Berorte filer
+
+- `app/modules/telefoni/templates/log.html`
+- `VERSION`
diff --git a/VERSION b/VERSION
index 4ccffcd..c4c475d 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.2.86
+2.2.87
diff --git a/app/modules/telefoni/templates/log.html b/app/modules/telefoni/templates/log.html
index 40c0115..d5a020c 100644
--- a/app/modules/telefoni/templates/log.html
+++ b/app/modules/telefoni/templates/log.html
@@ -214,6 +214,7 @@ function escapeHtml(str) {
let telefoniCurrentUserId = null;
let telefoniAutoResetTried = false;
let telefoniFirstApiLoadDone = false;
+let telefoniFiltersArmed = false;
const telefoniCallMap = new Map();
const linkSagState = {
callId: null,
@@ -862,10 +863,28 @@ async function loadCalls() {
const hadServerRows = Number.isFinite(initialCount) && initialCount > 0;
tbody.innerHTML = '
| Indlæser... |
';
- const userId = document.getElementById('filterUser').value;
- const from = document.getElementById('filterFrom').value;
- const to = document.getElementById('filterTo').value;
- const withoutCase = document.getElementById('filterWithoutCase').checked;
+ const userEl = document.getElementById('filterUser');
+ const fromEl = document.getElementById('filterFrom');
+ const toEl = document.getElementById('filterTo');
+ const withoutCaseEl = document.getElementById('filterWithoutCase');
+
+ let userId = userEl.value;
+ let from = fromEl.value;
+ let to = toEl.value;
+ let withoutCase = withoutCaseEl.checked;
+
+ // On first automatic load, ignore browser-restored filter values.
+ // Filters are only applied after explicit user interaction.
+ if (!telefoniFiltersArmed) {
+ userId = '';
+ from = '';
+ to = '';
+ withoutCase = false;
+ userEl.value = '';
+ fromEl.value = '';
+ toEl.value = '';
+ withoutCaseEl.checked = false;
+ }
const qs = new URLSearchParams();
if (userId) qs.set('user_id', userId);
@@ -908,6 +927,9 @@ async function loadCalls() {
telefoniAutoResetTried = false;
telefoniFirstApiLoadDone = true;
+ if (!telefoniFiltersArmed) {
+ telefoniFiltersArmed = true;
+ }
tbody.innerHTML = rows.map(r => {
const started = r.started_at ? new Date(r.started_at) : null;
@@ -1034,13 +1056,29 @@ document.addEventListener('DOMContentLoaded', async () => {
if (toFilter) toFilter.value = '';
if (withoutCaseFilter) withoutCaseFilter.checked = false;
telefoniAutoResetTried = false;
+ telefoniFiltersArmed = false;
await loadUsers();
- document.getElementById('btnRefresh').addEventListener('click', loadCalls);
- document.getElementById('filterUser').addEventListener('change', loadCalls);
- document.getElementById('filterFrom').addEventListener('change', loadCalls);
- document.getElementById('filterTo').addEventListener('change', loadCalls);
- document.getElementById('filterWithoutCase').addEventListener('change', loadCalls);
+ document.getElementById('btnRefresh').addEventListener('click', () => {
+ telefoniFiltersArmed = true;
+ loadCalls();
+ });
+ document.getElementById('filterUser').addEventListener('change', () => {
+ telefoniFiltersArmed = true;
+ loadCalls();
+ });
+ document.getElementById('filterFrom').addEventListener('change', () => {
+ telefoniFiltersArmed = true;
+ loadCalls();
+ });
+ document.getElementById('filterTo').addEventListener('change', () => {
+ telefoniFiltersArmed = true;
+ loadCalls();
+ });
+ document.getElementById('filterWithoutCase').addEventListener('change', () => {
+ telefoniFiltersArmed = true;
+ loadCalls();
+ });
await loadCalls();
});