From 47ee971ea6957cf00cec90d8b34174a005750b52 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia Date: Mon, 5 Feb 2024 13:25:26 +0530 Subject: [PATCH 1/6] fix: completed cycle list layout validation --- .../issues/issue-layouts/list/base-list-root.tsx | 3 +++ web/components/issues/issue-layouts/list/default.tsx | 9 +++++++-- .../issues/issue-layouts/list/roots/cycle-root.tsx | 9 ++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/web/components/issues/issue-layouts/list/base-list-root.tsx b/web/components/issues/issue-layouts/list/base-list-root.tsx index 10f3582f14b..81f21911ec2 100644 --- a/web/components/issues/issue-layouts/list/base-list-root.tsx +++ b/web/components/issues/issue-layouts/list/base-list-root.tsx @@ -51,6 +51,7 @@ interface IBaseListRoot { storeType: TCreateModalStoreTypes; addIssuesToView?: (issueIds: string[]) => Promise; canEditPropertiesBasedOnProject?: (projectId: string) => boolean; + isCompletedCycle?: boolean; } export const BaseListRoot = observer((props: IBaseListRoot) => { @@ -63,6 +64,7 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { storeType, addIssuesToView, canEditPropertiesBasedOnProject, + isCompletedCycle = false, } = props; // mobx store const { @@ -136,6 +138,7 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { disableIssueCreation={!enableIssueCreation || !isEditingAllowed} storeType={storeType} addIssuesToView={addIssuesToView} + isCompletedCycle={isCompletedCycle} /> diff --git a/web/components/issues/issue-layouts/list/default.tsx b/web/components/issues/issue-layouts/list/default.tsx index 95e31b758c8..dd6c8da228e 100644 --- a/web/components/issues/issue-layouts/list/default.tsx +++ b/web/components/issues/issue-layouts/list/default.tsx @@ -37,6 +37,7 @@ export interface IGroupByList { storeType: TCreateModalStoreTypes; addIssuesToView?: (issueIds: string[]) => Promise; viewId?: string; + isCompletedCycle?: boolean; } const GroupByList: React.FC = (props) => { @@ -55,6 +56,7 @@ const GroupByList: React.FC = (props) => { disableIssueCreation, storeType, addIssuesToView, + isCompletedCycle = false, } = props; // store hooks const member = useMember(); @@ -115,7 +117,7 @@ const GroupByList: React.FC = (props) => { title={_list.name || ""} count={is_list ? issueIds?.length || 0 : issueIds?.[_list.id]?.length || 0} issuePayload={_list.payload} - disableIssueCreation={disableIssueCreation || isGroupByCreatedBy} + disableIssueCreation={disableIssueCreation || isGroupByCreatedBy || isCompletedCycle} storeType={storeType} addIssuesToView={addIssuesToView} /> @@ -132,7 +134,7 @@ const GroupByList: React.FC = (props) => { /> )} - {enableIssueQuickAdd && !disableIssueCreation && !isGroupByCreatedBy && ( + {enableIssueQuickAdd && !disableIssueCreation && !isGroupByCreatedBy && !isCompletedCycle && (
Promise; + isCompletedCycle?: boolean; } export const List: React.FC = (props) => { @@ -186,6 +189,7 @@ export const List: React.FC = (props) => { disableIssueCreation, storeType, addIssuesToView, + isCompletedCycle = false, } = props; return ( @@ -205,6 +209,7 @@ export const List: React.FC = (props) => { disableIssueCreation={disableIssueCreation} storeType={storeType} addIssuesToView={addIssuesToView} + isCompletedCycle={isCompletedCycle} />
); diff --git a/web/components/issues/issue-layouts/list/roots/cycle-root.tsx b/web/components/issues/issue-layouts/list/roots/cycle-root.tsx index 89da8dd54b5..e30c207b649 100644 --- a/web/components/issues/issue-layouts/list/roots/cycle-root.tsx +++ b/web/components/issues/issue-layouts/list/roots/cycle-root.tsx @@ -2,7 +2,7 @@ import React, { useMemo } from "react"; import { useRouter } from "next/router"; import { observer } from "mobx-react-lite"; // hooks -import { useIssues } from "hooks/store"; +import { useCycle, useIssues } from "hooks/store"; // components import { CycleIssueQuickActions } from "components/issues"; // types @@ -19,6 +19,7 @@ export const CycleListLayout: React.FC = observer(() => { const { workspaceSlug, projectId, cycleId } = router.query; // store const { issues, issuesFilter } = useIssues(EIssuesStoreType.CYCLE); + const { currentProjectCompletedCycleIds } = useCycle(); const issueActions = useMemo( () => ({ @@ -40,6 +41,10 @@ export const CycleListLayout: React.FC = observer(() => { }), [issues, workspaceSlug, cycleId] ); + const isCompletedCycle = + cycleId && currentProjectCompletedCycleIds ? currentProjectCompletedCycleIds.includes(cycleId.toString()) : false; + + const canEditIssueProperties = () => !isCompletedCycle; return ( { if (!workspaceSlug || !projectId || !cycleId) throw new Error(); return issues.addIssueToCycle(workspaceSlug.toString(), projectId.toString(), cycleId.toString(), issueIds); }} + canEditPropertiesBasedOnProject={canEditIssueProperties} + isCompletedCycle={isCompletedCycle} /> ); }); From 1e0d7509ca5b85544bb3cfb6d9fed0159baad4c3 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia Date: Mon, 5 Feb 2024 13:28:36 +0530 Subject: [PATCH 2/6] fix: completed cycle kanban layout validation --- .../issues/issue-layouts/kanban/base-kanban-root.tsx | 4 +++- .../issues/issue-layouts/kanban/roots/cycle-root.tsx | 10 +++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/web/components/issues/issue-layouts/kanban/base-kanban-root.tsx b/web/components/issues/issue-layouts/kanban/base-kanban-root.tsx index 486d676254b..a73d016fe3b 100644 --- a/web/components/issues/issue-layouts/kanban/base-kanban-root.tsx +++ b/web/components/issues/issue-layouts/kanban/base-kanban-root.tsx @@ -46,6 +46,7 @@ export interface IBaseKanBanLayout { storeType?: TCreateModalStoreTypes; addIssuesToView?: (issueIds: string[]) => Promise; canEditPropertiesBasedOnProject?: (projectId: string) => boolean; + isCompletedCycle?: boolean; } type KanbanDragState = { @@ -65,6 +66,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas storeType, addIssuesToView, canEditPropertiesBasedOnProject, + isCompletedCycle = false, } = props; // router const router = useRouter(); @@ -276,7 +278,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas showEmptyGroup={userDisplayFilters?.show_empty_groups || true} quickAddCallback={issues?.quickAddIssue} viewId={viewId} - disableIssueCreation={!enableIssueCreation || !isEditingAllowed} + disableIssueCreation={!enableIssueCreation || !isEditingAllowed || isCompletedCycle} canEditProperties={canEditProperties} storeType={storeType} addIssuesToView={addIssuesToView} diff --git a/web/components/issues/issue-layouts/kanban/roots/cycle-root.tsx b/web/components/issues/issue-layouts/kanban/roots/cycle-root.tsx index 0903355ceec..2b311f6eb95 100644 --- a/web/components/issues/issue-layouts/kanban/roots/cycle-root.tsx +++ b/web/components/issues/issue-layouts/kanban/roots/cycle-root.tsx @@ -2,7 +2,7 @@ import React, { useMemo } from "react"; import { useRouter } from "next/router"; import { observer } from "mobx-react-lite"; // hooks -import { useIssues } from "hooks/store"; +import { useCycle, useIssues } from "hooks/store"; // ui import { CycleIssueQuickActions } from "components/issues"; // types @@ -20,6 +20,7 @@ export const CycleKanBanLayout: React.FC = observer(() => { // store const { issues, issuesFilter } = useIssues(EIssuesStoreType.CYCLE); + const { currentProjectCompletedCycleIds } = useCycle(); const issueActions = useMemo( () => ({ @@ -42,6 +43,11 @@ export const CycleKanBanLayout: React.FC = observer(() => { [issues, workspaceSlug, cycleId] ); + const isCompletedCycle = + cycleId && currentProjectCompletedCycleIds ? currentProjectCompletedCycleIds.includes(cycleId.toString()) : false; + + const canEditIssueProperties = () => !isCompletedCycle; + return ( { if (!workspaceSlug || !projectId || !cycleId) throw new Error(); return issues.addIssueToCycle(workspaceSlug.toString(), projectId.toString(), cycleId.toString(), issueIds); }} + canEditPropertiesBasedOnProject={canEditIssueProperties} + isCompletedCycle={isCompletedCycle} /> ); }); From 4e8516a489bc57cb76ba9cd251b0c2516f850486 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia Date: Mon, 5 Feb 2024 13:36:13 +0530 Subject: [PATCH 3/6] fix: completed cycle spreadsheet layout validation --- .../spreadsheet/base-spreadsheet-root.tsx | 13 +++++++++++-- .../issue-layouts/spreadsheet/roots/cycle-root.tsx | 10 +++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/web/components/issues/issue-layouts/spreadsheet/base-spreadsheet-root.tsx b/web/components/issues/issue-layouts/spreadsheet/base-spreadsheet-root.tsx index 54df6ca2446..f5fc99d3316 100644 --- a/web/components/issues/issue-layouts/spreadsheet/base-spreadsheet-root.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/base-spreadsheet-root.tsx @@ -28,10 +28,19 @@ interface IBaseSpreadsheetRoot { [EIssueActions.REMOVE]?: (issue: TIssue) => void; }; canEditPropertiesBasedOnProject?: (projectId: string) => boolean; + isCompletedCycle?: boolean; } export const BaseSpreadsheetRoot = observer((props: IBaseSpreadsheetRoot) => { - const { issueFiltersStore, issueStore, viewId, QuickActions, issueActions, canEditPropertiesBasedOnProject } = props; + const { + issueFiltersStore, + issueStore, + viewId, + QuickActions, + issueActions, + canEditPropertiesBasedOnProject, + isCompletedCycle = false, + } = props; // router const router = useRouter(); const { workspaceSlug, projectId } = router.query as { workspaceSlug: string; projectId: string }; @@ -113,7 +122,7 @@ export const BaseSpreadsheetRoot = observer((props: IBaseSpreadsheetRoot) => { quickAddCallback={issueStore.quickAddIssue} viewId={viewId} enableQuickCreateIssue={enableQuickAdd} - disableIssueCreation={!enableIssueCreation || !isEditingAllowed} + disableIssueCreation={!enableIssueCreation || !isEditingAllowed || isCompletedCycle} /> ); }); diff --git a/web/components/issues/issue-layouts/spreadsheet/roots/cycle-root.tsx b/web/components/issues/issue-layouts/spreadsheet/roots/cycle-root.tsx index 40b93355792..7f92bd74ca6 100644 --- a/web/components/issues/issue-layouts/spreadsheet/roots/cycle-root.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/roots/cycle-root.tsx @@ -2,7 +2,7 @@ import React, { useMemo } from "react"; import { observer } from "mobx-react-lite"; import { useRouter } from "next/router"; // mobx store -import { useIssues } from "hooks/store"; +import { useCycle, useIssues } from "hooks/store"; // components import { BaseSpreadsheetRoot } from "../base-spreadsheet-root"; import { EIssueActions } from "../../types"; @@ -15,6 +15,7 @@ export const CycleSpreadsheetLayout: React.FC = observer(() => { const { workspaceSlug, cycleId } = router.query as { workspaceSlug: string; cycleId: string }; const { issues, issuesFilter } = useIssues(EIssuesStoreType.CYCLE); + const { currentProjectCompletedCycleIds } = useCycle(); const issueActions = useMemo( () => ({ @@ -35,6 +36,11 @@ export const CycleSpreadsheetLayout: React.FC = observer(() => { [issues, workspaceSlug, cycleId] ); + const isCompletedCycle = + cycleId && currentProjectCompletedCycleIds ? currentProjectCompletedCycleIds.includes(cycleId.toString()) : false; + + const canEditIssueProperties = () => !isCompletedCycle; + return ( { viewId={cycleId} issueActions={issueActions} QuickActions={CycleIssueQuickActions} + canEditPropertiesBasedOnProject={canEditIssueProperties} + isCompletedCycle={isCompletedCycle} /> ); }); From ebe2c6db4878d69f0826d17093da1bd3c37b8bb7 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia Date: Mon, 5 Feb 2024 13:36:58 +0530 Subject: [PATCH 4/6] fix: date dropdown disabled fix --- web/components/dropdowns/date.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/web/components/dropdowns/date.tsx b/web/components/dropdowns/date.tsx index 1dba6f78037..3cd9ca16a72 100644 --- a/web/components/dropdowns/date.tsx +++ b/web/components/dropdowns/date.tsx @@ -105,6 +105,7 @@ export const DateDropdown: React.FC = (props) => { tabIndex={tabIndex} className={cn("h-full", className)} onKeyDown={handleKeyDown} + disabled={disabled} >