Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
50aa9a6
style: improved profile settings
aaryan610 Jan 9, 2026
c6f1239
chore: minor improvements
aaryan610 Jan 9, 2026
6c39cf1
Merge branch 'preview' of https://github.com/makeplane/plane into sty…
aaryan610 Jan 9, 2026
3f48427
style: improved workspace settings
aaryan610 Jan 9, 2026
c141a4d
style: workspace settings content
aaryan610 Jan 9, 2026
ddc9e39
style: improved project settings
aaryan610 Jan 12, 2026
15878d5
fix: project settings flat map
aaryan610 Jan 12, 2026
1fb0bc1
chore: add back navigation from settings pages
aaryan610 Jan 12, 2026
e4a63a2
style: settings content
aaryan610 Jan 13, 2026
47a1951
style: estimates list
aaryan610 Jan 13, 2026
48519cc
refactor: remove old code
aaryan610 Jan 13, 2026
0460b3c
refactor: removed unnecessary line breaks
aaryan610 Jan 15, 2026
cfc9bfe
Merge branch 'preview' of https://github.com/makeplane/plane into sty…
aaryan610 Jan 15, 2026
7ead275
refactor: create a common component for page header
aaryan610 Jan 19, 2026
3d7d1c1
chore: add fade-in animation to sidebar
aaryan610 Jan 19, 2026
b9a2b22
fix: formatting
aaryan610 Jan 19, 2026
0e45ba2
fix: project settings sidebar header
aaryan610 Jan 19, 2026
0dc40bf
fix: workspace settings sidebar header
aaryan610 Jan 19, 2026
977972c
fix: settings content wrapper scroll
aaryan610 Jan 20, 2026
4997915
chore: separate project settings features
aaryan610 Jan 20, 2026
a743581
fix: formatting
aaryan610 Jan 20, 2026
b2554d1
refactor: custom theme selector
aaryan610 Jan 21, 2026
3f36e7b
refactor: settings headings
aaryan610 Jan 21, 2026
2c9ae1e
refactor: settings headings
aaryan610 Jan 21, 2026
7f87c44
fix: project settings sidebar padding
aaryan610 Jan 21, 2026
ec7b2cf
fix: sidebar header padding
aaryan610 Jan 21, 2026
3fff2d6
fix: sidebar item permissions
aaryan610 Jan 21, 2026
9222aa4
fix: missing editable check
aaryan610 Jan 21, 2026
fe3a142
refactor: remove unused files
aaryan610 Jan 21, 2026
a8e11aa
chore: remove unnecessary code
aaryan610 Jan 21, 2026
ed77d0e
chore: add missing translations
aaryan610 Jan 21, 2026
ab17a13
fix: formatting
aaryan610 Jan 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions apps/web/app/(all)/[workspaceSlug]/(settings)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,15 @@ import { Outlet } from "react-router";
// components
import { ContentWrapper } from "@/components/core/content-wrapper";
import { ProjectsAppPowerKProvider } from "@/components/power-k/projects-app-provider";
import { SettingsHeader } from "@/components/settings/header";

export default function SettingsLayout() {
return (
<>
<ProjectsAppPowerKProvider />
<div className="relative flex size-full overflow-hidden rounded-lg border border-subtle">
<main className="relative flex size-full flex-col overflow-hidden">
{/* Header */}
<SettingsHeader />
{/* Content */}
<ContentWrapper className="p-page-x md:flex w-full bg-surface-1">
<ContentWrapper className="md:flex w-full bg-surface-1">
<div className="size-full overflow-hidden">
<Outlet />
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { observer } from "mobx-react";
// plane imports
import { WORKSPACE_SETTINGS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Breadcrumbs } from "@plane/ui";
// components
import { BreadcrumbLink } from "@/components/common/breadcrumb-link";
import { SettingsPageHeader } from "@/components/settings/page-header";
import { WORKSPACE_SETTINGS_ICONS } from "@/components/settings/workspace/sidebar/item-icon";

export const BillingWorkspaceSettingsHeader = observer(function BillingWorkspaceSettingsHeader() {
// translation
const { t } = useTranslation();
// derived values
const settingsDetails = WORKSPACE_SETTINGS["billing-and-plans"];
const Icon = WORKSPACE_SETTINGS_ICONS["billing-and-plans"];

return (
<SettingsPageHeader
leftItem={
<div className="flex items-center gap-2">
<Breadcrumbs>
<Breadcrumbs.Item
component={
<BreadcrumbLink
label={t(settingsDetails.i18n_label)}
icon={<Icon className="size-4 text-tertiary" />}
/>
}
/>
</Breadcrumbs>
</div>
}
/>
);
});
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import { observer } from "mobx-react";
import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view";
import { PageHead } from "@/components/core/page-title";
// hooks
import { SettingsContentWrapper } from "@/components/settings/content-wrapper";
// hooks
import { useWorkspace } from "@/hooks/store/use-workspace";
import { useUserPermissions } from "@/hooks/store/user";
// plane web components
import { BillingRoot } from "@/plane-web/components/workspace/billing";
// local imports
import { BillingWorkspaceSettingsHeader } from "./header";

function BillingSettingsPage() {
// store hooks
Expand All @@ -23,7 +25,7 @@ function BillingSettingsPage() {
}

return (
<SettingsContentWrapper size="lg">
<SettingsContentWrapper header={<BillingWorkspaceSettingsHeader />} hugging>
<PageHead title={pageTitle} />
<BillingRoot />
</SettingsContentWrapper>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { observer } from "mobx-react";
// plane imports
import { WORKSPACE_SETTINGS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Breadcrumbs } from "@plane/ui";
// components
import { BreadcrumbLink } from "@/components/common/breadcrumb-link";
import { SettingsPageHeader } from "@/components/settings/page-header";
import { WORKSPACE_SETTINGS_ICONS } from "@/components/settings/workspace/sidebar/item-icon";

export const ExportsWorkspaceSettingsHeader = observer(function ExportsWorkspaceSettingsHeader() {
// translation
const { t } = useTranslation();
// derived values
const settingsDetails = WORKSPACE_SETTINGS.export;
const Icon = WORKSPACE_SETTINGS_ICONS.export;

return (
<SettingsPageHeader
leftItem={
<div className="flex items-center gap-2">
<Breadcrumbs>
<Breadcrumbs.Item
component={
<BreadcrumbLink
label={t(settingsDetails.i18n_label)}
icon={<Icon className="size-4 text-tertiary" />}
/>
}
/>
</Breadcrumbs>
</div>
}
/>
);
});
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { observer } from "mobx-react";
// components
import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { cn } from "@plane/utils";
// components
import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view";
import { PageHead } from "@/components/core/page-title";
import ExportGuide from "@/components/exporter/guide";
// helpers
// hooks
import { ExportGuide } from "@/components/exporter/guide";
import { SettingsContentWrapper } from "@/components/settings/content-wrapper";
import SettingsHeading from "@/components/settings/heading";
import { SettingsHeading } from "@/components/settings/heading";
// hooks
import { useWorkspace } from "@/hooks/store/use-workspace";
import { useUserPermissions } from "@/hooks/store/user";
// local imports
import { ExportsWorkspaceSettingsHeader } from "./header";

function ExportsPage() {
// store hooks
Expand All @@ -34,10 +35,10 @@ function ExportsPage() {
}

return (
<SettingsContentWrapper size="lg">
<SettingsContentWrapper header={<ExportsWorkspaceSettingsHeader />} hugging>
<PageHead title={pageTitle} />
<div
className={cn("w-full", {
className={cn("w-full flex flex-col gap-y-6", {
"opacity-60": !canPerformWorkspaceMemberActions,
})}
>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { observer } from "mobx-react";
// plane imports
import { WORKSPACE_SETTINGS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Breadcrumbs } from "@plane/ui";
// components
import { BreadcrumbLink } from "@/components/common/breadcrumb-link";
import { SettingsPageHeader } from "@/components/settings/page-header";
import { WORKSPACE_SETTINGS_ICONS } from "@/components/settings/workspace/sidebar/item-icon";

export const GeneralWorkspaceSettingsHeader = observer(function GeneralWorkspaceSettingsHeader() {
// translation
const { t } = useTranslation();
// derived values
const settingsDetails = WORKSPACE_SETTINGS.general;
const Icon = WORKSPACE_SETTINGS_ICONS.general;

return (
<SettingsPageHeader
leftItem={
<div className="flex items-center gap-2">
<Breadcrumbs>
<Breadcrumbs.Item
component={
<BreadcrumbLink
label={t(settingsDetails.i18n_label)}
icon={<Icon className="size-4 text-tertiary" />}
/>
}
/>
</Breadcrumbs>
</div>
}
/>
);
});

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import useSWR from "swr";
import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants";
import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view";
import { PageHead } from "@/components/core/page-title";
import { SingleIntegrationCard } from "@/components/integration";
import { SettingsContentWrapper } from "@/components/settings/content-wrapper";
import { SingleIntegrationCard } from "@/components/integration/single-integration-card";
import { IntegrationAndImportExportBanner } from "@/components/ui/integration-and-import-export-banner";
import { IntegrationsSettingsLoader } from "@/components/ui/loader/settings/integration";
// constants
Expand Down Expand Up @@ -33,7 +32,7 @@ function WorkspaceIntegrationsPage() {
if (!isAdmin) return <NotAuthorizedView section="settings" className="h-auto" />;

return (
<SettingsContentWrapper size="lg">
<>
<PageHead title={pageTitle} />
<section className="w-full overflow-y-auto">
<IntegrationAndImportExportBanner bannerName="Integrations" />
Expand All @@ -47,7 +46,7 @@ function WorkspaceIntegrationsPage() {
)}
</div>
</section>
</SettingsContentWrapper>
</>
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import { Outlet } from "react-router";
// components
import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view";
import { getWorkspaceActivePath, pathnameToAccessKey } from "@/components/settings/helper";
import { SettingsMobileNav } from "@/components/settings/mobile";
import { SettingsMobileNav } from "@/components/settings/mobile/nav";
// plane imports
import { WORKSPACE_SETTINGS_ACCESS } from "@plane/constants";
import type { EUserWorkspaceRoles } from "@plane/types";
// components
import { WorkspaceSettingsSidebarRoot } from "@/components/settings/workspace/sidebar";
// hooks
import { useUserPermissions } from "@/hooks/store/user";
// local components
import { WorkspaceSettingsSidebar } from "./sidebar";

import type { Route } from "./+types/layout";

Expand All @@ -34,18 +34,18 @@ const WorkspaceSettingLayout = observer(function WorkspaceSettingLayout({ params
return (
<>
<SettingsMobileNav
hamburgerContent={WorkspaceSettingsSidebar}
hamburgerContent={WorkspaceSettingsSidebarRoot}
activePath={getWorkspaceActivePath(pathname) || ""}
/>
<div className="inset-y-0 flex flex-row w-full h-full">
{workspaceUserInfo && !isAuthorized ? (
<NotAuthorizedView section="settings" className="h-auto" />
) : (
<div className="relative flex h-full w-full">
<div className="hidden md:block">{<WorkspaceSettingsSidebar />}</div>
<div className="w-full h-full overflow-y-scroll md:pt-page-y">
<Outlet />
<div className="relative flex size-full">
<div className="h-full hidden md:block">
<WorkspaceSettingsSidebarRoot />
</div>
<Outlet />
</div>
)}
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { observer } from "mobx-react";
// plane imports
import { WORKSPACE_SETTINGS } from "@plane/constants";
import { useTranslation } from "@plane/i18n";
import { Breadcrumbs } from "@plane/ui";
// components
import { BreadcrumbLink } from "@/components/common/breadcrumb-link";
import { SettingsPageHeader } from "@/components/settings/page-header";
import { WORKSPACE_SETTINGS_ICONS } from "@/components/settings/workspace/sidebar/item-icon";

export const MembersWorkspaceSettingsHeader = observer(function MembersWorkspaceSettingsHeader() {
// plane hooks
const { t } = useTranslation();
// derived values
const settingsDetails = WORKSPACE_SETTINGS.members;
const Icon = WORKSPACE_SETTINGS_ICONS.members;

return (
<SettingsPageHeader
leftItem={
<div className="flex items-center gap-2">
<Breadcrumbs>
<Breadcrumbs.Item
component={
<BreadcrumbLink
label={t(settingsDetails.i18n_label)}
icon={<Icon className="size-4 text-tertiary" />}
/>
}
/>
</Breadcrumbs>
</div>
}
/>
);
});
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view
import { CountChip } from "@/components/common/count-chip";
import { PageHead } from "@/components/core/page-title";
import { MemberListFiltersDropdown } from "@/components/project/dropdowns/filters/member-list";
import { SettingsContentWrapper } from "@/components/settings/content-wrapper";
import { WorkspaceMembersList } from "@/components/workspace/settings/members-list";
// hooks
import { useMember } from "@/hooks/store/use-member";
Expand All @@ -22,7 +21,10 @@ import { useUserPermissions } from "@/hooks/store/user";
// plane web components
import { BillingActionsButton } from "@/plane-web/components/workspace/billing/billing-actions-button";
import { SendWorkspaceInvitationModal, MembersActivityButton } from "@/plane-web/components/workspace/members";
import { SettingsContentWrapper } from "@/components/settings/content-wrapper";
// local imports
import type { Route } from "./+types/page";
import { MembersWorkspaceSettingsHeader } from "./header";

const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsPage({ params }: Route.ComponentProps) {
// states
Expand Down Expand Up @@ -93,20 +95,20 @@ const WorkspaceMembersSettingsPage = observer(function WorkspaceMembersSettingsP
}

return (
<SettingsContentWrapper size="lg">
<SettingsContentWrapper header={<MembersWorkspaceSettingsHeader />} hugging>
<PageHead title={pageTitle} />
<SendWorkspaceInvitationModal
isOpen={inviteModal}
onClose={() => setInviteModal(false)}
onSubmit={handleWorkspaceInvite}
/>
<section
className={cn("w-full h-full", {
className={cn("size-full", {
"opacity-60": !canPerformWorkspaceMemberActions,
})}
>
<div className="flex justify-between gap-4 pb-3.5 items-center">
<h4 className="flex items-center gap-2.5 text-h5-medium">
<h4 className="flex items-center gap-2.5 text-h3-medium">
{t("workspace_settings.settings.members.title")}
{workspaceMemberIds && workspaceMemberIds.length > 0 && (
<CountChip count={workspaceMemberIds.length} className="h-5 m-auto" />
Expand Down
Loading
Loading