diff --git a/frontend/src/pages/pc/Schedule.jsx b/frontend/src/pages/pc/Schedule.jsx index 14c43b8..3be511e 100644 --- a/frontend/src/pages/pc/Schedule.jsx +++ b/frontend/src/pages/pc/Schedule.jsx @@ -687,16 +687,34 @@ function Schedule() { )} - {/* 검색 모드가 아닐 때만 개수 표시 */} - {!isSearchMode && ( - {filteredSchedules.length}개 일정 - )} + + {!isSearchMode && ( + + {filteredSchedules.length}개 일정 + + )} + + -
+ {loading ? (
로딩 중...
) : filteredSchedules.length > 0 ? ( + filteredSchedules.map((schedule, index) => { const formatted = formatDate(schedule.date); const categoryColor = getCategoryColor(schedule.category_id); @@ -704,10 +722,11 @@ function Schedule() { return ( handleScheduleClick(schedule)} className="flex items-stretch bg-white rounded-2xl shadow-sm hover:shadow-md transition-shadow overflow-hidden cursor-pointer" > @@ -788,8 +807,9 @@ function Schedule() { {selectedDate ? '선택한 날짜에 일정이 없습니다.' : '예정된 일정이 없습니다.'}
)} - + + diff --git a/frontend/src/pages/pc/admin/AdminSchedule.jsx b/frontend/src/pages/pc/admin/AdminSchedule.jsx index c2dd421..1d70cbd 100644 --- a/frontend/src/pages/pc/admin/AdminSchedule.jsx +++ b/frontend/src/pages/pc/admin/AdminSchedule.jsx @@ -19,17 +19,29 @@ function AdminSchedule() { return kstDate.toISOString().split('T')[0]; }; + // sessionStorage에서 저장된 상태 복원 + const getStoredState = () => { + try { + const stored = sessionStorage.getItem('adminScheduleState'); + return stored ? JSON.parse(stored) : null; + } catch { return null; } + }; + const storedState = getStoredState(); + const [loading, setLoading] = useState(false); const [user, setUser] = useState(null); const [toast, setToast] = useState(null); - const [searchInput, setSearchInput] = useState(''); - const [searchTerm, setSearchTerm] = useState(''); - const [isSearchMode, setIsSearchMode] = useState(false); + const [searchInput, setSearchInput] = useState(storedState?.searchInput || ''); + const [searchTerm, setSearchTerm] = useState(storedState?.searchTerm || ''); + const [isSearchMode, setIsSearchMode] = useState(storedState?.isSearchMode || false); const [searchResults, setSearchResults] = useState([]); const [searchLoading, setSearchLoading] = useState(false); - const [selectedCategories, setSelectedCategories] = useState([]); - const [selectedDate, setSelectedDate] = useState(getTodayKST()); // KST 기준 오늘 - const [currentDate, setCurrentDate] = useState(new Date()); + const [selectedCategories, setSelectedCategories] = useState(storedState?.selectedCategories || []); + const [selectedDate, setSelectedDate] = useState(storedState?.selectedDate || getTodayKST()); + const [currentDate, setCurrentDate] = useState( + storedState?.currentDate ? new Date(storedState.currentDate) : new Date() + ); + const [slideDirection, setSlideDirection] = useState(0); @@ -157,6 +169,27 @@ function AdminSchedule() { fetchSchedules(); }, [year, month]); + // 상태를 sessionStorage에 저장 (페이지 이동 시 복원용) + useEffect(() => { + const stateToSave = { + searchInput, + searchTerm, + isSearchMode, + selectedCategories, + selectedDate, + currentDate: currentDate.toISOString(), + }; + sessionStorage.setItem('adminScheduleState', JSON.stringify(stateToSave)); + }, [searchInput, searchTerm, isSearchMode, selectedCategories, selectedDate, currentDate]); + + // 검색 모드로 돌아왔을 때 검색 결과 다시 로드 + useEffect(() => { + if (isSearchMode && searchTerm) { + searchSchedules(searchTerm); + } + }, []); // 컴포넌트 마운트 시에만 + + // 카테고리 로드 함수 const fetchCategories = async () => { try { @@ -882,7 +915,7 @@ function AdminSchedule() { className="flex items-center gap-1 px-2 py-1 bg-gray-100 rounded-md text-sm text-gray-600 hover:bg-gray-200 transition-colors" > - {selectedCategories.length}개 + {selectedCategories.length}개 일정 {showCategoryTooltip && ( @@ -911,7 +944,7 @@ function AdminSchedule() { )} - {filteredSchedules.length}개 + {filteredSchedules.length}개 일정 )} @@ -928,14 +961,16 @@ function AdminSchedule() {

등록된 일정이 없습니다

) : ( -
+
{filteredSchedules.map((schedule, index) => (