function openCustomerImages(customerUid) {
const modalEl = document.getElementById('customerImageModal');
const modal = new bootstrap.Modal(modalEl);
const body = document.getElementById('customerImageModalBody');
body.innerHTML = '
Loading images...
';
modal.show();
const params = new URLSearchParams({
customer_uid: customerUid,
i_type: 'install_order'
});
fetch('/lib/customer_image.php?' + params.toString())
.then(res => res.text())
.then(html => {
body.innerHTML = html;
// HTML 주입 후, 슬라이더 초기화 (스크립트 실행 기대 X)
initCustomerImageSlider(body);
})
.catch(err => {
console.error(err);
body.innerHTML = 'Failed to load images.
';
});
}
function initCustomerImageSlider(scopeEl) {
const slider = scopeEl.querySelector('#customerImageSlider');
if (!slider) return;
let images = [];
let meta = [];
try {
images = JSON.parse(slider.dataset.images || '[]');
meta = JSON.parse(slider.dataset.meta || '[]');
} catch (e) {
console.error('slider json parse error', e);
return;
}
if (!images.length) return;
let currentIndex = 0;
const imgEl = scopeEl.querySelector('#sliderImage');
const idxEl = scopeEl.querySelector('#sliderIndex');
const metaEl = scopeEl.querySelector('#sliderMeta');
const btnPrev = scopeEl.querySelector('#btnPrevImage');
const btnNext = scopeEl.querySelector('#btnNextImage');
function formatCreated(str) {
// 기대 포맷: 20260205121137
if (!str) return '';
if (/^\d{14}$/.test(str)) {
return str.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/, '$1-$2-$3 $4:$5:$6');
}
return str; // 이미 datetime 이면 그대로
}
function getTypeLabel(type) {
switch (type) {
case 'install':
return 'Install Image';
case 'install_order':
return 'Container Request Image';
default:
return type || '';
}
}
function update() {
imgEl.src = images[currentIndex];
idxEl.textContent = (currentIndex + 1);
const m = meta[currentIndex] || {};
metaEl.innerHTML =
'Type: ' + getTypeLabel(m.type || '') + '
' +
'Note: ' + ((m.note || '').replace(/\n/g, '
')) + '
' +
'Created: ' + formatCreated(m.created || '') + '
' +
'By: ' + (m.by || '');
}
// 이벤트 중복 방지: 버튼을 클론으로 교체해서 기존 리스너 제거
const prevClone = btnPrev.cloneNode(true);
const nextClone = btnNext.cloneNode(true);
btnPrev.parentNode.replaceChild(prevClone, btnPrev);
btnNext.parentNode.replaceChild(nextClone, btnNext);
prevClone.addEventListener('click', () => {
currentIndex = (currentIndex - 1 + images.length) % images.length;
update();
});
nextClone.addEventListener('click', () => {
currentIndex = (currentIndex + 1) % images.length;
update();
});
// 초기 렌더
update();
}