diff options
Diffstat (limited to 'templates/timesheet.typ')
| -rw-r--r-- | templates/timesheet.typ | 74 |
1 files changed, 29 insertions, 45 deletions
diff --git a/templates/timesheet.typ b/templates/timesheet.typ index e888615..d008bbf 100644 --- a/templates/timesheet.typ +++ b/templates/timesheet.typ @@ -35,7 +35,9 @@ ] ] - v(3em) + v(0.5em) + line(length: 100%, stroke: 0.4pt + rgb("#d1d5db")) + v(2em) // Timesheet title grid( @@ -83,58 +85,40 @@ #let timesheet-table() = { let grouped = group-by-date(data.entries) let sorted-dates = grouped.keys().sorted() - - // Table header + table( - columns: (auto, auto, auto, auto, 1fr, 1fr), - stroke: (x, y) => if y == 0 { (bottom: 0.8pt + black) } else { none }, - inset: (x: 8pt, y: 4pt), - align: (center, center, center, center, left, left), - column-gutter: 8pt, - - // Header row with extra vertical padding - table.cell(fill: rgb("#f8f9fa"), inset: (x: 8pt, y: 12pt))[#text(weight: "bold", size: 9pt)[DATE]], - table.cell(fill: rgb("#f8f9fa"), inset: (x: 8pt, y: 12pt))[#text(weight: "bold", size: 9pt)[START]], - table.cell(fill: rgb("#f8f9fa"), inset: (x: 8pt, y: 12pt))[#text(weight: "bold", size: 9pt)[END]], - table.cell(fill: rgb("#f8f9fa"), inset: (x: 8pt, y: 12pt))[#text(weight: "bold", size: 9pt)[DURATION]], - table.cell(fill: rgb("#f8f9fa"), inset: (x: 8pt, y: 12pt))[#text(weight: "bold", size: 9pt)[PROJECT]], - table.cell(fill: rgb("#f8f9fa"), inset: (x: 8pt, y: 12pt))[#text(weight: "bold", size: 9pt)[DESCRIPTION]], - - // Data rows grouped by date + columns: (auto, auto, 1fr, 2fr), + stroke: none, + inset: (x: 10pt, y: 4pt), + align: (center, left, left, left), + fill: (x, y) => if y == 0 { rgb("#f8f9fa") } else { none }, + + // Header row + table.cell(inset: (x: 10pt, y: 12pt))[#text(weight: "bold", size: 9pt)[DATE]], + table.cell(inset: (x: 10pt, y: 12pt))[#text(weight: "bold", size: 9pt)[DURATION]], + table.cell(inset: (x: 10pt, y: 12pt))[#text(weight: "bold", size: 9pt)[PROJECT]], + table.cell(inset: (x: 10pt, y: 12pt))[#text(weight: "bold", size: 9pt)[DESCRIPTION]], + + table.hline(stroke: 0.8pt + black), + ..for date in sorted-dates { let entries = grouped.at(date) - let daily-total = entries.map(entry => entry.hours).sum() - - // Create rows for this date - let date-rows = () - - // Add all entries for this date + let rows = () for (i, entry) in entries.enumerate() { - let date-text = if i == 0 { date } else { "" } - - date-rows.push(( - text(size: 9pt, weight: "medium")[#date-text], - text(size: 9pt)[#entry.start_time], - text(size: 9pt)[#entry.end_time], - text(size: 9pt)[#entry.duration], + rows.push(( + text(size: 9pt, weight: "medium")[#if i == 0 { date }], + text(size: 9pt)[#entry.duration #text(fill: gray)[(#entry.start_time–#entry.end_time)]], text(size: 9pt)[#entry.project_name], - text(size: 9pt)[#entry.description] + text(size: 9pt)[#entry.description], )) } - - // Add daily subtotal row - date-rows.push(( - table.cell(colspan: 3, align: right)[#text(size: 9pt, weight: "medium", fill: gray)[Daily Total:]], - text(size: 9pt, weight: "medium")[#format-hours(daily-total)], - table.cell(colspan: 2)[] + // Thin separator between days + rows.push(( + table.cell(colspan: 4, inset: (x: 0pt, y: 0pt))[ + #line(length: 100%, stroke: 0.4pt + rgb("#e5e7eb")) + ], )) - - // Add separator line after each day - date-rows.push(( - table.cell(colspan: 6, stroke: (top: 0.5pt + gray))[#v(0.1em)], - )) - - date-rows + rows }.flatten() ) } |
