- {!collapsed && node.children.length > 0 && (
+ {!collapsed && !embedChildren && node.children.length > 0 && (
- {member.name}
+
+ {member.name}
+
{member.position && member.position !== roleBadge && (
- {member.position}
+
+ {member.position}
+
)}
{roleBadge && (
diff --git a/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx b/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx
index f2104737..ceea0c72 100644
--- a/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx
+++ b/adminfront/src/features/user-groups/routes/UserGroupDetailPage.tsx
@@ -251,12 +251,9 @@ export function UserGroupDetailPage() {
-
+
{t("ui.admin.groups.detail.breadcrumb_unit", "조직 단위")}
-
- ID: {id?.split("-")[0]}...
-
diff --git a/adminfront/src/features/users/components/UserBulkUploadModal.tsx b/adminfront/src/features/users/components/UserBulkUploadModal.tsx
index 4d46bea1..27a54e3d 100644
--- a/adminfront/src/features/users/components/UserBulkUploadModal.tsx
+++ b/adminfront/src/features/users/components/UserBulkUploadModal.tsx
@@ -74,15 +74,13 @@ export function UserBulkUploadModal({ onSuccess }: UserBulkUploadModalProps) {
};
const downloadTemplate = () => {
- const headers = "email,name,phone,role,tenant,department,position,jobTitle,employee_id";
+ const headers =
+ "email,name,phone,role,tenant,department,position,jobTitle,employee_id";
const example =
"user1@example.com,홍길동,010-1234-5678,user,tenant-slug,개발팀,수석,프론트엔드,EMP001";
- const blob = new Blob(
- [
- `${headers}\n${example}`,
- ],
- { type: "text/csv;charset=utf-8;" },
- );
+ const blob = new Blob([`${headers}\n${example}`], {
+ type: "text/csv;charset=utf-8;",
+ });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
diff --git a/adminfront/src/lib/adminApi.ts b/adminfront/src/lib/adminApi.ts
index 01524702..4c2bca0a 100644
--- a/adminfront/src/lib/adminApi.ts
+++ b/adminfront/src/lib/adminApi.ts
@@ -275,29 +275,32 @@ export interface ImportResult {
errors: string[];
}
-export async function fetchImportProgress(tenantId: string, progressId: string) {
+export async function fetchImportProgress(
+ tenantId: string,
+ progressId: string,
+) {
const { data } = await apiClient.get<{ current: number; total: number }>(
- `/v1/admin/tenants/${tenantId}/organization/import/progress/${progressId}`
+ `/v1/admin/tenants/${tenantId}/organization/import/progress/${progressId}`,
);
return data;
}
-export async function importOrgChart(tenantId: string, file: File, progressId?: string) {
+export async function importOrgChart(
+ tenantId: string,
+ file: File,
+ progressId?: string,
+) {
const formData = new FormData();
formData.append("file", file);
- const url = progressId
+ const url = progressId
? `/v1/admin/tenants/${tenantId}/organization/import?progressId=${progressId}`
: `/v1/admin/tenants/${tenantId}/organization/import`;
- const { data } = await apiClient.post<{ data: ImportResult }>(
- url,
- formData,
- {
- headers: {
- "Content-Type": "multipart/form-data",
- },
+ const { data } = await apiClient.post<{ data: ImportResult }>(url, formData, {
+ headers: {
+ "Content-Type": "multipart/form-data",
},
- );
+ });
return data.data;
}
diff --git a/backend/internal/service/org_chart_service.go b/backend/internal/service/org_chart_service.go
index 93ccfd71..68a11ca4 100644
--- a/backend/internal/service/org_chart_service.go
+++ b/backend/internal/service/org_chart_service.go
@@ -200,13 +200,13 @@ func (s *orgChartService) ImportOrgChart(ctx context.Context, tenantID string, r
orgParts = append(orgParts, val)
}
}
- orgPath := strings.Join(orgParts, "/")
+ orgPath := strings.Join(orgParts, " > ")
leafID := companyTenantID
- if orgPath != "" && orgPath != "-" {
+ if len(orgParts) > 0 {
// [Matrix Fix] Build hierarchy under the Root Tenant (tenantID), NOT the individual company.
// This allows departments like '총괄기획실' to be shared across multiple companies without duplication.
- leafID, err = s.ensureOrgPath(ctx, tenantID, orgPath, pathCache, result)
+ leafID, err = s.ensureOrgPath(ctx, tenantID, orgParts, pathCache, result)
if err != nil {
result.Errors = append(result.Errors, fmt.Sprintf("Row %d: Hierarchy fail: %v", rowIdx+2, err))
continue
@@ -435,8 +435,7 @@ func (s *orgChartService) ensureCompanyTenant(ctx context.Context, rootID, name,
return tenant.ID, nil
}
-func (s *orgChartService) ensureOrgPath(ctx context.Context, rootTenantID, path string, cache map[string]string, res *ImportResult) (string, error) {
- parts := strings.Split(path, "/")
+func (s *orgChartService) ensureOrgPath(ctx context.Context, rootTenantID string, parts []string, cache map[string]string, res *ImportResult) (string, error) {
currentParentID := rootTenantID
currentPath := ""
for i, part := range parts {