Files
ttrpg-initiative-tracker/TODO.md
T
david raistrick 4a92c667c5 Fix dev bulk-delete button gate + reposition inside campaigns
Gate was process.env.NODE_ENV === 'development' — unsafe default. react-scripts
inlines NODE_ENV=development when unset, so prod deploys forgetting the env var
exposed the delete-all button. Switched to explicit opt-in REACT_APP_DEV_TOOLS=1.

process.env.REACT_APP_DEV_TOOLS as static literal gets inlined by DefinePlugin at
webpack build time — runtime mutations in tests had no effect, and dev-start
without the env produced bundles with the branch dead-stripped. Extracted gate
to src/config/devTools.js using dynamic key access
(process.env['REACT_APP_' + 'DEV_TOOLS']) so DefinePlugin cannot inline it; the
value is read at runtime. dev-start.sh now exports REACT_APP_DEV_TOOLS=1.

Button had also drifted outside the campaigns collapse block to the page bottom;
moved it back inside the campaigns section after the grid.

Tests cover both paths: gate logic (unset/0/arbitrary/1) in BulkDelete.gate.test.js,
prod safety render (button absent when unset) in BulkDelete.render-hidden.test.js,
dev feature render (button present when DEV_TOOLS=1) in BulkDelete.render-shown.test.js.
2026-07-08 11:46:56 -04:00

3.2 KiB

TODO

Backlog of bugs + long-term items. Milestones live in REWORK_PLAN.md.

Open

fullscreen and dont lock on main app dm view and the no-game-player view

also better vert tab layout - labelt friendly

needs AC for players dude

and quick entry hp

hp do not carry from encounter to ecnounter!!!

hp wont go over max and no temp hp support

dm list - keep active particpant in view (scroll)

not sure good way to do this

npm install warnings cleanup pass

lots of updates

monsters per campaign and npcs

or/and ....copy from encoubnter?

TEST GAP: current branch changes need focused coverage

  • Storage where() contract: firebase + server adapters should honor [where('encounterPath','==',x), orderBy('ts','desc'), limit(n)].
  • Server SQL query test: where + orderBy + limit should return latest logs for one encounter only.
  • Undo/redo stack order: undo A3 then A2, redo must replay A2 first, then A3.
  • Combat controls should not subscribe to logs while mounted; undo/redo should query logs only on click.
  • Unified CLI smoke: node scripts/combat.js verify <fixture.json> returns CLEAN on known-good log.
  • Unified CLI replay smoke: node scripts/combat.js replay ... --out tmp/x.json writes JSON array and auto-verifies.
  • Ctrl-C replay behavior: SIGINT during replay should end encounter, clear active display, write partial log, run verify.
  • SQLite schema/index test: idx_docs_parent_ts and idx_docs_parent_encounter_ts exist for server DB.

confirm warnings treated as error = fail in all tests, build pipeline, linters, everything. again.

BUG: addParticipants (batch add) does not slot by initiative

  • shared/turn.js addParticipants appends [...existing, ...new], no slotIndexForInit.
  • Violates INIT doc: "Add = insert into slot by initiative."
  • Single addParticipant slots correct. Batch (add-all-chars) appends.
  • Pre-start batch add = wrong order. Post-start worse.

BUG: nextTurn throws on solo combatant

  • nextActiveAfter loop for step=1; step<n skips when n=1 → {nextId:null}.
  • nextTurn throws "Could not determine next participant."
  • Solo active combat cannot pass turn.

BUG: reorderParticipants cross-pointer drag = silent no-op

  • Cross-pointer drag returns encounter unchanged, no log, no toast.
  • DM drags across current turn → nothing happens, no feedback.

BUG: addParticipant undo missing currentTurnParticipantId when started

  • undo saves participants + conditional turnOrderIds, no currentTurnParticipantId.
  • Pointer can misalign on undo if added near pointer region.

BUG: computeTurnOrderAfterRemoval isActive uses find() not boolean

  • isActive = id => updatedParticipants.find(p => p.id === id && p.isActive)
  • Returns participant obj (truthy) not boolean. Works by accident, fragile.

FEAT: clarify "Is NPC" in add-participant

  • Ambiguous label. May expand work based on what NPC means here (ally? monster? display-only? skip in turn order?). Clarify intent before UX changes.

quality of life fix: 2. UI says "Campaign Characters", field is players --- naming mismatch (separate concern, flag for later)

FEAT - parallel campaigns

FEAT - multi user

FEAT - clarify what end encounter does and what initiatives reset means

Done (history)