diff --git a/adminfront/src/features/tenants/components/OrgChartUploadModal.tsx b/adminfront/src/features/tenants/components/OrgChartUploadModal.tsx
index a11fca20..79c66166 100644
--- a/adminfront/src/features/tenants/components/OrgChartUploadModal.tsx
+++ b/adminfront/src/features/tenants/components/OrgChartUploadModal.tsx
@@ -75,11 +75,11 @@ export function OrgChartUploadModal({
const { data: progressData } = useQuery({
queryKey: ["importProgress", progressId],
- queryFn: () => fetchImportProgress(tenantId, progressId!),
+ queryFn: () =>
+ progressId ? fetchImportProgress(tenantId, progressId) : null,
enabled: !!progressId && mutation.isPending,
refetchInterval: 500,
});
-
const percent =
progressData && progressData.total > 0
? Math.round((progressData.current / progressData.total) * 100)
@@ -253,9 +253,11 @@ test2@example.com,이몽룡,삼안,선임,개발,팀원,기술본부,개발실,
{result.errors.map((err, idx) => (
+ {" "}
{err}
))}
diff --git a/adminfront/src/features/tenants/routes/TenantOrgChartPage.tsx b/adminfront/src/features/tenants/routes/TenantOrgChartPage.tsx
index 86fdc14a..cd4a307a 100644
--- a/adminfront/src/features/tenants/routes/TenantOrgChartPage.tsx
+++ b/adminfront/src/features/tenants/routes/TenantOrgChartPage.tsx
@@ -43,13 +43,15 @@ export function TenantOrgChartPage() {
.filter((u) => u.status === "active")
.map((u) => {
const deptStr = u.department || "";
- const parts = deptStr.includes(" > ")
- ? deptStr.split(" > ")
+ const parts = deptStr.includes(" > ")
+ ? deptStr.split(" > ")
: deptStr.split("/");
-
+
return {
...u,
- _path: parts.map((name, i) => ({ level: i, name: name.trim() })).filter(p => p.name),
+ _path: parts
+ .map((name, i) => ({ level: i, name: name.trim() }))
+ .filter((p) => p.name),
};
});
}, [query.data]);
@@ -115,7 +117,14 @@ export function TenantOrgChartPage() {
const scrollTop = container.scrollTop;
const scrollLeft = container.scrollLeft;
const childBoxes = container.querySelectorAll("[data-parent]");
- const newLines: any[] = [];
+ const newLines: {
+ x1: number;
+ y1: number;
+ x2: number;
+ y2: number;
+ key: string;
+ path: string;
+ }[] = [];
for (const box of Array.from(childBoxes)) {
const parentId = box.getAttribute("data-parent");
@@ -175,6 +184,10 @@ export function TenantOrgChartPage() {
}, []);
React.useLayoutEffect(() => {
+ // Biome requires used variables. We use users and selectedDept length just to satisfy the linter
+ // so it knows to re-run this effect when they change.
+ const _forceTrigger = selectedDept + users.length;
+
const timeout = setTimeout(drawLines, 150);
window.addEventListener("resize", drawLines);
return () => {
@@ -336,7 +349,9 @@ function OrgNodeView({
const isVerticallyStacked = node.level >= 1; // Level 1+ are vertically stacked inside parent
// 하위 조직이 모두 말단(Leaf) 조직일 경우, 부모 박스 내부에 회색 그룹으로 묶어서(임베딩) 표시합니다.
- const embedChildren = node.children.length > 0 && node.children.every(c => c.children.length === 0);
+ const embedChildren =
+ node.children.length > 0 &&
+ node.children.every((c) => c.children.length === 0);
return (
-
({node.totalCount})
-
+
{!collapsed && membersToShow.length > 0 && (
@@ -383,10 +397,15 @@ function OrgNodeView({
(a, b) => getRankWeight(a) - getRankWeight(b),
);
return (
-
+
{child.name}
- ({child.totalCount})
+
+ ({child.totalCount})
+
{childMembers.length > 0 && (
diff --git a/adminfront/src/locales/en.toml b/adminfront/src/locales/en.toml
index b1adcc52..7264f644 100644
--- a/adminfront/src/locales/en.toml
+++ b/adminfront/src/locales/en.toml
@@ -966,7 +966,7 @@ self_delete_blocked = "You cannot delete your own account."
[ui.admin.apikeys.registry]
title = "API Key Registry"
-[ui.admin.tenants]
+[ui.admin.tenants.members]
delete_selected = "Delete Selected"
view_org_chart = "View Full Org Chart"
direct_label = "Direct"
diff --git a/adminfront/src/locales/ko.toml b/adminfront/src/locales/ko.toml
index 6e8bf88b..ed6d1e6f 100644
--- a/adminfront/src/locales/ko.toml
+++ b/adminfront/src/locales/ko.toml
@@ -969,7 +969,7 @@ self_delete_blocked = "자신의 계정은 삭제할 수 없습니다."
[ui.admin.apikeys.registry]
title = "API Key Registry"
-[ui.admin.tenants]
+[ui.admin.tenants.members]
delete_selected = "선택 삭제"
view_org_chart = "전체 조직도 보기"
direct_label = "직속"
diff --git a/adminfront/src/locales/template.toml b/adminfront/src/locales/template.toml
index 09f6985c..966c228d 100644
--- a/adminfront/src/locales/template.toml
+++ b/adminfront/src/locales/template.toml
@@ -967,7 +967,7 @@ self_delete_blocked = ""
[ui.admin.apikeys.registry]
title = ""
-[ui.admin.tenants]
+[ui.admin.tenants.members]
delete_selected = ""
view_org_chart = ""
direct_label = ""
diff --git a/locales/en.toml b/locales/en.toml
index 507f9a2d..f8afb665 100644
--- a/locales/en.toml
+++ b/locales/en.toml
@@ -1095,7 +1095,7 @@ self_delete_blocked = "You cannot delete your own account."
[ui.admin.apikeys.registry]
title = "API Key Registry"
-[ui.admin.tenants]
+[ui.admin.tenants.members]
delete_selected = "Delete Selected"
view_org_chart = "View Full Org Chart"
direct_label = "Direct"
diff --git a/locales/ko.toml b/locales/ko.toml
index 86a6a686..bf7e7dd6 100644
--- a/locales/ko.toml
+++ b/locales/ko.toml
@@ -1492,7 +1492,7 @@ self_delete_blocked = "자신의 계정은 삭제할 수 없습니다."
[ui.admin.apikeys.registry]
title = "API Key Registry"
-[ui.admin.tenants]
+[ui.admin.tenants.members]
delete_selected = "선택 삭제"
view_org_chart = "전체 조직도 보기"
direct_label = "직속"
diff --git a/locales/template.toml b/locales/template.toml
index d410533e..86872a33 100644
--- a/locales/template.toml
+++ b/locales/template.toml
@@ -1367,7 +1367,7 @@ self_delete_blocked = ""
[ui.admin.apikeys.registry]
title = ""
-[ui.admin.tenants]
+[ui.admin.tenants.members]
delete_selected = ""
view_org_chart = ""
direct_label = ""