summaryrefslogtreecommitdiff
path: root/lib/admin-users/table
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-08-22 03:11:57 +0000
committerjoonhoekim <26rote@gmail.com>2025-08-22 03:11:57 +0000
commitdbdae213e39b82ff8ee565df0774bd2f72f06140 (patch)
tree37ff13e5784426328c40408e960699af554aeb24 /lib/admin-users/table
parent01296fafda2b52339727ca445de39c6ccb3ba03d (diff)
(김준회) 로그인 에러 토스트 메시지 개선, 중공업 유저의 협력사 유저 추가/수정시 전화번호 사용 반영
Diffstat (limited to 'lib/admin-users/table')
-rw-r--r--lib/admin-users/table/add-ausers-dialog.tsx50
-rw-r--r--lib/admin-users/table/ausers-table.tsx5
-rw-r--r--lib/admin-users/table/update-auser-sheet.tsx56
3 files changed, 101 insertions, 10 deletions
diff --git a/lib/admin-users/table/add-ausers-dialog.tsx b/lib/admin-users/table/add-ausers-dialog.tsx
index 64941965..3b29adcf 100644
--- a/lib/admin-users/table/add-ausers-dialog.tsx
+++ b/lib/admin-users/table/add-ausers-dialog.tsx
@@ -47,12 +47,31 @@ import { Check, ChevronsUpDown, Loader } from "lucide-react"
import { cn } from "@/lib/utils"
import { toast } from "sonner"
import { Vendor } from "@/db/schema/vendors"
+import { FormDescription } from "@/components/ui/form"
const languageOptions = [
{ value: "ko", label: "한국어" },
{ value: "en", label: "English" },
]
+// Phone validation helper
+const validatePhoneNumber = (phone: string): boolean => {
+ if (!phone) return true; // Optional field
+ // Basic international phone number validation
+ const cleanPhone = phone.replace(/[\s\-\(\)]/g, '');
+ return /^\+\d{3,20}$/.test(cleanPhone);
+};
+
+// Get phone placeholder
+const getPhonePlaceholder = (): string => {
+ return "+82-10-1234-5678";
+};
+
+// Get phone description
+const getPhoneDescription = (): string => {
+ return "국제 전화번호를 입력하세요. (예: +82-10-1234-5678)";
+};
+
export function AddUserDialog() {
const [open, setOpen] = React.useState(false)
@@ -74,11 +93,12 @@ export function AddUserDialog() {
}, [])
// react-hook-form 세팅
- const form = useForm<CreateUserSchema & { language?: string }>({
+ const form = useForm<CreateUserSchema & { language?: string; phone?: string }>({
resolver: zodResolver(createUserSchema),
defaultValues: {
name: "",
email: "",
+ phone: "", // Add phone field
companyId: null,
language:'en',
// roles는 array<string>, 여기서는 단일 선택 시 [role]로 담음
@@ -89,9 +109,11 @@ export function AddUserDialog() {
})
- async function onSubmit(data: CreateUserSchema & { language?: string }) {
+ async function onSubmit(data: CreateUserSchema & { language?: string; phone?: string }) {
data.domain = "partners"
+ // Phone validation is now handled by zod schema
+
// 만약 단일 Select로 role을 정했다면, data.roles = ["manager"] 이런 식
startAddTransition(async ()=> {
const result = await createAdminUser(data)
@@ -171,6 +193,30 @@ export function AddUserDialog() {
)}
/>
+ {/* 전화번호 - 새로 추가 */}
+ <FormField
+ control={form.control}
+ name="phone"
+ render={({ field }) => (
+ <FormItem>
+ <FormLabel>Phone Number</FormLabel>
+ <FormControl>
+ <Input
+ placeholder={getPhonePlaceholder()}
+ {...field}
+ className={cn(
+ field.value && !validatePhoneNumber(field.value) && "border-red-500"
+ )}
+ />
+ </FormControl>
+ <FormDescription className="text-xs text-muted-foreground">
+ {getPhoneDescription()}
+ </FormDescription>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+
{/* 회사 선택 (companyId) */}
<FormField
control={form.control}
diff --git a/lib/admin-users/table/ausers-table.tsx b/lib/admin-users/table/ausers-table.tsx
index 1e254b5c..98319826 100644
--- a/lib/admin-users/table/ausers-table.tsx
+++ b/lib/admin-users/table/ausers-table.tsx
@@ -1,7 +1,7 @@
"use client"
import * as React from "react"
-import { userRoles , type UserView} from "@/db/schema/users"
+import { type UserView} from "@/db/schema/users"
import type {
DataTableAdvancedFilterField,
DataTableFilterField,
@@ -12,11 +12,8 @@ import { toSentenceCase } from "@/lib/utils"
import { useDataTable } from "@/hooks/use-data-table"
import { DataTable } from "@/components/data-table/data-table"
import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar"
-import { DataTableToolbar } from "@/components/data-table/data-table-toolbar"
import type {
- getUserCountGroupByCompany,
- getUserCountGroupByRole,
getUsers, getAllCompanies,
getAllRoles
} from "@/lib//admin-users/service"
diff --git a/lib/admin-users/table/update-auser-sheet.tsx b/lib/admin-users/table/update-auser-sheet.tsx
index ddf1f932..fbd3a42f 100644
--- a/lib/admin-users/table/update-auser-sheet.tsx
+++ b/lib/admin-users/table/update-auser-sheet.tsx
@@ -23,6 +23,7 @@ import {
FormItem,
FormLabel,
FormMessage,
+ FormDescription,
} from "@/components/ui/form"
import { Input } from "@/components/ui/input"
import {
@@ -31,12 +32,12 @@ import {
SelectContent,
SelectItem,
SelectValue,
- SelectGroup,
} from "@/components/ui/select"
// import your MultiSelect or other role selection
import { MultiSelect } from "@/components/ui/multi-select"
+import { cn } from "@/lib/utils"
-import { userRoles, type UserView } from "@/db/schema/users"
+import { type UserView } from "@/db/schema/users"
import { updateUserSchema, type UpdateUserSchema } from "@/lib/admin-users/validations"
import { modifiUser } from "@/lib/admin-users/service"
@@ -50,16 +51,35 @@ const languageOptions = [
{ value: "en", label: "English" },
]
+// Phone validation helper
+const validatePhoneNumber = (phone: string): boolean => {
+ if (!phone) return true; // Optional field
+ // Basic international phone number validation
+ const cleanPhone = phone.replace(/[\s\-\(\)]/g, '');
+ return /^\+\d{3,20}$/.test(cleanPhone);
+};
+
+// Get phone placeholder
+const getPhonePlaceholder = (): string => {
+ return "+82-10-1234-5678";
+};
+
+// Get phone description
+const getPhoneDescription = (): string => {
+ return "국제 전화번호를 입력하세요. (예: +82-10-1234-5678)";
+};
+
export function UpdateAuserSheet({ user, ...props }: UpdateAuserSheetProps) {
const [isUpdatePending, startUpdateTransition] = React.useTransition()
// 1) RHF 설정
- const form = useForm<UpdateUserSchema & { language?: string }>({
+ const form = useForm<UpdateUserSchema & { language?: string; phone?: string }>({
resolver: zodResolver(updateUserSchema),
defaultValues: {
name: user?.user_name ?? "",
email: user?.user_email ?? "",
+ phone: user?.user_phone ?? "", // Add phone field
companyId: user?.company_id ?? null,
roles: user?.roles ?? [],
language:'en',
@@ -72,15 +92,19 @@ export function UpdateAuserSheet({ user, ...props }: UpdateAuserSheetProps) {
form.reset({
name: user.user_name,
email: user.user_email,
+ phone: user.user_phone || "", // Add phone field
companyId: user.company_id,
roles: user.roles,
+ language: 'en', // You might want to get this from user object
})
}
}, [user, form])
// 3) onSubmit
- async function onSubmit(input: UpdateUserSchema & { language?: string }) {
+ async function onSubmit(input: UpdateUserSchema & { language?: string; phone?: string }) {
+ // Phone validation is now handled by zod schema
+
startUpdateTransition(async () => {
if (!user) return
@@ -147,6 +171,30 @@ export function UpdateAuserSheet({ user, ...props }: UpdateAuserSheetProps) {
)}
/>
+ {/* 전화번호 - 새로 추가 */}
+ <FormField
+ control={form.control}
+ name="phone"
+ render={({ field }) => (
+ <FormItem>
+ <FormLabel>Phone Number</FormLabel>
+ <FormControl>
+ <Input
+ placeholder={getPhonePlaceholder()}
+ {...field}
+ className={cn(
+ field.value && !validatePhoneNumber(field.value) && "border-red-500"
+ )}
+ />
+ </FormControl>
+ <FormDescription className="text-xs text-muted-foreground">
+ {getPhoneDescription()}
+ </FormDescription>
+ <FormMessage />
+ </FormItem>
+ )}
+ />
+
{/* roles */}
<FormField
control={form.control}