@@ -7,10 +7,7 @@ const selectedGroupIds = new Set(
77const trafficLimitGB = isEditMode ? Math .round ((user .trafficLimit || 0 ) / (1024 * 1024 * 1024 )) : 0 ;
88const maxDevicesValue = isEditMode ? (parseInt (user .maxDevices , 10 ) || 0 ) : 0 ;
99const hasExpireAt = isEditMode && user .expireAt ;
10- const expireAtDate = hasExpireAt ? new Date (user .expireAt ) : null ;
11- const expireAtLocalValue = expireAtDate && ! Number .isNaN (expireAtDate .getTime ())
12- ? new Date (expireAtDate .getTime () - (expireAtDate .getTimezoneOffset () * 60000 )).toISOString ().slice (0 , 16 )
13- : ' ' ;
10+ const expireAtIso = hasExpireAt ? new Date (user .expireAt ).toISOString () : ' ' ;
1411%>
1512<div class =" page-header" >
1613 <a href =" /panel/users" class =" btn btn-back" ><%= t (' common.backToList' ) %> </a >
@@ -93,11 +90,11 @@ const expireAtLocalValue = expireAtDate && !Number.isNaN(expireAtDate.getTime())
9390
9491 <div class =" form-group" id =" expireDatetimeGroup" style =" display : <%= hasExpireAt ? ' block' : ' none' %>;" >
9592 <label for =" expireAtLocal" ><%= t (' users.expireAtLabel' ) %> </label >
96- <input type =" datetime-local" id =" expireAtLocal" name =" expireAtLocal" class =" datetime-input" value =" <%= expireAtLocalValue %>" >
93+ <input type =" datetime-local" id =" expireAtLocal" name =" expireAtLocal" class =" datetime-input" data-utc =" <%= expireAtIso %>" >
9794 <small ><%= t (' users.expireAtHint' ) %> </small >
9895 </div >
9996
100- <input type =" hidden" id =" expireAt" name =" expireAt" value =" <%= hasExpireAt ? new Date(user.expireAt).toISOString() : '' %>" >
97+ <input type =" hidden" id =" expireAt" name =" expireAt" value =" <%= expireAtIso %>" >
10198
10299 <div class =" form-group" >
103100 <label class =" checkbox-label" >
@@ -123,14 +120,28 @@ const expireAtLocalValue = expireAtDate && !Number.isNaN(expireAtDate.getTime())
123120 const expireAtInput = document .getElementById (' expireAt' );
124121 const form = document .getElementById (' userForm' );
125122
126- function updateExpireMode () {
123+ function utcToLocal (isoString ) {
124+ if (! isoString) return ' ' ;
125+ const d = new Date (isoString);
126+ if (Number .isNaN (d .getTime ())) return ' ' ;
127+ const local = new Date (d .getTime () - d .getTimezoneOffset () * 60000 );
128+ return local .toISOString ().slice (0 , 16 );
129+ }
130+
131+ function initExpireAtLocal () {
132+ const utc = expireAtLocalInput .dataset .utc ;
133+ if (utc) {
134+ expireAtLocalInput .value = utcToLocal (utc);
135+ }
136+ }
137+
138+ function updateExpireMode (skipInit ) {
127139 const selectedMode = document .querySelector (' input[name="expireMode"]:checked' ).value ;
128140
129141 if (selectedMode === ' datetime' ) {
130142 expireDaysGroup .style .display = ' none' ;
131143 expireDatetimeGroup .style .display = ' block' ;
132144 expireDaysInput .value = ' ' ;
133- syncExpireAt ();
134145 } else {
135146 expireDaysGroup .style .display = ' block' ;
136147 expireDatetimeGroup .style .display = ' none' ;
@@ -155,7 +166,7 @@ const expireAtLocalValue = expireAtDate && !Number.isNaN(expireAtDate.getTime())
155166 }
156167
157168 expireModeInputs .forEach ((input ) => {
158- input .addEventListener (' change' , updateExpireMode);
169+ input .addEventListener (' change' , () => updateExpireMode () );
159170 });
160171
161172 expireAtLocalInput .addEventListener (' change' , syncExpireAt);
@@ -174,6 +185,7 @@ const expireAtLocalValue = expireAtDate && !Number.isNaN(expireAtDate.getTime())
174185 syncExpireAt ();
175186 });
176187
188+ initExpireAtLocal ();
177189 updateExpireMode ();
178190 })();
179191 </script >
0 commit comments