You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .ai.md
+34-1Lines changed: 34 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -75,7 +75,8 @@ All sync modules use a `_syncing` boolean flag to prevent infinite loops:
75
75
|`scripts/item-sync.mjs`| Actor inventory ↔ Chronicle "Has Item" relations. System data sync (quantity, equipped) via relation metadata |
76
76
|`scripts/note-sync.mjs`| Chronicle Notes ↔ JournalEntries in "Chronicle Notes" folder tree. Case normalization (camelCase ↔ snake_case). Sharing → ownership mapping |
77
77
|`scripts/adapters/generic-adapter.mjs`| API-driven adapter: fetches field defs from `/systems/:id/character-fields` API, auto-generates mappings from `foundry_path` annotations in system manifests. Works for all installed systems |
78
-
|`scripts/sync-dashboard.mjs`| 8-tab ApplicationV2 dashboard (Entities, Shops, Maps, Characters, Calendar, Status). Pull/push actions, health metrics, error log, search/filter. Status tab also surfaces a **Copy Calendar Diagnostics** button (`_buildCalendarDiagnosticsInput()` + `buildCalendarDiagnostics()`) so GMs can export a Calendaria diagnostic report without opening the Sync Calendar editor. |
78
+
|`scripts/sync-dashboard.mjs`| 9-tab ApplicationV2 dashboard (Config, Entities, Shops, Maps, Characters, **Members**, Notes, Calendar, Status). Pull/push actions, health metrics, error log, search/filter. **Members tab** (FM-PERM-SYNC): per-member Foundry-user mapping dropdown + matched/UNMATCHED badge, wired to `setUserMappings`; row view-model in `_member-mapping.mjs`. Status tab surfaces a **Copy Calendar Diagnostics** button and a **DM-only-hidden counter** (audit §1A — clarifies that private entities synced but landed hidden-from-players). |
79
+
|`scripts/_member-mapping.mjs`| Pure view-model `buildMemberRows({members, mappings, foundryUsers, keyOf})` for the dashboard Members tab — one row per Chronicle member with current mapping + matched/UNMATCHED badge (stale mappings → UNMATCHED). No Foundry globals; unit-tested at `tools/test-permission-sync.mjs`. |
79
80
|`templates/sync-dashboard.hbs`| Handlebars template for the sync dashboard tabs and content |
80
81
|`templates/shop-window.hbs`| Handlebars template for shop inventory display |
81
82
|`styles/chronicle-sync.css`| Status indicator + shop window styles |
@@ -273,6 +274,38 @@ or WS vs REST payload differences. Verify with the Chronicle dev before changing
Copy file name to clipboardExpand all lines: lang/en.json
+14Lines changed: 14 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -86,6 +86,7 @@
86
86
"Maps": "Maps",
87
87
"Notes": "Notes",
88
88
"Characters": "Characters",
89
+
"Members": "Members",
89
90
"Calendar": "Calendar",
90
91
"Status": "Status"
91
92
},
@@ -191,6 +192,18 @@
191
192
"NoSystem": "Character sync requires a matching game system.",
192
193
"NoSystemHint": "Your Foundry system must match a Chronicle game system with character field templates."
193
194
},
195
+
"Members": {
196
+
"Title": "Permission Mapping",
197
+
"Intro": "Map each Chronicle campaign member to a Foundry user so per-player permissions sync. Unmatched members are skipped — their per-player grants won't sync in either direction until mapped.",
198
+
"FoundryUser": "Foundry user",
199
+
"Matched": "Matched",
200
+
"Unmatched": "UNMATCHED",
201
+
"Refresh": "Refresh Members",
202
+
"RefreshHint": "Re-fetch campaign members from Chronicle and re-run auto-match",
203
+
"UnmatchedWarning": "{count} Chronicle member(s) are not mapped to a Foundry user. Their per-player permissions will NOT sync until you map them below.",
204
+
"NoMembers": "No campaign members loaded.",
205
+
"NoMembersHint": "Members load when sync connects. Use Refresh Members to fetch them now."
206
+
},
194
207
"OfflineWarning": "Sync messages are queued while disconnected, but the queue is limited. Extended offline periods may cause missed updates — use Pull All after reconnecting to ensure consistency.",
195
208
"StatusTab": {
196
209
"Connection": "Connection",
@@ -207,6 +220,7 @@
207
220
"CharacterSyncEnabled": "Enabled",
208
221
"CharacterSyncDisabled": "Disabled",
209
222
"CharacterSyncNoSystem": "Requires matching game system",
223
+
"DmOnlyHiddenNote": "{count} DM-only entit(y/ies) synced this session and were hidden from players (per the \"DM-only hidden\" setting). The GM sees them; players intentionally don't — this is not a sync failure.",
0 commit comments