Skip to content

Comments

feat(KFLUXUI-1006): add Activity tab for component details page#695

Open
rakshett wants to merge 8 commits intokonflux-ci:mainfrom
rakshett:KFLUXUI-1006
Open

feat(KFLUXUI-1006): add Activity tab for component details page#695
rakshett wants to merge 8 commits intokonflux-ci:mainfrom
rakshett:KFLUXUI-1006

Conversation

@rakshett
Copy link
Member

@rakshett rakshett commented Feb 8, 2026

Fixes

https://issues.redhat.com/browse/KFLUXUI-1006

Description

Implements the Activity tab for the new Component details page (V2 route).
The Activity tab displays:
Commits sub-tab: Shows commit history for the component using CommitsListView
Pipeline runs sub-tab: Shows pipeline runs for the component using PipelineRunsTab

Type of change

  • Feature
  • Bugfix
  • Code style update (formatting, renaming)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • Documentation content changes
  • Other (please describe):

Screen shots / Gifs for design review

How to test or reproduce?

Navigate to Components page
Click on any component to open Component details
Click on the "Activity" tab
Verify both "Commits" and "Pipeline runs" sub-tabs work
Verify tab selection persists in localStorage

Browser conformance:

  • Chrome
  • Firefox
  • Safari
  • Edge

Summary by CodeRabbit

  • New Features

    • Added an Activity section to component details with two tabs (Commits, Pipeline runs). Tab selection persists in browser storage, syncs with the URL, shows a descriptive header, feature-flag indicator, and displays a loading spinner while data loads. Pipeline runs hide test pipelines unless a snapshot is present.
  • Tests

    • Added tests covering rendering, tab interaction, navigation, content, and loading states.

@snyk-io
Copy link
Contributor

snyk-io bot commented Feb 8, 2026

Snyk checks have passed. No issues have been found so far.

Status Scanner Critical High Medium Low Total (0)
Open Source Security 0 0 0 0 0 issues
Licenses 0 0 0 0 0 issues
Code Security 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 8, 2026

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'version', 'include', 'exclude', 'rules', 'limits'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
📝 Walkthrough

Walkthrough

Adds a new ComponentActivityTab component (Commits & Pipeline runs), tests, route/paths for activity child-tab, and index export; implements URL-driven tab selection, localStorage persistence, feature-flag gating, and data loading/error handling.

Changes

Cohort / File(s) Summary
ComponentActivityTab implementation
src/components/ComponentsPage/ComponentDetails/tabs/ComponentActivityTab.tsx, src/components/ComponentsPage/ComponentDetails/index.ts
New React component and export (ACTIVITY_SECONDARY_TAB_KEY, ComponentActivityTab). Reads route params, persists/restores selected tab in localStorage, syncs URL on tab change, feature-flag gated, renders Activity section with Commits and Pipeline runs tabs and related data handling.
Tests for Activity tab
src/components/ComponentsPage/ComponentDetails/__tests__/ComponentActivityTab.spec.tsx
New test suite mocking router and data hooks (useComponent, useComponents, usePipelineRunsV2, useCommitStatus, useTektonResults) to verify rendering, tab items, navigation to pipelineruns child route, text content, and loading spinner.
Routing: add nested activity child route
src/routes/page-routes/components-page.tsx, src/routes/page-routes/__tests__/components-page.spec.tsx
Adds route import and a nested child route with :activityTab param; updates route children expectations in tests and ensures activity route element is defined.
Path exports
src/routes/paths.ts
Adds COMPONENT_ACTIVITY_V2_PATH and COMPONENT_ACTIVITY_V2_CHILD_TAB_PATH for activity and activity child-tab routes.

Sequence Diagram(s)

sequenceDiagram
    participant Browser as Browser
    participant Router as Router
    participant Component as ComponentActivityTab
    participant Commits as CommitsListView
    participant Pipelines as PipelineRunsTab
    participant Storage as LocalStorage
    participant API as useComponent/usePipelineRunsV2

    Browser->>Router: Navigate to /ns/:ns/components/:name/activity/:tab?
    Router->>Component: render with params (componentName, activityTab)
    Component->>Storage: read ACTIVITY_SECONDARY_TAB_KEY for component
    alt activityTab present
        Component->>Storage: write selected tab
        Component->>Router: replace/push URL if needed
    end
    Component->>API: fetch component & pipeline/commit data
    API-->>Component: return data or loading state
    alt selected = latest-commits
        Component->>Commits: render CommitsListView with filters
    else selected = pipelineruns
        Component->>Pipelines: render PipelineRunsTab with custom filter
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Suggested reviewers

  • rrosatti
  • janaki29
  • JoaoPedroPP
  • StanislavJochman
  • sahil143

"Activity wakes with tabs anew,
Commits and pipelines scan the view.
Routes remembered, tests confirmed,
A little tab where details churned. 🎉"

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title accurately summarizes the main change: adding an Activity tab for the component details page (V2 route), which aligns with the changeset's implementation of the new ComponentActivityTab component and related route changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In
`@src/components/ComponentsPage/ComponentDetails/tabs/ComponentActivityTab.tsx`:
- Around line 23-24: The code assumes component is always populated; change the
useComponent destructuring to capture the loading/error state (e.g., const
[component, loading, error] = useComponent(namespace, componentName)) and guard
access to component.spec.application before reading it (set applicationName only
when component is non-null, e.g., compute applicationName = component ?
component.spec.application : undefined or derive it inside a conditional
render), so accessing component.spec.application never happens while component
is null.

In `@src/components/PipelineRun/PipelineRunListView/pipelinerun-actions.tsx`:
- Line 101: Update the inconsistent tooltip text for the disabled rerun action
by removing the accidental " !!" suffix so the disabledTooltip property reads
"You don't have access to rerun" to match the lazy variant; locate the
disabledTooltip entry in pipelinerun-actions.tsx and replace the string
accordingly to ensure consistency across variants.
🧹 Nitpick comments (5)
src/components/ComponentsPage/ComponentDetails/tabs/ComponentActivityTab.tsx (3)

69-69: Replace raw <div> with a PatternFly layout component.

Per coding guidelines, raw HTML layout tags should not be used. Consider using a PatternFly Stack or Flex component instead. As per coding guidelines: "NEVER use raw HTML layout tags (<div>, <section>, <header>) or custom CSS layouts."

Proposed fix
-    <div>
+    <>
       <DetailsSection
         ...
       </DetailsSection>
-    </div>
+    </>

If a wrapper element is truly needed for layout, use <Stack> or <Flex> from PatternFly.


6-12: Mixed import styles: relative paths alongside path aliases.

Lines 1–5 use path aliases (~/components, ~/feature-flags), but Lines 6–12 use deep relative paths (../../../../...). For consistency, prefer the configured aliases. As per coding guidelines: "Use absolute imports with configured path aliases: ~/components, ~/types, ~/k8s, ~/utils, ~/models, @routes."


50-60: Two competing useEffect hooks may cause an unnecessary render cycle on initial load.

When activityTab is undefined and lastSelectedTab is set:

  1. Effect at Line 50 writes currentTab (which equals lastSelectedTab) to localStorage — a no-op in terms of value.
  2. Effect at Line 56 triggers a navigate(..., { replace: true }), causing a re-render with activityTab now set.
  3. The first effect runs again, writing the same value.

This works but is fragile. Consider combining the localStorage persistence into the setActiveTab callback and the initial redirect effect, rather than having a separate sync effect.

src/components/ComponentsPage/ComponentDetails/__tests__/ComponentActivityTab.spec.tsx (2)

82-82: Use userEvent instead of fireEvent for click interactions.

Per testing guidelines, prefer userEvent.setup() with async interactions over synchronous fireEvent. As per coding guidelines: "Use userEvent.setup() and async user interactions instead of synchronous fireEvent for testing user actions."

Proposed fix
+import userEvent from '@testing-library/user-event';
 import { screen, fireEvent, act } from '@testing-library/react';
-    await act(() => fireEvent.click(plrTab));
+    const user = userEvent.setup();
+    await user.click(plrTab);

42-98: Missing test coverage for loading and error states.

The tests only cover the happy path where useComponent returns a loaded component. Given the critical issue flagged in ComponentActivityTab.tsx (crash when component is null during loading), adding tests for loading ([null, false, undefined]) and error ([null, true, { code: 404 }]) states would be valuable. As per coding guidelines: "Test both success and error scenarios for all components and features."

Copy link
Member

@StanislavJochman StanislavJochman left a comment

Choose a reason for hiding this comment

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

LGTM

rakshett and others added 2 commits February 11, 2026 06:11
…tip, loading test

Co-authored-by: Cursor <cursoragent@cursor.com>
Assisted-by: Cursor
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI agents
In
`@src/components/ComponentsPage/ComponentDetails/tabs/ComponentActivityTab.tsx`:
- Around line 24-27: The localStorage key for useLocalStorage currently depends
on component?.spec.componentName which changes after load, causing stale writes
from the useEffect; update the key to use the stable route param componentName
(from useParams) instead of component?.spec.componentName so the key passed to
useLocalStorage (and variables lastSelectedTab/setLocalStorageItem) is stable
across renders, and ensure the useEffect that compares activityTab/currentTab
and lastSelectedTab uses that stable key (or alternately gate the effect to run
only after loaded === true).
- Line 20: Wrap the ComponentActivityTab export in a feature-flag guard so it
only renders when the "components-page" flag is enabled: either wrap the
component JSX with IfFeature (imported from ~/feature-flags/hooks) or check
useIsOnFeatureFlag("components-page") at the top of the ComponentActivityTab
function and return null when false; keep the existing FeatureFlagIndicator for
display only, but ensure ComponentActivityTab (the exported React.FC) is not
rendered when the flag is off.
🧹 Nitpick comments (7)
src/components/ComponentsPage/ComponentDetails/tabs/ComponentActivityTab.tsx (4)

7-15: Mixed import style: relative paths alongside path aliases.

Lines 4–6 use absolute path aliases (~/components/..., ~/feature-flags/..., ~/shared/...), but Lines 7–15 use deep relative paths (../../../../...). Per project guidelines, prefer the configured aliases (~/consts, ~/hooks, ~/routes, ~/shared, ~/types) for consistency and readability.

♻️ Suggested diff
-import { PipelineRunLabel } from '../../../../consts/pipelinerun';
-import { useComponent } from '../../../../hooks/useComponents';
-import { COMPONENT_ACTIVITY_V2_CHILD_TAB_PATH } from '../../../../routes/paths';
-import { RouterParams } from '../../../../routes/utils';
-import { useLocalStorage } from '../../../../shared/hooks/useLocalStorage';
-import { useNamespace } from '../../../../shared/providers/Namespace/useNamespaceInfo';
-import { PipelineRunKind } from '../../../../types';
-import PipelineRunsTab from '../../../Activity/PipelineRunsTab';
-import CommitsListView from '../../../Commits/CommitsListPage/CommitsListView';
+import { PipelineRunLabel } from '~/consts/pipelinerun';
+import { useComponent } from '~/hooks/useComponents';
+import { COMPONENT_ACTIVITY_V2_CHILD_TAB_PATH } from '~/routes/paths';
+import { RouterParams } from '~/routes/utils';
+import { useLocalStorage } from '~/shared/hooks/useLocalStorage';
+import { useNamespace } from '~/shared/providers/Namespace/useNamespaceInfo';
+import { PipelineRunKind } from '~/types';
+import PipelineRunsTab from '~/components/Activity/PipelineRunsTab';
+import CommitsListView from '~/components/Commits/CommitsListPage/CommitsListView';

As per coding guidelines: "Use absolute imports with configured path aliases: ~/components, ~/types, ~/k8s, ~/utils, ~/models, @routes."


56-60: URL not updated when both activityTab and lastSelectedTab are absent.

If the route has no :activityTab param and nothing is stored in localStorage, this effect is skipped (the lastSelectedTab guard is falsy). The component correctly defaults currentTab to 'latest-commits' on Line 28, so the UI is fine, but the URL remains without the tab segment—making it non-shareable for the default state.

Consider also redirecting when both are absent:

♻️ Suggested fix
   React.useEffect(() => {
-    if (!activityTab && lastSelectedTab) {
-      navigate(getActivityTabRoute(lastSelectedTab), { replace: true });
+    if (!activityTab) {
+      navigate(getActivityTabRoute(lastSelectedTab || 'latest-commits'), { replace: true });
     }
   }, [activityTab, getActivityTabRoute, lastSelectedTab, navigate]);

82-83: Raw <div> wrapper violates PatternFly layout guideline.

The outer <div> on Line 83 can be replaced with a PatternFly layout component (e.g., Stack or StackItem) for consistency with the project's "no raw HTML layout tags" rule.

♻️ Suggested fix
-import { Bullseye, Spinner, Tab, Tabs, TabTitleText } from '@patternfly/react-core';
+import { Bullseye, Spinner, Stack, StackItem, Tab, Tabs, TabTitleText } from '@patternfly/react-core';
 ...
-    <div>
+    <Stack>
+      <StackItem>
         <DetailsSection ...>
           ...
         </DetailsSection>
-    </div>
+      </StackItem>
+    </Stack>

As per coding guidelines: "NEVER use raw HTML layout tags (<div>, <section>, <header>) … Always use PatternFly layout components."

Also applies to: 132-132


91-95: Inline style on Tabs — consider using PatternFly spacing utilities or a CSS class.

The inline style with width: 'fit-content' and a var(--pf-v5-global--spacer--md) margin is functional, but deviates slightly from the PatternFly-first approach. If there's a PatternFly-supported prop or utility class for this, it would be more maintainable.

src/components/ComponentsPage/ComponentDetails/__tests__/ComponentActivityTab.spec.tsx (3)

2-2: Use userEvent.setup() instead of fireEvent for user interactions.

The guideline specifies using userEvent.setup() with async interactions rather than synchronous fireEvent. This provides more realistic browser event simulation.

♻️ Suggested fix
-import { screen, fireEvent, act } from '@testing-library/react';
+import { screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
 ...
   it('should render two tabs under component activity', async () => {
+    const user = userEvent.setup();
     componentMock.mockReturnValue([MockComponents[0], true]);
     renderWithQueryClientAndRouter(<ComponentActivityTab />);
     screen.getByTestId('comp__activity__tabItem commits');
     const plrTab = screen.getByTestId('comp__activity__tabItem pipelineruns');

-    await act(() => fireEvent.click(plrTab));
+    await user.click(plrTab);
     expect(navigateMock).toHaveBeenCalledWith(
       '/ns/test-ns/components/test-component/activity/pipelineruns',
     );
   });

As per coding guidelines: "Use userEvent.setup() and async user interactions instead of synchronous fireEvent for testing user actions."

Also applies to: 76-87


42-104: Missing test for the error scenario.

The suite covers rendering, tab navigation, content, and the loading state, but does not test the error path (i.e., when useComponent returns an error). Guidelines require testing both success and error scenarios.

♻️ Suggested addition
+  it('should render error state when component fails to load', () => {
+    componentMock.mockReturnValue([null, true, { code: 404 }]);
+    renderWithQueryClientAndRouter(<ComponentActivityTab />);
+    // Assert that error UI is rendered (adjust selector based on getErrorState output)
+    expect(screen.queryByTestId('spinner')).not.toBeInTheDocument();
+    expect(screen.queryByTestId('comp__activity__tabItem commits')).not.toBeInTheDocument();
+  });

As per coding guidelines: "Test both success and error scenarios for all components and features."


69-74: Consider using explicit expect assertions instead of bare getByTestId calls.

Lines 72–73 (and similarly 79) rely on getByTestId throwing to fail the test. While functional, using expect(...).toBeInTheDocument() (as done in Lines 92–97) is more explicit and consistent.

Also applies to: 89-98

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/routes/page-routes/__tests__/components-page.spec.tsx (1)

33-37: ⚠️ Potential issue | 🟡 Minor

Add ComponentActivityTab to the mock factory function.

The route file imports ComponentActivityTab from ~/components/ComponentsPage/ComponentDetails, which is the same module mocked on line 33. Since the mock factory doesn't include ComponentActivityTab, it resolves to undefined, causing the route elements that render it to have type: undefined. This would fail at runtime despite the toBeDefined() test passing.

Add to mock:
jest.mock('~/components/ComponentsPage/ComponentDetails', () => ({
  ComponentDetailsTab: () => <div data-testid="component-details-tab">Details tab</div>,
  ComponentDetailsViewLayout: () => <div data-testid="component-details-layout">Layout</div>,
  ComponentActivityTab: () => <div data-testid="component-activity-tab">Activity tab</div>,
  componentDetailsViewLoader: jest.fn(() => ({ data: 'test-data' })),
}));
🧹 Nitpick comments (1)
src/routes/page-routes/__tests__/components-page.spec.tsx (1)

65-69: Assertions on new route elements are weak.

toBeDefined() only confirms the element is not undefined/null—it doesn't verify the correct component is rendered (e.g., ComponentActivityTab). Consider using toEqual(<ComponentActivityTab />) (once the mock is in place) for both activityWithTabRoute and activityRoute to catch accidental misrouting.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In
`@src/components/ComponentsPage/ComponentDetails/tabs/ComponentActivityTab.tsx`:
- Line 85: The raw <div> wrapper in ComponentActivityTab.tsx (inside the
ComponentActivityTab render/return where a DetailsSection is used) violates
PatternFly layout guidelines; replace that <div> with an appropriate PatternFly
layout component (e.g., Stack or StackItem) or remove the wrapper entirely if
DetailsSection already provides the needed layout—locate the <div> in the
ComponentActivityTab component and swap it for Stack/StackItem from
'@patternfly/react-core' (or remove it) and ensure any children remain
unchanged.
🧹 Nitpick comments (4)
src/components/ComponentsPage/ComponentDetails/tabs/ComponentActivityTab.tsx (4)

8-17: Inconsistent import paths: mix of ~/ aliases and deep relative paths.

Lines 4–7 use the ~/ path alias, but lines 8–17 switch to ../../../../ relative imports. The coding guidelines specify using absolute imports with configured path aliases (~/components, ~/types, @routes, etc.).

For example:

-import { PipelineRunLabel } from '../../../../consts/pipelinerun';
-import { useComponent } from '../../../../hooks/useComponents';
-import { COMPONENT_ACTIVITY_V2_CHILD_TAB_PATH } from '../../../../routes/paths';
-import { RouterParams } from '../../../../routes/utils';
-import { useLocalStorage } from '../../../../shared/hooks/useLocalStorage';
-import { useNamespace } from '../../../../shared/providers/Namespace/useNamespaceInfo';
-import { PipelineRunKind } from '../../../../types';
-import PipelineRunsTab from '../../../Activity/PipelineRunsTab';
-import CommitsListView from '../../../Commits/CommitsListPage/CommitsListView';
-import { DetailsSection } from '../../../DetailsPage';
+import { PipelineRunLabel } from '~/consts/pipelinerun';
+import { useComponent } from '~/hooks/useComponents';
+import { COMPONENT_ACTIVITY_V2_CHILD_TAB_PATH } from '@routes/paths';
+import { RouterParams } from '@routes/utils';
+import { useLocalStorage } from '~/shared/hooks/useLocalStorage';
+import { useNamespace } from '~/shared/providers/Namespace/useNamespaceInfo';
+import { PipelineRunKind } from '~/types';
+import PipelineRunsTab from '~/components/Activity/PipelineRunsTab';
+import CommitsListView from '~/components/Commits/CommitsListPage/CommitsListView';
+import { DetailsSection } from '~/components/DetailsPage';

Verify actual alias mappings before applying — adjust prefixes to match the project's tsconfig paths. As per coding guidelines: "Use absolute imports with configured path aliases."

#!/bin/bash
# Verify which path aliases are configured
fd -g 'tsconfig*.json' --exec cat {} | jq '.compilerOptions.paths // empty' 2>/dev/null

93-97: Inline styles on Tabs — consider using a CSS class or PatternFly spacing utilities.

Inline style objects bypass theming and are harder to maintain. The width: 'fit-content' and spacing could be handled via a CSS module class or PatternFly utility classes (e.g., pf-v5-u-mb-md).


113-116: Minor inconsistency: componentName source differs between localStorage key and child props.

Line 27 uses componentName from route params for the localStorage key, but line 115 passes component?.spec?.componentName to CommitsListView (and line 128 to PipelineRunsTab). These should hold the same value, but using the route param consistently would be simpler and avoid the optional chaining.


79-81: nonTestSnapShotFilter is re-created on every render.

Since this is a pure function with no closure over mutable state, wrapping it in useCallback or hoisting it outside the component would provide a stable reference, avoiding unnecessary work if PipelineRunsTab compares props by reference.

Proposed fix — hoist outside component
+// We will not include any test pipelines that were run against the snapshot that contained the image.
+const nonTestSnapShotFilter = (plr: PipelineRunKind) =>
+  plr.metadata.labels?.[PipelineRunLabel.PIPELINE_TYPE] !== 'test' ||
+  !plr.spec.params?.find((p) => p.name === 'SNAPSHOT');
+
 export const ComponentActivityTab: React.FC = () => {
   ...
-  const nonTestSnapShotFilter = (plr: PipelineRunKind) =>
-    plr.metadata.labels?.[PipelineRunLabel.PIPELINE_TYPE] !== 'test' ||
-    !plr.spec.params?.find((p) => p.name === 'SNAPSHOT');

@codecov
Copy link

codecov bot commented Feb 11, 2026

Codecov Report

❌ Patch coverage is 96.68874% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 86.66%. Comparing base (6ee0ec7) to head (5103165).

Files with missing lines Patch % Lines
...age/ComponentDetails/tabs/ComponentActivityTab.tsx 96.35% 5 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #695      +/-   ##
==========================================
+ Coverage   85.80%   86.66%   +0.86%     
==========================================
  Files         764      765       +1     
  Lines       58225    58375     +150     
  Branches     4723     6896    +2173     
==========================================
+ Hits        49958    50591     +633     
+ Misses       8216     7569     -647     
- Partials       51      215     +164     
Flag Coverage Δ
e2e 42.85% <12.12%> (?)
unittests 85.82% <96.68%> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...omponents/ComponentsPage/ComponentDetails/index.ts 100.00% <100.00%> (ø)
src/routes/page-routes/components-page.tsx 93.47% <100.00%> (+0.97%) ⬆️
src/routes/paths.ts 100.00% <100.00%> (ø)
...age/ComponentDetails/tabs/ComponentActivityTab.tsx 96.35% <96.35%> (ø)

... and 120 files with indirect coverage changes


Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 6ee0ec7...5103165. Read the comment docs.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

rrosatti
rrosatti previously approved these changes Feb 11, 2026
Copy link
Member

@rrosatti rrosatti left a comment

Choose a reason for hiding this comment

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

I left a minor comment, otherwise code looks good to me :)


return (
<IfFeature flag="components-page" fallback={null}>
<div>
Copy link
Member

Choose a reason for hiding this comment

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

nit: wrapping with <div> here is unnecessary, since it's wrapping only one child and we're not passing any props to it :)

Copy link
Member Author

Choose a reason for hiding this comment

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

This is been uodated. Removed Div

Copy link
Member

@StanislavJochman StanislavJochman left a comment

Choose a reason for hiding this comment

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

LGTM

@rakshett rakshett dismissed stale reviews from StanislavJochman and rrosatti via 257acbe February 11, 2026 14:09
@rakshett
Copy link
Member Author

/review

Copy link
Member

@rrosatti rrosatti left a comment

Choose a reason for hiding this comment

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

LGTM, nice job!

@rakshett rakshett requested a review from a team as a code owner February 16, 2026 10:27
Copy link
Member

@janaki29 janaki29 left a comment

Choose a reason for hiding this comment

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

LGTM

return getErrorState(componentError, loaded, 'component');
}

const applicationName = component?.spec?.application;
Copy link
Member

Choose a reason for hiding this comment

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

application will be removed from the component, so it should not be used
https://github.com/konflux-ci/application-api/blob/main/api/v1alpha1/component_types.go#L250-L251

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.

5 participants