Skip to content

upcoming: [UIE-9398] - Private Image Sharing Tabs New Layout (v2)#13407

Open
pmakode-akamai wants to merge 15 commits intolinode:developfrom
pmakode-akamai:UIE-9398-private-image-sharing-tabs-new-layout
Open

upcoming: [UIE-9398] - Private Image Sharing Tabs New Layout (v2)#13407
pmakode-akamai wants to merge 15 commits intolinode:developfrom
pmakode-akamai:UIE-9398-private-image-sharing-tabs-new-layout

Conversation

@pmakode-akamai
Copy link
Contributor

@pmakode-akamai pmakode-akamai commented Feb 17, 2026

Description 📝

This PR adds a new tabs layout on the Images Landing Page and introduces the relevant v2 routes for private image sharing. It also includes feature flag logic so we can roll out the new layout gradually while keeping the old layout working as before

Note

This work is part of breaking down PR #13010 [CLOSED] into smaller, more reviewable chunks. The split PRs will include additional improvements based on updated mockups. We are gradually moving to the v2 implementation, and once it is fully GA, the legacy v1 Images layout can be cleaned up from the codebase.

Changes 🔄

  • Added new tabs layout on the Images Landing Page
  • Created v2 routes (relevant to this PR) for Private Image Sharing
  • Added feature flag logic to control the v2 rollout while keeping the existing layout/code unchanged

Scope 🚢

  • All customers
  • Some customers (e.g. in Beta or Limited Availability)
  • No customers / Not applicable

Target release date 🗓️

N/A

Preview 📷

Before (Legacy / Current) After (V2 - When feature flag is enabled)
Screenshot 2026-02-17 at 1 54 55 PM Screenshot 2026-02-17 at 2 51 59 PM

How to test 🧪

Prerequisites

  • Enabled Private Image Sharing feature flag

Verification steps

  • Verify all new tabs are visible and labeled correctly
  • Switch between tabs and confirm content updates properly
  • Ensure url query params for sub-tabs are correct
  • Confirm v2 routes are functioning as expected
  • Ensure the old (legacy) layout continues to work as expected
  • Verify that toggling the feature flag correctly switches between the old and new layouts
  • Ensure there are no regressions in related features
Author Checklists

As an Author, to speed up the review process, I considered 🤔

👀 Doing a self review
❔ Our contribution guidelines
🤏 Splitting feature into small PRs
➕ Adding a changeset
🧪 Providing/improving test coverage
🔐 Removing all sensitive information from the code and PR description
🚩 Using a feature flag to protect the release
👣 Providing comprehensive reproduction steps
📑 Providing or updating our documentation
🕛 Scheduling a pair reviewing session
📱 Providing mobile support
♿ Providing accessibility support

  • I have read and considered all applicable items listed above.

As an Author, before moving this PR from Draft to Open, I confirmed ✅

  • All tests and CI checks are passing
  • TypeScript compilation succeeded without errors
  • Code passes all linting rules

@pmakode-akamai pmakode-akamai self-assigned this Feb 17, 2026
@pmakode-akamai pmakode-akamai added the Private Image Sharing Related to Private Image Sharing feature label Feb 17, 2026
@pmakode-akamai pmakode-akamai changed the title upcoming: [UIE-9398] - Private Image Sharing Tabs New Layout upcoming: [UIE-9398] - Private Image Sharing Tabs New Layout (v2) Feb 17, 2026
@pmakode-akamai pmakode-akamai marked this pull request as ready for review February 17, 2026 08:35
@pmakode-akamai pmakode-akamai requested a review from a team as a code owner February 17, 2026 08:35
Copy link
Contributor

@dwiley-akamai dwiley-akamai left a comment

Choose a reason for hiding this comment

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

Verification steps ✅
Code review ✅

@pmakode-akamai pmakode-akamai added the Add'tl Approval Needed Waiting on another approval! label Feb 19, 2026
Copy link
Contributor

@harsh-akamai harsh-akamai left a comment

Choose a reason for hiding this comment

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

Code review ✅

Could we switch the subType to "owned" if the entered value doesn't match the expected subtypes?

Image

On the legacy view, we are able to append subTypes to the url(adding redirect/removing the subTypes should fix this):
image

@pmakode-akamai
Copy link
Contributor Author

pmakode-akamai commented Feb 19, 2026

Could we switch the subType to "owned" if the entered value doesn't match the expected subtypes?

@harsh-akamai subType is an optional query param so users can manually append it to any URL at any route level in CM. However, it only affects the /image-library?subType=* route.

If a user enters an invalid value, it won't match any valid ImageLibraryType, and the table will simply show the empty state for that tab (in that case). I believe this is the expected behavior as it accurately reflects the UI state requested (by the user) via the query param [EDIT: Pushed a commit for this -- keeping owned as the default whenever an invalid subType query parameter value is passed]

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR introduces a new tabbed layout for the Images landing page as part of the Private Image Sharing feature, controlled by a feature flag. The implementation adds v2 routes for the Image Library (with sub-tabs for owned, shared, and recovery images) and Share Groups tabs, while maintaining the existing legacy layout for when the feature flag is disabled.

Changes:

  • Added isPrivateImageSharingEnabled to router context and integrated feature flag throughout routing logic
  • Created new v2 routes (/images/image-library and /images/share-groups) with redirect logic based on feature flag state
  • Implemented new tabbed UI components (ImagesLandingV2 and ImageLibraryTabs) with placeholder content for future implementation
  • Added utility functions and tests for managing image library sub-tab state

Reviewed changes

Copilot reviewed 14 out of 14 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
packages/manager/src/routes/types.ts Added isPrivateImageSharingEnabled property to RouterContext for feature flag integration
packages/manager/src/routes/index.tsx Initialized isPrivateImageSharingEnabled to false in default router context
packages/manager/src/routes/images/index.ts Created v2 routes for Image Library and Share Groups with feature flag-based redirects
packages/manager/src/routes/images/ImagesRoute.tsx Added useEffect-based navigation logic to handle feature flag toggling at runtime
packages/manager/src/features/Images/utils.ts Added ImageLibraryType, ImageLibrarySubTab types and getImageLibrarySubTabIndex helper function
packages/manager/src/features/Images/utils.test.tsx Added comprehensive test coverage for getImageLibrarySubTabIndex utility function
packages/manager/src/features/Images/ImagesLanding/v2/imagesLandingV2LazyRoute.tsx Created lazy route for v2 Images landing page
packages/manager/src/features/Images/ImagesLanding/v2/ImagesLandingV2.tsx Implemented main v2 landing page with Image Library and Share Groups tabs
packages/manager/src/features/Images/ImagesLanding/v2/ImageLibraryTabs.tsx Implemented sub-tabs for owned, shared, and recovery images within Image Library
packages/manager/src/features/Images/ImagesLanding/imagesLandingLazyRoute.ts Updated import path to be relative
packages/manager/src/features/Images/ImagesLanding/ImagesLanding.tsx Removed default export in favor of named export
packages/manager/src/features/Images/ImagesLanding/ImagesLanding.test.tsx Updated import to use named export
packages/manager/src/Router.tsx Integrated isPrivateImageSharingEnabled hook into router context
packages/manager/.changeset/pr-13407-upcoming-features-1771317211182.md Added changeset documenting the feature

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Contributor

Choose a reason for hiding this comment

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

When I just change query param manually to switch to another sub tab, entire page is reloads which is weird. Is that an expected behavior? It should behave similar to how we switch by clicking on tabs.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That's the expected behavior -- It's actually just native standard browser behavior. TanStack handles the silent updates (client-side) when we click tabs in the UI, but the second you change url or query params and hit enter in the address bar, the browser takes over and triggers a hard reload to fetch the page from server again. Every SPA works this way -- we can control the navigation inside the app, but we can't stop the browser from refreshing when the URL is manually submitted.

Copy link
Contributor

@grevanak-akamai grevanak-akamai Feb 20, 2026

Choose a reason for hiding this comment

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

If TanStack handles this way, its ok. But that's not the definition of SPA. Single page applications are meant to refresh the page within the app not browser level refresh.

Copy link
Contributor Author

@pmakode-akamai pmakode-akamai Feb 20, 2026

Choose a reason for hiding this comment

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

I mean when a URL is manually entered and submitted in the address bar, neither an SPA nor any web application has control at that moment. The browser initiates a new request to the server, which results in a full page reload.

For eg., you can try manually changing the query parameters in the address bar on Create Linode -> StackScripts (/linodes/create/stackscripts?subtype=Community) -- it behaves the same way.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ok. But SPA shouldn't work this way ideally. You can take a look at any apps we have in ACC (ex: https://control.akamai.com/apps/edge-diagnostics). Manually updating path params within SPA should reload just the app not entire browser unless user is logged out of session.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I think the difference could be due to the routing strategy used. That app uses hash-based routing (/#/…), so manual URL changes (or query params) in the address bar are handled client-side. Our React app uses TanStack Router with browser history, so manually editing query params triggers a full page reload. Tab clicks still work SPA style because TanStack handles them internally. cc @abailly-akamai

@linode-gh-bot
Copy link
Collaborator

Cloud Manager UI test results

🔺 3 failing tests on test run #12 ↗︎

❌ Failing✅ Passing↪️ Skipped🕐 Duration
3 Failing865 Passing11 Skipped52m 46s

Details

Failing Tests
SpecTest
vpc-details-page.spec.tsCloud Manager Cypress Tests→VPC details page » can create, edit, and delete a subnet from the VPC details page
linode-storage.spec.tsCloud Manager Cypress Tests→linode storage tab » add a disk
firewall-landing-page.spec.tsCloud Manager Cypress Tests→confirms Firewalls landing page empty state is shown when no Firewalls exist » lists all Firewalls

Troubleshooting

Use this command to re-run the failing tests:

pnpm cy:run -s "cypress/e2e/core/vpc/vpc-details-page.spec.ts,cypress/e2e/core/linodes/linode-storage.spec.ts,cypress/e2e/core/firewalls/firewall-landing-page.spec.ts"

@github-project-automation github-project-automation bot moved this from Review to Approved in Cloud Manager Feb 20, 2026
<SafeTabPanel index={1}>
<Notice variant="info">Share Groups is coming soon...</Notice>
</SafeTabPanel>
</TabPanels>
Copy link
Contributor

Choose a reason for hiding this comment

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

Why are we not using routed tabs?? this is the legacy way of doing things. You need lazy routes and an Outlet

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

Labels

Add'tl Approval Needed Waiting on another approval! Private Image Sharing Related to Private Image Sharing feature

Projects

Status: Approved

Development

Successfully merging this pull request may close these issues.

6 participants

Comments