game-views: per-view gear menus (SCROLL filter / ATLAS sources / disabled stubs); reelhouse POST placeholder DRY
All checks were successful
ci/woodpecker/push/pyswiss Pipeline was successful
ci/woodpecker/push/main Pipeline was successful

Each reelhouse view now has its own gear. The single #id_room_menu swaps panes by the active view (room-views.js owns this now — removed from room-scroll.js, which keeps only the title reel):

- hex → default NVM/DEL/BYE; SCROLL → the Frame/Redact log filter; ATLAS → a new source-checkbox pane (.room-menu-atlas / #id_atlas_source_form).
- YARN/POST/PULSE → no menu yet: the gear goes .gear-disabled (opacity 0.6) and an active click is swallowed by a capture-phase listener that flashes a --priRd fa-ban (the burger inactive-flash cadence) instead of opening anything.

ATLAS gear: a checkbox per other reelhouse view (Scroll/Post wired + checked; Yarn/Pulse disabled — struck label, an ✗ in a custom box matching the enabled ✓; starting-majuscule labels, capslock stays reel-only). OK persists to localStorage + re-runs buildAtlasFeed, which now gates each source on atlasSources() (scroll→provenance, post→post).

Also: the reelhouse POST composer drops its bespoke 'Speak at the table' placeholder for the canonical 'Enter a post line' (same as the billboard New Post applet's _form.html + post.html).

Verified: 11 carousel FTs (incl. the new per-view-gear FT) + 310 epic ITs (incl. the atlas-menu IT; room_gate shares _room_gear, unaffected) + the scroll-gear regression FTs + Jasmine, all green.

[[project-room-game-views-carousel]] [[feedback-applet-menu-needs-extend]]
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Disco DeDisco
2026-06-02 15:34:34 -04:00
parent 9754f6a54c
commit 73644e226b
7 changed files with 224 additions and 19 deletions

View File

@@ -3477,6 +3477,18 @@ class RoomViewsCarouselTest(TestCase):
content = self.client.get(self.url).content.decode()
self.assertIn("room-view-stub", content)
def test_atlas_gear_menu_has_source_checkboxes(self):
"""The ATLAS view's gear pane carries a source checkbox per other
reelhouse view; scroll + post are wired (checked), yarn + pulse have no
model yet (disabled)."""
content = self.client.get(self.url).content.decode()
self.assertIn("room-menu-atlas", content)
self.assertIn("id_atlas_source_form", content)
for view in ("scroll", "yarn", "post", "pulse"):
self.assertIn(f'value="{view}"', content)
self.assertRegex(content, r'value="yarn"[^>]*disabled')
self.assertRegex(content, r'value="pulse"[^>]*disabled')
def test_text_btn_active_on_the_table(self):
content = self.client.get(self.url).content.decode()
# The Text sub-btn carries `.active` so the burger fan routes its click