Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
5193227
fix: let any folder be deleted, and stop failed deletes freezing the …
Sep 12, 2026
b9e68d0
fix: re-key bad ids on full import, localise delete errors
Sep 12, 2026
a49b010
fix: tolerate hand-edited folder files and report failed requests
Sep 12, 2026
50ce621
fix: fail unreadable folder reads, translate new error text
Sep 12, 2026
961f7da
fix: 400 for non-string folder payloads, banner on Dashboard fallback
Sep 12, 2026
73a8c8c
fix: read every POST field through fv3_post_string()
Sep 12, 2026
67f84b9
fix: confine theme deletes to styles/, reject malformed theme requests
Sep 12, 2026
3e387b5
fix: reject malformed theme requests, delete dangling theme links
Sep 12, 2026
575efb5
fix: confine uploads to styles/, warn on a failed order sync
Sep 12, 2026
08ab5b0
fix: report theme files that could not be removed, show import and sy…
chodeus Sep 12, 2026
5db750c
fix: show a failed theme delete as failed in the import dialog
chodeus Sep 12, 2026
f6dd19d
fix: re-sync the Docker start order after a single-folder import
chodeus Sep 12, 2026
3ce96dd
fix: fail the folder read when the file is valid JSON but not a folde…
chodeus Sep 12, 2026
b9d1fdd
fix: stage theme imports and replace the installed theme only when ev…
chodeus Sep 12, 2026
1ae0506
fix: accept an explicit empty folder id on delete, confine backup sty…
chodeus Sep 13, 2026
74def57
refactor: share i18nOr and failReason, batch the settings-page reques…
chodeus Sep 13, 2026
c8c2a53
refactor: remove upload_theme.php, which nothing calls
chodeus Sep 13, 2026
ccca97f
refactor: move the theme functions from lib.php to themes.php
chodeus Sep 13, 2026
8b0459c
fix: check theme renames and list reads, refuse clashing or oversized…
chodeus Sep 13, 2026
007b919
fix: refuse a stored empty folder key, list disabled single-file them…
chodeus Sep 13, 2026
47e57a7
fix: make the theme switch all or nothing, require fields whose absen…
chodeus Sep 13, 2026
93d9a5c
fix: require an id on update.php
chodeus Sep 13, 2026
0cb15fd
fix: treat an empty folder key as one folder on the settings page, fa…
chodeus Sep 13, 2026
49fc562
fix: load an empty folder key in the editor, pass folder ids to inlin…
chodeus Sep 13, 2026
51292fa
fix: escape folder ids in the Docker, VM and Dashboard folder templates
chodeus Sep 13, 2026
db2b4f4
fix: report failed file, style and generated-CSS writes during a back…
chodeus Sep 13, 2026
33d56ef
fix: block save when editor setup fails, fail root imports with an un…
chodeus Sep 13, 2026
f9d9dcc
fix: fail a restore when a style folder can't be created, re-confine …
chodeus Sep 13, 2026
9839d6f
fix: agree on one case-insensitive rule for a disabled theme, correct…
chodeus Sep 13, 2026
0e6d139
fix: reject scalar JSON in the CSS config endpoint instead of a TypeE…
chodeus Sep 13, 2026
8f433b8
fix: validate a restored css_config with the same rules an interactiv…
chodeus Sep 13, 2026
958a403
fix: translate the settings page by waiting for the language pack and…
chodeus Sep 13, 2026
0dd217a
fix: translate the theme labels the CSS tool injects, and use the sta…
chodeus Sep 13, 2026
6939f3d
fix: name the preserved theme folder when a failed install cannot be …
chodeus Sep 14, 2026
35ecac7
fix: return the installed theme entry so the import cleanup can delet…
chodeus Sep 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,30 @@
"delete-folder": "Delete folder",
"delete-folder-confirm-title": "Delete folder?",
"delete-folder-confirm-text": "This will permanently delete the folder \"$1\". The containers/VMs inside are NOT deleted — they return to the main list.",
"delete-folder-failed": "Ordner \"$1\" konnte nicht gelöscht werden: $2",
"save-folder-failed": "Der Ordner konnte nicht gespeichert werden: $1",
"clear-folders-failed": "Diese Ordner konnten nicht gelöscht werden: $1",
"defaults-not-applied": "Die Standardwerte wurden auf diese Ordner nicht angewendet: $1",
"import-folders-failed": "Diese Ordner konnten nicht importiert werden: $1",
"folder-load-failed": "Der Ordner konnte nicht geladen werden, daher ist Speichern deaktiviert. Lade die Seite neu und versuche es erneut.",
"folder-not-found": "Dieser Ordner existiert nicht mehr.",
"folder-data-load-failed": "Ordnerdaten konnten nicht geladen werden. Bitte lade die Seite neu.",
"importing-folders": "Ordner werden importiert…",
"import-failed": "Import fehlgeschlagen: $1",
"folder-order-load-failed": "Die Ordnerreihenfolge konnte nicht geladen werden. Lade die Seite neu.",
"reset-order-failed": "Die Ordnerreihenfolge konnte nicht zurückgesetzt werden. Versuche es erneut.",
"dashboard-settings-load-failed": "Die Dashboard-Einstellungen konnten nicht geladen werden, daher werden die Standardlayouts angezeigt. Lade die Seite neu.",
"invalid-folder-export": "Diese Datei ist kein Ordnerexport.",
"order-sync-failed": "Gespeichert, aber die Docker-Startreihenfolge konnte nicht aktualisiert werden: $1",
"docker-folders-load-failed": "Die Docker-Ordnerdaten konnten nicht geladen werden. Lade die Seite neu.",
"vm-folders-load-failed": "Die VM-Ordnerdaten konnten nicht geladen werden. Lade die Seite neu.",
"container-details-load-failed": "Die Container-Details konnten nicht geladen werden. Lade die Seite neu.",
"vm-details-load-failed": "Die VM-Details konnten nicht geladen werden. Lade die Seite neu.",
"docker-render-failed": "FolderView3: Die Docker-Ordner konnten nicht angezeigt werden — Details stehen in der Browser-Konsole.",
"vm-render-failed": "FolderView3: Die VM-Ordner konnten nicht angezeigt werden — Details stehen in der Browser-Konsole.",
"user-script-failed": "Das User-Script konnte nicht ausgeführt werden — prüfe, ob das Plugin User Scripts installiert ist und das Script existiert.",
"container-action-failed": "Die Container-Aktion \"$1\" ist fehlgeschlagen. Prüfe die Verbindung zum Server.",
"vm-action-failed": "Die VM-Aktion \"$1\" ist fehlgeschlagen. Prüfe die Verbindung zum Server.",
"order": "Reihenfolge:",
"order-tooltip": "Ziehe Zeilen per Drag & Drop zum Neuordnen. Aktiviere „Eingeschlossen“, um einen Container hinzuzufügen, „Vorschau ausblenden“, um ihn aus der Vorschauzeile auszuschließen. Regex-Bearbeitung setzt manuelle Auswahl zurück.",
"table-name": "Name",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,30 @@
"delete-folder": "Delete folder",
"delete-folder-confirm-title": "Delete folder?",
"delete-folder-confirm-text": "This will permanently delete the folder \"$1\". The containers/VMs inside are NOT deleted — they return to the main list.",
"delete-folder-failed": "Could not delete folder \"$1\": $2",
"save-folder-failed": "Could not save the folder: $1",
"clear-folders-failed": "These folders could not be deleted: $1",
"defaults-not-applied": "Defaults were not applied to these folders: $1",
"import-folders-failed": "These folders could not be imported: $1",
"folder-load-failed": "This folder could not be loaded, so saving is disabled. Reload the page and try again.",
"folder-not-found": "This folder no longer exists.",
"folder-data-load-failed": "Could not load folder data. Try refreshing the page.",
"importing-folders": "Importing folders…",
"import-failed": "Import failed: $1",
"folder-order-load-failed": "Could not load folder order. Try refreshing the page.",
"reset-order-failed": "Could not reset the folder order. Try again.",
"dashboard-settings-load-failed": "Could not load Dashboard settings, so the default layouts are shown. Try refreshing the page.",
"invalid-folder-export": "This file is not a folder export.",
"order-sync-failed": "Saved, but the Docker start order could not be updated: $1",
"docker-folders-load-failed": "Could not load Docker folder data. Try refreshing the page.",
"vm-folders-load-failed": "Could not load VM folder data. Try refreshing the page.",
"container-details-load-failed": "Could not load container details. Try refreshing the page.",
"vm-details-load-failed": "Could not load VM details. Try refreshing the page.",
"docker-render-failed": "FolderView3: Docker folder rendering failed — see the browser console for details.",
"vm-render-failed": "FolderView3: VM folder rendering failed — see the browser console for details.",
"user-script-failed": "Could not run the user script — check the User Scripts plugin is installed and the script exists.",
"container-action-failed": "The container action \"$1\" failed. Check your server connection.",
"vm-action-failed": "The VM action \"$1\" failed. Check your server connection.",
"order": "Order:",
"order-tooltip": "Drag and drop rows to reorder containers. Check 'Included' to add a container, 'Hide Preview' to exclude it from the preview row. Editing the regex will reset manual selections.",
"table-name": "Name",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,30 @@
"delete-folder": "Delete folder",
"delete-folder-confirm-title": "Delete folder?",
"delete-folder-confirm-text": "This will permanently delete the folder \"$1\". The containers/VMs inside are NOT deleted — they return to the main list.",
"delete-folder-failed": "No se pudo borrar la carpeta \"$1\": $2",
"save-folder-failed": "No se pudo guardar la carpeta: $1",
"clear-folders-failed": "No se pudieron borrar estas carpetas: $1",
"defaults-not-applied": "No se aplicaron los valores predeterminados a estas carpetas: $1",
"import-folders-failed": "No se pudieron importar estas carpetas: $1",
"folder-load-failed": "No se pudo cargar la carpeta, así que guardar está desactivado. Recarga la página e inténtalo de nuevo.",
"folder-not-found": "Esta carpeta ya no existe.",
"folder-data-load-failed": "No se pudieron cargar los datos de las carpetas. Recarga la página.",
"importing-folders": "Importando carpetas…",
"import-failed": "Error al importar: $1",
"folder-order-load-failed": "No se pudo cargar el orden de las carpetas. Recarga la página.",
"reset-order-failed": "No se pudo restablecer el orden de las carpetas. Inténtalo de nuevo.",
"dashboard-settings-load-failed": "No se pudo cargar la configuración del panel, así que se muestran los diseños predeterminados. Recarga la página.",
"invalid-folder-export": "Este archivo no es una exportación de carpetas.",
"order-sync-failed": "Guardado, pero no se pudo actualizar el orden de inicio de Docker: $1",
"docker-folders-load-failed": "No se pudieron cargar los datos de las carpetas de Docker. Recarga la página.",
"vm-folders-load-failed": "No se pudieron cargar los datos de las carpetas de VM. Recarga la página.",
"container-details-load-failed": "No se pudieron cargar los detalles de los contenedores. Recarga la página.",
"vm-details-load-failed": "No se pudieron cargar los detalles de las VM. Recarga la página.",
"docker-render-failed": "FolderView3: no se pudieron mostrar las carpetas de Docker — consulta la consola del navegador para ver los detalles.",
"vm-render-failed": "FolderView3: no se pudieron mostrar las carpetas de VM — consulta la consola del navegador para ver los detalles.",
"user-script-failed": "No se pudo ejecutar el script de usuario — comprueba que el plugin User Scripts está instalado y que el script existe.",
"container-action-failed": "Falló la acción de contenedor \"$1\". Comprueba la conexión con el servidor.",
"vm-action-failed": "Falló la acción de VM \"$1\". Comprueba la conexión con el servidor.",
"order": "Orden:",
"order-tooltip": "Arrastra y suelta filas para reordenar contenedores. Marca \"Incluido\" para agregar un contenedor, \"Ocultar vista previa\" para excluirlo de la fila de vista previa. Editar el regex restablecerá las selecciones manuales.",
"table-name": "Nombre",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,30 @@
"delete-folder": "Delete folder",
"delete-folder-confirm-title": "Delete folder?",
"delete-folder-confirm-text": "This will permanently delete the folder \"$1\". The containers/VMs inside are NOT deleted — they return to the main list.",
"delete-folder-failed": "Impossible de supprimer le dossier \"$1\" : $2",
"save-folder-failed": "Impossible d'enregistrer le dossier : $1",
"clear-folders-failed": "Ces dossiers n'ont pas pu être supprimés : $1",
"defaults-not-applied": "Les paramètres par défaut n'ont pas été appliqués à ces dossiers : $1",
"import-folders-failed": "Ces dossiers n'ont pas pu être importés : $1",
"folder-load-failed": "Le dossier n'a pas pu être chargé, l'enregistrement est donc désactivé. Rechargez la page et réessayez.",
"folder-not-found": "Ce dossier n'existe plus.",
"folder-data-load-failed": "Impossible de charger les données des dossiers. Rechargez la page.",
"importing-folders": "Importation des dossiers…",
"import-failed": "Échec de l'importation : $1",
"folder-order-load-failed": "Impossible de charger l'ordre des dossiers. Rechargez la page.",
"reset-order-failed": "Impossible de réinitialiser l'ordre des dossiers. Réessayez.",
"dashboard-settings-load-failed": "Impossible de charger les paramètres du tableau de bord, les dispositions par défaut sont donc affichées. Rechargez la page.",
"invalid-folder-export": "Ce fichier n'est pas un export de dossiers.",
"order-sync-failed": "Enregistré, mais l'ordre de démarrage Docker n'a pas pu être mis à jour : $1",
"docker-folders-load-failed": "Impossible de charger les données des dossiers Docker. Rechargez la page.",
"vm-folders-load-failed": "Impossible de charger les données des dossiers VM. Rechargez la page.",
"container-details-load-failed": "Impossible de charger les détails des conteneurs. Rechargez la page.",
"vm-details-load-failed": "Impossible de charger les détails des VM. Rechargez la page.",
"docker-render-failed": "FolderView3 : l'affichage des dossiers Docker a échoué — consultez la console du navigateur pour plus de détails.",
"vm-render-failed": "FolderView3 : l'affichage des dossiers VM a échoué — consultez la console du navigateur pour plus de détails.",
"user-script-failed": "Impossible d'exécuter le script utilisateur — vérifiez que le plugin User Scripts est installé et que le script existe.",
"container-action-failed": "L'action de conteneur \"$1\" a échoué. Vérifiez la connexion au serveur.",
"vm-action-failed": "L'action de VM \"$1\" a échoué. Vérifiez la connexion au serveur.",
"order": "Ordre :",
"order-tooltip": "Glissez-déposez les lignes pour réordonner les conteneurs. Cochez « Inclus » pour ajouter un conteneur, « Masquer l'aperçu » pour l'exclure de la barre d'aperçu. Modifier le regex réinitialise les sélections manuelles.",
"table-name": "Nom",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,30 @@
"delete-folder": "Delete folder",
"delete-folder-confirm-title": "Delete folder?",
"delete-folder-confirm-text": "This will permanently delete the folder \"$1\". The containers/VMs inside are NOT deleted — they return to the main list.",
"delete-folder-failed": "Impossibile rimuovere la cartella \"$1\": $2",
"save-folder-failed": "Impossibile salvare la cartella: $1",
"clear-folders-failed": "Impossibile rimuovere queste cartelle: $1",
"defaults-not-applied": "Le impostazioni predefinite non sono state applicate a queste cartelle: $1",
"import-folders-failed": "Impossibile importare queste cartelle: $1",
"folder-load-failed": "Impossibile caricare la cartella, quindi il salvataggio è disattivato. Ricarica la pagina e riprova.",
"folder-not-found": "Questa cartella non esiste più.",
"folder-data-load-failed": "Impossibile caricare i dati delle cartelle. Ricarica la pagina.",
"importing-folders": "Importazione delle cartelle…",
"import-failed": "Importazione non riuscita: $1",
"folder-order-load-failed": "Impossibile caricare l'ordine delle cartelle. Ricarica la pagina.",
"reset-order-failed": "Impossibile reimpostare l'ordine delle cartelle. Riprova.",
"dashboard-settings-load-failed": "Impossibile caricare le impostazioni della dashboard, quindi vengono mostrati i layout predefiniti. Ricarica la pagina.",
"invalid-folder-export": "Questo file non è un'esportazione di cartelle.",
"order-sync-failed": "Salvato, ma non è stato possibile aggiornare l'ordine di avvio di Docker: $1",
"docker-folders-load-failed": "Impossibile caricare i dati delle cartelle Docker. Ricarica la pagina.",
"vm-folders-load-failed": "Impossibile caricare i dati delle cartelle VM. Ricarica la pagina.",
"container-details-load-failed": "Impossibile caricare i dettagli dei container. Ricarica la pagina.",
"vm-details-load-failed": "Impossibile caricare i dettagli delle VM. Ricarica la pagina.",
"docker-render-failed": "FolderView3: impossibile visualizzare le cartelle Docker — controlla la console del browser per i dettagli.",
"vm-render-failed": "FolderView3: impossibile visualizzare le cartelle VM — controlla la console del browser per i dettagli.",
"user-script-failed": "Impossibile eseguire lo script utente — verifica che il plugin User Scripts sia installato e che lo script esista.",
"container-action-failed": "L'azione sul container \"$1\" non è riuscita. Verifica la connessione al server.",
"vm-action-failed": "L'azione sulla VM \"$1\" non è riuscita. Verifica la connessione al server.",
"order": "Ordine:",
"order-tooltip": "Trascina e rilascia le righe per riordinare i container. Spunta \"Incluso\" per aggiungere un container, \"Nascondi anteprima\" per escluderlo dalla riga di anteprima. Modificare il regex ripristina le selezioni manuali.",
"table-name": "Nome",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,30 @@
"delete-folder": "Delete folder",
"delete-folder-confirm-title": "Delete folder?",
"delete-folder-confirm-text": "This will permanently delete the folder \"$1\". The containers/VMs inside are NOT deleted — they return to the main list.",
"delete-folder-failed": "Nie można usunąć folderu \"$1\": $2",
"save-folder-failed": "Nie można zapisać folderu: $1",
"clear-folders-failed": "Nie można usunąć tych folderów: $1",
"defaults-not-applied": "Nie zastosowano ustawień domyślnych do tych folderów: $1",
Comment thread
coderabbitai[bot] marked this conversation as resolved.
"import-folders-failed": "Nie można zaimportować tych folderów: $1",
"folder-load-failed": "Nie można wczytać folderu, więc zapisywanie jest wyłączone. Odśwież stronę i spróbuj ponownie.",
"folder-not-found": "Ten folder już nie istnieje.",
"folder-data-load-failed": "Nie można wczytać danych folderów. Odśwież stronę.",
"importing-folders": "Importowanie folderów…",
"import-failed": "Import nie powiódł się: $1",
"folder-order-load-failed": "Nie można wczytać kolejności folderów. Odśwież stronę.",
"reset-order-failed": "Nie można zresetować kolejności folderów. Spróbuj ponownie.",
"dashboard-settings-load-failed": "Nie można wczytać ustawień pulpitu, więc wyświetlane są układy domyślne. Odśwież stronę.",
"invalid-folder-export": "Ten plik nie jest eksportem folderów.",
"order-sync-failed": "Zapisano, ale nie można zaktualizować kolejności uruchamiania Dockera: $1",
"docker-folders-load-failed": "Nie można wczytać danych folderów Dockera. Odśwież stronę.",
"vm-folders-load-failed": "Nie można wczytać danych folderów VM. Odśwież stronę.",
"container-details-load-failed": "Nie można wczytać szczegółów kontenerów. Odśwież stronę.",
"vm-details-load-failed": "Nie można wczytać szczegółów maszyn wirtualnych. Odśwież stronę.",
"docker-render-failed": "FolderView3: nie udało się wyświetlić folderów Dockera — szczegóły znajdziesz w konsoli przeglądarki.",
"vm-render-failed": "FolderView3: nie udało się wyświetlić folderów VM — szczegóły znajdziesz w konsoli przeglądarki.",
"user-script-failed": "Nie można uruchomić skryptu użytkownika — sprawdź, czy wtyczka User Scripts jest zainstalowana i czy skrypt istnieje.",
"container-action-failed": "Akcja kontenera \"$1\" nie powiodła się. Sprawdź połączenie z serwerem.",
"vm-action-failed": "Akcja maszyny wirtualnej \"$1\" nie powiodła się. Sprawdź połączenie z serwerem.",
"order": "Kolejność:",
"order-tooltip": "Przeciągnij i upuść wiersze, aby zmienić kolejność kontenerów. Zaznacz „Dołączony”, aby dodać kontener, „Ukryj podgląd”, aby wykluczyć go z wiersza podglądu. Edycja regex resetuje ręczne wybory.",
"table-name": "Nazwa",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,25 @@
<script src="/plugins/folder.view3/scripts/include/jquery.i18n.emitter.js"></script>
<script src="/plugins/folder.view3/scripts/include/jquery.i18n.emitter.bidi.js"></script>
<script>
// Shared by every FV3 page: $.i18n returns the key itself until the pack loads, so fall back to English with $n filled in
window.fv3I18nOr = (key, fallback, ...args) => {
const s = $.i18n(key, ...args);
return s && s !== key ? s : fallback.replace(/\$(\d+)/g, (m, n) => (args[n - 1] !== undefined ? args[n - 1] : m));
};
// The server's JSON error when it sent one, else the HTTP status (HTTP/2 carries no status text)
window.fv3FailReason = (err) => err?.responseJSON?.error || (err?.status ? 'HTTP ' + err.status : err?.statusText || err?.message || 'Unknown error');
if(typeof folderi18n === 'undefined' ) {
folderi18n = () => {};
}
$.i18n({
'locale': '<? echo $loc?>'
}).load({
<?php
if($loc != 'en') {
echo "'$loc': '/plugins/folder.view3/langs/$loc.json',";
}
?>'en': '/plugins/folder.view3/langs/en.json'
}).then(folderi18n, ()=>{});
'locale': <?= json_encode($loc) ?>
}).load(<?php
// autov() versions each URL so an update's new keys aren't masked by a cached pack
$packs = [];
if ($loc != 'en') { $packs[$loc] = autov("/plugins/folder.view3/langs/$loc.json", true); }
$packs['en'] = autov('/plugins/folder.view3/langs/en.json', true);
echo json_encode($packs);
// Wait for the pack AND DOM ready: pages define their own folderi18n in a later <script>, so a
// cached pack resolves first and calls the stub. Failure stays a no-op — .i18n() with no messages shows raw keys.
?>).then(() => $(() => folderi18n()), () => {});
</script>
Loading