+ {/* 상단: 검색 + 행위자 + 날짜 */}
+
+ {/* 검색 */}
+
+
+ { setSearchQuery(e.target.value); setCurrentPage(1); }}
+ placeholder="로그 검색..."
+ className="w-full pl-10 pr-4 py-2 border border-gray-200 rounded-lg focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent text-sm"
+ />
+
+
+ {/* 행위자 드롭다운 */}
+
+
+ {actorDropdownOpen && (
+ <>
+
setActorDropdownOpen(false)} />
+
+ {[
+ { value: 'all', label: '전체 행위자' },
+ { value: 'admin', label: '관리자' },
+ { value: 'bot', label: '봇' },
+ ].map((opt) => (
+
+ ))}
+
+ >
+ )}
+
+
+ {/* 날짜 필터 */}
+
+ { setDateFrom(e.target.value); setCurrentPage(1); }}
+ className="px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent text-gray-600"
+ />
+ ~
+ { setDateTo(e.target.value); setCurrentPage(1); }}
+ className="px-3 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-primary focus:border-transparent text-gray-600"
+ />
+
+
+ {/* 필터 초기화 */}
+ {hasActiveFilters && (
+
+ )}
+
+
+ {/* 하단: 카테고리 칩 */}
+
+ 카테고리
+ {CATEGORIES.map((cat) => (
+
+ ))}
+
+
+
+ {/* 결과 개수 */}
+
+
+ 총 {filteredLogs.length}개의 로그
+
+
+
+ {/* 로그 테이블 */}
+
+
+
+
+ | 시간 |
+ 행위자 |
+ 액션 |
+ 카테고리 |
+ 내용 |
+
+
+
+ {paginatedLogs.map((log, index) => (
+
+
+ {formatDateTime(log.created_at)}
+ |
+
+ {renderActorBadge(log.actor)}
+ |
+
+
+ {ACTION_LABELS[log.action] || log.action}
+
+ |
+
+
+ {CATEGORIES.find((c) => c.value === log.category)?.label || log.category}
+
+ |
+
+ {log.summary}
+ |
+
+ ))}
+
+
+
+ {paginatedLogs.length === 0 && (
+
+
+
+ {hasActiveFilters ? '검색 결과가 없습니다.' : '활동 로그가 없습니다.'}
+
+
+ )}
+
+
+ {/* 페이지네이션 */}
+ {totalPages > 1 && (
+
+
+ {Array.from({ length: totalPages }, (_, i) => i + 1).map((page) => (
+
+ ))}
+
+
+ )}
+