1
0
forked from baron/baron-sso

조직현황 구조변경. 총괄센터삼안 실 조직 삽입확인

This commit is contained in:
2026-05-11 20:13:54 +09:00
parent d3853fac2a
commit 3063450ee0
59 changed files with 5086 additions and 549 deletions

View File

@@ -125,6 +125,7 @@ function createEmptyAppointment(): AppointmentDraft {
tenantSlug: "",
isPrimary: false,
isOwner: false,
grade: "",
jobTitle: "",
position: "",
};
@@ -379,6 +380,7 @@ function UserDetailPage() {
status: "active",
tenantSlug: "",
department: "",
grade: "",
position: "",
jobTitle: "",
metadata: {},
@@ -622,6 +624,7 @@ function UserDetailPage() {
)?.slug ||
"",
department: user.department || "",
grade: user.grade || "",
position: user.position || "",
jobTitle: user.jobTitle || "",
metadata:
@@ -671,6 +674,7 @@ function UserDetailPage() {
isOwner:
metadata.primaryTenantIsOwner === true &&
tenant.id === fallbackAppointment?.id,
grade: user.grade,
jobTitle: user.jobTitle,
position: user.position,
}))
@@ -683,6 +687,7 @@ function UserDetailPage() {
tenantSlug: fallbackAppointment.slug,
isPrimary: true,
isOwner: metadata.primaryTenantIsOwner === true,
grade: user.grade,
jobTitle: user.jobTitle,
position: user.position,
},
@@ -750,6 +755,7 @@ function UserDetailPage() {
const tenant = await ensurePersonalTenant();
payload.tenantSlug = tenant.slug;
payload.department = undefined;
payload.grade = undefined;
payload.position = undefined;
payload.jobTitle = undefined;
payload.metadata = {
@@ -771,6 +777,7 @@ function UserDetailPage() {
tenantName: appointment.tenantName,
isPrimary: appointment.isOwner,
isOwner: appointment.isOwner,
grade: appointment.grade,
jobTitle: appointment.jobTitle,
position: appointment.position,
}));
@@ -790,6 +797,7 @@ function UserDetailPage() {
}
payload.department = undefined;
payload.grade = undefined;
payload.position = undefined;
payload.jobTitle = undefined;
payload.additionalAppointments = appointments;
@@ -1142,13 +1150,13 @@ function UserDetailPage() {
<p className="text-sm font-medium">
{t(
"ui.admin.users.detail.form.additional_appointments",
"소속별 직급/직무",
"소속별 직급/직책/직무",
)}
</p>
<p className="text-xs text-muted-foreground">
{t(
"msg.admin.users.detail.form.additional_appointments_help",
"테넌트별 조직장 여부, 직, 직급을 입력합니다.",
"테넌트별 조직장 여부, 직, 직책, 직무를 입력합니다.",
)}
</p>
</div>
@@ -1226,9 +1234,28 @@ function UserDetailPage() {
</div>
<div
className="grid gap-3 sm:grid-cols-2"
className="grid gap-3 sm:grid-cols-3"
data-testid={`detail-appointment-position-line-${index}`}
>
<div className="space-y-2">
<Label
htmlFor={`detail-appointment-grade-${index}`}
>
{t(
"ui.admin.users.detail.form.grade",
"직급",
)}
</Label>
<Input
id={`detail-appointment-grade-${index}`}
value={appointment.grade ?? ""}
onChange={(event) =>
updateAppointment(index, {
grade: event.target.value,
})
}
/>
</div>
<div className="space-y-2">
<Label
htmlFor={`detail-appointment-job-title-${index}`}
@@ -1255,7 +1282,7 @@ function UserDetailPage() {
>
{t(
"ui.admin.users.detail.form.position",
"직",
"직",
)}
</Label>
<Input
@@ -1313,12 +1340,25 @@ function UserDetailPage() {
className="h-11 shadow-sm"
/>
</div>
<div className="space-y-2">
<Label
htmlFor="grade"
className="text-xs font-bold uppercase text-muted-foreground"
>
{t("ui.admin.users.detail.form.grade", "직급")}
</Label>
<Input
id="grade"
{...register("grade")}
className="h-11 shadow-sm"
/>
</div>
<div className="space-y-2">
<Label
htmlFor="position"
className="text-xs font-bold uppercase text-muted-foreground"
>
{t("ui.admin.users.detail.form.position", "직")}
{t("ui.admin.users.detail.form.position", "직")}
</Label>
<Input
id="position"