Files: never an empty pane -- Loading…, a slow answer and a refusal said in the tree
ci / ui (push) Waiting to run
ci / check (push) Failing after 3s
ci / start (push) Failing after 3s

Files › Server drew nothing while GET /files was on its way: no word that it was being read, and a
refusal or a broken answer only after Rust's 60 s read timeout. To the administrator it looked as
if the server had no files, until the listing arrived. Every folder of both trees now says
Loading… while it is read, says after 8 s that the server has not answered (with Try again, the
late answer still drawn), and says a refusal, an answer that is not a listing, or a failure to
draw it in its place with Try again. An answer that comes after Read again, or after the folder
was closed, is dropped instead of appended beside the new one.

Tests (tests/ui N8): the administrator's / as the server's test client answers it (folders, a
mount, files at the root), held to show Loading…; the 8 s note under a fake clock; a 403 and Try
again; three answers that are not a listing; Read again while an answer is pending; 390 px. The
mock can hold an answer (`hold`, `__mock.release`) and change one (`__mock.answer`).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HomerandClaude Opus 5.5 committed 2026-11-10 16:06:44 +00:00
1 parent 189f706c65
commit 6874dd46cd
7 files changed
+284 -44

No files matched your search

+19
View File
@@ -543,6 +543,9 @@ KEYS = (
"approvals wait %(n)s min",
# chat.js: a picture as the next reply
"The reply to the next message is a picture drawn from it.",
# explorer.js: a directory still being read, or an answer that is not a listing
"The server has not answered in %(n)s seconds.",
"The server's answer could not be read.",
)
# The app's own sentences. The mode names (Manual, Edit, Auto, Plan) stay English, as the
@@ -823,6 +826,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "Čeká na počítač",
"approvals wait %(n)s min": "schválení čeká %(n)s min",
"The reply to the next message is a picture drawn from it.": "Odpovědí na další zprávu bude obrázek nakreslený podle ní.",
"The server has not answered in %(n)s seconds.": "Server neodpověděl do %(n)s sekund.",
"The server's answer could not be read.": "Odpověď serveru nešlo přečíst.",
},
"de": {
"Sign in again: the server no longer accepts this app's sign-in.": "Melden Sie sich erneut an: Der Server nimmt die Anmeldung dieser App nicht mehr an.",
@@ -1098,6 +1103,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "Wartet auf den Computer",
"approvals wait %(n)s min": "Freigaben warten %(n)s Min.",
"The reply to the next message is a picture drawn from it.": "Die Antwort auf die nächste Nachricht ist ein danach gezeichnetes Bild.",
"The server has not answered in %(n)s seconds.": "Der Server hat seit %(n)s Sekunden nicht geantwortet.",
"The server's answer could not be read.": "Die Antwort des Servers konnte nicht gelesen werden.",
},
"es": {
"Sign in again: the server no longer accepts this app's sign-in.": "Vuelva a iniciar sesión: el servidor ya no acepta el inicio de sesión de esta aplicación.",
@@ -1373,6 +1380,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "Esperando al ordenador",
"approvals wait %(n)s min": "las aprobaciones esperan %(n)s min",
"The reply to the next message is a picture drawn from it.": "La respuesta al siguiente mensaje es una imagen dibujada a partir de él.",
"The server has not answered in %(n)s seconds.": "El servidor no ha respondido en %(n)s segundos.",
"The server's answer could not be read.": "No se pudo leer la respuesta del servidor.",
},
"fr": {
"Sign in again: the server no longer accepts this app's sign-in.": "Reconnectez-vous : le serveur n’accepte plus la connexion de cette application.",
@@ -1648,6 +1657,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "En attente de l’ordinateur",
"approvals wait %(n)s min": "les approbations attendent %(n)s min",
"The reply to the next message is a picture drawn from it.": "La réponse au prochain message est une image dessinée d’après lui.",
"The server has not answered in %(n)s seconds.": "Le serveur n’a pas répondu depuis %(n)s secondes.",
"The server's answer could not be read.": "La réponse du serveur n’a pas pu être lue.",
},
"hu": {
"Sign in again: the server no longer accepts this app's sign-in.": "Jelentkezzen be újra: a szerver már nem fogadja el ennek az alkalmazásnak a bejelentkezését.",
@@ -1923,6 +1934,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "A számítógépre vár",
"approvals wait %(n)s min": "a jóváhagyások %(n)s percig várnak",
"The reply to the next message is a picture drawn from it.": "A következő üzenetre adott válasz egy abból rajzolt kép lesz.",
"The server has not answered in %(n)s seconds.": "A szerver %(n)s másodperce nem válaszolt.",
"The server's answer could not be read.": "A szerver válasza nem olvasható.",
},
"it": {
"Sign in again: the server no longer accepts this app's sign-in.": "Accedi di nuovo: il server non accetta più l’accesso di questa app.",
@@ -2198,6 +2211,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "In attesa del computer",
"approvals wait %(n)s min": "le approvazioni attendono %(n)s min",
"The reply to the next message is a picture drawn from it.": "La risposta al prossimo messaggio è un’immagine disegnata a partire da esso.",
"The server has not answered in %(n)s seconds.": "Il server non ha risposto in %(n)s secondi.",
"The server's answer could not be read.": "Non è stato possibile leggere la risposta del server.",
},
"pl": {
"Sign in again: the server no longer accepts this app's sign-in.": "Zaloguj się ponownie: serwer nie przyjmuje już logowania tej aplikacji.",
@@ -2473,6 +2488,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "Czeka na komputer",
"approvals wait %(n)s min": "zatwierdzenia czekają %(n)s min",
"The reply to the next message is a picture drawn from it.": "Odpowiedzią na następną wiadomość będzie obraz narysowany na jej podstawie.",
"The server has not answered in %(n)s seconds.": "Serwer nie odpowiedział od %(n)s sekund.",
"The server's answer could not be read.": "Nie udało się odczytać odpowiedzi serwera.",
},
"sk": {
"Sign in again: the server no longer accepts this app's sign-in.": "Prihláste sa znova: server už neprijíma prihlásenie tejto aplikácie.",
@@ -2748,6 +2765,8 @@ OWN: dict[str, dict[str, str]] = {
"Waiting for the computer": "Čaká na počítač",
"approvals wait %(n)s min": "schválenia čakajú %(n)s min",
"The reply to the next message is a picture drawn from it.": "Odpoveďou na ďalšiu správu bude obrázok nakreslený podľa nej.",
"The server has not answered in %(n)s seconds.": "Server neodpovedal do %(n)s sekúnd.",
"The server's answer could not be read.": "Odpoveď servera sa nedala prečítať.",
},
}