Replace run group text input with typeahead, clickable run group label#7176
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThis PR renames UI copy from “experiment” to “run group” in multiple components, replaces free-text run-group inputs with an Experiment/Run-Group selector, exposes Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Security and Quality Issues
🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (5)
frontend/src/pages/pipelines/global/runs/const.ts (1)
3-3: Rename stale exported identifier to match current domain language.Line 3 still exports
experimentRunsPageDescriptionwhile the product term is now “run group.” Keep the string and symbol aligned (for example,runGroupRunsPageDescription) to avoid terminology drift across imports and future changes.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/pages/pipelines/global/runs/const.ts` at line 3, Rename the exported identifier experimentRunsPageDescription to runGroupRunsPageDescription to align with current product terminology; update the export name in frontend/src/pages/pipelines/global/runs/const.ts and then update all imports/usages that reference experimentRunsPageDescription to import runGroupRunsPageDescription instead, leaving the string value unchanged to preserve behavior.frontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsTable.tsx (1)
67-72: Dependency array should reference the stable callback, not the object.
filterPropsis a new object reference on every render (fromusePipelineFilterSearchParams), causinghandleRunGroupClickto be recreated unnecessarily. Use the specific callback instead.Proposed fix
+ const { onFilterUpdate } = filterProps; const handleRunGroupClick = React.useCallback( (clickedExperiment: ExperimentKF) => { - filterProps.onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name); + onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name); }, - [filterProps], + [onFilterUpdate], );🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsTable.tsx` around lines 67 - 72, handleRunGroupClick is being re-created every render because its dependency array references the whole filterProps object; instead depend on the stable callback. Replace the dependency [filterProps] with the specific callback (e.g., [filterProps.onFilterUpdate]) or destructure const { onFilterUpdate } = filterProps and use [onFilterUpdate] so handleRunGroupClick only changes when the update function changes; keep the body calling onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name) unchanged.frontend/src/concepts/pipelines/content/compareRuns/CompareRunsRunList.tsx (1)
95-100: Same dependency array issue asManageRunsTable.tsx.
filterToolbarPropsis a new object reference each render. Reference the stableonFilterUpdatecallback directly.Proposed fix
+ const { onFilterUpdate } = filterToolbarProps; const handleRunGroupClick = React.useCallback( (clickedExperiment: ExperimentKF) => { - filterToolbarProps.onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name); + onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name); }, - [filterToolbarProps], + [onFilterUpdate], );🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/concepts/pipelines/content/compareRuns/CompareRunsRunList.tsx` around lines 95 - 100, The callback handleRunGroupClick uses filterToolbarProps in its dependency array but filterToolbarProps is a new object each render causing unnecessary re-creations; change the dependency to the stable function itself by referencing filterToolbarProps.onFilterUpdate (or directly onFilterUpdate) instead of the whole filterToolbarProps object so React.useCallback depends on the stable onFilterUpdate function; update the dependency array to [filterToolbarProps.onFilterUpdate] (or [onFilterUpdate] if you import/receive it directly) while keeping the body: call onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name) with ExperimentKF as before.frontend/src/concepts/pipelines/content/createRun/RunForm.tsx (1)
158-163:CharLimitHelperTextis now vestigial for a selector.With
ActiveExperimentSelector, users select from existing run groups rather than typing free text. The character limit helper (line 163) displays length information that users cannot act upon—they're constrained to existing names. Consider removing it or replacing with simpler text since the limit is enforced at run group creation time, not selection time.Proposed removal
<ActiveExperimentSelector dataTestId="run-group-selector" selection={data.runGroup} onSelect={(experiment) => onValueChange('runGroup', experiment.display_name)} /> - <CharLimitHelperText limit={NAME_CHARACTER_LIMIT} currentLength={data.runGroup.length} /> </FormGroup>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/concepts/pipelines/content/createRun/RunForm.tsx` around lines 158 - 163, The CharLimitHelperText component is vestigial for the ActiveExperimentSelector usage in RunForm: remove the CharLimitHelperText instance (the JSX line rendering CharLimitHelperText) since users pick existing run groups via ActiveExperimentSelector (prop selection={data.runGroup}) and cannot edit length here; if you prefer keeping guidance, replace it with a static hint string or small caption component (e.g., “Run group name is selected from existing experiments”) adjacent to ActiveExperimentSelector, but do not display the dynamic currentLength based on data.runGroup. Ensure any removed references to NAME_CHARACTER_LIMIT or currentLength props are cleaned up in the RunForm component.frontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRow.tsx (1)
79-105: Replace theseuseMemoblocks with direct derivation +useCallbackfor the prop callback.
runGroupLinkis a cheap string derivation, andhandleRunGroupClickis a callback prop; usinguseMemofor both adds indirection without clear payoff.Suggested refactor
- const runGroupLink = React.useMemo(() => { - if (!experiment) { - return undefined; - } - - return buildLegacyExperimentFilterUrl( - runType === PipelineRunType.ARCHIVED - ? globalArchivedPipelineRunsRoute(namespace) - : globalPipelineRunsRoute(namespace), - experiment.experiment_id, - ); - }, [experiment, namespace, runType]); - const handleRunGroupClick = React.useMemo(() => { - if (!experiment) { - return undefined; - } - - if (onRunGroupClick) { - return () => onRunGroupClick(experiment); - } - - if (!runGroupLink) { - return undefined; - } - - return () => navigate(runGroupLink); - }, [experiment, navigate, onRunGroupClick, runGroupLink]); + const runGroupLink = experiment + ? buildLegacyExperimentFilterUrl( + runType === PipelineRunType.ARCHIVED + ? globalArchivedPipelineRunsRoute(namespace) + : globalPipelineRunsRoute(namespace), + experiment.experiment_id, + ) + : undefined; + + const handleRunGroupClick = React.useCallback(() => { + if (!experiment) { + return; + } + if (onRunGroupClick) { + onRunGroupClick(experiment); + return; + } + if (runGroupLink) { + navigate(runGroupLink); + } + }, [experiment, onRunGroupClick, runGroupLink, navigate]);As per coding guidelines, “Performance: avoid unnecessary useCallback/useMemo/useRef — React is performant by default. Only use useCallback when the function is passed as a prop, used as a useEffect dependency, or returned from a custom hook.”
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@frontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRow.tsx` around lines 79 - 105, The two React.useMemo usages are unnecessary: replace the computed string runGroupLink with a plain derived const (compute runGroupLink directly from experiment, namespace, runType using buildLegacyExperimentFilterUrl and globalPipelineRunsRoute/globalArchivedPipelineRunsRoute), and replace handleRunGroupClick with a React.useCallback that depends on [experiment, navigate, onRunGroupClick, runGroupLink] and returns the same handlers (call onRunGroupClick(experiment) if provided, otherwise navigate(runGroupLink) if available, else undefined); keep the same early-return/null checks for experiment and runGroupLink and reference the existing symbols runGroupLink, handleRunGroupClick, buildLegacyExperimentFilterUrl, navigate, onRunGroupClick, experiment, namespace, runType, and PipelineRunType.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In
`@frontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRowExperiment.tsx`:
- Around line 14-47: The row renders a label that can look clickable even when
no handler exists because showClickableStyles uses the isClickable prop; change
the logic so clickability is derived from the resolved handler only: compute
handleClick (already in PipelineRunTableRowExperiment) and replace
showClickableStyles = isClickable || !!handleClick with showClickableStyles =
!!handleClick, and only pass isClickable: true and onClick: handleClick into the
Label props when handleClick is defined (do not use the incoming isClickable
flag to trigger clickable styling alone).
---
Nitpick comments:
In `@frontend/src/concepts/pipelines/content/compareRuns/CompareRunsRunList.tsx`:
- Around line 95-100: The callback handleRunGroupClick uses filterToolbarProps
in its dependency array but filterToolbarProps is a new object each render
causing unnecessary re-creations; change the dependency to the stable function
itself by referencing filterToolbarProps.onFilterUpdate (or directly
onFilterUpdate) instead of the whole filterToolbarProps object so
React.useCallback depends on the stable onFilterUpdate function; update the
dependency array to [filterToolbarProps.onFilterUpdate] (or [onFilterUpdate] if
you import/receive it directly) while keeping the body: call
onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name) with
ExperimentKF as before.
In `@frontend/src/concepts/pipelines/content/createRun/RunForm.tsx`:
- Around line 158-163: The CharLimitHelperText component is vestigial for the
ActiveExperimentSelector usage in RunForm: remove the CharLimitHelperText
instance (the JSX line rendering CharLimitHelperText) since users pick existing
run groups via ActiveExperimentSelector (prop selection={data.runGroup}) and
cannot edit length here; if you prefer keeping guidance, replace it with a
static hint string or small caption component (e.g., “Run group name is selected
from existing experiments”) adjacent to ActiveExperimentSelector, but do not
display the dynamic currentLength based on data.runGroup. Ensure any removed
references to NAME_CHARACTER_LIMIT or currentLength props are cleaned up in the
RunForm component.
In
`@frontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRow.tsx`:
- Around line 79-105: The two React.useMemo usages are unnecessary: replace the
computed string runGroupLink with a plain derived const (compute runGroupLink
directly from experiment, namespace, runType using
buildLegacyExperimentFilterUrl and
globalPipelineRunsRoute/globalArchivedPipelineRunsRoute), and replace
handleRunGroupClick with a React.useCallback that depends on [experiment,
navigate, onRunGroupClick, runGroupLink] and returns the same handlers (call
onRunGroupClick(experiment) if provided, otherwise navigate(runGroupLink) if
available, else undefined); keep the same early-return/null checks for
experiment and runGroupLink and reference the existing symbols runGroupLink,
handleRunGroupClick, buildLegacyExperimentFilterUrl, navigate, onRunGroupClick,
experiment, namespace, runType, and PipelineRunType.
In
`@frontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsTable.tsx`:
- Around line 67-72: handleRunGroupClick is being re-created every render
because its dependency array references the whole filterProps object; instead
depend on the stable callback. Replace the dependency [filterProps] with the
specific callback (e.g., [filterProps.onFilterUpdate]) or destructure const {
onFilterUpdate } = filterProps and use [onFilterUpdate] so handleRunGroupClick
only changes when the update function changes; keep the body calling
onFilterUpdate(FilterOptions.RUN_GROUP, clickedExperiment.display_name)
unchanged.
In `@frontend/src/pages/pipelines/global/runs/const.ts`:
- Line 3: Rename the exported identifier experimentRunsPageDescription to
runGroupRunsPageDescription to align with current product terminology; update
the export name in frontend/src/pages/pipelines/global/runs/const.ts and then
update all imports/usages that reference experimentRunsPageDescription to import
runGroupRunsPageDescription instead, leaving the string value unchanged to
preserve behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Central YAML (inherited), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: 567df94a-f4f8-4d6c-a3df-bb66d7154234
📒 Files selected for processing (11)
frontend/src/concepts/pipelines/content/compareRuns/CompareRunsRunList.tsxfrontend/src/concepts/pipelines/content/createRun/RunForm.tsxfrontend/src/concepts/pipelines/content/experiment/CreateExperimentModal.tsxfrontend/src/concepts/pipelines/content/experiment/ExperimentSelector.tsxfrontend/src/concepts/pipelines/content/experiment/columns.tsfrontend/src/concepts/pipelines/content/tables/pipelineRecurringRun/PipelineRecurringRunTableRow.tsxfrontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRow.tsxfrontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRowExperiment.tsxfrontend/src/concepts/pipelines/content/tables/usePipelineFilter.tsfrontend/src/pages/pipelines/global/experiments/compareRuns/ManageRunsTable.tsxfrontend/src/pages/pipelines/global/runs/const.ts
|
Thanks @caponetto
I don't feel too strongly about it though, I can remove it if you want. |
|
@nananosirova: The following test has Failed: OCI Artifact Browser URLInspecting Test Artifacts ManuallyTo inspect your test artifacts manually, follow these steps:
mkdir -p oras-artifacts
cd oras-artifacts
oras pull quay.io/opendatahub/odh-ci-artifacts:odh-pr-test-trainer-s6s28 |
|
Thanks for checking them @nananosirova
/lgtm |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/cypress/cypress/pages/pipelines/pipelineFilterBar.ts`:
- Around line 18-21: selectRunGroupByName currently finds any <td> containing
the given name which can match substrings; change the selection to require an
exact match inside the run-group table by scoping the contains to the <td> cell
and using an exact-text match (for example by matching the whole cell text with
a ^name$ regex or an exact-contains option) on the element with test id
'run-group-selector-table-list' before clicking; update the selectRunGroupByName
method to use that exact-match strategy to avoid accidentally clicking
overlapping names.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Central YAML (inherited), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: 98dcb52b-ae47-4a14-bbd7-9e690ad5618d
📒 Files selected for processing (9)
frontend/src/concepts/pipelines/content/pipelineSelector/CustomPipelineRunToolbarSelect.tsxfrontend/src/concepts/pipelines/content/tables/pipelineRecurringRun/PipelineRecurringRunTableRow.tsxfrontend/src/concepts/pipelines/content/tables/pipelineRecurringRun/PipelineRecurringRunTableToolbar.tsxfrontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRow.tsxfrontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRowExperiment.tsxfrontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableToolbarBase.tsxfrontend/src/concepts/pipelines/content/tables/usePipelineFilter.tspackages/cypress/cypress/pages/pipelines/pipelineFilterBar.tspackages/cypress/cypress/tests/mocked/pipelines/runs/pipelineRuns.cy.ts
🚧 Files skipped from review as they are similar to previous changes (4)
- frontend/src/concepts/pipelines/content/tables/usePipelineFilter.ts
- frontend/src/concepts/pipelines/content/tables/pipelineRecurringRun/PipelineRecurringRunTableRow.tsx
- frontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRowExperiment.tsx
- frontend/src/concepts/pipelines/content/tables/pipelineRun/PipelineRunTableRow.tsx
| selectRunGroupByName(name: string) { | ||
| this.findRunGroupSelect().click(); | ||
| cy.findByTestId('run-group-selector-table-list').find('td').contains(name).click(); | ||
| return this; |
There was a problem hiding this comment.
Use exact text matching for run-group row selection.
Line 20 uses partial contains(name) across all <td> cells, which can click the wrong row when run-group names overlap.
Proposed fix
selectRunGroupByName(name: string) {
this.findRunGroupSelect().click();
- cy.findByTestId('run-group-selector-table-list').find('td').contains(name).click();
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
+ cy.findByTestId('run-group-selector-table-list')
+ .contains('td', new RegExp(`^${escaped}$`))
+ .click();
return this;
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| selectRunGroupByName(name: string) { | |
| this.findRunGroupSelect().click(); | |
| cy.findByTestId('run-group-selector-table-list').find('td').contains(name).click(); | |
| return this; | |
| selectRunGroupByName(name: string) { | |
| this.findRunGroupSelect().click(); | |
| const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); | |
| cy.findByTestId('run-group-selector-table-list') | |
| .contains('td', new RegExp(`^${escaped}$`)) | |
| .click(); | |
| return this; | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@packages/cypress/cypress/pages/pipelines/pipelineFilterBar.ts` around lines
18 - 21, selectRunGroupByName currently finds any <td> containing the given name
which can match substrings; change the selection to require an exact match
inside the run-group table by scoping the contains to the <td> cell and using an
exact-text match (for example by matching the whole cell text with a ^name$
regex or an exact-contains option) on the element with test id
'run-group-selector-table-list' before clicking; update the selectRunGroupByName
method to use that exact-match strategy to avoid accidentally clicking
overlapping names.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/src/concepts/pipelines/content/tables/usePipelineFilter.ts`:
- Around line 72-75: The current code returns undefined when no exact
experiment.display_name === runGroupName match is found, which silently disables
backend filtering while filterData[run_group] may still be set; change the logic
in usePipelineFilter.ts so that when const match = experiments.find((e) =>
e.display_name === runGroupName) is falsy you do not return undefined but
instead create a fallback predicate that uses the provided runGroupName (e.g.,
match by includes/startsWith on e.display_name or compare against
e.run_group/id) and return that predicate so the backend receives a filter
consistent with the UI; update the branch around match to build and return this
fallback predicate using the same symbol names (experiments, match,
runGroupName, filterData[run_group]) so URL params produce an actual filter.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Central YAML (inherited), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: d6667be3-f96e-4a8f-899f-2f0210a8c1d3
📒 Files selected for processing (2)
frontend/src/concepts/pipelines/content/tables/__tests__/usePipelineFilter.spec.tsxfrontend/src/concepts/pipelines/content/tables/usePipelineFilter.ts
13cebd0 to
ef2c08b
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@frontend/src/concepts/pipelines/content/experiment/ExperimentSelector.tsx`:
- Around line 130-131: The duplicate-name check is currently using the
paginated/filtered slice via existingNames={experiments.map((e) =>
e.display_name)} in CreateExperimentModal and will miss names outside the
current selector state; fix by passing the unfiltered full-name list (e.g.,
add/derive fullExperimentNames from the parent store or prop that contains all
experiments and use existingNames={fullExperimentNames.map(e=>e.display_name)})
or move the validation to a server-backed exact-name check during the create
flow (ensure CreateExperimentModal calls the createExperiment API and surfaces a
precise "name already exists" error). Locate CreateExperimentModal, the
existingNames prop usage, and the experiments.map(...) call to update the source
to the full name list or add server-side duplicate-name validation in the create
API handler.
In `@frontend/src/concepts/pipelines/content/tables/usePipelineFilter.ts`:
- Line 26: The legacy experiment/run_group conflict must be normalized before
building filterData: in the usePipelineFilter logic (the code exporting
LEGACY_EXPERIMENT_FILTER_PARAM and the routines that read/write URL params and
compute filterData), ensure that when an experiment id
(LEGACY_EXPERIMENT_FILTER_PARAM) is being set or present you clear or remove the
run_group param so the new click flow wins; conversely, if run_group is being
intentionally preserved, map/translate run_group into the experiment key
consistently. Update the URL-param write/update path that currently prefers
run_group (the branch referenced around the run_group handling and filterData
construction) to either delete run_group when setting
LEGACY_EXPERIMENT_FILTER_PARAM or normalize the pair into a single canonical key
before building filterData.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository YAML (base), Central YAML (inherited), Organization UI (inherited)
Review profile: CHILL
Plan: Pro
Run ID: 907f2d4c-61b7-41aa-9c95-66d7bf67a766
📒 Files selected for processing (5)
frontend/src/concepts/pipelines/content/compareRuns/CompareRunsRunList.tsxfrontend/src/concepts/pipelines/content/experiment/CreateExperimentModal.tsxfrontend/src/concepts/pipelines/content/experiment/ExperimentSelector.tsxfrontend/src/concepts/pipelines/content/tables/__tests__/usePipelineFilter.spec.tsxfrontend/src/concepts/pipelines/content/tables/usePipelineFilter.ts
✅ Files skipped from review due to trivial changes (1)
- frontend/src/concepts/pipelines/content/tables/tests/usePipelineFilter.spec.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
- frontend/src/concepts/pipelines/content/experiment/CreateExperimentModal.tsx
|
/lgtm |
ef2c08b to
6fb99ee
Compare
|
/lgtm |
9a7d290 to
2ee8e88
Compare
Review — HEAD
|
2ee8e88 to
bcebdb4
Compare
Follow-up review — HEAD
|
Signed-off-by: Nana Nosirova <10577112+nananosirova@users.noreply.github.com>
Signed-off-by: Nana Nosirova <10577112+nananosirova@users.noreply.github.com>
Signed-off-by: Nana Nosirova <10577112+nananosirova@users.noreply.github.com>
Signed-off-by: Nana Nosirova <10577112+nananosirova@users.noreply.github.com>
Signed-off-by: Nana Nosirova <10577112+nananosirova@users.noreply.github.com>
Signed-off-by: Nana Nosirova <10577112+nananosirova@users.noreply.github.com>
Signed-off-by: Nana Nosirova <10577112+nananosirova@users.noreply.github.com>
44b7da7 to
c2190d4
Compare
Final review — HEAD
|
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: DaoDaoNoCode The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
7e25239
into
opendatahub-io:main




Description
Replaces the free-text run group input on the create/duplicate run form with a typeahead selector dropdown, and makes run group labels clickable in run tables to filter by group.
Screen.Recording.2026-04-10.at.1.38.19.AM.mov
Screen.Recording.2026-04-10.at.1.39.45.AM.mov
How Has This Been Tested?
Test Impact
Tested manually.
Request review criteria:
Self checklist (all need to be checked):
If you have UI changes:
After the PR is posted & before it merges:
mainSummary by CodeRabbit
New Features
Bug Fixes
Style
Tests