Skip to content

Commit a994783

Browse files
Update Styles for MerlinAU Dashboard
1. Update Styles for MerlinAU Dashboard 2. Speed up Node Check from 8 seconds to 5 seconds 3. Speed up WebUI "F/W Update Check" to 30 seconds from 60 seconds if no updates are detected at the time the button is pressed, otherwise if an update is detected or postpone is bypassed, we now extend the refresh to 3 minutes.
1 parent a7058a2 commit a994783

2 files changed

Lines changed: 327 additions & 11 deletions

File tree

MerlinAU.asp

Lines changed: 321 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,273 @@
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
/**----------------------------------------**/
25362801
function 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:\nIf you have no postponement days set or remaining, the firmware may flash NOW!\nThis means logging you out of the WebUI and rebooting the router.\nContinue 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
}

MerlinAU.sh

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
#
55
# Original Creation Date: 2023-Oct-01 by @ExtremeFiretop.
66
# Official Co-Author: @Martinski W. - Date: 2023-Nov-01
7-
# Last Modified: 2026-Apr-08
7+
# Last Modified: 2026-Apr-27
88
###################################################################
99
set -u
1010

1111
## Set version for each Production Release ##
12-
readonly SCRIPT_VERSION=1.6.1
13-
readonly SCRIPT_VERSTAG="26040823"
12+
readonly SCRIPT_VERSION=1.6.2
13+
readonly SCRIPT_VERSTAG="26042703"
1414
readonly SCRIPT_NAME="MerlinAU"
1515
## Set to "master" for Production Releases ##
16-
SCRIPT_BRANCH="master"
16+
SCRIPT_BRANCH="dev"
1717

1818
##----------------------------------------##
1919
## Modified by Martinski W. [2024-Jul-03] ##
@@ -1028,7 +1028,7 @@ else
10281028
## Set 20 minutes AFTER for APs and AiMesh Nodes ##
10291029
readonly FW_Update_CRON_DefaultSchedule="20 0 * * *"
10301030
fi
1031-
readonly meshUpdate_WaitSecs=8
1031+
readonly meshUpdate_WaitSecs=5
10321032

10331033
## Recommended 15 minutes BEFORE the F/W Update ##
10341034
readonly ScriptAU_CRON_DefaultSchedule="45 23 * * *"
@@ -10624,7 +10624,7 @@ _ProcessMeshNodes_()
1062410624
wait
1062510625

1062610626
# ---- Single wait ---- #
10627-
local waitSeconds="${meshUpdate_WaitSecs:-8}"
10627+
local waitSeconds="${meshUpdate_WaitSecs:-5}"
1062810628
if "$includeExtraLogic"
1062910629
then
1063010630
local waitMsg="Please wait while we query the node(s) for status..."

0 commit comments

Comments
 (0)