fix(tkpurchase): 협력업체 포탈 작업 신청 폼 항상 표시
활성 일정이 있으면 작업 신청 폼이 숨겨지던 문제 수정. 일정 유무와 관계없이 신청 대기/반려 카드 + 작업 신청 폼을 항상 하단에 표시. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -81,8 +81,8 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/static/js/tkpurchase-core.js?v=20260313b"></script>
|
||||
<script src="/static/js/tkpurchase-partner-portal.js?v=20260313b"></script>
|
||||
<script src="/static/js/tkpurchase-core.js?v=20260313c"></script>
|
||||
<script src="/static/js/tkpurchase-partner-portal.js?v=20260313c"></script>
|
||||
<script>initPartnerPortal();</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -53,58 +53,11 @@ async function renderScheduleCards() {
|
||||
const requestCardsEl = document.getElementById('requestCards');
|
||||
const workRequestFormEl = document.getElementById('workRequestForm');
|
||||
|
||||
const today = new Date().toISOString().substring(0, 10);
|
||||
|
||||
if (!portalSchedules.length) {
|
||||
container.innerHTML = '';
|
||||
// 신청 건 표시
|
||||
if (portalRequests.length) {
|
||||
requestCardsEl.classList.remove('hidden');
|
||||
requestCardsEl.innerHTML = portalRequests.map(r => {
|
||||
const isRejected = r.status === 'rejected';
|
||||
const statusBg = isRejected ? 'bg-red-50 border-red-200' : 'bg-amber-50 border-amber-200';
|
||||
const statusIcon = isRejected ? 'fa-times-circle text-red-400' : 'fa-clock text-amber-400';
|
||||
const statusText = isRejected ? '반려됨' : '승인 대기 중';
|
||||
const statusTextClass = isRejected ? 'text-red-600' : 'text-amber-600';
|
||||
return `<div class="bg-white rounded-xl shadow-sm overflow-hidden border ${isRejected ? 'border-red-100' : 'border-amber-100'}">
|
||||
<div class="p-5">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<h3 class="text-base font-semibold text-gray-800">${escapeHtml(r.workplace_name || '작업장 미지정')}</h3>
|
||||
<span class="text-xs ${statusTextClass} font-medium px-2 py-1 rounded-full ${statusBg}">
|
||||
<i class="fas ${statusIcon} mr-1"></i>${statusText}
|
||||
</span>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600 mb-2">${escapeHtml(r.work_description || '')}</div>
|
||||
<div class="flex gap-4 text-xs text-gray-500">
|
||||
<span><i class="fas fa-calendar mr-1"></i>${formatDate(r.start_date)}</span>
|
||||
<span><i class="fas fa-users mr-1"></i>예상 ${r.expected_workers || 0}명</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
}).join('');
|
||||
// 반려 건만 있으면 재신청 폼도 표시
|
||||
const hasOnlyRejected = portalRequests.every(r => r.status === 'rejected');
|
||||
if (hasOnlyRejected) {
|
||||
workRequestFormEl.classList.remove('hidden');
|
||||
workRequestFormEl.querySelector('p').textContent = '반려된 신청 건이 있습니다. 필요시 재신청해주세요.';
|
||||
} else {
|
||||
workRequestFormEl.classList.add('hidden');
|
||||
}
|
||||
} else {
|
||||
requestCardsEl.classList.add('hidden');
|
||||
workRequestFormEl.classList.remove('hidden');
|
||||
workRequestFormEl.querySelector('p').textContent = '등록된 작업 일정이 없습니다. 작업이 필요하시면 아래에서 신청해주세요.';
|
||||
}
|
||||
// 기본 날짜 설정
|
||||
const today = new Date().toISOString().substring(0, 10);
|
||||
const reqDate = document.getElementById('reqStartDate');
|
||||
if (reqDate && !reqDate.value) reqDate.value = today;
|
||||
return;
|
||||
}
|
||||
|
||||
// 오늘 일정 있으면 기존 카드 렌더
|
||||
requestCardsEl.classList.add('hidden');
|
||||
workRequestFormEl.classList.add('hidden');
|
||||
|
||||
const today = new Date().toISOString().substring(0, 10);
|
||||
} else {
|
||||
|
||||
container.innerHTML = portalSchedules.map(s => {
|
||||
const checkin = portalCheckins[s.id];
|
||||
@@ -200,6 +153,51 @@ async function renderScheduleCards() {
|
||||
` : ''}
|
||||
</div>`;
|
||||
}).join('');
|
||||
}
|
||||
|
||||
// 신청 건 표시 (항상)
|
||||
if (portalRequests.length) {
|
||||
requestCardsEl.classList.remove('hidden');
|
||||
requestCardsEl.innerHTML = portalRequests.map(r => {
|
||||
const isRejected = r.status === 'rejected';
|
||||
const statusBg = isRejected ? 'bg-red-50 border-red-200' : 'bg-amber-50 border-amber-200';
|
||||
const statusIcon = isRejected ? 'fa-times-circle text-red-400' : 'fa-clock text-amber-400';
|
||||
const statusText = isRejected ? '반려됨' : '승인 대기 중';
|
||||
const statusTextClass = isRejected ? 'text-red-600' : 'text-amber-600';
|
||||
return `<div class="bg-white rounded-xl shadow-sm overflow-hidden border ${isRejected ? 'border-red-100' : 'border-amber-100'}">
|
||||
<div class="p-5">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<h3 class="text-base font-semibold text-gray-800">${escapeHtml(r.workplace_name || '작업장 미지정')}</h3>
|
||||
<span class="text-xs ${statusTextClass} font-medium px-2 py-1 rounded-full ${statusBg}">
|
||||
<i class="fas ${statusIcon} mr-1"></i>${statusText}
|
||||
</span>
|
||||
</div>
|
||||
<div class="text-sm text-gray-600 mb-2">${escapeHtml(r.work_description || '')}</div>
|
||||
<div class="flex gap-4 text-xs text-gray-500">
|
||||
<span><i class="fas fa-calendar mr-1"></i>${formatDate(r.start_date)}</span>
|
||||
<span><i class="fas fa-users mr-1"></i>예상 ${r.expected_workers || 0}명</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>`;
|
||||
}).join('');
|
||||
} else {
|
||||
requestCardsEl.classList.add('hidden');
|
||||
}
|
||||
|
||||
// 작업 신청 폼 항상 표시
|
||||
workRequestFormEl.classList.remove('hidden');
|
||||
const hasOnlyRejected = portalRequests.length > 0 && portalRequests.every(r => r.status === 'rejected');
|
||||
if (portalSchedules.length) {
|
||||
workRequestFormEl.querySelector('p').textContent = '추가 작업이 필요하시면 신청해주세요.';
|
||||
} else if (hasOnlyRejected) {
|
||||
workRequestFormEl.querySelector('p').textContent = '반려된 신청 건이 있습니다. 필요시 재신청해주세요.';
|
||||
} else {
|
||||
workRequestFormEl.querySelector('p').textContent = '등록된 작업 일정이 없습니다. 작업이 필요하시면 아래에서 신청해주세요.';
|
||||
}
|
||||
|
||||
// 기본 날짜 설정
|
||||
const reqDate = document.getElementById('reqStartDate');
|
||||
if (reqDate && !reqDate.value) reqDate.value = today;
|
||||
}
|
||||
|
||||
async function showCheckoutForm(checkinId, scheduleId) {
|
||||
|
||||
Reference in New Issue
Block a user