fix(updates): предотвратить повторные модальные окна и добавить активную проверку готовности сервисов роутера перед перезагрузкой страницы

This commit is contained in:
Dushnilin
2026-08-17 10:27:16 +03:00
parent beb132690e
commit bca948947e
10 changed files with 492 additions and 277 deletions
+74 -39
View File
@@ -507,7 +507,7 @@
"call": "Another component action is already running", "call": "Another component action is already running",
"key": "Another component action is already running", "key": "Another component action is already running",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:844" "src/tachyon/tabs/updates/initController.ts:861"
] ]
}, },
{ {
@@ -1003,7 +1003,7 @@
"call": "Check update", "call": "Check update",
"key": "Check update", "key": "Check update",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:913" "src/tachyon/tabs/updates/initController.ts:930"
] ]
}, },
{ {
@@ -1081,17 +1081,17 @@
"call": "Checks failed", "call": "Checks failed",
"key": "Checks failed", "key": "Checks failed",
"places": [ "places": [
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26", "src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10",
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10" "src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26"
] ]
}, },
{ {
"call": "Checks passed", "call": "Checks passed",
"key": "Checks passed", "key": "Checks passed",
"places": [ "places": [
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13",
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23", "src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23",
"src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43" "src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43",
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13"
] ]
}, },
{ {
@@ -1183,8 +1183,8 @@
"src/tachyon/tabs/monitoring/initController.ts:884", "src/tachyon/tabs/monitoring/initController.ts:884",
"src/tachyon/tabs/monitoring/initController.ts:934", "src/tachyon/tabs/monitoring/initController.ts:934",
"src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212", "src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:374", "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:406",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:419" "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:451"
] ]
}, },
{ {
@@ -2602,7 +2602,7 @@
"src/tachyon/tabs/updates/initController.ts:619", "src/tachyon/tabs/updates/initController.ts:619",
"src/tachyon/tabs/updates/initController.ts:620", "src/tachyon/tabs/updates/initController.ts:620",
"src/tachyon/tabs/updates/initController.ts:695", "src/tachyon/tabs/updates/initController.ts:695",
"src/tachyon/tabs/updates/initController.ts:891" "src/tachyon/tabs/updates/initController.ts:908"
] ]
}, },
{ {
@@ -3422,22 +3422,22 @@
"call": "Install", "call": "Install",
"key": "Install", "key": "Install",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:927", "src/tachyon/tabs/updates/initController.ts:944",
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363" "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:395"
] ]
}, },
{ {
"call": "Install another build:", "call": "Install another build:",
"key": "Install another build:", "key": "Install another build:",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1421" "src/tachyon/tabs/updates/initController.ts:1438"
] ]
}, },
{ {
"call": "Installed build → Available build", "call": "Installed build → Available build",
"key": "Installed build → Available build", "key": "Installed build → Available build",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1279" "src/tachyon/tabs/updates/initController.ts:1296"
] ]
}, },
{ {
@@ -3445,7 +3445,7 @@
"key": "Installed version is newer than release", "key": "Installed version is newer than release",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:341", "src/tachyon/tabs/updates/initController.ts:341",
"src/tachyon/tabs/updates/initController.ts:1287" "src/tachyon/tabs/updates/initController.ts:1304"
] ]
}, },
{ {
@@ -4029,8 +4029,8 @@
"call": "Issues detected", "call": "Issues detected",
"key": "Issues detected", "key": "Issues detected",
"places": [ "places": [
"src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20", "src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17",
"src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17" "src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20"
] ]
}, },
{ {
@@ -4190,14 +4190,14 @@
"key": "Latest version is installed", "key": "Latest version is installed",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:344", "src/tachyon/tabs/updates/initController.ts:344",
"src/tachyon/tabs/updates/initController.ts:1285" "src/tachyon/tabs/updates/initController.ts:1302"
] ]
}, },
{ {
"call": "Latest version:", "call": "Latest version:",
"key": "Latest version:", "key": "Latest version:",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1287" "src/tachyon/tabs/updates/initController.ts:1304"
] ]
}, },
{ {
@@ -4305,11 +4305,11 @@
"call": "Loading...", "call": "Loading...",
"key": "Loading...", "key": "Loading...",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1129", "src/tachyon/tabs/updates/initController.ts:1146",
"src/tachyon/tabs/updates/initController.ts:1144", "src/tachyon/tabs/updates/initController.ts:1161",
"src/tachyon/tabs/updates/initController.ts:1162", "src/tachyon/tabs/updates/initController.ts:1179",
"src/tachyon/tabs/updates/initController.ts:1176", "src/tachyon/tabs/updates/initController.ts:1193",
"src/tachyon/tabs/updates/initController.ts:1190" "src/tachyon/tabs/updates/initController.ts:1207"
] ]
}, },
{ {
@@ -4852,9 +4852,9 @@
"places": [ "places": [
"src/tachyon/helpers/singBoxVariant.ts:38", "src/tachyon/helpers/singBoxVariant.ts:38",
"src/tachyon/helpers/singBoxVariant.ts:46", "src/tachyon/helpers/singBoxVariant.ts:46",
"src/tachyon/tabs/updates/initController.ts:1165", "src/tachyon/tabs/updates/initController.ts:1182",
"src/tachyon/tabs/updates/initController.ts:1179", "src/tachyon/tabs/updates/initController.ts:1196",
"src/tachyon/tabs/updates/initController.ts:1193" "src/tachyon/tabs/updates/initController.ts:1210"
] ]
}, },
{ {
@@ -5039,8 +5039,8 @@
"call": "Open", "call": "Open",
"key": "Open", "key": "Open",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1261", "src/tachyon/tabs/updates/initController.ts:1278",
"src/tachyon/tabs/updates/initController.ts:1300" "src/tachyon/tabs/updates/initController.ts:1317"
] ]
}, },
{ {
@@ -5068,7 +5068,7 @@
"call": "Operation failed", "call": "Operation failed",
"key": "Operation failed", "key": "Operation failed",
"places": [ "places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:414" "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:446"
] ]
}, },
{ {
@@ -5662,7 +5662,7 @@
"call": "Rebuilt release", "call": "Rebuilt release",
"key": "Rebuilt release", "key": "Rebuilt release",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1281" "src/tachyon/tabs/updates/initController.ts:1298"
] ]
}, },
{ {
@@ -5739,14 +5739,21 @@
"call": "Reinstall", "call": "Reinstall",
"key": "Reinstall", "key": "Reinstall",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1041" "src/tachyon/tabs/updates/initController.ts:1058"
] ]
}, },
{ {
"call": "Reloading page in", "call": "Reload now",
"key": "Reloading page in", "key": "Reload now",
"places": [ "places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:329" "src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:342"
]
},
{
"call": "Reloading...",
"key": "Reloading...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:371"
] ]
}, },
{ {
@@ -5768,7 +5775,7 @@
"key": "Remove", "key": "Remove",
"places": [ "places": [
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927", "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927",
"src/tachyon/tabs/updates/initController.ts:997" "src/tachyon/tabs/updates/initController.ts:1014"
] ]
}, },
{ {
@@ -6642,6 +6649,13 @@
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:819" "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/settings.js:819"
] ]
}, },
{
"call": "Services are online and ready! Reloading page...",
"key": "Services are online and ready! Reloading page...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:370"
]
},
{ {
"call": "Services info", "call": "Services info",
"key": "Services info", "key": "Services info",
@@ -6649,6 +6663,13 @@
"src/tachyon/tabs/dashboard/initController.ts:1871" "src/tachyon/tabs/dashboard/initController.ts:1871"
] ]
}, },
{
"call": "Services restarted. Click to reload page.",
"key": "Services restarted. Click to reload page.",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:384"
]
},
{ {
"call": "Settings", "call": "Settings",
"key": "Settings", "key": "Settings",
@@ -7713,7 +7734,7 @@
"call": "Transient connection error", "call": "Transient connection error",
"key": "Transient connection error", "key": "Transient connection error",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:860" "src/tachyon/tabs/updates/initController.ts:877"
] ]
}, },
{ {
@@ -7991,7 +8012,7 @@
"call": "Update", "call": "Update",
"key": "Update", "key": "Update",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:927" "src/tachyon/tabs/updates/initController.ts:944"
] ]
}, },
{ {
@@ -8005,14 +8026,14 @@
"call": "Update is available for current release", "call": "Update is available for current release",
"key": "Update is available for current release", "key": "Update is available for current release",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1268" "src/tachyon/tabs/updates/initController.ts:1285"
] ]
}, },
{ {
"call": "Update is available:", "call": "Update is available:",
"key": "Update is available:", "key": "Update is available:",
"places": [ "places": [
"src/tachyon/tabs/updates/initController.ts:1247" "src/tachyon/tabs/updates/initController.ts:1264"
] ]
}, },
{ {
@@ -8275,6 +8296,13 @@
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10286" "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:10286"
] ]
}, },
{
"call": "Verifying router and service readiness...",
"key": "Verifying router and service readiness...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365"
]
},
{ {
"call": "Via country.is", "call": "Via country.is",
"key": "Via country.is", "key": "Via country.is",
@@ -8304,6 +8332,13 @@
"../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8755" "../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:8755"
] ]
}, },
{
"call": "Waiting for router services to restart...",
"key": "Waiting for router services to restart...",
"places": [
"src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:337"
]
},
{ {
"call": "WAN", "call": "WAN",
"key": "WAN", "key": "WAN",
+57 -37
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TACHYON\n" "Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 17:35+0300\n" "POT-Creation-Date: 2026-08-17 07:26+0300\n"
"PO-Revision-Date: 2026-08-16 17:35+0300\n" "PO-Revision-Date: 2026-08-17 07:26+0300\n"
"Last-Translator: Dushnilin <dushnilin@gmail.com>\n" "Last-Translator: Dushnilin <dushnilin@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Anonymized support report copied to clipboard" msgid "Anonymized support report copied to clipboard"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:844 #: src/tachyon/tabs/updates/initController.ts:861
msgid "Another component action is already running" msgid "Another component action is already running"
msgstr "" msgstr ""
@@ -611,7 +611,7 @@ msgstr ""
msgid "Check timeout after which the server is considered dead" msgid "Check timeout after which the server is considered dead"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:913 #: src/tachyon/tabs/updates/initController.ts:930
msgid "Check update" msgid "Check update"
msgstr "" msgstr ""
@@ -662,14 +662,14 @@ msgstr ""
msgid "checks" msgid "checks"
msgstr "" msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10 #: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checks failed" msgid "Checks failed"
msgstr "" msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23 #: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23
#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43 #: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checks passed" msgid "Checks passed"
msgstr "" msgstr ""
@@ -725,8 +725,8 @@ msgstr ""
#: src/tachyon/tabs/monitoring/initController.ts:884 #: src/tachyon/tabs/monitoring/initController.ts:884
#: src/tachyon/tabs/monitoring/initController.ts:934 #: src/tachyon/tabs/monitoring/initController.ts:934
#: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:374 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:406
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:419 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:451
msgid "Close" msgid "Close"
msgstr "" msgstr ""
@@ -1562,7 +1562,7 @@ msgstr ""
#: src/tachyon/tabs/updates/initController.ts:619 #: src/tachyon/tabs/updates/initController.ts:619
#: src/tachyon/tabs/updates/initController.ts:620 #: src/tachyon/tabs/updates/initController.ts:620
#: src/tachyon/tabs/updates/initController.ts:695 #: src/tachyon/tabs/updates/initController.ts:695
#: src/tachyon/tabs/updates/initController.ts:891 #: src/tachyon/tabs/updates/initController.ts:908
msgid "Failed to execute" msgid "Failed to execute"
msgstr "" msgstr ""
@@ -2043,21 +2043,21 @@ msgstr ""
msgid "Init Packet Payload (I5)" msgid "Init Packet Payload (I5)"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927 #: src/tachyon/tabs/updates/initController.ts:944
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:395
msgid "Install" msgid "Install"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1421 #: src/tachyon/tabs/updates/initController.ts:1438
msgid "Install another build:" msgid "Install another build:"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1279 #: src/tachyon/tabs/updates/initController.ts:1296
msgid "Installed build → Available build" msgid "Installed build → Available build"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:341 #: src/tachyon/tabs/updates/initController.ts:341
#: src/tachyon/tabs/updates/initController.ts:1287 #: src/tachyon/tabs/updates/initController.ts:1304
msgid "Installed version is newer than release" msgid "Installed version is newer than release"
msgstr "" msgstr ""
@@ -2395,8 +2395,8 @@ msgstr ""
msgid "Issues" msgid "Issues"
msgstr "" msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17 #: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
msgid "Issues detected" msgid "Issues detected"
msgstr "" msgstr ""
@@ -2490,11 +2490,11 @@ msgid "Latency test URL"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:344 #: src/tachyon/tabs/updates/initController.ts:344
#: src/tachyon/tabs/updates/initController.ts:1285 #: src/tachyon/tabs/updates/initController.ts:1302
msgid "Latest version is installed" msgid "Latest version is installed"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1287 #: src/tachyon/tabs/updates/initController.ts:1304
msgid "Latest version:" msgid "Latest version:"
msgstr "" msgstr ""
@@ -2557,11 +2557,11 @@ msgstr ""
msgid "Loading connections" msgid "Loading connections"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1129 #: src/tachyon/tabs/updates/initController.ts:1146
#: src/tachyon/tabs/updates/initController.ts:1144 #: src/tachyon/tabs/updates/initController.ts:1161
#: src/tachyon/tabs/updates/initController.ts:1162 #: src/tachyon/tabs/updates/initController.ts:1179
#: src/tachyon/tabs/updates/initController.ts:1176 #: src/tachyon/tabs/updates/initController.ts:1193
#: src/tachyon/tabs/updates/initController.ts:1190 #: src/tachyon/tabs/updates/initController.ts:1207
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
@@ -2879,9 +2879,9 @@ msgstr ""
#: src/tachyon/helpers/singBoxVariant.ts:38 #: src/tachyon/helpers/singBoxVariant.ts:38
#: src/tachyon/helpers/singBoxVariant.ts:46 #: src/tachyon/helpers/singBoxVariant.ts:46
#: src/tachyon/tabs/updates/initController.ts:1165 #: src/tachyon/tabs/updates/initController.ts:1182
#: src/tachyon/tabs/updates/initController.ts:1179 #: src/tachyon/tabs/updates/initController.ts:1196
#: src/tachyon/tabs/updates/initController.ts:1193 #: src/tachyon/tabs/updates/initController.ts:1210
msgid "Not installed" msgid "Not installed"
msgstr "" msgstr ""
@@ -2991,8 +2991,8 @@ msgstr ""
msgid "Only the specified servers." msgid "Only the specified servers."
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1261 #: src/tachyon/tabs/updates/initController.ts:1278
#: src/tachyon/tabs/updates/initController.ts:1300 #: src/tachyon/tabs/updates/initController.ts:1317
msgid "Open" msgid "Open"
msgstr "" msgstr ""
@@ -3008,7 +3008,7 @@ msgstr ""
msgid "Operation completed successfully!" msgid "Operation completed successfully!"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:414 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:446
msgid "Operation failed" msgid "Operation failed"
msgstr "" msgstr ""
@@ -3356,7 +3356,7 @@ msgstr ""
msgid "Rebuild firewall rules" msgid "Rebuild firewall rules"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1281 #: src/tachyon/tabs/updates/initController.ts:1298
msgid "Rebuilt release" msgid "Rebuilt release"
msgstr "" msgstr ""
@@ -3400,12 +3400,16 @@ msgstr ""
msgid "Regular expression must not contain spaces or commas" msgid "Regular expression must not contain spaces or commas"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1041 #: src/tachyon/tabs/updates/initController.ts:1058
msgid "Reinstall" msgid "Reinstall"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:329 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:342
msgid "Reloading page in" msgid "Reload now"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:371
msgid "Reloading..."
msgstr "" msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7847 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7847
@@ -3417,7 +3421,7 @@ msgid "Removal completed successfully!"
msgstr "" msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927
#: src/tachyon/tabs/updates/initController.ts:997 #: src/tachyon/tabs/updates/initController.ts:1014
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
@@ -3935,10 +3939,18 @@ msgstr ""
msgid "Services & Access" msgid "Services & Access"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:370
msgid "Services are online and ready! Reloading page..."
msgstr ""
#: src/tachyon/tabs/dashboard/initController.ts:1871 #: src/tachyon/tabs/dashboard/initController.ts:1871
msgid "Services info" msgid "Services info"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:384
msgid "Services restarted. Click to reload page."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1152 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1152
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7232 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7232
msgid "Settings" msgid "Settings"
@@ -4555,7 +4567,7 @@ msgstr ""
msgid "Traffic will go through the default route (Direct/Default)." msgid "Traffic will go through the default route (Direct/Default)."
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:860 #: src/tachyon/tabs/updates/initController.ts:877
msgid "Transient connection error" msgid "Transient connection error"
msgstr "" msgstr ""
@@ -4725,7 +4737,7 @@ msgstr ""
msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically."
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927 #: src/tachyon/tabs/updates/initController.ts:944
msgid "Update" msgid "Update"
msgstr "" msgstr ""
@@ -4733,11 +4745,11 @@ msgstr ""
msgid "Update is available" msgid "Update is available"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1268 #: src/tachyon/tabs/updates/initController.ts:1285
msgid "Update is available for current release" msgid "Update is available for current release"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1247 #: src/tachyon/tabs/updates/initController.ts:1264
msgid "Update is available:" msgid "Update is available:"
msgstr "" msgstr ""
@@ -4905,6 +4917,10 @@ msgstr ""
msgid "Value must not contain control characters" msgid "Value must not contain control characters"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365
msgid "Verifying router and service readiness..."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1986 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1986
msgid "Via country.is" msgid "Via country.is"
msgstr "" msgstr ""
@@ -4922,6 +4938,10 @@ msgstr ""
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links" msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:337
msgid "Waiting for router services to restart..."
msgstr ""
#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70 #: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70
msgid "WAN" msgid "WAN"
msgstr "" msgstr ""
+22 -4
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TACHYON\n" "Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 20:35+0300\n" "POT-Creation-Date: 2026-08-17 10:26+0300\n"
"PO-Revision-Date: 2026-08-16 20:35+0300\n" "PO-Revision-Date: 2026-08-17 10:26+0300\n"
"Last-Translator: Dushnilin\n" "Last-Translator: Dushnilin\n"
"Language-Team: none\n" "Language-Team: none\n"
"Language: ru\n" "Language: ru\n"
@@ -2372,8 +2372,11 @@ msgstr "Регулярное выражение не должно содержа
msgid "Reinstall" msgid "Reinstall"
msgstr "Переустановить" msgstr "Переустановить"
msgid "Reloading page in" msgid "Reload now"
msgstr "Перезагрузка страницы через" msgstr ""
msgid "Reloading..."
msgstr ""
msgid "Remote Hosts Lists" msgid "Remote Hosts Lists"
msgstr "Удалённые списки Hosts" msgstr "Удалённые списки Hosts"
@@ -2741,9 +2744,15 @@ msgstr "Список сервисов"
msgid "Services & Access" msgid "Services & Access"
msgstr "Сервисы и доступ" msgstr "Сервисы и доступ"
msgid "Services are online and ready! Reloading page..."
msgstr ""
msgid "Services info" msgid "Services info"
msgstr "Информация о сервисах" msgstr "Информация о сервисах"
msgid "Services restarted. Click to reload page."
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Настройки" msgstr "Настройки"
@@ -3404,6 +3413,9 @@ msgstr "Значение не может быть пустым"
msgid "Value must not contain control characters" msgid "Value must not contain control characters"
msgstr "Значение не должно содержать символы управления" msgstr "Значение не должно содержать символы управления"
msgid "Verifying router and service readiness..."
msgstr ""
msgid "Via country.is" msgid "Via country.is"
msgstr "Через country.is" msgstr "Через country.is"
@@ -3416,6 +3428,9 @@ msgstr "Видимое имя этой секции"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links" msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "Ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://" msgstr "Ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://"
msgid "Waiting for router services to restart..."
msgstr ""
msgid "WAN" msgid "WAN"
msgstr "WAN" msgstr "WAN"
@@ -3509,6 +3524,9 @@ msgstr "sing-box outbound для Zapret2 настроен"
msgid "Zapret2 sing-box outbound is not configured" msgid "Zapret2 sing-box outbound is not configured"
msgstr "sing-box outbound для Zapret2 не настроен" msgstr "sing-box outbound для Zapret2 не настроен"
msgid "Reloading page in"
msgstr "Перезагрузка страницы через"
msgid "Level" msgid "Level"
msgstr "Уровень" msgstr "Уровень"
@@ -691,7 +691,9 @@ async function handleChooseOutbound(
const res = await TachyonShellMethods.setClashApiGroupProxy(selector, tag); const res = await TachyonShellMethods.setClashApiGroupProxy(selector, tag);
if (res && !(res as any).success && (res as any).error) { if (res && !(res as any).success && (res as any).error) {
showToast( showToast(
(res as any).message || (res as any).error || _('Failed to switch proxy'), (res as any).message ||
(res as any).error ||
_('Failed to switch proxy'),
'error', 'error',
); );
} }
@@ -1122,59 +1124,64 @@ function renderCommonDetailsModal(
], ],
), ),
] ]
: (isPriority || section.outbounds.some((o) => o.code === member.code)) : isPriority ||
? [ section.outbounds.some(
E( (o) => o.code === member.code,
'button', )
{ ? [
type: 'button', E(
class: 'button',
'btn cbi-button cbi-button-action tachyon_dashboard-page__urltest-details__select-btn', {
click: async (event: MouseEvent) => { type: 'button',
event.preventDefault(); class:
const btn = event.currentTarget as HTMLButtonElement | null; 'btn cbi-button cbi-button-action tachyon_dashboard-page__urltest-details__select-btn',
if (btn) { click: async (event: MouseEvent) => {
btn.disabled = true; event.preventDefault();
} const btn =
const targetSelector = isPriority event.currentTarget as HTMLButtonElement | null;
? (outbound?.code || section.code) if (btn) {
: section.code; btn.disabled = true;
await handleChooseOutbound(
section.sectionName,
targetSelector,
member.code,
);
const updatedSection = store
.get()
.sectionsWidget.data.find(
(s) =>
s.sectionName === section.sectionName,
);
const updatedOutbound =
updatedSection?.outbounds.find(
(o) => o.code === outbound?.code,
);
if (updatedSection && updatedOutbound) {
if (isPriority) {
handleShowPriorityInfo(
updatedSection,
updatedOutbound,
);
} else {
handleShowUrlTestInfo(
updatedSection,
updatedOutbound,
);
} }
} else { const targetSelector = isPriority
ui.hideModal(); ? outbound?.code || section.code
} : section.code;
await handleChooseOutbound(
section.sectionName,
targetSelector,
member.code,
);
const updatedSection = store
.get()
.sectionsWidget.data.find(
(s) =>
s.sectionName ===
section.sectionName,
);
const updatedOutbound =
updatedSection?.outbounds.find(
(o) => o.code === outbound?.code,
);
if (updatedSection && updatedOutbound) {
if (isPriority) {
handleShowPriorityInfo(
updatedSection,
updatedOutbound,
);
} else {
handleShowUrlTestInfo(
updatedSection,
updatedOutbound,
);
}
} else {
ui.hideModal();
}
},
}, },
}, _('Select'),
_('Select'), ),
), ]
] : []
: []
: []), : []),
member.canCopyLink member.canCopyLink
? renderUrlTestCopyButton( ? renderUrlTestCopyButton(
@@ -1503,8 +1503,7 @@ async function handleRunAiDoctor() {
}), }),
renderButton({ renderButton({
classNames: ['cbi-button-reset'], classNames: ['cbi-button-reset'],
text: text: '🚨 ' + _('Restore Native Internet (Stop Tachyon)'),
'🚨 ' + _('Restore Native Internet (Stop Tachyon)'),
onClick: async () => { onClick: async () => {
showToast( showToast(
_( _(
@@ -1512,10 +1511,9 @@ async function handleRunAiDoctor() {
), ),
'success', 'success',
); );
const fixRes = const fixRes = await TachyonShellMethods.applyQuickFix(
await TachyonShellMethods.applyQuickFix( 'restore_native_internet',
'restore_native_internet', );
);
if ( if (
fixRes && fixRes &&
typeof fixRes === 'object' && typeof fixRes === 'object' &&
@@ -1609,10 +1607,9 @@ function handleRestoreNativeInternet() {
_('Restoring native direct internet (stopping Tachyon)...'), _('Restoring native direct internet (stopping Tachyon)...'),
'success', 'success',
); );
const res = const res = await TachyonShellMethods.applyQuickFix(
await TachyonShellMethods.applyQuickFix( 'restore_native_internet',
'restore_native_internet', );
);
if ( if (
res && res &&
typeof res === 'object' && typeof res === 'object' &&
@@ -750,7 +750,21 @@ function isComponentActionAlreadyRunningError(message: string | undefined) {
function handleComponentUiState(uiState: Tachyon.UiState) { function handleComponentUiState(uiState: Tachyon.UiState) {
for (const state of uiState.actions.component || []) { for (const state of uiState.actions.component || []) {
void followComponentActionState(state); const jobId = state.job_id;
if (!jobId) {
continue;
}
if (handledComponentJobs.has(jobId) || followedComponentJobs.has(jobId)) {
continue;
}
if (state.running) {
void followComponentActionState(state);
} else {
handledComponentJobs.add(jobId);
void ackComponentActionJob(jobId);
}
} }
} }
@@ -811,15 +825,18 @@ async function handleComponentAction(button: ComponentActionButton) {
const currentSha = checkResult?.current_sha; const currentSha = checkResult?.current_sha;
const targetSha = checkResult?.latest_sha; const targetSha = checkResult?.latest_sha;
const modalController = showUpdateProgressModal({ let modalController = getActiveProgressModalController();
component: button.component, if (!modalController) {
action: button.action, modalController = showUpdateProgressModal({
componentTitle: cardTitle, component: button.component,
currentVersion, action: button.action,
targetVersion, componentTitle: cardTitle,
currentSha, currentVersion,
targetSha, targetVersion,
}); currentSha,
targetSha,
});
}
let jobId = ''; let jobId = '';
let ownsJobFollow = false; let ownsJobFollow = false;
@@ -867,15 +884,15 @@ async function handleComponentAction(button: ComponentActionButton) {
} }
jobId = startResponse.data.job_id; jobId = startResponse.data.job_id;
setActiveProgressModalJobId(jobId); if (followedComponentJobs.has(jobId) || handledComponentJobs.has(jobId)) {
markUiActionOwned('component', jobId);
modalController.startLogTracking(jobId);
if (followedComponentJobs.has(jobId)) {
return; return;
} }
followedComponentJobs.add(jobId); followedComponentJobs.add(jobId);
ownsJobFollow = true; ownsJobFollow = true;
setActiveProgressModalJobId(jobId);
markUiActionOwned('component', jobId);
modalController.startLogTracking(jobId);
const response = await TachyonShellMethods.waitComponentActionJob( const response = await TachyonShellMethods.waitComponentActionJob(
jobId, jobId,
@@ -144,9 +144,13 @@ export function showUpdateProgressModal(
timerBadgeEl, timerBadgeEl,
]); ]);
const logPreEl = E('pre', { const logPreEl = E(
class: 'tachyon-update-modal__log', 'pre',
}, _('Operation started. Waiting for log output...')) as HTMLPreElement; {
class: 'tachyon-update-modal__log',
},
_('Operation started. Waiting for log output...'),
) as HTMLPreElement;
const logPanelEl = E('div', { class: 'tachyon-update-modal__log-panel' }, [ const logPanelEl = E('div', { class: 'tachyon-update-modal__log-panel' }, [
E('div', { class: 'tachyon-update-modal__log-header' }, [ E('div', { class: 'tachyon-update-modal__log-header' }, [
@@ -318,42 +322,78 @@ export function showUpdateProgressModal(
? _('Removal completed successfully!') ? _('Removal completed successfully!')
: _('Operation completed successfully!')); : _('Operation completed successfully!'));
const bannerEl = E('div', { class: 'tachyon-update-modal__success-banner' }, [ const bannerEl = E(
renderCheckIcon24(), 'div',
E('span', {}, successMsg), { class: 'tachyon-update-modal__success-banner' },
]); [renderCheckIcon24(), E('span', {}, successMsg)],
);
if (opts?.reloadPage) { if (opts?.reloadPage) {
let secondsLeft = 3; let isProbing = true;
const reloadBtnText = () => let attempt = 0;
`${_('Reloading page in')} ${secondsLeft}s...`; const maxAttempts = 30;
const statusEl = E(
'div',
{
class: 'tachyon-update-modal__reload-status',
style:
'margin: 10px 0; font-size: 0.95em; color: var(--cbi-color-neutral, #666);',
},
_('Waiting for router services to restart...'),
);
const reloadBtn = renderButton({ const reloadBtn = renderButton({
classNames: ['cbi-button-save'], classNames: ['cbi-button-save'],
text: reloadBtnText(), text: _('Reload now'),
onClick: () => { onClick: () => {
isProbing = false;
window.location.reload(); window.location.reload();
}, },
}); });
actionButtonContainer.replaceChildren( actionButtonContainer.replaceChildren(
bannerEl, bannerEl,
E( statusEl,
'div', E('div', { class: 'tachyon-update-modal__action-buttons' }, [
{ class: 'tachyon-update-modal__action-buttons' }, reloadBtn,
[reloadBtn], ]),
),
); );
const reloadTimer = setInterval(() => { const probeAndReload = async () => {
secondsLeft -= 1; // Pause 2 seconds initially to allow init scripts and rpcd reload to commence
if (secondsLeft <= 0) { await new Promise((resolve) => setTimeout(resolve, 2000));
clearInterval(reloadTimer);
window.location.reload(); while (isProbing && attempt < maxAttempts) {
} else { attempt += 1;
reloadBtn.textContent = reloadBtnText(); statusEl.textContent = `${_('Verifying router and service readiness...')} (${attempt}/${maxAttempts})`;
try {
const res = await TachyonShellMethods.getSystemInfo();
if (res && res.success) {
statusEl.textContent = _(
'Services are online and ready! Reloading page...',
);
reloadBtn.textContent = _('Reloading...');
await new Promise((resolve) => setTimeout(resolve, 600));
window.location.reload();
return;
}
} catch (_err) {
// RPC is unavailable while daemon/rpcd is reloading; keep probing
}
await new Promise((resolve) => setTimeout(resolve, 1500));
} }
}, 1000);
if (isProbing) {
statusEl.textContent = _(
'Services restarted. Click to reload page.',
);
}
};
void probeAndReload();
} else { } else {
const actionButtons: HTMLElement[] = []; const actionButtons: HTMLElement[] = [];
@@ -409,10 +449,11 @@ export function showUpdateProgressModal(
cleanupTimers(); cleanupTimers();
finishLogTracking(); finishLogTracking();
const bannerEl = E('div', { class: 'tachyon-update-modal__error-banner' }, [ const bannerEl = E(
renderXIcon24(), 'div',
E('span', {}, errorMessage || _('Operation failed')), { class: 'tachyon-update-modal__error-banner' },
]); [renderXIcon24(), E('span', {}, errorMessage || _('Operation failed'))],
);
const closeBtn = renderButton({ const closeBtn = renderButton({
classNames: ['cbi-button-remove'], classNames: ['cbi-button-remove'],
@@ -424,11 +465,7 @@ export function showUpdateProgressModal(
actionButtonContainer.replaceChildren( actionButtonContainer.replaceChildren(
bannerEl, bannerEl,
E( E('div', { class: 'tachyon-update-modal__action-buttons' }, [closeBtn]),
'div',
{ class: 'tachyon-update-modal__action-buttons' },
[closeBtn],
),
); );
}, },
startLogTracking: (jobId: string) => { startLogTracking: (jobId: string) => {
@@ -7320,7 +7320,9 @@ function renderCommonDetailsModal(info, fields, renderMemberName, isPriority, se
_("Active") _("Active")
] ]
) )
] : isPriority || section.outbounds.some((o) => o.code === member.code) ? [ ] : isPriority || section.outbounds.some(
(o) => o.code === member.code
) ? [
E( E(
"button", "button",
{ {
@@ -16006,9 +16008,13 @@ function showUpdateProgressModal(options) {
]), ]),
timerBadgeEl timerBadgeEl
]); ]);
const logPreEl = E("pre", { const logPreEl = E(
class: "tachyon-update-modal__log" "pre",
}, _("Operation started. Waiting for log output...")); {
class: "tachyon-update-modal__log"
},
_("Operation started. Waiting for log output...")
);
const logPanelEl = E("div", { class: "tachyon-update-modal__log-panel" }, [ const logPanelEl = E("div", { class: "tachyon-update-modal__log-panel" }, [
E("div", { class: "tachyon-update-modal__log-header" }, [ E("div", { class: "tachyon-update-modal__log-header" }, [
E("b", {}, _("Operation log")), E("b", {}, _("Operation log")),
@@ -16143,37 +16149,65 @@ function showUpdateProgressModal(options) {
cleanupTimers(); cleanupTimers();
finishLogTracking(); finishLogTracking();
const successMsg = message || (isCheckAction ? _("Check completed!") : options.action === "remove" ? _("Removal completed successfully!") : _("Operation completed successfully!")); const successMsg = message || (isCheckAction ? _("Check completed!") : options.action === "remove" ? _("Removal completed successfully!") : _("Operation completed successfully!"));
const bannerEl = E("div", { class: "tachyon-update-modal__success-banner" }, [ const bannerEl = E(
renderCheckIcon24(), "div",
E("span", {}, successMsg) { class: "tachyon-update-modal__success-banner" },
]); [renderCheckIcon24(), E("span", {}, successMsg)]
);
if (opts?.reloadPage) { if (opts?.reloadPage) {
let secondsLeft = 3; let isProbing = true;
const reloadBtnText = () => `${_("Reloading page in")} ${secondsLeft}s...`; let attempt = 0;
const maxAttempts = 30;
const statusEl = E(
"div",
{
class: "tachyon-update-modal__reload-status",
style: "margin: 10px 0; font-size: 0.95em; color: var(--cbi-color-neutral, #666);"
},
_("Waiting for router services to restart...")
);
const reloadBtn = renderButton({ const reloadBtn = renderButton({
classNames: ["cbi-button-save"], classNames: ["cbi-button-save"],
text: reloadBtnText(), text: _("Reload now"),
onClick: () => { onClick: () => {
isProbing = false;
window.location.reload(); window.location.reload();
} }
}); });
actionButtonContainer.replaceChildren( actionButtonContainer.replaceChildren(
bannerEl, bannerEl,
E( statusEl,
"div", E("div", { class: "tachyon-update-modal__action-buttons" }, [
{ class: "tachyon-update-modal__action-buttons" }, reloadBtn
[reloadBtn] ])
)
); );
const reloadTimer = setInterval(() => { const probeAndReload = async () => {
secondsLeft -= 1; await new Promise((resolve) => setTimeout(resolve, 2e3));
if (secondsLeft <= 0) { while (isProbing && attempt < maxAttempts) {
clearInterval(reloadTimer); attempt += 1;
window.location.reload(); statusEl.textContent = `${_("Verifying router and service readiness...")} (${attempt}/${maxAttempts})`;
} else { try {
reloadBtn.textContent = reloadBtnText(); const res = await TachyonShellMethods.getSystemInfo();
if (res && res.success) {
statusEl.textContent = _(
"Services are online and ready! Reloading page..."
);
reloadBtn.textContent = _("Reloading...");
await new Promise((resolve) => setTimeout(resolve, 600));
window.location.reload();
return;
}
} catch (_err) {
}
await new Promise((resolve) => setTimeout(resolve, 1500));
} }
}, 1e3); if (isProbing) {
statusEl.textContent = _(
"Services restarted. Click to reload page."
);
}
};
void probeAndReload();
} else { } else {
const actionButtons = []; const actionButtons = [];
if (opts?.onInstall) { if (opts?.onInstall) {
@@ -16217,10 +16251,11 @@ function showUpdateProgressModal(options) {
completeError: (errorMessage) => { completeError: (errorMessage) => {
cleanupTimers(); cleanupTimers();
finishLogTracking(); finishLogTracking();
const bannerEl = E("div", { class: "tachyon-update-modal__error-banner" }, [ const bannerEl = E(
renderXIcon24(), "div",
E("span", {}, errorMessage || _("Operation failed")) { class: "tachyon-update-modal__error-banner" },
]); [renderXIcon24(), E("span", {}, errorMessage || _("Operation failed"))]
);
const closeBtn = renderButton({ const closeBtn = renderButton({
classNames: ["cbi-button-remove"], classNames: ["cbi-button-remove"],
text: _("Close"), text: _("Close"),
@@ -16230,11 +16265,7 @@ function showUpdateProgressModal(options) {
}); });
actionButtonContainer.replaceChildren( actionButtonContainer.replaceChildren(
bannerEl, bannerEl,
E( E("div", { class: "tachyon-update-modal__action-buttons" }, [closeBtn])
"div",
{ class: "tachyon-update-modal__action-buttons" },
[closeBtn]
)
); );
}, },
startLogTracking: (jobId) => { startLogTracking: (jobId) => {
@@ -16761,7 +16792,19 @@ function isComponentActionAlreadyRunningError(message) {
} }
function handleComponentUiState(uiState) { function handleComponentUiState(uiState) {
for (const state of uiState.actions.component || []) { for (const state of uiState.actions.component || []) {
void followComponentActionState(state); const jobId = state.job_id;
if (!jobId) {
continue;
}
if (handledComponentJobs.has(jobId) || followedComponentJobs.has(jobId)) {
continue;
}
if (state.running) {
void followComponentActionState(state);
} else {
handledComponentJobs.add(jobId);
void ackComponentActionJob(jobId);
}
} }
} }
async function refreshComponentActionState() { async function refreshComponentActionState() {
@@ -16809,15 +16852,18 @@ async function handleComponentAction(button) {
const checkResult = getVisibleCheckResult(button.component); const checkResult = getVisibleCheckResult(button.component);
const currentSha = checkResult?.current_sha; const currentSha = checkResult?.current_sha;
const targetSha = checkResult?.latest_sha; const targetSha = checkResult?.latest_sha;
const modalController = showUpdateProgressModal({ let modalController = getActiveProgressModalController();
component: button.component, if (!modalController) {
action: button.action, modalController = showUpdateProgressModal({
componentTitle: cardTitle, component: button.component,
currentVersion, action: button.action,
targetVersion, componentTitle: cardTitle,
currentSha, currentVersion,
targetSha targetVersion,
}); currentSha,
targetSha
});
}
let jobId = ""; let jobId = "";
let ownsJobFollow = false; let ownsJobFollow = false;
try { try {
@@ -16859,14 +16905,14 @@ async function handleComponentAction(button) {
throw new Error(startResponse.error); throw new Error(startResponse.error);
} }
jobId = startResponse.data.job_id; jobId = startResponse.data.job_id;
setActiveProgressModalJobId(jobId); if (followedComponentJobs.has(jobId) || handledComponentJobs.has(jobId)) {
markUiActionOwned("component", jobId);
modalController.startLogTracking(jobId);
if (followedComponentJobs.has(jobId)) {
return; return;
} }
followedComponentJobs.add(jobId); followedComponentJobs.add(jobId);
ownsJobFollow = true; ownsJobFollow = true;
setActiveProgressModalJobId(jobId);
markUiActionOwned("component", jobId);
modalController.startLogTracking(jobId);
const response = await TachyonShellMethods.waitComponentActionJob( const response = await TachyonShellMethods.waitComponentActionJob(
jobId, jobId,
button.component, button.component,
+22 -4
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TACHYON\n" "Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 20:35+0300\n" "POT-Creation-Date: 2026-08-17 10:26+0300\n"
"PO-Revision-Date: 2026-08-16 20:35+0300\n" "PO-Revision-Date: 2026-08-17 10:26+0300\n"
"Last-Translator: Dushnilin\n" "Last-Translator: Dushnilin\n"
"Language-Team: none\n" "Language-Team: none\n"
"Language: ru\n" "Language: ru\n"
@@ -2372,8 +2372,11 @@ msgstr "Регулярное выражение не должно содержа
msgid "Reinstall" msgid "Reinstall"
msgstr "Переустановить" msgstr "Переустановить"
msgid "Reloading page in" msgid "Reload now"
msgstr "Перезагрузка страницы через" msgstr ""
msgid "Reloading..."
msgstr ""
msgid "Remote Hosts Lists" msgid "Remote Hosts Lists"
msgstr "Удалённые списки Hosts" msgstr "Удалённые списки Hosts"
@@ -2741,9 +2744,15 @@ msgstr "Список сервисов"
msgid "Services & Access" msgid "Services & Access"
msgstr "Сервисы и доступ" msgstr "Сервисы и доступ"
msgid "Services are online and ready! Reloading page..."
msgstr ""
msgid "Services info" msgid "Services info"
msgstr "Информация о сервисах" msgstr "Информация о сервисах"
msgid "Services restarted. Click to reload page."
msgstr ""
msgid "Settings" msgid "Settings"
msgstr "Настройки" msgstr "Настройки"
@@ -3404,6 +3413,9 @@ msgstr "Значение не может быть пустым"
msgid "Value must not contain control characters" msgid "Value must not contain control characters"
msgstr "Значение не должно содержать символы управления" msgstr "Значение не должно содержать символы управления"
msgid "Verifying router and service readiness..."
msgstr ""
msgid "Via country.is" msgid "Via country.is"
msgstr "Через country.is" msgstr "Через country.is"
@@ -3416,6 +3428,9 @@ msgstr "Видимое имя этой секции"
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links" msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "Ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://" msgstr "Ссылки vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2://"
msgid "Waiting for router services to restart..."
msgstr ""
msgid "WAN" msgid "WAN"
msgstr "WAN" msgstr "WAN"
@@ -3509,6 +3524,9 @@ msgstr "sing-box outbound для Zapret2 настроен"
msgid "Zapret2 sing-box outbound is not configured" msgid "Zapret2 sing-box outbound is not configured"
msgstr "sing-box outbound для Zapret2 не настроен" msgstr "sing-box outbound для Zapret2 не настроен"
msgid "Reloading page in"
msgstr "Перезагрузка страницы через"
msgid "Level" msgid "Level"
msgstr "Уровень" msgstr "Уровень"
+57 -37
View File
@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: TACHYON\n" "Project-Id-Version: TACHYON\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-08-16 17:35+0300\n" "POT-Creation-Date: 2026-08-17 07:26+0300\n"
"PO-Revision-Date: 2026-08-16 17:35+0300\n" "PO-Revision-Date: 2026-08-17 07:26+0300\n"
"Last-Translator: Dushnilin <dushnilin@gmail.com>\n" "Last-Translator: Dushnilin <dushnilin@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Anonymized support report copied to clipboard" msgid "Anonymized support report copied to clipboard"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:844 #: src/tachyon/tabs/updates/initController.ts:861
msgid "Another component action is already running" msgid "Another component action is already running"
msgstr "" msgstr ""
@@ -611,7 +611,7 @@ msgstr ""
msgid "Check timeout after which the server is considered dead" msgid "Check timeout after which the server is considered dead"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:913 #: src/tachyon/tabs/updates/initController.ts:930
msgid "Check update" msgid "Check update"
msgstr "" msgstr ""
@@ -662,14 +662,14 @@ msgstr ""
msgid "checks" msgid "checks"
msgstr "" msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10 #: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:10
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:26
msgid "Checks failed" msgid "Checks failed"
msgstr "" msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23 #: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:23
#: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43 #: src/tachyon/tabs/diagnostic/checks/runFakeIPCheck.ts:43
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:13
msgid "Checks passed" msgid "Checks passed"
msgstr "" msgstr ""
@@ -725,8 +725,8 @@ msgstr ""
#: src/tachyon/tabs/monitoring/initController.ts:884 #: src/tachyon/tabs/monitoring/initController.ts:884
#: src/tachyon/tabs/monitoring/initController.ts:934 #: src/tachyon/tabs/monitoring/initController.ts:934
#: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212 #: src/tachyon/tabs/diagnostic/partials/renderAiChatModal.ts:212
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:374 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:406
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:419 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:451
msgid "Close" msgid "Close"
msgstr "" msgstr ""
@@ -1562,7 +1562,7 @@ msgstr ""
#: src/tachyon/tabs/updates/initController.ts:619 #: src/tachyon/tabs/updates/initController.ts:619
#: src/tachyon/tabs/updates/initController.ts:620 #: src/tachyon/tabs/updates/initController.ts:620
#: src/tachyon/tabs/updates/initController.ts:695 #: src/tachyon/tabs/updates/initController.ts:695
#: src/tachyon/tabs/updates/initController.ts:891 #: src/tachyon/tabs/updates/initController.ts:908
msgid "Failed to execute" msgid "Failed to execute"
msgstr "" msgstr ""
@@ -2043,21 +2043,21 @@ msgstr ""
msgid "Init Packet Payload (I5)" msgid "Init Packet Payload (I5)"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927 #: src/tachyon/tabs/updates/initController.ts:944
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:363 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:395
msgid "Install" msgid "Install"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1421 #: src/tachyon/tabs/updates/initController.ts:1438
msgid "Install another build:" msgid "Install another build:"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1279 #: src/tachyon/tabs/updates/initController.ts:1296
msgid "Installed build → Available build" msgid "Installed build → Available build"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:341 #: src/tachyon/tabs/updates/initController.ts:341
#: src/tachyon/tabs/updates/initController.ts:1287 #: src/tachyon/tabs/updates/initController.ts:1304
msgid "Installed version is newer than release" msgid "Installed version is newer than release"
msgstr "" msgstr ""
@@ -2395,8 +2395,8 @@ msgstr ""
msgid "Issues" msgid "Issues"
msgstr "" msgstr ""
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
#: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17 #: src/tachyon/tabs/diagnostic/checks/getCheckItemsMeta.ts:17
#: src/tachyon/tabs/diagnostic/helpers/getMeta.ts:20
msgid "Issues detected" msgid "Issues detected"
msgstr "" msgstr ""
@@ -2490,11 +2490,11 @@ msgid "Latency test URL"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:344 #: src/tachyon/tabs/updates/initController.ts:344
#: src/tachyon/tabs/updates/initController.ts:1285 #: src/tachyon/tabs/updates/initController.ts:1302
msgid "Latest version is installed" msgid "Latest version is installed"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1287 #: src/tachyon/tabs/updates/initController.ts:1304
msgid "Latest version:" msgid "Latest version:"
msgstr "" msgstr ""
@@ -2557,11 +2557,11 @@ msgstr ""
msgid "Loading connections" msgid "Loading connections"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1129 #: src/tachyon/tabs/updates/initController.ts:1146
#: src/tachyon/tabs/updates/initController.ts:1144 #: src/tachyon/tabs/updates/initController.ts:1161
#: src/tachyon/tabs/updates/initController.ts:1162 #: src/tachyon/tabs/updates/initController.ts:1179
#: src/tachyon/tabs/updates/initController.ts:1176 #: src/tachyon/tabs/updates/initController.ts:1193
#: src/tachyon/tabs/updates/initController.ts:1190 #: src/tachyon/tabs/updates/initController.ts:1207
msgid "Loading..." msgid "Loading..."
msgstr "" msgstr ""
@@ -2879,9 +2879,9 @@ msgstr ""
#: src/tachyon/helpers/singBoxVariant.ts:38 #: src/tachyon/helpers/singBoxVariant.ts:38
#: src/tachyon/helpers/singBoxVariant.ts:46 #: src/tachyon/helpers/singBoxVariant.ts:46
#: src/tachyon/tabs/updates/initController.ts:1165 #: src/tachyon/tabs/updates/initController.ts:1182
#: src/tachyon/tabs/updates/initController.ts:1179 #: src/tachyon/tabs/updates/initController.ts:1196
#: src/tachyon/tabs/updates/initController.ts:1193 #: src/tachyon/tabs/updates/initController.ts:1210
msgid "Not installed" msgid "Not installed"
msgstr "" msgstr ""
@@ -2991,8 +2991,8 @@ msgstr ""
msgid "Only the specified servers." msgid "Only the specified servers."
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1261 #: src/tachyon/tabs/updates/initController.ts:1278
#: src/tachyon/tabs/updates/initController.ts:1300 #: src/tachyon/tabs/updates/initController.ts:1317
msgid "Open" msgid "Open"
msgstr "" msgstr ""
@@ -3008,7 +3008,7 @@ msgstr ""
msgid "Operation completed successfully!" msgid "Operation completed successfully!"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:414 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:446
msgid "Operation failed" msgid "Operation failed"
msgstr "" msgstr ""
@@ -3356,7 +3356,7 @@ msgstr ""
msgid "Rebuild firewall rules" msgid "Rebuild firewall rules"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1281 #: src/tachyon/tabs/updates/initController.ts:1298
msgid "Rebuilt release" msgid "Rebuilt release"
msgstr "" msgstr ""
@@ -3400,12 +3400,16 @@ msgstr ""
msgid "Regular expression must not contain spaces or commas" msgid "Regular expression must not contain spaces or commas"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1041 #: src/tachyon/tabs/updates/initController.ts:1058
msgid "Reinstall" msgid "Reinstall"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:329 #: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:342
msgid "Reloading page in" msgid "Reload now"
msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:371
msgid "Reloading..."
msgstr "" msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7847 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7847
@@ -3417,7 +3421,7 @@ msgid "Removal completed successfully!"
msgstr "" msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7927
#: src/tachyon/tabs/updates/initController.ts:997 #: src/tachyon/tabs/updates/initController.ts:1014
msgid "Remove" msgid "Remove"
msgstr "" msgstr ""
@@ -3935,10 +3939,18 @@ msgstr ""
msgid "Services & Access" msgid "Services & Access"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:370
msgid "Services are online and ready! Reloading page..."
msgstr ""
#: src/tachyon/tabs/dashboard/initController.ts:1871 #: src/tachyon/tabs/dashboard/initController.ts:1871
msgid "Services info" msgid "Services info"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:384
msgid "Services restarted. Click to reload page."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1152 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1152
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7232 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:7232
msgid "Settings" msgid "Settings"
@@ -4555,7 +4567,7 @@ msgstr ""
msgid "Traffic will go through the default route (Direct/Default)." msgid "Traffic will go through the default route (Direct/Default)."
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:860 #: src/tachyon/tabs/updates/initController.ts:877
msgid "Transient connection error" msgid "Transient connection error"
msgstr "" msgstr ""
@@ -4725,7 +4737,7 @@ msgstr ""
msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically." msgid "Up to 10 snapshots are kept; the oldest ones are removed automatically."
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:927 #: src/tachyon/tabs/updates/initController.ts:944
msgid "Update" msgid "Update"
msgstr "" msgstr ""
@@ -4733,11 +4745,11 @@ msgstr ""
msgid "Update is available" msgid "Update is available"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1268 #: src/tachyon/tabs/updates/initController.ts:1285
msgid "Update is available for current release" msgid "Update is available for current release"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/initController.ts:1247 #: src/tachyon/tabs/updates/initController.ts:1264
msgid "Update is available:" msgid "Update is available:"
msgstr "" msgstr ""
@@ -4905,6 +4917,10 @@ msgstr ""
msgid "Value must not contain control characters" msgid "Value must not contain control characters"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:365
msgid "Verifying router and service readiness..."
msgstr ""
#: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1986 #: ../luci-app-tachyon/htdocs/luci-static/resources/view/tachyon/section.js:1986
msgid "Via country.is" msgid "Via country.is"
msgstr "" msgstr ""
@@ -4922,6 +4938,10 @@ msgstr ""
msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links" msgid "vless://, vmess://, ss://, trojan://, socks4/5://, hy2/hysteria2:// links"
msgstr "" msgstr ""
#: src/tachyon/tabs/updates/partials/renderUpdateProgressModal.ts:337
msgid "Waiting for router services to restart..."
msgstr ""
#: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70 #: src/tachyon/tabs/diagnostic/checks/runInboundsCheck.ts:70
msgid "WAN" msgid "WAN"
msgstr "" msgstr ""