Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WEB-1907] Fix: favorites #5292

Merged
merged 22 commits into from
Aug 4, 2024
Merged

[WEB-1907] Fix: favorites #5292

merged 22 commits into from
Aug 4, 2024

Conversation

gakshita
Copy link
Collaborator

@gakshita gakshita commented Aug 3, 2024

Implementation

Updated the favourites section in the sidebar to include cycles,modules, views and pages with the option to organize them into folders.
Added hyperlinks for the respective favourites
A user should also be able to add a feature (Cycle, Module, View, Page) as Favorite
[WEB-1907]

Summary by CodeRabbit

  • New Features

    • Introduced functionality for managing user favorites within workspaces via new API endpoints.
    • Added components for displaying and organizing favorites, including SidebarFavoritesMenu, FavoriteFolder, and FavoriteItem.
    • Implemented a new favorite management service to streamline API interactions.
  • Bug Fixes

    • Enhanced deletion behavior for favorites to ensure accurate data management.
  • Documentation

    • Updated type definitions and service index files for enhanced clarity and usability.
  • Refactor

    • Consolidated favorite management logic within the application to improve maintainability and scalability.
  • Chores

    • Cleaned up imports and removed unused components to streamline the codebase.

Copy link
Contributor

coderabbitai bot commented Aug 3, 2024

Walkthrough

The recent changes significantly enhance how user favorites are managed within the application. A variety of new serializers, endpoints, and UI components have been added, allowing users to seamlessly create, update, and delete their favorite items. The introduction of a FavoriteStore centralizes operations related to favorites, improving data handling. Additionally, existing components have been refactored for greater clarity and maintainability, leading to a more organized codebase.

Changes

Files Change Summary
apiserver/plane/app/serializers/__init__.py, .../favorite.py Added UserFavoriteSerializer and various new serializers for user favorites, enhancing API interactions.
apiserver/plane/app/urls/workspace.py, .../views/__init__.py Introduced endpoints for managing user favorites in workspaces, improving user interaction with favorite items.
apiserver/plane/app/views/cycle/base.py, .../module/base.py, .../page/base.py, .../project/base.py, .../view/base.py Modified destroy methods to change deletion behavior to hard deletes, impacting data retention strategies.
apiserver/plane/app/views/workspace/favorite.py New endpoints for managing favorites in workspaces, including CRUD functionalities.
packages/types/src/favorite/*.d.ts Introduced TypeScript definitions for favorite entities, enhancing type safety and structure.
web/core/components/workspace/sidebar/favorites/*.tsx New components for managing favorite items in the sidebar, including drag-and-drop and folder features.
web/core/store/favorite.store.ts, .../root.store.ts Added FavoriteStore for centralized favorite management, enhancing state handling and operations.
web/core/services/favorite/favorite.service.ts Introduced FavoriteService for API interactions related to favorites, streamlining CRUD operations.
web/core/hooks/store/use-favorite.ts New custom hook for accessing favorite state, improving component interactions with favorite items.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant Workspace
    participant FavoriteService
    participant FavoriteStore

    User->>Workspace: Access favorites menu
    Workspace->>FavoriteService: Fetch favorites
    FavoriteService-->>Workspace: Return favorites data
    Workspace->>User: Display favorites list
    
    User->>Workspace: Add favorite item
    Workspace->>FavoriteStore: Add favorite
    FavoriteStore-->>FavoriteService: Send add request
    FavoriteService-->>FavoriteStore: Confirm addition
    FavoriteStore-->>Workspace: Update favorites list
Loading

🐇 In the meadow where favorites bloom,
A rabbit hops with joyful zoom!
With icons bright and folders grand,
Favorites now at every hand.
So gather round, both friend and foe,
Let's mark our joys, let favorites grow! 🌼


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
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>.
    • 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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @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 as 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.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • 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

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.

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

Outside diff range, codebase verification and nitpick comments (4)
web/core/components/workspace/sidebar/favorites/favorites.helpers.ts (1)

4-35: LGTM! Consider adding a comment to explain the default sequence value.

The helper function getDestinationStateSequence is correctly defined and follows best practices. Adding a comment to explain the default sequence value of 65535 would improve code readability.

+  // Default sequence value used when no edge is provided
  const defaultSequence = 65535;
web/core/store/project-view.store.ts (2)

Line range hint 1-14:
Optimize lodash imports.

Consider importing only the required lodash functions directly to reduce bundle size.

- import { set } from "lodash";
+ import set from "lodash/set";

Line range hint 45-52:
Optimize computed property projectViewIds.

Consider using Object.keys for better performance when only keys are needed.

- const viewIds = Object.keys(this.viewMap ?? {})?.filter((viewId) => this.viewMap?.[viewId]?.project === projectId);
+ const viewIds = Object.keys(this.viewMap).filter((viewId) => this.viewMap[viewId].project === projectId);
web/core/store/pages/page.ts (1)

482-489: Issues Found: Inconsistent addToFavorites Implementation

The addToFavorites method in project-page.service.ts does not match the new implementation found in page.ts. Additionally, the block-item-action.tsx file calls addToFavorites, but it's not clear if it uses the updated implementation from page.ts.

  • project-page.service.ts

    • The addToFavorites method in this file uses a different implementation and needs to be updated to match the new implementation.
  • block-item-action.tsx

    • Verify that the addToFavorites method used in this file is the one from page.ts.

Please ensure these inconsistencies are addressed.

Analysis chain

LGTM! But verify the function usage in the codebase.

The code changes are approved.

However, ensure that all function calls to addToFavorites match the new implementation.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `addToFavorites` match the new implementation.

# Test: Search for the function usage. Expect: Only occurrences of the new implementation.
rg --type ts -A 5 $'addToFavorites'

Length of output: 2720


Script:

#!/bin/bash
# Description: Inspect the relevant lines in project-page.service.ts and block-item-action.tsx for consistency with the new implementation of addToFavorites.

# Extract lines around addToFavorites in project-page.service.ts
rg --type ts -A 10 -B 5 'async addToFavorites' web/core/services/page/project-page.service.ts

# Extract lines around addToFavorites in block-item-action.tsx
rg --type ts -A 10 -B 5 'addToFavorites()' web/core/components/pages/list/block-item-action.tsx

Length of output: 1666

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 3a5c77e and fd12f54.

Files selected for processing (38)
  • apiserver/plane/app/serializers/init.py (1 hunks)
  • apiserver/plane/app/serializers/favorite.py (1 hunks)
  • apiserver/plane/app/urls/workspace.py (2 hunks)
  • apiserver/plane/app/views/init.py (1 hunks)
  • apiserver/plane/app/views/cycle/base.py (1 hunks)
  • apiserver/plane/app/views/module/base.py (1 hunks)
  • apiserver/plane/app/views/page/base.py (1 hunks)
  • apiserver/plane/app/views/project/base.py (1 hunks)
  • apiserver/plane/app/views/view/base.py (1 hunks)
  • apiserver/plane/app/views/workspace/favorite.py (1 hunks)
  • apiserver/plane/db/models/favorite.py (1 hunks)
  • packages/types/src/favorite/favorite.d.ts (1 hunks)
  • packages/types/src/favorite/index.d.ts (1 hunks)
  • packages/types/src/index.d.ts (1 hunks)
  • packages/ui/src/icons/favorite-folder-icon.tsx (1 hunks)
  • packages/ui/src/icons/index.ts (1 hunks)
  • web/app/[workspaceSlug]/(projects)/sidebar.tsx (3 hunks)
  • web/core/components/pages/list/block-item-action.tsx (1 hunks)
  • web/core/components/workspace/sidebar/favorites/favorite-folder.tsx (1 hunks)
  • web/core/components/workspace/sidebar/favorites/favorite-item.tsx (1 hunks)
  • web/core/components/workspace/sidebar/favorites/favorites-menu.tsx (1 hunks)
  • web/core/components/workspace/sidebar/favorites/favorites.helpers.ts (1 hunks)
  • web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx (1 hunks)
  • web/core/components/workspace/sidebar/projects-list-item.tsx (1 hunks)
  • web/core/components/workspace/sidebar/projects-list.tsx (4 hunks)
  • web/core/components/workspace/sidebar/workspace-menu.tsx (1 hunks)
  • web/core/constants/event-tracker.ts (1 hunks)
  • web/core/hooks/store/use-favorite.ts (1 hunks)
  • web/core/layouts/auth-layout/workspace-wrapper.tsx (3 hunks)
  • web/core/services/favorite/favorite.service.ts (1 hunks)
  • web/core/services/favorite/index.ts (1 hunks)
  • web/core/store/cycle.store.ts (2 hunks)
  • web/core/store/favorite.store.ts (1 hunks)
  • web/core/store/module.store.ts (2 hunks)
  • web/core/store/pages/page.ts (6 hunks)
  • web/core/store/project-view.store.ts (2 hunks)
  • web/core/store/project/project.store.ts (2 hunks)
  • web/core/store/root.store.ts (3 hunks)
Files skipped from review due to trivial changes (4)
  • packages/types/src/favorite/index.d.ts
  • packages/types/src/index.d.ts
  • packages/ui/src/icons/index.ts
  • web/core/services/favorite/index.ts
Additional context used
Ruff
apiserver/plane/app/serializers/__init__.py

125-125: .favorite.UserFavoriteSerializer imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

apiserver/plane/app/views/__init__.py

44-44: .workspace.favorite.WorkspaceFavoriteEndpoint imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


45-45: .workspace.favorite.WorkspaceFavoriteGroupEndpoint imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

GitHub Check: Codacy Static Code Analysis
apiserver/plane/app/serializers/__init__.py

[notice] 125-125: apiserver/plane/app/serializers/init.py#L125
'.favorite.UserFavoriteSerializer' imported but unused (F401)

Biome
web/core/store/favorite.store.ts

[error] 218-218: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 220-220: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 222-222: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 224-224: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 226-226: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)

Additional comments not posted (90)
packages/types/src/favorite/favorite.d.ts (11)

2-2: LGTM!

The id property is correctly defined as a string.


3-3: LGTM!

The name property is correctly defined as a string.


4-4: LGTM!

The entity_type property is correctly defined as a string.


5-7: LGTM!

The entity_data property is correctly defined as an object containing a name property of type string.


8-8: LGTM!

The is_folder property is correctly defined as a boolean.


9-9: LGTM!

The sort_order property is correctly defined as a number.


10-10: LGTM!

The parent property is correctly defined as string | null.


11-11: LGTM!

The entity_identifier property is correctly defined as an optional property of type string | null.


12-12: LGTM!

The children property is correctly defined as an array of IFavorite.


13-13: LGTM!

The project_id property is correctly defined as string | null.


14-14: LGTM!

The sequence property is correctly defined as a number.

web/core/hooks/store/use-favorite.ts (2)

1-4: LGTM!

The import statements are correctly defined.


6-10: LGTM!

The custom hook useFavorite is correctly defined.

web/core/components/workspace/sidebar/favorites/favorites.helpers.ts (1)

1-2: LGTM!

The import statements are correctly defined.

packages/ui/src/icons/favorite-folder-icon.tsx (2)

1-4: Imports look good.

The import statements are necessary and correctly defined.


5-32: Component definition looks good.

The FavoriteFolderIcon component is well-defined and correctly uses default props and rest parameters.

apiserver/plane/db/models/favorite.py (3)

Line range hint 1-41: Model field definitions look good.

The model fields are correctly defined and use appropriate field types and options.


42-49: Changes to the save method look good.

The changes improve the robustness of the save method by handling cases where self.project may be None.


Line range hint 50-53: str method looks good.

The str method is correctly defined and provides a useful string representation.

web/core/services/favorite/favorite.service.ts (2)

1-5: Imports look good.

The import statements are necessary and correctly defined.


8-56: Class definition and methods look good.

The FavoriteService class is well-defined and correctly extends APIService. The methods for managing user favorites are correctly implemented.

web/app/[workspaceSlug]/(projects)/sidebar.tsx (3)

13-13: Import statement looks good.

The import statement for SidebarFavoritesMenu is correctly added and follows the existing import pattern.


69-85: New div container and layout changes look good.

The new div container is correctly structured and applies appropriate styling classes. The layout changes improve the organization of the sidebar components.


82-82: Addition of SidebarFavoritesMenu looks good.

The SidebarFavoritesMenu component is correctly integrated within the new div container, enhancing the sidebar functionality.

web/core/components/pages/list/block-item-action.tsx (1)

29-29: Renaming of the method looks good.

The method removeFromFavorites is correctly renamed to removePageFromFavorites, improving clarity and semantics. Ensure that the new method name is used consistently throughout the codebase.

apiserver/plane/app/serializers/favorite.py (7)

14-19: LGTM!

The ProjectFavoriteLiteSerializer class is correctly defined.


35-40: LGTM!

The CycleFavoriteLiteSerializer class is correctly defined.


42-47: LGTM!

The ModuleFavoriteLiteSerializer class is correctly defined.


49-54: LGTM!

The ViewFavoriteSerializer class is correctly defined.


56-67: LGTM!

The get_entity_model_and_serializer function is correctly implemented.


21-33: LGTM! Ensure projects relationship exists on Page model.

The PageFavoriteLiteSerializer class is correctly defined. Verify that the projects relationship exists on the Page model.

Verification successful

Verified: The projects relationship exists on the Page model.

The PageFavoriteLiteSerializer class is correctly defined, and the projects relationship is present in the Page model.

  • apiserver/plane/db/models/page.py: projects = models.ManyToManyField
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that the `projects` relationship exists on the `Page` model.

# Test: Search for the `projects` relationship in the `Page` model.
rg --type python 'class Page' -A 10 | rg 'projects'

Length of output: 82


Script:

#!/bin/bash
# Description: Verify that the `projects` relationship exists on the `Page` model.

# Test: Search for the `projects` relationship in the `Page` model.
rg 'class Page' -A 50 | rg 'projects'

Length of output: 793


69-101: LGTM! Ensure UserFavorite model and fields are correctly defined.

The UserFavoriteSerializer class is correctly defined. Verify that the UserFavorite model and its fields are correctly defined.

Verification successful

LGTM! Ensure UserFavorite model and fields are correctly defined.

The UserFavoriteSerializer class is correctly defined, and the UserFavorite model and its fields are appropriately defined as well.

  • UserFavorite model is located in apiserver/plane/db/models/favorite.py.
  • Relevant fields: user, entity_type, entity_identifier, name, is_folder, sequence, parent.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that the `UserFavorite` model and its fields are correctly defined.

# Test: Search for the `UserFavorite` model and its fields.
rg --type python 'class UserFavorite' -A 20

Length of output: 76


Script:

#!/bin/bash
# Description: Verify that the `UserFavorite` model and its fields are correctly defined.

# Test: Search for the `UserFavorite` model and its fields.
rg 'class UserFavorite' -A 50

Length of output: 6070

apiserver/plane/app/views/workspace/favorite.py (5)

20-35: LGTM!

The get method is correctly implemented.


37-47: LGTM!

The post method is correctly implemented.


49-59: LGTM!

The patch method is correctly implemented.


61-66: LGTM!

The delete method is correctly implemented.


74-88: LGTM!

The get method is correctly implemented.

web/core/components/workspace/sidebar/favorites/new-fav-folder.tsx (1)

22-113: LGTM!

The NewFavoriteFolder component is correctly implemented.

web/core/components/workspace/sidebar/workspace-menu.tsx (1)

69-69: LGTM!

The changes to the class attribute enhance the button's visibility and accessibility within the sidebar.

web/core/store/root.store.ts (3)

9-9: LGTM!

The imports for FavoriteStore and IFavoriteStore are necessary for the new functionality added to the CoreRootStore class.


56-56: LGTM!

The addition of the favorite property enhances the functionality of the CoreRootStore by integrating a new feature for managing favorite items.


83-83: LGTM!

The initialization of the favorite property ensures that the favorite store is instantiated and ready for use when the CoreRootStore is initialized.

apiserver/plane/app/urls/workspace.py (3)

28-29: Imports look good.

The new imports are correctly added and consistent with the existing style.


242-246: URL pattern for WorkspaceFavoriteEndpoint looks good.

The URL pattern is correctly defined and consistent with the existing patterns.


247-256: URL pattern for WorkspaceFavoriteGroupEndpoint looks good.

The URL pattern is correctly defined and consistent with the existing patterns.

web/core/components/workspace/sidebar/favorites/favorite-item.tsx (6)

1-21: Imports look good.

The import statements are correctly added and consistent with the existing style.


23-30: Component declaration and props look good.

The FavoriteItem component is declared with props for favorite and handleRemoveFromFavorites, which are correctly defined.


31-45: State and hooks implementation looks good.

The component uses various hooks for state management and side effects, which are correctly implemented and consistent with best practices.


47-68: getIcon function implementation looks good.

The getIcon function returns the appropriate icon based on the favorite.entity_type, handling all expected entity types.


70-85: getLink function implementation looks good.

The getLink function returns the appropriate link based on the favorite.entity_type, handling all expected entity types.


87-179: Component rendering looks good.

The component renders the favorite item with drag-and-drop functionality and a custom menu, which are correctly implemented and consistent with the design.

web/core/layouts/auth-layout/workspace-wrapper.tsx (2)

15-15: Import for useFavorite looks good.

The import statement for useFavorite is correctly added and consistent with the existing style.


73-78: useSWR hook for fetching workspace favorites looks good.

The useSWR hook is correctly implemented to fetch workspace favorites using the fetchFavorite function, and is consistent with the existing data fetching logic.

web/core/components/workspace/sidebar/favorites/favorites-menu.tsx (5)

28-48: State management looks good.

State management using useState, useRef, and custom hooks is correctly implemented.


49-85: Error handling in functions is appropriate.

The functions handleRemoveFromFavorites and handleRemoveFromFavoritesFolder handle errors appropriately by setting toast messages.


119-205: JSX structure looks good.

The JSX structure for the sidebar favorites menu is correctly implemented and follows best practices.


3-25: Ensure all imported modules are necessary.

Review the usage of imported modules to confirm that all are required. Unused imports can lead to unnecessary bloat and potential confusion.

Verification successful

All imported modules are necessary and used.

The verification confirms that each imported module in web/core/components/workspace/sidebar/favorites/favorites-menu.tsx is utilized within the file. There are no unnecessary imports.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of imported modules in the file.

# Test: Search for the usage of each imported module. Expect: Each module is used at least once.
rg --type tsx -A 5 $'import ' web/core/components/workspace/sidebar/favorites/favorites-menu.tsx

Length of output: 125


Script:

#!/bin/bash
# Description: Verify the usage of imported modules in the file.

# Test: Search for the usage of each imported module. Expect: Each module is used at least once.
rg --type typescript -A 5 $'import ' web/core/components/workspace/sidebar/favorites/favorites-menu.tsx

Length of output: 139


Script:

#!/bin/bash
# Description: Verify the usage of imported modules in the file.

# Test: Search for the usage of each imported module. Expect: Each module is used at least once.
rg --type ts -A 5 $'import ' web/core/components/workspace/sidebar/favorites/favorites-menu.tsx

Length of output: 1287


Script:

#!/bin/bash
# Description: Verify the usage of each imported module in the file.

# List of imported modules to check
modules=(
  "React"
  "useEffect"
  "useRef"
  "useState"
  "combine"
  "dropTargetForElements"
  "orderBy"
  "observer"
  "useParams"
  "ChevronRight"
  "FolderPlus"
  "Disclosure"
  "Transition"
  "IFavorite"
  "setToast"
  "TOAST_TYPE"
  "Tooltip"
  "cn"
  "useAppTheme"
  "useFavorite"
  "useLocalStorage"
  "usePlatformOS"
  "FavoriteFolder"
  "FavoriteItem"
  "NewFavoriteFolder"
)

# File to check
file="web/core/components/workspace/sidebar/favorites/favorites-menu.tsx"

# Search for usage of each module
for module in "${modules[@]}"; do
  echo "Searching for usage of module: $module"
  rg "$module" "$file"
done

Length of output: 9426


86-117: Ensure the useEffect dependencies are correct.

The useEffect hooks should have correct dependencies to avoid unnecessary re-renders or missing updates.

Verification successful

The useEffect dependencies are correctly specified.

The dependencies for both useEffect hooks are appropriate and necessary for their respective logic. No issues found.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the dependencies of `useEffect` hooks in the file.

# Test: Search for the `useEffect` hooks and their dependencies. Expect: Dependencies are correctly specified.
rg --type tsx -A 5 $'useEffect(' web/core/components/workspace/sidebar/favorites/favorites-menu.tsx

Length of output: 171


Script:

#!/bin/bash
# Description: Verify the dependencies of `useEffect` hooks in the file.

# Test: Search for the `useEffect` hooks and their dependencies. Expect: Dependencies are correctly specified.
rg --type tsx -A 10 'useEffect\(' web/core/components/workspace/sidebar/favorites/favorites-menu.tsx

Length of output: 130


Script:

#!/bin/bash
# Description: Verify the dependencies of `useEffect` hooks in the file.

# Locate the file
file_path=$(fd favorites-menu.tsx)

# Test: Search for the `useEffect` hooks and their dependencies. Expect: Dependencies are correctly specified.
rg -A 10 'useEffect\(' "$file_path"

Length of output: 540


Script:

#!/bin/bash
# Description: Verify the definitions and usages of dependencies in the file.

# Locate the file
file_path=$(fd favorites-menu.tsx)

# Search for the definitions and usages of `elementRef`
rg 'elementRef' "$file_path"

# Search for the definitions and usages of `isDragging`
rg 'isDragging' "$file_path"

# Search for the definitions and usages of `sidebarCollapsed`
rg 'sidebarCollapsed' "$file_path"

# Search for the definitions and usages of `toggleFavoriteMenu`
rg 'toggleFavoriteMenu' "$file_path"

Length of output: 1585

web/core/constants/event-tracker.ts (1)

231-233: New constant FAVORITE_ADDED is correctly defined.

The new constant FAVORITE_ADDED is correctly defined and follows naming conventions.

web/core/components/workspace/sidebar/projects-list.tsx (5)

Line range hint 30-43: State management looks good.

State management using useState, useRef, and custom hooks is correctly implemented.


Line range hint 45-126: Error handling in functions is appropriate.

The functions handleCopyText and handleOnProjectDrop handle errors appropriately by setting toast messages.


126-128: State update and local storage interaction is correct.

The function toggleListDisclosure correctly updates the state and interacts with local storage.


137-244: JSX structure looks good.

The JSX structure for the sidebar projects list is correctly implemented and follows best practices.


Line range hint 1-7: Ensure all imported modules are necessary.

Review the usage of imported modules to confirm that all are required. Unused imports can lead to unnecessary bloat and potential confusion.

web/core/store/favorite.store.ts (7)

126-137: Ensure proper error handling in updateFavorite.

The updateFavorite method has proper error handling and state updates.


238-339: Ensure proper error handling and state updates in CRUD methods.

The CRUD methods have proper error handling and state updates.


88-117: Ensure proper error handling and rollback.

The addFavorite method has proper error handling and rollback mechanism. Ensure the usage of uuidv4 for unique IDs is necessary.

Verification successful

Verified: Proper usage of uuidv4 for unique IDs.

The uuidv4 function is being used correctly for generating unique IDs in the addFavorite method, consistent with its usage in other parts of the codebase.

  • web/core/store/favorite.store.ts: const id = uuidv4();
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of `uuidv4` for unique IDs.

# Test: Search for the usage of `uuidv4`. Expect: Correct usage for generating unique IDs.
rg --type ts 'uuidv4\(\)'

Length of output: 431


34-76: Ensure proper initialization of services.

Verify that all services (FavoriteService, viewStore, projectStore, moduleStore, cycleStore, pageStore) are correctly initialized and used.

Verification successful

All services are properly initialized and used within the FavoriteStore class.

  • The services (FavoriteService, viewStore, projectStore, moduleStore, cycleStore, pageStore) are correctly initialized in the constructor.
  • These services are used in various methods within the FavoriteStore class, confirming their proper utilization.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all services are correctly initialized and used.

# Test: Search for the initialization of services. Expect: Correct initialization and usage.
rg --type ts 'new FavoriteService\(\)|_rootStore\.projectView|_rootStore\.projectRoot\.project|_rootStore\.module|_rootStore\.cycle|_rootStore\.projectPages'

Length of output: 636


Script:

#!/bin/bash
# Description: Verify the usage of services in the FavoriteStore class.

# Test: Search for the usage of services within the FavoriteStore class.
rg --type ts 'this\.favoriteService|this\.viewStore|this\.projectStore|this\.moduleStore|this\.cycleStore|this\.pageStore' web/core/store/favorite.store.ts

Length of output: 1545


173-189: Ensure proper error handling and sequence updates in moveFavoriteFolder.

The moveFavoriteFolder method has proper error handling and state updates. Verify the logic for sequence updates.

Verification successful

The moveFavoriteFolder method has proper error handling and sequence updates.

The method correctly updates the sequence and reverts it in case of an error, ensuring consistency in the favoriteMap.

  • favorite.store.ts: Proper state management and error handling are in place for the moveFavoriteFolder method.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the logic for sequence updates in `moveFavoriteFolder`.

# Test: Search for the logic in `moveFavoriteFolder`. Expect: Correct logic for sequence updates.
rg --type ts 'moveFavoriteFolder'

Length of output: 683


Script:

#!/bin/bash
# Description: Search for all references to `favoriteMap` in the codebase to understand its structure and usage.

# Find all references to favoriteMap
rg --type ts 'favoriteMap'

Length of output: 4685


Script:

#!/bin/bash
# Description: Review the `favorite.store.ts` file to understand how `favoriteMap` and the sequence property are managed.

# Display all lines in `favorite.store.ts` where `favoriteMap` is set or updated.
rg --type ts 'set\(this\.favoriteMap' -A 5 web/core/store/favorite.store.ts

Length of output: 2665


146-171: Ensure proper error handling and logic in moveFavorite.

The moveFavorite method has proper error handling and state updates. Verify the logic for adding and removing favorites from parents.

Verification successful

The moveFavorite method has proper error handling and state updates. The logic for adding and removing favorites from parents is correctly implemented.

  • The favorite is added to the new parent's children.
  • The favorite is removed from the old parent's children.
  • The parent of the favorite is updated.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the logic for adding and removing favorites from parents.

# Test: Search for the logic in `moveFavorite`. Expect: Correct logic for adding and removing favorites from parents.
rg --type ts 'moveFavorite'

Length of output: 2528


Script:

#!/bin/bash
# Extract the full implementation of the moveFavorite method in TypeScript
ast-grep --lang typescript --pattern $'class $_ {
  $$$
  moveFavorite($_, $_, $_) {
    $$$
  }
  $$$
}' --json

Length of output: 116


Script:

#!/bin/bash
# Extract the full implementation of the moveFavorite method in TypeScript
ast-grep --lang typescript --pattern 'moveFavorite = async ($_: string, $_: string, $_: Partial<$_>) => {
  $$$
}' --json

Length of output: 126


Script:

#!/bin/bash
# Extract the full implementation of the moveFavorite method using rg with context lines
rg --type ts 'moveFavorite = async' -A 20

Length of output: 1616


191-213: Ensure proper error handling and logic in removeFromFavoriteFolder.

The removeFromFavoriteFolder method has proper error handling and state updates. Verify the logic for removing favorites from parents.

Verification successful

The removeFromFavoriteFolder method has proper error handling and state updates. The logic for removing favorites from parents is implemented correctly.

  • The favoriteMap is updated to remove the parent and update the children as expected.
  • The set method is used correctly to update the favoriteMap.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the logic for removing favorites from parents in `removeFromFavoriteFolder`.

# Test: Search for the logic in `removeFromFavoriteFolder`. Expect: Correct logic for removing favorites from parents.
rg --type ts 'removeFromFavoriteFolder'

Length of output: 703


Script:

#!/bin/bash
# Extract the favoriteMap structure and any related methods to verify the logic within `removeFromFavoriteFolder`.

# Search for the favoriteMap definition and its related methods
rg --type ts 'favoriteMap' -A 10

# Search for the set method to understand how it updates the favoriteMap
rg --type ts 'set(' -A 5

Length of output: 23806


Script:

#!/bin/bash
# Retry the search for the set method to understand how it updates the favoriteMap with a corrected regex pattern

# Search for the set method usage in TypeScript files
rg --type ts '\bset\(' -A 5

Length of output: 155246

web/core/store/project-view.store.ts (3)

Line range hint 15-43:
Ensure proper initialization of services.

Verify that all services (ViewService, rootStore) are correctly initialized and used.

Verification successful

The review comment suggests ensuring that services like ViewService and rootStore are correctly initialized and used within the ProjectViewStore. The provided shell script output confirms that these services are indeed initialized in the ProjectViewStore constructor.

Key Observations:

  1. Initialization of rootStore:

    • web/core/store/project-view.store.ts: constructor(_rootStore: CoreRootStore) {
    • web/core/store/project-view.store.ts: this.rootStore = _rootStore;
  2. Initialization of ViewService:

    • web/core/store/project-view.store.ts: this.viewService = new ViewService();

Conclusion:

Both rootStore and ViewService are correctly initialized in the ProjectViewStore constructor. There is no indication of any missing or incorrect initialization based on the provided context.

Ensure proper initialization of services:

  • Initialization of rootStore and ViewService is correctly handled in the ProjectViewStore constructor.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all services are correctly initialized and used.

# Test: Search for the initialization of services. Expect: Correct initialization and usage.
rg --type ts 'new ViewService\(\)|_rootStore'

Length of output: 9363


360-365: Ensure proper error handling and logic in addViewToFavorites.

The addViewToFavorites method has proper error handling and state updates. Verify the logic for adding a view to favorites.

Verification successful

The addViewToFavorites method has proper error handling and state updates.

The method correctly checks if the view is already a favorite, updates the state optimistically, and reverts the state in case of an error.

  • Location: web/core/store/project-view.store.ts, lines 360-365
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the logic for adding a view to favorites in `addViewToFavorites`.

# Test: Search for the logic in `addViewToFavorites`. Expect: Correct logic for adding a view to favorites.
rg --type ts 'addViewToFavorites'

Length of output: 692


Script:

#!/bin/bash
# Extract the implementation of the `addViewToFavorites` method from `project-view.store.ts`.
ast-grep --lang typescript --pattern $'addViewToFavorites = async ($_workspaceSlug, $_projectId, $_viewId) => {
  $$$
}' web/core/store/project-view.store.ts

Length of output: 158


Script:

#!/bin/bash
# Extract the implementation of the `addViewToFavorites` method from `project-view.store.ts` with an adjusted pattern.
ast-grep --lang typescript --pattern $'addViewToFavorites = async ($_workspaceSlug, $_projectId, $_viewId) => {
  $$$
}' --web/core/store/project-view.store.ts

Length of output: 450


Script:

#!/bin/bash
# Extract the implementation of the `addViewToFavorites` method from `project-view.store.ts` with corrected argument formatting.
ast-grep --lang typescript --pattern $'addViewToFavorites = async ($_workspaceSlug, $_projectId, $_viewId) => {
  $$$
}' web/core/store/project-view.store.ts

Length of output: 158


Script:

#!/bin/bash
# Search for the implementation of the `addViewToFavorites` method and include additional context lines.
rg 'addViewToFavorites' -A 20 web/core/store/project-view.store.ts

Length of output: 2249


388-389: Ensure proper error handling and logic in removeViewFromFavorites.

The removeViewFromFavorites method has proper error handling and state updates. Verify the logic for removing a view from favorites.

Verification successful

The removeViewFromFavorites method in project-view.store.ts has proper error handling and state updates. The logic for removing a view from favorites is correct.

  • The method checks if the view is a favorite before attempting to remove it.
  • It updates the state to reflect the removal.
  • It calls removeFavoriteEntity from rootStore.favorite.
  • If an error occurs, it logs the error and reverts the state change.

The corresponding service method removeViewFromFavorites in view.service.ts correctly handles the API call and error propagation.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the logic for removing a view from favorites in `removeViewFromFavorites`.

# Test: Search for the logic in `removeViewFromFavorites`. Expect: Correct logic for removing a view from favorites.
rg --type ts 'removeViewFromFavorites'

Length of output: 795


Script:

#!/bin/bash
# Retrieve the full implementation of `removeViewFromFavorites` from `project-view.store.ts`
ast-grep --lang typescript --pattern 'removeViewFromFavorites = async ($$_) => { $$$ }' 

# Retrieve the full implementation of `removeViewFromFavorites` from `view.service.ts`
ast-grep --lang typescript --pattern 'async removeViewFromFavorites($$_): Promise<any> { $$$ }'

Length of output: 666


Script:

#!/bin/bash
# Retrieve the full implementation of `removeViewFromFavorites` from `project-view.store.ts`
ast-grep --lang typescript --pattern 'removeViewFromFavorites = async ($_:string, $_:string, $_:string) => { $$$ }' 

# Retrieve the full implementation of `removeViewFromFavorites` from `view.service.ts`
ast-grep --lang typescript --pattern 'async removeViewFromFavorites($_:string, $_:string, $_:string): Promise<any> { $$$ }'

Length of output: 750


Script:

#!/bin/bash
# Retrieve the full implementation of `removeViewFromFavorites` from `project-view.store.ts`
ast-grep --lang typescript --pattern 'removeViewFromFavorites = async ($$$) => { $$$ }' 

# Retrieve the full implementation of `removeViewFromFavorites` from `view.service.ts`
ast-grep --lang typescript --pattern 'async removeViewFromFavorites($$$): Promise<any> { $$$ }'

Length of output: 666


Script:

#!/bin/bash
# Retrieve the full implementation of `removeViewFromFavorites` from `project-view.store.ts`
rg -A 20 'removeViewFromFavorites = async' web/core/store/project-view.store.ts

# Retrieve the full implementation of `removeViewFromFavorites` from `view.service.ts`
rg -A 20 'async removeViewFromFavorites' web/core/services/view.service.ts

Length of output: 1195

web/core/components/workspace/sidebar/favorites/favorite-folder.tsx (2)

33-76: Ensure proper handling of state and props in FavoriteFolder.

The FavoriteFolder component correctly handles state and props. Verify the drag-and-drop functionality and context menu logic.

Verification successful

Ensure proper handling of state and props in FavoriteFolder.

The FavoriteFolder component correctly handles state and props. The drag-and-drop functionality and context menu logic are implemented as expected.

  • FavoriteFolder component: web/core/components/workspace/sidebar/favorites/favorite-folder.tsx
  • moveFavoriteFolder function: web/core/store/favorite.store.ts
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the drag-and-drop functionality and context menu logic in `FavoriteFolder`.

# Test: Search for the logic in `FavoriteFolder`. Expect: Correct handling of state, props, and events.
rg --type tsx 'FavoriteFolder'

Length of output: 58


Script:

#!/bin/bash
# Description: Verify the drag-and-drop functionality and context menu logic in `FavoriteFolder`.

# Test: Search for the logic in `FavoriteFolder`. Expect: Correct handling of state, props, and events.
rg --type-add 'tsx:*.tsx' 'FavoriteFolder'

Length of output: 3513


Script:

#!/bin/bash
# Description: Extract relevant code blocks for `FavoriteFolder` component and related drag-and-drop functionality.

# Extract the `FavoriteFolder` component implementation
rg --type-add 'tsx:*.tsx' --context 10 'export const FavoriteFolder' web/core/components/workspace/sidebar/favorites/favorite-folder.tsx

# Extract the `moveFavoriteFolder` function implementation
rg --type-add 'tsx:*.tsx' --context 10 'moveFavoriteFolder' web/core/store/favorite.store.ts

Length of output: 3570


54-72: Ensure proper error handling and logic in handleOnDrop.

The handleOnDrop method has proper error handling and state updates. Verify the logic for moving favorites.

#!/bin/bash
# Description: Verify the logic for moving favorites in `handleOnDrop`.

# Test: Search for the logic in `handleOnDrop`. Expect: Correct logic for moving favorites.
rg --type tsx 'handleOnDrop'
``

<details>
<summary>Verification successful</summary>



---

<!-- [monologue]
[task review_file_3/3 code_block_3/5] Review `handleOnDrop` method.
[observations] The `moveFavorite` function is defined as an async arrow function in `web/core/store/favorite.store.ts`. The function attempts to update the favorite and handles the response.
[analysis] The import statement search failed due to a regex error. However, we have enough context to proceed with reviewing the `moveFavorite` function. We need to ensure that this function correctly handles the move operation and error handling.
[actions] Review the `moveFavorite` function implementation to verify the logic for moving favorites.
-->

The `moveFavorite` function is defined as an async arrow function in `web/core/store/favorite.store.ts`. The function attempts to update the favorite and handles the response. The `handleOnDrop` method in `favorite-folder.tsx` correctly handles the drop event by calling `moveFavorite` and updating the state based on the promise resolution.

- **File:** `web/core/store/favorite.store.ts`
- **Definition:**
  ```typescript
  moveFavorite = async (workspaceSlug: string, favoriteId: string, data: Partial<IFavorite>) => {
    try {
      const response = await this.favoriteService.updateFavorite(workspaceSlug, favoriteId, data);
      runInAction(() => {
        // add the favorite to the new parent
        if (!data.parent) return;

Ensure proper error handling and logic in handleOnDrop.

The handleOnDrop method has proper error handling and state updates. The moveFavorite function correctly handles the move operation and errors.

Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Search for the definition of the `moveFavorite` function to verify its implementation.

# Locate the definition of `moveFavorite` function
ast-grep --lang typescript --pattern 'function moveFavorite($_, $_, $_) { $$$ }'

Length of output: 82


Script:

#!/bin/bash
# Description: Search for the definition of the `moveFavorite` function using a broader search pattern.

# Locate the definition of `moveFavorite` function as a named function or an arrow function
rg 'moveFavorite\s*=\s*' --type ts --type tsx -A 5

# Locate import statements for `moveFavorite`
rg 'import\s+{\s*moveFavorite\s*}' --type ts --type tsx

Length of output: 260


Script:

#!/bin/bash
# Description: Search for the definition of the `moveFavorite` function using a broader search pattern.

# Locate the definition of `moveFavorite` function as a named function or an arrow function
rg 'moveFavorite\s*=\s*' -t ts -t tsx -A 5

# Locate import statements for `moveFavorite`
rg 'import\s+{\s*moveFavorite\s*}' -t ts -t tsx

Length of output: 244


Script:

#!/bin/bash
# Description: Search for the definition of the `moveFavorite` function using a broader search pattern.

# Define tsx as a recognized file type
rg --type-add 'tsx:*.tsx' 'moveFavorite\s*=\s*' -t ts -t tsx -A 5

# Correct the regex pattern for import statements
rg --type-add 'tsx:*.tsx' 'import\s+{\s*moveFavorite\s*}' -t ts -t tsx

Length of output: 773

web/core/store/project/project.store.ts (2)

309-310: LGTM! But verify the function usage in the codebase.

The code changes are approved.

However, ensure that all function calls to removeProjectFromFavorites match the new implementation.


282-288: LGTM! But verify the function usage in the codebase.

The code changes are approved.

However, ensure that all function calls to addProjectToFavorites match the new implementation.

Verification successful

LGTM! The function usage matches the new implementation.

The code changes are approved, and all instances of addProjectToFavorites are consistent with the new implementation.

  • web/core/components/workspace/sidebar/projects-list-item.tsx
  • web/core/components/project/create-project-form.tsx
  • web/core/components/project/card.tsx
  • web/core/services/project/project.service.ts
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `addProjectToFavorites` match the new implementation.

# Test: Search for the function usage. Expect: Only occurrences of the new implementation.
rg --type ts -A 5 $'addProjectToFavorites'

Length of output: 5680


Script:

#!/bin/bash
# Description: Verify the implementation of addProjectToFavorites in the mentioned files.

# Search for the implementation details in projects-list-item.tsx
rg --type ts -A 10 'addProjectToFavorites' web/core/components/workspace/sidebar/projects-list-item.tsx

# Search for the implementation details in create-project-form.tsx
rg --type ts -A 10 'addProjectToFavorites' web/core/components/project/create-project-form.tsx

# Search for the implementation details in card.tsx
rg --type ts -A 10 'addProjectToFavorites' web/core/components/project/card.tsx

# Search for the implementation details in project.service.ts
rg --type ts -A 10 'addProjectToFavorites' web/core/services/project/project.service.ts

Length of output: 3521

web/core/store/pages/page.ts (2)

Line range hint 500-509:
LGTM! But verify the function usage in the codebase.

The code changes are approved.

However, ensure that all function calls to removePageFromFavorites match the new implementation.

Verification successful

Verified: Function usage matches the new implementation.

The function removePageFromFavorites is correctly used in the codebase, and all occurrences align with the new implementation.

  • web/core/store/pages/page.ts
  • web/core/components/pages/list/block-item-action.tsx
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify all function calls to `removePageFromFavorites` match the new implementation.

# Test: Search for the function usage. Expect: Only occurrences of the new implementation.
rg --type ts -A 5 $'removePageFromFavorites'

Length of output: 2150


75-76: LGTM! But verify the usage of rootStore in the codebase.

The code changes are approved.

However, ensure that the rootStore property is correctly utilized throughout the codebase.

Verification successful

LGTM! The rootStore property is correctly utilized throughout the codebase.

The code changes are approved.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of `rootStore` in the codebase.

# Test: Search for the usage of `rootStore` in the Page class. Expect: Correct utilization in all instances.
rg --type ts -A 5 $'rootStore'

Length of output: 99671

apiserver/plane/app/views/view/base.py (1)

477-477: Verify the impact of the hard delete on data integrity and retrieval.

The change to view_favorite.delete(soft=False) performs a hard delete. Ensure that this change does not negatively impact data integrity and retrieval processes.

apiserver/plane/app/views/page/base.py (1)

404-405: Verify the impact of hard delete on data retention policies.

The change to page_favorite.delete(soft=False) modifies the deletion behavior to a hard delete. Ensure this change aligns with the data retention policies and is intentional.

web/core/store/module.store.ts (2)

517-517: LGTM! Verify the implementation of rootStore.favorite.removeFavoriteEntity.

The transition to using this.rootStore.favorite.removeFavoriteEntity improves maintainability and scalability.

Ensure that the rootStore.favorite.removeFavoriteEntity method is correctly implemented and handles the payload as expected.

Verification successful

Verified! The removeFavoriteEntity method is correctly implemented and handles the payload as expected.

  • The method removes the entity from the entityMap.
  • It calls deleteFavorite with the workspaceSlug and favoriteId.
  • Proper error handling is in place to log any issues during the removal process.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of `rootStore.favorite.removeFavoriteEntity`.

# Test: Search for the method implementation. Expect: Correct handling of the payload.
rg --type ts -A 10 $'removeFavoriteEntity'

Length of output: 8426


489-493: LGTM! Verify the implementation of rootStore.favorite.addFavorite.

The transition to using this.rootStore.favorite.addFavorite improves maintainability and scalability.

Ensure that the rootStore.favorite.addFavorite method is correctly implemented and handles the payload as expected.

Verification successful

The implementation of rootStore.favorite.addFavorite is correctly handled.

The method in FavoriteStore ensures optimistic addition, interacts with the backend service, and manages the payload appropriately.

  • web/core/store/favorite.store.ts: Lines showing the implementation of addFavorite.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of `rootStore.favorite.addFavorite`.

# Test: Search for the method implementation. Expect: Correct handling of the payload.
rg --type ts -A 10 $'addFavorite'

Length of output: 10739

web/core/components/workspace/sidebar/projects-list-item.tsx (1)

370-381: LGTM! Verify the consolidated logic for adding/removing favorites.

The refactoring improves code maintainability and readability by reducing duplication and centralizing the rendering logic.

Ensure that the consolidated logic correctly handles the favorite status and updates the UI as expected.

Verification successful

Verified! The consolidated logic for adding/removing favorites is correctly implemented.

The handleAddToFavorites and handleRemoveFromFavorites functions in projects-list-item.tsx handle the favorite status appropriately and update the UI as expected.

  • handleAddToFavorites calls addProjectToFavorites and handles success and error states.
  • handleRemoveFromFavorites calls removeProjectFromFavorites and handles success and error states.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the consolidated logic for adding/removing favorites.

# Test: Search for the method implementations. Expect: Correct handling of the favorite status.
rg --type tsx -A 10 $'handleAddToFavorites' $'handleRemoveFromFavorites'

Length of output: 96


Script:

#!/bin/bash
# Description: Verify the consolidated logic for adding/removing favorites.

# Test: Search for the method implementations. Expect: Correct handling of the favorite status.
rg -A 10 'handleAddToFavorites' 'handleRemoveFromFavorites'

Length of output: 123


Script:

#!/bin/bash
# Description: Verify the consolidated logic for adding/removing favorites.

# Test: Search for the method implementation of handleAddToFavorites. Expect: Correct handling of the favorite status.
rg -A 10 'handleAddToFavorites'

# Test: Search for the method implementation of handleRemoveFromFavorites. Expect: Correct handling of the favorite status.
rg -A 10 'handleRemoveFromFavorites'

Length of output: 46902

web/core/store/cycle.store.ts (2)

583-583: Ensure the correctness of new parameters in removeFavoriteEntity.

The new parameters in the removeFavoriteEntity method have been simplified. Verify that these parameters are correctly populated and used throughout the application.

Verification successful

The new parameters in removeFavoriteEntity are correctly populated and used throughout the application.

The method is consistently used across various files with the new parameters, indicating a proper implementation of the refactor.

  • web/core/store/favorite.store.ts
  • web/core/store/project-view.store.ts
  • web/core/store/project/project.store.ts
  • web/core/store/module.store.ts
  • web/core/store/pages/page.ts
  • web/core/store/cycle.store.ts
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage and correctness of new parameters in `removeFavoriteEntity`.

# Test: Search for the function usage. Expect: Correct usage of new parameters.
rg --type typescript -A 5 $'removeFavoriteEntity'

Length of output: 83


Script:

#!/bin/bash
# Description: Verify the usage and correctness of new parameters in `removeFavoriteEntity`.

# Test: Search for the function usage. Expect: Correct usage of new parameters.
rg --type ts -A 5 $'removeFavoriteEntity'

Length of output: 5417


555-560: Ensure the correctness of new parameters in addFavorite.

The new parameters in the addFavorite method encapsulate details such as entity_type, entity_identifier, project_id, and entity_data. Verify that these parameters are correctly populated and used throughout the application.

Verification successful

The new parameters in addFavorite are correctly populated and used throughout the application.

The parameters entity_type, entity_identifier, project_id, and entity_data are consistently used across various contexts, ensuring standardized management of favorites.

  • web/core/store/favorite.store.ts
  • web/core/store/project-view.store.ts
  • web/core/store/project/project.store.ts
  • web/core/store/pages/page.ts
  • web/core/store/module.store.ts
  • web/core/store/cycle.store.ts
  • web/core/services/favorite/favorite.service.ts
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage and correctness of new parameters in `addFavorite`.

# Test: Search for the function usage. Expect: Correct usage of new parameters.
rg --type typescript -A 5 $'addFavorite'

Length of output: 74


Script:

#!/bin/bash
# Description: Verify the usage and correctness of new parameters in `addFavorite`.

# Test: Search for the function usage within TypeScript files. Expect: Correct usage of new parameters.
rg --glob '*.ts' -A 5 'addFavorite'

Length of output: 4876

apiserver/plane/app/views/project/base.py (1)

602-602: Verify the impact of hard delete in destroy.

The destroy method now performs a hard delete by calling delete with soft=False. Ensure that this change does not unintentionally affect data integrity or other parts of the application.

apiserver/plane/app/views/module/base.py (1)

843-843: Verify the impact of hard delete in destroy.

The destroy method now performs a hard delete by calling delete with soft=False. Ensure that this change does not unintentionally affect data integrity or other parts of the application.

apiserver/plane/app/views/cycle/base.py (1)

1157-1157: Verify the impact of hard delete.

The soft=False parameter in the delete method call performs a hard delete. Ensure this change aligns with the application's data integrity and user experience requirements.

Comment on lines 43 to 44
from .workspace.favorite import (
WorkspaceFavoriteEndpoint,
Copy link
Contributor

Choose a reason for hiding this comment

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

Remove unused import or ensure it is used.

The WorkspaceFavoriteEndpoint import is currently unused. Consider removing it if it is not needed or ensure it is used appropriately in the codebase.

Tools
Ruff

44-44: .workspace.favorite.WorkspaceFavoriteEndpoint imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

Comment on lines 44 to 45
WorkspaceFavoriteEndpoint,
WorkspaceFavoriteGroupEndpoint,
Copy link
Contributor

Choose a reason for hiding this comment

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

Remove unused import or ensure it is used.

The WorkspaceFavoriteGroupEndpoint import is currently unused. Consider removing it if it is not needed or ensure it is used appropriately in the codebase.

Tools
Ruff

44-44: .workspace.favorite.WorkspaceFavoriteEndpoint imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)


45-45: .workspace.favorite.WorkspaceFavoriteGroupEndpoint imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

@@ -121,3 +121,5 @@
from .webhook import WebhookSerializer, WebhookLogSerializer

from .dashboard import DashboardSerializer, WidgetSerializer

from .favorite import UserFavoriteSerializer
Copy link
Contributor

Choose a reason for hiding this comment

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

Address the unused import.

The import statement for UserFavoriteSerializer is added but not used in the file. Consider using it, adding it to __all__, or removing it to avoid unnecessary imports.

+  __all__ = [
+    ...
+    "UserFavoriteSerializer",
+  ]

Committable suggestion was skipped due to low confidence.

Tools
Ruff

125-125: .favorite.UserFavoriteSerializer imported but unused; consider removing, adding to __all__, or using a redundant alias

(F401)

GitHub Check: Codacy Static Code Analysis

[notice] 125-125: apiserver/plane/app/serializers/init.py#L125
'.favorite.UserFavoriteSerializer' imported but unused (F401)

Comment on lines 78 to 80
get existingFolders() {
return Object.values(this.favoriteMap).map((fav) => fav.name);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Optimize computed property existingFolders.

Consider using Object.keys for better performance when only keys are needed.

- return Object.values(this.favoriteMap).map((fav) => fav.name);
+ return Object.keys(this.favoriteMap).map((key) => this.favoriteMap[key].name);
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.

Suggested change
get existingFolders() {
return Object.values(this.favoriteMap).map((fav) => fav.name);
}
get existingFolders() {
return Object.keys(this.favoriteMap).map((key) => this.favoriteMap[key].name);
}

Comment on lines +215 to +229
removeFavoriteEntityFromStore = (entity_identifier: string, entity_type: string) => {
switch (entity_type) {
case "view":
return (this.viewStore.viewMap[entity_identifier].is_favorite = false);
case "module":
return (this.moduleStore.moduleMap[entity_identifier].is_favorite = false);
case "page":
return (this.pageStore.data[entity_identifier].is_favorite = false);
case "cycle":
return (this.cycleStore.cycleMap[entity_identifier].is_favorite = false);
case "project":
return (this.projectStore.projectMap[entity_identifier].is_favorite = false);
default:
return;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Avoid assignments in expressions.

The use of assignments in expressions is confusing and should be avoided.

- case "view":
-   return (this.viewStore.viewMap[entity_identifier].is_favorite = false);
- case "module":
-   return (this.moduleStore.moduleMap[entity_identifier].is_favorite = false);
- case "page":
-   return (this.pageStore.data[entity_identifier].is_favorite = false);
- case "cycle":
-   return (this.cycleStore.cycleMap[entity_identifier].is_favorite = false);
- case "project":
-   return (this.projectStore.projectMap[entity_identifier].is_favorite = false);
+ case "view":
+   this.viewStore.viewMap[entity_identifier].is_favorite = false;
+   break;
+ case "module":
+   this.moduleStore.moduleMap[entity_identifier].is_favorite = false;
+   break;
+ case "page":
+   this.pageStore.data[entity_identifier].is_favorite = false;
+   break;
+ case "cycle":
+   this.cycleStore.cycleMap[entity_identifier].is_favorite = false;
+   break;
+ case "project":
+   this.projectStore.projectMap[entity_identifier].is_favorite = false;
+   break;
+ default:
+   break;
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.

Suggested change
removeFavoriteEntityFromStore = (entity_identifier: string, entity_type: string) => {
switch (entity_type) {
case "view":
return (this.viewStore.viewMap[entity_identifier].is_favorite = false);
case "module":
return (this.moduleStore.moduleMap[entity_identifier].is_favorite = false);
case "page":
return (this.pageStore.data[entity_identifier].is_favorite = false);
case "cycle":
return (this.cycleStore.cycleMap[entity_identifier].is_favorite = false);
case "project":
return (this.projectStore.projectMap[entity_identifier].is_favorite = false);
default:
return;
}
removeFavoriteEntityFromStore = (entity_identifier: string, entity_type: string) => {
switch (entity_type) {
case "view":
this.viewStore.viewMap[entity_identifier].is_favorite = false;
break;
case "module":
this.moduleStore.moduleMap[entity_identifier].is_favorite = false;
break;
case "page":
this.pageStore.data[entity_identifier].is_favorite = false;
break;
case "cycle":
this.cycleStore.cycleMap[entity_identifier].is_favorite = false;
break;
case "project":
this.projectStore.projectMap[entity_identifier].is_favorite = false;
break;
default:
break;
}
Tools
Biome

[error] 218-218: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 220-220: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 222-222: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 224-224: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)


[error] 226-226: The assignment should not be in an expression.

The use of assignments in expressions is confusing.
Expressions are often considered as side-effect free.

(lint/suspicious/noAssignInExpressions)

Comment on lines 1 to 7
import { uniqBy } from "lodash";
import set from "lodash/set";
import { action, observable, makeObservable, runInAction, computed } from "mobx";
import { v4 as uuidv4 } from "uuid";
import { IFavorite } from "@plane/types";
import { FavoriteService } from "@/services/favorite";
import { CoreRootStore } from "./root.store";
Copy link
Contributor

Choose a reason for hiding this comment

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

Optimize lodash imports.

Consider importing only the required lodash functions directly to reduce bundle size.

- import { uniqBy } from "lodash";
- import set from "lodash/set";
+ import uniqBy from "lodash/uniqBy";
+ import set from "lodash/set";
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.

Suggested change
import { uniqBy } from "lodash";
import set from "lodash/set";
import { action, observable, makeObservable, runInAction, computed } from "mobx";
import { v4 as uuidv4 } from "uuid";
import { IFavorite } from "@plane/types";
import { FavoriteService } from "@/services/favorite";
import { CoreRootStore } from "./root.store";
import uniqBy from "lodash/uniqBy";
import set from "lodash/set";
import { action, observable, makeObservable, runInAction, computed } from "mobx";
import { v4 as uuidv4 } from "uuid";
import { IFavorite } from "@plane/types";
import { FavoriteService } from "@/services/favorite";
import { CoreRootStore } from "./root.store";

Comment on lines 1 to 31
"use client";

import { useEffect, useRef, useState } from "react";
import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";

import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
import { useParams } from "next/navigation";
import { PenSquare, Star, MoreHorizontal, ChevronRight, GripVertical } from "lucide-react";
import { Disclosure, Transition } from "@headlessui/react";
// ui
import { IFavorite } from "@plane/types";
import { CustomMenu, Tooltip, DropIndicator, setToast, TOAST_TYPE, FavoriteFolderIcon, DragHandle } from "@plane/ui";

// helpers
import { cn } from "@/helpers/common.helper";
// hooks
import { useAppTheme } from "@/hooks/store";
import { useFavorite } from "@/hooks/store/use-favorite";
import useOutsideClickDetector from "@/hooks/use-outside-click-detector";
import { usePlatformOS } from "@/hooks/use-platform-os";
// constants
import { FavoriteItem } from "./favorite-item";
import { getDestinationStateSequence } from "./favorites.helpers";
import { NewFavoriteFolder } from "./new-fav-folder";

type Props = {
isLastChild: boolean;
favorite: IFavorite;
handleRemoveFromFavorites: (favorite: IFavorite) => void;
};
Copy link
Contributor

Choose a reason for hiding this comment

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

Optimize imports.

Consider importing only the required components and hooks directly to reduce bundle size.

- import { useEffect, useRef, useState } from "react";
+ import { useEffect, useRef, useState } from "react";
- import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
+ import combine from "@atlaskit/pragmatic-drag-and-drop/combine";
- import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
+ import draggable from "@atlaskit/pragmatic-drag-and-drop/element/adapter/draggable";
+ import dropTargetForElements from "@atlaskit/pragmatic-drag-and-drop/element/adapter/dropTargetForElements";
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.

Suggested change
"use client";
import { useEffect, useRef, useState } from "react";
import { combine } from "@atlaskit/pragmatic-drag-and-drop/combine";
import { draggable, dropTargetForElements } from "@atlaskit/pragmatic-drag-and-drop/element/adapter";
import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
import { useParams } from "next/navigation";
import { PenSquare, Star, MoreHorizontal, ChevronRight, GripVertical } from "lucide-react";
import { Disclosure, Transition } from "@headlessui/react";
// ui
import { IFavorite } from "@plane/types";
import { CustomMenu, Tooltip, DropIndicator, setToast, TOAST_TYPE, FavoriteFolderIcon, DragHandle } from "@plane/ui";
// helpers
import { cn } from "@/helpers/common.helper";
// hooks
import { useAppTheme } from "@/hooks/store";
import { useFavorite } from "@/hooks/store/use-favorite";
import useOutsideClickDetector from "@/hooks/use-outside-click-detector";
import { usePlatformOS } from "@/hooks/use-platform-os";
// constants
import { FavoriteItem } from "./favorite-item";
import { getDestinationStateSequence } from "./favorites.helpers";
import { NewFavoriteFolder } from "./new-fav-folder";
type Props = {
isLastChild: boolean;
favorite: IFavorite;
handleRemoveFromFavorites: (favorite: IFavorite) => void;
};
"use client";
import { useEffect, useRef, useState } from "react";
import combine from "@atlaskit/pragmatic-drag-and-drop/combine";
import draggable from "@atlaskit/pragmatic-drag-and-drop/element/adapter/draggable";
import dropTargetForElements from "@atlaskit/pragmatic-drag-and-drop/element/adapter/dropTargetForElements";
import { attachClosestEdge, extractClosestEdge } from "@atlaskit/pragmatic-drag-and-drop-hitbox/closest-edge";
import { useParams } from "next/navigation";
import { PenSquare, Star, MoreHorizontal, ChevronRight, GripVertical } from "lucide-react";
import { Disclosure, Transition } from "@headlessui/react";
// ui
import { IFavorite } from "@plane/types";
import { CustomMenu, Tooltip, DropIndicator, setToast, TOAST_TYPE, FavoriteFolderIcon, DragHandle } from "@plane/ui";
// helpers
import { cn } from "@/helpers/common.helper";
// hooks
import { useAppTheme } from "@/hooks/store";
import { useFavorite } from "@/hooks/store/use-favorite";
import useOutsideClickDetector from "@/hooks/use-outside-click-detector";
import { usePlatformOS } from "@/hooks/use-platform-os";
// constants
import { FavoriteItem } from "./favorite-item";
import { getDestinationStateSequence } from "./favorites.helpers";
import { NewFavoriteFolder } from "./new-fav-folder";
type Props = {
isLastChild: boolean;
favorite: IFavorite;
handleRemoveFromFavorites: (favorite: IFavorite) => void;
};

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

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between fd12f54 and e55adca.

Files selected for processing (1)
  • apiserver/plane/app/views/page/base.py (1 hunks)
Additional comments not posted (1)
apiserver/plane/app/views/page/base.py (1)

389-389: Verify the implications of changing to a hard delete.

The change from a soft delete to a hard delete (soft=False) can significantly impact data retention policies, audit trails, and user expectations. Ensure this change aligns with the overall data management strategy and that all stakeholders are aware of this change.

@SatishGandham SatishGandham merged commit 34820ee into preview Aug 4, 2024
13 of 14 checks passed
@SatishGandham SatishGandham deleted the fix/favorites branch August 4, 2024 04:45
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.

3 participants