fix(work-orders): polish slide-over and advanced search visuals

This commit is contained in:
Arthur Bassi 2026-07-21 09:10:06 -03:00
parent eb2ef024cd
commit f8a190df60
4 changed files with 45 additions and 19 deletions

View file

@ -131,7 +131,17 @@ export function SlideOverFooter({
Save Save
</Button> </Button>
) : ( ) : (
<Button variant="default" className="gap-1.5 text-[12px]" onClick={onEdit}> <Button
variant="default"
className="gap-1.5"
sx={{
padding: "3px 10px",
minWidth: 0,
fontSize: 12,
fontWeight: 500,
}}
onClick={onEdit}
>
<Pencil size={13} /> <Pencil size={13} />
Edit WO Edit WO
</Button> </Button>

View file

@ -27,8 +27,13 @@ export function SlideOverHeader({
> >
<div className="flex min-w-0 flex-1 flex-wrap items-center gap-2"> <div className="flex min-w-0 flex-1 flex-wrap items-center gap-2">
<h2 <h2
className="text-[15px] font-semibold leading-none" className="leading-none"
style={{ color: "var(--color-text-primary)" }} style={{
fontSize: 15,
fontWeight: 600,
lineHeight: "15px",
color: "var(--color-text-primary)",
}}
> >
#{row.woNumber || "—"} #{row.woNumber || "—"}
</h2> </h2>

View file

@ -15,6 +15,7 @@ import { AdvDocPill, AdvFilterPill, AdvStatusPill } from "./adv-filter-pill";
import { AdvMultiSelect } from "./adv-multi-select"; import { AdvMultiSelect } from "./adv-multi-select";
import { AdvSection } from "./adv-section"; import { AdvSection } from "./adv-section";
import { AdvTypeGrid } from "./adv-type-grid"; import { AdvTypeGrid } from "./adv-type-grid";
import { getPmTypeIcon } from "@/app/(protected)/workorders/_components/list/table/pm-type-icons";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { DateField } from "@/components/ui/date-input"; import { DateField } from "@/components/ui/date-input";
import { IconCloseButton } from "@/components/ui/icon-close-button"; import { IconCloseButton } from "@/components/ui/icon-close-button";
@ -37,6 +38,7 @@ import {
countAdvancedFilters, countAdvancedFilters,
isDefaultDateRange, isDefaultDateRange,
} from "@/domain/work-orders/utils/advanced-filters-utils"; } from "@/domain/work-orders/utils/advanced-filters-utils";
import { getDispatcherAvatarColor } from "@/domain/work-orders/utils/dispatcher-avatar-color";
type WorkOrdersAdvancedSearchSheetProps = { type WorkOrdersAdvancedSearchSheetProps = {
open: boolean; open: boolean;
@ -221,13 +223,16 @@ export function WorkOrdersAdvancedSearchSheet({
onToggle={(value) => toggleIn("dispatchers", value)} onToggle={(value) => toggleIn("dispatchers", value)}
onBulkToggle={(values, select) => setMany("dispatchers", values, select)} onBulkToggle={(values, select) => setMany("dispatchers", values, select)}
placeholder="Search assigned to…" placeholder="Search assigned to…"
renderLeft={(id) => renderLeft={(id) => {
id === ASSIGNEE_FILTER_UNASSIGNED ? ( if (id === ASSIGNEE_FILTER_UNASSIGNED) {
<UserX size={14} className="shrink-0 text-muted-foreground" /> return <UserX size={14} className="shrink-0 text-muted-foreground" />;
) : ( }
<span className="size-2 shrink-0 rounded-full bg-muted-foreground" /> const user = users.find((u) => String(u.id) === id);
) const color = getDispatcherAvatarColor(user ?? { id, name: id });
} return (
<span className="size-2 shrink-0 rounded-full" style={{ background: color }} />
);
}}
/> />
</AdvSection> </AdvSection>
@ -240,7 +245,6 @@ export function WorkOrdersAdvancedSearchSheet({
label={status} label={status}
dotColor={WIZARD_STATUS_DOTS[status]} dotColor={WIZARD_STATUS_DOTS[status]}
selected={draft.statuses.has(status)} selected={draft.statuses.has(status)}
selectedBg="var(--color-primary-tint)"
onClick={() => toggleIn("statuses", status)} onClick={() => toggleIn("statuses", status)}
/> />
))} ))}
@ -254,6 +258,10 @@ export function WorkOrdersAdvancedSearchSheet({
onToggle={(value) => toggleIn("pmTypes", value)} onToggle={(value) => toggleIn("pmTypes", value)}
onBulkToggle={(values, select) => setMany("pmTypes", values, select)} onBulkToggle={(values, select) => setMany("pmTypes", values, select)}
placeholder="Search pm type…" placeholder="Search pm type…"
renderLeft={(pmType) => {
const Icon = getPmTypeIcon(pmType);
return <Icon size={14} className="shrink-0 text-muted-foreground" />;
}}
/> />
</AdvSection> </AdvSection>

View file

@ -22,8 +22,14 @@ export function DotTogglePill({
style, style,
...props ...props
}: DotTogglePillProps) { }: DotTogglePillProps) {
const selectedStyle: CSSProperties | undefined = const softBg = selected
selected && selectedBg ? { background: selectedBg } : undefined; ? (selectedBg ?? `color-mix(in srgb, ${dotColor} 18%, transparent)`)
: `color-mix(in srgb, ${dotColor} 10%, transparent)`;
const pillStyle: CSSProperties = {
background: softBg,
...style,
};
return ( return (
<button <button
@ -31,18 +37,15 @@ export function DotTogglePill({
disabled={disabled} disabled={disabled}
className={cn( className={cn(
"inline-flex h-[26px] cursor-pointer items-center gap-1.5 rounded-full border px-2.5 transition-colors", "inline-flex h-[26px] cursor-pointer items-center gap-1.5 rounded-full border px-2.5 transition-colors",
selected ? "border-primary" : "border-border bg-background", selected ? "border-primary" : "border-border",
disabled && "cursor-not-allowed opacity-50", disabled && "cursor-not-allowed opacity-50",
className, className,
)} )}
style={{ ...selectedStyle, ...style }} style={pillStyle}
{...props} {...props}
> >
<span className="size-[7px] shrink-0 rounded-full" style={{ background: dotColor }} /> <span className="size-[7px] shrink-0 rounded-full" style={{ background: dotColor }} />
<span <span className="text-xs font-medium" style={{ color: selectedText ?? dotColor }}>
className={cn("text-xs font-medium", !selected && "text-muted-foreground")}
style={selected && selectedText ? { color: selectedText } : undefined}
>
{label} {label}
</span> </span>
</button> </button>