+ {/* Search + filter controls */}
+
+
+
+ setDraftQuery(event.currentTarget.value)}
+ placeholder="Search documents..."
+ aria-label="Search documents"
+ className="h-9 pl-9 pr-9 text-sm"
+ />
+ {draftQuery.length > 0 ? (
+
+ ) : null}
+
+
+
+ {/* Status filter */}
+
+
+
+
+
+ Status
+ {DOCUMENT_STATUSES.map((status) => (
+ {
+ event.preventDefault();
+ toggleMulti("status", status);
+ }}
+ >
+ {STATUS_LABELS[status]}
+
+ ))}
+
+
+
+ {/* Type filter */}
+
+
+
+
+
+ Type
+ {DOCUMENT_TYPES.map((type) => (
+ {
+ event.preventDefault();
+ toggleMulti("type", type);
+ }}
+ >
+ {TYPE_LABELS[type]}
+
+ ))}
+
+
+
+ {/* Owner filter */}
+
+
+
+
+
+ Owner
+ updateParams((params) => params.delete("owner"))}
+ className="justify-between"
+ >
+ Any owner
+ {!ownerFilter ? : null}
+
+
+ {(agents ?? []).map((agent) => (
+ updateParams((params) => params.set("owner", agent.id))}
+ className="justify-between"
+ >
+ {agent.name}
+ {ownerFilter === agent.id ? : null}
+
+ ))}
+
+
+
+ {/* Toggles + sort */}
+
+
+
+
+
+ Filters
+ {
+ event.preventDefault();
+ toggleFlag("feedback");
+ }}
+ >
+ With open feedback
+
+ {
+ event.preventDefault();
+ toggleFlag("trusted");
+ }}
+ >
+ Trusted sources only
+
+
+ Sort by
+ {SORT_OPTIONS.map((option) => (
+ setSort(option.value)}
+ className="justify-between"
+ >
+ {option.label}
+ {sort === option.value ? : null}
+
+ ))}
+
+
+
+
+
+ {/* Active filter chips */}
+ {hasActiveFilters ? (
+
+ {statusFilter.map((status) => (
+ toggleMulti("status", status)} />
+ ))}
+ {typeFilter.map((type) => (
+ toggleMulti("type", type)} />
+ ))}
+ {ownerFilter ? (
+ updateParams((params) => params.delete("owner"))}
+ />
+ ) : null}
+ {hasFeedback ? toggleFlag("feedback")} /> : null}
+ {trustedOnly ? toggleFlag("trusted")} /> : null}
+
+
+ ) : null}
+
+ {error ?
{(error as Error).message}
: null}
+
+ {isLoading ? (
+
+ ) : sortedDocuments.length === 0 ? (
+ hasActiveFilters ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ {sortedDocuments.map((document) => (
+
+ ))}
+
+ )}
+
+ );
+}
+
+function FilterChip({ label, onRemove }: { label: string; onRemove: () => void }) {
+ return (
+