style: 표/패널 UI 전면 통일 + 화면설명 드로어·글씨크기·탭 개선
표 디자인 - 모든 표를 가벼운 스타일로 통일(.data-table 경량화: 작은 회색 헤더·연한 구분선·hover) - 표/패널 바깥 테두리 둥글게(rounded-lg) 일괄 적용, 표 래퍼에 패딩 카드(p-4) 통일 - 표 헤더·데이터 정렬을 전 화면 좌측 기준으로 통일 - .data-table th/td text-align:left (전역), 흩어진 center/right 정렬 정리 - 재디자인 Tailwind 표(포장단위·단가·기본코드·담당자·업체·판매대행소·무료대상자·지정판매소)도 셀 좌측화 - 기본정보관리 등 나머지 소메뉴 표를 기본 코드 관리 스타일(가벼운 표·상태 pill)로 재디자인 워크스페이스/공통 - "이 화면 설명" → 새 탭 대신 우측 드로어 팝업(현재 화면과 동시에 보기, Esc·드래그 폭조절) - 상단바 글씨 크기 조절(A−/A+), 작업 내용에 zoom 적용 - 탭 최대치 도달 시 자동 삭제 대신 안내 토스트, "모두 닫기"(업무 현황 탭은 보존) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -13,13 +13,11 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
overflow-y: visible;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
scroll-behavior: smooth;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
background: #fff;
|
||||
max-width: 100%;
|
||||
}
|
||||
@media print {
|
||||
.ds-status-x-scroll { overflow: visible !important; border: none; }
|
||||
.ds-status-x-scroll { overflow: visible !important; }
|
||||
}
|
||||
.ds-status-x-scroll .ds-status-table {
|
||||
width: max-content;
|
||||
@@ -29,15 +27,6 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
.ds-status-x-scroll .ds-status-table th,
|
||||
.ds-status-x-scroll .ds-status-table td {
|
||||
white-space: nowrap;
|
||||
padding: 6px 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
.ds-status-x-scroll .ds-status-table thead th {
|
||||
background: #e9ecef;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
.ds-status-x-scroll .ds-status-table tbody td {
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
.ds-status-x-scroll th.sticky-num,
|
||||
.ds-status-x-scroll td.sticky-num {
|
||||
@@ -48,25 +37,21 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
max-width: 3rem;
|
||||
width: 3rem;
|
||||
box-sizing: border-box;
|
||||
background: #e9ecef;
|
||||
border-right: 1px solid #bbb;
|
||||
box-shadow: 2px 0 4px rgba(0, 0, 0, 0.06);
|
||||
background: #fff;
|
||||
}
|
||||
.ds-status-x-scroll td.sticky-num {
|
||||
background: #fff;
|
||||
text-align: center;
|
||||
}
|
||||
.ds-status-x-scroll tr.sum-row td.sticky-num {
|
||||
background: #f3f4f6;
|
||||
background: #f9fafb;
|
||||
}
|
||||
.ds-status-x-scroll th.sticky-region,
|
||||
.ds-status-x-scroll td.sticky-region {
|
||||
position: sticky;
|
||||
left: 3rem;
|
||||
z-index: 2;
|
||||
background: #e9ecef;
|
||||
border-right: 1px solid #bbb;
|
||||
box-shadow: 2px 0 4px rgba(0, 0, 0, 0.06);
|
||||
background: #fff;
|
||||
max-width: 16rem;
|
||||
text-align: left;
|
||||
}
|
||||
@@ -76,7 +61,7 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.ds-status-x-scroll tr.sum-row td.sticky-region {
|
||||
background: #f3f4f6;
|
||||
background: #f9fafb;
|
||||
}
|
||||
.ds-help {
|
||||
position: relative;
|
||||
@@ -159,39 +144,39 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
|
||||
<!-- 인쇄 시에도 보이는 본표 -->
|
||||
<div class="mx-2 mt-2 mb-2 ds-status-x-scroll">
|
||||
<table class="ds-status-table data-table">
|
||||
<table class="ds-status-table w-full text-[13px]">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="sticky-num text-center w-12">순번</th>
|
||||
<th class="sticky-region"><?= esc($regionColLabel) ?></th>
|
||||
<th class="text-left">
|
||||
<tr class="text-left text-[11px] font-semibold text-gray-500 border-b border-gray-200">
|
||||
<th class="sticky-num py-2.5 px-2 text-center w-12">순번</th>
|
||||
<th class="sticky-region py-2.5 px-2"><?= esc($regionColLabel) ?></th>
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">구코드 <span class="ds-help-badge" tabindex="0" data-tip="지정판매소에 저장된 구·군 코드 값">?</span></span>
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">종전 <span class="ds-help-badge" tabindex="0" data-tip="전년도 12월 31일 기준 정상 상태 판매소 수">?</span></span>(전년도말)
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">지정 <span class="ds-help-badge" tabindex="0" data-tip="<?= esc($ry) ?>년 내 지정일이 속한 신규 지정 건수">?</span></span>(<?= $ry ?>년)
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">취소 <span class="ds-help-badge" tabindex="0" data-tip="<?= esc($ry) ?>년 내 폐업/해지 전환일이 속한 건수">?</span></span>(<?= $ry ?>년)
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">현행 <span class="ds-help-badge" tabindex="0" data-tip="조회년도 12월 31일 기준 정상 상태 판매소 수">?</span></span>(금년도말)
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">증감 <span class="ds-help-badge" tabindex="0" data-tip="현행에서 종전을 뺀 값 (현행−종전)">?</span></span>
|
||||
<br/><span class="font-normal text-xs">(현행−종전)</span>
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">지정−취소 <span class="ds-help-badge" tabindex="0" data-tip="<?= esc($ry) ?>년 지정 건수에서 취소 건수를 뺀 값">?</span></span>
|
||||
<br/><span class="font-normal text-xs">(<?= $ry ?>년)</span>
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">현행비중 <span class="ds-help-badge" tabindex="0" data-tip="전체 현행 합계 대비 해당 행 현행 건수의 비율(%)">?</span></span>
|
||||
<br/><span class="font-normal text-xs">(%)</span>
|
||||
</th>
|
||||
<th class="text-right">
|
||||
<th class="py-2.5 px-2 text-left">
|
||||
<span class="ds-help">전년대비 <span class="ds-help-badge ds-help-right" tabindex="0" data-tip="((현행−종전) / 종전) × 100, 종전이 0이면 표시 안함">?</span></span>
|
||||
<br/><span class="font-normal text-xs">증감률(%)</span>
|
||||
</th>
|
||||
@@ -207,36 +192,36 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
$pctShare = $sumCurrForPct > 0 ? round(($curr / $sumCurrForPct) * 100, 1) : 0.0;
|
||||
$yoyPct = $prev > 0 ? round((($curr - $prev) / $prev) * 100, 1) : null;
|
||||
?>
|
||||
<tr>
|
||||
<td class="sticky-num"><?= $rowNo ?></td>
|
||||
<td class="sticky-region" title="<?= esc($row->region_label) ?>"><?= esc($row->region_label) ?></td>
|
||||
<td class="text-left text-xs"><?= esc((string) ($row->gugun_code ?? '')) ?></td>
|
||||
<td><?= number_format($prev) ?></td>
|
||||
<td><?= number_format((int) $row->designated_y) ?></td>
|
||||
<td><?= number_format((int) $row->cancelled_y) ?></td>
|
||||
<td><?= number_format($curr) ?></td>
|
||||
<td><?= number_format((int) ($row->delta_curr_prev ?? 0)) ?></td>
|
||||
<td><?= number_format((int) ($row->delta_des_cancel ?? 0)) ?></td>
|
||||
<td><?= $pctShare ?></td>
|
||||
<td><?= $yoyPct !== null ? $yoyPct : '—' ?></td>
|
||||
<tr class="border-b border-gray-200 last:border-0 hover:bg-gray-50">
|
||||
<td class="sticky-num py-2.5 px-2 text-center text-gray-500"><?= $rowNo ?></td>
|
||||
<td class="sticky-region py-2.5 px-2 font-medium text-gray-900" title="<?= esc($row->region_label) ?>"><?= esc($row->region_label) ?></td>
|
||||
<td class="py-2.5 px-2 text-left font-mono text-[12px] text-gray-700"><?= esc((string) ($row->gugun_code ?? '')) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format($prev) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) $row->designated_y) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) $row->cancelled_y) ?></td>
|
||||
<td class="py-2.5 px-2 font-medium text-gray-900"><?= number_format($curr) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) ($row->delta_curr_prev ?? 0)) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) ($row->delta_des_cancel ?? 0)) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= $pctShare ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= $yoyPct !== null ? $yoyPct : '—' ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php if (empty($districtRows)): ?>
|
||||
<tr><td colspan="11" class="text-center text-gray-400 py-6">조건에 맞는 데이터가 없습니다.</td></tr>
|
||||
<?php endif; ?>
|
||||
<?php if (! empty($districtRows) && isset($districtTotal)): ?>
|
||||
<tr class="font-bold bg-gray-50 sum-row">
|
||||
<td class="sticky-num">—</td>
|
||||
<td class="sticky-region"><?= esc($districtTotal->region_label) ?></td>
|
||||
<td class="text-left">—</td>
|
||||
<td><?= number_format((int) $districtTotal->prev_end) ?></td>
|
||||
<td><?= number_format((int) $districtTotal->designated_y) ?></td>
|
||||
<td><?= number_format((int) $districtTotal->cancelled_y) ?></td>
|
||||
<td><?= number_format((int) $districtTotal->curr_end) ?></td>
|
||||
<td><?= number_format((int) ($districtTotal->delta_curr_prev ?? 0)) ?></td>
|
||||
<td><?= number_format((int) ($districtTotal->delta_des_cancel ?? 0)) ?></td>
|
||||
<td>100</td>
|
||||
<td>
|
||||
<tr class="font-bold bg-gray-50 sum-row border-b border-gray-200 last:border-0">
|
||||
<td class="sticky-num py-2.5 px-2 text-center text-gray-500">—</td>
|
||||
<td class="sticky-region py-2.5 px-2 text-gray-900"><?= esc($districtTotal->region_label) ?></td>
|
||||
<td class="py-2.5 px-2 text-left text-gray-500">—</td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) $districtTotal->prev_end) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) $districtTotal->designated_y) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) $districtTotal->cancelled_y) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-900"><?= number_format((int) $districtTotal->curr_end) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) ($districtTotal->delta_curr_prev ?? 0)) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) ($districtTotal->delta_des_cancel ?? 0)) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-700">100</td>
|
||||
<td class="py-2.5 px-2 text-gray-700">
|
||||
<?php
|
||||
$tPrev = (int) $districtTotal->prev_end;
|
||||
$tCurr = (int) $districtTotal->curr_end;
|
||||
@@ -260,27 +245,27 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
</span>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<div class="border border-gray-300 bg-white overflow-auto max-h-56">
|
||||
<table class="w-full data-table text-xs">
|
||||
<div class="overflow-auto max-h-56">
|
||||
<table class="w-full text-[13px]">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="text-left">동</th>
|
||||
<th class="text-right">종전</th>
|
||||
<th class="text-right">지정</th>
|
||||
<th class="text-right">취소</th>
|
||||
<th class="text-right">현행</th>
|
||||
<th class="text-right">증감</th>
|
||||
<tr class="text-left text-[11px] font-semibold text-gray-500 border-b border-gray-200">
|
||||
<th class="py-2.5 px-2 text-left">동</th>
|
||||
<th class="py-2.5 px-2 text-left">종전</th>
|
||||
<th class="py-2.5 px-2 text-left">지정</th>
|
||||
<th class="py-2.5 px-2 text-left">취소</th>
|
||||
<th class="py-2.5 px-2 text-left">현행</th>
|
||||
<th class="py-2.5 px-2 text-left">증감</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-right">
|
||||
<?php foreach ($zoneRows as $z): ?>
|
||||
<tr>
|
||||
<td class="text-left"><?= esc((string) $z->zone_label) ?></td>
|
||||
<td><?= number_format((int) $z->prev_end) ?></td>
|
||||
<td><?= number_format((int) $z->designated_y) ?></td>
|
||||
<td><?= number_format((int) $z->cancelled_y) ?></td>
|
||||
<td><?= number_format((int) $z->curr_end) ?></td>
|
||||
<td><?= number_format((int) $z->delta_curr_prev) ?></td>
|
||||
<tr class="border-b border-gray-200 last:border-0 hover:bg-gray-50">
|
||||
<td class="py-2.5 px-2 text-left font-medium text-gray-900"><?= esc((string) $z->zone_label) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) $z->prev_end) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) $z->designated_y) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) $z->cancelled_y) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) $z->curr_end) ?></td>
|
||||
<td class="py-2.5 px-2 text-gray-600"><?= number_format((int) $z->delta_curr_prev) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
</tbody>
|
||||
@@ -345,7 +330,7 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
<details class="mx-2 mb-4 no-print text-sm">
|
||||
<summary class="cursor-pointer text-gray-600 hover:text-gray-800">연도별 요약 (참고)</summary>
|
||||
<div class="flex gap-4 mt-2">
|
||||
<div class="border border-gray-300 p-2 flex-1">
|
||||
<div class="border border-gray-300 rounded-lg p-2 flex-1">
|
||||
<div class="text-xs font-bold text-gray-700 mb-1">활성 / 비활성 / 전체</div>
|
||||
<div class="text-sm">활성 <?= number_format((int) ($totalActive ?? 0)) ?> · 비활성 <?= number_format((int) ($totalInactive ?? 0)) ?> · 합 <?= number_format((int) ($totalActive ?? 0) + (int) ($totalInactive ?? 0)) ?></div>
|
||||
</div>
|
||||
@@ -353,15 +338,23 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-2">
|
||||
<div>
|
||||
<h3 class="text-xs font-bold text-gray-700 mb-1">연도별 신규등록 (지정일)</h3>
|
||||
<div class="border border-gray-300 overflow-auto max-h-48">
|
||||
<table class="w-full data-table text-xs">
|
||||
<thead><tr><th>연도</th><th>건수</th></tr></thead>
|
||||
<div class="overflow-auto max-h-48">
|
||||
<table class="w-full text-[13px]">
|
||||
<thead>
|
||||
<tr class="text-left text-[11px] font-semibold text-gray-500 border-b border-gray-200">
|
||||
<th class="py-2.5 px-2 text-left">연도</th>
|
||||
<th class="py-2.5 px-2 text-left">건수</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-right">
|
||||
<?php foreach (($newByYear ?? []) as $row): ?>
|
||||
<tr><td class="text-center"><?= esc($row->yr) ?>년</td><td><?= number_format((int) $row->cnt) ?></td></tr>
|
||||
<tr class="border-b border-gray-200 last:border-0 hover:bg-gray-50">
|
||||
<td class="py-2.5 px-2 text-left font-medium text-gray-900"><?= esc($row->yr) ?>년</td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) $row->cnt) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php if (empty($newByYear)): ?>
|
||||
<tr><td colspan="2" class="text-center text-gray-400 py-2">없음</td></tr>
|
||||
<tr><td colspan="2" class="text-center text-gray-400 py-6">없음</td></tr>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -369,15 +362,23 @@ $sumCurrForPct = (int) ($districtTotal->curr_end ?? 0);
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-xs font-bold text-gray-700 mb-1">연도별 취소/비활성 (등록일 기준)</h3>
|
||||
<div class="border border-gray-300 overflow-auto max-h-48">
|
||||
<table class="w-full data-table text-xs">
|
||||
<thead><tr><th>연도</th><th>건수</th></tr></thead>
|
||||
<div class="overflow-auto max-h-48">
|
||||
<table class="w-full text-[13px]">
|
||||
<thead>
|
||||
<tr class="text-left text-[11px] font-semibold text-gray-500 border-b border-gray-200">
|
||||
<th class="py-2.5 px-2 text-left">연도</th>
|
||||
<th class="py-2.5 px-2 text-left">건수</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="text-right">
|
||||
<?php foreach (($cancelByYear ?? []) as $row): ?>
|
||||
<tr><td class="text-center"><?= esc($row->yr) ?>년</td><td><?= number_format((int) $row->cnt) ?></td></tr>
|
||||
<tr class="border-b border-gray-200 last:border-0 hover:bg-gray-50">
|
||||
<td class="py-2.5 px-2 text-left font-medium text-gray-900"><?= esc($row->yr) ?>년</td>
|
||||
<td class="py-2.5 px-2 text-gray-700"><?= number_format((int) $row->cnt) ?></td>
|
||||
</tr>
|
||||
<?php endforeach; ?>
|
||||
<?php if (empty($cancelByYear)): ?>
|
||||
<tr><td colspan="2" class="text-center text-gray-400 py-2">없음</td></tr>
|
||||
<tr><td colspan="2" class="text-center text-gray-400 py-6">없음</td></tr>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
Reference in New Issue
Block a user