diff --git a/apiserver/plane/app/views/cycle/base.py b/apiserver/plane/app/views/cycle/base.py index c156f3d03f..4062f9674d 100644 --- a/apiserver/plane/app/views/cycle/base.py +++ b/apiserver/plane/app/views/cycle/base.py @@ -142,11 +142,11 @@ class CycleViewSet(BaseViewSet): ) ) .annotate( - pending_issues=Count( + cancelled_issues=Count( "issue_cycle__issue__id", distinct=True, filter=Q( - issue_cycle__issue__state__group__in=["backlog", "unstarted", "started"], + issue_cycle__issue__state__group__in=["cancelled"], issue_cycle__issue__archived_at__isnull=True, issue_cycle__issue__is_draft=False, issue_cycle__deleted_at__isnull=True, @@ -235,7 +235,7 @@ class CycleViewSet(BaseViewSet): "is_favorite", "total_issues", "completed_issues", - "pending_issues", + "cancelled_issues", "assignee_ids", "status", "version", @@ -267,7 +267,7 @@ class CycleViewSet(BaseViewSet): # meta fields "is_favorite", "total_issues", - "pending_issues", + "cancelled_issues", "completed_issues", "assignee_ids", "status", diff --git a/packages/types/src/cycle/cycle.d.ts b/packages/types/src/cycle/cycle.d.ts index e325b81ad6..638d974e64 100644 --- a/packages/types/src/cycle/cycle.d.ts +++ b/packages/types/src/cycle/cycle.d.ts @@ -104,7 +104,6 @@ export interface ICycle extends TProgressSnapshot { project_detail: IProjectDetails; progress: any[]; version: number; - pending_issues: number; } export interface CycleIssueResponse { diff --git a/web/core/components/cycles/list/cycle-list-item-action.tsx b/web/core/components/cycles/list/cycle-list-item-action.tsx index a5b98ca5d5..f44b9bd6c1 100644 --- a/web/core/components/cycles/list/cycle-list-item-action.tsx +++ b/web/core/components/cycles/list/cycle-list-item-action.tsx @@ -86,7 +86,11 @@ export const CycleListItemAction: FC = observer((props) => { const showIssueCount = useMemo(() => cycleStatus === "draft" || cycleStatus === "upcoming", [cycleStatus]); - const showTransferIssues = routerProjectId && cycleDetails.pending_issues > 0 && cycleStatus === "completed"; + const transferableIssuesCount = cycleDetails + ? cycleDetails.total_issues - (cycleDetails.cancelled_issues + cycleDetails.completed_issues) + : 0; + + const showTransferIssues = routerProjectId && transferableIssuesCount > 0 && cycleStatus === "completed"; const isEditingAllowed = allowPermissions( [EUserPermissions.ADMIN, EUserPermissions.MEMBER], @@ -258,7 +262,7 @@ export const CycleListItemAction: FC = observer((props) => { }} > - Transfer {cycleDetails.pending_issues} work items + Transfer {transferableIssuesCount} work items )} diff --git a/web/core/components/cycles/quick-actions.tsx b/web/core/components/cycles/quick-actions.tsx index 5d27cfe107..436ed0cdda 100644 --- a/web/core/components/cycles/quick-actions.tsx +++ b/web/core/components/cycles/quick-actions.tsx @@ -44,6 +44,9 @@ export const CycleQuickActions: React.FC = observer((props) => { const isArchived = !!cycleDetails?.archived_at; const isCompleted = cycleDetails?.status?.toLowerCase() === "completed"; const isCurrentCycle = cycleDetails?.status?.toLowerCase() === "current"; + const transferrableIssuesCount = cycleDetails + ? cycleDetails.total_issues - (cycleDetails.cancelled_issues + cycleDetails.completed_issues) + : 0; // auth const isEditingAllowed = allowPermissions( [EUserPermissions.ADMIN, EUserPermissions.MEMBER], @@ -178,7 +181,7 @@ export const CycleQuickActions: React.FC = observer((props) => { cycleId={cycleId} projectId={projectId} workspaceSlug={workspaceSlug} - transferrableIssuesCount={cycleDetails.pending_issues} + transferrableIssuesCount={transferrableIssuesCount} cycleName={cycleDetails.name} /> )} diff --git a/web/core/components/issues/issue-detail/label/select/label-select.tsx b/web/core/components/issues/issue-detail/label/select/label-select.tsx index 05f9956efa..78607561c4 100644 --- a/web/core/components/issues/issue-detail/label/select/label-select.tsx +++ b/web/core/components/issues/issue-detail/label/select/label-select.tsx @@ -36,7 +36,8 @@ export const IssueLabelSelect: React.FC = observer((props) => const [query, setQuery] = useState(""); const [submitting, setSubmitting] = useState(false); - const canCreateLabel = allowPermissions([EUserProjectRoles.ADMIN], EUserPermissionsLevel.PROJECT); + const canCreateLabel = + projectId && allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.PROJECT, workspaceSlug, projectId); const projectLabels = getProjectLabels(projectId); @@ -98,7 +99,7 @@ export const IssueLabelSelect: React.FC = observer((props) => setQuery(""); } - if (query !== "" && e.key === "Enter") { + if (query !== "" && e.key === "Enter" && canCreateLabel) { e.stopPropagation(); e.preventDefault(); await handleAddLabel(query); diff --git a/web/core/components/issues/issue-layouts/properties/label-dropdown.tsx b/web/core/components/issues/issue-layouts/properties/label-dropdown.tsx index 68fe34ebf6..b5b2ac03c8 100644 --- a/web/core/components/issues/issue-layouts/properties/label-dropdown.tsx +++ b/web/core/components/issues/issue-layouts/properties/label-dropdown.tsx @@ -81,7 +81,8 @@ export const LabelDropdown = (props: ILabelDropdownProps) => { const storeLabels = getProjectLabels(projectId); const { allowPermissions } = useUserPermissions(); - const canCreateLabel = allowPermissions([EUserProjectRoles.ADMIN], EUserPermissionsLevel.PROJECT); + const canCreateLabel = + projectId && allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.PROJECT, workspaceSlug, projectId); let projectLabels: IIssueLabel[] = defaultOptions; if (storeLabels && storeLabels.length > 0) projectLabels = storeLabels; @@ -157,7 +158,7 @@ export const LabelDropdown = (props: ILabelDropdownProps) => { setQuery(""); } - if (query !== "" && e.key === "Enter") { + if (query !== "" && e.key === "Enter" && canCreateLabel) { e.preventDefault(); await handleAddLabel(query); }