feat: improve hours report filter layout
This commit is contained in:
parent
b83c37d51f
commit
698e082719
1 changed files with 90 additions and 28 deletions
|
|
@ -28,7 +28,9 @@ import {
|
||||||
import type { ChartConfig } from "@/components/ui/chart"
|
import type { ChartConfig } from "@/components/ui/chart"
|
||||||
import { formatHoursCompact } from "@/lib/utils"
|
import { formatHoursCompact } from "@/lib/utils"
|
||||||
import { SearchableCombobox, type SearchableComboboxOption } from "@/components/ui/searchable-combobox"
|
import { SearchableCombobox, type SearchableComboboxOption } from "@/components/ui/searchable-combobox"
|
||||||
import { ReportsFilterToolbar } from "@/components/reports/report-filter-toolbar"
|
import { Button } from "@/components/ui/button"
|
||||||
|
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
|
||||||
|
import { DateRangeButton } from "@/components/date-range-button"
|
||||||
import { ReportScheduleDrawer } from "@/components/reports/report-schedule-drawer"
|
import { ReportScheduleDrawer } from "@/components/reports/report-schedule-drawer"
|
||||||
|
|
||||||
type HoursItem = {
|
type HoursItem = {
|
||||||
|
|
@ -227,31 +229,81 @@ export function HoursReport() {
|
||||||
companyOptions={companyOptions}
|
companyOptions={companyOptions}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
<ReportsFilterToolbar
|
<div className="flex flex-col gap-4 rounded-3xl border border-border/60 bg-white/95 p-4 shadow-sm">
|
||||||
companyId={companyId}
|
<div className="flex flex-wrap gap-3 lg:items-center">
|
||||||
onCompanyChange={(value) => setCompanyId(value)}
|
<div className="flex flex-1 flex-wrap gap-3 lg:flex-nowrap">
|
||||||
companyOptions={companyOptions}
|
<SearchableCombobox
|
||||||
timeRange={timeRange}
|
value={companyId}
|
||||||
onTimeRangeChange={(value) => {
|
onValueChange={(value) => setCompanyId(value ?? "all")}
|
||||||
setTimeRange(value)
|
options={companyOptions}
|
||||||
setDateFrom(null)
|
placeholder="Todas as empresas"
|
||||||
setDateTo(null)
|
triggerClassName="h-10 w-full rounded-2xl border border-border/60 bg-white px-3 text-left text-sm font-semibold text-neutral-800 lg:w-64"
|
||||||
}}
|
/>
|
||||||
showBillingFilter
|
<DateRangeButton
|
||||||
billingFilter={billingFilter}
|
from={dateFrom}
|
||||||
onBillingFilterChange={(value) => setBillingFilter(value)}
|
to={dateTo}
|
||||||
exportHref={exportHref}
|
onChange={({ from, to }) => {
|
||||||
onOpenScheduler={isAdmin ? () => setSchedulerOpen(true) : undefined}
|
|
||||||
dateFrom={dateFrom}
|
|
||||||
dateTo={dateTo}
|
|
||||||
onDateRangeChange={({ from, to }) => {
|
|
||||||
setDateFrom(from)
|
setDateFrom(from)
|
||||||
setDateTo(to)
|
setDateTo(to)
|
||||||
}}
|
}}
|
||||||
allowExtendedRanges={groupBy === "machine"}
|
className="w-full min-w-[200px] lg:w-auto"
|
||||||
extraFilters={
|
/>
|
||||||
<div className="flex flex-wrap items-center gap-2">
|
</div>
|
||||||
<span className="text-xs font-medium text-neutral-500">Agrupar por</span>
|
<div className="flex flex-1 justify-center">
|
||||||
|
<ToggleGroup
|
||||||
|
type="single"
|
||||||
|
value={billingFilter}
|
||||||
|
onValueChange={(value) => value && setBillingFilter(value as typeof billingFilter)}
|
||||||
|
className="inline-flex rounded-full border border-border/60 bg-white/80 p-1 overflow-hidden"
|
||||||
|
>
|
||||||
|
<ToggleGroupItem value="all" className="rounded-full px-6 py-2 text-xs font-semibold whitespace-nowrap">
|
||||||
|
Todos
|
||||||
|
</ToggleGroupItem>
|
||||||
|
<ToggleGroupItem value="avulso" className="rounded-full px-6 py-2 text-xs font-semibold whitespace-nowrap">
|
||||||
|
Somente avulsos
|
||||||
|
</ToggleGroupItem>
|
||||||
|
<ToggleGroupItem value="contratado" className="rounded-full px-6 py-2 text-xs font-semibold whitespace-nowrap">
|
||||||
|
Somente contratados
|
||||||
|
</ToggleGroupItem>
|
||||||
|
</ToggleGroup>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="flex flex-wrap items-center gap-3">
|
||||||
|
<ToggleGroup
|
||||||
|
type="single"
|
||||||
|
value={timeRange}
|
||||||
|
onValueChange={(value) => {
|
||||||
|
if (!value) return
|
||||||
|
setTimeRange(value as typeof timeRange)
|
||||||
|
setDateFrom(null)
|
||||||
|
setDateTo(null)
|
||||||
|
}}
|
||||||
|
variant="outline"
|
||||||
|
size="lg"
|
||||||
|
className="flex flex-wrap rounded-2xl border border-border/60 lg:flex-nowrap lg:min-w-[320px]"
|
||||||
|
>
|
||||||
|
<ToggleGroupItem value="90d" className="min-w-[80px] justify-center px-4">
|
||||||
|
90 dias
|
||||||
|
</ToggleGroupItem>
|
||||||
|
<ToggleGroupItem value="30d" className="min-w-[80px] justify-center px-4">
|
||||||
|
30 dias
|
||||||
|
</ToggleGroupItem>
|
||||||
|
<ToggleGroupItem value="7d" className="min-w-[80px] justify-center px-4">
|
||||||
|
7 dias
|
||||||
|
</ToggleGroupItem>
|
||||||
|
{groupBy === "machine" ? (
|
||||||
|
<>
|
||||||
|
<ToggleGroupItem value="365d" className="hidden min-w-[96px] justify-center px-4 lg:inline-flex">
|
||||||
|
12 meses
|
||||||
|
</ToggleGroupItem>
|
||||||
|
<ToggleGroupItem value="all" className="hidden min-w-[120px] justify-center px-5 lg:inline-flex">
|
||||||
|
Todo histórico
|
||||||
|
</ToggleGroupItem>
|
||||||
|
</>
|
||||||
|
) : null}
|
||||||
|
</ToggleGroup>
|
||||||
|
<div className="flex flex-1 min-w-[220px] flex-wrap items-center justify-center gap-2 text-xs font-medium text-neutral-500">
|
||||||
|
<span>Agrupar por</span>
|
||||||
<div className="inline-flex rounded-full border border-slate-200 bg-slate-50 p-1 text-xs">
|
<div className="inline-flex rounded-full border border-slate-200 bg-slate-50 p-1 text-xs">
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
|
|
@ -277,8 +329,18 @@ export function HoursReport() {
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
<div className="ml-auto flex flex-wrap items-center justify-end gap-2 lg:flex-nowrap">
|
||||||
/>
|
{isAdmin ? (
|
||||||
|
<Button variant="outline" size="sm" onClick={() => setSchedulerOpen(true)}>
|
||||||
|
Agendar exportação
|
||||||
|
</Button>
|
||||||
|
) : null}
|
||||||
|
<Button asChild size="sm" variant="outline">
|
||||||
|
<a href={exportHref}>Exportar XLSX</a>
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<Card className="border-slate-200">
|
<Card className="border-slate-200">
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle>
|
<CardTitle>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue