diff --git a/web/components/cycles/modal.tsx b/web/components/cycles/modal.tsx index 3ef7e285d..665f9865b 100644 --- a/web/components/cycles/modal.tsx +++ b/web/components/cycles/modal.tsx @@ -49,11 +49,11 @@ export const CycleCreateUpdateModal: React.FC = (props) => { state: "SUCCESS", }); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Error in creating cycle. Please try again.", + message: err.detail ?? "Error in creating cycle. Please try again.", }); postHogEventTracker("CYCLE_CREATE", { state: "FAILED", @@ -73,11 +73,11 @@ export const CycleCreateUpdateModal: React.FC = (props) => { message: "Cycle updated successfully.", }); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Error in updating cycle. Please try again.", + message: err.detail ?? "Error in updating cycle. Please try again.", }); }); }; diff --git a/web/components/headers/cycle-issues.tsx b/web/components/headers/cycle-issues.tsx index 217cda367..e5b1167b2 100644 --- a/web/components/headers/cycle-issues.tsx +++ b/web/components/headers/cycle-issues.tsx @@ -21,6 +21,7 @@ import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOption import { ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "constants/issue"; import { EFilterType } from "store/issues/types"; import { EProjectStore } from "store/command-palette.store"; +import { EUserWorkspaceRoles } from "constants/workspace"; export const CycleIssuesHeader: React.FC = observer(() => { const [analyticsModal, setAnalyticsModal] = useState(false); @@ -42,6 +43,7 @@ export const CycleIssuesHeader: React.FC = observer(() => { commandPalette: commandPaletteStore, trackEvent: { setTrackElement }, cycleIssuesFilter: { issueFilters, updateFilters }, + user: { currentProjectRole }, } = useMobxStore(); const activeLayout = projectIssueFiltersStore.issueFilters?.displayFilters?.layout; @@ -99,6 +101,9 @@ export const CycleIssuesHeader: React.FC = observer(() => { const cyclesList = cycleStore.projectCycles; const cycleDetails = cycleId ? cycleStore.getCycleById(cycleId.toString()) : undefined; + const canUserCreateIssue = + currentProjectRole && [EUserWorkspaceRoles.ADMIN, EUserWorkspaceRoles.MEMBER].includes(currentProjectRole); + return ( <> { - + {canUserCreateIssue && ( + + )} - + {canUserCreateCycle && ( +
+ +
+ )} ); }); diff --git a/web/components/headers/module-issues.tsx b/web/components/headers/module-issues.tsx index a90d77946..f52b7264d 100644 --- a/web/components/headers/module-issues.tsx +++ b/web/components/headers/module-issues.tsx @@ -21,6 +21,7 @@ import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOption import { ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "constants/issue"; import { EFilterType } from "store/issues/types"; import { EProjectStore } from "store/command-palette.store"; +import { EUserWorkspaceRoles } from "constants/workspace"; export const ModuleIssuesHeader: React.FC = observer(() => { const [analyticsModal, setAnalyticsModal] = useState(false); @@ -41,6 +42,7 @@ export const ModuleIssuesHeader: React.FC = observer(() => { trackEvent: { setTrackElement }, projectLabel: { projectLabels }, moduleIssuesFilter: { issueFilters, updateFilters }, + user: { currentProjectRole }, } = useMobxStore(); const { currentProjectDetails } = projectStore; @@ -100,6 +102,9 @@ export const ModuleIssuesHeader: React.FC = observer(() => { const modulesList = projectId ? moduleStore.modules[projectId.toString()] : undefined; const moduleDetails = moduleId ? moduleStore.getModuleById(moduleId.toString()) : undefined; + const canUserCreateIssue = + currentProjectRole && [EUserWorkspaceRoles.ADMIN, EUserWorkspaceRoles.MEMBER].includes(currentProjectRole); + return ( <> { - + {canUserCreateIssue && ( + + )} + {canUserCreateModule && ( + + )} ); diff --git a/web/components/headers/project-issues.tsx b/web/components/headers/project-issues.tsx index 6c743b027..48c966e75 100644 --- a/web/components/headers/project-issues.tsx +++ b/web/components/headers/project-issues.tsx @@ -18,6 +18,7 @@ import { ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "constants/issue"; import { renderEmoji } from "helpers/emoji.helper"; import { EFilterType } from "store/issues/types"; import { EProjectStore } from "store/command-palette.store"; +import { EUserWorkspaceRoles } from "constants/workspace"; export const ProjectIssuesHeader: React.FC = observer(() => { const [analyticsModal, setAnalyticsModal] = useState(false); @@ -36,6 +37,7 @@ export const ProjectIssuesHeader: React.FC = observer(() => { // issue filters projectIssuesFilter: { issueFilters, updateFilters }, projectIssues: {}, + user: { currentProjectRole }, } = useMobxStore(); const activeLayout = issueFilters?.displayFilters?.layout; @@ -87,6 +89,9 @@ export const ProjectIssuesHeader: React.FC = observer(() => { const deployUrl = process.env.NEXT_PUBLIC_DEPLOY_URL; + const canUserCreateIssue = + currentProjectRole && [EUserWorkspaceRoles.ADMIN, EUserWorkspaceRoles.MEMBER].includes(currentProjectRole); + return ( <> { - + {canUserCreateIssue && ( + + )} diff --git a/web/components/headers/project-view-issues.tsx b/web/components/headers/project-view-issues.tsx index 4bbde81eb..de00424dc 100644 --- a/web/components/headers/project-view-issues.tsx +++ b/web/components/headers/project-view-issues.tsx @@ -1,6 +1,7 @@ import { useCallback } from "react"; import { useRouter } from "next/router"; import { observer } from "mobx-react-lite"; +import { Plus } from "lucide-react"; // mobx store import { useMobxStore } from "lib/mobx/store-provider"; // components @@ -16,7 +17,7 @@ import { IIssueDisplayFilterOptions, IIssueDisplayProperties, IIssueFilterOption import { ISSUE_DISPLAY_FILTERS_BY_LAYOUT } from "constants/issue"; import { EFilterType } from "store/issues/types"; import { EProjectStore } from "store/command-palette.store"; -import { Plus } from "lucide-react"; +import { EUserWorkspaceRoles } from "constants/workspace"; export const ProjectViewIssuesHeader: React.FC = observer(() => { const router = useRouter(); @@ -35,6 +36,7 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => { viewIssuesFilter: { issueFilters, updateFilters }, commandPalette: commandPaletteStore, trackEvent: { setTrackElement }, + user: { currentProjectRole }, } = useMobxStore(); const activeLayout = issueFilters?.displayFilters?.layout; @@ -85,6 +87,9 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => { const viewsList = projectId ? projectViewsStore.viewsList[projectId.toString()] : undefined; const viewDetails = viewId ? projectViewsStore.viewDetails[viewId.toString()] : undefined; + const canUserCreateIssue = + currentProjectRole && [EUserWorkspaceRoles.ADMIN, EUserWorkspaceRoles.MEMBER].includes(currentProjectRole); + return (
@@ -170,16 +175,18 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => { handleDisplayPropertiesUpdate={handleDisplayProperties} /> - + { + + }
); diff --git a/web/components/issues/modal.tsx b/web/components/issues/modal.tsx index 9542bbefe..b94cfd48f 100644 --- a/web/components/issues/modal.tsx +++ b/web/components/issues/modal.tsx @@ -266,11 +266,11 @@ export const CreateUpdateIssueModal: React.FC = observer((prop if (payload.parent && payload.parent !== "") mutate(SUB_ISSUES(payload.parent)); } }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Issue could not be created. Please try again.", + message: err.detail ?? "Issue could not be created. Please try again.", }); postHogEventTracker( "ISSUE_CREATED", @@ -312,11 +312,11 @@ export const CreateUpdateIssueModal: React.FC = observer((prop if (payload.parent && payload.parent !== "") mutate(SUB_ISSUES(payload.parent)); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Issue could not be created. Please try again.", + message: err.detail ?? "Issue could not be created. Please try again.", }); }); }; @@ -347,11 +347,11 @@ export const CreateUpdateIssueModal: React.FC = observer((prop } ); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Issue could not be updated. Please try again.", + message: err.detail ?? "Issue could not be updated. Please try again.", }); postHogEventTracker( "ISSUE_UPDATED", diff --git a/web/components/modules/modal.tsx b/web/components/modules/modal.tsx index 80e22989e..da4103833 100644 --- a/web/components/modules/modal.tsx +++ b/web/components/modules/modal.tsx @@ -69,11 +69,11 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { state: "SUCCESS", }); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Module could not be created. Please try again.", + message: err.detail ?? "Module could not be created. Please try again.", }); postHogEventTracker("MODULE_CREATED", { state: "FAILED", @@ -99,11 +99,11 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { state: "SUCCESS", }); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Module could not be updated. Please try again.", + message: err.detail ?? "Module could not be updated. Please try again.", }); postHogEventTracker("MODULE_UPDATED", { state: "FAILED", diff --git a/web/components/pages/create-update-page-modal.tsx b/web/components/pages/create-update-page-modal.tsx index 2f64fe853..e754bd771 100644 --- a/web/components/pages/create-update-page-modal.tsx +++ b/web/components/pages/create-update-page-modal.tsx @@ -60,11 +60,11 @@ export const CreateUpdatePageModal: FC = (props) => { } ); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Page could not be created. Please try again.", + message: err.detail ?? "Page could not be created. Please try again.", }); postHogEventTracker( "PAGE_CREATED", @@ -104,11 +104,11 @@ export const CreateUpdatePageModal: FC = (props) => { } ); }) - .catch(() => { + .catch((err) => { setToastAlert({ type: "error", title: "Error!", - message: "Page could not be updated. Please try again.", + message: err.detail ?? "Page could not be updated. Please try again.", }); postHogEventTracker( "PAGE_UPDATED",