(function () { var folder = (window.__OP__ || {}).folder var ctxMenu = document.getElementById('ctxMenu') var targetId = null var targetTitle = null function showCtx(x, y) { ctxMenu.style.left = x + 'px' ctxMenu.style.top = y + 'px' ctxMenu.hidden = false } function hideCtx() { ctxMenu.hidden = true } document.querySelectorAll('.adminVideo').forEach(function (card) { card.addEventListener('contextmenu', function (e) { e.preventDefault() targetId = card.getAttribute('data-id') targetTitle = card.getAttribute('data-title') showCtx(e.clientX, e.clientY) }) }) document.addEventListener('click', function (e) { if (!ctxMenu.contains(e.target)) hideCtx() }) ctxMenu.addEventListener('click', function (e) { var btn = e.target.closest('button') if (!btn) return var action = btn.getAttribute('data-action') if (action === 'edit') { location.href = '/op/folder/' + encodeURIComponent(folder) + '/video/editor?id=' + encodeURIComponent(targetId) } else if (action === 'copyUrl') { copyVideoUrl(targetId) } else if (action === 'rename') { var t = window.prompt('새 영상 제목', targetTitle) if (t && t !== targetTitle) { fetch('/op/folder/' + encodeURIComponent(folder) + '/video/rename', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ id: targetId, title: t }) }).then(function (r) { return r.json() }).then(function (j) { if (j.ok) location.reload() else alert(j.message || '이름 변경 실패') }) } } else if (action === 'delete') { if (window.confirm('"' + targetTitle + '" 영상을 정말 삭제할까요?')) { fetch('/op/folder/' + encodeURIComponent(folder) + '/video/delete', { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ id: targetId }) }).then(function (r) { return r.json() }).then(function (j) { if (j.ok) location.reload() else alert(j.message || '삭제 실패') }) } } hideCtx() }) function copyVideoUrl(id) { var url = location.origin + '/file/video/' + encodeURIComponent(id) if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(url).then(function () { flashToast('주소가 복사되었습니다.') }, function () { fallbackCopy(url) }) } else { fallbackCopy(url) } } function fallbackCopy(text) { try { var ta = document.createElement('textarea') ta.value = text ta.style.position = 'fixed' ta.style.left = '-9999px' document.body.appendChild(ta) ta.focus(); ta.select() var ok = document.execCommand && document.execCommand('copy') document.body.removeChild(ta) if (ok) flashToast('주소가 복사되었습니다.') else window.prompt('주소를 복사하세요:', text) } catch (e) { window.prompt('주소를 복사하세요:', text) } } function flashToast(msg) { var el = document.createElement('div') el.className = 'flashToast' el.textContent = msg document.body.appendChild(el) requestAnimationFrame(function () { el.classList.add('show') }) setTimeout(function () { el.classList.remove('show') setTimeout(function () { el.parentNode && el.parentNode.removeChild(el) }, 200) }, 1500) } })()