mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-07 16:19:01 +00:00
fix(work-orders): polish slide-over and advanced search visuals
This commit is contained in:
parent
eb2ef024cd
commit
f8a190df60
4 changed files with 45 additions and 19 deletions
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue