Story 4.1: Tasks 3-6 Complete - Director's Board Integration & Settings Menu

- Task 3: Extended FoundryAdapter with user flag access methods
  - Added getFlag(userId, scope, key) method
  - Added setFlag(userId, scope, key, value) method
  - Added getFlagModule(userId, key) convenience method
  - Added setFlagModule(userId, key, value) convenience method

- Task 4: Integrated Privacy Settings with Director's Board
  - Updated participant-card.hbs to show Reaction Cam badge
  - Modified boardUtils.js to pass playerPrivacyManager through context
  - Updated DirectorsBoard to accept and pass playerPrivacyManager
  - Added CSS styles for Reaction Cam badge (SP accent color)

- Task 5: Registered PlayerPrivacyPanel in module settings
  - Added settings menu registration in module.js Hooks.once('ready')
  - Available to all users (restricted: false)
  - Uses localized labels and hints

- Task 6: Added all localization strings
  - Added SCRYING_POOL.PrivacyPanel.* strings for panel UI
  - Added SCRYING_POOL.Settings.* strings for settings menu

- Updated story file with task completion status

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
2026-05-23 21:29:58 +02:00
parent 61f362004e
commit fd0a7868f3
13 changed files with 1049 additions and 47 deletions
+9
View File
@@ -8,6 +8,15 @@
{{!-- Avatar (48px rounded) --}}
<div class="participant-card__avatar">
<img src="{{avatarSrc}}" alt="Avatar of {{name}}" />
{{!-- Reaction Cam badge - Story 4.1 --}}
{{#if isReactionCamEnabled}}
<span class="participant-card__badge participant-card__badge--reaction-cam"
role="status"
aria-label="Reaction Cam: Enabled"
title="Reaction Cam: Enabled">
<i class="fas fa-video" aria-hidden="true"></i>
</span>
{{/if}}
</div>
{{!-- Name (12px, 2-line truncate) --}}
+51
View File
@@ -0,0 +1,51 @@
{{!-- Player Privacy Panel --}}
<div class="player-privacy-panel__container">
<header class="player-privacy-panel__header">
<h2 class="player-privacy-panel__title">{{title}}</h2>
</header>
<div class="player-privacy-panel__body">
{{#if isReadOnly}}
<div class="player-privacy-panel__notice player-privacy-panel__notice--readonly">
{{readOnlyNotice}}
</div>
{{/if}}
<section class="player-privacy-panel__section">
<h3 class="player-privacy-panel__section-header">{{sectionHeader}}</h3>
<p class="player-privacy-panel__section-description">
{{SCRYING_POOL.PrivacyPanel.sectionDescription}}
</p>
<div class="player-privacy-panel__effects-list">
{{#each automationEffects}}
<div class="player-privacy-panel__effect">
<div class="player-privacy-panel__effect-header">
<h4 class="player-privacy-panel__effect-label">{{label}}</h4>
<div class="player-privacy-panel__toggle">
<label class="player-privacy-panel__toggle-label">
<input
type="checkbox"
{{#if enabled}}checked{{/if}}
{{#if ../isReadOnly}}disabled{{/if}}
data-setting="{{settingKey}}"
class="player-privacy-panel__toggle-input"
>
<span class="player-privacy-panel__toggle-text">
{{#if enabled}}
{{../toggleOnLabel}}
{{else}}
{{../toggleOffLabel}}
{{/if}}
</span>
</label>
</div>
</div>
<p class="player-privacy-panel__effect-description">{{description}}</p>
</div>
{{/each}}
</div>
</section>
</div>
</div>