Files
slack-sieve/static/index.html
T
ilia 4b034d19f6
CI / skip-ci-check (push) Successful in 4s
CI / secret-scan (push) Failing after 2s
CI / python-ci (push) Successful in 25s
Add triage tests, prepare-export, and UI fixes for Levkin migration.
Cherry-pick heuristics, manifest merge, global file search, scrollbar styling, and pytest/Playwright coverage unblock review and filtered export for mmetl.
2026-06-03 15:42:48 -04:00

161 lines
7.9 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Slack → Mattermost import review</title>
<link rel="stylesheet" href="/static/app.css" />
</head>
<body>
<div class="app">
<header class="topbar">
<h1>Slack import review</h1>
<div class="stats" id="stats"></div>
<div class="global-search-wrap">
<div class="global-search-row">
<select id="global-search-mode" title="Search scope">
<option value="text">Text</option>
<option value="files">Files (all channels)</option>
</select>
<select id="global-file-type" class="hidden" title="Attachment type">
<option value="all">All types</option>
<option value="image">Images</option>
<option value="pdf">PDF</option>
<option value="doc">Word</option>
<option value="spreadsheet">Spreadsheets</option>
<option value="slides">Slides</option>
<option value="video">Video</option>
<option value="text">Text files</option>
<option value="other">Other</option>
</select>
<input
type="search"
id="global-search"
placeholder="Search channels & messages… (press /)"
autocomplete="off"
/>
</div>
<div class="search-results hidden" id="global-search-results"></div>
</div>
<div class="actions">
<button type="button" class="primary" id="btn-save">Save</button>
</div>
</header>
<aside class="panel left">
<div class="panel-header filters">
<input type="search" id="sidebar-search" placeholder="Filter list…" />
<div class="filter-row">
<select id="filter-status">
<option value="all">All</option>
<option value="undecided">Undecided</option>
<option value="import">Import</option>
<option value="partial">Has picks</option>
<option value="skip">Skip</option>
</select>
<label class="chk"><input type="checkbox" id="filter-hide-archived" /> Hide archived</label>
</div>
</div>
<div class="progress-bar" id="review-progress"></div>
<div class="tabs">
<button type="button" class="active" data-tab="channels">Channels</button>
<button type="button" data-tab="users">Users</button>
</div>
<div class="list" id="sidebar-list"></div>
</aside>
<main class="center">
<div class="triage-bar">
<div class="triage-nav">
<button type="button" class="btn-nav" id="btn-prev" title="Previous channel">← Prev</button>
<button type="button" class="btn-nav btn-next" id="btn-next" title="Next channel (N)">Next →</button>
</div>
<div class="triage-center">
<h2 id="channel-title">Select a channel</h2>
<span class="triage-meta" id="channel-meta">&nbsp;</span>
</div>
<div class="triage-decide">
<label class="mode-toggle chk" title="When on, only checked messages import">
<input type="checkbox" id="import-mode-pick" />
Cherry-pick messages
</label>
<button type="button" class="btn-skip" id="btn-skip" disabled title="Skip whole channel (Shift+S)">Skip channel</button>
<button type="button" class="btn-import" id="btn-import" disabled title="Import whole channel (Shift+I)">Import channel</button>
</div>
</div>
<div class="message-filters">
<div class="msg-nav">
<button type="button" class="btn-msg-nav" id="btn-msg-prev" title="Previous message (K)">↑</button>
<button type="button" class="btn-msg-nav" id="btn-msg-next" title="Next message (J)">↓</button>
<span class="msg-nav-status" id="msg-nav-status">—</span>
</div>
<input type="search" id="message-search" placeholder="Filter messages…" />
<select id="filter-attachment-type" title="Show messages with this attachment type">
<option value="all">All msgs</option>
<option value="any">Has any file</option>
<option value="image">Has image</option>
<option value="pdf">Has PDF</option>
<option value="doc">Has doc</option>
<option value="spreadsheet">Has spreadsheet</option>
</select>
<button type="button" class="btn-mini" id="btn-select-images" title="Toggle import for visible image messages">Select images in view</button>
<button type="button" class="btn-mini" id="btn-select-files" title="Toggle import for visible file attachments">Select files in view</button>
<label class="chk"><input type="checkbox" id="filter-hide-bots" /> Hide bots</label>
<label class="chk"><input type="checkbox" id="filter-hide-system" checked /> Hide system</label>
<label class="chk"><input type="checkbox" id="filter-only-selected" /> Only selected</label>
<span class="filter-count" id="filter-count"></span>
</div>
<div class="messages-wrap">
<div class="messages" id="messages">
<div class="empty">Pick a channel — scroll history, cherry-pick messages, or import/skip the whole channel.</div>
</div>
</div>
<div class="shortcuts-hint">
<kbd>J</kbd>/<kbd>K</kbd> prev/next message · <kbd>Space</kbd> toggle · <kbd>I</kbd> import · <kbd>S</kbd> skip · <kbd>N</kbd> next channel · <kbd>⇧I</kbd>/<kbd>⇧S</kbd> whole channel
</div>
</main>
<aside class="panel right" id="detail-panel">
<div class="selection-summary" id="selection-summary">
<p class="hint">Click a message to set import / merge / skip for that message, thread, or file.</p>
</div>
<div class="form-block compact hidden" id="message-detail">
<div class="msg-preview" id="msg-preview"></div>
<label>Action</label>
<select id="msg-action">
<option value="inherit">Default (from channel)</option>
<option value="import">Import this</option>
<option value="skip">Skip this</option>
<option value="merge">Merge into channel…</option>
</select>
<input type="text" id="msg-merge-target" class="hidden" placeholder="#target-channel" />
<label>Notes</label>
<textarea id="msg-notes" rows="2" placeholder="Importer note for this message/thread…"></textarea>
<div id="file-toggles"></div>
<button type="button" id="btn-thread-all" class="hidden">Select whole thread</button>
</div>
<hr class="panel-divider" />
<div class="form-block compact">
<label for="mattermost-channel">Mattermost channel</label>
<input type="text" id="mattermost-channel" placeholder="defaults to Slack name" />
</div>
<div class="form-block compact">
<label for="mattermost-team">Mattermost team</label>
<input type="text" id="mattermost-team" placeholder="optional" />
</div>
<div class="form-block">
<label for="item-notes">Channel notes</label>
<textarea id="item-notes" rows="3" placeholder="Channel-level importer instructions…"></textarea>
</div>
<div class="form-block">
<label for="global-notes">Global notes</label>
<textarea id="global-notes" rows="2" placeholder="Whole-import rules…"></textarea>
</div>
<div class="save-status" id="save-status"></div>
</aside>
</div>
<script src="https://cdn.jsdelivr.net/npm/mammoth@1.8.0/mammoth.browser.min.js"></script>
<script src="/static/app.js"></script>
</body>
</html>