<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Docker P2P Manager</title> <!-- Bootstrap CSS --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet"> <!-- xterm.css for Terminal --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm/css/xterm.css"> <style> body { margin: 0; display: flex; height: 100vh; background-color: #1a1a1a; color: white; overflow: hidden; } #titlebar { -webkit-app-region: drag; height: 30px; width: 100%; position: fixed; top: 0; background-color: #2c2c2c; z-index: 1000; } pear-ctrl[data-platform="darwin"] { float: left; margin-top: 5px; margin-left: 10px; } #sidebar { position: fixed; top: 30px; left: 0; background-color: #2c2c2c; height: calc(100vh - 30px); width: 250px; overflow-y: auto; transition: width 0.3s ease-in-out; } #sidebar.collapsed { width: 50px; } #sidebar.collapsed .content { display: none; } #collapse-sidebar-btn { position: absolute; top: 10px; right: 10px; background-color: #444; border: none; color: white; width: 30px; height: 30px; border-radius: 50%; font-size: 16px; line-height: 30px; text-align: center; cursor: pointer; } #content { margin-left: 250px; flex: 1; padding: 30px; overflow-y: auto; transition: margin-left 0.3s ease-in-out; } #sidebar.collapsed ~ #content { margin-left: 50px; } .connection-status { border-radius: 50%; width: 10px; height: 10px; display: inline-block; margin-right: 8px; } .status-connected { background-color: green; } .status-disconnected { background-color: red; } #terminal-modal { position: fixed; bottom: 0; left: 0; width: 100%; max-height: 400px; height: 300px; background-color: #1a1a1a; border-top: 2px solid #444; display: none; flex-direction: column; z-index: 1000; } #terminal-modal .header { background-color: #444; padding: 10px; display: flex; justify-content: space-between; align-items: center; } #terminal-container { flex: 1; overflow: hidden; background-color: black; color: white; } #tray { position: fixed; bottom: 0; left: 0; width: 100%; background-color: #444; padding: 5px 10px; display: flex; gap: 10px; overflow-x: auto; white-space: nowrap; z-index: 999; } #tray .tray-item { background-color: #555; color: white; padding: 5px 10px; border-radius: 5px; cursor: pointer; } </style> </head> <body> <div id="titlebar"> <pear-ctrl></pear-ctrl> </div> <div id="sidebar"> <button id="collapse-sidebar-btn"><</button> <div class="content"> <h4 class="text-center mt-3">Connections</h4> <ul id="connection-list" class="list-group mb-3"></ul> <form id="add-connection-form" class="px-3"> <input type="text" id="new-connection-topic" class="form-control mb-2" placeholder="Enter server topic" required> <button type="submit" class="btn btn-primary w-100">Add Connection</button> </form> </div> </div> <div id="content"> <h1 id="connection-title">Add a Connection</h1> <div id="dashboard" class="hidden"> <h2>Containers</h2> <table class="table table-dark table-striped"> <thead> <tr> <th>Name</th> <th>Image</th> <th>Status</th> <th>CPU (%)</th> <th>Memory (MB)</th> <th>IP Address</th> <th>Actions</th> </tr> </thead> <tbody id="container-list"></tbody> </table> </div> </div> <!-- Duplicate Container Modal --> <div class="modal fade" id="duplicateModal" tabindex="-1" aria-labelledby="duplicateModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content bg-dark text-white"> <div class="modal-header"> <h5 class="modal-title" id="duplicateModalLabel">Duplicate Container</h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <form id="duplicate-container-form"> <div class="mb-3"> <label for="container-name" class="form-label">Container Name</label> <input type="text" class="form-control" id="container-name" required> </div> <div class="mb-3"> <label for="container-image" class="form-label">Hostname</label> <input type="text" class="form-control" id="container-hostname" required> </div> <div class="mb-3"> <label for="container-image" class="form-label">Image</label> <input type="text" class="form-control" id="container-image" required> </div> <div class="mb-3"> <label for="container-image" class="form-label">Net Mode</label> <input type="text" class="form-control" id="container-netmode" required> </div> <div class="mb-3"> <label for="container-cpu" class="form-label">CPU Count</label> <input type="number" class="form-control" id="container-cpu" required> </div> <div class="mb-3"> <label for="container-memory" class="form-label">Memory (MB)</label> <input type="number" class="form-control" id="container-memory" required> </div> <!-- Container Configuration as JSON --> <div class="mb-3"> <label for="container-config" class="form-label">Container Configuration (JSON)</label> <textarea class="form-control" id="container-config" rows="10" required></textarea> </div> <button type="submit" class="btn btn-primary">Deploy Duplicate</button> </form> </div> </div> </div> </div> <!-- Terminal Modal --> <div id="terminal-modal"> <div class="header"> <span id="terminal-title"></span> <div> <button id="kill-terminal-btn" class="btn btn-sm btn-danger">Kill Terminal</button> </div> </div> <div id="terminal-container"></div> </div> <div id="tray"></div> <!-- xterm.js --> <script src="https://cdn.jsdelivr.net/npm/xterm/lib/xterm.js"></script> <!-- Bootstrap JS for Modal Functionality --> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script> <!-- Your App JS --> <script type="module" src="app.js"></script> </body> </html>