Skip to content

Commit 78d6228

Browse files
committed
feat: org/upcomming and org/responsibles timefilter in url
1 parent c0f2a06 commit 78d6228

File tree

2 files changed

+94
-11
lines changed

2 files changed

+94
-11
lines changed

src/client/pages/Organisation/Responsibles.jsx

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
import React, { useMemo } from 'react'
1+
import React, { useMemo, useEffect } from 'react'
22
import { useTranslation } from 'react-i18next'
33
import { useParams } from 'react-router'
4+
import { useSearchParams } from 'react-router-dom'
45
import { orderBy } from 'lodash-es'
56
import { useQuery } from '@tanstack/react-query'
67
import { writeFileXLSX, utils } from 'xlsx'
8+
import { format } from 'date-fns'
79
import {
810
Box,
911
Typography,
@@ -95,14 +97,40 @@ const Filters = React.memo(({ startDate, endDate, onChange, timeOption, setTimeO
9597
const Responsibles = () => {
9698
const { t, i18n } = useTranslation()
9799
const { code } = useParams()
100+
const [searchParams, setSearchParams] = useSearchParams()
98101

99102
const [timeOption, setTimeOption] = useHistoryState('responsiblesTimeperiodOption', 'year')
100103
const studyYearRange = getYearRange(new Date())
101-
const [startDate, setStartDate] = React.useState(studyYearRange.start)
102-
const [endDate, setEndDate] = React.useState(studyYearRange.end)
104+
105+
// Initialize dates from URL params or default to current study year
106+
const initialStartDate = searchParams.get('startDate') || studyYearRange.start
107+
const initialEndDate = searchParams.get('endDate') || studyYearRange.end
108+
109+
const [startDate, setStartDate] = React.useState(initialStartDate)
110+
const [endDate, setEndDate] = React.useState(initialEndDate)
103111
const [expandedTeacherId, setExpandedTeacherId] = React.useState(null)
104112
const [exportMenuAnchor, setExportMenuAnchor] = React.useState(null)
105113

114+
useEffect(() => {
115+
if (searchParams.get('option') && searchParams.get('option') !== timeOption) {
116+
setTimeOption(searchParams.get('option'))
117+
}
118+
}, [])
119+
120+
useEffect(() => {
121+
const params = new URLSearchParams()
122+
if (startDate) {
123+
const formattedStartDate = startDate instanceof Date ? format(startDate, 'yyyy-MM-dd') : startDate
124+
params.set('startDate', formattedStartDate)
125+
}
126+
if (endDate) {
127+
const formattedEndDate = endDate instanceof Date ? format(endDate, 'yyyy-MM-dd') : endDate
128+
params.set('endDate', formattedEndDate)
129+
}
130+
if (timeOption) params.set('option', timeOption)
131+
setSearchParams(params, { replace: true })
132+
}, [startDate, endDate, timeOption])
133+
106134
const getCourseRealisationName = fbt =>
107135
fbt.courseRealisation.name[i18n.language] ||
108136
fbt.courseRealisation.name.fi ||

src/client/pages/Organisation/SemesterOverview.jsx

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react'
1+
import React, { useEffect } from 'react'
22
import { orderBy, sum, uniq } from 'lodash-es'
33
import {
44
Box,
@@ -22,7 +22,7 @@ import {
2222
import { ArrowDropDown, CalendarTodayOutlined, ChevronRight, Menu, List } from '@mui/icons-material'
2323
import { useQuery } from '@tanstack/react-query'
2424
import { useParams } from 'react-router'
25-
import { Link } from 'react-router-dom'
25+
import { Link, useSearchParams } from 'react-router-dom'
2626
import { useTranslation } from 'react-i18next'
2727
import { format } from 'date-fns'
2828
import 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

Comments
 (0)