+
+
0/2000
@@ -34,7 +36,7 @@ $apiPath = (string) parse_url(base_url('feedback'), PHP_URL_PATH);
+
@@ -53,8 +55,12 @@ $apiPath = (string) parse_url(base_url('feedback'), PHP_URL_PATH);
var shotChk = document.getElementById('fbShot');
var fileInput = document.getElementById('fbFiles');
var preview = document.getElementById('fbPreview');
+ var counter = document.getElementById('fbCount');
var attachments = []; // 선택된 이미지 File 목록(최대 5)
+ function updateCount() { if (counter) counter.textContent = (content.value || '').length + '/2000'; }
+ content.addEventListener('input', updateCount);
+
function renderPreview() {
preview.innerHTML = '';
attachments.forEach(function (file, i) {
@@ -80,12 +86,57 @@ $apiPath = (string) parse_url(base_url('feedback'), PHP_URL_PATH);
renderPreview();
});
- function open() { modal.style.display = 'block'; msg.textContent = ''; content.focus(); }
+ function open() {
+ modal.style.display = 'block'; msg.textContent = '';
+ var panel = document.getElementById('fbPanel');
+ // 처음 열 때만 우하단 근처를 left/top 기준으로 배치(드래그·리사이즈 동작 일관)
+ if (!panel.dataset.positioned) {
+ var w = panel.offsetWidth || 380, h = panel.offsetHeight || 320;
+ panel.style.left = Math.max(8, window.innerWidth - w - 16) + 'px';
+ panel.style.top = Math.max(8, window.innerHeight - h - 16) + 'px';
+ panel.style.right = 'auto'; panel.style.bottom = 'auto';
+ panel.dataset.positioned = '1';
+ }
+ content.focus();
+ }
function close() { modal.style.display = 'none'; }
document.getElementById('fbOpen').addEventListener('click', open);
document.getElementById('fbClose').addEventListener('click', close);
document.getElementById('fbCancel').addEventListener('click', close);
+ // 헤더 드래그로 창 이동 (크기 조절은 패널 우하단 모서리 resize:both 가 처리)
+ (function () {
+ var panel = document.getElementById('fbPanel');
+ var head = document.getElementById('fbHead');
+ var dragging = false, sx = 0, sy = 0, sl = 0, st = 0;
+ // 드래그 중 iframe(예: 지도)이 마우스를 가로채지 않도록 투명 오버레이
+ var ov = document.createElement('div');
+ ov.style.cssText = 'position:fixed;inset:0;z-index:11002;cursor:move;display:none;';
+ document.body.appendChild(ov);
+
+ head.addEventListener('mousedown', function (e) {
+ if (e.target.closest('#fbClose')) return;
+ e.preventDefault();
+ var r = panel.getBoundingClientRect();
+ // right/bottom 기준을 left/top 기준으로 전환(드래그 계산 일관성)
+ panel.style.left = r.left + 'px'; panel.style.top = r.top + 'px';
+ panel.style.right = 'auto'; panel.style.bottom = 'auto';
+ sx = e.clientX; sy = e.clientY; sl = r.left; st = r.top;
+ dragging = true; ov.style.display = 'block'; document.body.style.userSelect = 'none';
+ });
+ document.addEventListener('mousemove', function (e) {
+ if (!dragging) return;
+ var w = panel.offsetWidth, h = panel.offsetHeight;
+ var nl = Math.min(Math.max(0, sl + (e.clientX - sx)), window.innerWidth - w);
+ var nt = Math.min(Math.max(0, st + (e.clientY - sy)), window.innerHeight - h);
+ panel.style.left = nl + 'px'; panel.style.top = nt + 'px';
+ });
+ document.addEventListener('mouseup', function () {
+ if (!dragging) return;
+ dragging = false; ov.style.display = 'none'; document.body.style.userSelect = '';
+ });
+ })();
+
// html2canvas 지연 로드
function ensureH2C(cb) {
if (typeof html2canvas === 'function') { cb(); return; }
@@ -129,7 +180,7 @@ $apiPath = (string) parse_url(base_url('feedback'), PHP_URL_PATH);
sendBtn.disabled = false;
if (d && d.ok) {
msg.style.color = '#059669'; msg.textContent = '의견이 접수되었습니다. 감사합니다.';
- content.value = '';
+ content.value = ''; updateCount();
attachments.length = 0; renderPreview();
setTimeout(close, 900);
} else {