refactor: 프론트엔드 SSO 인증 통합 및 API 경로 정리

- Gateway 로그인/포탈 페이지 SSO 연동
- System1 web/fastapi-bridge API base URL 동적 설정
- SSO 토큰 기반 인증 흐름 통일
- deprecated JS 파일 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-03-06 23:18:09 +09:00
parent ec755ed52f
commit 61c810bd47
63 changed files with 255 additions and 1357 deletions

View File

@@ -8,7 +8,6 @@ let currentStatusFilter = 'all'; // 'all', 'active', 'inactive'
// 페이지 초기화
document.addEventListener('DOMContentLoaded', function() {
console.log('📁 프로젝트 관리 페이지 초기화 시작');
initializePage();
loadProjects();
@@ -103,11 +102,9 @@ function setupSearchInput() {
// 프로젝트 목록 로드
async function loadProjects() {
try {
console.log('📊 프로젝트 목록 로딩 시작');
const response = await apiCall('/projects', 'GET');
console.log('📊 API 응답 구조:', response);
// API 응답이 { success: true, data: [...] } 형태인 경우 처리
let projectData = [];
@@ -122,7 +119,6 @@ async function loadProjects() {
allProjects = projectData;
console.log(`✅ 프로젝트 ${allProjects.length}개 로드 완료`);
// 초기 필터 적용
applyAllFilters();
@@ -156,10 +152,10 @@ function renderProjects() {
const projectsHtml = filteredProjects.map(project => {
// 프로젝트 상태 아이콘 및 텍스트
const statusMap = {
'planning': { icon: '📋', text: '계획', color: '#6b7280' },
'active': { icon: '🚀', text: '진행중', color: '#10b981' },
'completed': { icon: '', text: '완료', color: '#3b82f6' },
'cancelled': { icon: '', text: '취소', color: '#ef4444' }
'planning': { icon: '', text: '계획', color: '#6b7280' },
'active': { icon: '', text: '진행중', color: '#10b981' },
'completed': { icon: '', text: '완료', color: '#3b82f6' },
'cancelled': { icon: '', text: '취소', color: '#ef4444' }
};
const validStatuses = ['planning', 'active', 'completed', 'cancelled'];
@@ -175,16 +171,9 @@ function renderProjects() {
const safePm = escapeHtml(project.pm || '-');
const safeSite = escapeHtml(project.site || '-');
console.log('🎨 카드 렌더링:', {
project_id: project.project_id,
project_name: project.project_name,
is_active_raw: project.is_active,
isInactive: isInactive
});
return `
<div class="project-card ${isInactive ? 'inactive' : ''}" onclick="editProject(${safeProjectId})">
${isInactive ? '<div class="inactive-overlay"><span class="inactive-badge">🚫 비활성화됨</span></div>' : ''}
${isInactive ? '<div class="inactive-overlay"><span class="inactive-badge"> 비활성화됨</span></div>' : ''}
<div class="project-header">
<div class="project-info">
<div class="project-job-no">${safeJobNo}</div>
@@ -213,15 +202,15 @@ function renderProjects() {
<span class="meta-label">현장</span>
<span class="meta-value">${safeSite}</span>
</div>
${isInactive ? '<div class="inactive-notice">⚠️ 작업보고서에서 숨김</div>' : ''}
${isInactive ? '<div class="inactive-notice"> 작업보고서에서 숨김</div>' : ''}
</div>
</div>
<div class="project-actions">
<button class="btn-edit" onclick="event.stopPropagation(); editProject(${safeProjectId})" title="수정">
✏️ 수정
수정
</button>
<button class="btn-delete" onclick="event.stopPropagation(); confirmDeleteProject(${safeProjectId})" title="삭제">
🗑️ 삭제
삭제
</button>
</div>
</div>
@@ -252,12 +241,6 @@ function updateProjectStats() {
if (totalProjectsElement) {
totalProjectsElement.textContent = filteredProjects.length;
}
console.log('📊 프로젝트 통계:', {
전체: filteredProjects.length,
활성: activeProjects.length,
비활성: inactiveProjects.length
});
}
// 날짜 포맷팅
@@ -282,7 +265,6 @@ function filterByStatus(status) {
// 필터링 적용
applyAllFilters();
console.log(`🔍 상태 필터 적용: ${status}`);
}
// 통계 카드 활성화 상태 업데이트
@@ -371,7 +353,7 @@ async function refreshProjectList() {
const refreshBtn = document.querySelector('.btn-secondary');
if (refreshBtn) {
const originalText = refreshBtn.innerHTML;
refreshBtn.innerHTML = '<span class="btn-icon"></span>새로고침 중...';
refreshBtn.innerHTML = '<span class="btn-icon"></span>새로고침 중...';
refreshBtn.disabled = true;
await loadProjects();
@@ -415,12 +397,6 @@ function openProjectModal(project = null) {
const isActiveValue = project.is_active === 1 || project.is_active === true || project.is_active === 'true';
document.getElementById('isActive').checked = isActiveValue;
console.log('🔧 프로젝트 로드:', {
project_id: project.project_id,
project_name: project.project_name,
is_active_raw: project.is_active,
is_active_processed: isActiveValue
});
} else {
// 신규 등록 모드
modalTitle.textContent = '새 프로젝트 등록';
@@ -480,7 +456,6 @@ async function saveProject() {
is_active: document.getElementById('isActive').checked ? 1 : 0
};
console.log('💾 저장할 프로젝트 데이터:', projectData);
// 필수 필드 검증
if (!projectData.job_no || !projectData.project_name) {
@@ -523,7 +498,7 @@ function confirmDeleteProject(projectId) {
return;
}
if (confirm(`"${project.project_name}" 프로젝트를 정말 삭제하시겠습니까?\n\n⚠️ 삭제된 프로젝트는 복구할 수 없습니다.`)) {
if (confirm(`"${project.project_name}" 프로젝트를 정말 삭제하시겠습니까?\n\n 삭제된 프로젝트는 복구할 수 없습니다.`)) {
deleteProjectById(projectId);
}
}