Skip to content

Commit 9c3b50e

Browse files
author
joe
committed
Composr v1.7.7
✨ Features: - Multi-host Docker container management - Real-time container monitoring and control - Docker Compose file editor with syntax highlighting - Environment file management - Image management across multiple hosts - Backup and restore functionality - Modern web interface with dark/light themes
1 parent 0280e4e commit 9c3b50e

File tree

7 files changed

+349
-70
lines changed

7 files changed

+349
-70
lines changed

CHANGELOG.md

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,63 @@
11
# Changelog
22
All notable changes to Composr will be documented in this file.
3+
## [1.7.7] - 2025-07-01
4+
### Added
5+
- **🎯 Smart Health Indicators**: Intelligent container health assessment system
6+
- Real-time health evaluation based on container status, uptime, and resource usage
7+
- Visual health indicators with color-coded status (green=healthy, yellow=warning, red=error)
8+
- Smart warning detection for recently restarted containers (< 5 minutes uptime)
9+
- Health tooltips showing specific issues and recommendations
10+
- **📊 Persistent Operation Results**: Enhanced operation feedback system
11+
- Detailed operation result modals showing actual docker-compose command output
12+
- Persistent error messages that stay visible until manually dismissed
13+
- Success messages with auto-close after 10 seconds
14+
- Full command output display for debugging deployment failures
15+
- Network error handling with detailed error information
16+
- **🔒 Scroll Position Preservation**: Automatic scroll position retention
17+
- Container list maintains scroll position after refresh operations
18+
- No more jumping back to top after container actions or page updates
19+
- Improved user experience for large container lists
20+
21+
### Changed
22+
- **Container Status Display**: Replaced basic status badges with health-aware color coding
23+
- Container status text now changes color based on health level
24+
- Removed separate health column for cleaner table layout
25+
- Unified health indication across both card and table views
26+
- **Card Layout Redesign**: Modernized container card appearance and organization
27+
- 4-row compact layout: Name → Host/Status/Uptime/More → Ports → Actions
28+
- Reduced card height (240px → 120px) for better screen utilization
29+
- Modern gradient backgrounds with improved hover effects
30+
- Better content organization with proper spacing and alignment
31+
- **Table Structure Optimization**: Streamlined table columns for better usability
32+
- Consolidated health and status into single color-coded status column
33+
- Improved column alignment and responsive design
34+
- Fixed group header colspan to match new column structure
35+
36+
### Fixed
37+
- **Operation Feedback**: Replaced generic "success/failed" messages with actual command output
38+
- Users now see real docker-compose errors instead of "operation failed"
39+
- Full deployment logs visible for troubleshooting
40+
- Network errors properly captured and displayed
41+
- **Card View Consistency**: Fixed container card sizing and layout inconsistencies
42+
- All cards now maintain uniform height regardless of content
43+
- Proper content overflow handling for long port lists
44+
- Consistent button placement and spacing
45+
- **Health Indicator Integration**: Seamless health status across all views
46+
- Card view health dots properly positioned in top-right corner
47+
- Table view health coloring applied consistently
48+
- Health assessment working for both grouped and ungrouped views
49+
- **Page Navigation**: Fixed scroll position jumping to top after container operations
50+
- Maintains user's current scroll position during refresh operations
51+
- Better UX for managing large numbers of containers
52+
53+
### Technical
54+
- **Health Assessment Engine**: Comprehensive container health evaluation system
55+
- **Operation Result Modal**: New modal system for displaying command outputs
56+
- **Scroll Management**: Intelligent scroll position preservation system
57+
- **CSS Optimization**: Streamlined styling with improved responsiveness
58+
- **Error Handling**: Enhanced error capture and display throughout the application
59+
60+
This release significantly improves user experience by providing clear visual feedback about container health, detailed information when operations fail, and seamless navigation that maintains user context during operations.
361
## [1.7.6] - 2025-06-20
462
- **Fixed critical bug where container labels were lost during backup/restore**
563
- **All original container labels (watchtower, traefik, custom, etc.) are now

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.7.6
1+
1.7.7

app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
from remote_hosts import host_manager
2828

2929
# Add after imports
30-
__version__ = "1.7.6"
30+
__version__ = "1.7.7"
3131

3232
# Initialize Flask app
3333
app = Flask(__name__)

static/css/styles.css

Lines changed: 76 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -304,14 +304,30 @@ header {
304304
}
305305

306306
.container-card {
307-
min-height: 140px !important;
308-
display: flex !important;
309-
flex-direction: column !important;
307+
background: linear-gradient(135deg, var(--bg-card) 0%, var(--bg-secondary) 100%);
308+
border: 1px solid var(--border-color);
309+
border-radius: 12px;
310+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
311+
transition: all 0.3s ease;
312+
padding: 1rem;
313+
min-height: 100px; /* Much shorter */
314+
max-height: 100px;
315+
display: flex;
316+
flex-direction: column;
317+
gap: 0.5rem;
310318
}
311319

320+
.container-body {
321+
flex: 1 !important;
322+
justify-content: space-between !important;
323+
overflow: hidden !important; /* ADD THIS to prevent content overflow */
324+
}
325+
326+
327+
312328
.container-card:hover {
313-
transform: translateY(-2px);
314-
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
329+
transform: translateY(-4px);
330+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
315331
border-color: var(--accent-primary);
316332
}
317333

@@ -322,46 +338,61 @@ header {
322338
}
323339

324340
.container-header {
325-
align-items: flex-start !important;
326-
min-height: 2.5rem !important;
341+
display: flex;
342+
align-items: center;
343+
min-height: auto;
327344
}
328345

346+
.container-name {
347+
font-weight: 600;
348+
font-size: 1rem;
349+
flex: 1;
350+
}
351+
352+
/* Row 2: Host, Status, Uptime, More button */
353+
.container-meta {
354+
display: flex;
355+
align-items: center;
356+
justify-content: space-between;
357+
gap: 0.5rem;
358+
}
329359
.container-header-right {
330360
max-width: 60% !important;
331361
justify-content: flex-end !important;
332362
flex-shrink: 0 !important;
333363
}
334364

335-
.container-name {
336-
flex: 1 !important;
337-
min-width: 0 !important;
338-
line-height: 1.2 !important;
339-
}
340365

341-
.container-body {
342-
flex: 1 !important;
343-
justify-content: space-between !important;
344-
}
366+
345367

346368
.container-name:hover {
347369
color: var(--accent-secondary);
348370
text-decoration: none;
349371
}
350372

351373

374+
.container-status-group {
375+
display: flex;
376+
align-items: center;
377+
gap: 0.5rem;
378+
flex: 1;
379+
}
352380

353-
/* === Container Ports === */
381+
/* Row 3: Ports (single line) */
354382
.container-ports {
355383
font-size: 0.8rem;
356384
color: var(--text-secondary);
357385
background: var(--bg-tertiary);
358-
padding: 0.2rem 0.5rem;
359-
border-radius: 0.25rem;
360-
margin: 0.3rem 0;
386+
padding: 0.25rem 0.5rem;
387+
border-radius: 4px;
361388
font-family: monospace;
362-
border: 1px solid var(--border-color);
389+
white-space: nowrap;
390+
overflow: hidden;
391+
text-overflow: ellipsis;
392+
margin: 0;
363393
}
364394

395+
365396
.container-ports:empty::before {
366397
content: "No ports";
367398
font-style: italic;
@@ -452,9 +483,16 @@ header {
452483
}
453484

454485
/* === Actions === */
486+
/* Row 4: Actions */
455487
.actions {
456-
margin-top: auto !important;
457-
padding-top: 0.5rem !important;
488+
display: flex;
489+
gap: 0.5rem;
490+
margin-top: auto;
491+
}
492+
493+
.actions .btn {
494+
padding: 0.25rem 0.75rem;
495+
font-size: 0.8rem;
458496
}
459497

460498
/* === Buttons === */
@@ -2459,4 +2497,18 @@ select {
24592497
gap: 0.5rem;
24602498
margin-bottom: 0;
24612499
white-space: nowrap;
2462-
}
2500+
}
2501+
.container-card {
2502+
position: relative;
2503+
min-height: 200px;
2504+
display: flex;
2505+
flex-direction: column;
2506+
}
2507+
2508+
.container-actions {
2509+
margin-top: auto;
2510+
}
2511+
2512+
.health-healthy { color: #22c55e; }
2513+
.health-warning { color: #f59e0b; }
2514+
.health-error { color: #ef4444; }

0 commit comments

Comments
 (0)