diff --git a/Makefile b/Makefile index f7d76a82..941b14b2 100644 --- a/Makefile +++ b/Makefile @@ -276,18 +276,18 @@ code-check-front-lint: @echo "==> adminfront biome lint/format check" rm -rf adminfront/playwright-report adminfront/test-results cd adminfront && CI=true npx pnpm install --frozen-lockfile --ignore-scripts - cd adminfront && npx biome check . --formatter-enabled=false --organize-imports-enabled=false - cd adminfront && npx biome check . --linter-enabled=false --organize-imports-enabled=false + cd adminfront && npx biome lint . + cd adminfront && npx biome format . @echo "==> devfront biome lint/format check" rm -rf devfront/playwright-report devfront/test-results cd devfront && npm ci --ignore-scripts - cd devfront && npx biome check . --formatter-enabled=false --organize-imports-enabled=false - cd devfront && npx biome check . --linter-enabled=false --organize-imports-enabled=false + cd devfront && npx biome lint . + cd devfront && npx biome format . @echo "==> orgfront biome lint/format check" rm -rf orgfront/playwright-report orgfront/test-results cd orgfront && npm ci --ignore-scripts - cd orgfront && npx biome check . --formatter-enabled=false --organize-imports-enabled=false - cd orgfront && npx biome check . --linter-enabled=false --organize-imports-enabled=false + cd orgfront && npx biome lint . + cd orgfront && npx biome format . code-check-backend-tests: @echo "==> backend tests" diff --git a/adminfront/src/features/tenants/routes/TenantListPage.tsx b/adminfront/src/features/tenants/routes/TenantListPage.tsx index d5a53164..d1569117 100644 --- a/adminfront/src/features/tenants/routes/TenantListPage.tsx +++ b/adminfront/src/features/tenants/routes/TenantListPage.tsx @@ -118,6 +118,10 @@ import { const tenantCSVTemplate = "name,type,parent_tenant_slug,slug,memo,email_domain,visibility,org_unit_type\n"; const tenantPageSize = 500; +const _tenantVirtualizationThreshold = 250; +const _tenantEstimatedRowHeight = 73; +const _tenantLoadAheadPx = 360; +const _tenantLoadAheadRows = 30; type TenantSortKey = keyof TenantSummary | "recursiveMemberCount"; diff --git a/adminfront/src/features/users/UserCreatePage.tsx b/adminfront/src/features/users/UserCreatePage.tsx index f7cccce0..f9b968e3 100644 --- a/adminfront/src/features/users/UserCreatePage.tsx +++ b/adminfront/src/features/users/UserCreatePage.tsx @@ -662,6 +662,7 @@ function UserCreatePage() { variant="ghost" size="sm" className="absolute right-1 top-1 h-8 text-xs font-bold" + data-testid="add-sub-email-btn" onClick={() => { const value = newSubEmail.trim().replace(/,/g, ""); if ( @@ -678,7 +679,7 @@ function UserCreatePage() { }} > {t("ui.common.add", "추가")} - + {" "}

* 여러 개 입력 가능. 입력 후 엔터를 눌러 추가하세요. @@ -877,6 +878,7 @@ function UserCreatePage() { variant="outline" size="sm" onClick={addAppointment} + data-testid="add-appointment-btn" > {t("ui.common.add", "추가")} diff --git a/adminfront/src/features/users/UserDetailPage.tsx b/adminfront/src/features/users/UserDetailPage.tsx index 58fa2659..d25373de 100644 --- a/adminfront/src/features/users/UserDetailPage.tsx +++ b/adminfront/src/features/users/UserDetailPage.tsx @@ -1020,15 +1020,14 @@ function UserDetailPage() { {user.email} - {Array.isArray(user.metadata?.sub_email) && - user.metadata.sub_email.length > 0 && ( -

- - - +{user.metadata.sub_email.length} - -
- )} + {normalizeSubEmails(user.metadata?.sub_email).length > 0 && ( +
+ + + +{normalizeSubEmails(user.metadata?.sub_email).length} + +
+ )} {user.phone && (
@@ -1194,6 +1193,7 @@ function UserDetailPage() { variant="ghost" size="sm" className="absolute right-1 top-1 h-9 text-xs font-bold" + data-testid="add-sub-email-btn" onClick={() => { const value = newSubEmail.trim().replace(/,/g, ""); if ( @@ -1347,6 +1347,7 @@ function UserDetailPage() { variant="outline" size="sm" onClick={addAppointment} + data-testid="add-appointment-btn" > {t("ui.common.add", "추가")} diff --git a/adminfront/src/features/users/utils/csvParser.test.ts b/adminfront/src/features/users/utils/csvParser.test.ts index e54ae54c..101ca7e7 100644 --- a/adminfront/src/features/users/utils/csvParser.test.ts +++ b/adminfront/src/features/users/utils/csvParser.test.ts @@ -141,8 +141,7 @@ primary@samaneng.com,Primary User,rnd-saman,EMP001,secondary@hanmaceng.co.kr`; tenantSlug: "rnd-saman", metadata: { employee_id: "EMP001", - sub_email: "secondary@hanmaceng.co.kr", - secondary_emails: ["secondary@hanmaceng.co.kr"], + sub_email: ["secondary@hanmaceng.co.kr"], aliasEmails: ["secondary@hanmaceng.co.kr"], }, }); diff --git a/adminfront/tests/users.spec.ts b/adminfront/tests/users.spec.ts index 981d661b..b65b0b75 100644 --- a/adminfront/tests/users.spec.ts +++ b/adminfront/tests/users.spec.ts @@ -721,7 +721,7 @@ test.describe("User Management", () => { await expect(page.locator("input#department")).toHaveCount(0); await expect(page.getByText(/대표 소속/i)).toHaveCount(0); - await page.getByRole("button", { name: /^추가$/i }).click(); + await page.getByTestId("add-appointment-btn").click(); await expect(page.getByTestId("appointment-row-0")).toBeVisible(); await expect( page.getByTestId("appointment-tenant-owner-line-0"),