1
1
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' ;
3
3
import { Select } from 'chakra-react-select' ;
4
4
import StatsGraph from './StatsGraph' ;
5
5
import { trpc } from '../../utils/trpc' ;
@@ -90,6 +90,8 @@ const StatsView = () => {
90
90
const [ personalTicketStats , setPersonalTicketStats ] = useState < TicketStats [ ] > ( [ ] ) ;
91
91
const [ globalTimeRangeOption , setGlobalTimeRangeOption ] = useState ( timeRangeOptions [ 0 ] ) ;
92
92
const [ personalTimeRangeOption , setPersonalTimeRangeOption ] = useState ( timeRangeOptions [ 0 ] ) ;
93
+ const [ globalStartDate , setGlobalStartDate ] = useState < Date > ( ) ;
94
+ const [ personalStartDate , setPersonalStartDate ] = useState < Date > ( ) ;
93
95
94
96
const { isLoading : isStatsLoading } = trpc . stats . getTicketStats . useQuery ( undefined , {
95
97
refetchOnWindowFocus : false ,
@@ -104,28 +106,53 @@ const StatsView = () => {
104
106
} ,
105
107
} ) ;
106
108
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 => {
109
131
if ( ! timeRangeOption ) {
110
132
return undefined ;
111
133
}
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 ) ;
112
142
switch ( timeRangeOption . type ) {
113
143
case 'day' :
114
- start . setDate ( end . getDate ( ) - 1 ) ;
144
+ end . setDate ( start . getDate ( ) + 1 ) ;
145
+ console . log ( startDate , start , end ) ;
115
146
return { type : timeRangeOption , startTime : start , endTime : end } ;
116
147
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 ) ;
120
149
return { type : timeRangeOption , startTime : start , endTime : end } ;
121
150
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 ) ;
125
152
return { type : timeRangeOption , startTime : start , endTime : end } ;
126
153
case 'all' :
127
154
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 ( ) } ;
129
156
default :
130
157
return { type : timeRangeOption , startTime : start , endTime : end } ;
131
158
}
@@ -134,10 +161,22 @@ const StatsView = () => {
134
161
return (
135
162
< Grid m = { 4 } h = '100%' w = 'auto' templateRows = '30px 1fr 30px 1fr' templateColumns = 'repeat(6, 1fr)' gap = { 4 } >
136
163
< 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" >
139
166
Global Statistics
140
167
</ 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 >
141
180
< Select
142
181
value = { globalTimeRangeOption }
143
182
onChange = { val => setGlobalTimeRangeOption ( val ?? undefined ) }
@@ -152,20 +191,32 @@ const StatsView = () => {
152
191
</ Flex >
153
192
</ GridItem >
154
193
< GridItem rowSpan = { 1 } colSpan = { 4 } >
155
- < StatsGraph timeRange = { getTimeRange ( globalTimeRangeOption ?. value , new Date ( ) ) } stats = { ticketStats } />
194
+ < StatsGraph timeRange = { getTimeRange ( globalTimeRangeOption ?. value , globalStartDate ) } stats = { ticketStats } />
156
195
</ GridItem >
157
196
< GridItem mt = { 4 } rowSpan = { 1 } colSpan = { 2 } >
158
197
{ isStatsLoading || isPersonalStatsLoading ? (
159
198
< Spinner />
160
199
) : (
161
- < StatsPanel timeRange = { getTimeRange ( globalTimeRangeOption ?. value , new Date ( ) ) } stats = { ticketStats } />
200
+ < StatsPanel timeRange = { getTimeRange ( globalTimeRangeOption ?. value , globalStartDate ) } stats = { ticketStats } />
162
201
) }
163
202
</ GridItem >
164
203
< 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" >
167
206
Personal Statistics
168
207
</ 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 >
169
220
< Select
170
221
value = { personalTimeRangeOption }
171
222
onChange = { val => setPersonalTimeRangeOption ( val ?? undefined ) }
@@ -180,14 +231,14 @@ const StatsView = () => {
180
231
</ Flex >
181
232
</ GridItem >
182
233
< GridItem rowSpan = { 1 } colSpan = { 4 } >
183
- < StatsGraph timeRange = { getTimeRange ( personalTimeRangeOption ?. value , new Date ( ) ) } stats = { personalTicketStats } />
234
+ < StatsGraph timeRange = { getTimeRange ( personalTimeRangeOption ?. value , personalStartDate ) } stats = { personalTicketStats } />
184
235
</ GridItem >
185
236
< GridItem mt = { 4 } rowSpan = { 1 } colSpan = { 2 } >
186
237
{ isStatsLoading || isPersonalStatsLoading ? (
187
238
< Spinner />
188
239
) : (
189
240
< StatsPanel
190
- timeRange = { getTimeRange ( personalTimeRangeOption ?. value , new Date ( ) ) }
241
+ timeRange = { getTimeRange ( personalTimeRangeOption ?. value , personalStartDate ) }
191
242
stats = { personalTicketStats }
192
243
/>
193
244
) }
0 commit comments