Skip to content

Commit d1cb307

Browse files
wip(calendar): enable switching between day/week
1 parent 8711709 commit d1cb307

File tree

3 files changed

+46
-10
lines changed

3 files changed

+46
-10
lines changed

components/calendar/index.tsx

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import useSingle from 'lib/hooks/single';
2525
import useURLParamSync from 'lib/hooks/url-param-sync';
2626
import { useUser } from 'lib/context/user';
2727

28-
import { CalendarStateContext, DialogPage } from './state';
28+
import { CalendarDisplay, CalendarStateContext, DialogPage } from './state';
2929
import CreatePage from './dialog/create-page';
3030
import DialogSurface from './dialog/surface';
3131
import DisplayPage from './dialog/display-page';
@@ -35,6 +35,7 @@ import Header from './header';
3535
import RecurDialog from './recur-dialog';
3636
import SearchBar from './search-bar';
3737
import DailyDisplay from './daily-display';
38+
import WeeklyDisplay from './weekly-display';
3839
import styles from './calendar.module.scss';
3940

4041
const initialEditData = new Meeting();
@@ -48,6 +49,7 @@ export default function Calendar({
4849
org: byOrg,
4950
user: byUser,
5051
}: CalendarProps): JSX.Element {
52+
const [display, setDisplay] = useState<CalendarDisplay>('Week');
5153
const [filtersOpen, setFiltersOpen] = useState<boolean>(false);
5254
const [mutatedIds, setMutatedIds] = useState<Set<number>>(new Set());
5355
const [query, setQuery] = useState<MeetingsQuery>(new MeetingsQuery());
@@ -236,6 +238,8 @@ export default function Calendar({
236238
dragging,
237239
setDragging,
238240
start: query.from,
241+
display,
242+
setDisplay,
239243
}),
240244
[
241245
editing,
@@ -252,6 +256,8 @@ export default function Calendar({
252256
dragging,
253257
setDragging,
254258
query.from,
259+
display,
260+
setDisplay,
255261
]
256262
);
257263

@@ -370,15 +376,28 @@ export default function Calendar({
370376
byOrg={byOrg}
371377
/>
372378
<div className={styles.content}>
373-
<DailyDisplay
374-
searching={!data}
375-
meetings={meetings}
376-
filtersOpen={filtersOpen}
377-
width={width}
378-
setWidth={setWidth}
379-
offset={offset}
380-
setOffset={setOffset}
381-
/>
379+
{display === 'Day' && (
380+
<DailyDisplay
381+
searching={!data}
382+
meetings={meetings}
383+
filtersOpen={filtersOpen}
384+
width={width}
385+
setWidth={setWidth}
386+
offset={offset}
387+
setOffset={setOffset}
388+
/>
389+
)}
390+
{display === 'Week' && (
391+
<WeeklyDisplay
392+
searching={!data}
393+
meetings={meetings}
394+
filtersOpen={filtersOpen}
395+
width={width}
396+
setWidth={setWidth}
397+
offset={offset}
398+
setOffset={setOffset}
399+
/>
400+
)}
382401
<FiltersSheet
383402
query={query}
384403
setQuery={setQuery}

components/calendar/search-bar.tsx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { memo, useCallback } from 'react';
22
import { IconButton } from '@rmwc/icon-button';
3+
import { Select } from '@rmwc/select';
34
import { TextField } from '@rmwc/textfield';
45
import { dequal } from 'dequal/lite';
56

@@ -9,6 +10,7 @@ import FilterListIcon from 'components/icons/filter-list';
910
import { Callback } from 'lib/model/callback';
1011
import { MeetingsQuery } from 'lib/model/query/meetings';
1112

13+
import { CalendarDisplay, useCalendarState } from './state';
1214
import styles from './search-bar.module.scss';
1315

1416
export interface SearchBarProps {
@@ -27,6 +29,7 @@ function SearchBar({
2729
const downloadResults = useCallback(() => {
2830
window.open(query.getURL('/api/meetings/csv'));
2931
}, [query]);
32+
const { display, setDisplay } = useCalendarState();
3033

3134
return (
3235
<div className={styles.filters}>
@@ -48,6 +51,14 @@ function SearchBar({
4851
)}
4952
</div>
5053
<div className={styles.right}>
54+
<div className={styles.select}>
55+
<Select
56+
enhanced
57+
value={display}
58+
options={['Day', 'Week']}
59+
onChange={(evt) => setDisplay(evt.currentTarget.value as CalendarDisplay)}
60+
/>
61+
</div>
5162
<TextField
5263
outlined
5364
placeholder='Search by description'

components/calendar/state.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export enum DialogPage {
1010
Create,
1111
}
1212

13+
export type CalendarDisplay = 'Day' | 'Week';
14+
1315
export interface CalendarState {
1416
start: Date;
1517
editing: Meeting;
@@ -26,6 +28,8 @@ export interface CalendarState {
2628
setDialogPage: Callback<DialogPage>;
2729
dragging: boolean;
2830
setDragging: Callback<boolean>;
31+
display: CalendarDisplay;
32+
setDisplay: Callback<CalendarDisplay>;
2933
}
3034

3135
export const CalendarStateContext = createContext<CalendarState>({
@@ -44,6 +48,8 @@ export const CalendarStateContext = createContext<CalendarState>({
4448
setDialogPage: () => {},
4549
dragging: false,
4650
setDragging: () => {},
51+
display: 'Week',
52+
setDisplay: () => {},
4753
});
4854

4955
export const useCalendarState = (): CalendarState =>

0 commit comments

Comments
 (0)