1- import React from 'react'
1+ import React , { useEffect } from 'react'
22import { orderBy , sum , uniq } from 'lodash-es'
33import {
44 Box ,
@@ -22,7 +22,7 @@ import {
2222import { ArrowDropDown , CalendarTodayOutlined , ChevronRight , Menu , List } from '@mui/icons-material'
2323import { useQuery } from '@tanstack/react-query'
2424import { useParams } from 'react-router'
25- import { Link } from 'react-router-dom'
25+ import { Link , useSearchParams } from 'react-router-dom'
2626import { useTranslation } from 'react-i18next'
2727import { format } from 'date-fns'
2828import apiClient from '../../util/apiClient'
@@ -402,10 +402,36 @@ const FeedbackTargetItem = ({ code, cuName, curName, tags, language, showCurName
402402 )
403403}
404404
405- const Filters = React . memo ( ( { onChange, value, organisation } ) => {
405+ const Filters = React . memo ( ( { onChange, value, organisation, searchParams , setSearchParams } ) => {
406406 const { t, i18n } = useTranslation ( )
407407 const [ open , setOpen ] = React . useState ( false )
408- const [ timeOption , setTimeOption ] = useHistoryState ( 'overviewTimeperiodOption' , 'year' )
408+ const initialOption = searchParams ?. get ( 'option' ) || 'year'
409+ const [ timeOption , setTimeOption ] = useHistoryState ( 'overviewTimeperiodOption' , initialOption )
410+
411+ // Set initial timeOption from URL if present
412+ useEffect ( ( ) => {
413+ if ( searchParams ?. get ( 'option' ) && searchParams . get ( 'option' ) !== timeOption ) {
414+ setTimeOption ( searchParams . get ( 'option' ) )
415+ }
416+ } , [ ] )
417+
418+ // Sync timeOption to URL when it changes
419+ const handleSetOption = React . useCallback (
420+ newOption => {
421+ setTimeOption ( newOption )
422+ if ( setSearchParams ) {
423+ setSearchParams (
424+ params => {
425+ const newParams = new URLSearchParams ( params )
426+ if ( newOption ) newParams . set ( 'option' , newOption )
427+ return newParams
428+ } ,
429+ { replace : true }
430+ )
431+ }
432+ } ,
433+ [ setTimeOption , setSearchParams ]
434+ )
409435
410436 const tags = organisation . tags . map ( tag => ( {
411437 hash : tag . hash ,
@@ -427,7 +453,7 @@ const Filters = React.memo(({ onChange, value, organisation }) => {
427453 value = { { start : value . startDate , end : value . endDate } }
428454 option = { timeOption }
429455 onChange = { v => onChange ( { ...value , startDate : v . start , endDate : v . end } ) }
430- setOption = { setTimeOption }
456+ setOption = { handleSetOption }
431457 />
432458 < Box ml = "auto" > { open ? < ArrowDropDown /> : < Menu /> } </ Box >
433459 </ Box >
@@ -563,17 +589,38 @@ const SemesterOverview = ({ organisation }) => {
563589 const editMode = React . useRef ( false )
564590 const [ sidebarEditMode , setSidebarEditMode ] = React . useState ( false )
565591
592+ const [ searchParams , setSearchParams ] = useSearchParams ( )
566593 const studyYearRange = getYearRange ( new Date ( ) )
594+
595+ // Initialize filters from URL params or default values
596+ const initialStartDate = searchParams . get ( 'startDate' ) || studyYearRange . start
597+ const initialEndDate = searchParams . get ( 'endDate' ) || studyYearRange . end
598+
567599 const [ filters , setFilters ] = React . useState ( {
568- startDate : studyYearRange . start ,
569- endDate : studyYearRange . end ,
600+ startDate : initialStartDate ,
601+ endDate : initialEndDate ,
570602 teacherQuery : '' ,
571603 courseQuery : '' ,
572604 includeWithoutTeachers : false ,
573605 noTags : false ,
574606 tags : [ ] ,
575607 } )
576608
609+ // Sync URL params when dates change
610+ useEffect ( ( ) => {
611+ const params = new URLSearchParams ( )
612+ if ( filters . startDate ) {
613+ const formattedStartDate =
614+ filters . startDate instanceof Date ? format ( filters . startDate , 'yyyy-MM-dd' ) : filters . startDate
615+ params . set ( 'startDate' , formattedStartDate )
616+ }
617+ if ( filters . endDate ) {
618+ const formattedEndDate = filters . endDate instanceof Date ? format ( filters . endDate , 'yyyy-MM-dd' ) : filters . endDate
619+ params . set ( 'endDate' , formattedEndDate )
620+ }
621+ setSearchParams ( params , { replace : true } )
622+ } , [ filters . startDate , filters . endDate ] )
623+
577624 const onFeedbackTargetClick = React . useCallback ( feedbackTarget => {
578625 React . startTransition ( ( ) => {
579626 if ( editMode . current ) {
@@ -665,7 +712,15 @@ const SemesterOverview = ({ organisation }) => {
665712 language = { i18n . language }
666713 t = { t }
667714 />
668- < Filters value = { filters } onChange = { setFilters } t = { t } language = { i18n . language } organisation = { organisation } />
715+ < Filters
716+ value = { filters }
717+ onChange = { setFilters }
718+ t = { t }
719+ language = { i18n . language }
720+ organisation = { organisation }
721+ searchParams = { searchParams }
722+ setSearchParams = { setSearchParams }
723+ />
669724 < Box display = "flex" columnGap = "0.5rem" >
670725 < FormControlLabel
671726 control = { < Switch checked = { sidebarEditMode } onChange = { toggleEditMode } /> }
0 commit comments