330 lines
5.3 KiB
CSS
330 lines
5.3 KiB
CSS
/* ========================================
|
||
* 匯入參加人員頁面專屬樣式
|
||
*
|
||
* 共同樣式已移至 Site.css:
|
||
* - 搜尋面板 (.search-panel, .search-row, .search-field-inline, .search-label-inline, .search-input)
|
||
* ======================================== */
|
||
|
||
/* 上傳面板 */
|
||
.upload-panel {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: var(--spacing-lg);
|
||
}
|
||
|
||
/* 上傳區域 */
|
||
.upload-area {
|
||
border: 2px dashed #ddd;
|
||
border-radius: 8px;
|
||
padding: var(--spacing-lg);
|
||
text-align: center;
|
||
background: #f9f9f9;
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
.upload-area.dragging {
|
||
border-color: #0066cc;
|
||
background: #f0f7ff;
|
||
}
|
||
|
||
.upload-area:hover {
|
||
border-color: #0066cc;
|
||
}
|
||
|
||
/* 上傳文字 */
|
||
.upload-text {
|
||
display: block;
|
||
color: #999;
|
||
font-size: 14px;
|
||
margin-top: 8px;
|
||
}
|
||
|
||
/* 檔案資訊 */
|
||
.file-info {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: 8px;
|
||
margin-top: var(--spacing-md);
|
||
padding: 12px;
|
||
background: white;
|
||
border: 1px solid #ddd;
|
||
border-radius: 4px;
|
||
}
|
||
|
||
.file-name {
|
||
font-weight: 500;
|
||
color: #333;
|
||
}
|
||
|
||
.file-size {
|
||
color: #999;
|
||
font-size: 12px;
|
||
}
|
||
|
||
/* 各步驟區域 */
|
||
.upload-section,
|
||
.preview-section,
|
||
.import-section,
|
||
.result-section {
|
||
background: white;
|
||
border: 1px solid #ddd;
|
||
border-radius: 8px;
|
||
padding: var(--spacing-lg);
|
||
}
|
||
|
||
/* 區域標題 */
|
||
.section-title {
|
||
margin: 0 0 var(--spacing-md) 0;
|
||
font-size: 16px;
|
||
font-weight: 600;
|
||
color: #333;
|
||
}
|
||
|
||
/* 驗證摘要 */
|
||
.validation-summary {
|
||
margin-bottom: var(--spacing-md);
|
||
}
|
||
|
||
.error-box {
|
||
background: #fff5f5;
|
||
border: 1px solid #ffdbdb;
|
||
border-radius: 4px;
|
||
padding: var(--spacing-md);
|
||
}
|
||
|
||
.error-title {
|
||
color: #d32f2f;
|
||
font-weight: 600;
|
||
margin-bottom: 8px;
|
||
}
|
||
|
||
.error-list {
|
||
max-height: 200px;
|
||
overflow-y: auto;
|
||
}
|
||
|
||
.error-item {
|
||
color: #d32f2f;
|
||
font-size: 13px;
|
||
margin-bottom: 4px;
|
||
padding-left: 20px;
|
||
position: relative;
|
||
}
|
||
|
||
.error-item::before {
|
||
content: '\2717 '; /* ✗ */
|
||
position: absolute;
|
||
left: 0;
|
||
color: #d32f2f;
|
||
}
|
||
|
||
/* 預覽資訊 */
|
||
.preview-info {
|
||
background: #f0f7ff;
|
||
border: 1px solid #d4e4f9;
|
||
border-radius: 4px;
|
||
padding: 12px;
|
||
margin-bottom: var(--spacing-md);
|
||
color: #0066cc;
|
||
font-size: 14px;
|
||
font-weight: 500;
|
||
}
|
||
|
||
/* 預覽表格 */
|
||
.preview-table-wrapper {
|
||
overflow-x: auto;
|
||
max-height: 500px;
|
||
overflow-y: auto;
|
||
border: 1px solid #ddd;
|
||
border-radius: 4px;
|
||
}
|
||
|
||
.preview-table {
|
||
width: 100%;
|
||
border-collapse: collapse;
|
||
margin-top: 0;
|
||
border: none;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.preview-table thead {
|
||
background: #f5f5f5;
|
||
position: sticky;
|
||
top: 0;
|
||
z-index: 10;
|
||
}
|
||
|
||
.preview-table th,
|
||
.preview-table td {
|
||
padding: 10px 12px;
|
||
text-align: left;
|
||
border: 1px solid #ddd;
|
||
}
|
||
|
||
.preview-table th {
|
||
font-weight: 600;
|
||
color: #333;
|
||
}
|
||
|
||
.preview-table tbody tr:hover {
|
||
background: #f9f9f9;
|
||
}
|
||
|
||
.preview-table tbody tr.error-row {
|
||
background: #fff5f5;
|
||
}
|
||
|
||
.preview-table .text-center {
|
||
text-align: center;
|
||
}
|
||
|
||
/* 狀態徽章 */
|
||
.status-badge {
|
||
display: inline-block;
|
||
padding: 2px 8px;
|
||
border-radius: 3px;
|
||
font-size: 13px;
|
||
font-weight: 600;
|
||
}
|
||
|
||
.status-badge.ok {
|
||
background: #e6f7e6;
|
||
color: #2e7d32;
|
||
}
|
||
|
||
.status-badge.error {
|
||
background: #ffebee;
|
||
color: #d32f2f;
|
||
}
|
||
|
||
/* 匯入選項 */
|
||
.import-options {
|
||
background: #f9f9f9;
|
||
border: 1px solid #e0e0e0;
|
||
border-radius: 4px;
|
||
padding: var(--spacing-md);
|
||
margin-bottom: var(--spacing-md);
|
||
}
|
||
|
||
.checkbox-label {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
cursor: pointer;
|
||
font-size: 14px;
|
||
color: #333;
|
||
user-select: none;
|
||
}
|
||
|
||
.checkbox-label input[type="checkbox"] {
|
||
cursor: pointer;
|
||
width: 18px;
|
||
height: 18px;
|
||
accent-color: #0066cc;
|
||
}
|
||
|
||
.checkbox-label input[type="checkbox"]:disabled {
|
||
opacity: 0.5;
|
||
cursor: not-allowed;
|
||
}
|
||
|
||
.checkbox-label:hover {
|
||
color: #0066cc;
|
||
}
|
||
|
||
/* 匯入動作 */
|
||
.import-section {
|
||
display: flex;
|
||
gap: var(--spacing-md);
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
.import-section .btn {
|
||
flex: 1;
|
||
min-width: 150px;
|
||
}
|
||
|
||
/* 結果框 */
|
||
.result-section {
|
||
margin-top: var(--spacing-lg);
|
||
}
|
||
|
||
.result-box {
|
||
border-left: 4px solid #ddd;
|
||
padding: var(--spacing-md);
|
||
border-radius: 4px;
|
||
}
|
||
|
||
.result-box.success {
|
||
background: #f1f8f4;
|
||
border-color: #4caf50;
|
||
}
|
||
|
||
.result-box.error {
|
||
background: #fff5f5;
|
||
border-color: #d32f2f;
|
||
}
|
||
|
||
.result-title {
|
||
font-weight: 600;
|
||
font-size: 16px;
|
||
margin-bottom: 8px;
|
||
}
|
||
|
||
.result-box.success .result-title {
|
||
color: #2e7d32;
|
||
}
|
||
|
||
.result-box.error .result-title {
|
||
color: #d32f2f;
|
||
}
|
||
|
||
.result-message {
|
||
color: #666;
|
||
font-size: 14px;
|
||
margin-bottom: 8px;
|
||
}
|
||
|
||
.result-details {
|
||
font-size: 13px;
|
||
color: #999;
|
||
}
|
||
|
||
.result-details span {
|
||
margin-right: 16px;
|
||
}
|
||
|
||
/* 跳過記錄部分 */
|
||
.skipped-records {
|
||
margin-top: var(--spacing-md);
|
||
padding-top: var(--spacing-md);
|
||
border-top: 1px solid #ddd;
|
||
}
|
||
|
||
.skipped-title {
|
||
color: #f57c00;
|
||
font-weight: 600;
|
||
margin-bottom: 8px;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.skipped-list {
|
||
max-height: 150px;
|
||
overflow-y: auto;
|
||
}
|
||
|
||
.skipped-item {
|
||
color: #f57c00;
|
||
font-size: 13px;
|
||
margin-bottom: 4px;
|
||
padding-left: 20px;
|
||
position: relative;
|
||
}
|
||
|
||
.skipped-item::before {
|
||
content: '⊘ ';
|
||
position: absolute;
|
||
left: 0;
|
||
}
|