Skip to content

Commit 54d107a

Browse files
wip(calendar): enable switching between day/week
1 parent 8018768 commit 54d107a

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());
@@ -230,6 +232,8 @@ export default function Calendar({
230232
dragging,
231233
setDragging,
232234
start: query.from,
235+
display,
236+
setDisplay,
233237
}),
234238
[
235239
editing,
@@ -242,6 +246,8 @@ export default function Calendar({
242246
dragging,
243247
setDragging,
244248
query.from,
249+
display,
250+
setDisplay,
245251
]
246252
);
247253

@@ -360,15 +366,28 @@ export default function Calendar({
360366
byOrg={byOrg}
361367
/>
362368
<div className={styles.content}>
363-
<DailyDisplay
364-
searching={!data}
365-
meetings={meetings}
366-
filtersOpen={filtersOpen}
367-
width={width}
368-
setWidth={setWidth}
369-
offset={offset}
370-
setOffset={setOffset}
371-
/>
369+
{display === 'Day' && (
370+
<DailyDisplay
371+
searching={!data}
372+
meetings={meetings}
373+
filtersOpen={filtersOpen}
374+
width={width}
375+
setWidth={setWidth}
376+
offset={offset}
377+
setOffset={setOffset}
378+
/>
379+
)}
380+
{display === 'Week' && (
381+
<WeeklyDisplay
382+
searching={!data}
383+
meetings={meetings}
384+
filtersOpen={filtersOpen}
385+
width={width}
386+
setWidth={setWidth}
387+
offset={offset}
388+
setOffset={setOffset}
389+
/>
390+
)}
372391
<FiltersSheet
373392
query={query}
374393
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;
@@ -22,6 +24,8 @@ export interface CalendarState {
2224
setDialogPage: Callback<DialogPage>;
2325
dragging: boolean;
2426
setDragging: Callback<boolean>;
27+
display: CalendarDisplay;
28+
setDisplay: Callback<CalendarDisplay>;
2529
}
2630

2731
export const CalendarStateContext = createContext<CalendarState>({
@@ -36,6 +40,8 @@ export const CalendarStateContext = createContext<CalendarState>({
3640
setDialogPage: (param: CallbackParam<DialogPage>) => {},
3741
dragging: false,
3842
setDragging: (param: CallbackParam<boolean>) => {},
43+
display: 'Week',
44+
setDisplay: () => {},
3945
});
4046

4147
export const useCalendarState = (): CalendarState =>

0 commit comments

Comments
 (0)