@@ -10,13 +10,15 @@ type IFormDateInputProps = {
1010 placeHolder ?: string ;
1111 width ?: string ;
1212 isRequired ?: boolean ;
13+ useCurrentTimeOnEmpty ?: boolean ;
1314} & DatePickerProps < Dayjs > ;
1415
1516const ControlledDateTimeField : FC < IFormDateInputProps > = ( {
1617 name,
1718 placeHolder = DATE_FORMAT ,
1819 isRequired = false ,
1920 width = "100%" ,
21+ useCurrentTimeOnEmpty = false ,
2022 ...otherProps
2123} ) => {
2224 const {
@@ -29,21 +31,38 @@ const ControlledDateTimeField: FC<IFormDateInputProps> = ({
2931 const dateValue = fieldValue ? dayjs ( fieldValue ) : null ;
3032 // Format function to add leading zeros
3133 const formatTimeValue = ( value : number | string ) : string => {
32- if ( value === 0 || value === "" ) return "" ;
33- return typeof value === "number" ? value . toString ( ) . padStart ( 2 , "0" ) : value ;
34+ if ( value === "" ) return "" ;
35+ const numValue = typeof value === "number" ? value : parseInt ( value . toString ( ) ) ;
36+ return numValue . toString ( ) . padStart ( 2 , "0" ) ;
3437 } ;
3538
36- const [ hour , setHour ] = useState ( dateValue && dateValue . hour ( ) !== 0 ? formatTimeValue ( dateValue . hour ( ) ) : "" ) ;
37- const [ minute , setMinute ] = useState ( dateValue && dateValue . minute ( ) !== 0 ? formatTimeValue ( dateValue . minute ( ) ) : "" ) ;
39+ const [ hour , setHour ] = useState ( dateValue ? formatTimeValue ( dateValue . hour ( ) ) : "" ) ;
40+ const [ minute , setMinute ] = useState ( dateValue ? formatTimeValue ( dateValue . minute ( ) ) : "" ) ;
3841
3942 // Sync local state with field value when it changes externally
4043 useEffect ( ( ) => {
4144 if ( fieldValue ) {
4245 const date = dayjs ( fieldValue ) ;
43- setHour ( date . hour ( ) === 0 ? "" : formatTimeValue ( date . hour ( ) ) ) ;
44- setMinute ( date . minute ( ) === 0 ? "" : formatTimeValue ( date . minute ( ) ) ) ;
46+ if ( useCurrentTimeOnEmpty ) {
47+ const now = dayjs ( ) ;
48+ const storedHour = date . hour ( ) ;
49+ const storedMinute = date . minute ( ) ;
50+ const currentHour = now . hour ( ) ;
51+ const currentMinute = now . minute ( ) ;
52+
53+ if ( storedHour !== currentHour || storedMinute !== currentMinute ) {
54+ setHour ( formatTimeValue ( storedHour ) ) ;
55+ setMinute ( formatTimeValue ( storedMinute ) ) ;
56+ } else {
57+ setHour ( "" ) ;
58+ setMinute ( "" ) ;
59+ }
60+ } else {
61+ setHour ( formatTimeValue ( date . hour ( ) ) ) ;
62+ setMinute ( formatTimeValue ( date . minute ( ) ) ) ;
63+ }
4564 }
46- } , [ fieldValue ] ) ;
65+ } , [ fieldValue , useCurrentTimeOnEmpty ] ) ;
4766
4867 return (
4968 < Controller
@@ -62,11 +81,30 @@ const ControlledDateTimeField: FC<IFormDateInputProps> = ({
6281 return ;
6382 }
6483
65- // Allow empty values in hour/minute fields
66- const hourNum = newHour === "" ? 0 :
67- typeof newHour === "string" ? parseInt ( newHour ) : newHour ;
68- const minuteNum = newMinute === "" ? 0 :
69- typeof newMinute === "string" ? parseInt ( newMinute ) : newMinute ;
84+ let hourNum : number ;
85+ let minuteNum : number ;
86+
87+ if ( useCurrentTimeOnEmpty && newHour === "" && newMinute === "" ) {
88+ const now = dayjs ( ) ;
89+ hourNum = now . hour ( ) ;
90+ minuteNum = now . minute ( ) ;
91+ } else {
92+
93+ if ( newHour === "" ) {
94+ hourNum = 0 ;
95+ } else if ( typeof newHour === "string" ) {
96+ hourNum = parseInt ( newHour ) ;
97+ } else {
98+ hourNum = newHour ;
99+ }
100+ if ( newMinute === "" ) {
101+ minuteNum = 0 ;
102+ } else if ( typeof newMinute === "string" ) {
103+ minuteNum = parseInt ( newMinute ) ;
104+ } else {
105+ minuteNum = newMinute ;
106+ }
107+ }
70108
71109 // Only proceed if we have valid numbers
72110 if ( ! isNaN ( hourNum ) && ! isNaN ( minuteNum ) ) {
@@ -90,13 +128,27 @@ const ControlledDateTimeField: FC<IFormDateInputProps> = ({
90128 value = { field . value ? dayjs ( field . value ) : null }
91129 onChange = { ( date : Dayjs | null ) => {
92130 if ( date ) {
93- // Get current hour and minute from the date
94- const currentHour = date . hour ( ) ;
95- const currentMinute = date . minute ( ) ;
96-
97- // Set empty string for 0 values, format others with padding
98- setHour ( currentHour === 0 ? "" : formatTimeValue ( currentHour ) ) ;
99- setMinute ( currentMinute === 0 ? "" : formatTimeValue ( currentMinute ) ) ;
131+ if ( useCurrentTimeOnEmpty ) {
132+ const dateHour = date . hour ( ) ;
133+ const dateMinute = date . minute ( ) ;
134+ const now = dayjs ( ) ;
135+ const currentHour = now . hour ( ) ;
136+ const currentMinute = now . minute ( ) ;
137+
138+ if ( dateHour !== currentHour || dateMinute !== currentMinute ) {
139+ setHour ( formatTimeValue ( dateHour ) ) ;
140+ setMinute ( formatTimeValue ( dateMinute ) ) ;
141+ } else {
142+ setHour ( "" ) ;
143+ setMinute ( "" ) ;
144+ }
145+ } else {
146+ const currentHour = date . hour ( ) ;
147+ const currentMinute = date . minute ( ) ;
148+
149+ setHour ( currentHour === 0 ? "" : formatTimeValue ( currentHour ) ) ;
150+ setMinute ( currentMinute === 0 ? "" : formatTimeValue ( currentMinute ) ) ;
151+ }
100152
101153 updateDateTime ( date ) ;
102154 } else {
@@ -170,13 +222,13 @@ const ControlledDateTimeField: FC<IFormDateInputProps> = ({
170222 onBlur = { ( e ) => {
171223 // Format on blur for padding zeros
172224 if ( e . target . value === "" ) {
225+ setHour ( "" ) ;
173226 if ( field . value ) {
174- updateDateTime ( dayjs ( field . value ) , 0 , minute ) ;
227+ updateDateTime ( dayjs ( field . value ) , "" , minute ) ;
175228 }
176229 } else {
177230 const hourNum = parseInt ( e . target . value ) ;
178- if ( ! isNaN ( hourNum ) && hourNum > 0 ) {
179- // Apply padding only on blur
231+ if ( ! isNaN ( hourNum ) && hourNum >= 0 ) {
180232 setHour ( formatTimeValue ( hourNum ) ) ;
181233 }
182234 }
@@ -230,13 +282,13 @@ const ControlledDateTimeField: FC<IFormDateInputProps> = ({
230282 onBlur = { ( e ) => {
231283 // Format on blur for padding zeros
232284 if ( e . target . value === "" ) {
285+ setMinute ( "" ) ;
233286 if ( field . value ) {
234- updateDateTime ( dayjs ( field . value ) , hour , 0 ) ;
287+ updateDateTime ( dayjs ( field . value ) , hour , "" ) ;
235288 }
236289 } else {
237290 const minuteNum = parseInt ( e . target . value ) ;
238- if ( ! isNaN ( minuteNum ) && minuteNum > 0 ) {
239- // Apply padding only on blur
291+ if ( ! isNaN ( minuteNum ) && minuteNum >= 0 ) {
240292 setMinute ( formatTimeValue ( minuteNum ) ) ;
241293 }
242294 }
0 commit comments