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 safe
29 >
30 {label.name}
31 </span>
32 {canManage && (
33 <form
34 method="POST"
35 action={`${baseUrl}/labels/remove`}
36 class="label-remove-form"
37 >
38 <input
39 type="hidden"
40 name="label_id"
41 value={String(label.id)}
42 />
43 <button
44 type="submit"
45 class="label-remove-btn"
46 title="Remove label"
47 >
48 ×
49 </button>
50 </form>
51 )}
52 </span>
53 ))}
54 {canManage && available.length > 0 && (
55 <form
56 method="POST"
57 action={`${baseUrl}/labels/add`}
58 class="label-add-inline-form"
59 >
60 <select name="label_id" class="label-select">
61 {available.map((label) => (
62 <option value={String(label.id)} safe>
63 {label.name}
64 </option>
65 ))}
66 </select>
67 <button type="submit" class="btn btn-sm btn-secondary">
68 Add label
69 </button>
70 </form>
71 )}
72 </div>
73 );
74}
75