Merge commit 'bc0dee30300e33b7a2ef93871c128bd7ab252571' into iipbs/common/main

This commit is contained in:
leedj312
2025-03-11 18:02:44 +09:00
11 changed files with 128 additions and 49 deletions
+3 -1
View File
@@ -5,4 +5,6 @@
node_modules
# misc
.DS_Store
.DS_Store
apps/wr/.next/**/*
apps/fo/.next/**/*
@@ -0,0 +1,7 @@
@tailwind components;
@layer components {
.date-picker-trigger {
@apply h-[3rem] w-[12rem] justify-between border-input !bg-background px-4 py-2 text-left text-[1.3rem] font-normal leading-none text-muted-foreground hover:!bg-accent;
}
}
@@ -0,0 +1,46 @@
"use client";
import "./date-picker.css";
import { format } from "date-fns";
import { CalendarIcon } from "lucide-react";
import type { DayPickerSingleProps } from "react-day-picker";
import { Button, Calendar, Popover, PopoverContent, PopoverTrigger } from "@common/components/ui";
import { cn } from "../../lib/utils";
import { FormControl } from "../form";
type DatePickerProps = DayPickerSingleProps & { field: { value: Date; onChange: (date: Date | undefined) => void } };
export function DatePicker({ field }: DatePickerProps) {
return (
<Popover>
<PopoverTrigger asChild>
<FormControl>
<Button
variant={"outline"}
className={cn(
"w-[240px] pl-3 text-left font-normal",
!field?.value && "text-muted-foreground"
)}
>
{field?.value ? (
format(field?.value, "PPP")
) : (
<span>Pick a date</span>
)}
<CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
</Button>
</FormControl>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start">
<Calendar
mode="single"
selected={field?.value}
onSelect={field?.onChange}
initialFocus
/>
</PopoverContent>
</Popover>
);
}
@@ -0,0 +1,19 @@
import React from "react";
import { FormControl, FormItem, FormLabel, FormMessage } from "../form";
const FormUi = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement> & {label:string|undefined}
>(({children, label},ref)=>{
return (
<FormItem ref={ref}>
{label?<FormLabel className="text-xl">{label}</FormLabel>:<></>}
<FormControl>
{children}
</FormControl>
<FormMessage />
</FormItem>
)
})
FormUi.displayName = 'FormUi';
export { FormUi };
@@ -1,9 +1,12 @@
export * from "./chart";
export * from "./date_picker";
export * from "./file-upload";
export * from "./form";
export * from "./form_ui";
export * from "./scroll";
export * from "./search_form";
export * from "./search_input";
export * from "./search_input_select";
export * from "./select";
export * from "./table";
export * from "./scroll"
@@ -1,7 +1,7 @@
import * as React from "react"
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
import * as React from "react"
import { cn } from "@/lib/utils"
import { cn } from "../../lib/utils"
const ScrollArea = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
@@ -1,9 +1,9 @@
function SearchDiv ({children}:{ children: React.ReactNode; }) {
return (
<div className="flex border border-black m-4 rounded-lg">
<div className="flex border border-black m-4 rounded-lg min-h-[80px]">
{children}
</div>
)
}
export { SearchDiv };
export { SearchDiv };
@@ -5,10 +5,9 @@ const SearchInput = React.forwardRef<
HTMLDivElement& HTMLInputElement,
React.HTMLAttributes<HTMLDivElement> & {className:string, label:string}>
(({className, label}, ref) => {
console.log(ref);
return (
<div className={className+" flex"} >
{label && <Label className="m-4 text-lg w-1/4">{label}</Label>}
{label && <Label className="m-4 text-2xl w-1/4">{label}</Label>}
<Input className="ml-8 w-3/4 text-lg" ref={ref}></Input>
</div>
)
@@ -14,12 +14,15 @@ export type SelectDataType = {
* @param refs - React.forwardRef<HTMLInputElement> | null 입력값 ref
* @returns React.FC
*/
const SearchInputSelect = React.forwardRef<HTMLInputElement, {className:string, label:string, selectData: SelectDataType[], onSelectValue:(val:string)=>void}>(({className, label, selectData, onSelectValue}, refs) => {
const SearchInputSelect = React.forwardRef<HTMLInputElement, {className:string, label:string, selectData: SelectDataType[], onSelectValue:(val:string)=>void, textValue:string, setText:(val:string)=>void}>(({className, label, selectData, onSelectValue, textValue, setText}) => {
const changeText=(e:React.ChangeEvent<HTMLInputElement>)=>{
if(e?.target?.value) setText(e.target.value)
}
return (
<div className={className+" flex items-center"} >
{label && <Label className="m-4 text-lg w-1/4">{label}</Label>}
{label && <Label className="m-4 text-2xl w-1/4">{label}</Label>}
<div className="flex w-full items-center">
<Input className="w-2/3 text-lg" ref={refs}/>
<Input className="w-2/3 text-lg" value={textValue} onChange={changeText} />
<Select onValueChange={onSelectValue}>
<SelectTrigger className="ml-2 w-1/3 text-lg" >
<SelectValue placeholder={selectData?.[0]?.text ?? ""} />
@@ -17,9 +17,9 @@ const SelectBox = React.forwardRef<
return (
<div className={className+" flex items-center"} ref={ref}>
{label && <Label className="m-4 text-lg w-1/4">{label}</Label>}
{label && <Label className="m-4 text-2xl w-1/4">{label}</Label>}
<Select onValueChange={onSelectValue}>
<SelectTrigger className="ml-8 w-3/4 text-lg">
<SelectTrigger className="ml-8 w-3/4 text-2xl">
<SelectValue placeholder={placeHolder} />
</SelectTrigger>
<SelectContent>
@@ -1,49 +1,49 @@
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@common/components";
import UiPageNations from "./uiPageNations";
type UiTableProps = {
headName: React.ReactNode|undefined;
type UiTableProps = {
headName: React.ReactNode | undefined;
tableData: { [key: string]: string | number | boolean }[];
headlist: UiHeadProps[];
pageSize: number;
total: number;
children: React.ReactNode|undefined;
children: React.ReactNode | undefined;
}
type UiHeadProps={
id:string;
title:string;
type UiHeadProps = {
id: string;
title: string;
}
export function UiTable({ tableData, headlist,pageSize , total, children,headName}: UiTableProps) {
export function UiTable({ tableData, headlist, pageSize, total, children, headName }: UiTableProps) {
const cur = 1;
return (
<>
{headName?headName:<></>}
<Table>
<TableHeader>
{children? <>{children}</>:<TableRow>
{headlist?.map((head) => (
<TableHead key={head.id}>{head.title}</TableHead>
))}
</TableRow>}
</TableHeader>
<TableBody className='text-center'>
{tableData?.map((el: { [key: string]: string | number | boolean },index) => (
<TableRow key={index+"row"} >
{headlist.map((head) => (
<TableCell key={head.id+index}>{el[head.id]}</TableCell>
))}
</TableRow>
return (
<>
{headName ? headName : <></>}
<Table>
<TableHeader>
{children ? <>{children}</> : <TableRow>
{headlist?.map((head) => (
<TableHead key={head.id}>{head.title}</TableHead>
))}
</TableBody>
</Table>
{total <=0? <></>: <UiPageNations total={total} cur={cur} pageSize={pageSize} />}
</>
);
}
</TableRow>}
</TableHeader>
<TableBody className='text-center'>
{tableData?.map((el: { [key: string]: string | number | boolean }, index) => (
<TableRow key={index + "row"} >
{headlist.map((head) => (
<TableCell key={head.id + index}>{el[head.id]}</TableCell>
))}
</TableRow>
))}
</TableBody>
</Table>
{total <= 0 ? <></> : <UiPageNations total={total} cur={cur} pageSize={pageSize} />}
</>
);
}