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

[Feature] Show | Edit project information in the task details page #3347

Conversation

CREDO23
Copy link
Contributor

@CREDO23 CREDO23 commented Nov 19, 2024

Description

Fix #3099

Type of Change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation update

Checklist

  • My code follows the style guidelines of this project
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings

Current screenshots

Loom

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced new API endpoints for retrieving organization project details.
    • Added functionality to select and manage projects within task details.
  • Bug Fixes

    • Corrected typographical errors in localization files and component properties.
  • Localization Updates

    • Added "PROJECT" label translations in multiple languages to enhance task management clarity.
  • Enhancements

    • Improved state management for organization projects and updated UI components for better user experience.

Copy link
Contributor

coderabbitai bot commented Nov 19, 2024

Caution

Review failed

The pull request is closed.

Walkthrough

The pull request introduces several enhancements to the API and components related to organization projects. New GET methods are added to retrieve organization project details and lists. The useOrganizationProjects hook is updated to manage these new API calls. Additionally, various components are modified to integrate project selection and display functionality. Localization files are updated to include translations for the term "Project" across multiple languages, and minor corrections are made to existing strings.

Changes

File Change Summary
apps/web/app/api/organization-projects/[id]/route.ts Added GET method for retrieving organization project details by id.
apps/web/app/api/organization-projects/route.ts Added GET method for retrieving a list of organization projects.
apps/web/app/hooks/features/useOrganizationProjects.ts Introduced getOrganizationProjectAPI and getOrganizationProjectsAPI calls; updated return structure to include new loading states and functions.
apps/web/app/interfaces/IDailyPlan.ts Corrected typo from "tomorow" to "tomorrow" in IDailyPlanMode.
apps/web/app/services/client/api/organization-projects.ts Added getOrganizationProjectAPI and getOrganizationProjectsAPI functions for fetching organization projects.
apps/web/app/services/server/requests/organization-projects.ts Added getOrganizationProjectRequest and getOrganizationProjectsRequest functions for server requests.
apps/web/app/stores/organization-projects.ts Introduced organizationProjectsState atom for managing organization projects state.
apps/web/app/components/pages/kanban/menu-kanban-card.tsx Corrected typo in PlanTask component's planMode prop from "tomorow" to "tomorrow".
apps/web/app/components/pages/task/details-section/blocks/task-secondary-info.tsx Added ProjectDropDown component for project selection; integrated useOrganizationProjects hook.
apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx Corrected string literal for planMode comparison from "tomorow" to "tomorrow".
apps/web/lib/features/task/task-card.tsx Updated planMode prop type to include 'tomorrow' and corrected previous typo.
apps/web/locales/*.json Added new key "PROJECT" with translations in multiple localization files; made minor formatting adjustments.

Assessment against linked issues

Objective Addressed Explanation
Display current project association in task detail (#3099)
Allow user to change project selection (#3099)
Enable user to remove project association (#3099)
Update task with new project information immediately (#3099)

Possibly related issues

Possibly related PRs

Suggested reviewers

  • Cedric921

Poem

🐇 In the fields where projects grow,
A new path for tasks we sow.
With dropdowns and hooks, we take our flight,
Managing projects feels just right!
From "tomorow" to "tomorrow," we cheer,
In every language, our goals are clear! 🌼

Warning

There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure.

🔧 eslint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx

Oops! Something went wrong! :(

ESLint: 8.46.0

ESLint couldn't find the config "next/core-web-vitals" to extend from. Please check that the name of the config is correct.

The config "next/core-web-vitals" was referenced from the config file in "/apps/web/.eslintrc.json".

If you still have problems, please stop by https://eslint.org/chat/help to chat with the team.


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>, 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.

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.

@CREDO23 CREDO23 changed the title add project in task details page / possiblity to edit [Feature] Show | Edit project information in the task details page Nov 19, 2024
@CREDO23 CREDO23 added the Don't Merge Do not merge this PR until label not removed label Nov 19, 2024
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: 9

🧹 Outside diff range and nitpick comments (14)
apps/web/app/services/client/api/organization-projects.ts (2)

18-22: Consider adding error handling documentation

While the implementation is correct, it would be helpful to document potential error cases (e.g., project not found, unauthorized access) to guide API consumers.

Add JSDoc comments like:

+/**
+ * Fetches a single organization project by ID
+ * @throws {ApiError} 404 - Project not found
+ * @throws {ApiError} 403 - Unauthorized access
+ */
 export function getOrganizationProjectAPI(id: string, tenantId?: string) {

29-34: Consider using a type-safe query builder

The query object construction could benefit from type safety and consistent formatting.

Consider this approach:

-const obj = {
-  'where[organizationId]': organizationId,
-  'where[tenantId]': tenantId,
-}
-const query = qs.stringify(obj);
+interface ProjectsQuery {
+  where: {
+    organizationId: string;
+    tenantId?: string;
+  };
+}
+
+const query = qs.stringify({
+  where: {
+    organizationId,
+    ...(tenantId && { tenantId })
+  }
+} as ProjectsQuery);
apps/web/app/api/organization-projects/route.ts (1)

31-35: Consider implementing pagination for large datasets

The current implementation fetches all projects at once, which could cause performance issues with large datasets.

Consider:

  1. Adding pagination parameters to the request
  2. Implementing cursor-based pagination for better performance
  3. Adding rate limiting to prevent abuse

Would you like me to provide an example implementation with pagination?

apps/web/app/api/organization-projects/[id]/route.ts (2)

43-43: Remove debug console.log statement

Debug logging should not be present in production code.

- console.log(response);

27-46: Consider adding type safety for response data

The implementation would benefit from proper TypeScript interfaces for the response data structure.

interface OrganizationProject {
  id: string;
  // Add other project properties
}

interface ApiResponse {
  data: OrganizationProject;
}

export async function GET(
  req: Request,
  { params }: { params: { id: string } }
): Promise<NextResponse<ApiResponse | { error: string }>> {
  // ... rest of the implementation
}
apps/web/app/services/server/requests/organization-projects.ts (3)

Line range hint 1-43: Improve type safety by removing any types.

The existing functions use any type extensively, which bypasses TypeScript's type checking and can lead to runtime errors. Consider defining proper interfaces for the request data.

Example refactor for the edit functions:

interface ProjectSettingsData {
  // Define your settings properties here
}

interface ProjectEditData {
  // Define your edit properties here
}

export function editOrganizationProjectsSettingsRequest({
  id,
  datas,
  bearer_token,
  tenantId
}: {
  id: string;
  datas: ProjectSettingsData;
  bearer_token: string;
  tenantId: string;
}) {
  return serverFetch<ProjectSettingsData>({
    // ... rest remains same
  });
}

62-84: Enhance query parameter handling and consistency.

A few suggestions for improvement:

  1. Fix the spacing in the type definition.
  2. Add support for pagination parameters.
  3. Add validation for query parameters.

Consider this improvement:

 export function getOrganizationProjectsRequest({
   tenantId,
   organizationId,
-  bearer_token
+  bearer_token,
+  page = 1,
+  limit = 10
 }: {
   tenantId: string;
   bearer_token: string;
-  organizationId : string;
+  organizationId: string;
+  page?: number;
+  limit?: number;
 }) {
   const obj = {
     'where[organizationId]': organizationId,
     'where[tenantId]': tenantId,
+    page,
+    limit
   }
+  
+  // Validate pagination parameters
+  if (page < 1 || limit < 1) {
+    throw new Error('Invalid pagination parameters');
+  }
+
   const query = qs.stringify(obj);

Line range hint 1-84: Consider implementing request error handling middleware.

To improve error handling and maintain consistency across all organization project requests, consider implementing middleware that:

  1. Standardizes error responses
  2. Handles network failures
  3. Validates request parameters
  4. Logs errors appropriately

This would reduce code duplication and ensure consistent error handling across all requests.

apps/web/app/hooks/features/useOrganizationProjects.ts (2)

17-27: Consider adding error states for better error handling

While the loading states are well-managed, consider adding error states to provide better feedback to users when API calls fail.

 const { loading: getOrganizationProjectLoading, queryCall: getOrganizationProjectQueryCall } =
-    useQuery(getOrganizationProjectAPI);
+    useQuery(getOrganizationProjectAPI, {
+      onError: (error) => {
+        // Handle error appropriately
+      }
+    });

53-69: Implement comprehensive error handling strategy

The current error handling only logs to console, which is insufficient for production. Consider implementing a comprehensive error handling strategy:

  1. Error reporting/logging service integration
  2. User-friendly error messages
  3. Error recovery mechanisms

Example implementation:

import { captureException } from '@sentry/react'; // or your preferred error tracking service

const handleError = (error: unknown, context: string) => {
  const errorMessage = error instanceof Error ? error.message : 'An unexpected error occurred';
  captureException(error, { extra: { context } });
  throw new Error(`${context}: ${errorMessage}`);
};

// Usage in your functions:
try {
  const res = await getOrganizationProjectsQueryCall();
  setOrganizationProjects(res.data.items);
} catch (error) {
  handleError(error, 'Failed to fetch organization projects');
}
apps/web/lib/features/task/task-card.tsx (1)

Line range hint 1-824: Consider splitting this file into smaller, focused components.

The file is becoming quite large (>800 lines) and the TaskCard component handles multiple responsibilities. Consider the following refactoring suggestions:

  1. Move helper components to separate files:
  • TaskInfo
  • UsersTaskAssigned
  • TimerButtonCall
  • TaskCardMenu
  • PlanTask
  • AddTaskToPlanComponent
  • RemoveTaskFromPlan
  • RemoveManyTaskFromPlan
  1. Extract complex state management into custom hooks:
  • Timer-related logic
  • Task planning logic
  • Menu-related state

This will improve maintainability, make the code more testable, and follow the Single Responsibility Principle.

Example structure:

features/task/
  components/
    TaskCard.tsx
    TaskInfo.tsx
    TaskTimer.tsx
    TaskMenu.tsx
    planning/
      PlanTask.tsx
      AddToPlan.tsx
      RemoveFromPlan.tsx
  hooks/
    useTaskTimer.tsx
    useTaskPlanning.tsx
    useTaskMenu.tsx
apps/web/locales/en.json (1)

346-346: Minor grammatical improvement needed in the error message.

The error message has a slight grammatical issue. Consider rewording for better clarity.

-			"TASK_HAS_PARENT": "Task Type can not be changed as Task has already Parent.",
+			"TASK_HAS_PARENT": "Task Type cannot be changed as Task already has a Parent.",
apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx (2)

308-308: Use strict equality operator ===

It's recommended to use the strict equality operator === instead of == to prevent unexpected type coercion. This ensures that the comparison checks both the value and the type.

Apply this diff to fix the equality check:

-			return  project.id == task.projectId
+			return  project.id === task.projectId

355-355: Localize hardcoded strings for internationalization

The default text 'Project' is hardcoded and not localized. Use the translation function to ensure it's translated appropriately.

Apply this diff to localize the default text:

-									<p className=" truncate ">{selected?.name ?? 'Project'}</p>
+									<p className=" truncate ">{selected?.name ?? t('pages.taskDetails.PROJECT')}</p>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between f89d96d and faa5214.

📒 Files selected for processing (24)
  • apps/web/app/api/organization-projects/[id]/route.ts (2 hunks)
  • apps/web/app/api/organization-projects/route.ts (2 hunks)
  • apps/web/app/hooks/features/useOrganizationProjects.ts (1 hunks)
  • apps/web/app/interfaces/IDailyPlan.ts (1 hunks)
  • apps/web/app/services/client/api/organization-projects.ts (2 hunks)
  • apps/web/app/services/server/requests/organization-projects.ts (2 hunks)
  • apps/web/app/stores/organization-projects.ts (1 hunks)
  • apps/web/components/pages/kanban/menu-kanban-card.tsx (1 hunks)
  • apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx (4 hunks)
  • apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx (1 hunks)
  • apps/web/lib/features/task/task-card.tsx (1 hunks)
  • apps/web/locales/ar.json (1 hunks)
  • apps/web/locales/bg.json (1 hunks)
  • apps/web/locales/de.json (1 hunks)
  • apps/web/locales/en.json (1 hunks)
  • apps/web/locales/es.json (1 hunks)
  • apps/web/locales/fr.json (1 hunks)
  • apps/web/locales/he.json (1 hunks)
  • apps/web/locales/it.json (1 hunks)
  • apps/web/locales/nl.json (1 hunks)
  • apps/web/locales/pl.json (1 hunks)
  • apps/web/locales/pt.json (1 hunks)
  • apps/web/locales/ru.json (1 hunks)
  • apps/web/locales/zh.json (1 hunks)
✅ Files skipped from review due to trivial changes (4)
  • apps/web/app/interfaces/IDailyPlan.ts
  • apps/web/app/stores/organization-projects.ts
  • apps/web/components/pages/kanban/menu-kanban-card.tsx
  • apps/web/locales/it.json
🔇 Additional comments (26)
apps/web/app/services/client/api/organization-projects.ts (2)

1-4: LGTM: Import statements are well-organized and necessary

All imports are properly utilized in the implementation, following a clean organization pattern.


19-21: Verify API endpoint alignment with routes

Let's ensure the client endpoints align with the server routes mentioned in the summary.

#!/bin/bash
# Description: Check if the API endpoints match the corresponding route handlers

# Search for corresponding API routes
echo "Searching for API routes..."
rg -t ts "app/api/organization-projects/\[id\]/route" --files-with-matches
rg -t ts "app/api/organization-projects/route" --files-with-matches

# Search for any other usages of these endpoints
echo "Searching for endpoint usages..."
rg -t ts "'/organization-projects/\$\{id\}'" -A 2
rg -t ts "'/organization-projects\?" -A 2

Also applies to: 35-37

apps/web/app/api/organization-projects/route.ts (2)

3-3: LGTM: Import changes are well-structured

The addition of getOrganizationProjectsRequest follows the existing pattern and is properly utilized.


23-38: Verify integration with task details page

The endpoint provides the necessary project listing functionality for the task details page.

Let's verify the integration:

#!/bin/bash
# Check if the task details component is properly consuming this endpoint
rg -l "getOrganizationProjectsAPI" "apps/web/app/components"

# Verify error handling in the UI components
rg "useOrganizationProjects.*error" "apps/web/app/components"
apps/web/app/api/organization-projects/[id]/route.ts (2)

3-3: LGTM: Import statement is correctly updated

The import statement properly includes the new getOrganizationProjectRequest function needed for the GET endpoint.


27-46: Verify error handling consistency across the application

Let's verify that the error handling approach is consistent with other API routes in the application.

#!/bin/bash
# Search for error handling patterns in other API routes
echo "Searching for error handling patterns in API routes..."
rg -A 5 "NextResponse\.json.*error.*status" "apps/web/app/api"

# Search for authentication guard usage patterns
echo "Searching for authentication guard usage patterns..."
rg -A 5 "authenticatedGuard" "apps/web/app/api"
apps/web/app/services/server/requests/organization-projects.ts (1)

45-60: LGTM! Well-structured and type-safe implementation.

The function is properly typed and follows the established pattern for request functions.

apps/web/app/hooks/features/useOrganizationProjects.ts (2)

1-15: LGTM! Clean imports and state management setup

The imports are well-organized and the state management using Jotai is appropriate for managing organization projects data.


72-82: Verify integration with task details page

The hook provides all necessary functionality for project management, but let's verify its integration with the task details page as per PR objectives.

#!/bin/bash
# Search for usage of useOrganizationProjects in task details components
echo "Searching for task details components using useOrganizationProjects..."
rg -l "useOrganizationProjects.*task.*detail" --type ts --type tsx

# Search for project editing functionality in task components
echo "Searching for project editing implementation..."
ast-grep --pattern 'const { editOrganizationProject } = useOrganizationProjects()'
apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx (2)

94-94: LGTM! Fixed typo in planMode comparison.

The correction from 'tomorow' to 'tomorrow' in the planMode comparison is accurate.


Line range hint 1-300: Verify alignment with PR objectives.

This file appears to be unrelated to the PR's main objective of adding project editing capabilities to the task details page. Please clarify if this change was intentionally included in this PR or if it should be moved to a separate bug fix PR.

Let's verify if this file is referenced in any project-related changes:

#!/bin/bash
# Search for references to this file in other changed files
git diff --name-only HEAD~1 | xargs rg "create-daily-plan-form-modal"

# Search for any project-related changes in this file
rg -i "project" apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx
apps/web/locales/zh.json (1)

346-347: LGTM! The changes look good.

The changes maintain consistency and correctness:

  1. The punctuation change in the error message is appropriate
  2. The new "PROJECT" translation is accurate and follows the established conventions
apps/web/lib/features/task/task-card.tsx (1)

Line range hint 815-823: LGTM! The tomorrow planning implementation is well-structured.

The code follows the established patterns with proper loading state handling and translation support.

apps/web/locales/he.json (1)

346-347: LGTM! The new translations are properly implemented.

The new translations for task parent validation message and project label are correctly added to the taskDetails section with proper Hebrew translations.

apps/web/locales/ar.json (2)

346-346: LGTM: Formatting update looks good.

The updated translation for TASK_HAS_PARENT is properly formatted and grammatically correct in Arabic.


347-347: LGTM: New translation addition.

The Arabic translation "مشروع" for "Project" is correct and appropriately placed under the taskDetails section, aligning with the PR objectives of adding project information to task details.

apps/web/locales/en.json (1)

347-347: LGTM! Project label addition aligns with PR objectives.

The new translation key for "Project" follows the correct naming convention and supports the feature to display project information in task details.

apps/web/locales/nl.json (1)

346-347: LGTM! Changes align with PR objectives.

The reordering of TASK_HAS_PARENT and addition of PROJECT translation are correct. The Dutch translation for "Project" is accurate, and these changes support the enhancement of project information display in the task details page.

apps/web/locales/bg.json (1)

346-347: LGTM! The translations are properly structured.

The new translations for task parent relationship and project label are well-formatted and align with the PR objectives of adding project information to task details.

apps/web/locales/pl.json (1)

346-347: LGTM! Translations are accurate and properly structured.

The Polish translations are correct:

  • "Projekt" is the correct translation for "Project"
  • The placement in the taskDetails section aligns with the PR's objective of adding project information to the task details page
apps/web/locales/ru.json (1)

346-347: LGTM! Verify translations across all localization files.

The Russian translation for "Project" is correct, and the JSON structure is maintained.

Let's verify that the "PROJECT" key is consistently added across all localization files:

#!/bin/bash
# Description: Check for consistent PROJECT translations across all locale files
# Expected: Each locale file should have the PROJECT key under taskDetails

# Find all locale files and check for PROJECT key
fd -e json -d 1 . apps/web/locales --exec sh -c '
  echo "Checking {}"
  if ! jq -e ".taskDetails.PROJECT" {} > /dev/null; then
    echo "❌ Missing PROJECT key in {}"
    exit 1
  fi
'
apps/web/locales/pt.json (1)

346-347: LGTM! Translation keys added correctly.

The new translation keys are properly structured and align with the PR objectives for adding project-related functionality:

  • Error message for tasks with parents
  • "PROJECT" translation for the task details page
apps/web/locales/es.json (1)

346-347: LGTM! The translations are accurate.

The Spanish translations for both keys are correct:

  • "TASK_HAS_PARENT": The message about task type restrictions due to parent tasks is preserved
  • "PROJECT": The translation "Proyecto" is the correct Spanish word for "Project"

These changes align well with the PR objective of adding project information to the task details page.

apps/web/locales/de.json (1)

346-347: LGTM! Translations are accurate and well-placed.

The German translations for both keys are correct:

  • "TASK_HAS_PARENT" message clearly explains the constraint
  • "PROJECT" is accurately translated to "Projekt"
apps/web/locales/fr.json (1)

346-347: LGTM! The French translations are accurate.

The new translations for task parent relationship and project term are grammatically correct and consistent with French language conventions.

Let's verify the consistency of these translations across other language files:

#!/bin/bash
# Description: Check if the new translations exist in other language files
# Expected: All language files should have these keys with appropriate translations

# Find all locale files
fd -e json -d 1 . apps/web/locales/ --exec sh -c '
  echo "=== Checking $1 ==="
  # Check for TASK_HAS_PARENT key
  jq -r ".taskDetails.TASK_HAS_PARENT // empty" "$1"
  # Check for PROJECT key
  jq -r ".taskDetails.PROJECT // empty" "$1"
' sh
apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx (1)

293-293: Verify memoization of getOrganizationProjects to prevent unnecessary fetches

Ensure that getOrganizationProjects is memoized to avoid repeated fetching on every render, which can degrade performance.

Run the following script to check if getOrganizationProjects is properly memoized:

#!/bin/bash
# Description: Check if `getOrganizationProjects` is memoized in `useOrganizationProjects`

# Search for the declaration of `getOrganizationProjects` and verify usage of `useCallback`
fd 'useOrganizationProjects.ts' | xargs grep -A 10 'function useOrganizationProjects'

# Expected Result: `getOrganizationProjects` should be wrapped with `useCallback` or similar memoization

@CREDO23 CREDO23 force-pushed the 3099-feature-task--add-project-information-in-task-detail-and-edit-task-properties branch from faa5214 to 6fa9d66 Compare November 19, 2024 13:27
@CREDO23 CREDO23 removed the Don't Merge Do not merge this PR until label not removed label Nov 19, 2024
@CREDO23 CREDO23 requested review from evereq and Cedric921 November 19, 2024 13:28
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (5)
apps/web/app/services/server/requests/organization-projects.ts (2)

Line range hint 1-43: Consider improving type safety in existing functions

The existing functions use any type extensively, which defeats TypeScript's type checking benefits. Consider defining proper interfaces for the request data and response types.

Example improvement:

interface ProjectSettingsData {
  // define your settings properties here
}

interface ProjectUpdateData {
  // define your update properties here
}

export function editOrganizationProjectsSettingsRequest({
  id,
  datas,
  bearer_token,
  tenantId
}: {
  id: string;
  datas: ProjectSettingsData;
  bearer_token: string;
  tenantId: string;
}) {
  return serverFetch<ProjectSettingsData>({
    // ... rest of the implementation
  });
}

62-84: Clean up formatting and enhance type safety

The function implementation is good, but could benefit from some improvements:

  1. Remove unnecessary empty lines (71, 77)
  2. Add type safety for query parameters
  3. Consider adding JSDoc to document the query parameters

Here's a suggested improvement:

interface ProjectQueryParams {
  'where[organizationId]': string;
  'where[tenantId]': string;
}

/**
 * Retrieves organization projects with pagination
 * @param tenantId - The tenant identifier
 * @param organizationId - Filter projects by organization
 * @param bearer_token - Authentication token
 * @returns Paginated list of projects
 */
export function getOrganizationProjectsRequest({
  tenantId,
  organizationId,
  bearer_token
}: {
  tenantId: string;
  bearer_token: string;
  organizationId: string;
}) {
  const queryParams: ProjectQueryParams = {
    'where[organizationId]': organizationId,
    'where[tenantId]': tenantId,
  };
  const query = qs.stringify(queryParams);

  return serverFetch<PaginationResponse<IProject>>({
    path: `/organization-projects?${query}`,
    method: 'GET',
    bearer_token,
    tenantId
  });
}
apps/web/app/hooks/features/useOrganizationProjects.ts (1)

29-49: Consider reducing code duplication in edit operations

Both edit operations share very similar structure and error handling. Consider creating a shared utility function to reduce duplication.

+ const executeEditOperation = useCallback(
+   (operation: Function, id: string, data: any) => {
+     if (user?.tenantId) {
+       return operation(id, data, user.tenantId).then((res) => res);
+     }
+   },
+   [user]
+ );

  const editOrganizationProjectSetting = useCallback(
    (id: string, data: any) => {
-     if (user?.tenantId) {
-       return editOrganizationProjectSettingQueryCall(id, data, user?.tenantId || '').then((res) => {
-         return res;
-       });
-     }
+     return executeEditOperation(editOrganizationProjectSettingQueryCall, id, data);
    },
-   [user, editOrganizationProjectSettingQueryCall]
+   [executeEditOperation, editOrganizationProjectSettingQueryCall]
  );
apps/web/app/interfaces/ITask.ts (1)

Line range hint 164-165: Consider addressing the TODO comment about project type.

The comment indicates that the project property in ITaskStatusStack should be an object type rather than a string. With the new project editing feature, it might be a good time to address this technical debt to ensure proper type safety.

Would you like help defining the proper project object type structure? This would improve type safety for the project editing feature.

apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx (1)

280-287: Enhance JSDoc documentation

The current documentation could be more descriptive. Consider adding:

  • Purpose of the component
  • Description of what happens when a project is selected/removed
  • Return value description including the dropdown structure
 /**
- * TaskProject dropdown
+ * A dropdown component that allows users to view, select, or remove a project association for a task.
  *
  * @param {Object} props - The props object
- * @param {ITeamTask} props.task - The ITeamTask object which
+ * @param {ITeamTask} props.task - The task object containing current project association
  *
- * @returns {JSX.Element} - The Dropdown element
+ * @returns {JSX.Element} A dropdown menu displaying available projects with options to select or remove
  */
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between faa5214 and 6fa9d66.

📒 Files selected for processing (25)
  • apps/web/app/api/organization-projects/[id]/route.ts (2 hunks)
  • apps/web/app/api/organization-projects/route.ts (2 hunks)
  • apps/web/app/hooks/features/useOrganizationProjects.ts (1 hunks)
  • apps/web/app/interfaces/IDailyPlan.ts (1 hunks)
  • apps/web/app/interfaces/ITask.ts (1 hunks)
  • apps/web/app/services/client/api/organization-projects.ts (2 hunks)
  • apps/web/app/services/server/requests/organization-projects.ts (2 hunks)
  • apps/web/app/stores/organization-projects.ts (1 hunks)
  • apps/web/components/pages/kanban/menu-kanban-card.tsx (1 hunks)
  • apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx (4 hunks)
  • apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx (1 hunks)
  • apps/web/lib/features/task/task-card.tsx (1 hunks)
  • apps/web/locales/ar.json (1 hunks)
  • apps/web/locales/bg.json (1 hunks)
  • apps/web/locales/de.json (1 hunks)
  • apps/web/locales/en.json (1 hunks)
  • apps/web/locales/es.json (1 hunks)
  • apps/web/locales/fr.json (1 hunks)
  • apps/web/locales/he.json (1 hunks)
  • apps/web/locales/it.json (1 hunks)
  • apps/web/locales/nl.json (1 hunks)
  • apps/web/locales/pl.json (1 hunks)
  • apps/web/locales/pt.json (1 hunks)
  • apps/web/locales/ru.json (1 hunks)
  • apps/web/locales/zh.json (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • apps/web/app/interfaces/IDailyPlan.ts
🚧 Files skipped from review as they are similar to previous changes (19)
  • apps/web/app/api/organization-projects/route.ts
  • apps/web/app/services/client/api/organization-projects.ts
  • apps/web/app/stores/organization-projects.ts
  • apps/web/components/pages/kanban/menu-kanban-card.tsx
  • apps/web/lib/features/daily-plan/create-daily-plan-form-modal.tsx
  • apps/web/lib/features/task/task-card.tsx
  • apps/web/locales/ar.json
  • apps/web/locales/bg.json
  • apps/web/locales/de.json
  • apps/web/locales/en.json
  • apps/web/locales/es.json
  • apps/web/locales/fr.json
  • apps/web/locales/he.json
  • apps/web/locales/it.json
  • apps/web/locales/nl.json
  • apps/web/locales/pl.json
  • apps/web/locales/pt.json
  • apps/web/locales/ru.json
  • apps/web/locales/zh.json
🔇 Additional comments (13)
apps/web/app/api/organization-projects/[id]/route.ts (4)

3-3: LGTM: Import changes are appropriate

The addition of getOrganizationProjectRequest import aligns with the new GET functionality.


29-31: Add proper error response for missing ID

The current implementation returns undefined when id is missing, which could lead to unclear error responses.


37-43: Add error handling for external request

The external API call should be wrapped in a try-catch block to handle potential failures gracefully.


27-44: Overall implementation looks good, with noted concerns

The GET method implementation follows good practices:

  • Proper authentication check
  • Consistent response handling
  • Aligns with the PR objective to support project information viewing

However, please address the error handling concerns mentioned above for better reliability.

Let's verify the API endpoint usage:

✅ Verification successful

The previous command failed because ripgrep didn't recognize the typescript file type. Let's try a more basic search pattern to find and analyze the API routes and their error handling patterns.


Based on the extensive search results, I can now verify the error handling patterns across the API routes. Let me analyze the GET endpoint in question and compare it with other implementations.

Error handling implementation is consistent with codebase patterns

The GET endpoint's error handling follows the established patterns seen across the codebase:

  1. Early return for missing ID parameter
  2. Authentication check with proper 401 response
  3. Using the standard $res wrapper for responses

The implementation aligns with other API routes in the codebase that follow similar patterns, such as:

  • Consistent 401 unauthorized responses using NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
  • Parameter validation with early returns
  • Proper error propagation from the underlying request functions

No additional error handling is required as the current implementation matches the project's established patterns.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for proper error handling in other API routes
# This helps establish consistency in error handling patterns

# Search for similar API routes and their error handling patterns
rg -t typescript "export async function (GET|PUT|POST|DELETE).+\{.+\}.+\{.+id.+\}" ./apps/web/app/api

Length of output: 138


Script:

#!/bin/bash
# Let's try a simpler pattern to find API route handlers
rg -l "export async function (GET|POST|PUT|DELETE)" ./apps/web/app/api

# Then examine their error handling patterns
rg -A 10 "export async function (GET|POST|PUT|DELETE)" ./apps/web/app/api

Length of output: 115618

apps/web/app/services/server/requests/organization-projects.ts (2)

45-60: LGTM! Well-structured function with proper typing

The implementation is clean, properly typed, and follows RESTful conventions. It aligns well with the PR objective of retrieving project information for the task details page.


54-59: Verify API endpoint compatibility

The implemented endpoints align with the PR objectives, but let's verify they're properly configured on the backend.

Also applies to: 78-83

✅ Verification successful

API endpoints are properly implemented and consistent

The verification shows that:

  • The endpoints /organization-projects/${id} and /organization-projects?${query} are consistently implemented in both server and client layers
  • The IProject interface is properly defined with all necessary fields
  • The endpoints follow the same pattern across the codebase for both GET and PUT operations
  • The implementation properly handles tenant isolation through tenantId parameter
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if the API endpoints are defined in the backend routes
echo "Checking API endpoint definitions..."
rg -l "organization-projects/\$\{id\}" --type ts
rg -l "organization-projects\?" --type ts

# Look for any existing usage patterns
echo "Checking existing usage patterns..."
rg "serverFetch.*organization-projects" --type ts

Length of output: 430


Script:

#!/bin/bash
# Let's check the actual implementation and usage of these endpoints
echo "Checking organization-projects implementation..."
rg -A 5 "organization-projects" apps/web/app/services/server/requests/organization-projects.ts
rg -A 5 "organization-projects" apps/web/app/services/client/api/organization-projects.ts

# Check for API route definitions in backend
echo "Checking backend API routes..."
fd "routes|api" --type f | rg -i "api|routes" | xargs rg -l "organization-projects"

# Check for any related models or interfaces
echo "Checking related models..."
ast-grep --pattern 'interface IProject {
  $$$
}'

Length of output: 2311

apps/web/app/hooks/features/useOrganizationProjects.ts (4)

1-15: LGTM! Clean imports and state management setup

The imports are well-organized, and the state management setup using jotai follows React best practices.


17-27: LGTM! Well-structured query hooks setup

The query hooks are consistently structured with proper loading states and clear naming conventions.


72-82: LGTM! Well-structured hook return value

The hook exposes all necessary operations, loading states, and data with clear, consistent naming.


1-82: Verify hook integration with TaskSecondaryInfo component

Based on the PR objectives, this hook should be integrated with the TaskSecondaryInfo component to enable project editing in the task details page.

✅ Verification successful

Hook is properly integrated with TaskSecondaryInfo component

The hook is correctly integrated and used in the TaskSecondaryInfo component:

  • Imported and used in the ProjectDropDown component
  • Fetches projects on component mount using getOrganizationProjects
  • Projects are displayed in a dropdown for task assignment
  • Proper error handling is implemented for project updates
  • State management is handled through Jotai atoms
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the hook's integration with TaskSecondaryInfo component

# Check if the hook is imported and used in TaskSecondaryInfo
rg -l "useOrganizationProjects.*TaskSecondaryInfo"

# Check for proper error handling in the component
ast-grep --pattern 'try {
  $$$
  useOrganizationProjects()
  $$$
} catch'

Length of output: 129


Script:

#!/bin/bash
# Let's try a different approach to verify the integration

# First, find the TaskSecondaryInfo component
fd TaskSecondaryInfo

# Search for useOrganizationProjects usage in any file
rg "useOrganizationProjects"

# Find imports of useOrganizationProjects
rg "import.*useOrganizationProjects"

Length of output: 1062


Script:

#!/bin/bash
# Let's examine the TaskSecondaryInfo component's implementation to verify proper integration

# Check the implementation of TaskSecondaryInfo
cat apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx

# Also check if there are any error boundaries or error handling
rg -A 5 "catch" apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx

Length of output: 12431

apps/web/app/interfaces/ITask.ts (1)

21-21: LGTM! The type change aligns with requirements.

Making projectId nullable supports the feature requirement of allowing users to remove project associations from tasks.

Let's verify that the codebase handles null project IDs appropriately:

✅ Verification successful

The nullable projectId change is safe and properly handled

The codebase analysis shows that making projectId nullable in ITask.ts is consistent with the existing implementation:

  • The change aligns with the task creation/update logic in apps/web/app/services/client/api/tasks.ts which already handles null projectId
  • The task secondary info component in apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx properly handles project removal with projectId: null
  • Related interfaces like ITaskIssue already use projectId: string | null pattern
  • The API routes in apps/web/app/api/tasks/ are designed to work with optional project associations
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for projectId usage to ensure proper null handling
rg -t typescript -t tsx "projectId" -A 3 -B 3

Length of output: 80


Script:

#!/bin/bash
# Search for projectId usage with ripgrep, using correct file extensions
rg "projectId" -g "*.ts" -g "*.tsx" -A 3 -B 3

Length of output: 44643

apps/web/components/pages/task/details-section/blocks/task-secondary-info.tsx (2)

221-226: LGTM! Clean integration of project section

The project section is well-integrated, following the same pattern and styling as other task properties.


313-319: [Duplicate] Provide user feedback on update errors

This issue was previously identified in an earlier review. The error handling still only logs to console without user feedback.

Also applies to: 325-331

Comment on lines +51 to +70
const getOrganizationProject = useCallback(
async (id: string) => {
try {
return await getOrganizationProjectQueryCall(id);
} catch (error) {
console.log(error);
}
},
[getOrganizationProjectQueryCall]
);

const getOrganizationProjects = useCallback(async () => {
try {
const res = await getOrganizationProjectsQueryCall();

setOrganizationProjects(res.data.items);
} catch (error) {
console.log(error);
}
}, [getOrganizationProjectsQueryCall, setOrganizationProjects]);
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Standardize the return strategy for get operations

The get operations have inconsistent return strategies:

  • getOrganizationProject returns the API response directly
  • getOrganizationProjects updates state but doesn't return anything

Consider standardizing this behavior based on the consumer's needs.

  const getOrganizationProjects = useCallback(async () => {
    try {
      const res = await getOrganizationProjectsQueryCall();
      setOrganizationProjects(res.data.items);
+     return res.data.items; // Return the items for consistency
    } catch (error) {
      console.log(error);
+     throw error; // Propagate error for consistent error handling
    }
  }, [getOrganizationProjectsQueryCall, setOrganizationProjects]);

Committable suggestion skipped: line range outside the PR's diff.

…ondary-info.tsx

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@evereq evereq merged commit f37fac7 into develop Nov 19, 2024
10 of 13 checks passed
@evereq evereq deleted the 3099-feature-task--add-project-information-in-task-detail-and-edit-task-properties branch November 19, 2024 18:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Feature] Task | Add project information in task detail and edit task properties
3 participants