From 51a402d223f816b9d168427c1b12ac68896720d1 Mon Sep 17 00:00:00 2001 From: dsyoon Date: Wed, 15 Apr 2026 17:09:40 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9A=8C=EC=9D=98=EB=A1=9D:=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EB=8B=A4=EC=9A=B4=20=ED=8E=B8=EC=A7=91=20=ED=88=B4?= =?UTF-8?q?=EB=B0=94=EC=97=90=20=ED=9A=8C=EC=9D=98=EB=A1=9D=20=ED=81=B4?= =?UTF-8?q?=EB=A6=BD=EB=B3=B4=EB=93=9C=20=EB=B3=B5=EC=82=AC=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Made-with: Cursor --- public/styles.css | 1 + views/meeting-minutes.ejs | 45 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/public/styles.css b/public/styles.css index b362ac5..2b07807 100644 --- a/public/styles.css +++ b/public/styles.css @@ -2808,6 +2808,7 @@ body.ai-explore-dev-guest .search-input:disabled { flex-shrink: 0; } .mm-minutes-edit, +.mm-minutes-copy, .mm-minutes-cancel { font-size: 13px; font-weight: 600; diff --git a/views/meeting-minutes.ejs b/views/meeting-minutes.ejs index 74493bf..48f9e0b 100644 --- a/views/meeting-minutes.ejs +++ b/views/meeting-minutes.ejs @@ -189,6 +189,7 @@ @@ -235,6 +236,7 @@ var minutesActionsView = document.getElementById('mmMinutesActionsView'); var minutesActionsEdit = document.getElementById('mmMinutesActionsEdit'); var minutesEditBtn = document.getElementById('mmMinutesEdit'); + var minutesCopyBtn = document.getElementById('mmMinutesCopy'); var minutesApplyBtn = document.getElementById('mmMinutesApply'); var minutesCancelBtn = document.getElementById('mmMinutesCancel'); /** 편집 모드 진입 시점의 회의록 원문(취소 시 복원) */ @@ -343,6 +345,48 @@ } catch (e) {} } } + function copyTextToClipboard(text, done) { + var t = String(text || ''); + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(t).then(done).catch(function () { + legacyCopyTextToClipboard(t, done); + }); + return; + } + legacyCopyTextToClipboard(t, done); + } + function legacyCopyTextToClipboard(text, done) { + var ta = document.createElement('textarea'); + ta.value = text; + ta.setAttribute('readonly', ''); + ta.style.position = 'fixed'; + ta.style.left = '-9999px'; + document.body.appendChild(ta); + ta.select(); + try { + document.execCommand('copy'); + } catch (e) {} + document.body.removeChild(ta); + if (typeof done === 'function') done(); + } + if (minutesCopyBtn) { + minutesCopyBtn.addEventListener('click', function () { + if (!resultBody) return; + var md = String(resultBody.value || ''); + if (!md.trim()) { + alert('복사할 회의록 내용이 없습니다.'); + return; + } + var btn = minutesCopyBtn; + var prev = btn.textContent; + copyTextToClipboard(md, function () { + btn.textContent = '복사됨'; + window.setTimeout(function () { + btn.textContent = prev; + }, 1600); + }); + }); + } if (minutesEditBtn) { minutesEditBtn.addEventListener('click', function () { if (!resultBody) return; @@ -392,6 +436,7 @@ if (resultBody) resultBody.disabled = !!on; if (transcriptBody) transcriptBody.disabled = !!on; if (minutesEditBtn) minutesEditBtn.disabled = !!on; + if (minutesCopyBtn) minutesCopyBtn.disabled = !!on; if (minutesApplyBtn) minutesApplyBtn.disabled = !!on; if (minutesCancelBtn) minutesCancelBtn.disabled = !!on; if (on && resultBody && minutesRenderedEl) {