- machines.building/room/rack/rack_unit/asset_tag, racks table (height, comment)
- API: POST /machines/{id}/location, POST /locations/import (CSV or JSON, matched by
id/serial/mac/node_name, ?dry=1), GET/POST/DELETE /racks, ?building/?room/?rack filters
- CLI: rollcall location ..., location import, location racks/rack, list -rack/-room/-building
- UI: location column and building > room > rack chips, bulk Set location…, Racks page with
elevation views and CSV import dialog, location in machine detail
- .Node.Building/Room/Rack/Unit/AssetTag in overlay templates and tag match rules
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
52 lines
1.9 KiB
HTML
52 lines
1.9 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<title>Rollcall</title>
|
|
<link rel="stylesheet" href="style.css">
|
|
</head>
|
|
<body>
|
|
<div class="shell">
|
|
<nav class="side">
|
|
<div class="brand">Rollcall<span class="muted">bare-metal fleet</span></div>
|
|
<a href="#/overview" data-nav="overview">Overview</a>
|
|
<a href="#/machines" data-nav="machines">Machines <span class="count" id="n-machines"></span></a>
|
|
<a href="#/racks" data-nav="racks">Racks <span class="count" id="n-racks"></span></a>
|
|
<a href="#/jobs" data-nav="jobs">Jobs <span class="count" id="n-jobs"></span></a>
|
|
<a href="#/tags" data-nav="tags">Tags</a>
|
|
<a href="#/profiles" data-nav="profiles">Profiles</a>
|
|
<a href="#/images" data-nav="images">OS images</a>
|
|
<div class="side-foot">
|
|
<span id="status" class="muted"></span>
|
|
<button id="logout" class="btn ghost" title="forget the admin token">Token</button>
|
|
</div>
|
|
</nav>
|
|
|
|
<main id="main"></main>
|
|
</div>
|
|
|
|
<dialog id="login">
|
|
<form method="dialog">
|
|
<h2>Admin token</h2>
|
|
<p class="muted">The <code>admin_token</code> from the server's <code>config.json</code>. Stored only in this browser.</p>
|
|
<input id="token" type="password" autocomplete="off" placeholder="token" required>
|
|
<menu><button class="btn primary" value="ok">Sign in</button></menu>
|
|
</form>
|
|
</dialog>
|
|
|
|
<!-- generic action dialog: filled by JS -->
|
|
<dialog id="dlg">
|
|
<form method="dialog" id="dlg-form">
|
|
<h2 id="dlg-title"></h2>
|
|
<div id="dlg-body" class="kv form"></div>
|
|
<p id="dlg-note" class="muted"></p>
|
|
<menu><button class="btn ghost" value="cancel" type="button" id="dlg-cancel">Cancel</button><button class="btn primary" value="ok" id="dlg-ok">OK</button></menu>
|
|
</form>
|
|
</dialog>
|
|
|
|
<div id="toast" hidden></div>
|
|
<script src="app.js"></script>
|
|
</body>
|
|
</html>
|