- Added Korean labels for `shipmentInstruction` and `purchase_detail` in the logistics pages to improve clarity. - Introduced a new constant `WOPR_TABLE` in the production result page for better data management. - Implemented daily aggregation of `work_order_process_result` data to enrich the `work_order_process` rows, enhancing data accuracy and user experience. These updates improve the usability and data handling in the logistics and production modules.
142 lines
4.8 KiB
TypeScript
142 lines
4.8 KiB
TypeScript
"use client";
|
|
|
|
import * as React from "react";
|
|
import { Command as CommandPrimitive } from "cmdk";
|
|
import { SearchIcon } from "lucide-react";
|
|
|
|
import { cn } from "@/lib/utils";
|
|
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog";
|
|
|
|
function Command({ className, ...props }: React.ComponentProps<typeof CommandPrimitive>) {
|
|
return (
|
|
<CommandPrimitive
|
|
data-slot="command"
|
|
className={cn(
|
|
"bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md",
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function CommandDialog({
|
|
title = "Command Palette",
|
|
description = "Search for a command to run...",
|
|
children,
|
|
className,
|
|
showCloseButton = true,
|
|
...props
|
|
}: React.ComponentProps<typeof Dialog> & {
|
|
title?: string;
|
|
description?: string;
|
|
className?: string;
|
|
showCloseButton?: boolean;
|
|
}) {
|
|
return (
|
|
<Dialog {...props}>
|
|
<DialogContent className={cn("overflow-hidden p-0", className)} showCloseButton={showCloseButton}>
|
|
{/* DialogTitle은 DialogContent 내부에 있어야 Radix UI가 a11y 인식 (sr-only로 시각적 숨김) */}
|
|
<DialogHeader className="sr-only">
|
|
<DialogTitle>{title}</DialogTitle>
|
|
<DialogDescription>{description}</DialogDescription>
|
|
</DialogHeader>
|
|
<Command className="[&_[cmdk-group-heading]]:text-muted-foreground **:data-[slot=command-input-wrapper]:h-12 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group]]:px-2 [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
|
|
{children}
|
|
</Command>
|
|
</DialogContent>
|
|
</Dialog>
|
|
);
|
|
}
|
|
|
|
function CommandInput({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Input>) {
|
|
return (
|
|
<div data-slot="command-input-wrapper" className="flex h-9 items-center gap-2 border-b px-3">
|
|
<SearchIcon className="size-4 shrink-0 opacity-50" />
|
|
<CommandPrimitive.Input
|
|
data-slot="command-input"
|
|
className={cn(
|
|
"placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50",
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
function CommandList({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.List>) {
|
|
return (
|
|
<CommandPrimitive.List
|
|
data-slot="command-list"
|
|
className={cn("max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto overscroll-contain", className)}
|
|
onWheel={(e) => {
|
|
e.stopPropagation();
|
|
}}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function CommandEmpty({ ...props }: React.ComponentProps<typeof CommandPrimitive.Empty>) {
|
|
return <CommandPrimitive.Empty data-slot="command-empty" className="py-6 text-center text-sm" {...props} />;
|
|
}
|
|
|
|
function CommandGroup({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Group>) {
|
|
return (
|
|
<CommandPrimitive.Group
|
|
data-slot="command-group"
|
|
className={cn(
|
|
"text-foreground [&_[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium",
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function CommandSeparator({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Separator>) {
|
|
return (
|
|
<CommandPrimitive.Separator
|
|
data-slot="command-separator"
|
|
className={cn("bg-border -mx-1 h-px", className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function CommandItem({ className, ...props }: React.ComponentProps<typeof CommandPrimitive.Item>) {
|
|
return (
|
|
<CommandPrimitive.Item
|
|
data-slot="command-item"
|
|
className={cn(
|
|
"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function CommandShortcut({ className, ...props }: React.ComponentProps<"span">) {
|
|
return (
|
|
<span
|
|
data-slot="command-shortcut"
|
|
className={cn("text-muted-foreground ml-auto text-xs tracking-widest", className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export {
|
|
Command,
|
|
CommandDialog,
|
|
CommandInput,
|
|
CommandList,
|
|
CommandEmpty,
|
|
CommandGroup,
|
|
CommandItem,
|
|
CommandShortcut,
|
|
CommandSeparator,
|
|
};
|