improve app registration and component service ports
ci/woodpecker/push/woodpecker Pipeline was successful

This commit is contained in:
2026-07-09 14:26:43 +09:00
parent 8af6c60088
commit ac075a1fea
15 changed files with 301 additions and 60 deletions
+7 -7
View File
@@ -171,7 +171,7 @@ export function AdminManagementPage() {
};
const submitAdmin = () => {
if (!adminForm.email.trim() || !adminForm.name.trim()) return;
if (!adminForm.email.trim() || !adminForm.name.trim() || adminForm.temporaryPassword.length < 8) return;
setSaveState('saving');
createAdmin(adminForm)
.then(() => {
@@ -396,26 +396,26 @@ export function AdminManagementPage() {
<Modal
open={createOpen}
title="관리자 등록"
title="관리자 추가"
onClose={() => setCreateOpen(false)}
footer={
<>
<Button variant="outline" onClick={() => setCreateOpen(false)}>취소</Button>
<Button onClick={submitAdmin} disabled={saveState === 'saving'}>{saveState === 'saving' ? '저장 중' : '등록'}</Button>
<Button onClick={submitAdmin} disabled={saveState === 'saving' || !adminForm.email.trim() || !adminForm.name.trim() || adminForm.temporaryPassword.length < 8}>{saveState === 'saving' ? '저장 중' : '등록'}</Button>
</>
}
>
<div className="grid gap-4">
<label className="block">
<span className="text-xs font-medium text-muted-foreground">이메일</span>
<span className="text-xs font-medium text-muted-foreground">이메일 <b className="text-foreground">*</b></span>
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={adminForm.email} onChange={(event) => setAdminForm((prev) => ({ ...prev, email: event.target.value }))} />
</label>
<label className="block">
<span className="text-xs font-medium text-muted-foreground">이름</span>
<span className="text-xs font-medium text-muted-foreground">이름 <b className="text-foreground">*</b></span>
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={adminForm.name} onChange={(event) => setAdminForm((prev) => ({ ...prev, name: event.target.value }))} />
</label>
<label className="block">
<span className="text-xs font-medium text-muted-foreground">권한</span>
<span className="text-xs font-medium text-muted-foreground">권한 <b className="text-foreground">*</b></span>
<select className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={adminForm.role} onChange={(event) => setAdminForm((prev) => ({ ...prev, role: event.target.value }))}>
{roleOptions.map((role) => (
<option key={role.code} value={role.code}>
@@ -425,7 +425,7 @@ export function AdminManagementPage() {
</select>
</label>
<label className="block">
<span className="text-xs font-medium text-muted-foreground">임시 비밀번호</span>
<span className="text-xs font-medium text-muted-foreground">임시 비밀번호 <b className="text-foreground">*</b></span>
<input className="mt-2 h-9 w-full rounded-md border border-input bg-background px-3 text-sm text-foreground outline-none focus:ring-2 focus:ring-ring" value={adminForm.temporaryPassword} onChange={(event) => setAdminForm((prev) => ({ ...prev, temporaryPassword: event.target.value }))} />
</label>
</div>