From 6f1efdb03cdf4826814e02c3374a0568b5dd0d75 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Thu, 5 Mar 2026 09:56:08 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A6=AC?= =?UTF-8?q?=EB=8B=A4=EC=9D=B4=EB=A0=89=ED=8A=B8=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BA=90=EC=8B=9C=20=EB=B2=84=EC=8A=A4=ED=8C=85=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - config.js loginPage를 /index.html에서 /login(SSO)으로 변경 - navigation.js, load-navbar.js에 redirect 파라미터 추가 - 8개 JS 파일의 하드코딩된 '/login' → window.getLoginUrl() 전환 - 로그아웃 시 clearSSOAuth() 호출 추가 (SSO 쿠키 삭제) - api-base.js v=2→v=3 (SW 캐시 해제 코드 통합) - TBM 모듈 버전 쿼리스트링 통일 (tbm.html, tbm-mobile.html) - dashboard.html SW 캐시 해제 인라인 코드 제거 (api-base.js에서 처리) Co-Authored-By: Claude Opus 4.6 --- system1-factory/web/js/admin-settings.js | 3 +- system1-factory/web/js/admin.js | 4 +-- system1-factory/web/js/api-base.js | 12 ++++++++ system1-factory/web/js/change-password.js | 5 ++-- system1-factory/web/js/config.js | 2 +- system1-factory/web/js/daily-work-report.js | 5 +++- system1-factory/web/js/load-navbar.js | 3 +- system1-factory/web/js/manage-user.js | 5 ++-- system1-factory/web/js/modern-dashboard.js | 3 +- system1-factory/web/js/navigation.js | 5 ++-- system1-factory/web/js/project-management.js | 6 ++-- system1-factory/web/js/tbm-create.js | 28 +++++++++++++++---- system1-factory/web/js/work-analysis.js | 6 ++-- system1-factory/web/js/work-management.js | 6 ++-- system1-factory/web/pages/admin/accounts.html | 2 +- .../web/pages/admin/attendance-report.html | 2 +- .../web/pages/admin/departments.html | 2 +- .../web/pages/admin/equipment-detail.html | 2 +- .../web/pages/admin/equipments.html | 2 +- .../web/pages/admin/issue-categories.html | 2 +- .../web/pages/admin/notifications.html | 2 +- system1-factory/web/pages/admin/projects.html | 2 +- .../web/pages/admin/repair-management.html | 2 +- system1-factory/web/pages/admin/tasks.html | 2 +- system1-factory/web/pages/admin/workers.html | 2 +- .../web/pages/admin/workplaces.html | 2 +- .../web/pages/attendance/annual-overview.html | 2 +- .../web/pages/attendance/checkin.html | 2 +- .../web/pages/attendance/daily.html | 2 +- .../web/pages/attendance/monthly.html | 2 +- .../pages/attendance/my-vacation-info.html | 2 +- .../pages/attendance/vacation-allocation.html | 2 +- .../pages/attendance/vacation-approval.html | 2 +- .../web/pages/attendance/vacation-input.html | 2 +- .../pages/attendance/vacation-management.html | 2 +- .../pages/attendance/vacation-request.html | 2 +- .../web/pages/attendance/work-status.html | 2 +- system1-factory/web/pages/dashboard.html | 11 ++------ .../web/pages/inspection/daily-patrol.html | 2 +- .../web/pages/inspection/zone-detail.html | 2 +- .../web/pages/safety/checklist-manage.html | 2 +- .../web/pages/safety/management.html | 2 +- system1-factory/web/pages/safety/report.html | 2 +- .../web/pages/safety/training-conduct.html | 2 +- .../web/pages/safety/visit-request.html | 2 +- system1-factory/web/pages/work/analysis.html | 2 +- .../web/pages/work/nonconformity.html | 2 +- .../web/pages/work/report-create-mobile.html | 2 +- .../web/pages/work/report-create.html | 9 ++---- .../web/pages/work/tbm-create.html | 18 ++++++------ .../web/pages/work/tbm-mobile.html | 10 +++---- system1-factory/web/pages/work/tbm.html | 10 +++---- 52 files changed, 118 insertions(+), 99 deletions(-) diff --git a/system1-factory/web/js/admin-settings.js b/system1-factory/web/js/admin-settings.js index d157bcb..8b8b820 100644 --- a/system1-factory/web/js/admin-settings.js +++ b/system1-factory/web/js/admin-settings.js @@ -533,7 +533,8 @@ async function toggleUserStatus(userId) { function handleLogout() { if (confirm('로그아웃하시겠습니까?')) { localStorage.clear(); - window.location.href = '/login'; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; } } diff --git a/system1-factory/web/js/admin.js b/system1-factory/web/js/admin.js index bcfe2ee..1a6a5c5 100644 --- a/system1-factory/web/js/admin.js +++ b/system1-factory/web/js/admin.js @@ -1,9 +1,9 @@ // ✅ /js/admin.js (수정됨 - 중복 로딩 제거) async function initDashboard() { // 로그인 토큰 확인 - const token = localStorage.getItem('sso_token'); + const token = localStorage.getItem('sso_token') || (window.getSSOToken ? window.getSSOToken() : null); if (!token) { - location.href = '/login'; + location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; return; } diff --git a/system1-factory/web/js/api-base.js b/system1-factory/web/js/api-base.js index f90b434..8c1299d 100644 --- a/system1-factory/web/js/api-base.js +++ b/system1-factory/web/js/api-base.js @@ -1,6 +1,18 @@ // /js/api-base.js // API 기본 설정 및 보안 유틸리티 (비모듈 - 빠른 로딩용) +// ==================== SW 캐시 강제 해제 (PWA 홈화면 추가 대응) ==================== +if ('serviceWorker' in navigator) { + navigator.serviceWorker.getRegistrations().then(function(regs) { + regs.forEach(function(reg) { reg.unregister(); }); + }); +} +if ('caches' in window) { + caches.keys().then(function(keys) { + keys.forEach(function(key) { caches.delete(key); }); + }); +} + (function() { 'use strict'; diff --git a/system1-factory/web/js/change-password.js b/system1-factory/web/js/change-password.js index da68820..8bb6c8e 100644 --- a/system1-factory/web/js/change-password.js +++ b/system1-factory/web/js/change-password.js @@ -184,9 +184,8 @@ form?.addEventListener('submit', async (e) => { if (countdown < 0) { clearInterval(countdownInterval); - localStorage.removeItem('sso_token'); - localStorage.removeItem('sso_user'); - window.location.href = '/login'; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; } }, 1000); diff --git a/system1-factory/web/js/config.js b/system1-factory/web/js/config.js index f2d5a54..4694d11 100644 --- a/system1-factory/web/js/config.js +++ b/system1-factory/web/js/config.js @@ -15,7 +15,7 @@ export const config = { // 페이지 경로 설정 paths: { // 로그인 페이지 경로 - loginPage: '/index.html', + loginPage: '/login', // 메인 대시보드 경로 (모든 사용자 공통) dashboard: '/pages/dashboard.html', // 하위 호환성을 위한 별칭들 diff --git a/system1-factory/web/js/daily-work-report.js b/system1-factory/web/js/daily-work-report.js index c83becf..8bd66ec 100644 --- a/system1-factory/web/js/daily-work-report.js +++ b/system1-factory/web/js/daily-work-report.js @@ -76,7 +76,10 @@ async function loadIncompleteTbms() { // 사용자 권한 확인 및 필터링 const user = getUser(); - if (user && user.role !== 'Admin' && user.access_level !== 'system') { + const userRole = (user && user.role || '').toLowerCase(); + const userAccess = (user && user.access_level || '').toLowerCase(); + const isAdmin = userRole === 'admin' || userAccess === 'admin' || userAccess === 'system'; + if (user && !isAdmin) { // 일반 사용자: 자신이 생성한 세션만 표시 const userId = user.user_id; data = data.filter(tbm => tbm.created_by === userId); diff --git a/system1-factory/web/js/load-navbar.js b/system1-factory/web/js/load-navbar.js index 3baa3d0..ec8ec1a 100644 --- a/system1-factory/web/js/load-navbar.js +++ b/system1-factory/web/js/load-navbar.js @@ -148,7 +148,8 @@ function setupNavbarEvents() { logoutButton.addEventListener('click', () => { if (confirm('로그아웃 하시겠습니까?')) { clearAuthData(); - window.location.href = config.paths.loginPage; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = config.paths.loginPage + '?redirect=' + encodeURIComponent('/pages/dashboard.html'); } }); } diff --git a/system1-factory/web/js/manage-user.js b/system1-factory/web/js/manage-user.js index f976cfd..253195e 100644 --- a/system1-factory/web/js/manage-user.js +++ b/system1-factory/web/js/manage-user.js @@ -72,9 +72,8 @@ myPasswordForm?.addEventListener('submit', async e => { // 3초 후 로그인 페이지로 이동 setTimeout(() => { alert('비밀번호가 변경되어 다시 로그인해주세요.'); - localStorage.removeItem('sso_token'); - localStorage.removeItem('sso_user'); - window.location.href = '/login'; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; }, 2000); } else { alert('❌ 비밀번호 변경 실패: ' + (result.error || '현재 비밀번호가 올바르지 않습니다.')); diff --git a/system1-factory/web/js/modern-dashboard.js b/system1-factory/web/js/modern-dashboard.js index d3acd5b..ea5be23 100644 --- a/system1-factory/web/js/modern-dashboard.js +++ b/system1-factory/web/js/modern-dashboard.js @@ -152,7 +152,8 @@ function setupEventListeners() { elements.logoutBtn.addEventListener('click', () => { if (confirm('로그아웃하시겠습니까?')) { localStorage.clear(); - window.location.href = '/login'; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; } }); } diff --git a/system1-factory/web/js/navigation.js b/system1-factory/web/js/navigation.js index 18d0012..b854d9b 100644 --- a/system1-factory/web/js/navigation.js +++ b/system1-factory/web/js/navigation.js @@ -13,8 +13,9 @@ function redirect(url) { * 로그인 페이지로 리디렉션합니다. */ export function redirectToLogin() { - console.log(`🔄 로그인 페이지로 이동합니다: ${config.paths.loginPage}`); - redirect(config.paths.loginPage); + const loginUrl = config.paths.loginPage + '?redirect=' + encodeURIComponent(window.location.href); + console.log(`🔄 로그인 페이지로 이동합니다: ${loginUrl}`); + redirect(loginUrl); } /** diff --git a/system1-factory/web/js/project-management.js b/system1-factory/web/js/project-management.js index 42ac7d6..86822ce 100644 --- a/system1-factory/web/js/project-management.js +++ b/system1-factory/web/js/project-management.js @@ -77,10 +77,8 @@ function setupLogoutButton() { if (logoutBtn) { logoutBtn.addEventListener('click', function() { if (confirm('로그아웃 하시겠습니까?')) { - localStorage.removeItem('sso_token'); - localStorage.removeItem('sso_user'); - localStorage.removeItem('userInfo'); - window.location.href = '/login'; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; } }); } diff --git a/system1-factory/web/js/tbm-create.js b/system1-factory/web/js/tbm-create.js index a75e2ad..ba51d7e 100644 --- a/system1-factory/web/js/tbm-create.js +++ b/system1-factory/web/js/tbm-create.js @@ -73,6 +73,7 @@ // ==================== 네비게이션 ==================== window.nextStep = function() { + console.log('[TBM Create] nextStep called, current step:', W.step, 'workTypeId:', W.workTypeId); if (!validateStep(W.step)) return; if (W.step < W.totalSteps) { W.step++; @@ -84,6 +85,7 @@ }; window.prevStep = function() { + console.log('[TBM Create] prevStep called, current step:', W.step); if (W.step > 1) { W.step--; renderStep(W.step); @@ -117,30 +119,45 @@ }); } + // 네비게이션 버튼: 단일 핸들러 (DOM 교체 없이 상태 기반 분기) + var _navAction = { prev: null, next: null }; + function updateNav() { var prevBtn = document.getElementById('prevBtn'); var nextBtn = document.getElementById('nextBtn'); if (W.step === 1) { prevBtn.style.visibility = 'hidden'; - prevBtn.onclick = null; + _navAction.prev = null; } else { prevBtn.style.visibility = 'visible'; - prevBtn.onclick = window.prevStep; + _navAction.prev = window.prevStep; } if (W.step === W.totalSteps) { nextBtn.className = 'nav-btn nav-btn-save'; - nextBtn.innerHTML = '저장'; - nextBtn.onclick = saveWizard; + nextBtn.textContent = '저장'; + _navAction.next = saveWizard; } else { nextBtn.className = 'nav-btn nav-btn-next'; nextBtn.innerHTML = '다음 →'; - nextBtn.onclick = window.nextStep; + _navAction.next = window.nextStep; } nextBtn.disabled = false; } + // 한번만 등록하는 이벤트 리스너 + document.addEventListener('DOMContentLoaded', function() { + document.getElementById('prevBtn').addEventListener('click', function(e) { + e.preventDefault(); + if (_navAction.prev) _navAction.prev(); + }); + document.getElementById('nextBtn').addEventListener('click', function(e) { + e.preventDefault(); + if (_navAction.next) _navAction.next(); + }); + }); + // ==================== 유효성 검사 ==================== function validateStep(step) { @@ -365,6 +382,7 @@ }; window.selectWorkType = function(id, name) { + console.log('[TBM Create] selectWorkType:', id, name); W.workTypeId = id; W.workTypeName = name; // Update pill buttons diff --git a/system1-factory/web/js/work-analysis.js b/system1-factory/web/js/work-analysis.js index f5951a1..bc3b9fa 100644 --- a/system1-factory/web/js/work-analysis.js +++ b/system1-factory/web/js/work-analysis.js @@ -82,10 +82,8 @@ function setupLogoutButton() { if (logoutBtn) { logoutBtn.addEventListener('click', function() { if (confirm('로그아웃 하시겠습니까?')) { - localStorage.removeItem('sso_token'); - localStorage.removeItem('sso_user'); - localStorage.removeItem('userInfo'); - window.location.href = '/login'; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; } }); } diff --git a/system1-factory/web/js/work-management.js b/system1-factory/web/js/work-management.js index 1bc6adf..136a557 100644 --- a/system1-factory/web/js/work-management.js +++ b/system1-factory/web/js/work-management.js @@ -76,10 +76,8 @@ function setupLogoutButton() { if (logoutBtn) { logoutBtn.addEventListener('click', function() { if (confirm('로그아웃 하시겠습니까?')) { - localStorage.removeItem('sso_token'); - localStorage.removeItem('sso_user'); - localStorage.removeItem('userInfo'); - window.location.href = '/login'; + if (window.clearSSOAuth) window.clearSSOAuth(); + window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login'; } }); } diff --git a/system1-factory/web/pages/admin/accounts.html b/system1-factory/web/pages/admin/accounts.html index 8cdc639..c0f0bcd 100644 --- a/system1-factory/web/pages/admin/accounts.html +++ b/system1-factory/web/pages/admin/accounts.html @@ -278,7 +278,7 @@
- + diff --git a/system1-factory/web/pages/admin/attendance-report.html b/system1-factory/web/pages/admin/attendance-report.html index 95f399e..da24f50 100644 --- a/system1-factory/web/pages/admin/attendance-report.html +++ b/system1-factory/web/pages/admin/attendance-report.html @@ -7,7 +7,7 @@ - +