Files
Aislo/B01_Dashboard/B01_Dashboard_UI_View_Company.ts
T
eomsangdonandClaude Sonnet 5.5 7e34152de8 feat(B01): 받은 예정노선 · 임시 보관함 · 사람 · 회사 정보 · 회사 설계 기본값 세부 페이지 (549-1)
- 새 페이지 다섯(View_Assigned · Temp · People · Company · CompanyDefaults) · 등록부 다섯 줄 교체
- 표 줄 40 · 세로선 없음 · 줄 끝 ⋯ · 한글 배지 · 빈 상태 · 사람 탭 가입 요청 수 배지 · 보관함 남은 날 막대(7 일 안 빨강)
- 옛 구역 정리(Legacy · Company · AssignedPlans · TempUpload 다시 씀) · 시험 test_549 · test_546 stub 일반화

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 18:26:27 +09:00

108 lines
4.3 KiB
TypeScript

/* =============================================================================
* B01_Dashboard_UI_View_Company.ts
* 세부 페이지 「회사 정보」(549-1) — 설정 줄 카드(이름 · 사업자번호 · 대표자 · 주소 · 상태 · 수 · 로고).
* 회사 관리자 · 시스템 관리자 = [회사 정보 수정] · 로고 고르기 / 일반 · 산림청 = 보기만
* 시스템 관리자 = 머리에서 고른 회사 · 회사 없음 = [회사 생성] [회사 검색]
* ========================================================================== */
import { createButton } from "@ui/ui_template_elements";
import {
fetchAllCompanies,
fetchCompanyAssets,
fetchUserCompany,
setCompanyLogo,
type CompanyInfo,
} from "./B01_Dashboard_Api_Fetch";
import { createAssetField } from "./B01_Dashboard_UI_AssetPicker";
import { L } from "./B01_Dashboard_UI_Common";
import {
openCreateCompanyModal,
openEditCompanyModal,
openFindCompanyModal,
} from "./B01_Dashboard_UI_Modals";
import {
badge,
emptyState,
pageFrame,
primaryButton,
settingCard,
settingRow,
valueText,
} from "./B01_Dashboard_UI_PageKit";
import type { ViewCtx } from "./B01_Dashboard_UI_Views";
import { statusBadgeOf } from "./logic/B01_Dashboard_Logic_Pages";
async function loadCompany(ctx: ViewCtx): Promise<CompanyInfo | null> {
if (ctx.role === "SYSTEM_ADMIN") {
const all = await fetchAllCompanies().catch(() => []);
return all.find((c) => c.id === ctx.companyId) ?? null;
}
return fetchUserCompany().catch(() => null);
}
/** 로고 줄 — 관리자는 고르기 · 그 밖은 등록 여부만 */
function logoRow(company: CompanyInfo, ctx: ViewCtx, canEdit: boolean): HTMLElement {
const desc = "도면 표제란에 들어감 · 프로젝트가 따로 고르지 않으면 이 로고를 씀";
if (!canEdit) {
return settingRow("회사 로고", desc, valueText(company.logo_asset_id ? "등록됨" : null));
}
const slot = document.createElement("div");
void fetchCompanyAssets(company.id).then((assets) => {
slot.append(
createAssetField("", "LOGO", assets, company.logo_asset_id ?? null, company.id, ctx.me, {
onChange: (assetId) => setCompanyLogo(assetId, company.id).then(() => undefined),
}).root,
);
});
return settingRow("회사 로고", desc, slot);
}
export async function mountCompany(host: HTMLElement, ctx: ViewCtx): Promise<void> {
const page = pageFrame(host, "회사 정보", "회사 이름 · 사업자 정보 · 도면에 들어가는 로고");
const company = await loadCompany(ctx);
if (!host.isConnected) return;
if (!company) {
const actions = document.createElement("div");
actions.className = "b01-pg-inline";
actions.append(
primaryButton(L("B01_Dashboard_CreateCompany"), () => openCreateCompanyModal()),
createButton({
label: L("B01_Dashboard_FindCompany"),
variant: "ghost",
onClick: () => openFindCompanyModal(),
}),
);
page.body.append(
emptyState({
icon: "building",
text: "소속 회사가 없음",
hint: "회사를 만들거나 이미 있는 회사를 찾아 가입 요청을 보낼 수 있음",
action: actions,
onGuide: () => ctx.go("guide"),
}),
);
return;
}
// 회사 정보 수정 · 로고 = 관리자만(범위는 백엔드가 다시 봄)
const canEdit = ctx.role === "ADMIN" || ctx.role === "SYSTEM_ADMIN";
if (canEdit)
page.setAction(primaryButton("회사 정보 수정", () => openEditCompanyModal(company), "pencil"));
const status = company.business_status ? statusBadgeOf(company.business_status) : null;
page.body.append(
settingCard([
settingRow("회사 이름", "", valueText(company.name)),
settingRow(
L("B01_Dashboard_Field_BusinessNumber"),
"",
valueText(company.business_registration_number),
),
settingRow(L("B01_Dashboard_Field_Owner"), "", valueText(company.business_owner)),
settingRow(L("B01_Dashboard_Field_Address"), "", valueText(company.business_address)),
settingRow("사업자 상태", "", status ? badge(status.text, status.tone) : valueText(null)),
settingRow(L("B01_Dashboard_Metric_ActiveUsers"), "", valueText(company.user_count ?? 0)),
settingRow(L("B01_Dashboard_Projects"), "", valueText(company.project_count ?? 0)),
logoRow(company, ctx, canEdit),
]),
);
}