70a813edfa
- whitelist HTML sanitizer (stdlib tokenizer) with XSS vector tests - developer board: pool-scoped visibility, customer/search/minBounty/sort filters, stale-task age badges, competing-claims visibility setting, saved filters in profile extras - claims: request/withdraw (developer), approve/decline (consultant) with notifications to winners and losers; unassign/abandon back to board - work tracking: start, sanitized comments with @mention notifications, time logging, submit for review - review queue + review with per-AC checklist stored on the timeline; approve writes the immutable bountyAwards row (human assignees only) - assign-to-AI: §5.2 job submission, HMAC-verified callback endpoint, idempotent by jobId, artifacts downloaded into GridFS, failure path keeps the task assigned with timeline + notification - notifications API + bell with unread badge, dropdown, page, WS toasts - pages: bounty board, my-tasks kanban, task detail (role-driven actions, review dialog, AI dialog), review queue, developer pool Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
47 lines
1.5 KiB
HTML
47 lines
1.5 KiB
HTML
{{define "content"}}
|
|
<h1>Bounty Board</h1>
|
|
<div class="error-box" id="error" role="alert"></div>
|
|
|
|
<div class="row mt" id="board-filters">
|
|
<div class="field">
|
|
<label for="f-q">Search</label>
|
|
<input type="search" id="f-q" placeholder="Search title or description… ( / )">
|
|
</div>
|
|
<div class="field">
|
|
<label for="f-customer">Customer</label>
|
|
<select id="f-customer"><option value="">All</option></select>
|
|
</div>
|
|
<div class="field">
|
|
<label for="f-min">Min bounty</label>
|
|
<input type="number" id="f-min" min="0" step="10" placeholder="0">
|
|
</div>
|
|
<div class="field">
|
|
<label for="f-sort">Sort</label>
|
|
<select id="f-sort">
|
|
<option value="">Newest</option>
|
|
<option value="bounty">Highest bounty</option>
|
|
</select>
|
|
</div>
|
|
<div class="field" style="flex:0;align-self:flex-end">
|
|
<button class="btn" id="f-save" title="Save current filters as default">Save</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="grid mt" id="board-grid"></div>
|
|
|
|
<dialog id="claim-dialog">
|
|
<form method="dialog" id="claim-form" class="stack" style="min-width:380px">
|
|
<h2>Request assignment</h2>
|
|
<p class="muted" id="claim-task-title"></p>
|
|
<div class="field">
|
|
<label for="claim-note">Pitch note (optional)</label>
|
|
<textarea id="claim-note" placeholder="why you?"></textarea>
|
|
</div>
|
|
<div class="spread">
|
|
<button class="btn" type="button" id="claim-cancel">Cancel</button>
|
|
<button class="btn primary" type="submit">Request assignment</button>
|
|
</div>
|
|
</form>
|
|
</dialog>
|
|
{{end}}
|