diff --git a/muxplex/frontend/app.js b/muxplex/frontend/app.js
index 56d614e..7049a77 100644
--- a/muxplex/frontend/app.js
+++ b/muxplex/frontend/app.js
@@ -2230,27 +2230,6 @@ function openSettings() {
sortOrderEl.value = ss.sort_order;
}
- // Hidden sessions checkboxes
- const hiddenSessionsEl = $('setting-hidden-sessions');
- if (hiddenSessionsEl) {
- hiddenSessionsEl.innerHTML = '';
- const hiddenList = (ss && ss.hidden_sessions) || [];
- (_currentSessions || []).forEach(function(s) {
- const name = s.name || '';
- const sessionKey = s.sessionKey || name;
- const item = document.createElement('label');
- item.className = 'settings-checkbox-item';
- const cb = document.createElement('input');
- cb.type = 'checkbox';
- cb.className = 'settings-checkbox';
- cb.value = sessionKey;
- cb.checked = hiddenList.includes(sessionKey) || hiddenList.includes(name);
- item.appendChild(cb);
- item.appendChild(document.createTextNode(' ' + name));
- hiddenSessionsEl.appendChild(item);
- });
- }
-
// Window size largest
const windowSizeEl = $('setting-window-size-largest');
if (windowSizeEl) {
@@ -2973,20 +2952,6 @@ function bindStaticEventListeners() {
if (el) patchServerSetting('auto_open_created', el.checked);
});
- // Hidden sessions — delegated handler on container (checkboxes are dynamic)
- var hiddenSessionsContainer = $('setting-hidden-sessions');
- if (hiddenSessionsContainer) {
- hiddenSessionsContainer.addEventListener('change', function(e) {
- var cb = e.target.closest('input[type="checkbox"]');
- if (!cb) return;
- var hidden = [];
- hiddenSessionsContainer.querySelectorAll('input[type="checkbox"]').forEach(function(c) {
- if (c.checked) hidden.push(c.value);
- });
- patchServerSetting('hidden_sessions', hidden);
- });
- }
-
// Notifications settings — bell sound toggle persists to server settings
on($('setting-bell-sound'), 'change', function() {
if (_serverSettings) _serverSettings.bellSound = this.checked;
diff --git a/muxplex/frontend/index.html b/muxplex/frontend/index.html
index be14adc..6e31fcf 100644
--- a/muxplex/frontend/index.html
+++ b/muxplex/frontend/index.html
@@ -201,10 +201,6 @@
-
diff --git a/muxplex/tests/test_frontend_html.py b/muxplex/tests/test_frontend_html.py
index f57e675..63ba56c 100644
--- a/muxplex/tests/test_frontend_html.py
+++ b/muxplex/tests/test_frontend_html.py
@@ -629,18 +629,6 @@ def test_html_sessions_panel_has_sort_order_select() -> None:
assert v in values, f"#setting-sort-order missing option value='{v}'"
-def test_html_sessions_panel_has_hidden_sessions_container() -> None:
- """Sessions panel must contain a #setting-hidden-sessions container for checkboxes."""
- soup = _SOUP
- dialog = soup.find(id="settings-dialog")
- assert dialog is not None, "Missing #settings-dialog"
- sessions_panel = dialog.find(
- class_="settings-panel", attrs={"data-tab": "sessions"}
- )
- assert sessions_panel is not None, "Missing sessions settings-panel"
- el = sessions_panel.find(id="setting-hidden-sessions")
- assert el is not None, "Missing #setting-hidden-sessions inside sessions panel"
-
def test_html_sessions_panel_has_window_size_largest_checkbox() -> None:
"""Sessions panel must contain a #setting-window-size-largest checkbox."""
@@ -1532,3 +1520,17 @@ def test_no_filtered_option_in_view_mode_select() -> None:
assert "filtered" not in values, (
"View mode select must not contain a 'filtered' option (removed in task-11)"
)
+
+
+# ============================================================
+# Remove Hidden Sessions Section from Settings Panel (task-12)
+# ============================================================
+
+
+def test_no_hidden_sessions_checkbox_list_in_settings() -> None:
+ """#setting-hidden-sessions must not exist in HTML (replaced by Hidden view + tile flyout)."""
+ el = _SOUP.find(id="setting-hidden-sessions")
+ assert el is None, (
+ "#setting-hidden-sessions must be removed from the settings panel "
+ "(replaced by the Hidden view + tile flyout in Phase 3)"
+ )
diff --git a/muxplex/tests/test_frontend_js.py b/muxplex/tests/test_frontend_js.py
index 137ae8d..a35ce36 100644
--- a/muxplex/tests/test_frontend_js.py
+++ b/muxplex/tests/test_frontend_js.py
@@ -1273,21 +1273,6 @@ def test_bind_static_event_listeners_binds_auto_open_change() -> None:
)
-def test_bind_static_event_listeners_uses_delegated_handler_for_hidden_sessions() -> (
- None
-):
- """bindStaticEventListeners must use delegated change handler on #setting-hidden-sessions."""
- match = re.search(
- r"function bindStaticEventListeners\s*\(\s*\)\s*\{(.*?)\n\}",
- _JS,
- re.DOTALL,
- )
- assert match, "bindStaticEventListeners function not found"
- body = match.group(1)
- assert "setting-hidden-sessions" in body, (
- "bindStaticEventListeners must use delegated handler on setting-hidden-sessions"
- )
-
def test_exports_load_server_settings() -> None:
"""module.exports must export loadServerSettings."""
@@ -2989,28 +2974,6 @@ def test_create_device_select_uses_device_id_for_option_value() -> None:
)
-def test_settings_hidden_sessions_uses_session_key() -> None:
- """Settings hidden_sessions checkbox must use sessionKey for the checkbox value.
-
- The hidden_sessions list now stores device_id:name keys (sessionKey format).
- The settings panel checkbox builder must use s.sessionKey || s.name as the
- checkbox value so toggling a remote session stores the correct key format.
- """
- match = re.search(
- r"const hiddenSessionsEl = \$\('setting-hidden-sessions'\);.*?hiddenSessionsEl\.innerHTML = ''",
- _JS,
- re.DOTALL,
- )
- assert match, "hidden sessions settings block not found"
- # Find the wider block starting from here
- start = match.start()
- block = _JS[start : start + 800]
- assert "sessionKey" in block, (
- "Settings panel hidden_sessions checkbox builder must use s.sessionKey "
- "(with s.name fallback) as the checkbox value so remote sessions are "
- "stored in device_id:name format in hidden_sessions"
- )
-
# ---------------------------------------------------------------------------
# Active view state variable and getVisibleSessions (task-2-active-view)