From 8e80e35d10f989ec25f073b5c808e40922405818 Mon Sep 17 00:00:00 2001 From: rahulramesha Date: Thu, 7 Dec 2023 18:50:05 +0530 Subject: [PATCH] view changes for the project roles --- .../issue-layouts/kanban/base-kanban-root.tsx | 22 ++- .../issues/issue-layouts/kanban/block.tsx | 8 +- .../issue-layouts/kanban/blocks-list.tsx | 6 +- .../issues/issue-layouts/kanban/default.tsx | 24 +-- .../issues/issue-layouts/kanban/swimlanes.tsx | 26 +-- .../issue-layouts/list/base-list-root.tsx | 10 +- .../issues/issue-layouts/list/block.tsx | 8 +- .../issues/issue-layouts/list/blocks-list.tsx | 6 +- .../issues/issue-layouts/list/default.tsx | 26 +-- .../roots/all-issue-layout-root.tsx | 8 +- .../spreadsheet/base-spreadsheet-root.tsx | 16 +- .../spreadsheet/columns/columns-list.tsx | 28 ++-- .../columns/issue/issue-column.tsx | 6 +- .../issue/spreadsheet-issue-column.tsx | 10 +- .../spreadsheet/spreadsheet-column.tsx | 151 +++++++++--------- .../spreadsheet/spreadsheet-view.tsx | 10 +- web/store/issues/profile/issue.store.ts | 2 +- 17 files changed, 201 insertions(+), 166 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 45e369f67..2362a117d 100644 --- a/web/components/issues/issue-layouts/kanban/base-kanban-root.tsx +++ b/web/components/issues/issue-layouts/kanban/base-kanban-root.tsx @@ -68,6 +68,7 @@ export interface IBaseKanBanLayout { issueWithIds: any ) => Promise; addIssuesToView?: (issueIds: string[]) => Promise; + canEditPropertiesBasedOnProject?: (projectId: string) => boolean; } type KanbanDragState = { @@ -88,6 +89,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas currentStore, handleDragDrop, addIssuesToView, + canEditPropertiesBasedOnProject, } = props; // router const router = useRouter(); @@ -105,7 +107,6 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas const { setToastAlert } = useToast(); const { currentProjectRole } = userStore; - const isEditingAllowed = !!currentProjectRole && currentProjectRole >= EUserWorkspaceRoles.MEMBER; const issues = issueStore?.getIssues || {}; const issueIds = issueStore?.getIssuesIds || []; @@ -130,6 +131,15 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas const [dragState, setDragState] = useState({}); const [deleteIssueModal, setDeleteIssueModal] = useState(false); + const isEditingAllowed = !!currentProjectRole && currentProjectRole >= EUserWorkspaceRoles.MEMBER; + + const canEditProperties = (projectId: string | undefined) => { + const isEditingAllowedBasedOnProject = + canEditPropertiesBasedOnProject && projectId ? canEditPropertiesBasedOnProject(projectId) : isEditingAllowed; + + return enableInlineEditing && isEditingAllowedBasedOnProject; + }; + const onDragStart = (dragStart: DragStart) => { setDragState({ draggedIssueId: dragStart.draggableId.split("__")[0], @@ -285,7 +295,7 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas quickAddCallback={issueStore?.quickAddIssue} viewId={viewId} disableIssueCreation={!enableIssueCreation || !isEditingAllowed} - isReadOnly={!enableInlineEditing || !isEditingAllowed} + canEditProperties={canEditProperties} currentStore={currentStore} addIssuesToView={addIssuesToView} /> @@ -327,14 +337,10 @@ export const BaseKanBanRoot: React.FC = observer((props: IBas isDragStarted={isDragStarted} disableIssueCreation={true} enableQuickIssueCreate={enableQuickAdd} - isReadOnly={!enableInlineEditing || !isEditingAllowed} currentStore={currentStore} quickAddCallback={issueStore?.quickAddIssue} - addIssuesToView={(issues) => { - console.log("kanban existingIds", issues); - - return Promise.resolve({} as IIssue); - }} + addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} diff --git a/web/components/issues/issue-layouts/kanban/block.tsx b/web/components/issues/issue-layouts/kanban/block.tsx index e86235b36..4644552aa 100644 --- a/web/components/issues/issue-layouts/kanban/block.tsx +++ b/web/components/issues/issue-layouts/kanban/block.tsx @@ -20,7 +20,7 @@ interface IssueBlockProps { handleIssues: (sub_group_by: string | null, group_by: string | null, issue: IIssue, action: EIssueActions) => void; quickActions: (sub_group_by: string | null, group_by: string | null, issue: IIssue) => React.ReactNode; displayProperties: IIssueDisplayProperties | null; - isReadOnly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; } interface IssueDetailsBlockProps { @@ -110,13 +110,15 @@ export const KanbanIssueBlock: React.FC = (props) => { handleIssues, quickActions, displayProperties, - isReadOnly, + canEditProperties, } = props; let draggableId = issue.id; if (columnId) draggableId = `${draggableId}__${columnId}`; if (sub_group_id) draggableId = `${draggableId}__${sub_group_id}`; + const canEditIssueProperties = canEditProperties(issue.project); + return ( <> @@ -143,7 +145,7 @@ export const KanbanIssueBlock: React.FC = (props) => { handleIssues={handleIssues} quickActions={quickActions} displayProperties={displayProperties} - isReadOnly={isReadOnly} + isReadOnly={!canEditIssueProperties} /> diff --git a/web/components/issues/issue-layouts/kanban/blocks-list.tsx b/web/components/issues/issue-layouts/kanban/blocks-list.tsx index 3e6728ca2..d72894fb0 100644 --- a/web/components/issues/issue-layouts/kanban/blocks-list.tsx +++ b/web/components/issues/issue-layouts/kanban/blocks-list.tsx @@ -19,7 +19,7 @@ interface IssueBlocksListProps { customActionButton?: React.ReactElement ) => React.ReactNode; displayProperties: IIssueDisplayProperties | null; - isReadOnly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; } export const KanbanIssueBlocksList: React.FC = (props) => { @@ -33,7 +33,7 @@ export const KanbanIssueBlocksList: React.FC = (props) => handleIssues, quickActions, displayProperties, - isReadOnly, + canEditProperties, } = props; return ( @@ -57,7 +57,7 @@ export const KanbanIssueBlocksList: React.FC = (props) => columnId={columnId} sub_group_id={sub_group_id} isDragDisabled={isDragDisabled} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} /> ); })} diff --git a/web/components/issues/issue-layouts/kanban/default.tsx b/web/components/issues/issue-layouts/kanban/default.tsx index 6e2390d50..8497ff4d9 100644 --- a/web/components/issues/issue-layouts/kanban/default.tsx +++ b/web/components/issues/issue-layouts/kanban/default.tsx @@ -48,7 +48,7 @@ export interface IGroupByKanBan { disableIssueCreation?: boolean; currentStore?: EProjectStore; addIssuesToView?: (issueIds: string[]) => Promise; - isReadOnly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; } const GroupByKanBan: React.FC = observer((props) => { @@ -75,9 +75,9 @@ const GroupByKanBan: React.FC = observer((props) => { quickAddCallback, viewId, disableIssueCreation, - isReadOnly, currentStore, addIssuesToView, + canEditProperties, } = props; const verticalAlignPosition = (_list: any) => @@ -133,7 +133,7 @@ const GroupByKanBan: React.FC = observer((props) => { handleIssues={handleIssues} quickActions={quickActions} displayProperties={displayProperties} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} /> ) : ( isDragDisabled && ( @@ -216,7 +216,7 @@ export interface IKanBan { disableIssueCreation?: boolean; currentStore?: EProjectStore; addIssuesToView?: (issueIds: string[]) => Promise; - isReadOnly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; } export const KanBan: React.FC = observer((props) => { @@ -244,9 +244,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback, viewId, disableIssueCreation, - isReadOnly, currentStore, addIssuesToView, + canEditProperties, } = props; const { issueKanBanView: issueKanBanViewStore } = useMobxStore(); @@ -276,9 +276,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} - isReadOnly={isReadOnly} currentStore={currentStore} addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} @@ -305,9 +305,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} - isReadOnly={isReadOnly} currentStore={currentStore} addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} @@ -334,9 +334,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} - isReadOnly={isReadOnly} currentStore={currentStore} addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} @@ -363,9 +363,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} - isReadOnly={isReadOnly} currentStore={currentStore} addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} @@ -392,9 +392,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} - isReadOnly={isReadOnly} currentStore={currentStore} addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} @@ -421,9 +421,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} - isReadOnly={isReadOnly} currentStore={currentStore} addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} @@ -450,9 +450,9 @@ export const KanBan: React.FC = observer((props) => { quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} - isReadOnly={isReadOnly} currentStore={currentStore} addIssuesToView={addIssuesToView} + canEditProperties={canEditProperties} /> )} diff --git a/web/components/issues/issue-layouts/kanban/swimlanes.tsx b/web/components/issues/issue-layouts/kanban/swimlanes.tsx index fa35f4722..4fdddc973 100644 --- a/web/components/issues/issue-layouts/kanban/swimlanes.tsx +++ b/web/components/issues/issue-layouts/kanban/swimlanes.tsx @@ -95,7 +95,7 @@ interface ISubGroupSwimlane extends ISubGroupSwimlaneHeader { disableIssueCreation?: boolean; currentStore?: EProjectStore; enableQuickIssueCreate: boolean; - isReadOnly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; quickAddCallback?: ( workspaceSlug: string, projectId: string, @@ -127,7 +127,7 @@ const SubGroupSwimlane: React.FC = observer((props) => { isDragStarted, disableIssueCreation, enableQuickIssueCreate, - isReadOnly, + canEditProperties, addIssuesToView, quickAddCallback, } = props; @@ -186,7 +186,7 @@ const SubGroupSwimlane: React.FC = observer((props) => { projects={projects} enableQuickIssueCreate={enableQuickIssueCreate} isDragStarted={isDragStarted} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} addIssuesToView={addIssuesToView} quickAddCallback={quickAddCallback} /> @@ -232,7 +232,7 @@ export interface IKanBanSwimLanes { data: IIssue, viewId?: string ) => Promise; - isReadOnly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; } export const KanBanSwimLanes: React.FC = observer((props) => { @@ -257,7 +257,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted, disableIssueCreation, enableQuickIssueCreate, - isReadOnly, + canEditProperties, currentStore, addIssuesToView, quickAddCallback, @@ -402,7 +402,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} @@ -431,7 +431,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} @@ -460,7 +460,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} @@ -489,7 +489,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} @@ -518,7 +518,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} @@ -547,7 +547,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} @@ -576,7 +576,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} @@ -605,7 +605,7 @@ export const KanBanSwimLanes: React.FC = observer((props) => { isDragStarted={isDragStarted} disableIssueCreation={disableIssueCreation} enableQuickIssueCreate={enableQuickIssueCreate} - isReadOnly={isReadOnly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} /> )} 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 4a0ff32c7..63fc70d0a 100644 --- a/web/components/issues/issue-layouts/list/base-list-root.tsx +++ b/web/components/issues/issue-layouts/list/base-list-root.tsx @@ -58,6 +58,7 @@ interface IBaseListRoot { viewId?: string; currentStore: EProjectStore; addIssuesToView?: (issueIds: string[]) => Promise; + canEditPropertiesBasedOnProject?: (projectId: string) => boolean; } export const BaseListRoot = observer((props: IBaseListRoot) => { @@ -70,6 +71,7 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { viewId, currentStore, addIssuesToView, + canEditPropertiesBasedOnProject, } = props; // router const router = useRouter(); @@ -90,6 +92,12 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { const issues = issueStore?.getIssues; const { enableInlineEditing, enableQuickAdd, enableIssueCreation } = issueStore?.viewFlags || {}; + const canEditProperties = (projectId: string | undefined) => { + const isEditingAllowedBasedOnProject = + canEditPropertiesBasedOnProject && projectId ? canEditPropertiesBasedOnProject(projectId) : isEditingAllowed; + + return enableInlineEditing && isEditingAllowedBasedOnProject; + }; const displayFilters = issueFilterStore?.issueFilters?.displayFilters; const group_by = displayFilters?.group_by || null; @@ -147,7 +155,7 @@ export const BaseListRoot = observer((props: IBaseListRoot) => { viewId={viewId} quickAddCallback={issueStore?.quickAddIssue} enableIssueQuickAdd={!!enableQuickAdd} - isReadonly={!enableInlineEditing || !isEditingAllowed} + canEditProperties={canEditProperties} disableIssueCreation={!enableIssueCreation || !isEditingAllowed} currentStore={currentStore} addIssuesToView={addIssuesToView} diff --git a/web/components/issues/issue-layouts/list/block.tsx b/web/components/issues/issue-layouts/list/block.tsx index 0cad243ad..d7b0a9555 100644 --- a/web/components/issues/issue-layouts/list/block.tsx +++ b/web/components/issues/issue-layouts/list/block.tsx @@ -14,11 +14,11 @@ interface IssueBlockProps { handleIssues: (issue: IIssue, action: EIssueActions) => void; quickActions: (group_by: string | null, issue: IIssue) => React.ReactNode; displayProperties: IIssueDisplayProperties | undefined; - isReadonly?: boolean; + canEditProperties: (projectId: string | undefined) => boolean; } export const IssueBlock: React.FC = (props) => { - const { columnId, issue, handleIssues, quickActions, displayProperties, isReadonly } = props; + const { columnId, issue, handleIssues, quickActions, displayProperties, canEditProperties } = props; // router const router = useRouter(); const updateIssue = (group_by: string | null, issueToUpdate: IIssue) => { @@ -34,6 +34,8 @@ export const IssueBlock: React.FC = (props) => { }); }; + const canEditIssueProperties = canEditProperties(issue.project); + return ( <>
@@ -61,7 +63,7 @@ export const IssueBlock: React.FC = (props) => { diff --git a/web/components/issues/issue-layouts/list/blocks-list.tsx b/web/components/issues/issue-layouts/list/blocks-list.tsx index c0e5e6034..c51d37547 100644 --- a/web/components/issues/issue-layouts/list/blocks-list.tsx +++ b/web/components/issues/issue-layouts/list/blocks-list.tsx @@ -10,14 +10,14 @@ interface Props { columnId: string; issueIds: IGroupedIssues | TUnGroupedIssues | any; issues: IIssueResponse; - isReadonly?: boolean; + canEditProperties: (projectId: string | undefined) => boolean; handleIssues: (issue: IIssue, action: EIssueActions) => void; quickActions: (group_by: string | null, issue: IIssue) => React.ReactNode; displayProperties: IIssueDisplayProperties | undefined; } export const IssueBlocksList: FC = (props) => { - const { columnId, issueIds, issues, handleIssues, quickActions, displayProperties, isReadonly } = props; + const { columnId, issueIds, issues, handleIssues, quickActions, displayProperties, canEditProperties } = props; return (
@@ -31,7 +31,7 @@ export const IssueBlocksList: FC = (props) => { issue={issues[issueId]} handleIssues={handleIssues} quickActions={quickActions} - isReadonly={isReadonly} + canEditProperties={canEditProperties} displayProperties={displayProperties} /> ) diff --git a/web/components/issues/issue-layouts/list/default.tsx b/web/components/issues/issue-layouts/list/default.tsx index dacbea2b2..6cb9185d4 100644 --- a/web/components/issues/issue-layouts/list/default.tsx +++ b/web/components/issues/issue-layouts/list/default.tsx @@ -23,7 +23,7 @@ export interface IGroupByList { displayProperties: IIssueDisplayProperties | undefined; enableIssueQuickAdd: boolean; showEmptyGroup?: boolean; - isReadonly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; quickAddCallback?: ( workspaceSlug: string, projectId: string, @@ -50,7 +50,7 @@ const GroupByList: React.FC = (props) => { displayProperties, enableIssueQuickAdd, showEmptyGroup, - isReadonly, + canEditProperties, quickAddCallback, viewId, disableIssueCreation, @@ -105,7 +105,7 @@ const GroupByList: React.FC = (props) => { handleIssues={handleIssues} quickActions={quickActions} displayProperties={displayProperties} - isReadonly={isReadonly} + canEditProperties={canEditProperties} /> )} @@ -134,7 +134,7 @@ export interface IList { displayProperties: IIssueDisplayProperties | undefined; showEmptyGroup: boolean; enableIssueQuickAdd: boolean; - isReadonly: boolean; + canEditProperties: (projectId: string | undefined) => boolean; states: IState[] | null; labels: IIssueLabel[] | null; members: IUserLite[] | null; @@ -165,7 +165,7 @@ export const List: React.FC = (props) => { displayProperties, showEmptyGroup, enableIssueQuickAdd, - isReadonly, + canEditProperties, disableIssueCreation, states, stateGroups, @@ -193,7 +193,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} enableIssueQuickAdd={enableIssueQuickAdd} showEmptyGroup={showEmptyGroup} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} @@ -215,7 +215,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} showEmptyGroup={showEmptyGroup} enableIssueQuickAdd={enableIssueQuickAdd} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} @@ -237,7 +237,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} showEmptyGroup={showEmptyGroup} enableIssueQuickAdd={enableIssueQuickAdd} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} @@ -259,7 +259,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} showEmptyGroup={showEmptyGroup} enableIssueQuickAdd={enableIssueQuickAdd} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} @@ -281,7 +281,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} showEmptyGroup={showEmptyGroup} enableIssueQuickAdd={enableIssueQuickAdd} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} @@ -303,7 +303,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} showEmptyGroup={showEmptyGroup} enableIssueQuickAdd={enableIssueQuickAdd} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} @@ -325,7 +325,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} showEmptyGroup={showEmptyGroup} enableIssueQuickAdd={enableIssueQuickAdd} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} @@ -347,7 +347,7 @@ export const List: React.FC = (props) => { displayProperties={displayProperties} showEmptyGroup={showEmptyGroup} enableIssueQuickAdd={enableIssueQuickAdd} - isReadonly={isReadonly} + canEditProperties={canEditProperties} quickAddCallback={quickAddCallback} viewId={viewId} disableIssueCreation={disableIssueCreation} diff --git a/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx b/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx index a45c8d867..940f0f707 100644 --- a/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx +++ b/web/components/issues/issue-layouts/roots/all-issue-layout-root.tsx @@ -55,7 +55,11 @@ export const AllIssueLayoutRoot: React.FC = observer((props) => { } ); - const isEditingAllowed = false; + const canEditProperties = (projectId: string | undefined) => { + const isEditingAllowedBasedOnProject = false; + + return isEditingAllowedBasedOnProject; + }; const issuesResponse = getIssues; const issueIds = (getIssuesIds ?? []) as TUnGroupedIssues; @@ -123,7 +127,7 @@ export const AllIssueLayoutRoot: React.FC = observer((props) => { members={workspaceMembers?.map((m) => m.member)} labels={workspaceLabels || undefined} handleIssues={handleIssues} - disableUserActions={isEditingAllowed} + canEditProperties={canEditProperties} viewId={currentIssueView} />
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 a995f0716..090522cb0 100644 --- a/web/components/issues/issue-layouts/spreadsheet/base-spreadsheet-root.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/base-spreadsheet-root.tsx @@ -34,10 +34,11 @@ interface IBaseSpreadsheetRoot { [EIssueActions.UPDATE]?: (issue: IIssue) => void; [EIssueActions.REMOVE]?: (issue: IIssue) => void; }; + canEditPropertiesBasedOnProject?: (projectId: string) => boolean; } export const BaseSpreadsheetRoot = observer((props: IBaseSpreadsheetRoot) => { - const { issueFiltersStore, issueStore, viewId, QuickActions, issueActions } = props; + const { issueFiltersStore, issueStore, viewId, QuickActions, issueActions, canEditPropertiesBasedOnProject } = props; const router = useRouter(); const { workspaceSlug, projectId } = router.query as { workspaceSlug: string; projectId: string }; @@ -49,9 +50,18 @@ export const BaseSpreadsheetRoot = observer((props: IBaseSpreadsheetRoot) => { user: userStore, } = useMobxStore(); + const { enableInlineEditing, enableQuickAdd } = issueStore?.viewFlags || {}; + const { currentProjectRole } = userStore; const isEditingAllowed = !!currentProjectRole && currentProjectRole >= EUserWorkspaceRoles.MEMBER; + const canEditProperties = (projectId: string | undefined) => { + const isEditingAllowedBasedOnProject = + canEditPropertiesBasedOnProject && projectId ? canEditPropertiesBasedOnProject(projectId) : isEditingAllowed; + + return enableInlineEditing && isEditingAllowedBasedOnProject; + }; + const issuesResponse = issueStore.getIssues; const issueIds = (issueStore.getIssuesIds ?? []) as TUnGroupedIssues; @@ -106,10 +116,10 @@ export const BaseSpreadsheetRoot = observer((props: IBaseSpreadsheetRoot) => { labels={projectLabels || undefined} states={projectId ? projectStateStore.states?.[projectId.toString()] : undefined} handleIssues={handleIssues} - disableUserActions={!isEditingAllowed} + canEditProperties={canEditProperties} quickAddCallback={issueStore.quickAddIssue} viewId={viewId} - enableQuickCreateIssue + enableQuickCreateIssue={enableQuickAdd} /> ); }); diff --git a/web/components/issues/issue-layouts/spreadsheet/columns/columns-list.tsx b/web/components/issues/issue-layouts/spreadsheet/columns/columns-list.tsx index 540dbc5ce..c71343cfc 100644 --- a/web/components/issues/issue-layouts/spreadsheet/columns/columns-list.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/columns/columns-list.tsx @@ -8,7 +8,7 @@ import { IIssue, IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueLabe type Props = { displayFilters: IIssueDisplayFilterOptions; displayProperties: IIssueDisplayProperties; - disableUserActions: boolean; + canEditProperties: (projectId: string | undefined) => boolean; expandedIssues: string[]; handleDisplayFilterUpdate: (data: Partial) => void; handleUpdateIssue: (issue: IIssue, data: Partial) => void; @@ -20,7 +20,7 @@ type Props = { export const SpreadsheetColumnsList: React.FC = observer((props) => { const { - disableUserActions, + canEditProperties, displayFilters, displayProperties, expandedIssues, @@ -43,7 +43,7 @@ export const SpreadsheetColumnsList: React.FC = observer((props) => { {displayProperties.state && ( = observer((props) => { {displayProperties.priority && ( = observer((props) => { {displayProperties.assignee && ( = observer((props) => { {displayProperties.labels && ( = observer((props) => { {displayProperties.start_date && ( = observer((props) => { {displayProperties.due_date && ( = observer((props) => { {displayProperties.estimate && isEstimateEnabled && ( = observer((props) => { {displayProperties.created_on && ( = observer((props) => { {displayProperties.updated_on && ( = observer((props) => { {displayProperties.link && ( = observer((props) => { {displayProperties.attachment_count && ( = observer((props) => { {displayProperties.sub_issue_count && ( void; properties: IIssueDisplayProperties; quickActions: (issue: IIssue, customActionButton?: React.ReactElement) => React.ReactNode; - disableUserActions: boolean; + canEditProperties: (projectId: string | undefined) => boolean; nestingLevel: number; }; @@ -24,7 +24,7 @@ export const IssueColumn: React.FC = ({ handleToggleExpand, properties, quickActions, - disableUserActions, + canEditProperties, nestingLevel, }) => { // router @@ -76,7 +76,7 @@ export const IssueColumn: React.FC = ({ {issue.project_detail?.identifier}-{issue.sequence_id} - {!disableUserActions && ( + {canEditProperties(issue.project) && ( diff --git a/web/components/issues/issue-layouts/spreadsheet/columns/issue/spreadsheet-issue-column.tsx b/web/components/issues/issue-layouts/spreadsheet/columns/issue/spreadsheet-issue-column.tsx index d368b4f1c..738880d65 100644 --- a/web/components/issues/issue-layouts/spreadsheet/columns/issue/spreadsheet-issue-column.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/columns/issue/spreadsheet-issue-column.tsx @@ -12,8 +12,8 @@ type Props = { expandedIssues: string[]; setExpandedIssues: React.Dispatch>; properties: IIssueDisplayProperties; - quickActions: (issue: IIssue,customActionButton?: React.ReactElement) => React.ReactNode; - disableUserActions: boolean; + quickActions: (issue: IIssue, customActionButton?: React.ReactElement) => React.ReactNode; + canEditProperties: (projectId: string | undefined) => boolean; nestingLevel?: number; }; @@ -23,7 +23,7 @@ export const SpreadsheetIssuesColumn: React.FC = ({ setExpandedIssues, properties, quickActions, - disableUserActions, + canEditProperties, nestingLevel = 0, }) => { const handleToggleExpand = (issueId: string) => { @@ -49,7 +49,7 @@ export const SpreadsheetIssuesColumn: React.FC = ({ expanded={isExpanded} handleToggleExpand={handleToggleExpand} properties={properties} - disableUserActions={disableUserActions} + canEditProperties={canEditProperties} nestingLevel={nestingLevel} quickActions={quickActions} /> @@ -66,7 +66,7 @@ export const SpreadsheetIssuesColumn: React.FC = ({ setExpandedIssues={setExpandedIssues} properties={properties} quickActions={quickActions} - disableUserActions={disableUserActions} + canEditProperties={canEditProperties} nestingLevel={nestingLevel + 1} /> ))} diff --git a/web/components/issues/issue-layouts/spreadsheet/spreadsheet-column.tsx b/web/components/issues/issue-layouts/spreadsheet/spreadsheet-column.tsx index ca093eb73..c59b65d9c 100644 --- a/web/components/issues/issue-layouts/spreadsheet/spreadsheet-column.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/spreadsheet-column.tsx @@ -32,7 +32,7 @@ import { IIssue, IIssueDisplayFilterOptions, IIssueLabel, IState, IUserLite, TIs import { SPREADSHEET_PROPERTY_DETAILS } from "constants/spreadsheet"; type Props = { - disableUserActions: boolean; + canEditProperties: (projectId: string | undefined) => boolean; displayFilters: IIssueDisplayFilterOptions; expandedIssues: string[]; handleDisplayFilterUpdate: (data: Partial) => void; @@ -46,7 +46,7 @@ type Props = { export const SpreadsheetColumn: React.FC = (props) => { const { - disableUserActions, + canEditProperties, displayFilters, expandedIssues, handleDisplayFilterUpdate, @@ -160,78 +160,81 @@ export const SpreadsheetColumn: React.FC = (props) => {
- {issues?.map((issue) => ( -
- {property === "state" ? ( - ) => handleUpdateIssue(issue, data)} - states={states} - /> - ) : property === "priority" ? ( - ) => handleUpdateIssue(issue, data)} - /> - ) : property === "estimate" ? ( - ) => handleUpdateIssue(issue, data)} - /> - ) : property === "assignee" ? ( - ) => handleUpdateIssue(issue, data)} - /> - ) : property === "labels" ? ( - ) => handleUpdateIssue(issue, data)} - /> - ) : property === "start_date" ? ( - ) => handleUpdateIssue(issue, data)} - /> - ) : property === "due_date" ? ( - ) => handleUpdateIssue(issue, data)} - /> - ) : property === "created_on" ? ( - - ) : property === "updated_on" ? ( - - ) : property === "link" ? ( - - ) : property === "attachment_count" ? ( - - ) : property === "sub_issue_count" ? ( - - ) : null} -
- ))} + {issues?.map((issue) => { + const disableUserActions = !canEditProperties(issue.project); + return ( +
+ {property === "state" ? ( + ) => handleUpdateIssue(issue, data)} + states={states} + /> + ) : property === "priority" ? ( + ) => handleUpdateIssue(issue, data)} + /> + ) : property === "estimate" ? ( + ) => handleUpdateIssue(issue, data)} + /> + ) : property === "assignee" ? ( + ) => handleUpdateIssue(issue, data)} + /> + ) : property === "labels" ? ( + ) => handleUpdateIssue(issue, data)} + /> + ) : property === "start_date" ? ( + ) => handleUpdateIssue(issue, data)} + /> + ) : property === "due_date" ? ( + ) => handleUpdateIssue(issue, data)} + /> + ) : property === "created_on" ? ( + + ) : property === "updated_on" ? ( + + ) : property === "link" ? ( + + ) : property === "attachment_count" ? ( + + ) : property === "sub_issue_count" ? ( + + ) : null} +
+ ); + })}
); diff --git a/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx b/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx index 5a29ed91b..ec7d855b1 100644 --- a/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx +++ b/web/components/issues/issue-layouts/spreadsheet/spreadsheet-view.tsx @@ -21,7 +21,7 @@ type Props = { members?: IUserLite[] | undefined; labels?: IIssueLabel[] | undefined; states?: IState[] | undefined; - quickActions: (issue: IIssue,customActionButton?: React.ReactElement) => React.ReactNode; + quickActions: (issue: IIssue, customActionButton?: React.ReactElement) => React.ReactNode; handleIssues: (issue: IIssue, action: EIssueActions) => void; openIssuesListModal?: (() => void) | null; quickAddCallback?: ( @@ -31,7 +31,7 @@ type Props = { viewId?: string ) => Promise; viewId?: string; - disableUserActions: boolean; + canEditProperties: (projectId: string | undefined) => boolean; enableQuickCreateIssue?: boolean; }; @@ -48,7 +48,7 @@ export const SpreadsheetView: React.FC = observer((props) => { handleIssues, quickAddCallback, viewId, - disableUserActions, + canEditProperties, enableQuickCreateIssue, } = props; // states @@ -114,7 +114,7 @@ export const SpreadsheetView: React.FC = observer((props) => { setExpandedIssues={setExpandedIssues} properties={displayProperties} quickActions={quickActions} - disableUserActions={disableUserActions} + canEditProperties={canEditProperties} /> ) : null )} @@ -124,7 +124,7 @@ export const SpreadsheetView: React.FC = observer((props) => { handleIssues({ ...issue, ...data }, EIssueActions.UPDATE)} diff --git a/web/store/issues/profile/issue.store.ts b/web/store/issues/profile/issue.store.ts index 1ef0b34c8..9283357b6 100644 --- a/web/store/issues/profile/issue.store.ts +++ b/web/store/issues/profile/issue.store.ts @@ -136,7 +136,7 @@ export class ProfileIssuesStore extends IssueBaseStore implements IProfileIssues return { enableQuickAdd: false, enableIssueCreation: false, - enableInlineEditing: false, + enableInlineEditing: true, }; }