fix: 로그인 리다이렉트 통합 및 캐시 버스팅 정리
- 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 <noreply@anthropic.com>
This commit is contained in:
@@ -533,7 +533,8 @@ async function toggleUserStatus(userId) {
|
|||||||
function handleLogout() {
|
function handleLogout() {
|
||||||
if (confirm('로그아웃하시겠습니까?')) {
|
if (confirm('로그아웃하시겠습니까?')) {
|
||||||
localStorage.clear();
|
localStorage.clear();
|
||||||
window.location.href = '/login';
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
|
window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
// ✅ /js/admin.js (수정됨 - 중복 로딩 제거)
|
// ✅ /js/admin.js (수정됨 - 중복 로딩 제거)
|
||||||
async function initDashboard() {
|
async function initDashboard() {
|
||||||
// 로그인 토큰 확인
|
// 로그인 토큰 확인
|
||||||
const token = localStorage.getItem('sso_token');
|
const token = localStorage.getItem('sso_token') || (window.getSSOToken ? window.getSSOToken() : null);
|
||||||
if (!token) {
|
if (!token) {
|
||||||
location.href = '/login';
|
location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,18 @@
|
|||||||
// /js/api-base.js
|
// /js/api-base.js
|
||||||
// API 기본 설정 및 보안 유틸리티 (비모듈 - 빠른 로딩용)
|
// 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() {
|
(function() {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|||||||
@@ -184,9 +184,8 @@ form?.addEventListener('submit', async (e) => {
|
|||||||
|
|
||||||
if (countdown < 0) {
|
if (countdown < 0) {
|
||||||
clearInterval(countdownInterval);
|
clearInterval(countdownInterval);
|
||||||
localStorage.removeItem('sso_token');
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
localStorage.removeItem('sso_user');
|
window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
window.location.href = '/login';
|
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ export const config = {
|
|||||||
// 페이지 경로 설정
|
// 페이지 경로 설정
|
||||||
paths: {
|
paths: {
|
||||||
// 로그인 페이지 경로
|
// 로그인 페이지 경로
|
||||||
loginPage: '/index.html',
|
loginPage: '/login',
|
||||||
// 메인 대시보드 경로 (모든 사용자 공통)
|
// 메인 대시보드 경로 (모든 사용자 공통)
|
||||||
dashboard: '/pages/dashboard.html',
|
dashboard: '/pages/dashboard.html',
|
||||||
// 하위 호환성을 위한 별칭들
|
// 하위 호환성을 위한 별칭들
|
||||||
|
|||||||
@@ -76,7 +76,10 @@ async function loadIncompleteTbms() {
|
|||||||
|
|
||||||
// 사용자 권한 확인 및 필터링
|
// 사용자 권한 확인 및 필터링
|
||||||
const user = getUser();
|
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;
|
const userId = user.user_id;
|
||||||
data = data.filter(tbm => tbm.created_by === userId);
|
data = data.filter(tbm => tbm.created_by === userId);
|
||||||
|
|||||||
@@ -148,7 +148,8 @@ function setupNavbarEvents() {
|
|||||||
logoutButton.addEventListener('click', () => {
|
logoutButton.addEventListener('click', () => {
|
||||||
if (confirm('로그아웃 하시겠습니까?')) {
|
if (confirm('로그아웃 하시겠습니까?')) {
|
||||||
clearAuthData();
|
clearAuthData();
|
||||||
window.location.href = config.paths.loginPage;
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
|
window.location.href = config.paths.loginPage + '?redirect=' + encodeURIComponent('/pages/dashboard.html');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,9 +72,8 @@ myPasswordForm?.addEventListener('submit', async e => {
|
|||||||
// 3초 후 로그인 페이지로 이동
|
// 3초 후 로그인 페이지로 이동
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
alert('비밀번호가 변경되어 다시 로그인해주세요.');
|
alert('비밀번호가 변경되어 다시 로그인해주세요.');
|
||||||
localStorage.removeItem('sso_token');
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
localStorage.removeItem('sso_user');
|
window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
window.location.href = '/login';
|
|
||||||
}, 2000);
|
}, 2000);
|
||||||
} else {
|
} else {
|
||||||
alert('❌ 비밀번호 변경 실패: ' + (result.error || '현재 비밀번호가 올바르지 않습니다.'));
|
alert('❌ 비밀번호 변경 실패: ' + (result.error || '현재 비밀번호가 올바르지 않습니다.'));
|
||||||
|
|||||||
@@ -152,7 +152,8 @@ function setupEventListeners() {
|
|||||||
elements.logoutBtn.addEventListener('click', () => {
|
elements.logoutBtn.addEventListener('click', () => {
|
||||||
if (confirm('로그아웃하시겠습니까?')) {
|
if (confirm('로그아웃하시겠습니까?')) {
|
||||||
localStorage.clear();
|
localStorage.clear();
|
||||||
window.location.href = '/login';
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
|
window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,9 @@ function redirect(url) {
|
|||||||
* 로그인 페이지로 리디렉션합니다.
|
* 로그인 페이지로 리디렉션합니다.
|
||||||
*/
|
*/
|
||||||
export function redirectToLogin() {
|
export function redirectToLogin() {
|
||||||
console.log(`🔄 로그인 페이지로 이동합니다: ${config.paths.loginPage}`);
|
const loginUrl = config.paths.loginPage + '?redirect=' + encodeURIComponent(window.location.href);
|
||||||
redirect(config.paths.loginPage);
|
console.log(`🔄 로그인 페이지로 이동합니다: ${loginUrl}`);
|
||||||
|
redirect(loginUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -77,10 +77,8 @@ function setupLogoutButton() {
|
|||||||
if (logoutBtn) {
|
if (logoutBtn) {
|
||||||
logoutBtn.addEventListener('click', function() {
|
logoutBtn.addEventListener('click', function() {
|
||||||
if (confirm('로그아웃 하시겠습니까?')) {
|
if (confirm('로그아웃 하시겠습니까?')) {
|
||||||
localStorage.removeItem('sso_token');
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
localStorage.removeItem('sso_user');
|
window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
localStorage.removeItem('userInfo');
|
|
||||||
window.location.href = '/login';
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@
|
|||||||
// ==================== 네비게이션 ====================
|
// ==================== 네비게이션 ====================
|
||||||
|
|
||||||
window.nextStep = function() {
|
window.nextStep = function() {
|
||||||
|
console.log('[TBM Create] nextStep called, current step:', W.step, 'workTypeId:', W.workTypeId);
|
||||||
if (!validateStep(W.step)) return;
|
if (!validateStep(W.step)) return;
|
||||||
if (W.step < W.totalSteps) {
|
if (W.step < W.totalSteps) {
|
||||||
W.step++;
|
W.step++;
|
||||||
@@ -84,6 +85,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
window.prevStep = function() {
|
window.prevStep = function() {
|
||||||
|
console.log('[TBM Create] prevStep called, current step:', W.step);
|
||||||
if (W.step > 1) {
|
if (W.step > 1) {
|
||||||
W.step--;
|
W.step--;
|
||||||
renderStep(W.step);
|
renderStep(W.step);
|
||||||
@@ -117,30 +119,45 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 네비게이션 버튼: 단일 핸들러 (DOM 교체 없이 상태 기반 분기)
|
||||||
|
var _navAction = { prev: null, next: null };
|
||||||
|
|
||||||
function updateNav() {
|
function updateNav() {
|
||||||
var prevBtn = document.getElementById('prevBtn');
|
var prevBtn = document.getElementById('prevBtn');
|
||||||
var nextBtn = document.getElementById('nextBtn');
|
var nextBtn = document.getElementById('nextBtn');
|
||||||
|
|
||||||
if (W.step === 1) {
|
if (W.step === 1) {
|
||||||
prevBtn.style.visibility = 'hidden';
|
prevBtn.style.visibility = 'hidden';
|
||||||
prevBtn.onclick = null;
|
_navAction.prev = null;
|
||||||
} else {
|
} else {
|
||||||
prevBtn.style.visibility = 'visible';
|
prevBtn.style.visibility = 'visible';
|
||||||
prevBtn.onclick = window.prevStep;
|
_navAction.prev = window.prevStep;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (W.step === W.totalSteps) {
|
if (W.step === W.totalSteps) {
|
||||||
nextBtn.className = 'nav-btn nav-btn-save';
|
nextBtn.className = 'nav-btn nav-btn-save';
|
||||||
nextBtn.innerHTML = '저장';
|
nextBtn.textContent = '저장';
|
||||||
nextBtn.onclick = saveWizard;
|
_navAction.next = saveWizard;
|
||||||
} else {
|
} else {
|
||||||
nextBtn.className = 'nav-btn nav-btn-next';
|
nextBtn.className = 'nav-btn nav-btn-next';
|
||||||
nextBtn.innerHTML = '다음 →';
|
nextBtn.innerHTML = '다음 →';
|
||||||
nextBtn.onclick = window.nextStep;
|
_navAction.next = window.nextStep;
|
||||||
}
|
}
|
||||||
nextBtn.disabled = false;
|
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) {
|
function validateStep(step) {
|
||||||
@@ -365,6 +382,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
window.selectWorkType = function(id, name) {
|
window.selectWorkType = function(id, name) {
|
||||||
|
console.log('[TBM Create] selectWorkType:', id, name);
|
||||||
W.workTypeId = id;
|
W.workTypeId = id;
|
||||||
W.workTypeName = name;
|
W.workTypeName = name;
|
||||||
// Update pill buttons
|
// Update pill buttons
|
||||||
|
|||||||
@@ -82,10 +82,8 @@ function setupLogoutButton() {
|
|||||||
if (logoutBtn) {
|
if (logoutBtn) {
|
||||||
logoutBtn.addEventListener('click', function() {
|
logoutBtn.addEventListener('click', function() {
|
||||||
if (confirm('로그아웃 하시겠습니까?')) {
|
if (confirm('로그아웃 하시겠습니까?')) {
|
||||||
localStorage.removeItem('sso_token');
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
localStorage.removeItem('sso_user');
|
window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
localStorage.removeItem('userInfo');
|
|
||||||
window.location.href = '/login';
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,10 +76,8 @@ function setupLogoutButton() {
|
|||||||
if (logoutBtn) {
|
if (logoutBtn) {
|
||||||
logoutBtn.addEventListener('click', function() {
|
logoutBtn.addEventListener('click', function() {
|
||||||
if (confirm('로그아웃 하시겠습니까?')) {
|
if (confirm('로그아웃 하시겠습니까?')) {
|
||||||
localStorage.removeItem('sso_token');
|
if (window.clearSSOAuth) window.clearSSOAuth();
|
||||||
localStorage.removeItem('sso_user');
|
window.location.href = window.getLoginUrl ? window.getLoginUrl() : '/login';
|
||||||
localStorage.removeItem('userInfo');
|
|
||||||
window.location.href = '/login';
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -278,7 +278,7 @@
|
|||||||
<div class="toast-container" id="toastContainer"></div>
|
<div class="toast-container" id="toastContainer"></div>
|
||||||
|
|
||||||
<!-- JavaScript -->
|
<!-- JavaScript -->
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<script src="/js/admin-settings.js?v=9"></script>
|
<script src="/js/admin-settings.js?v=9"></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="stylesheet" href="/css/equipment-detail.css?v=1">
|
<link rel="stylesheet" href="/css/equipment-detail.css?v=1">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="stylesheet" href="/css/equipment-management.css?v=1">
|
<link rel="stylesheet" href="/css/equipment-management.css?v=1">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -366,7 +366,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script>
|
<script>
|
||||||
let allProjects = [];
|
let allProjects = [];
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<style>
|
<style>
|
||||||
.repair-page {
|
.repair-page {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<style>
|
<style>
|
||||||
.page-wrapper { padding: 1rem 1.5rem; max-width: 1400px; }
|
.page-wrapper { padding: 1rem 1.5rem; max-width: 1400px; }
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<!-- 최적화된 로딩: API 설정 → 앱 초기화 (병렬 컴포넌트 로딩) -->
|
<!-- 최적화된 로딩: API 설정 → 앱 초기화 (병렬 컴포넌트 로딩) -->
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<!-- instant.page: 링크 호버 시 페이지 프리로딩 -->
|
<!-- instant.page: 링크 호버 시 페이지 프리로딩 -->
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="stylesheet" href="/css/workplace-management.css?v=7">
|
<link rel="stylesheet" href="/css/workplace-management.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<style>
|
<style>
|
||||||
.page-wrapper {
|
.page-wrapper {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<style>
|
<style>
|
||||||
.page-wrapper {
|
.page-wrapper {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
|
|
||||||
<!-- 스크립트 -->
|
<!-- 스크립트 -->
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<script type="module" src="/js/vacation-allocation.js" defer></script>
|
<script type="module" src="/js/vacation-allocation.js" defer></script>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=7">
|
||||||
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<style>
|
<style>
|
||||||
.page-wrapper {
|
.page-wrapper {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<!-- 리소스 프리로딩 -->
|
<!-- 리소스 프리로딩 -->
|
||||||
<!-- preconnect는 Gateway 프록시 사용 시 불필요 -->
|
<!-- preconnect는 Gateway 프록시 사용 시 불필요 -->
|
||||||
<link rel="preload" href="/css/design-system.css" as="style">
|
<link rel="preload" href="/css/design-system.css" as="style">
|
||||||
<link rel="preload" href="/js/api-base.js?v=2" as="script">
|
<link rel="preload" href="/js/api-base.js?v=3" as="script">
|
||||||
<link rel="preload" href="/js/app-init.js?v=9" as="script">
|
<link rel="preload" href="/js/app-init.js?v=9" as="script">
|
||||||
|
|
||||||
<!-- 모던 디자인 시스템 적용 -->
|
<!-- 모던 디자인 시스템 적용 -->
|
||||||
@@ -18,13 +18,8 @@
|
|||||||
<link rel="stylesheet" href="/css/mobile.css?v=4">
|
<link rel="stylesheet" href="/css/mobile.css?v=4">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
|
|
||||||
<!-- SW 캐시 강제 해제 -->
|
<!-- api-base.js에서 SW 캐시 강제 해제 처리 -->
|
||||||
<script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
if('serviceWorker' in navigator){navigator.serviceWorker.getRegistrations().then(function(r){r.forEach(function(reg){reg.unregister()});})}
|
|
||||||
if('caches' in window){caches.keys().then(function(k){k.forEach(function(key){caches.delete(key)})})}
|
|
||||||
</script>
|
|
||||||
<!-- 최적화된 로딩: API 설정 → 앱 초기화 (병렬 컴포넌트 로딩) -->
|
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script type="module" src="/js/modern-dashboard.js?v=10" defer></script>
|
<script type="module" src="/js/modern-dashboard.js?v=10" defer></script>
|
||||||
<script type="module" src="/js/group-leader-dashboard.js?v=1" defer></script>
|
<script type="module" src="/js/group-leader-dashboard.js?v=1" defer></script>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="stylesheet" href="/css/daily-patrol.css?v=4">
|
<link rel="stylesheet" href="/css/daily-patrol.css?v=4">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
<link rel="stylesheet" href="/css/admin-pages.css?v=8">
|
||||||
<link rel="stylesheet" href="/css/zone-detail.css?v=3">
|
<link rel="stylesheet" href="/css/zone-detail.css?v=3">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -627,7 +627,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<script type="module" src="/js/safety-checklist-manage.js"></script>
|
<script type="module" src="/js/safety-checklist-manage.js"></script>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/common.css?v=2">
|
<link rel="stylesheet" href="/css/common.css?v=2">
|
||||||
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/common.css?v=2">
|
<link rel="stylesheet" href="/css/common.css?v=2">
|
||||||
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/common.css?v=2">
|
<link rel="stylesheet" href="/css/common.css?v=2">
|
||||||
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/common.css?v=2">
|
<link rel="stylesheet" href="/css/common.css?v=2">
|
||||||
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<link rel="stylesheet" href="/css/design-system.css">
|
<link rel="stylesheet" href="/css/design-system.css">
|
||||||
<link rel="stylesheet" href="/css/work-analysis.css?v=41">
|
<link rel="stylesheet" href="/css/work-analysis.css?v=41">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.js"></script>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/common.css?v=2">
|
<link rel="stylesheet" href="/css/common.css?v=2">
|
||||||
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
<link rel="stylesheet" href="/css/project-management.css?v=3">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
<style>
|
<style>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<link rel="stylesheet" href="/css/daily-work-report-mobile.css?v=1">
|
<link rel="stylesheet" href="/css/daily-work-report-mobile.css?v=1">
|
||||||
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<style>
|
<style>
|
||||||
/* 데스크탑이면 리다이렉트 */
|
/* 데스크탑이면 리다이렉트 */
|
||||||
|
|||||||
@@ -8,13 +8,8 @@
|
|||||||
<link rel="stylesheet" href="/css/daily-work-report.css?v=13">
|
<link rel="stylesheet" href="/css/daily-work-report.css?v=13">
|
||||||
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<!-- SW 캐시 강제 해제 (Chrome 대응) -->
|
<!-- api-base.js에서 SW 캐시 강제 해제 처리 -->
|
||||||
<script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
if('serviceWorker' in navigator){navigator.serviceWorker.getRegistrations().then(function(r){r.forEach(function(reg){reg.unregister()});})}
|
|
||||||
if('caches' in window){caches.keys().then(function(k){k.forEach(function(key){caches.delete(key)})})}
|
|
||||||
</script>
|
|
||||||
<!-- 최적화된 로딩 -->
|
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
<title>TBM 시작 | (주)테크니컬코리아</title>
|
<title>TBM 시작 | (주)테크니컬코리아</title>
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<style>
|
<style>
|
||||||
* { box-sizing: border-box; }
|
* { box-sizing: border-box; }
|
||||||
@@ -804,8 +804,8 @@
|
|||||||
|
|
||||||
<!-- Fixed Bottom Nav -->
|
<!-- Fixed Bottom Nav -->
|
||||||
<div class="wizard-nav" id="wizardNav">
|
<div class="wizard-nav" id="wizardNav">
|
||||||
<button type="button" class="nav-btn nav-btn-prev" id="prevBtn" onclick="prevStep()" style="visibility:hidden;">← 이전</button>
|
<button type="button" class="nav-btn nav-btn-prev" id="prevBtn" style="visibility:hidden;">← 이전</button>
|
||||||
<button type="button" class="nav-btn nav-btn-next" id="nextBtn" onclick="nextStep()">다음 →</button>
|
<button type="button" class="nav-btn nav-btn-next" id="nextBtn">다음 →</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Landscape Map Overlay removed - workplace selection moved to detail edit stage -->
|
<!-- Landscape Map Overlay removed - workplace selection moved to detail edit stage -->
|
||||||
@@ -821,12 +821,12 @@
|
|||||||
|
|
||||||
<!-- Scripts -->
|
<!-- Scripts -->
|
||||||
<!-- 공통 모듈 -->
|
<!-- 공통 모듈 -->
|
||||||
<script src="/js/common/utils.js?v=1"></script>
|
<script src="/js/common/utils.js?v=2"></script>
|
||||||
<script src="/js/common/base-state.js?v=1"></script>
|
<script src="/js/common/base-state.js?v=2"></script>
|
||||||
|
|
||||||
<script src="/js/tbm/state.js?v=2"></script>
|
<script src="/js/tbm/state.js?v=3"></script>
|
||||||
<script src="/js/tbm/utils.js?v=2"></script>
|
<script src="/js/tbm/utils.js?v=3"></script>
|
||||||
<script src="/js/tbm/api.js?v=3"></script>
|
<script src="/js/tbm/api.js?v=4"></script>
|
||||||
<script src="/js/tbm-create.js?v=13"></script>
|
<script src="/js/tbm-create.js?v=14"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
|
||||||
<title>TBM | (주)테크니컬코리아</title>
|
<title>TBM | (주)테크니컬코리아</title>
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<link rel="stylesheet" href="/css/tbm-mobile.css?v=1">
|
<link rel="stylesheet" href="/css/tbm-mobile.css?v=1">
|
||||||
|
|
||||||
@@ -271,11 +271,11 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 공통 모듈 -->
|
<!-- 공통 모듈 -->
|
||||||
<script src="/js/common/utils.js?v=1"></script>
|
<script src="/js/common/utils.js?v=2"></script>
|
||||||
<script src="/js/common/base-state.js?v=1"></script>
|
<script src="/js/common/base-state.js?v=2"></script>
|
||||||
|
|
||||||
<script src="/js/tbm/state.js?v=2"></script>
|
<script src="/js/tbm/state.js?v=3"></script>
|
||||||
<script src="/js/tbm/utils.js?v=2"></script>
|
<script src="/js/tbm/utils.js?v=3"></script>
|
||||||
<script src="/js/tbm/api.js?v=4"></script>
|
<script src="/js/tbm/api.js?v=4"></script>
|
||||||
<script src="/js/tbm-mobile.js?v=3"></script>
|
<script src="/js/tbm-mobile.js?v=3"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
<link rel="stylesheet" href="/css/mobile.css?v=1">
|
||||||
<link rel="icon" type="image/png" href="/img/favicon.png">
|
<link rel="icon" type="image/png" href="/img/favicon.png">
|
||||||
<!-- 최적화된 로딩: API 설정 → 앱 초기화 (병렬 컴포넌트 로딩) -->
|
<!-- 최적화된 로딩: API 설정 → 앱 초기화 (병렬 컴포넌트 로딩) -->
|
||||||
<script src="/js/api-base.js?v=2"></script>
|
<script src="/js/api-base.js?v=3"></script>
|
||||||
<script src="/js/app-init.js?v=9" defer></script>
|
<script src="/js/app-init.js?v=9" defer></script>
|
||||||
<!-- instant.page: 링크 호버 시 페이지 프리로딩 -->
|
<!-- instant.page: 링크 호버 시 페이지 프리로딩 -->
|
||||||
<script src="https://instant.page/5.2.0" type="module"></script>
|
<script src="https://instant.page/5.2.0" type="module"></script>
|
||||||
@@ -731,12 +731,12 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 공통 모듈 -->
|
<!-- 공통 모듈 -->
|
||||||
<script src="/js/common/utils.js?v=1"></script>
|
<script src="/js/common/utils.js?v=2"></script>
|
||||||
<script src="/js/common/base-state.js?v=1"></script>
|
<script src="/js/common/base-state.js?v=2"></script>
|
||||||
|
|
||||||
<!-- TBM 모듈 (리팩토링된 구조) -->
|
<!-- TBM 모듈 (리팩토링된 구조) -->
|
||||||
<script src="/js/tbm/state.js?v=2"></script>
|
<script src="/js/tbm/state.js?v=3"></script>
|
||||||
<script src="/js/tbm/utils.js?v=2"></script>
|
<script src="/js/tbm/utils.js?v=3"></script>
|
||||||
<script src="/js/tbm/api.js?v=4"></script>
|
<script src="/js/tbm/api.js?v=4"></script>
|
||||||
|
|
||||||
<!-- 기존 UI 로직 (점진적 마이그레이션) -->
|
<!-- 기존 UI 로직 (점진적 마이그레이션) -->
|
||||||
|
|||||||
Reference in New Issue
Block a user