Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 34 additions & 25 deletions apiserver/plane/app/views/search/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,47 +42,56 @@ def get(self, request, slug, project_id):
issues = search_issues(query, issues)

if parent == "true" and issue_id:
issue = Issue.issue_objects.get(pk=issue_id)
issues = issues.filter(
~Q(pk=issue_id), ~Q(pk=issue.parent_id), ~Q(parent_id=issue_id)
)
issue = Issue.issue_objects.filter(pk=issue_id).first()
if issue:
issues = issues.filter(
~Q(pk=issue_id),
~Q(pk=issue.parent_id),
~Q(parent_id=issue_id),
)
if issue_relation == "true" and issue_id:
issue = Issue.issue_objects.get(pk=issue_id)
issues = issues.filter(
~Q(pk=issue_id),
~Q(
issue_related__issue=issue,
issue_related__deleted_at__isnull=True,
),
~Q(
issue_relation__related_issue=issue,
issue_related__deleted_at__isnull=True,
),
)
issue = Issue.issue_objects.filter(pk=issue_id).first()
if issue:
issues = issues.filter(
~Q(pk=issue_id),
~(
Q(issue_related__issue=issue)
& Q(issue_related__deleted_at__isnull=True)
),
~(
Q(issue_relation__related_issue=issue)
& Q(issue_relation__deleted_at__isnull=True)
),
)
if sub_issue == "true" and issue_id:
issue = Issue.issue_objects.get(pk=issue_id)
issues = issues.filter(~Q(pk=issue_id), parent__isnull=True)
issue = Issue.issue_objects.filter(pk=issue_id).first()
if issue:
issues = issues.filter(~Q(pk=issue_id), parent__isnull=True)
if issue.parent:
issues = issues.filter(~Q(pk=issue.parent_id))

if cycle == "true":
issues = issues.exclude(issue_cycle__isnull=False)
issues = issues.exclude(
Q(issue_cycle__isnull=False)
& Q(issue_cycle__deleted_at__isnull=True)
)

if module:
issues = issues.exclude(issue_module__module=module)
issues = issues.exclude(
Q(issue_module__module=module)
& Q(issue_module__deleted_at__isnull=True)
)

if target_date == "none":
issues = issues.filter(target_date__isnull=True)

if ProjectMember.objects.filter(
project_id=project_id,
member=self.request.user,
is_active=True,
role=5
role=5,
).exists():
issues = issues.filter(
created_by=self.request.user
)
issues = issues.filter(created_by=self.request.user)

return Response(
issues.values(
Expand Down
18 changes: 17 additions & 1 deletion web/core/components/issues/issue-modal/base.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import React, { useEffect, useRef, useState } from "react";
import { observer } from "mobx-react";
import { useParams, usePathname } from "next/navigation";
// types
import type { TIssue } from "@plane/types";
import type { TBaseIssue, TIssue } from "@plane/types";
// ui
import { EModalPosition, EModalWidth, ModalCore, TOAST_TYPE, setToast } from "@plane/ui";
import { CreateIssueToastActionItems, IssuesModalProps } from "@/components/issues";
Expand Down Expand Up @@ -252,6 +252,22 @@ export const CreateUpdateIssueModalBase: React.FC<IssuesModalProps> = observer((
if (isDraft) await draftIssues.updateIssue(workspaceSlug.toString(), data.id, payload);
else if (updateIssue) await updateIssue(payload.project_id, data.id, payload);

// check if we should add issue to cycle/module
if (
payload.cycle_id &&
payload.cycle_id !== "" &&
(payload.cycle_id !== cycleId || storeType !== EIssuesStoreType.CYCLE)
) {
await addIssueToCycle(data as TBaseIssue, payload.cycle_id);
}
if (
payload.module_ids &&
payload.module_ids.length > 0 &&
(!payload.module_ids.includes(moduleId?.toString()) || storeType !== EIssuesStoreType.MODULE)
) {
await addIssueToModule(data as TBaseIssue, payload.module_ids);
}

Comment on lines +255 to +270
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

⚠️ Potential issue

Ensure proper updating of issue cycle and module associations

When updating an issue, adding it to a new cycle or modules without removing it from previous associations may lead to the issue being linked to multiple cycles or modules unintentionally. Consider modifying the code to remove the issue from its previous cycle and modules before adding it to the new ones.

Apply this diff to handle the removal of the issue from previous associations:

          if (
            payload.cycle_id &&
            payload.cycle_id !== "" &&
            (payload.cycle_id !== cycleId || storeType !== EIssuesStoreType.CYCLE)
          ) {
+           if (data.cycle_id && data.cycle_id !== payload.cycle_id) {
+             await removeIssueFromCycle(data as TBaseIssue, data.cycle_id);
+           }
            await addIssueToCycle(data as TBaseIssue, payload.cycle_id);
          }

          if (
            payload.module_ids &&
            payload.module_ids.length > 0 &&
            (!payload.module_ids.includes(moduleId?.toString()) || storeType !== EIssuesStoreType.MODULE)
          ) {
+           const modulesToRemove = data.module_ids?.filter(
+             (id) => !payload.module_ids.includes(id)
+           ) || [];
+           if (modulesToRemove.length > 0) {
+             await removeIssueFromModules(data as TBaseIssue, modulesToRemove);
+           }
            await addIssueToModule(data as TBaseIssue, payload.module_ids);
          }

Ensure you define the removeIssueFromCycle and removeIssueFromModules functions to handle the removal logic appropriately.

📝 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
// check if we should add issue to cycle/module
if (
payload.cycle_id &&
payload.cycle_id !== "" &&
(payload.cycle_id !== cycleId || storeType !== EIssuesStoreType.CYCLE)
) {
await addIssueToCycle(data as TBaseIssue, payload.cycle_id);
}
if (
payload.module_ids &&
payload.module_ids.length > 0 &&
(!payload.module_ids.includes(moduleId?.toString()) || storeType !== EIssuesStoreType.MODULE)
) {
await addIssueToModule(data as TBaseIssue, payload.module_ids);
}
// check if we should add issue to cycle/module
if (
payload.cycle_id &&
payload.cycle_id !== "" &&
(payload.cycle_id !== cycleId || storeType !== EIssuesStoreType.CYCLE)
) {
if (data.cycle_id && data.cycle_id !== payload.cycle_id) {
await removeIssueFromCycle(data as TBaseIssue, data.cycle_id);
}
await addIssueToCycle(data as TBaseIssue, payload.cycle_id);
}
if (
payload.module_ids &&
payload.module_ids.length > 0 &&
(!payload.module_ids.includes(moduleId?.toString()) || storeType !== EIssuesStoreType.MODULE)
) {
const modulesToRemove = data.module_ids?.filter(
(id) => !payload.module_ids.includes(id)
) || [];
if (modulesToRemove.length > 0) {
await removeIssueFromModules(data as TBaseIssue, modulesToRemove);
}
await addIssueToModule(data as TBaseIssue, payload.module_ids);
}

// add other property values
await handleCreateUpdatePropertyValues({
issueId: data.id,
Expand Down