- 새 페이지 다섯(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>
108 lines
4.3 KiB
TypeScript
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),
|
|
]),
|
|
);
|
|
}
|