Skip to content

Commit de1d011

Browse files
committed
Stats view select start date
1 parent c582e5e commit de1d011

File tree

1 file changed

+70
-19
lines changed

1 file changed

+70
-19
lines changed

src/components/activity/StatsView.tsx

Lines changed: 70 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useState } from 'react';
2-
import { Flex, Grid, GridItem, Spinner, Text } from '@chakra-ui/react';
2+
import { Flex, Grid, GridItem, Input, Spinner, Text } from '@chakra-ui/react';
33
import { Select } from 'chakra-react-select';
44
import StatsGraph from './StatsGraph';
55
import { trpc } from '../../utils/trpc';
@@ -90,6 +90,8 @@ const StatsView = () => {
9090
const [personalTicketStats, setPersonalTicketStats] = useState<TicketStats[]>([]);
9191
const [globalTimeRangeOption, setGlobalTimeRangeOption] = useState(timeRangeOptions[0]);
9292
const [personalTimeRangeOption, setPersonalTimeRangeOption] = useState(timeRangeOptions[0]);
93+
const [globalStartDate, setGlobalStartDate] = useState<Date>();
94+
const [personalStartDate, setPersonalStartDate] = useState<Date>();
9395

9496
const { isLoading: isStatsLoading } = trpc.stats.getTicketStats.useQuery(undefined, {
9597
refetchOnWindowFocus: false,
@@ -104,28 +106,53 @@ const StatsView = () => {
104106
},
105107
});
106108

107-
const getTimeRange = (timeRangeOption: TimeRangeType | undefined, end: Date): TimeRange | undefined => {
108-
let start = new Date(end);
109+
const getStartDateFromCurrent = (timeRangeOption: TimeRangeType) => {
110+
let start = new Date();
111+
switch (timeRangeOption.type) {
112+
case 'day':
113+
start.setDate(start.getDate() - 1);
114+
break;
115+
case 'week':
116+
start.setDate(start.getDate() - 7);
117+
break;
118+
case 'month':
119+
start.setMonth(start.getMonth() - 1);
120+
break;
121+
case 'all':
122+
start = new Date('January 1, 2023 00:00:00');
123+
break;
124+
default:
125+
break;
126+
}
127+
return start;
128+
}
129+
130+
const getTimeRange = (timeRangeOption: TimeRangeType | undefined, startDate: Date | undefined): TimeRange | undefined => {
109131
if (!timeRangeOption) {
110132
return undefined;
111133
}
134+
let start = new Date();
135+
if (startDate !== undefined) {
136+
start = startDate;
137+
} else {
138+
start = getStartDateFromCurrent(timeRangeOption);
139+
}
140+
141+
const end = new Date(start);
112142
switch (timeRangeOption.type) {
113143
case 'day':
114-
start.setDate(end.getDate() - 1);
144+
end.setDate(start.getDate() + 1);
145+
console.log(startDate, start, end);
115146
return { type: timeRangeOption, startTime: start, endTime: end };
116147
case 'week':
117-
start.setDate(end.getDate() - 7);
118-
start.setHours(0, 0, 0, 0); // Round down start date
119-
end.setHours(23, 59, 59, 999); // Round up end date
148+
end.setDate(start.getDate() + 7);
120149
return { type: timeRangeOption, startTime: start, endTime: end };
121150
case 'month':
122-
start.setMonth(end.getMonth() - 1);
123-
start.setHours(0, 0, 0, 0); // Round down start date
124-
end.setHours(23, 59, 59, 999); // Round up end date
151+
end.setMonth(start.getMonth() + 1);
125152
return { type: timeRangeOption, startTime: start, endTime: end };
126153
case 'all':
127154
start = new Date('January 1, 2023 00:00:00');
128-
return { type: timeRangeOption, startTime: start, endTime: end };
155+
return { type: timeRangeOption, startTime: start, endTime: new Date() };
129156
default:
130157
return { type: timeRangeOption, startTime: start, endTime: end };
131158
}
@@ -134,10 +161,22 @@ const StatsView = () => {
134161
return (
135162
<Grid m={4} h='100%' w='auto' templateRows='30px 1fr 30px 1fr' templateColumns='repeat(6, 1fr)' gap={4}>
136163
<GridItem rowSpan={1} colSpan={6}>
137-
<Flex justifyContent='space-between'>
138-
<Text fontSize='3xl' fontWeight='semibold' mb={3}>
164+
<Flex justifyContent='flex-end' alignItems='center'>
165+
<Text fontSize='3xl' fontWeight='semibold' mb={3} mr="auto">
139166
Global Statistics
140167
</Text>
168+
<Text mr={3}>Start Date:</Text>
169+
<Input
170+
mr={3}
171+
width="250px"
172+
placeholder="Select Date and Time"
173+
size="md"
174+
type="datetime-local"
175+
onChange={event =>
176+
setGlobalStartDate(event.target.value === "" ? undefined : new Date(event.target.value))
177+
}
178+
/>
179+
<Text mr={3}>Range:</Text>
141180
<Select
142181
value={globalTimeRangeOption}
143182
onChange={val => setGlobalTimeRangeOption(val ?? undefined)}
@@ -152,20 +191,32 @@ const StatsView = () => {
152191
</Flex>
153192
</GridItem>
154193
<GridItem rowSpan={1} colSpan={4}>
155-
<StatsGraph timeRange={getTimeRange(globalTimeRangeOption?.value, new Date())} stats={ticketStats} />
194+
<StatsGraph timeRange={getTimeRange(globalTimeRangeOption?.value, globalStartDate)} stats={ticketStats} />
156195
</GridItem>
157196
<GridItem mt={4} rowSpan={1} colSpan={2}>
158197
{isStatsLoading || isPersonalStatsLoading ? (
159198
<Spinner />
160199
) : (
161-
<StatsPanel timeRange={getTimeRange(globalTimeRangeOption?.value, new Date())} stats={ticketStats} />
200+
<StatsPanel timeRange={getTimeRange(globalTimeRangeOption?.value, globalStartDate)} stats={ticketStats} />
162201
)}
163202
</GridItem>
164203
<GridItem rowSpan={1} colSpan={6}>
165-
<Flex justifyContent='space-between'>
166-
<Text fontSize='3xl' fontWeight='semibold' mb={3}>
204+
<Flex justifyContent='flex-end' alignItems="center">
205+
<Text fontSize='3xl' fontWeight='semibold' mb={3} mr="auto">
167206
Personal Statistics
168207
</Text>
208+
<Text mr={3}>Start Date:</Text>
209+
<Input
210+
mr={3}
211+
width="250px"
212+
placeholder="Select Date and Time"
213+
size="md"
214+
type="datetime-local"
215+
onChange={event =>
216+
setPersonalStartDate(event.target.value === "" ? undefined : new Date(event.target.value))
217+
}
218+
/>
219+
<Text mr={3}>Range:</Text>
169220
<Select
170221
value={personalTimeRangeOption}
171222
onChange={val => setPersonalTimeRangeOption(val ?? undefined)}
@@ -180,14 +231,14 @@ const StatsView = () => {
180231
</Flex>
181232
</GridItem>
182233
<GridItem rowSpan={1} colSpan={4}>
183-
<StatsGraph timeRange={getTimeRange(personalTimeRangeOption?.value, new Date())} stats={personalTicketStats} />
234+
<StatsGraph timeRange={getTimeRange(personalTimeRangeOption?.value, personalStartDate)} stats={personalTicketStats} />
184235
</GridItem>
185236
<GridItem mt={4} rowSpan={1} colSpan={2}>
186237
{isStatsLoading || isPersonalStatsLoading ? (
187238
<Spinner />
188239
) : (
189240
<StatsPanel
190-
timeRange={getTimeRange(personalTimeRangeOption?.value, new Date())}
241+
timeRange={getTimeRange(personalTimeRangeOption?.value, personalStartDate)}
191242
stats={personalTicketStats}
192243
/>
193244
)}

0 commit comments

Comments
 (0)