refactor(pop): trim main page widgets, drop layout auto-clone
- Remove KpiCarousel/RecentActivity from pop main pages (7 companies) - Empty banner default; rename settings key home -> main - Strip API fetch/cache from usePopSettings, return hardcoded defaults - Drop screen_layouts_pop auto-clone/fallback for regular users - Add SUPER_ADMIN direct-entry branch in AppLayout pop handler Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5936,65 +5936,12 @@ export class ScreenManagementService {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// 일반 사용자: 회사별 우선, 없으면 템플릿에서 자동 복제
|
||||
// 일반 사용자: 회사별 레이아웃만 조회 (fallback/자동 복제 없음)
|
||||
layout = await queryOne<{ layout_data: any }>(
|
||||
`SELECT layout_data FROM screen_layouts_pop
|
||||
WHERE screen_id = $1 AND company_code = $2`,
|
||||
[screenId, companyCode],
|
||||
);
|
||||
|
||||
// 회사별 레이아웃이 없으면 템플릿에서 자동 복제
|
||||
if (!layout && companyCode !== "*") {
|
||||
// 1. 공통(*) 템플릿 조회
|
||||
let templateLayout = await queryOne<{ layout_data: any }>(
|
||||
`SELECT layout_data FROM screen_layouts_pop
|
||||
WHERE screen_id = $1 AND company_code = '*'`,
|
||||
[screenId],
|
||||
);
|
||||
|
||||
// 2. 공통 없으면 COMPANY_7(탑씰) 폴백
|
||||
if (!templateLayout) {
|
||||
templateLayout = await queryOne<{ layout_data: any }>(
|
||||
`SELECT layout_data FROM screen_layouts_pop
|
||||
WHERE screen_id = $1 AND company_code = 'COMPANY_7'`,
|
||||
[screenId],
|
||||
);
|
||||
}
|
||||
|
||||
// 3. 템플릿이 있으면 해당 회사용으로 복제
|
||||
if (templateLayout) {
|
||||
console.log(`POP 레이아웃 자동 복제: screen_id=${screenId}, 대상 회사=${companyCode}`);
|
||||
|
||||
// 회사명 조회 (레이아웃 내 회사명 치환용)
|
||||
const companyInfo = await queryOne<{ company_name: string }>(
|
||||
`SELECT company_name FROM company_mng WHERE company_code = $1`,
|
||||
[companyCode],
|
||||
);
|
||||
const companyName = companyInfo?.company_name || companyCode;
|
||||
|
||||
let clonedData = JSON.parse(JSON.stringify(templateLayout.layout_data));
|
||||
|
||||
// layout_data 내 회사명 텍스트 치환 (탑씰 관련 문자열 → 대상 회사명)
|
||||
const layoutStr = JSON.stringify(clonedData);
|
||||
const replacedStr = layoutStr
|
||||
.replace(/\(주\)탑씰/g, companyName)
|
||||
.replace(/탑씰/g, companyName)
|
||||
.replace(/TOPSEAL/gi, companyName);
|
||||
clonedData = JSON.parse(replacedStr);
|
||||
|
||||
// 해당 회사 코드로 INSERT (UPSERT)
|
||||
await query(
|
||||
`INSERT INTO screen_layouts_pop (screen_id, company_code, layout_data, created_at, updated_at, created_by, updated_by)
|
||||
VALUES ($1, $2, $3, NOW(), NOW(), 'SYSTEM', 'SYSTEM')
|
||||
ON CONFLICT (screen_id, company_code)
|
||||
DO UPDATE SET layout_data = $3, updated_at = NOW(), updated_by = 'SYSTEM'`,
|
||||
[screenId, companyCode, JSON.stringify(clonedData)],
|
||||
);
|
||||
|
||||
console.log(`POP 레이아웃 자동 복제 완료: screen_id=${screenId}, company=${companyCode}`);
|
||||
layout = { layout_data: clonedData };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!layout) {
|
||||
@@ -6133,11 +6080,10 @@ export class ScreenManagementService {
|
||||
[],
|
||||
);
|
||||
} else {
|
||||
// 일반 회사: 해당 회사 레이아웃 + 공통(*)/COMPANY_7 템플릿도 포함
|
||||
// (getLayoutPop에서 자동 복제하므로 템플릿이 있으면 해당 회사도 사용 가능)
|
||||
// 일반 회사: 해당 회사 레이아웃만 조회 (자동 복제/fallback 없음)
|
||||
result = await query<{ screen_id: number }>(
|
||||
`SELECT DISTINCT screen_id FROM screen_layouts_pop
|
||||
WHERE company_code IN ($1, '*', 'COMPANY_7')`,
|
||||
WHERE company_code = $1`,
|
||||
[companyCode],
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user