diff --git a/source/compose.manager/compose.manager.dashboard.page b/source/compose.manager/compose.manager.dashboard.page index a29392c..96cd1e9 100644 --- a/source/compose.manager/compose.manager.dashboard.page +++ b/source/compose.manager/compose.manager.dashboard.page @@ -316,7 +316,7 @@ $script = <<<'EOT' } opts.push({text:'Console', icon:'fa-terminal', action:function(e){ e.preventDefault(); - openDockerTerminal(ctName, false, shell || 'sh'); + openDockerTerminal(ctName, false, shell || '/bin/bash'); }}); opts.push({text:'Logs', icon:'fa-file-text-o', action:function(e){ e.preventDefault(); @@ -360,7 +360,7 @@ $script = <<<'EOT' // For console: openTerminal('docker', containerName, shell) function openDockerTerminal(name, isLogs, shell) { if (typeof window.openTerminal === 'function') { - window.openTerminal('docker', name, isLogs ? '.log' : (shell || 'sh')); + window.openTerminal('docker', name, isLogs ? '.log' : (shell || '/bin/bash')); } else { // Fallback if global function not available var url = isLogs @@ -408,7 +408,7 @@ $script = <<<'EOT' var imgSrc = ct.Icon || '/plugins/dynamix.docker.manager/images/question.png'; var escapedName = ct.Name.replace(/'/g, "\\'"); var webui = resolveContainerWebUI(ct.WebUI).replace(/'/g, "\\'"); - var shell = (ct.Shell || 'sh').replace(/'/g, "\\'"); + var shell = (ct.Shell || '/bin/bash').replace(/'/g, "\\'"); var shortId = ct.ID.substring(0, 12); // Parse image to get repo and tag var image = ct.Image || ''; diff --git a/source/compose.manager/compose.manager.settings.page b/source/compose.manager/compose.manager.settings.page index e96fd31..b9f820b 100644 --- a/source/compose.manager/compose.manager.settings.page +++ b/source/compose.manager/compose.manager.settings.page @@ -175,7 +175,7 @@ $projects_exist = intval(shell_exec("ls -l ".$compose_root." | grep ^d | wc -l") #compose-tab-backup .backup-section { margin-bottom: 20px; } - #compose-tab-backup dt { + #compose-tab-backup dl:has(blockquote.inline_help) > dt { cursor: help; } .backup-dest-input { @@ -187,11 +187,13 @@ $projects_exist = intval(shell_exec("ls -l ".$compose_root." | grep ^d | wc -l") } .backup-archive-list { max-height: 150px; - max-width: 700px; + width: 700px; + max-width: 100%; overflow-y: auto; border: 1px solid rgba(128, 128, 128, 0.3); border-radius: 4px; margin: 4px 0; + box-sizing: border-box; } .backup-archive-list table { width: 100%; @@ -223,12 +225,14 @@ $projects_exist = intval(shell_exec("ls -l ".$compose_root." | grep ^d | wc -l") } .backup-stack-checklist { max-height: 150px; - max-width: 700px; + width: 700px; + max-width: 100%; overflow-y: auto; border: 1px solid rgba(128, 128, 128, 0.3); border-radius: 4px; - padding: 4px 12px; + padding: 4px 8px; margin: 4px 0; + box-sizing: border-box; } .backup-stack-checklist label { display: block; @@ -248,6 +252,9 @@ $projects_exist = intval(shell_exec("ls -l ".$compose_root." | grep ^d | wc -l") border-radius: 4px; font-size: 0.95em; display: none; + width: 700px; + max-width: 100%; + box-sizing: border-box; } .backup-status.success { display: block; @@ -867,9 +874,10 @@ function restoreSelectedStacks() { if (stacks.length === 0 || !selectedArchive) return; // Show confirmation modal + var stackNames = stacks.join(', '); swal({ title: 'Confirm Restore', - text: 'This action will permanently replace existing configurations for the selected stacks (' + stacks.length + ' stack' + (stacks.length > 1 ? 's' : '') + '). Confirm to proceed.', + text: 'This action will permanently replace existing configurations for the selected stacks (' + stackNames + '). Confirm to proceed.', type: 'warning', showCancelButton: true, confirmButtonText: 'Restore', @@ -925,7 +933,7 @@ function deleteSelectedBackup() { if (result.result === 'success') { selectedArchive = null; selectedManifest = null; - $('#restore-stack-checklist').html('Select a backup archive above to see its contents.'); + $('#restore-stack-checklist').html('Select a backup archive above to see its contents.'); $('#btn-restore-stacks').prop('disabled', true); loadBackupArchives(); } else { @@ -951,11 +959,8 @@ function toggleScheduleDay() { } function saveBackupSettings() { - // Collect all backup settings and save via the standard Unraid config mechanism - // We do this by posting to update.php with the right form fields + // Collect all backup settings and save via Ajax var settings = { - '#file': 'compose.manager/compose.manager.cfg', - '#section': '', 'BACKUP_DESTINATION': $('#BACKUP_DESTINATION').val() || '/boot/config/plugins/compose.manager/backups', 'BACKUP_RETENTION': $('#BACKUP_RETENTION').val() || '5', 'BACKUP_SCHEDULE_ENABLED': $('#BACKUP_SCHEDULE_ENABLED').is(':checked') ? 'true' : 'false', @@ -964,64 +969,71 @@ function saveBackupSettings() { 'BACKUP_SCHEDULE_DAY': $('#BACKUP_SCHEDULE_DAY').val() || '1' }; - // We also need to include all existing settings so they aren't lost - // Use a hidden form approach similar to the settings tab - var $form = $('