Files
stocksearch/static/js/disclosure.js
2026-03-31 19:32:59 +09:00

60 lines
2.3 KiB
JavaScript

// YYYYMMDD → YYYY.MM.DD
function formatDate(d) {
return d ? `${d.slice(0, 4)}.${d.slice(4, 6)}.${d.slice(6, 8)}` : '-';
}
// 태그별 색상 매핑
const TAG_COLORS = {
'실적': 'bg-blue-100 text-blue-700',
'유증': 'bg-red-100 text-red-700',
'무증': 'bg-orange-100 text-orange-700',
'수주': 'bg-green-100 text-green-700',
'소송': 'bg-red-100 text-red-700',
'M&A': 'bg-purple-100 text-purple-700',
'지분': 'bg-indigo-100 text-indigo-700',
'자사주':'bg-teal-100 text-teal-700',
'경영': 'bg-gray-100 text-gray-600',
'CB/BW': 'bg-yellow-100 text-yellow-700',
'공시': 'bg-gray-100 text-gray-500',
};
function tagBadge(tag) {
const cls = TAG_COLORS[tag] || TAG_COLORS['공시'];
return `<span class="text-xs font-medium px-2 py-0.5 rounded-full ${cls} shrink-0">${tag}</span>`;
}
async function loadDisclosures() {
try {
const resp = await fetch(`/api/disclosure?code=${STOCK_CODE}`);
if (!resp.ok) throw new Error();
const list = await resp.json();
document.getElementById('disclosureLoading').classList.add('hidden');
if (!list || list.length === 0) {
document.getElementById('disclosureEmpty').classList.remove('hidden');
return;
}
const ul = document.getElementById('disclosureList');
list.forEach(item => {
const li = document.createElement('li');
li.className = 'py-3';
li.innerHTML = `<a href="${item.url}" target="_blank" rel="noopener noreferrer"
class="flex items-center gap-2 hover:bg-gray-50 px-1 rounded transition-colors">
${tagBadge(item.tag)}
<span class="text-sm text-gray-800 flex-1 min-w-0 truncate">${item.reportNm}</span>
<span class="text-xs text-gray-400 shrink-0">${formatDate(item.rceptDt)}</span>
</a>`;
ul.appendChild(li);
});
ul.classList.remove('hidden');
} catch {
document.getElementById('disclosureLoading').classList.add('hidden');
document.getElementById('disclosureError').classList.remove('hidden');
}
}
document.addEventListener('DOMContentLoaded', () => {
if (typeof STOCK_CODE !== 'undefined') loadDisclosures();
});