- 이사회의사록 전용 폼(_board-minutes-form.blade.php) 생성 - 이사회의사록 읽기전용 뷰(_board-minutes-show.blade.php) 생성 - Alpine.js 의안/서명란 동적 추가/삭제 기능 - 테넌트 정보에서 회사명/대표자 자동 채움 - create/edit/show 페이지 통합 - 미리보기/인쇄 기능 포함 - 인사/근태 카테고리에 배치
190 lines
9.5 KiB
PHP
190 lines
9.5 KiB
PHP
{{--
|
|
이사회의사록 읽기전용 렌더링
|
|
Props:
|
|
$content (array) - approvals.content JSON
|
|
--}}
|
|
<div class="space-y-4">
|
|
{{-- 미리보기 버튼 --}}
|
|
<div class="flex justify-end gap-2">
|
|
<button type="button" onclick="openBoardMinutesShowPreview()"
|
|
class="px-3 py-1.5 bg-indigo-50 text-indigo-600 hover:bg-indigo-100 border border-indigo-200 rounded-lg text-sm font-medium transition inline-flex items-center gap-1">
|
|
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 12a3 3 0 11-6 0 3 3 0 016 0z"/>
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"/>
|
|
</svg>
|
|
이사회의사록 미리보기
|
|
</button>
|
|
</div>
|
|
|
|
{{-- 1. 일시 및 장소 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">1. 일시 및 장소</h3>
|
|
</div>
|
|
<div class="p-4">
|
|
<div class="grid gap-3" style="grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));">
|
|
<div>
|
|
<span class="text-xs text-gray-500">일시</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['meeting_datetime'] ?? '-' }}</div>
|
|
</div>
|
|
<div>
|
|
<span class="text-xs text-gray-500">장소</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['meeting_place'] ?? '-' }}</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 2. 출석이사 및 감사 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">2. 출석이사 및 감사</h3>
|
|
</div>
|
|
<div class="p-4">
|
|
<div class="grid gap-3" style="grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));">
|
|
<div>
|
|
<span class="text-xs text-gray-500">이사 총수</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['total_directors'] ?? '-' }}명</div>
|
|
</div>
|
|
<div>
|
|
<span class="text-xs text-gray-500">출석이사</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['present_directors'] ?? '-' }}명</div>
|
|
</div>
|
|
<div>
|
|
<span class="text-xs text-gray-500">감사 총수</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['total_auditors'] ?? '-' }}명</div>
|
|
</div>
|
|
<div>
|
|
<span class="text-xs text-gray-500">출석감사</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['present_auditors'] ?? '-' }}명</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 3. 의안 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">3. 의안</h3>
|
|
</div>
|
|
<div class="p-4 space-y-3">
|
|
@foreach(($content['agendas'] ?? []) as $agenda)
|
|
<div class="flex gap-3 items-start">
|
|
<span class="inline-flex items-center justify-center rounded-full bg-blue-100 text-blue-700 text-xs font-bold shrink-0" style="width: 28px; height: 28px;">
|
|
#{{ $agenda['no'] ?? $loop->iteration }}
|
|
</span>
|
|
<div>
|
|
<div class="text-sm font-medium">{{ $agenda['title'] ?? '-' }}</div>
|
|
@if(!empty($agenda['result']))
|
|
<div class="text-xs text-gray-500 mt-1">{{ $agenda['result'] }}</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 4. 의사 경과 및 결과 --}}
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">4. 의사 경과 및 결과</h3>
|
|
</div>
|
|
<div class="p-4">
|
|
<div class="mb-2">
|
|
<span class="text-xs text-gray-500">의장(대표이사)</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['chairman_name'] ?? '-' }}</div>
|
|
</div>
|
|
@if(!empty($content['proceedings']))
|
|
<div class="text-sm text-gray-700 whitespace-pre-wrap mt-2">{{ $content['proceedings'] }}</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
|
|
{{-- 5. 폐회 --}}
|
|
@if(!empty($content['closing_time']))
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">5. 폐회</h3>
|
|
</div>
|
|
<div class="p-4">
|
|
<span class="text-xs text-gray-500">폐회 시각</span>
|
|
<div class="text-sm font-medium mt-0.5">{{ $content['closing_time'] }}</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
|
|
{{-- 6. 기명날인 --}}
|
|
@if(!empty($content['signers']))
|
|
<div class="border border-gray-200 rounded-lg overflow-hidden">
|
|
<div class="bg-gray-50 px-4 py-2 border-b border-gray-200">
|
|
<h3 class="text-sm font-semibold text-gray-700">6. 기명날인</h3>
|
|
</div>
|
|
<div class="p-4">
|
|
<div class="space-y-2">
|
|
@foreach($content['signers'] as $signer)
|
|
<div class="flex items-center gap-3">
|
|
<span class="text-sm text-gray-500" style="min-width: 120px;">{{ $signer['role'] ?? '' }}</span>
|
|
<span class="text-sm font-medium">{{ $signer['name'] ?? '' }}</span>
|
|
<span class="text-xs text-gray-400">(인)</span>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
|
|
{{-- 미리보기 모달 --}}
|
|
<div id="board-minutes-show-preview-modal" style="display: none;" class="fixed inset-0 z-50">
|
|
<div class="absolute inset-0 bg-black/50" onclick="closeBoardMinutesShowPreview()"></div>
|
|
<div class="relative flex items-center justify-center min-h-full p-4">
|
|
<div class="bg-white rounded-xl shadow-2xl w-full overflow-hidden relative" style="max-width: 700px;">
|
|
<div class="flex items-center justify-between px-5 py-3 border-b border-gray-200 bg-gray-50">
|
|
<h3 class="text-base font-semibold text-gray-800">이사회의사록 미리보기</h3>
|
|
<div class="flex items-center gap-2">
|
|
<button type="button" onclick="printBoardMinutesShowPreview()"
|
|
class="px-3 py-1.5 bg-white border border-gray-300 hover:bg-gray-50 rounded-lg text-xs font-medium transition inline-flex items-center gap-1">
|
|
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 17h2a2 2 0 002-2v-4a2 2 0 00-2-2H5a2 2 0 00-2 2v4a2 2 0 002 2h2m2 4h6a2 2 0 002-2v-4a2 2 0 00-2-2H9a2 2 0 00-2 2v4a2 2 0 002 2zm8-12V5a2 2 0 00-2-2H9a2 2 0 00-2 2v4h10z"/>
|
|
</svg>
|
|
인쇄
|
|
</button>
|
|
<button type="button" onclick="closeBoardMinutesShowPreview()"
|
|
class="p-1 text-gray-400 hover:text-gray-600 transition">
|
|
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"/>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div class="overflow-y-auto" style="max-height: 80vh;">
|
|
<div id="board-minutes-show-preview-content" style="padding: 48px 56px; font-family: 'Pretendard', 'Malgun Gothic', sans-serif;">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@push('scripts')
|
|
<script>
|
|
function buildBoardMinutesShowPreviewHtml() {
|
|
const data = @json($content);
|
|
return buildBoardMinutesPreviewHtml(data);
|
|
}
|
|
function openBoardMinutesShowPreview() {
|
|
document.getElementById('board-minutes-show-preview-content').innerHTML = buildBoardMinutesShowPreviewHtml();
|
|
document.getElementById('board-minutes-show-preview-modal').style.display = '';
|
|
}
|
|
function closeBoardMinutesShowPreview() {
|
|
document.getElementById('board-minutes-show-preview-modal').style.display = 'none';
|
|
}
|
|
function printBoardMinutesShowPreview() {
|
|
const content = document.getElementById('board-minutes-show-preview-content').innerHTML;
|
|
const win = window.open('', '_blank');
|
|
win.document.write('<html><head><title>이사회의사록</title><style>body{font-family:"Pretendard","Malgun Gothic",sans-serif;padding:48px 56px;}@media print{body{padding:20px 30px;}}</style></head><body>' + content + '</body></html>');
|
|
win.document.close();
|
|
win.print();
|
|
}
|
|
</script>
|
|
@endpush
|