Skip to content

replace other InputGroup components#2830

Merged
dimaMachina merged 16 commits intomainfrom
unify-radix-components2
Mar 25, 2026
Merged

replace other InputGroup components#2830
dimaMachina merged 16 commits intomainfrom
unify-radix-components2

Conversation

@dimaMachina
Copy link
Collaborator

based on #2810 (comment)

@changeset-bot
Copy link

changeset-bot bot commented Mar 25, 2026

🦋 Changeset detected

Latest commit: 13b021d

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 10 packages
Name Type
@inkeep/agents-manage-ui Patch
@inkeep/agents-api Patch
@inkeep/agents-cli Patch
@inkeep/agents-core Patch
@inkeep/agents-email Patch
@inkeep/agents-mcp Patch
@inkeep/agents-sdk Patch
@inkeep/agents-work-apps Patch
@inkeep/ai-sdk-provider Patch
@inkeep/create-agents Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel
Copy link

vercel bot commented Mar 25, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
agents-api Ready Ready Preview, Comment Mar 25, 2026 9:47am
agents-docs Ready Ready Preview, Comment Mar 25, 2026 9:47am
agents-manage-ui Ready Ready Preview, Comment Mar 25, 2026 9:47am

Request Review

@dimaMachina
Copy link
Collaborator Author

@claude --review and add a changeset

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

TL;DR — Replaces ad-hoc search input patterns (absolutely positioned icons, manual padding classes) across five manage-UI components with the InputGroup / InputGroupAddon / InputGroupInput compound component, and moves "clear filter" buttons inline via InputGroupAddon align="inline-end". Adds a changeset for the migration.

Key changes

  • Migrate search inputs to InputGroup — All five components swap raw Input + absolutely positioned Search icons for the structured InputGroup compound component, eliminating manual pl-* / pr-* padding and absolute positioning.
  • Inline clear buttons into InputGroupAddon — Test case filters, evaluation results filters, conversation stats, and Slack channel defaults now render the clear/X button inside an InputGroupAddon align="inline-end" instead of as a standalone button or absolutely positioned overlay.
  • Remove standalone "Clear Filters" buttonsTestCaseFilters and EvaluationResultsFilters drop the separate clearFilters() function and external "Clear" / "Clear Filters" button in favor of the inline X inside the input group.
  • Consolidate layout in ConversationStatsCard — The search bar moves from a sibling div next to CardTitle into the title row itself, using w-full on the title and lg:w-md ml-auto to right-align the input group.
  • Add changeset — Declares a patch bump for @inkeep/agents-manage-ui.

Summary | 6 files | 14 commits | base: mainunify-radix-components2


Search inputs migrated to InputGroup compound component

Before: Each search input was a raw Input with an absolutely positioned Search icon and manual pl-8/pl-9/pl-10 padding. Clear buttons were either absolutely positioned overlays or standalone "Clear Filters" buttons outside the input.
After: All five components use InputGroupInputGroupInput + InputGroupAddon for the search icon, and conditionally render a second InputGroupAddon align="inline-end" for the clear button. No manual positioning or padding classes remain.

The InputGroup compound component handles icon sizing, padding offsets, and alignment internally — consumers just declare intent via InputGroupAddon placement. The standalone clearFilters() functions in TestCaseFilters and EvaluationResultsFilters are removed since the inline X button now clears only the search input directly via updateFilter('searchInput', '').

Why move the search bar inside CardTitle in ConversationStatsCard? Previously the search bar sat in a sibling div at the same flex level as the title, requiring flex-1 max-w-md relative on a wrapper. By nesting it inside the CardTitle with w-full on the title and lg:w-md ml-auto on a wrapper div, the layout stays cohesive and the error message (searchError) flows naturally below the input instead of using absolute -bottom-5 positioning.

nango-providers-grid.tsx · test-case-filters.tsx · evaluation-results-filters.tsx · conversation-stats-card.tsx · channel-defaults-section.tsx

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

Copy link
Contributor

@pullfrog pullfrog bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clean migration from ad-hoc absolute-positioned icon patterns to the InputGroup compound component across all 5 identified locations. One medium-severity UX concern worth addressing before merge.

Pullfrog  | Fix all ➔Fix 👍s ➔View workflow runpullfrog.com𝕏

Comment on lines +59 to +65
{hasActiveFilters && (
<InputGroupAddon align="inline-end">
<Button variant="ghost" size="icon-sm" onClick={clearFilters}>
<X />
</Button>
</InputGroupAddon>
)}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This X button calls clearFilters() which resets all filters (agent, output status, search text) — not just the search input. An icon-only X inside a search field conventionally means "clear this text field." The old code had a standalone "Clear Filters" button with a text label next to "Show Filters," which made the scope of the action explicit.

Either scope this button to only clear the search text (updateFilter('searchInput', '')) or keep a separate "Clear Filters" button outside the InputGroup for the broader reset action.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@pullfrog check now

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The action is correctly scoped now — updateFilter('searchInput', '') only clears the search text. One small nit: the X button visibility is still gated on hasActiveFilters (any filter active), so it appears inside the search box even when searchInput is empty but another filter is set. Consider changing the condition to filters.searchInput so the button only shows when there's search text to clear.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

Copy link
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review Summary

(2) Total Issues | Risk: Medium

🟠⚠️ Major (2) 🟠⚠️

Inline Comments:

  • 🟠 Major: test-case-filters.tsx:61 X button inside search clears ALL filters instead of just search text
  • 🟠 Major: evaluation-results-filters.tsx:76 X button inside search clears ALL filters instead of just search text

Both issues stem from the same UX problem: the X button was moved from a separate "Clear Filters" button (outside the search box) to inline inside the InputGroup (inside the search box), but the clearFilters() behavior was kept. Users expect an X button inside a search field to clear only the search text, not unrelated dropdown filters.

💭 Consider (5) 💭

💭 1) nango-providers-grid.tsx:93, test-case-filters.tsx:56, evaluation-results-filters.tsx:71, conversation-stats-card.tsx:128, channel-defaults-section.tsx:254 Explicit align prop for Search icon

Issue: The Search icon InputGroupAddon doesn't specify align prop, relying on the default (inline-start).
Why: While functionally correct (default is inline-start), explicit is better than implicit for maintainability. The clear button addons correctly specify align="inline-end".
Fix: Add align="inline-start" to Search icon addons for consistency with the align="inline-end" pattern used for clear buttons.

✅ What Looks Good

  • Clean migration from ad-hoc Input + absolute-positioned icons to the unified InputGroup component system
  • Consistent use of InputGroupAddon with align="inline-end" for clear buttons
  • Proper use of InputGroupInput which delegates styling to the Input component
  • The aria-invalid attribute is properly passed through in conversation-stats-card.tsx
  • Button sizes consistently use size="icon-sm" for the X buttons

🚫 REQUEST CHANGES

Summary: The refactoring is clean and the InputGroup component API is being used correctly. However, there's a UX regression in two files where the clear button behavior changed unexpectedly. The X button inside the search input should only clear the search text, not all filters. This is a quick fix — just change clearFilters to () => updateFilter('searchInput', '') in the two affected files.

Reviewers (1)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
pr-review-frontend 7 0 5 0 2 0 0
Total 7 0 5 0 2 0 0

Copy link
Contributor

@claude claude bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review Summary

(3) Total Issues | Risk: Low

🟡 Minor (3) 🟡

Inline Comments:

  • 🟡 Minor: test-case-filters.tsx:61 Missing aria-label on clear button
  • 🟡 Minor: evaluation-results-filters.tsx:76 Missing aria-label on clear button
  • 🟡 Minor: conversation-stats-card.tsx:133 Missing aria-label on clear button

💭 Consider (2) 💭

💭 1) test-case-filters.tsx:49 InputGroup loses flex-1 behavior

Issue: The old wrapper had flex-1 allowing the input to grow within the flex container. The new InputGroup only has max-w-sm.
Why: On wider screens, the input will now stay at its natural width rather than expanding to fill available space.
Fix: If the input should grow, add flex-1 to InputGroup: <InputGroup className="flex-1 max-w-sm">.

💭 2) evaluation-results-filters.tsx:64 InputGroup loses flex-1 and min-w-[200px]

Issue: The old wrapper had flex-1 min-w-[200px] max-w-sm but the new InputGroup only has max-w-sm.
Why: The input may collapse below 200px on smaller viewports and won't grow to fill available space.
Fix: Consider adding flex-1 min-w-[200px] to match previous behavior.


💡 APPROVE WITH SUGGESTIONS

Summary: Clean refactoring to standardize on the InputGroup component! 🎉 The only issues are missing aria-label attributes on 3 clear buttons — channel-defaults-section.tsx correctly has aria-label="Clear search" but the other files are missing it. All three have 1-click suggestions attached. The flex-1 changes are likely intentional design decisions but worth confirming.

Reviewers (2)
Reviewer Returned Main Findings Consider While You're Here Inline Comments Pending Recs Discarded
pr-review-frontend 6 0 2 0 3 0 1
pr-review-consistency 3 0 0 0 0 0 3
Total 9 0 2 0 3 0 4

Note: Consistency reviewer findings were deduplicated with frontend reviewer (same aria-label issues).

Discarded (4)
Location Issue Reason Discarded
nango-providers-grid.tsx:87 Changed responsive breakpoint from max-w-md to sm:max-w-md Likely intentional improvement for mobile UX (full-width search on small screens)
test-case-filters.tsx:59-65 UX change: visible "Clear Filters" button moved to inline icon This is an intentional design decision as part of the InputGroup standardization
evaluation-results-filters.tsx:74-80 UX change: visible "Clear" button moved to inline icon Same as above — intentional design decision
conversation-stats-card.tsx:116 Search input moved inside CardTitle Layout restructuring is intentional to accommodate the InputGroup pattern

@github-actions github-actions bot deleted a comment from claude bot Mar 25, 2026
@github-actions github-actions bot deleted a comment from claude bot Mar 25, 2026
Base automatically changed from unify-radix-components to main March 25, 2026 08:37
@itoqa
Copy link

itoqa bot commented Mar 25, 2026

Ito Test Report ❌

16 test cases ran. 1 failed, 15 passed.

Overall, 16 test cases were executed with 15 passing and 1 failing, confirming stable behavior across InputGroup-driven search/filter/clear flows in Credentials Providers, Dataset Runs, Evaluation Results/Run Configs, Traces debounce and pagination, Slack channel filtering (including mobile), protected-route auth redirects, and clear-button idempotency, with malformed/injection-like inputs remaining inert and no crashes or unexpected resets observed. The single confirmed Medium defect is in Slack channel permission boundaries, where unauthorized channel-agent updates can show success feedback and optimistic UI changes despite backend payloads returning success:false on HTTP 200, causing misleading UX until a refresh reveals the change was not persisted.

❌ Failed (1)
Category Summary Screenshot
Adversarial 🟠 Unauthorized channel configuration flow can show success feedback even when the backend returns success:false, and changes do not persist after refresh. ADV-3
🟠 Slack permission boundary blocks unauthorized channel configuration
  • What failed: The UI can present a successful mutation outcome even when the backend response body indicates success:false, so the apparent update is not persisted and reverts after reload.
  • Impact: Users receive misleading success feedback for unauthorized channel configuration actions. This can cause incorrect operational assumptions until a refresh reveals the true persisted state.
  • Introduced by this PR: No – pre-existing bug (code not changed in this PR)
  • Steps to reproduce:
    1. Sign in as a non-admin/member user with Slack linked but without permission for a target channel.
    2. Open Slack Channel Defaults and attempt to set or reset the channel agent on that unauthorized channel row.
    3. Observe success-style feedback, then refresh and verify the channel configuration reverts because the mutation did not persist.
  • Code analysis: I reviewed the Slack channel-settings backend routes, the channel/member permission middleware, and the frontend Slack mutation handlers. The backend route returns HTTP 200 with success:false on workspace/tenant mismatch, while frontend API/mutation handlers only gate on HTTP status and proceed with optimistic updates/success toasts when the promise resolves.
  • Why this is likely a bug: Production code currently treats transport-level HTTP success as mutation success without validating success in the response payload, which directly enables false-positive success UX.

Relevant code:

packages/agents-work-apps/src/slack/routes/workspaces.ts (lines 851-855)

const workspace = await findWorkspaceConnectionByTeamId(teamId);
if (!workspace || !verifyTenantOwnership(c, workspace.tenantId)) {
  logger.warn({ teamId }, 'Workspace not found or tenant mismatch');
  return c.json({ success: false, configId: '' });
}

agents-manage-ui/src/features/work-apps/slack/api/slack-api.ts (lines 218-223)

if (!response.ok) {
  const error = await response.json().catch(() => ({ error: 'Unknown error' }));
  throw new Error(error.error || 'Failed to set channel agent');
}
return response.json();

agents-manage-ui/src/features/work-apps/slack/components/agent-configuration-card/index.tsx (lines 217-236)

try {
  await slackApi.setChannelDefaultAgent({
    teamId,
    channelId,
    agentConfig: {
      projectId: agent.projectId,
      agentId: agent.id,
      grantAccessToMembers,
    },
    channelName,
  });

  setChannels((prev) =>
    prev.map((ch) =>
      ch.id === channelId ? { ...ch, hasAgentConfig: true, agentConfig: config } : ch
    )
  );

  toast.success(`#${channelName} now uses "${agent.name}"`);
✅ Passed (15)
Category Summary Screenshot
Adversarial Injection-like search payload rendered as inert text without side effects. ADV-1
Adversarial Oversized malformed payload stayed inert in evaluation search and clear restored baseline safely. ADV-2
Adversarial Unauthenticated deep-link to a protected traces route was redirected to login, with auth gate behavior confirmed. ADV-4
Edge No-match empty state appeared and Clear search restored providers. EDGE-1
Edge Clear icon visibility correctly follows active filter state, including Output Status set to No Output. EDGE-2
Edge No-match flow recovered correctly: empty-state clear returned filters to baseline (All + empty query) and restored channel rows. EDGE-5
Mobile At 390x844, Slack filter controls stayed readable/interactive and chip-search operations worked without clipping/overlap. MOBILE-2
Rapid Rapid type/clear/filter cycles stayed stable with no crash or frozen controls and clean final reset. RAPID-1
Rapid Not a real application bug; clear-button actions remain idempotent and stable across migrated InputGroup surfaces. RAPID-3
Happy-path Providers search and navigation behaved correctly with InputGroup. ROUTE-1
Happy-path Search/filter/clear workflow on dataset runs behaved correctly, including inline clear visibility during active filters. ROUTE-2
Happy-path Combined search/status/evaluator/agent and output-schema clear reset behaved correctly on evaluation job results. ROUTE-3
Happy-path Run-config search and status filters persisted through polling without unexpected reset. ROUTE-4
Happy-path Traces search debounce and pagination hide/show behavior are intact; prior issue was environment/auth setup related, not a product defect. ROUTE-5
Happy-path Admin Slack Channel Defaults rendered correctly; chip filters composed with search; inline clear reset only search while preserving chip filter. ROUTE-6

Commit: 064bed4

View Full Run


Tell us how we did: Give Ito Feedback

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Reviewed the updated code in test-case-filters.tsx. The X button action is now correctly scoped to only clear the search input (updateFilter('searchInput', '')) instead of resetting all filters. Left a minor suggestion to also tighten the visibility condition from hasActiveFilters to filters.searchInput.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Addressed review feedback on the X clear button in search inputs.

Changes pushed (906a952):

The X button's onClick was already fixed to call updateFilter('searchInput', '') instead of clearFilters(), but it was still conditioned on hasActiveFilters — meaning it would appear when any filter was set, even with an empty search input. Updated both files to condition on filters.searchInput instead, and removed the now-unused hasActiveFilters variable:

  • evaluation-results-filters.tsx{hasActiveFilters &&{filters.searchInput &&, removed hasActiveFilters
  • test-case-filters.tsx — same fix

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Addressed review feedback on test-case-filters.tsx:

  • Confirmed the X button now correctly clears only the search input (updateFilter('searchInput', '')) instead of all filters.
  • Fixed the visibility condition: changed hasActiveFiltersfilters.searchInput so the clear button only appears when the search box has text, not when unrelated dropdown filters are active.

Pushed in commit 114262f.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Verified all review feedback from @dimaMachina's "check now" requests across 4 threads:

  • evaluation-results-filters.tsx: onClick correctly calls updateFilter('searchInput', '') (not clearFilters), aria-label="Clear search" present
  • test-case-filters.tsx: Same fix applied — search clear is correctly scoped, aria-label present
  • conversation-stats-card.tsx: Already confirmed in earlier run — aria-label present

All originally flagged issues (clear-all-filters UX regression + missing aria-labels) are resolved. No code changes needed.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Verified that the accessibility issue flagged in the review has been addressed. The icon-only clear button at test-case-filters.tsx:63 now includes aria-label="Clear search". Thread resolved — no code changes needed.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Checked the review comment from @dimaMachina on evaluation-results-filters.tsx. The accessibility concern (missing aria-label on the icon-only clear button) is already addressed — the button has aria-label="Clear search" at line 78. Resolved the thread.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Verified the review feedback on conversation-stats-card.tsx — the aria-label="Clear search" attribute is already present on line 137. Replied and resolved the thread.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@vercel vercel bot temporarily deployed to Preview – agents-docs March 25, 2026 09:41 Inactive
@vercel vercel bot temporarily deployed to Preview – agents-docs March 25, 2026 09:42 Inactive
@dimaMachina
Copy link
Collaborator Author

@claude changeset please

@inkeep-internal-ci
Copy link
Contributor

inkeep-internal-ci bot commented Mar 25, 2026

Claude finished @dimaMachina's task in 1m 5s —— View job


Adding Changeset

  • Create changeset for agents-manage-ui

Added changeset unify-input-group-components.md — patch for @inkeep/agents-manage-ui: "Replace ad-hoc search input patterns with unified InputGroup compound component"

Pushed in commit 13b021d.

Co-authored-by: Dimitri POSTOLOV <dimaMachina@users.noreply.github.com>
@pullfrog
Copy link
Contributor

pullfrog bot commented Mar 25, 2026

Acknowledged the author's clarification that lg:w-md resolves correctly in Tailwind v4 (maps to width: var(--container-md)). Replied and resolved the thread — no code changes needed.

Pullfrog  | View workflow run | Triggered by Pullfrogpullfrog.com𝕏

@dimaMachina dimaMachina added this pull request to the merge queue Mar 25, 2026
Merged via the queue into main with commit ef7987f Mar 25, 2026
23 of 24 checks passed
@dimaMachina dimaMachina deleted the unify-radix-components2 branch March 25, 2026 10:32
@itoqa
Copy link

itoqa bot commented Mar 25, 2026

Ito Test Report ❌

11 test cases ran. 1 failed, 10 passed.

Overall, 11 test cases were executed with 10 passing and 1 failing, indicating the InputGroup migration and related search/filter flows are largely stable with no confirmed production defects in the covered providers, evaluations, traces, Slack, whitespace-normalization, zero-results, and XSS-safety scenarios. The key issue was one Medium bug introduced in dataset run details on mobile (390x844), where a non-wrapping filter header row can overflow or clip the search and Show/Hide Filters controls, while authorization boundaries for restricted Slack channel edits correctly blocked unauthorized changes without persistence.

❌ Failed (1)
Category Summary Screenshot
Edge 🟠 Dataset run mobile filter bar uses a non-wrapping row that can overflow/clamp controls at 390px instead of wrapping/stacking. EDGE-3
🟠 Mobile viewport layout for updated search groups
  • What failed: The control row is coded as a single horizontal non-wrapping flex line, so controls can overflow or become clipped on narrow mobile widths instead of wrapping/stacking as expected.
  • Impact: Mobile users can lose access to filter controls or see clipped controls, which blocks reliable filtering workflows on small screens. This directly degrades usability for dataset run triage on phones.
  • Introduced by this PR: Yes – this PR modified the relevant code
  • Steps to reproduce:
    1. Open a dataset run details page.
    2. Set viewport to 390x844.
    3. Observe the search input group and adjacent Show/Hide Filters button in the top control row.
  • Code analysis: I inspected the dataset filters component and related shared input-group implementation in production UI code. The dataset filter row uses flex items-center without any flex-wrap or responsive stack rule, while the search control uses InputGroup with width constraints plus a sibling button; this combination creates a plausible overflow condition in narrow viewports. The same PR also adds flex-wrap to Slack channel defaults, reinforcing that wrapping was needed for similar control rows.
  • Why this is likely a bug: The dataset control row lacks any wrapping/stacking behavior in code while containing multiple horizontally arranged controls, so narrow mobile widths can produce overflow/clipping by design rather than test setup artifacts.

Relevant code:

agents-manage-ui/src/components/datasets/test-case-filters.tsx (lines 40-75)

<div className="flex items-center gap-3">
  <InputGroup className="max-w-sm">
    <InputGroupInput
      type="text"
      placeholder="Search test cases..."
      value={filters.searchInput || ''}
      onChange={(e) => updateFilter('searchInput', e.target.value)}
    />
    <InputGroupAddon>
      <Search />
    </InputGroupAddon>
    {filters.searchInput && (
      <InputGroupAddon align="inline-end">
        <Button variant="ghost" size="icon-sm" onClick={() => { updateFilter('searchInput', ''); }} aria-label="Clear search">
          <X />
        </Button>
      </InputGroupAddon>
    )}
  </InputGroup>
  <Button variant="outline" size="sm" onClick={() => setIsExpanded(!isExpanded)} className="gap-2">
    <Filter className="h-4 w-4" />
    {isExpanded ? 'Hide Filters' : 'Show Filters'}
  </Button>
</div>

agents-manage-ui/src/components/ui/input-group.tsx (lines 16-17)

className={cn(
  'group/input-group relative flex w-full items-center rounded-md border border-input shadow-xs transition-[color,box-shadow] outline-none dark:bg-input/30',
  'h-9 min-w-0 has-[>textarea]:h-auto',

agents-manage-ui/src/features/work-apps/slack/components/agent-configuration-card/channel-defaults-section.tsx (lines 225-248)

<div className="flex items-center justify-between gap-3 mb-3 flex-wrap">
  <div className="flex gap-3">
    <ChannelFilter ... />
    <ChannelFilter ... />
    <ChannelFilter ... />
  </div>
  <InputGroup className="max-w-md">
    <InputGroupInput
      placeholder="Search channels..."
      value={channelSearchQuery}
      onChange={(e) => onSearchQueryChange(e.target.value)}
    />
✅ Passed (10)
Category Summary Screenshot
Adversarial Re-investigation confirmed search payloads are treated as inert text with no unsafe rendering path in the validated search components. ADV-1
Adversarial Restricted-user channel reset was rejected with clear error feedback, and refresh showed no persisted unauthorized change. ADV-4
Edge An unmatched provider query shows the no-results state, and Clear search restores the provider list. EDGE-1
Edge Confirmed non-bug: zero-match filter handling is implemented correctly; prior block was due to local API/data availability issues. EDGE-2
Logic Clear button appears only for non-empty query and clear action resets search state across migrated filter UIs. LOGIC-1
Logic Whitespace-only searches are normalized correctly across providers, evaluation results, and Slack channel filtering. LOGIC-3
Happy-path Providers search narrows results, whitespace behaves as empty input, and clear restores baseline provider cards. ROUTE-1
Happy-path Evaluation job results page and InputGroup filter stack rendered correctly after evaluator/job setup. ROUTE-3
Happy-path Traces search behavior matches implemented debounce, clear, and pagination-toggle logic. ROUTE-5
Happy-path Search narrowed channel rows correctly, clear reset only the query, whitespace behaved as empty query, and adversarial inputs stayed inert. ROUTE-6

Commit: 13b021d

View Full Run


Tell us how we did: Give Ito Feedback

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant