feat(desktop): clarify key browser search states

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Senior Frontend Engineer
2026-03-31 08:02:18 +00:00
parent 291f744e0f
commit bf6f8bc0bf
4 changed files with 278 additions and 8 deletions

View File

@@ -0,0 +1,83 @@
import { describe, expect, it } from "vitest";
import {
buildInspectorEmptyStateMessage,
buildKeyBrowserEmptyStateMessage,
buildKeyBrowserStatusMessage,
resolveKeyBrowserSearchState,
} from "./key-browser-search";
describe("key browser search helpers", () => {
it("classifies blank, contains, and wildcard search input", () => {
expect(resolveKeyBrowserSearchState(" ")).toEqual({
trimmedQuery: "",
requestPattern: null,
mode: "all",
});
expect(resolveKeyBrowserSearchState(" smoke ")).toEqual({
trimmedQuery: "smoke",
requestPattern: "*smoke*",
mode: "contains",
});
expect(resolveKeyBrowserSearchState("smoke:*")).toEqual({
trimmedQuery: "smoke:*",
requestPattern: "smoke:*",
mode: "pattern",
});
});
it("builds a stable status message for visible counts and load state", () => {
expect(
buildKeyBrowserStatusMessage({
databaseLabel: "db0",
visibleCount: 7,
hasMore: true,
isLoading: false,
search: resolveKeyBrowserSearchState("smoke"),
}),
).toBe('7+ keys visible for contains search "smoke" in db0.');
expect(
buildKeyBrowserStatusMessage({
databaseLabel: "db3",
visibleCount: 0,
hasMore: false,
isLoading: true,
search: resolveKeyBrowserSearchState("smoke:*"),
}),
).toBe('Searching db3 for "smoke:*".');
});
it("builds browser empty-state copy for blank and filtered results", () => {
expect(
buildKeyBrowserEmptyStateMessage({
databaseLabel: "db0",
isLoading: false,
search: resolveKeyBrowserSearchState(""),
}),
).toBe("No keys are visible in db0 yet.");
expect(
buildKeyBrowserEmptyStateMessage({
databaseLabel: "db2",
isLoading: false,
search: resolveKeyBrowserSearchState("audit:*"),
}),
).toBe('No keys match "audit:*" in db2.');
});
it("keeps inspector empty-state guidance aligned with browser search state", () => {
expect(
buildInspectorEmptyStateMessage("db1", resolveKeyBrowserSearchState("")),
).toBe(
"No keys are visible in db1 yet. Browse another database or refresh after data arrives.",
);
expect(
buildInspectorEmptyStateMessage("db4", resolveKeyBrowserSearchState("jobs")),
).toBe(
'No keys match "jobs" in db4. Clear or adjust the search to restore an inspector target.',
);
});
});

View File

@@ -0,0 +1,100 @@
export type KeyBrowserSearchMode = "all" | "contains" | "pattern";
export type KeyBrowserSearchState = {
trimmedQuery: string;
requestPattern: string | null;
mode: KeyBrowserSearchMode;
};
type KeyBrowserFeedbackContext = {
databaseLabel: string;
visibleCount: number;
hasMore: boolean;
isLoading: boolean;
search: KeyBrowserSearchState;
};
export function resolveKeyBrowserSearchState(value: string): KeyBrowserSearchState {
const trimmedQuery = value.trim();
if (!trimmedQuery) {
return {
trimmedQuery: "",
requestPattern: null,
mode: "all",
};
}
if (/[*?\[\]]/.test(trimmedQuery)) {
return {
trimmedQuery,
requestPattern: trimmedQuery,
mode: "pattern",
};
}
return {
trimmedQuery,
requestPattern: `*${trimmedQuery}*`,
mode: "contains",
};
}
export function buildKeyBrowserStatusMessage({
databaseLabel,
visibleCount,
hasMore,
isLoading,
search,
}: KeyBrowserFeedbackContext) {
if (isLoading) {
if (search.mode === "all") {
return `Loading keys from ${databaseLabel}.`;
}
return `Searching ${databaseLabel} for ${formatSearchLabel(search)}.`;
}
const visibleLabel = `${visibleCount}${hasMore ? "+" : ""}`;
if (search.mode === "all") {
return `${visibleLabel} keys visible in ${databaseLabel}.`;
}
const searchLabel =
search.mode === "pattern"
? `pattern ${formatSearchLabel(search)}`
: `contains search ${formatSearchLabel(search)}`;
return `${visibleLabel} keys visible for ${searchLabel} in ${databaseLabel}.`;
}
export function buildKeyBrowserEmptyStateMessage({
databaseLabel,
isLoading,
search,
}: Omit<KeyBrowserFeedbackContext, "visibleCount" | "hasMore">) {
if (isLoading) {
return `Loading keys from ${databaseLabel}...`;
}
if (search.mode === "all") {
return `No keys are visible in ${databaseLabel} yet.`;
}
return `No keys match ${formatSearchLabel(search)} in ${databaseLabel}.`;
}
export function buildInspectorEmptyStateMessage(
databaseLabel: string,
search: KeyBrowserSearchState,
) {
if (search.mode === "all") {
return `No keys are visible in ${databaseLabel} yet. Browse another database or refresh after data arrives.`;
}
return `No keys match ${formatSearchLabel(search)} in ${databaseLabel}. Clear or adjust the search to restore an inspector target.`;
}
function formatSearchLabel(search: KeyBrowserSearchState) {
return `"${search.trimmedQuery}"`;
}