feat: remove hidden sessions section from settings panel (task-12)

Remove the Hidden Sessions checkbox list from the Sessions settings tab.
The feature is superseded by the Hidden view + tile flyout (Phase 3),
which is accessible via the sidebar view dropdown.

Changes:
- muxplex/frontend/index.html: Remove #setting-hidden-sessions div block
- muxplex/frontend/app.js: Remove hidden sessions checkbox population
  block from openSettings() and delegated change handler from
  bindStaticEventListeners()
- muxplex/tests/test_frontend_html.py: Remove old
  test_html_sessions_panel_has_hidden_sessions_container (for removed
  element); add test_no_hidden_sessions_checkbox_list_in_settings
  asserting element no longer exists
- muxplex/tests/test_frontend_js.py: Remove
  test_bind_static_event_listeners_uses_delegated_handler_for_hidden_sessions
  and test_settings_hidden_sessions_uses_session_key (for removed JS code)
This commit is contained in:
Brian Krabach
2026-04-15 19:19:09 -07:00
parent d34509681e
commit 3b8543ff44
4 changed files with 14 additions and 88 deletions
-35
View File
@@ -2230,27 +2230,6 @@ function openSettings() {
sortOrderEl.value = ss.sort_order; 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 // Window size largest
const windowSizeEl = $('setting-window-size-largest'); const windowSizeEl = $('setting-window-size-largest');
if (windowSizeEl) { if (windowSizeEl) {
@@ -2973,20 +2952,6 @@ function bindStaticEventListeners() {
if (el) patchServerSetting('auto_open_created', el.checked); 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 // Notifications settings — bell sound toggle persists to server settings
on($('setting-bell-sound'), 'change', function() { on($('setting-bell-sound'), 'change', function() {
if (_serverSettings) _serverSettings.bellSound = this.checked; if (_serverSettings) _serverSettings.bellSound = this.checked;
-4
View File
@@ -201,10 +201,6 @@
<button id="notification-request-btn" class="settings-action-btn">Request Permission</button> <button id="notification-request-btn" class="settings-action-btn">Request Permission</button>
</div> </div>
</div> </div>
<div class="settings-field settings-field--column">
<label class="settings-label">Hidden Sessions</label>
<div id="setting-hidden-sessions" class="settings-checkbox-list"></div>
</div>
</div> </div>
<div class="settings-panel hidden" data-tab="views"> <div class="settings-panel hidden" data-tab="views">
<div id="views-settings-list" class="views-settings-list"></div> <div id="views-settings-list" class="views-settings-list"></div>
+14 -12
View File
@@ -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}'" 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: def test_html_sessions_panel_has_window_size_largest_checkbox() -> None:
"""Sessions panel must contain a #setting-window-size-largest checkbox.""" """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, ( assert "filtered" not in values, (
"View mode select must not contain a 'filtered' option (removed in task-11)" "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)"
)
-37
View File
@@ -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: def test_exports_load_server_settings() -> None:
"""module.exports must export loadServerSettings.""" """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) # Active view state variable and getVisibleSessions (task-2-active-view)