Paradaux

PAR-189

0

[Epic] Configurability substrate — workspace settings, per-user prefs, custom fields

DoneHighUnassignedTesksFeature

The product's #1 differentiator: deep configurability at workspace and per-user level. Today there is no settings infrastructure beyond a browser cookie for status-group order (tesks-ui/lib/prefs.ts).

Design (decided 2026-06-16)

  • Storage: a JSONB settings blob per workspace and a JSONB prefs blob per user-per-workspace — no migration per new toggle; validated/typed in app code.
  • Effective config = workspace enables a feature AND the user hasn't opted out (covers "an individual user might not want due dates/sprints").
  • Reads come from the mirror (Kysely DAL); writes go through the REST API like everything else. Workspace settings gated on settings.manage; user prefs editable by any signed-in member for themselves.

Children / scope

  • Substrate (this issue, first vertical): workspace_settings + user_pref tables; backend WorkspaceSettingsService + REST endpoints; UI DAL + actions + a Features section in settings. Proof-of-pattern toggles: voting on/off (workspace-level, enforced in VoteService) and status-group order migrated from cookie → DB (per-user).
  • Per-user feature opt-outs (prefs.hiddenFeatures) — mechanism shipped with the substrate; concrete opt-outs wired as optional features land (due dates/sprints from PAR-190).
  • Join policy (join-any-team-as-contributor vs require lead/admin approval + request-to-join) — follow-up child.
  • Configurable status categories (the 6 are hard-coded) — evaluate later.
  • Custom fields → split out to its own epic PAR-196.

Feature toggles for not-yet-built features (due dates, sprints) register as those features land (PAR-190); the substrate makes them gateable. Depends on RBAC (PAR-182) for who edits settings.

Resources

Comments

tesks · Jun 16, 2026, 4:13 AM

Substrate shipped to develop — the core of this epic is done and verified:

  • Backend (tesks e4b6f98): migration V20 adds JSONB workspace_settings + user_pref; WorkspaceSettingsService writes both (settings gated on settings.manage; prefs per-user) and exposes votingEnabled(), enforced in VoteService; REST PUT /api/w/{slug}/settings + /prefs. 3 tests; backend suite 115 green.
  • UI (tesks-ui 7833aba): lib/sql/settings reads from the mirror; a Features section in settings toggles voting; the issue detail hides the VoteControl when voting is off. Status-group order migrated from cookie → DB (per-user-per-workspace), with cookie/default fallback. typecheck + vitest + next build green.

The JSONB substrate + per-user prefs + first real toggle establish the pattern that planning/search features (and the per-user hiddenFeatures opt-out) plug into.

Remaining scope split out: PAR-196 (custom fields) and PAR-197 (team join policy). Configurable status categories is a possible later add. Marking this epic's substrate Pending Release.

tesks · Jun 17, 2026, 4:10 AM

Substrate first vertical verified fully delivered — closing.

  • Schema: workspace_settings + user_pref JSONB tables (V20).
  • Backend: WorkspaceSettingsService (settings write gated on settings.manage; user prefs by the acting member) + PUT /settings and /prefs endpoints.
  • Proof-of-pattern toggles enforced in business logic, not just UI: voting (VoteService.cast refuses when off) and sprints (WorkspaceAdminService.createSprint). Subtasks/due-dates enforcement landed alongside PAR-190.
  • UI: lib/sql/settings.ts DAL + lib/actions/settings.ts + a Features section in settings (settings.manage-gated); vote UI gated on settings.voting; status-group order migrated from cookie → per-user DB prefs (prefs.server.ts).
  • Per-user opt-out mechanism (prefs.hiddenFeatures) exists.

Explicitly out of scope here (their own items): custom fields → PAR-196, team join policy → PAR-197.

Activity

  • tesks changed status to Status → Done
  • tesks commented
  • ParadauxIO linked a commit — Commit bc3f244 — Enforce subtasks + due-date feature toggles server-side (PAR-190/PAR-189)
  • ParadauxIO linked a commit — Commit e4b6f98 — Add configurability substrate: workspace settings + user prefs (PAR-189)
  • tesks changed status to Status → Pending Release
  • tesks commented
  • tesks description: Description updated
  • tesks changed status to Status → In Progress
  • tesks created the issue