- Ya
- 12 Agosti 2026, 14:38 UTC
- Mwandishi
- kamo
- Ahadi ya
- df0b66b
Both backends shipped earlier but neither panel was ever written, so /hr/attendance?sub=approvals and ?sub=exceptions rendered "this tab is being built" over working endpoints. ApprovalsSubTab is the manager queue. A timecard carries two attestations — the employee's on submit and the manager's here — so the only action with no reason attached is a plain approval of a card the employee submitted themselves, where their own attestation is the record. Sending a card back and approving on behalf both take a mandatory reason, because sending someone's timecard back without saying why is how an employee loses a day and never finds out which one. A card with blocking exceptions has its approve button DISABLED rather than allowed to fail: the server refuses anyway, and a button that always errors is worse than one that is visibly unavailable. The blocking chip navigates to the Exceptions tab, which is where the work actually is. ExceptionsSubTab shows two deliberately different numbers — everything open, and the subset that BLOCKS a close. isBlocking is rendered exactly as the server sent it and never re-derived from the type string. Waiving is presented as what it is: nothing was fixed, a person is choosing to proceed anyway, and the reason is what makes that decision survive being asked about later. The placeholder fallback stays in the page even though all seven indices are now wired — appending a sub-tab id without a panel should say so rather than render a blank screen.