140 lines
4.5 KiB
HTML
140 lines
4.5 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Duriin Admin — Articles</title>
|
|
<link rel="stylesheet" href="/admin/assets/css/base.css">
|
|
<link rel="stylesheet" href="/admin/assets/css/layout.css">
|
|
<link rel="stylesheet" href="/admin/assets/css/components.css">
|
|
</head>
|
|
<body>
|
|
|
|
<header class="app-header">
|
|
<h1>Duriin <span>Admin</span></h1>
|
|
<nav class="tabs">
|
|
<a href="/admin/ingest" class="active">Ingest</a>
|
|
<a href="/admin/intelligence">Intelligence</a>
|
|
<a href="/admin/stats">Stats</a>
|
|
<a href="/admin/sql">SQL</a>
|
|
</nav>
|
|
</header>
|
|
|
|
<nav class="subnav">
|
|
<a href="/admin/ingest/articles" class="active">Articles</a>
|
|
<a href="/admin/ingest/events">Events</a>
|
|
</nav>
|
|
|
|
<div class="stats-bar" id="statsBar">
|
|
<div class="stat"><span class="label">Total articles</span><span class="value" id="s-total">—</span></div>
|
|
<div class="stat"><span class="label">With content</span><span class="value" id="s-content">—</span></div>
|
|
<div class="stat"><span class="label">With embedding</span><span class="value" id="s-embed">—</span></div>
|
|
<div class="stat"><span class="label">Events</span><span class="value" id="s-events">—</span></div>
|
|
</div>
|
|
|
|
<main class="content">
|
|
|
|
<div class="filters">
|
|
<label>Keyword <input type="text" id="f-keyword" placeholder="search..." /></label>
|
|
<label>Source <select id="f-source"><option value="">All sources</option></select></label>
|
|
<label>Status
|
|
<select id="f-status">
|
|
<option value="">All</option>
|
|
<option value="ok">ok</option>
|
|
<option value="error">error</option>
|
|
<option value="pending">pending</option>
|
|
<option value="null">no status</option>
|
|
</select>
|
|
</label>
|
|
<label>From <input type="date" id="f-from" /></label>
|
|
<label>To <input type="date" id="f-to" /></label>
|
|
<button type="button" class="primary" id="searchBtn" style="align-self:flex-end">Search</button>
|
|
</div>
|
|
|
|
<div class="table-wrap">
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th style="width:44px">ID</th>
|
|
<th>Title</th>
|
|
<th>Source</th>
|
|
<th>Status</th>
|
|
<th>Ingested</th>
|
|
<th style="width:80px"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="articleTable"></tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="pagination">
|
|
<button id="prevBtn">← Prev</button>
|
|
<span id="pageInfo"></span>
|
|
<button id="nextBtn">Next →</button>
|
|
</div>
|
|
|
|
</main>
|
|
|
|
|
|
<!-- article edit modal -->
|
|
<div class="overlay" id="articleOverlay">
|
|
<div class="modal">
|
|
<h2 id="modalTitle">Article</h2>
|
|
<div id="modalMeta" style="font-size:12px; color:var(--muted-dark); margin-top:4px; display:flex; gap:14px; flex-wrap:wrap"></div>
|
|
<div class="modal-divider"></div>
|
|
|
|
<div class="field">
|
|
<label>Title</label>
|
|
<input type="text" id="m-title" />
|
|
</div>
|
|
<div class="field">
|
|
<label>Description</label>
|
|
<textarea id="m-desc" style="min-height:70px"></textarea>
|
|
</div>
|
|
<div class="field">
|
|
<label>Content</label>
|
|
<textarea id="m-content" style="min-height:200px"></textarea>
|
|
</div>
|
|
|
|
<div style="display:flex; gap:12px; flex-wrap:wrap">
|
|
<div class="field" style="flex:1; min-width:140px">
|
|
<label>Content status</label>
|
|
<select id="m-status">
|
|
<option value="">— none —</option>
|
|
<option value="ok">ok</option>
|
|
<option value="error">error</option>
|
|
<option value="pending">pending</option>
|
|
</select>
|
|
</div>
|
|
<div class="field" style="flex:1; min-width:140px">
|
|
<label>Language</label>
|
|
<input type="text" id="m-lang" placeholder="en" />
|
|
</div>
|
|
<div class="field" style="flex:1; min-width:140px">
|
|
<label>Pub date</label>
|
|
<input type="text" id="m-pubdate" />
|
|
</div>
|
|
<div class="field" style="flex:1; min-width:140px">
|
|
<label>Is index page</label>
|
|
<select id="m-indexpage">
|
|
<option value="0">No</option>
|
|
<option value="1">Yes</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
|
<button class="danger" id="deleteBtn">Delete</button>
|
|
<div style="flex:1"></div>
|
|
<button id="cancelBtn">Cancel</button>
|
|
<button class="primary" id="saveBtn">Save</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="toast"><span class="toast-dot"></span><span id="toast-msg"></span></div>
|
|
|
|
<script src="/admin/assets/js/app.js"></script>
|
|
<script src="/admin/assets/js/articles.js"></script>
|
|
</body>
|
|
</html>
|