Skip to content

chore: Use ADS components in Page List#39570

Merged
hetunandu merged 4 commits intoreleasefrom
chore/page-elements-with-ads
Mar 6, 2025
Merged

chore: Use ADS components in Page List#39570
hetunandu merged 4 commits intoreleasefrom
chore/page-elements-with-ads

Conversation

@hetunandu
Copy link
Member

@hetunandu hetunandu commented Mar 5, 2025

Description

Updates the Page List component to use the new ADS components but behind feature flag

Fixes #39569

Automation

/ok-to-test tags="@tag.All"

🔍 Cypress test results

Tip

🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
Workflow run: https://github.com/appsmithorg/appsmith/actions/runs/13695609914
Commit: 6de5d43
Cypress dashboard.
Tags: @tag.All
Spec:


Thu, 06 Mar 2025 10:53:50 UTC

Communication

Should the DevRel and Marketing teams inform users about this change?

  • Yes
  • No

Summary by CodeRabbit

  • New Features
    • Introduced an enhanced page management menu offering options to clone, rename, delete, toggle visibility, set a page as home, and perform partial export/import.
    • Revamped page navigation with a unified list that adapts based on user permissions and feature settings for a smoother experience.
    • Added new components for managing page actions, including Clone, Delete, Rename, SetAsHomePage, PartialExport, PartialImport, and Visibility.
    • Implemented a new PageEntity and PageList component for improved page representation and management.

@hetunandu hetunandu requested a review from ankitakinger March 5, 2025 11:49
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 5, 2025

Walkthrough

This pull request introduces several new React components for enhanced page management. It adds individual context menu items for actions such as cloning, deleting, renaming, partial import/export, setting a page as the home page, and toggling visibility. A new main ContextMenu component is provided along with its export update, while the PageEntity, PageList, and PagesSection components streamline the display and interaction with pages. An import path has also been refactored to accommodate file restructuring.

Changes

File(s) Change Summary
app/.../ContextMenu/{Clone,Delete,PartialExport,PartialImport,Rename,SetAsHomePage,Visibility}.tsx Introduces new context menu items for various page actions (cloning, deletion, partial export/import, renaming, setting as homepage, and toggling visibility) with Redux integration.
app/.../ContextMenu/ContextMenu.tsx, app/.../ContextMenu/index.ts Adds the main ContextMenu component for managing pages and exports it for broader application use.
app/.../OldPageEntity.tsx Updates the import path for OldPageContextMenu due to file organization restructuring.
app/.../{PageEntity.tsx,PageList.tsx,PagesSection.tsx} Adds a new PageEntity component and a PageList to render pages; updates PagesSection to delegate rendering to PageList, streamlining page display management.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant CM as ContextMenu
    participant A as Action Callback
    participant R as Redux Dispatch
    participant S as Redux Store

    U->>CM: Select a menu item (e.g., Clone, Delete)
    CM->>A: Invoke corresponding callback
    A->>R: Dispatch Redux action (e.g., clonePageInit, deletePageAction)
    R->>S: Process action and update state
Loading

Suggested labels

Enhancement

Suggested reviewers

  • ankitakinger
  • alex-golovanov

Poem

In the realm of code where actions align,
Components dance in a neat design.
Context menus pop with purpose and grace,
Redux dispatches, setting the pace.
Merging these changes, our app finds its shine!
🚀✨


🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions bot added IDE Navigation Issues/feature requests related to IDE navigation, and context switching IDE Pod Issues that new developers face while exploring the IDE IDE Product Issues related to the IDE Product Task A simple Todo skip-changelog Adding this label to a PR prevents it from being listed in the changelog labels Mar 5, 2025
@hetunandu hetunandu added the ok-to-test Required label for CI label Mar 5, 2025
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: 0

🧹 Nitpick comments (13)
app/client/src/pages/AppIDE/components/PageList/ContextMenu/Visibility.tsx (1)

25-36: Consider adding an accessibility attribute for the visibility toggle.

The visibility toggle might benefit from an aria-label to improve accessibility for screen readers.

 <MenuItem
   disabled={disabled}
   onSelect={setHiddenField}
   startIcon={isHidden ? "eye-on" : "eye-off"}
+  aria-label={isHidden ? "Show page" : "Hide page"}
 >
app/client/src/pages/AppIDE/components/PageList/PageList.tsx (2)

19-29: Consider adding null/empty array check for pages.

While the component likely receives a valid pages array from its parent, defensive programming would suggest adding a check for this.

 if (!isNewADSEnabled) {
+  if (!pages || pages.length === 0) return null;
   return (
     <>
       {pages.map((page) => (

31-38: Same null check recommendation for the new ADS path.

For consistency, add the same check in both rendering paths.

 return (
   <>
+    {(!pages || pages.length === 0) ? null : 
       {pages.map((page) => (
         <PageEntity key={page.pageId} onClick={onItemSelected} page={page} />
       ))}
+    }
   </>
 );
app/client/src/pages/AppIDE/components/PageList/ContextMenu/PartialExport.tsx (1)

15-19: Consider handling potential callback errors.

While the implementation is clean, it would be more robust to use a try-catch block when invoking the optional callback to prevent potential errors from breaking the export functionality.

  const handlePartialExportClick = useCallback(() => {
-    if (onItemSelected) onItemSelected();
+    if (onItemSelected) {
+      try {
+        onItemSelected();
+      } catch (error) {
+        console.error("Error executing item selection callback:", error);
+      }
+    }

    dispatch(openPartialExportModal(true));
  }, [onItemSelected, dispatch]);
app/client/src/pages/AppIDE/components/PageList/ContextMenu/Delete.tsx (3)

30-37: Add try/catch to handle potential deletion errors

The onSelect callback handles the UI flow well, but there's no error handling for potential failures when deleting pages.

const onSelect = useCallback(
  (e?: Event) => {
    e?.preventDefault();
-    confirmDelete ? deletePageCallback() : setConfirmDelete(true);
+    if (confirmDelete) {
+      try {
+        deletePageCallback();
+      } catch (error) {
+        // Reset confirmation state if deletion fails
+        setConfirmDelete(false);
+        // Log error or show notification
+      }
+    } else {
+      setConfirmDelete(true);
+    }
    e?.stopPropagation();
  },
  [confirmDelete, deletePageCallback],
);

39-49: Improve conditional styling logic

The current implementation applies 'error-menuitem' class when the menu item is NOT disabled, which is somewhat counter-intuitive.

<MenuItem
-  className={clsx("single-select", { "error-menuitem": !disabled })}
+  className={clsx("single-select", { "error-menuitem": !disabled && confirmDelete })}
  disabled={disabled}
  onSelect={onSelect}
  startIcon="trash"
>

This way, the error styling is only applied when the item is both enabled and in the confirmation state, making the intent clearer.


23-28: Consider resetting confirmation state after successful deletion

The deletion callback logs the event but doesn't reset the confirmation state. While this may not be necessary if the component unmounts after deletion, it would be cleaner to reset it.

const deletePageCallback = useCallback(() => {
  dispatch(deletePageAction(pageId));
  AnalyticsUtil.logEvent("DELETE_PAGE", {
    pageName: pageName,
  });
+  setConfirmDelete(false);
}, [dispatch, pageId, pageName]);
app/client/src/pages/AppIDE/components/PageList/ContextMenu/ContextMenu.tsx (3)

37-57: Memoize permission calculations to prevent unnecessary re-renders

The permission calculations aren't memoized, which could cause unnecessary re-renders if the parent component re-renders frequently.

- const pagePermissions =
-   useSelector(getPageById(props.pageId))?.userPermissions || [];
+ const pagePermissions = useSelector(
+   (state) => getPageById(props.pageId)(state)?.userPermissions || []
+ );

- const userAppPermissions = useSelector(
-   (state: AppState) => getCurrentApplication(state)?.userPermissions ?? [],
- );
+ const userAppPermissions = useSelector(
+   (state: AppState) => getCurrentApplication(state)?.userPermissions ?? []
+ );

- const canManagePages = getHasManagePagePermission(
-   isFeatureEnabled,
-   pagePermissions,
- );
+ const canManagePages = useMemo(
+   () => getHasManagePagePermission(isFeatureEnabled, pagePermissions),
+   [isFeatureEnabled, pagePermissions]
+ );

- const canCreatePages = getHasCreatePagePermission(
-   isFeatureEnabled,
-   userAppPermissions,
- );
+ const canCreatePages = useMemo(
+   () => getHasCreatePagePermission(isFeatureEnabled, userAppPermissions),
+   [isFeatureEnabled, userAppPermissions]
+ );

- const canDeletePages = getHasDeletePagePermission(
-   isFeatureEnabled,
-   pagePermissions,
- );
+ const canDeletePages = useMemo(
+   () => getHasDeletePagePermission(isFeatureEnabled, pagePermissions),
+   [isFeatureEnabled, pagePermissions]
+ );

59-60: Memoize showPartialImportExport calculation

Similar to the permission calculations, this derived state should be memoized.

- const showPartialImportExport =
-   props.hasExportPermission && props.isCurrentPage;
+ const showPartialImportExport = useMemo(
+   () => props.hasExportPermission && props.isCurrentPage,
+   [props.hasExportPermission, props.isCurrentPage]
+ );

34-35: Missing import for React.useMemo

If implementing the suggested memoization improvements, you'll need to import useMemo.

- import React from "react";
+ import React, { useMemo } from "react";
app/client/src/pages/AppIDE/components/PageList/PageEntity.tsx (3)

66-76: Improve scrollIntoView implementation with a more robust approach

The current implementation might cause issues with certain browser behaviors. Consider using a more robust approach with a cleanup function.

useEffect(
  function scrollPageIntoView() {
    if (ref.current && isCurrentPage) {
-     ref.current.scrollIntoView({
-       inline: "nearest",
-       block: "nearest",
-     });
+     // Use setTimeout to ensure DOM is fully rendered
+     const timeoutId = setTimeout(() => {
+       if (ref.current) {
+         ref.current.scrollIntoView({
+           inline: "nearest",
+           block: "nearest",
+           behavior: "smooth"
+         });
+       }
+     }, 0);
+     
+     return () => clearTimeout(timeoutId);
    }
  },
  [ref, isCurrentPage],
);

84-99: Consider separating navigation logic from the component

The switchPage function handles multiple concerns: analytics, toggling onboarding widget selection, and navigation. Consider extracting this logic.

You could create a custom hook like usePageNavigation that encapsulates all this logic, making the component cleaner and more focused on its UI responsibilities.

// hooks/usePageNavigation.js
export function usePageNavigation() {
  const dispatch = useDispatch();
  const location = useLocation();
  
  return useCallback((navigateToUrl, pageName, onClick) => {
    AnalyticsUtil.logEvent("PAGE_NAME_CLICK", {
      name: pageName,
      fromUrl: location.pathname,
      type: "PAGES",
      toUrl: navigateToUrl,
    });
    dispatch(toggleInOnboardingWidgetSelection(true));
    history.push(navigateToUrl, {
      invokedBy: NavigationMethod.EntityExplorer,
    });

    if (onClick) {
      onClick();
    }
  }, [dispatch, location.pathname]);
}

// In your component:
// const navigate = usePageNavigation();
// const handleClick = () => navigate(navigateToUrl, page.pageName, onClick);

127-152: Extract name editor configuration to a custom hook

The nameEditorConfig is complex and could be extracted to a custom hook for better reusability and testability.

// hooks/useNameEditor.js
export function useNameEditor(entityId, entityName, canEdit, isHidden) {
  const dispatch = useDispatch();
  const { editingEntity, enterEditMode, exitEditMode, updatingEntity } = useNameEditorState();
  const validateName = useValidateEntityName({ entityName });
  
  return useMemo(() => ({
    canEdit,
    isEditing: editingEntity === entityId,
    isLoading: updatingEntity === entityId,
    onEditComplete: exitEditMode,
    onNameSave: (newName) => 
      dispatch(
        updatePageAction({
          id: entityId,
          name: newName,
          isHidden: !!isHidden,
        }),
      ),
    validateName: (newName) => validateName(newName),
    normalizeName: false,
    enterEditMode: () => enterEditMode(entityId),
  }), [
    canEdit, dispatch, editingEntity, exitEditMode, 
    entityId, isHidden, updatingEntity, validateName
  ]);
}

// In your component:
// const nameEditor = useNameEditor(page.pageId, page.pageName, canManagePages, page.isHidden);
// const nameEditorConfig = { ...nameEditor };
// const handleDoubleClick = canManagePages ? nameEditor.enterEditMode : noop;
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 832a706 and bee51e5.

📒 Files selected for processing (13)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/Clone.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/ContextMenu.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/Delete.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/PartialExport.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/PartialImport.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/Rename.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/SetAsHomePage.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/Visibility.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/index.ts (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/OldPageEntity.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/PageEntity.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/PageList.tsx (1 hunks)
  • app/client/src/pages/AppIDE/components/PageList/PagesSection.tsx (3 hunks)
✅ Files skipped from review due to trivial changes (2)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/index.ts
  • app/client/src/pages/AppIDE/components/PageList/OldPageEntity.tsx
⏰ Context from checks skipped due to timeout of 90000ms (7)
  • GitHub Check: perform-test / rts-build / build
  • GitHub Check: perform-test / server-build / server-unit-tests
  • GitHub Check: perform-test / client-build / client-build
  • GitHub Check: client-check-cyclic-deps / check-cyclic-dependencies
  • GitHub Check: client-unit-tests / client-unit-tests
  • GitHub Check: client-build / client-build
  • GitHub Check: client-lint / client-lint
🔇 Additional comments (15)
app/client/src/pages/AppIDE/components/PageList/ContextMenu/PartialImport.tsx (3)

7-10: Props interface is clear and well-defined.

The interface correctly defines optional properties with proper TypeScript syntax.


12-20: Good use of useCallback for event handler optimization.

The component properly memoizes the event handler which prevents unnecessary re-renders when this component is used within lists or frequently updated parent components.


21-29: MenuItem implementation is correct and follows the ADS pattern.

The component correctly uses the MenuItem from the ADS library with proper props including disabled state and icon.

app/client/src/pages/AppIDE/components/PageList/ContextMenu/Visibility.tsx (2)

6-11: Clear and comprehensive props interface.

The props interface includes all necessary parameters for the component functionality.


13-24: Effective use of Redux dispatch with useCallback.

The component correctly implements the visibility toggle functionality with a memoized callback function for optimal performance.

app/client/src/pages/AppIDE/components/PageList/ContextMenu/SetAsHomePage.tsx (3)

7-11: Props interface is well-defined.

The interface clearly specifies required and optional properties with appropriate types.


13-18: Proper implementation of setPageAsDefault action.

The component correctly dispatches the action with the required parameters using a memoized callback.


19-28: MenuItem implementation follows ADS conventions.

The MenuItem is correctly implemented with appropriate icon and message.

app/client/src/pages/AppIDE/components/PageList/PageList.tsx (2)

9-12: Props interface is clearly defined.

The interface correctly defines the necessary props for the component.


14-18: Effective use of feature flag for conditional rendering.

The component correctly uses the feature flag to determine which version of the UI to render.

app/client/src/pages/AppIDE/components/PageList/ContextMenu/Rename.tsx (1)

1-30: Well-structured component with proper separation of concerns.

The component follows React best practices with proper hook usage and clear responsibilities. The timeout implementation in the setRename function effectively prevents focus issues with the menu trigger.

app/client/src/pages/AppIDE/components/PageList/ContextMenu/Clone.tsx (1)

1-23: Clean implementation following component pattern consistency.

The Clone component is well-implemented with appropriate Redux integration and follows the same pattern as other context menu items, maintaining code consistency across the codebase.

app/client/src/pages/AppIDE/components/PageList/PagesSection.tsx (2)

2-2: Component dependencies updated correctly.

The import changes properly reflect the refactoring to use the PageList component instead of direct page element rendering.

Also applies to: 19-19


82-82: Good refactoring to improve component modularity.

Replacing the direct page element rendering with the PageList component improves code organization and maintainability by delegating the rendering responsibility to a specialized component.

app/client/src/pages/AppIDE/components/PageList/PageEntity.tsx (1)

154-169: The component implementation looks good

The EntityItem implementation is clean and correctly passes all necessary props, including conditional props like isSelected and isDisabled. The use of right control visibility on hover is a good UI pattern.

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: 0

🧹 Nitpick comments (1)
app/client/src/pages/AppIDE/components/PageList/ContextMenu/ContextMenu.tsx (1)

63-63: Consider adding more specific test IDs for menu items.

While the context menu has a test ID, adding specific test IDs for each menu item would improve testability.

-    <EntityContextMenu dataTestId={EntityClassNames.CONTEXT_MENU}>
+    <EntityContextMenu dataTestId={`${EntityClassNames.CONTEXT_MENU}-${props.pageId}`}>
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro (Legacy)

📥 Commits

Reviewing files that changed from the base of the PR and between bee51e5 and 6de5d43.

📒 Files selected for processing (1)
  • app/client/src/pages/AppIDE/components/PageList/ContextMenu/ContextMenu.tsx (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: perform-test / client-build / client-build
  • GitHub Check: perform-test / rts-build / build
  • GitHub Check: perform-test / server-build / server-unit-tests
  • GitHub Check: client-lint / client-lint
  • GitHub Check: client-check-cyclic-deps / check-cyclic-dependencies
  • GitHub Check: client-unit-tests / client-unit-tests
  • GitHub Check: client-build / client-build
  • GitHub Check: client-prettier / prettier-check
🔇 Additional comments (7)
app/client/src/pages/AppIDE/components/PageList/ContextMenu/ContextMenu.tsx (7)

1-22: Well-organized imports with clear dependencies.

The imports are well-structured, with a logical grouping of core React dependencies, UI components, and internal application utilities.


23-32: Props interface is well-defined with appropriate types.

The interface clearly defines all necessary properties with proper typing, making the component's contract explicit and type-safe.


34-43: Feature flag and selector usage follows best practices.

The component appropriately uses the feature flag pattern and Redux selectors to access application state, following the recommended patterns for the codebase.


44-58: Permission checks are properly implemented.

The permission logic is cleanly separated into different concerns (manage, create, delete) with appropriate helper functions.


59-61: Conditional logic for partial import/export is clear.

The condition for showing the partial import/export options is straightforward and easy to understand.


62-102: Context menu structure is well-organized with appropriate separators.

The component renders a well-structured menu with logical grouping of related actions separated by MenuSeparator components. Permission checks are consistently applied to disable actions when needed.


81-93: Verify the export/import functionality with current page requirement.

The partial export/import functionality is only available for the current page. Ensure this is the intended behavior, as users might expect to export/import other pages as well.


return (
<MenuItem
className={clsx("single-select", { "error-menuitem": !disabled })}
Copy link
Contributor

Choose a reason for hiding this comment

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

We haven't done it this way in Query/JS/UI for the class error-menuitem . Should we also update those?

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 seemed better as red color disabled was looking off. We can update based on what @momcilo-appsmith decides

@ankitakinger
Copy link
Contributor

/build-deploy-preview skip-tests=true

@github-actions
Copy link

github-actions bot commented Mar 6, 2025

Deploying Your Preview: https://github.com/appsmithorg/appsmith/actions/runs/13696085722.
Workflow: On demand build Docker image and deploy preview.
skip-tests: true.
env: ``.
PR: 39570.
recreate: .

@github-actions
Copy link

github-actions bot commented Mar 6, 2025

Deploy-Preview-URL: https://ce-39570.dp.appsmith.com

@hetunandu hetunandu requested a review from ankitakinger March 6, 2025 11:18
@hetunandu hetunandu merged commit ce75c7e into release Mar 6, 2025
85 checks passed
@hetunandu hetunandu deleted the chore/page-elements-with-ads branch March 6, 2025 11:20
github-actions bot pushed a commit to Zeral-Zhang/appsmith that referenced this pull request Apr 12, 2025
## Description

Updates the Page List component to use the new ADS components but behind
feature flag

Fixes appsmithorg#39569 

## Automation

/ok-to-test tags="@tag.All"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/13695609914>
> Commit: 6de5d43
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=13695609914&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.All`
> Spec:
> <hr>Thu, 06 Mar 2025 10:53:50 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Introduced an enhanced page management menu offering options to clone,
rename, delete, toggle visibility, set a page as home, and perform
partial export/import.
- Revamped page navigation with a unified list that adapts based on user
permissions and feature settings for a smoother experience.
- Added new components for managing page actions, including `Clone`,
`Delete`, `Rename`, `SetAsHomePage`, `PartialExport`, `PartialImport`,
and `Visibility`.
- Implemented a new `PageEntity` and `PageList` component for improved
page representation and management.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

IDE Navigation Issues/feature requests related to IDE navigation, and context switching IDE Pod Issues that new developers face while exploring the IDE IDE Product Issues related to the IDE Product ok-to-test Required label for CI skip-changelog Adding this label to a PR prevents it from being listed in the changelog Task A simple Todo

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Task]: Use ADS components in Page Items

2 participants