@@ -12,12 +12,14 @@ import '../../Header/DarkMode.css'
1212import { isEmpty , isEqual } from 'lodash' ;
1313import { getUserProfile } from '~/actions/userProfile' ;
1414import { postTimeEntry } from '~/actions/timeEntries' ;
15+ import { toast } from 'react-toastify' ;
1516
1617function AddLostTime ( props ) {
1718
1819 const darkMode = useSelector ( ( state ) => state . theme . darkMode ) ;
1920 const fontColor = getFontColor ( darkMode ) ;
2021 const boxStyling = getBoxStyling ( darkMode ) ;
22+ const MAX_HOURS_PER_ENTRY = 40 ;
2123
2224 const initialForm = {
2325 projectId : undefined ,
@@ -234,51 +236,89 @@ function AddLostTime(props) {
234236 props . toggle ( ) ;
235237 } ;
236238
237- const validateInputs = ( ) => {
238- const result = { } ;
239-
240- const date = moment ( inputs . dateOfWork ) ;
239+ const validateDate = ( dateOfWork ) => {
240+ const errors = { } ;
241+ const date = moment ( dateOfWork ) ;
241242 const today = moment (
242243 moment ( )
243244 . tz ( 'America/Los_Angeles' )
244245 . format ( 'YYYY-MM-DD' ) ,
245246 ) ;
247+
246248 if ( ! date . isValid ( ) ) {
247- result . dateOfWork = 'Invalid date' ;
248- } else if (
249- today . diff ( date , 'days' ) < 0
250- ) {
251- result . dateOfWork = 'Cannot add lost time for future dates.' ;
249+ errors . dateOfWork = 'Invalid date' ;
250+ } else if ( today . diff ( date , 'days' ) < 0 ) {
251+ errors . dateOfWork = 'Cannot add lost time for future dates.' ;
252252 }
253253
254- if ( inputs . hours === 0 && inputs . minutes === 0 ) {
255- result . time = 'Time is required' ;
256- } else {
257- const hours = inputs . hours * 1 ;
258- const minutes = inputs . minutes * 1 ;
259- if ( ! Number . isInteger ( hours ) || ! Number . isInteger ( minutes ) ) {
260- result . time = 'Hours and minutes should be integers' ;
261- }
262- if ( hours < 0 || minutes < 0 ) {
263- result . time = 'Time should be greater than 0' ;
264- }
254+ return errors ;
255+ } ;
256+
257+ const getTimeError = ( hoursInput , minutesInput ) => {
258+ const hours = Number ( hoursInput ) ;
259+ const minutes = Number ( minutesInput ) ;
260+
261+ if ( Number . isNaN ( hours ) || Number . isNaN ( minutes ) || ( hours === 0 && minutes === 0 ) ) {
262+ return 'Time is required' ;
265263 }
264+
265+ if ( ! Number . isInteger ( hours ) || ! Number . isInteger ( minutes ) ) {
266+ return 'Hours and minutes should be integers' ;
267+ }
268+
269+ if ( hours < 0 || minutes < 0 ) {
270+ return 'Time should be greater than 0' ;
271+ }
272+
273+ const totalMinutes = hours * 60 + minutes ;
274+ const maxMinutes = MAX_HOURS_PER_ENTRY * 60 ;
275+
276+ if ( totalMinutes > maxMinutes ) {
277+ toast . error (
278+ "Hold up, workhorse! You’ve hit the 40-hour limit for a single entry. You can pop in a new time log for any additional hours." ,
279+ { autoClose : 5000 }
280+ ) ;
281+ return `You can’t log more than ${ MAX_HOURS_PER_ENTRY } hours in a single entry.` ;
282+ }
283+
284+ return null ;
285+ } ;
286+
287+ const validateEntryType = ( entryType , inputs ) => {
288+ const errors = { } ;
289+
266290 if ( entryType === '' ) {
267- result . events = 'Type is required' ;
291+ errors . events = 'Type is required' ;
292+ return errors ;
268293 }
294+
269295 if ( entryType === 'project' && inputs . projectId === undefined ) {
270- result . projectId = 'Project is required' ;
296+ errors . projectId = 'Project is required' ;
297+ } else if ( entryType === 'person' && inputs . personId === undefined ) {
298+ errors . personId = 'Person is required' ;
299+ } else if ( entryType === 'team' && inputs . teamId === undefined ) {
300+ errors . teamId = 'Team is required' ;
271301 }
272- if ( entryType === 'person' && inputs . personId === undefined ) {
273- result . personId = 'Person is required' ;
274- }
275- if ( entryType === 'team' && inputs . teamId === undefined ) {
276- result . teamId = 'Team is required' ;
302+
303+ return errors ;
304+ } ;
305+
306+ const validateInputs = ( ) => {
307+ const result = { } ;
308+
309+ Object . assign ( result , validateDate ( inputs . dateOfWork ) ) ;
310+
311+ const timeError = getTimeError ( inputs . hours , inputs . minutes ) ;
312+ if ( timeError ) {
313+ result . time = timeError ;
277314 }
278315
316+ Object . assign ( result , validateEntryType ( entryType , inputs ) ) ;
317+
279318 setErrors ( result ) ;
280319 return isEmpty ( result ) ;
281320 } ;
321+
282322
283323 const handleSubmit = async event => {
284324 if ( event ) event . preventDefault ( ) ;
0 commit comments