Skip to content

Commit f70384b

Browse files
[WEB-5603] feat: enhance workspace settings layout and members page (#8266)
* feat: enhance workspace settings layout and members page with new components * refactor: update workspace settings layout and members page to use default exports * refactor: settings layout import changes * refactor: simplify workspaceSlug usage in settings layout
1 parent 7caa1bb commit f70384b

File tree

6 files changed

+49
-17
lines changed

6 files changed

+49
-17
lines changed

β€Žapps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/layout.tsxβ€Ž

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
11
import { observer } from "mobx-react";
22
import { usePathname } from "next/navigation";
33
import { Outlet } from "react-router";
4-
// constants
5-
import { WORKSPACE_SETTINGS_ACCESS } from "@plane/constants";
6-
import type { EUserWorkspaceRoles } from "@plane/types";
74
// components
85
import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view";
96
import { getWorkspaceActivePath, pathnameToAccessKey } from "@/components/settings/helper";
107
import { SettingsMobileNav } from "@/components/settings/mobile";
8+
// plane imports
9+
import { WORKSPACE_SETTINGS_ACCESS } from "@plane/constants";
10+
import type { EUserWorkspaceRoles } from "@plane/types";
11+
// plane web components
12+
import { WorkspaceSettingsRightSidebar } from "@/plane-web/components/workspace/right-sidebar";
1113
// hooks
1214
import { useUserPermissions } from "@/hooks/store/user";
1315
// local components
1416
import { WorkspaceSettingsSidebar } from "./sidebar";
1517

16-
function WorkspaceSettingLayout() {
18+
import type { Route } from "./+types/layout";
19+
20+
const WorkspaceSettingLayout = observer(function WorkspaceSettingLayout({ params }: Route.ComponentProps) {
21+
// router
22+
const { workspaceSlug } = params;
1723
// store hooks
1824
const { workspaceUserInfo, getWorkspaceRoleByWorkspaceSlug } = useUserPermissions();
1925
// next hooks
2026
const pathname = usePathname();
2127
// derived values
22-
const { workspaceSlug, accessKey } = pathnameToAccessKey(pathname);
23-
const userWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString());
28+
const { accessKey } = pathnameToAccessKey(pathname);
29+
const userWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug);
2430

2531
let isAuthorized: boolean | string = false;
2632
if (pathname && workspaceSlug && userWorkspaceRole) {
@@ -42,11 +48,12 @@ function WorkspaceSettingLayout() {
4248
<div className="w-full h-full overflow-y-scroll md:pt-page-y">
4349
<Outlet />
4450
</div>
51+
<WorkspaceSettingsRightSidebar workspaceSlug={workspaceSlug} />
4552
</div>
4653
)}
4754
</div>
4855
</>
4956
);
50-
}
57+
});
5158

52-
export default observer(WorkspaceSettingLayout);
59+
export default WorkspaceSettingLayout;

β€Žapps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/members/page.tsxβ€Ž

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ import { useWorkspace } from "@/hooks/store/use-workspace";
2828
import { useUserPermissions } from "@/hooks/store/user";
2929
// plane web components
3030
import { BillingActionsButton } from "@/plane-web/components/workspace/billing/billing-actions-button";
31-
import { SendWorkspaceInvitationModal } from "@/plane-web/components/workspace/members/invite-modal";
31+
import { SendWorkspaceInvitationModal, MembersActivityButton } from "@/plane-web/components/workspace/members";
3232
import type { Route } from "./+types/page";
3333

34-
function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) {
34+
const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) {
3535
// states
3636
const [inviteModal, setInviteModal] = useState(false);
3737
const [searchQuery, setSearchQuery] = useState<string>("");
@@ -70,23 +70,27 @@ function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) {
7070
title: "Success!",
7171
message: t("workspace_settings.settings.members.invitations_sent_successfully"),
7272
});
73-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
74-
} catch (err: any) {
73+
} catch (error: unknown) {
74+
let message = undefined;
75+
if (error instanceof Error) {
76+
const err = error as Error & { error?: string };
77+
message = err.error;
78+
}
7579
captureError({
7680
eventName: MEMBER_TRACKER_EVENTS.invite,
7781
payload: {
7882
emails: data.emails.map((email) => email.email),
7983
},
80-
error: err,
84+
error: error as Error,
8185
});
8286

8387
setToast({
8488
type: TOAST_TYPE.ERROR,
8589
title: "Error!",
86-
message: `${err.error ?? t("something_went_wrong_please_try_again")}`,
90+
message: `${message ?? t("something_went_wrong_please_try_again")}`,
8791
});
8892

89-
throw err;
93+
throw error;
9094
}
9195
};
9296

@@ -137,6 +141,7 @@ function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) {
137141
className="w-full max-w-[234px] border-none bg-transparent text-sm outline-none placeholder:text-custom-text-400"
138142
placeholder={`${t("search")}...`}
139143
value={searchQuery}
144+
// eslint-disable-next-line jsx-a11y/no-autofocus
140145
autoFocus
141146
onChange={(e) => setSearchQuery(e.target.value)}
142147
/>
@@ -146,6 +151,7 @@ function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) {
146151
handleUpdate={handleRoleFilterUpdate}
147152
memberType="workspace"
148153
/>
154+
<MembersActivityButton workspaceSlug={workspaceSlug} />
149155
{canPerformWorkspaceAdminActions && (
150156
<Button
151157
variant="primary"
@@ -163,6 +169,6 @@ function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) {
163169
</section>
164170
</SettingsContentWrapper>
165171
);
166-
}
172+
});
167173

168-
export default observer(WorkspaceMembersSettingsPage);
174+
export default WorkspaceMembersSettingsPage;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from "./invite-modal";
2+
export * from "./members-activity-button";
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { observer } from "mobx-react";
2+
3+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
4+
export const MembersActivityButton = observer(function MembersActivityButton(props: { workspaceSlug: string }) {
5+
return <></>;
6+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./root";
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { observer } from "mobx-react";
2+
3+
type TWorkspaceSettingsRightSidebarProps = { workspaceSlug: string };
4+
5+
export const WorkspaceSettingsRightSidebar = observer(function WorkspaceSettingsRightSidebar(
6+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
7+
props: TWorkspaceSettingsRightSidebarProps
8+
) {
9+
return <></>;
10+
});

0 commit comments

Comments
Β (0)