Files
AgendaPro/.superpowers/sdd/task-14-report.md
T
AgendaPro Dev d796538fd9 feat: rebrand AgendaPro -> AgendaMax + calendar fixes + current-week demo seed
- Rebrand all user-facing text to AgendaMax
- Fix sidebar scrolling: card container no longer overflows html (flex h-full min-h-0)
- Fix calendar toolbar hover: active buttons keep readable contrast
- Sticky calendar toolbar (month/week/day always visible on scroll)
- Seed guarantees 2-4 appointments per day for current week (Mon-Sat)
2026-07-27 10:11:16 -06:00

3.6 KiB
Raw Blame History

Task 14 — EmployeeModal: especialidades, horario, eficiencia

File changed

  • src/pages/EmployeesPage.tsx — extended EmployeeModal with three new controls (specialties chips, efficiency range, working hours editor with inherit toggle); added import of DEFAULT_WH, DAYS, parseWh from ../lib/workingHours; extended useEffect sync and mutation payload.

No other files touched. src/lib/workingHours.ts was already created in Task 13 and is only imported.

Typecheck / build

  • npm run typecheck0 errors.
  • npm run buildsucceeds (2462 modules transformed, 5.11s).
  • npm run lint → fails with a pre-existing repo-level config error (ESLint couldn't find an eslint.config.(js|mjs|cjs) — ESLint 9 migration not done). Not caused by this task; same result on main.

Runtime smoke

Not executed manually (no browser session in this subagent run). Static verification instead:

  • Backend wiring confirmed in server/routes/employees.ts:
    • POST accepts specialties, working_hours, efficiency_score (line 76).
    • PATCH handles working_hours === null → stored as null (line 119) — exactly the "inherit from business" semantics the UI sends.
    • efficiency_score coerced via Number(...) server-side; specialties JSON-stringified if array.
  • GET /employees selects these columns (Task 7), so reopening the modal will prefill via the useEffect sync branch.
  • The Employee type in shared/types.ts declares all three fields optional (lines 5355), so the prefill reads (employee.specialties, employee.efficiency_score, employee.working_hours) typecheck cleanly.

Recommended manual follow-up (per task spec): boot npm run dev, owner → /employees, edit an employee — add "Corte" + "Coloración", set efficiency 85, uncheck inherit and set custom hours, save, reopen to confirm persistence; toggle inherit back on, save, confirm working_hours column is null in DB.

Deviations

  • Plan Step 1 said to create src/lib/workingHours.ts and refactor SettingsPage. Per the task brief, the file already exists (Task 13) and SettingsPage already imports from it — so I only added the import to EmployeesPage.tsx. No other files modified.
  • Lint not run green (pre-existing repo config issue, not introduced here).

Self-review

  • Payload shape:
    • specialties sent as a string[] (the state is string[], no manual serialization). ✓
    • efficiency_score sent as number (efficiency is number, initialized via Number(e.target.value)). ✓
    • working_hours sent as null when inheritHours === true, otherwise the live wh map. ✓ Matches the backend's working_hours === null ? null : … branch.
  • Edit-mode prefill: useEffect[open, employee] reads employee.specialties (with Array.isArray guard), employee.efficiency_score (with typeof === "number" guard, default 50), and parseWh(employee.working_hours) plus a hasOwn check so a stored null/empty map flips inheritHours back to true and resets wh to DEFAULT_WH. ✓
  • Duplicate prevention in chips input: setSpecialties((a) => [...new Set([...a, specialtyInput.trim()])])Set dedupes by value; case-sensitive (so "Corte" ≠ "corte"), which matches how the backend stores them. ✓
  • Reset on close/new: the else branch of the useEffect clears specialties, specialtyInput, efficiency, inheritHours, and wh — no stale state leaks between create/edit sessions. ✓
  • Type safety on wh[n]: narrowed with !(wh[n]) / wh[n]!.start and an explicit type cast on the spread (as { start: string; end: string }) to avoid null-widening complaints — typecheck confirms.