Timesheet review
A React block (a whole screen) in Beamline's HR & payroll app.
Timesheets for a manager: the day's counts at the head (scheduled, on shift, late, on break, to approve), the ones that filter being buttons, an unavailable count said, never 0. A sheet draws its planned areas above what was worked on one time scale with breaks between; the changeover between two worked areas is dragged, or stepped by five minutes with the arrows, and a segment is split without moving the shift's start or end; gaps and overlaps are said in words and hold back approval, the net paid time follows every edit, and the original clock events stay as they were, each with its location against the site in words (inside or outside only when the fix's accuracy allows it). Edits and approval are one save; a sheet changed elsewhere keeps the edits and says so. Time is added by hand for past shifts only, per person, with each person's result said. The payroll file is set up beside it: columns in order, each a field and its heading, the sheet id and line id both required so every area line stays tied to its sheet, a preview with the total paid time, and the file made once with its download apart, so a failed download is retried without making another.
Use it for
- A manager approving staff timesheets against the planned shift: cafés, shops, warehouses, care teams, events.
- Anywhere worked time spans several areas or roles in one shift and the original clock evidence must stay apart from corrections.
Not for
- The worker's own shift: clocking in, breaks and the review before clocking out (my-shift).
- Paying the period's workers (payroll-run).
- Planning and publishing the roster (roster-publish).
Anatomy
- header: the product's mark, the title and Add time by hand
- counts as one quiet line, a figure then its word: Scheduled, On shift, Late (a filter), On break, To approve (a filter), Late and To approve in their tone when there are some; Unavailable in place of a count the feed didn't give
- list (nav): each sheet's person, day, net time and its flag (Started late, Differs from the plan, Times to fix), Approved
- sheet head: person and day, net paid against planned, Added by hand, the status
- time scale: Planned and Worked rows on one scale, each block naming its area where drawn, breaks as dashed plates, the changeover between touching worked segments as a grip
- worked segments: each area with its times as text and its length, a pencil opening its start and end, Split and Remove; gaps and overlaps in words; under them the paid time's sum (worked, less unpaid breaks, paid, against the plan with the difference)
- clock events: each with its time and its location in words
- bar: Edited, not saved with Undo edits; Approve and Approve and next
- by hand (sheet): area, people, date, start, end, unpaid break, reason, the net each person gets, Add N timesheets
- payroll file (sheet): template name, file type, columns (field, heading, move, remove), Add a column, the missing key said, the first lines and the total paid time, Make the file, then Download
States
- submitted; approved (by whom); added by hand
- late start said with minutes and the planned time; differs from the plan; times to fix
- edited: the net follows; a gap, an overlap or a segment that ends before it starts holds back approval
- approving; approved and the next submitted sheet opened; stale (the edits kept, said); refused with the reason
- clock location: inside, outside by how far, accuracy unknown, permission denied, no location
- counts unavailable; a filter on (said, Show all)
- by hand: a future time, an end before the start, a break longer than the time refused in place; adding; all added; some refused per person
- look only: no edits or approval, the permission said
- loading: shaped skeletons; nothing to review: an empty state
- payroll file: a required id missing (refused, said); made; downloading; a failed download (the file kept, Try the download again); downloaded
- phone: the counts wrap, the list, then the sheet with Back
- right to left: the scale and the grip mirror (← moves later in time)
- reduced motion: through the tokens
Keyboard
- Tab through the counts that filter, the list, each changeover grip (←/→ by 5 minutes), each segment's times, Split and Remove, then the bar
- Escape closes the by-hand sheet
Motion
The changeover grip follows the pointer in 5-minute steps; nothing else moves. Nothing runs at rest.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
sheets | Timesheet[] | — | |
defaultSheets | Timesheet[] | — | |
onSheetsChange | ((sheets: Timesheet[]) => void) | — | |
areas (required) | WorkArea[] | — | |
siteRadius | number | — | The site's radius, for the clock location's words. |
counts | DayCounts | — | |
workers | string[] | — | People who can be given time by hand. |
defaultSheetId | string | — | |
me | string | — | Who is approving, written on the sheets the block approves. |
today | string | — | Today, ISO date, for refusing time by hand that hasn't happened. |
nowTime | string | — | The time now, "HH:MM", with `today`. |
onApprove | ((sheet: Timesheet, edited: boolean) => Promise<unknown>) | — | Approve a sheet with any edits (one save). Reject with an Error named "StaleError" when your record moved on: the edits stay, said. |
onAddManual | ((entry: ManualEntry) => Promise<void | { worker: string; error?: string | undefined; }… | — | Add time by hand; resolve with each person's result (a person missing from the answer counts as added). |
canApprove | boolean | — | |
loading | boolean | — | |
product | string | — | Your product's name, shown as its mark. |
className | string | — | Classes on the documented visual root; no override by default. |
ref | Ref<HTMLDivElement> | — | Receives the documented native target or imperative handle; omitted by default. |
exportTemplate | ExportTemplate | — | The payroll file's starting template; with onExport, the header offers the file. |
onExport | ((template: ExportTemplate) => Promise<{ fileName: string; }>) | — | Make the payroll file from the approved sheets' lines; resolve with its name. |
onDownload | ((fileName: string) => Promise<unknown>) | — | Download a made file; reject to say why (Try again downloads, it doesn't make another). |
defaultExportOpen | boolean | — | Open the payroll file sheet when the screen opens. |
Built from
- Avatar
- Badge
- Button
- Empty state
- Input
- Label
- Multi-select
- Number field
- Segmented control
- Select
- Sheet
- Skeleton
- Spinner
- Text morph
- Time picker
- Tooltip
Dependencies
lucide-react
Import
import { TimesheetReview } from "@beamline/timesheet-review";
Get it
Timesheet review is part of Beamline UI. Install the parts you need in your React app as compiled packages or editable source. Get Beamline · Connect your agent
More in HR & payroll
- Shift planner: A workplace's week of staff shifts against what it needs: a row per person with their week's hours against their contract, each day a 24-hour track with…
- Shift rotations: Rotating shift patterns from pattern to people: a pattern of one to four weeks painted day by day with a shift template, a rest day or nothing (pick the…
- Roster publishing: The week's roster before it goes out: areas down the side and days across, each shift a chip with who works it and its hours, its state its tone (not…
- My shift: The worker's own shift on their phone: today drawn to scale (the plan's areas as blocks on an hour axis, under them what was worked: on-plan time in…
- Hours ledger: One worker's pay cycle of shifts, for the worker or their payroll admin: the wall-clock span and the paid hours as separate columns, a night shift…
- Payroll run: A pay period from report to submission, one payroll account at a time (a worker on two accounts is on both runs, never combined): the workers on one…
- Payroll cycles: The client's side of an outsourced payroll across countries: every entity's current cycle on one board, its stage drawn as steps, the one thing that…
- Payroll approvals: Payroll approvals for a company paying through a payroll provider. Expenses are split by whose move it is (you, another approver, the employee answering…
- Benefit changes: An employee's benefit changes after a life event. The centre puts their turn first: each task (a proof to upload, with its deadline in the warning tint…
- Hiring pipeline: A recruiting team's pipeline across every open job. Stage groups (reviewing, interviewing, closing) are counted across jobs above job sections that fold…
- Recruiter home: A recruiter's own work, in one place. Upcoming interviews with who sits in, today's first; feedback owed, overdue first and on the danger tone, written…
- Stage reports: Reports on how applications move through stages, built from each application's stage intervals. By week: applications present in each stage (or from each…
- Link booking: A candidate's booking link for one stage of one job: a column with the job, the stage's length, who they meet (each with their role), where and what the…
- Team & members: The people page of a workspace: seats used against the plan, members and pending invitations in one list with search and a role filter, role changes that…