list.html 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <style>
  2. #dkl-root {
  3. --dk-bg:#ffffff; --dk-border:#e5e5e5; --dk-text:#1f1f1f; --dk-dim:#676767;
  4. --dk-soft:#f5f5f5; --dk-soft2:#efefef; --dk-accent:#2b6cb0; --dk-accent-text:#fff;
  5. --dk-ok:#107c10; --dk-danger:#c42b1c; --dk-shadow:0 4px 20px rgba(0,0,0,0.08);
  6. background:var(--dk-bg); border:1px solid var(--dk-border); border-radius:12px;
  7. box-shadow:var(--dk-shadow); color:var(--dk-text); padding:16px; margin-bottom:4px;
  8. font-family:'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif; font-size:13px;
  9. }
  10. body.dark #dkl-root {
  11. --dk-bg:#2b2b2b; --dk-border:#3b3b3b; --dk-text:#ececec; --dk-dim:#aaaaaa;
  12. --dk-soft:#343434; --dk-soft2:#3c3c3c; --dk-accent:#4a90d9; --dk-ok:#2ecc71;
  13. --dk-danger:#ff6b5e; --dk-shadow:0 8px 22px rgba(0,0,0,0.3);
  14. }
  15. #dkl-root * { box-sizing:border-box; }
  16. .dkl-head { display:flex; align-items:center; gap:10px; margin-bottom:14px; }
  17. .dkl-title { font-size:17px; font-weight:600; }
  18. .dkl-sub { font-size:12px; color:var(--dk-dim); margin-top:2px; }
  19. .dkl-head .right { margin-left:auto; }
  20. .dkl-table { width:100%; border-collapse:collapse; font-size:12.5px; }
  21. .dkl-table th { text-align:left; font-size:11px; color:var(--dk-dim); font-weight:600; padding:7px 8px; border-bottom:1px solid var(--dk-border); }
  22. .dkl-table td { padding:7px 8px; border-bottom:1px solid var(--dk-border); }
  23. .dkl-mono { font-family:ui-monospace, Menlo, Consolas, monospace; font-size:11.5px; }
  24. .dkl-badge { font-size:11px; padding:2px 8px; border-radius:10px; font-weight:600; background:var(--dk-ok); color:#fff; }
  25. .dkl-empty { text-align:center; color:var(--dk-dim); padding:22px; }
  26. .dkl-btn { border:1px solid var(--dk-border); background:var(--dk-bg); color:var(--dk-text); border-radius:8px;
  27. font-size:12.5px; font-weight:600; padding:8px 14px; cursor:pointer; transition:.12s; }
  28. .dkl-btn:hover { background:var(--dk-soft2); }
  29. .dkl-btn.primary { background:var(--dk-accent); color:var(--dk-accent-text); border-color:var(--dk-accent); }
  30. .dkl-footer { margin-top:16px; display:flex; align-items:center; gap:10px; }
  31. .dkl-footer .note { font-size:11.5px; color:var(--dk-dim); }
  32. </style>
  33. <div id="dkl-root">
  34. <div class="dkl-head">
  35. <div>
  36. <div class="dkl-title">Docker List</div>
  37. <div class="dkl-sub">Containers currently running on this host.</div>
  38. </div>
  39. <div class="right"><button class="dkl-btn" id="dkl-refresh"><i class="refresh icon"></i> Refresh</button></div>
  40. </div>
  41. <table class="dkl-table">
  42. <thead><tr><th>Name</th><th>Image</th><th>Status</th><th>Ports</th></tr></thead>
  43. <tbody id="dkl-body"><tr><td colspan="4" class="dkl-empty">Loading...</td></tr></tbody>
  44. </table>
  45. <div class="dkl-footer">
  46. <button class="dkl-btn primary" id="dkl-manage"><i class="cube icon"></i> Manage Containers</button>
  47. <span class="note">Opens the full Docker Manager app to start/stop, edit, view logs, open a console and manage images, compose stacks and registries.</span>
  48. </div>
  49. </div>
  50. <script>
  51. (function () {
  52. var API = "../../system/docker/";
  53. (function applyTheme(){
  54. try { if (typeof preferredTheme !== 'undefined') { document.body.classList.toggle('dark', (preferredTheme==='dark'||preferredTheme==='darkTheme')); return; } } catch(e){}
  55. if (typeof ao_module_getSystemThemeColor === 'function') { ao_module_getSystemThemeColor(function(c){ document.body.classList.toggle('dark', c!=='whiteTheme'); }); }
  56. })();
  57. function esc(s){ return String(s==null?"":s).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"); }
  58. function loadRunning(){
  59. var $b = $("#dkl-body");
  60. $b.html('<tr><td colspan="4" class="dkl-empty">Loading...</td></tr>');
  61. $.get(API + "containers/list", function(list){
  62. if (list && list.error){ $b.html('<tr><td colspan="4" class="dkl-empty">' + esc(list.error) + '</td></tr>'); return; }
  63. var running = (list || []).filter(function(c){ return (c.State || "").toLowerCase() === "running"; });
  64. if (running.length === 0){ $b.html('<tr><td colspan="4" class="dkl-empty">No running containers.</td></tr>'); return; }
  65. $b.html(running.map(function(c){
  66. return '<tr>' +
  67. '<td class="dkl-mono">' + esc(c.Names) + '</td>' +
  68. '<td class="dkl-mono">' + esc(c.Image) + '</td>' +
  69. '<td><span class="dkl-badge">' + esc(c.Status || "running") + '</span></td>' +
  70. '<td class="dkl-mono">' + esc(c.Ports || "") + '</td>' +
  71. '</tr>';
  72. }).join(""));
  73. }).fail(function(){ $b.html('<tr><td colspan="4" class="dkl-empty">Failed to load (admin only).</td></tr>'); });
  74. }
  75. function launchDockerManager(){
  76. try {
  77. parent.newFloatWindow({
  78. url: "DockerManager/index.html",
  79. width: 1100, height: 680,
  80. appicon: "DockerManager/img/icon.svg",
  81. title: "Docker Manager"
  82. });
  83. } catch (e) {
  84. // Fallback: open in a new browser tab if the desktop launcher is unavailable.
  85. window.open("../../DockerManager/index.html", "_blank");
  86. }
  87. }
  88. $("#dkl-refresh").on("click", loadRunning);
  89. $("#dkl-manage").on("click", launchDockerManager);
  90. loadRunning();
  91. })();
  92. </script>