1212<link rel =" stylesheet" type =" text/css" href =" form_style.css" />
1313<title >MerlinAU add-on for ASUSWRT-Merlin Firmware</title >
1414<style >
15- .SettingsTable .Invalid {background-color : red !important ;}
16- .SettingsTable .Disabled {background-color :#ccc ;color :#888 }
15+ /* Existing validation states */
16+ .SettingsTable .Invalid {
17+ background-color : red !important ;
18+ color : #fff !important ;
19+ }
20+
21+ .SettingsTable .Disabled {
22+ background-color :#ccc !important ;
23+ color : #888 !important ;
24+ }
25+
26+ /* MerlinAU modern UI overrides */
27+ .FormTitle {
28+ border-radius : 18px !important ;
29+ overflow : hidden ;
30+ border : 1px solid rgba (255 ,255 ,255 ,0.12 );
31+ box-shadow : 0 18px 45px rgba (0 ,0 ,0 ,0.35 );
32+ background : linear-gradient (145deg , #3f4a4f 0% , #2f383d 100% ) !important ;
33+ }
34+
35+ /* Main panel background */
36+ .FormTitle > tbody > tr > td {
37+ background :
38+ radial-gradient (circle at top left , rgba (70 ,145 ,180 ,0.18 ), transparent 35% ),
39+ linear-gradient (145deg , #465156 0% , #313b40 100% ) !important ;
40+ padding : 18px !important ;
41+ }
42+
43+ /* Page title */
44+ #headerTitle {
45+ font-size : 26px !important ;
46+ letter-spacing : 0.5px ;
47+ text-shadow : 0 2px 8px rgba (0 ,0 ,0 ,0.45 );
48+ }
49+
50+ /* Description area */
51+ .formfontdesc {
52+ background : rgba (255 ,255 ,255 ,0.06 );
53+ border : 1px solid rgba (255 ,255 ,255 ,0.10 );
54+ border-radius : 12px ;
55+ padding : 12px 14px ;
56+ line-height : 1.5 ;
57+ }
58+
59+ /* Section cards */
60+ .FormTable ,
61+ .SettingsTable {
62+ border-collapse : separate !important ;
63+ border-spacing : 0 !important ;
64+ border-radius : 14px ;
65+ overflow : hidden ;
66+ background : rgba (20 ,25 ,28 ,0.35 ) !important ;
67+ border : 1px solid rgba (255 ,255 ,255 ,0.10 ) !important ;
68+ box-shadow : 0 8px 22px rgba (0 ,0 ,0 ,0.22 );
69+ margin-bottom : 14px ;
70+ }
71+
72+ /* Section headers */
73+ .FormTable thead td ,
74+ .SettingsTable thead td ,
75+ .collapsible-jquery td {
76+ background : linear-gradient (135deg , #24333a 0% , #1a252b 100% ) !important ;
77+ color : #f4f8fb !important ;
78+ font-weight : bold ;
79+ letter-spacing : 0.2px ;
80+ padding : 10px 12px !important ;
81+ border-bottom : 1px solid rgba (255 ,255 ,255 ,0.10 ) !important ;
82+ }
83+
84+ /* Clickable/collapsible headers */
85+ .collapsible-jquery {
86+ cursor : pointer ;
87+ }
88+
89+ .collapsible-jquery td :hover {
90+ background : linear-gradient (135deg , #2d4651 0% , #20333c 100% ) !important ;
91+ }
92+
93+ /* Table rows - reduced padding to avoid fixed-width ASUSWRT wrapping */
94+ .FormTable td ,
95+ .SettingsTable td {
96+ border-color : rgba (255 ,255 ,255 ,0.08 ) !important ;
97+ padding : 6px 8px !important ;
98+ box-sizing : border-box ;
99+ }
100+
101+ /* Row hover */
102+ .FormTable tbody tr :hover ,
103+ .SettingsTable tbody tr :hover {
104+ background : rgba (255 ,255 ,255 ,0.045 ) !important ;
105+ }
106+
107+ /* Keep left-side labels from wrapping */
108+ .FormTable td :first-child ,
109+ .SettingsTable td :first-child {
110+ white-space : nowrap ;
111+ }
112+
113+ /* Keep important status/value fields on one line */
114+ #fwVersionInstalled ,
115+ #fwUpdateAvailable ,
116+ #fwNotificationsDate ,
117+ #firmwareProductModelID ,
118+ #firmwareProductModel ,
119+ #firmwareVariant ,
120+ #changelogApprovalStatus ,
121+ #fwUpdateCheckStatus ,
122+ #changelogCheckStatus ,
123+ #betaToReleaseStatus ,
124+ #tailscaleVPNStatus ,
125+ #automaticBackupsStatus ,
126+ #scriptAutoUpdateStatus ,
127+ #emailNotificationsStatus {
128+ white-space : nowrap !important ;
129+ }
130+
131+ /* Inputs/selects */
132+ input [type = " text" ],
133+ input [type = " password" ],
134+ input [type = " email" ],
135+ select ,
136+ textarea {
137+ border-radius : 9px !important ;
138+ border : 1px solid rgba (255 ,255 ,255 ,0.18 ) !important ;
139+ background : #20292e !important ;
140+ color : #f1f5f7 !important ;
141+ padding : 6px 8px !important ;
142+ box-shadow : inset 0 1px 4px rgba (0 ,0 ,0 ,0.35 );
143+ box-sizing : border-box ;
144+ }
145+
146+ input [type = " text" ]:focus ,
147+ input [type = " password" ]:focus ,
148+ input [type = " email" ]:focus ,
149+ select :focus ,
150+ textarea :focus {
151+ outline : none ;
152+ border-color : #5fb3d1 !important ;
153+ box-shadow :
154+ 0 0 0 2px rgba (95 ,179 ,209 ,0.20 ),
155+ inset 0 1px 4px rgba (0 ,0 ,0 ,0.35 );
156+ }
157+
158+ /* Fix narrow schedule number boxes */
159+ #fwScheduleHOUR ,
160+ #fwScheduleMINS ,
161+ #fwScheduleXDAYS ,
162+ #fwUpdatePostponement {
163+ width : 48px !important ;
164+ min-width : 48px !important ;
165+ height : 28px !important ;
166+ line-height : 20px !important ;
167+ padding : 3px 8px !important ;
168+ text-align : center ;
169+ box-sizing : border-box ;
170+ overflow : visible ;
171+ }
172+
173+ /* Slightly smaller box for "Every X days" */
174+ #fwScheduleXDAYS {
175+ width : 42px !important ;
176+ min-width : 42px !important ;
177+ margin-left : 6px ;
178+ margin-right : 6px ;
179+ }
180+
181+ /* Better spacing for schedule checkbox labels */
182+ #fwSchedBoxDAYS1 ,
183+ #fwSchedBoxDAYSX ,
184+ #fwSched_SUN ,
185+ #fwSched_MON ,
186+ #fwSched_TUE ,
187+ #fwSched_WED ,
188+ #fwSched_THU ,
189+ #fwSched_FRI ,
190+ #fwSched_SAT {
191+ margin-left : 6px ;
192+ margin-right : 4px ;
193+ vertical-align : middle ;
194+ }
195+
196+ /* Keep schedule controls aligned */
197+ #fwScheduleHOUR ,
198+ #fwScheduleMINS ,
199+ #fwScheduleXDAYS {
200+ margin-right : 6px ;
201+ vertical-align : middle ;
202+ }
203+
204+ /* Checkboxes */
205+ input [type = " checkbox" ] {
206+ transform : scale (1.08 );
207+ cursor : pointer ;
208+ }
209+
210+ /* Buttons - modern look without breaking fixed ASUSWRT button widths */
211+ .button_gen ,
212+ button ,
213+ input [type = " button" ],
214+ input [type = " submit" ] {
215+ border-radius : 999px !important ;
216+ border : 1px solid rgba (255 ,255 ,255 ,0.14 ) !important ;
217+ background : linear-gradient (135deg , #307f9d 0% , #1f5f78 100% ) !important ;
218+ color : #fff !important ;
219+ font-weight : bold ;
220+ padding : 5px 10px !important ;
221+ cursor : pointer ;
222+ box-shadow : 0 5px 14px rgba (0 ,0 ,0 ,0.28 );
223+ transition : all 0.15s ease-in-out ;
224+ box-sizing : border-box ;
225+ white-space : nowrap ;
226+ overflow : hidden ;
227+ text-overflow : clip ;
228+ }
229+
230+ .button_gen :hover ,
231+ button :hover ,
232+ input [type = " button" ]:hover ,
233+ input [type = " submit" ]:hover {
234+ transform : translateY (-1px );
235+ background : linear-gradient (135deg , #3b98ba 0% , #28728e 100% ) !important ;
236+ box-shadow : 0 8px 18px rgba (0 ,0 ,0 ,0.35 );
237+ }
238+
239+ .button_gen :active ,
240+ button :active ,
241+ input [type = " button" ]:active ,
242+ input [type = " submit" ]:active {
243+ transform : translateY (0 );
244+ box-shadow : 0 3px 8px rgba (0 ,0 ,0 ,0.30 );
245+ }
246+
247+ /* Action button spacing/fix for text getting clipped */
248+ #FW_Update_Check ,
249+ #Latest_Changelog ,
250+ #Script_Update_Check ,
251+ #Uninstall_Script ,
252+ input [value = " F/W Update Check" ],
253+ input [value = " Latest Changelog" ],
254+ input [value = " Script Update Check" ],
255+ input [value = " Uninstall" ] {
256+ min-width : 160px !important ;
257+ max-width : none !important ;
258+ }
259+
260+ /* Status labels/badges */
261+ [id $= " Status" ],
262+ [id $= " StatusText" ],
263+ [id $= " Available" ] {
264+ border-radius : 8px ;
265+ }
266+
267+ /* Changelog modal polish */
268+ #changelogModal {
269+ backdrop-filter : blur (3px );
270+ }
271+
272+ #changelogContent {
273+ border-radius : 16px !important ;
274+ border : 1px solid rgba (255 ,255 ,255 ,0.20 );
275+ box-shadow : 0 22px 60px rgba (0 ,0 ,0 ,0.55 );
276+ }
277+
278+ /* Keep the old ASUS layout width but make it feel less cramped */
279+ table .content {
280+ margin-top : 10px !important ;
281+ }
17282 </style >
18283<!-- Native built-in JS files -->
19284<script language =" JavaScript" type =" text/javascript" src =" /js/jquery.js" ></script >
@@ -2531,15 +2796,18 @@ function UpdateMerlinAUScript()
25312796}
25322797
25332798/** ----------------------------------------**/
2534- /** Modified by Martinski W. [2025-May-11 ] **/
2799+ /** Modified by ExtremeFiretop [2026-Apr-27 ] **/
25352800/** ----------------------------------------**/
25362801function CheckFirmwareUpdate ()
25372802{
25382803 console .log (" Initiating F/W Update Check..." );
25392804
25402805 let actionScriptValue;
25412806 let bypassPostponedDays = document .getElementById (' BypassPostponedDays' );
2542- if (! bypassPostponedDays .checked )
2807+ let isBypassPostponedDays =
2808+ bypassPostponedDays ? bypassPostponedDays .checked : false ;
2809+
2810+ if (! isBypassPostponedDays)
25432811 {
25442812 actionScriptValue = ' start_MerlinAUcheckfwupdate' ;
25452813 if (! confirm (" NOTE:\n If you have no postponement days set or remaining, the firmware may flash NOW!\n This means logging you out of the WebUI and rebooting the router.\n Continue to check for firmware updates now?" ))
@@ -2552,8 +2820,56 @@ function CheckFirmwareUpdate()
25522820 { return ; }
25532821 }
25542822
2823+ let fwVersionInstalled = GetInstalledFWVersionFromUI ();
2824+ let fwUpdateAvailable = FW_NewUpdateVersAvailable || ' ' ;
2825+
2826+ let usePrereleaseRank =
2827+ (custom_settings .FW_Allow_Beta_Production_Up === ' ENABLED' );
2828+
2829+ let verNumAvailable =
2830+ FWVersionStrToNum (fwUpdateAvailable, usePrereleaseRank);
2831+
2832+ let verNumInstalled =
2833+ FWVersionStrToNum (fwVersionInstalled, usePrereleaseRank);
2834+
2835+ let isFwUpdateAvailable =
2836+ (verNumAvailable !== 0 && verNumAvailable > verNumInstalled);
2837+
2838+ let fwUpdatePostponement =
2839+ document .getElementById (' fwUpdatePostponement' );
2840+
2841+ let postponedDaysValue = fwUpdatePostponement
2842+ ? fwUpdatePostponement .value
2843+ : custom_settings .FW_New_Update_Postponement_Days ;
2844+
2845+ let postponedDays = parseInt (postponedDaysValue || ' 0' , 10 );
2846+
2847+ if (isNaN (postponedDays))
2848+ { postponedDays = 0 ; }
2849+
2850+ let hasPostponementConfigured = (postponedDays > 0 );
2851+
2852+ let actionWaitSeconds = 60 ;
2853+
2854+ if (isBypassPostponedDays || isFwUpdateAvailable)
2855+ {
2856+ actionWaitSeconds = 180 ;
2857+ }
2858+ else if (! isFwUpdateAvailable &&
2859+ hasPostponementConfigured &&
2860+ ! isBypassPostponedDays)
2861+ {
2862+ actionWaitSeconds = 30 ;
2863+ }
2864+
25552865 document .form .action_script .value = actionScriptValue;
2556- document .form .action_wait .value = 60 ;
2866+ document .form .action_wait .value = actionWaitSeconds;
2867+
2868+ ConsoleLogDEBUG (
2869+ " F/W Update Check action_wait:" ,
2870+ document .form .action_wait .value
2871+ );
2872+
25572873 showLoading ();
25582874 document .form .submit ();
25592875}
0 commit comments