feat: PMR 라벨 미리보기 기능
- /pmr/api/label/preview: PIL 렌더링 → Base64 이미지 - 미리보기 버튼 + 모달 추가 - 29mm 용지 기준 라벨 이미지 생성
This commit is contained in:
@@ -295,8 +295,21 @@
|
||||
</div>
|
||||
<div class="action-bar" id="actionBar" style="display:none;">
|
||||
<button class="btn btn-secondary" onclick="selectAll()">전체 선택</button>
|
||||
<button class="btn btn-secondary" onclick="previewLabels()" style="background:#3b82f6;color:#fff;">👁️ 미리보기</button>
|
||||
<button class="btn btn-primary" onclick="printLabels()">🖨️ 라벨 인쇄</button>
|
||||
</div>
|
||||
|
||||
<!-- 미리보기 모달 -->
|
||||
<div id="previewModal" style="display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.7);z-index:1000;overflow-y:auto;">
|
||||
<div style="max-width:400px;margin:50px auto;background:#fff;border-radius:12px;padding:20px;">
|
||||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:15px;">
|
||||
<h3 style="margin:0;color:#4c1d95;">🏷️ 라벨 미리보기</h3>
|
||||
<button onclick="closePreview()" style="background:none;border:none;font-size:1.5rem;cursor:pointer;">×</button>
|
||||
</div>
|
||||
<div id="previewContent" style="display:flex;flex-direction:column;gap:15px;align-items:center;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -466,6 +479,65 @@
|
||||
if (checkAll) checkAll.checked = true;
|
||||
}
|
||||
|
||||
// 라벨 미리보기
|
||||
async function previewLabels() {
|
||||
const rows = document.querySelectorAll('.med-check:checked');
|
||||
if (rows.length === 0) {
|
||||
alert('미리보기할 약품을 선택하세요');
|
||||
return;
|
||||
}
|
||||
|
||||
const container = document.getElementById('previewContent');
|
||||
container.innerHTML = '<div class="loading"><div class="spinner"></div></div>';
|
||||
document.getElementById('previewModal').style.display = 'block';
|
||||
|
||||
// 현재 선택된 환자명
|
||||
const patientName = document.getElementById('detailName').textContent;
|
||||
|
||||
container.innerHTML = '';
|
||||
|
||||
for (const checkbox of rows) {
|
||||
const tr = checkbox.closest('tr');
|
||||
const medName = tr.querySelector('.med-name')?.textContent || '';
|
||||
const dosage = parseFloat(tr.cells[3]?.querySelector('.med-dosage')?.textContent) || 0;
|
||||
const frequency = parseInt(tr.cells[4]?.textContent) || 0;
|
||||
const duration = parseInt(tr.cells[5]?.textContent) || 0;
|
||||
|
||||
try {
|
||||
const res = await fetch('/pmr/api/label/preview', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({
|
||||
patient_name: patientName,
|
||||
med_name: medName,
|
||||
dosage: dosage,
|
||||
frequency: frequency,
|
||||
duration: duration,
|
||||
unit: '정'
|
||||
})
|
||||
});
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
const img = document.createElement('img');
|
||||
img.src = data.image;
|
||||
img.style.cssText = 'max-width:100%;border:1px solid #ddd;border-radius:8px;';
|
||||
container.appendChild(img);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('Preview error:', err);
|
||||
}
|
||||
}
|
||||
|
||||
if (container.children.length === 0) {
|
||||
container.innerHTML = '<p style="color:#999;">미리보기 생성 실패</p>';
|
||||
}
|
||||
}
|
||||
|
||||
function closePreview() {
|
||||
document.getElementById('previewModal').style.display = 'none';
|
||||
}
|
||||
|
||||
// 라벨 인쇄 (TODO: 구현)
|
||||
function printLabels() {
|
||||
const selected = Array.from(document.querySelectorAll('.med-check:checked')).map(c => c.dataset.code);
|
||||
|
||||
Reference in New Issue
Block a user