[upcoming] UIE-9402: Implement Owned groups tab landing page#13506
[upcoming] UIE-9402: Implement Owned groups tab landing page#13506fabrice-akamai wants to merge 25 commits intolinode:developfrom
Conversation
| <Hidden mdDown> | ||
| <TableCell> | ||
| {updated && | ||
| formatDate(updated, { | ||
| timezone: profile?.timezone, | ||
| })} | ||
| </TableCell> | ||
| </Hidden> |
| import { PaginationFooter } from 'src/components/PaginationFooter/PaginationFooter'; | ||
| import { Table } from 'src/components/Table'; | ||
| import { TableBody } from 'src/components/TableBody'; | ||
| import { TableCell } from 'src/components/TableCell'; | ||
| import { TableHead } from 'src/components/TableHead'; | ||
| import { TableRow } from 'src/components/TableRow'; | ||
| import { TableRowEmpty } from 'src/components/TableRowEmpty/TableRowEmpty'; | ||
| import { TableRowError } from 'src/components/TableRowError/TableRowError'; | ||
| import { TableSortCell } from 'src/components/TableSortCell/TableSortCell'; |
There was a problem hiding this comment.
Let's try to use the CDS Web Components where possible when developing this feature. My last PR shows how to bring in the table-related components for example
There was a problem hiding this comment.
Will do. Thanks!
|
@fabrice-akamai I am not going to block this (no need to break it down at this point) but I also am not going to review it. The PR is too large and isn't easily ingestible. Even by looking at the amount of commits this is pretty clear. While the standards are certainly changing, please keep in mind our contributing guidelines for future PRs. It helps your team members review the code, contribute, and actually ship quicker and with more confidence. |
Hi @abailly-akamai, I agree that this is a pretty large PR and it involves a lot of file changes. This is mainly because the table I implemented required a lot of subcomponents to be added like the row, action menu, and search field. I also had to add new queries to support fetching the paginated data, so it was hard to break them down without leaving out an essential part of the feature. In the future, I'll make sure to break down such features into smaller PRs that are easier to review. Thanks for the feedback! |
dwiley-akamai
left a comment
There was a problem hiding this comment.
Code review ✅
Verification steps ✅
My comments about UI styling/formatting can be addressed in a follow-up PR but the Pendo IDs and import consolidation can be done in this one
packages/manager/src/features/Images/ImagesLanding/v2/ShareGroups/ShareGroupActionMenu.tsx
Outdated
Show resolved
Hide resolved
packages/manager/src/features/Images/ImagesLanding/v2/ShareGroups/ShareGroupRow.tsx
Show resolved
Hide resolved
packages/manager/src/features/Images/ImagesLanding/v2/ShareGroups/ShareGroupRow.tsx
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
The formatting & mobile support will need to be improved here:
Updatedcell dash seems right-alignedUpdatedcell contents get hidden at some point but the column remains (and theCreatedcontent gets shifted there)- Column names wrap or get obscured
- Group names get obscured at a point
Screen.Recording.2026-03-23.at.11.29.39.AM.mov
This can be handled in a follow-up PR
packages/manager/src/features/Images/ImagesLanding/v2/ShareGroups/ShareGroupsTable.tsx
Outdated
Show resolved
Hide resolved
packages/manager/src/features/Images/ImagesLanding/v2/ShareGroups/ShareGroupsTable.tsx
Outdated
Show resolved
Hide resolved
Thanks @dwiley-akamai for the thorough review. Here's a summary of my latest changes:
Screen.Recording.2026-03-23.at.3.46.02.PM.mov |
| <TableRow> | ||
| <TableCell | ||
| style={{ | ||
| display: 'flex', | ||
| justifyContent: 'center', | ||
| }} | ||
| > | ||
| {emptyMessage.main} | ||
| </TableCell> | ||
| </TableRow> |
There was a problem hiding this comment.
| <TableRow> | |
| <TableCell | |
| style={{ | |
| display: 'flex', | |
| justifyContent: 'center', | |
| }} | |
| > | |
| {emptyMessage.main} | |
| </TableCell> | |
| </TableRow> | |
| <TableRow rowborder> | |
| <TableCell> | |
| <Box | |
| sx={(theme) => ({ | |
| display: 'flex', | |
| flexDirection: 'column', | |
| alignItems: 'center', | |
| gap: theme.spacingFunction(4), | |
| p: `${theme.spacingFunction(24)} ${theme.spacingFunction(32)}`, | |
| width: '100%', | |
| })} | |
| > | |
| <ZeroStateSearchNarrowIcon /> | |
| <Typography variant="h3">{emptyMessage.main}</Typography> | |
| {!query && emptyMessage.instruction && ( | |
| <Typography variant="body1"> | |
| {emptyMessage.instruction} | |
| </Typography> | |
| )} | |
| </Box> | |
| </TableCell> | |
| </TableRow> |
If TableRowEmpty isn't working here, I think we should be able to achieve the same using the ADS table components. This change should align with the Figma mockups, and the rowBorder prop will ensure the bottom border/stroke for the last row or empty states, just like we see in the non ads components.
| <TableRowError | ||
| colSpan={columns.length + 1} | ||
| message={error[0].reason} | ||
| /> |
There was a problem hiding this comment.
I see there's an alignment issue here - we should also be able to fix this by using the ADS component.
| <TableRowError | |
| colSpan={columns.length + 1} | |
| message={error[0].reason} | |
| /> | |
| <TableRow rowborder> | |
| <TableCell> | |
| <ErrorState compact errorText={error[0].reason} /> | |
| </TableCell> | |
| </TableRow> |
| Before | After |
|---|---|
![]() |
![]() |
| shareGroups: Sharegroup[]; | ||
| } | ||
|
|
||
| export const ShareGroupsTable = (props: ShareGroupsTableProps) => { |
There was a problem hiding this comment.
Unlike other tables (ADS tables like Databases Clusters or non-ADS tables like Owned by me / Recovery Images), why isn't table striping working for this table when My Profile -> Preferences -> Table Striping is turned ON?
When My Profile -> Preferences -> Table Striping -> Turned ON:
| Other CM tables | ShareGroupsTable |
|---|---|
![]() |
![]() |
There was a problem hiding this comment.
Good observation. I didn't account for that, I'll update the table to use the user preferences.
| <SafeTabPanel index={index} key={`images-${tab.type}-content`}> | ||
| {tab.type === 'owned-groups' && ( | ||
| <Notice variant="info">Owned Groups is coming soon...</Notice> | ||
| <ShareGroupsView type={'owned-groups'} /> |
There was a problem hiding this comment.
| <ShareGroupsView type={'owned-groups'} /> | |
| <ShareGroupsView type="owned-groups" /> |
nit: No need for {} here -- using a plain string prop is cleaner
| import type { ShareGroupsViewTableColConfig } from './shareGroupsTabsConfig'; | ||
| import type { APIError, Sharegroup } from '@linode/api-v4'; | ||
| import type { Order } from 'src/hooks/useOrderV2'; | ||
| interface HeaderProps { |
There was a problem hiding this comment.
nit: could we add a line break between the imports and the interface declaration for better readability?
| {headerProps.buttonProps && ( | ||
| <Button | ||
| buttonType="primary" | ||
| data-pendo-id={`Images Groups Owned-Create Button`} |
There was a problem hiding this comment.
| data-pendo-id={`Images Groups Owned-Create Button`} | |
| data-pendo-id={headerProps.buttonProps.pendoId} |
| ))} | ||
| </TableBody> | ||
| </Table> | ||
| <PaginationFooter |
There was a problem hiding this comment.
question (non-blocking & optional): Is there any plan to replace this PaginationFooter with the ADS PaginationFooter (if available) across all places in the context of Private Image Sharing?
There was a problem hiding this comment.
I'm not aware of any plan to replace the PaginationFooter across the app, but I would assume that if we're eventually going to integrate the CDS components in CM then this PaginationFooter will probably be replaced as well.
There was a problem hiding this comment.
We should be using the CDS Pagination component -- import { Pagination } from 'akamai-cds-react-components/Pagination'
| mb: 2, | ||
| }, | ||
| }} | ||
| data-pendo-id="Images Groups Owned-Search" |
There was a problem hiding this comment.
The hardcoded Pendo ID here seems to be an issue❗️ We may need to keep the Pendo IDs in a config for all subsequent table searches and use them here from the config instead.
There was a problem hiding this comment.
Agreed. I'll move away from hard-coded values here and define them in the config file so they can be passed as props.
packages/manager/src/features/Images/ImagesLanding/v2/ShareGroups/ShareGroupTable.styles.ts
Outdated
Show resolved
Hide resolved
Cloud Manager UI test results🔺 4 failing tests on test run #15 ↗︎
Details
TroubleshootingUse this command to re-run the failing tests: pnpm cy:run -s "cypress/e2e/core/objectStorageMulticluster/object-storage-objects-multicluster.spec.ts,cypress/e2e/core/objectStorage/object-storage.e2e.spec.ts,cypress/e2e/core/linodes/alerts-create.spec.ts" |
||||||||||||||||||||||||||







Description 📝
This PR implements the Owned groups tab landing page content, allowing unrestricted users to view their share groups.
Note: The current implementation does not allow users to sort the table by image count or membership count since this feature is not yet supported by the backend.
Changes 🔄
List any change(s) relevant to the reviewer.
ShareGroupsViewwith the search field and share groups tableShareGroupsTabsConfig.tsxShareGroupTablewithShareGroupRowandShareGroupActionMenuScope 🚢
Upon production release, changes in this PR will be visible to:
Preview 📷
Screen.Recording.2026-03-18.at.4.27.30.PM.mov
How to test 🧪
Prerequisites
(How to setup test environment)
Verification steps
(How to verify changes)
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
As an Author, before moving this PR from Draft to Open, I confirmed ✅