LabelBadges.tsx
Raw
1import type { LabelRow } from "../db/index.ts";
2import { labelTextColor } from "../lib/labelColor.ts";
3
4interface LabelBadgesProps {
5 labels: LabelRow[];
6 repoLabels: LabelRow[];
7 canManage: boolean;
8 baseUrl: string;
9}
10
11export function LabelBadges({
12 labels,
13 repoLabels,
14 canManage,
15 baseUrl,
16}: LabelBadgesProps) {
17 if (labels.length === 0 && !canManage) return null;
18 const available = repoLabels.filter(
19 (l) => !labels.some((al) => al.id === l.id),
20 );
21 return (
22 <div class="issue-labels-row">
23 {labels.map((label) => (
24 <span class="label-badge-wrap">
25 <span
26 class="label-badge"
27 style={`background:${label.color};color:${labelTextColor(label.color)}`}
28 >
29 {label.name}
30 </span>
31 {canManage && (
32 <form
33 method="POST"
34 action={`${baseUrl}/labels/remove`}
35 class="label-remove-form"
36 >
37 <input
38 type="hidden"
39 name="label_id"
40 value={String(label.id)}
41 />
42 <button
43 type="submit"
44 class="label-remove-btn"
45 title="Remove label"
46 >
47 ×
48 </button>
49 </form>
50 )}
51 </span>
52 ))}
53 {canManage && available.length > 0 && (
54 <form
55 method="POST"
56 action={`${baseUrl}/labels/add`}
57 class="label-add-inline-form"
58 >
59 <select name="label_id" class="label-select">
60 {available.map((label) => (
61 <option value={String(label.id)}>
62 {label.name}
63 </option>
64 ))}
65 </select>
66 <button type="submit" class="btn btn-sm btn-secondary">
67 Add label
68 </button>
69 </form>
70 )}
71 </div>
72 );
73}
74