-
+ >
);
});
diff --git a/web/pages/[workspaceSlug]/settings/imports.tsx b/web/pages/[workspaceSlug]/settings/imports.tsx
index 2e4be4cc1a8..5178209d272 100644
--- a/web/pages/[workspaceSlug]/settings/imports.tsx
+++ b/web/pages/[workspaceSlug]/settings/imports.tsx
@@ -1,12 +1,13 @@
import { observer } from "mobx-react-lite";
// hooks
-import { useUser } from "hooks/store";
+import { useUser, useWorkspace } from "hooks/store";
// layouts
import { WorkspaceSettingLayout } from "layouts/settings-layout";
import { AppLayout } from "layouts/app-layout";
// components
import IntegrationGuide from "components/integration/guide";
import { WorkspaceSettingHeader } from "components/headers";
+import { PageHead } from "components/core";
// types
import { NextPageWithLayout } from "lib/types";
// constants
@@ -17,23 +18,32 @@ const ImportsPage: NextPageWithLayout = observer(() => {
const {
membership: { currentWorkspaceRole },
} = useUser();
+ const { currentWorkspace } = useWorkspace();
+ // derived values
const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN;
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Imports` : undefined;
if (!isAdmin)
return (
-
-
You are not authorized to access this page.
-
+ <>
+
+
+
You are not authorized to access this page.
+
+ >
);
return (
-
+ <>
+
+
+ >
);
});
diff --git a/web/pages/[workspaceSlug]/settings/index.tsx b/web/pages/[workspaceSlug]/settings/index.tsx
index b2920aade03..2924b13c4a8 100644
--- a/web/pages/[workspaceSlug]/settings/index.tsx
+++ b/web/pages/[workspaceSlug]/settings/index.tsx
@@ -1,14 +1,30 @@
import { ReactElement } from "react";
+import { observer } from "mobx-react";
// layouts
import { AppLayout } from "layouts/app-layout";
import { WorkspaceSettingLayout } from "layouts/settings-layout";
+// hooks
+import { useWorkspace } from "hooks/store";
// components
import { WorkspaceSettingHeader } from "components/headers";
import { WorkspaceDetails } from "components/workspace";
+import { PageHead } from "components/core";
// types
import { NextPageWithLayout } from "lib/types";
-const WorkspaceSettingsPage: NextPageWithLayout = () =>
;
+const WorkspaceSettingsPage: NextPageWithLayout = observer(() => {
+ // store hooks
+ const { currentWorkspace } = useWorkspace();
+ // derived values
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - General Settings` : undefined;
+
+ return (
+ <>
+
+
+ >
+ );
+});
WorkspaceSettingsPage.getLayout = function getLayout(page: ReactElement) {
return (
diff --git a/web/pages/[workspaceSlug]/settings/integrations.tsx b/web/pages/[workspaceSlug]/settings/integrations.tsx
index 940c90f3a67..500533877a4 100644
--- a/web/pages/[workspaceSlug]/settings/integrations.tsx
+++ b/web/pages/[workspaceSlug]/settings/integrations.tsx
@@ -3,7 +3,7 @@ import { useRouter } from "next/router";
import { observer } from "mobx-react-lite";
import useSWR from "swr";
// hooks
-import { useUser } from "hooks/store";
+import { useUser, useWorkspace } from "hooks/store";
// services
import { IntegrationService } from "services/integrations";
// layouts
@@ -12,6 +12,7 @@ import { WorkspaceSettingLayout } from "layouts/settings-layout";
// components
import { SingleIntegrationCard } from "components/integration";
import { WorkspaceSettingHeader } from "components/headers";
+import { PageHead } from "components/core";
// ui
import { IntegrationAndImportExportBanner, IntegrationsSettingsLoader } from "components/ui";
// types
@@ -31,14 +32,20 @@ const WorkspaceIntegrationsPage: NextPageWithLayout = observer(() => {
const {
membership: { currentWorkspaceRole },
} = useUser();
+ const { currentWorkspace } = useWorkspace();
+ // derived values
const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN;
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Integrations` : undefined;
if (!isAdmin)
return (
-
-
You are not authorized to access this page.
-
+ <>
+
+
+
You are not authorized to access this page.
+
+ >
);
const { data: appIntegrations } = useSWR(workspaceSlug && isAdmin ? APP_INTEGRATIONS : null, () =>
@@ -46,16 +53,21 @@ const WorkspaceIntegrationsPage: NextPageWithLayout = observer(() => {
);
return (
-
-
-
- {appIntegrations ? (
- appIntegrations.map((integration) => )
- ) : (
-
- )}
-
-
+ <>
+
+
+
+
+ {appIntegrations ? (
+ appIntegrations.map((integration) => (
+
+ ))
+ ) : (
+
+ )}
+
+
+ >
);
});
diff --git a/web/pages/[workspaceSlug]/settings/members.tsx b/web/pages/[workspaceSlug]/settings/members.tsx
index 6e9d8d924a8..b8739ae7756 100644
--- a/web/pages/[workspaceSlug]/settings/members.tsx
+++ b/web/pages/[workspaceSlug]/settings/members.tsx
@@ -3,7 +3,7 @@ import { useRouter } from "next/router";
import { observer } from "mobx-react-lite";
import { Search } from "lucide-react";
// hooks
-import { useEventTracker, useMember, useUser } from "hooks/store";
+import { useEventTracker, useMember, useUser, useWorkspace } from "hooks/store";
import useToast from "hooks/use-toast";
// layouts
import { AppLayout } from "layouts/app-layout";
@@ -11,6 +11,7 @@ import { WorkspaceSettingLayout } from "layouts/settings-layout";
// components
import { WorkspaceSettingHeader } from "components/headers";
import { SendWorkspaceInvitationModal, WorkspaceMembersList } from "components/workspace";
+import { PageHead } from "components/core";
// ui
import { Button } from "@plane/ui";
// types
@@ -37,6 +38,7 @@ const WorkspaceMembersSettingsPage: NextPageWithLayout = observer(() => {
const {
workspace: { inviteMembersToWorkspace },
} = useMember();
+ const { currentWorkspace } = useWorkspace();
// toast alert
const { setToastAlert } = useToast();
@@ -83,11 +85,14 @@ const WorkspaceMembersSettingsPage: NextPageWithLayout = observer(() => {
});
};
+ // derived values
const hasAddMemberPermission =
currentWorkspaceRole && [EUserWorkspaceRoles.ADMIN, EUserWorkspaceRoles.MEMBER].includes(currentWorkspaceRole);
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Members` : undefined;
return (
<>
+
setInviteModal(false)}
diff --git a/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx b/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx
index 562578b6620..60e65e90544 100644
--- a/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx
+++ b/web/pages/[workspaceSlug]/settings/webhooks/[webhookId].tsx
@@ -3,7 +3,7 @@ import { useRouter } from "next/router";
import { observer } from "mobx-react-lite";
import useSWR from "swr";
// hooks
-import { useUser, useWebhook } from "hooks/store";
+import { useUser, useWebhook, useWorkspace } from "hooks/store";
// layouts
import { AppLayout } from "layouts/app-layout";
import { WorkspaceSettingLayout } from "layouts/settings-layout";
@@ -12,6 +12,7 @@ import useToast from "hooks/use-toast";
// components
import { WorkspaceSettingHeader } from "components/headers";
import { DeleteWebhookModal, WebhookDeleteSection, WebhookForm } from "components/web-hooks";
+import { PageHead } from "components/core";
// ui
import { Spinner } from "@plane/ui";
// types
@@ -29,6 +30,7 @@ const WebhookDetailsPage: NextPageWithLayout = observer(() => {
membership: { currentWorkspaceRole },
} = useUser();
const { currentWebhook, fetchWebhookById, updateWebhook } = useWebhook();
+ const { currentWorkspace } = useWorkspace();
// toast
const { setToastAlert } = useToast();
@@ -38,6 +40,7 @@ const WebhookDetailsPage: NextPageWithLayout = observer(() => {
// }, [clearSecretKey, isCreated]);
const isAdmin = currentWorkspaceRole === 20;
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Webhook` : undefined;
useSWR(
workspaceSlug && webhookId && isAdmin ? `WEBHOOK_DETAILS_${workspaceSlug}_${webhookId}` : null,
@@ -76,9 +79,12 @@ const WebhookDetailsPage: NextPageWithLayout = observer(() => {
if (!isAdmin)
return (
-
-
You are not authorized to access this page.
-
+ <>
+
+
+
You are not authorized to access this page.
+
+ >
);
if (!currentWebhook)
@@ -90,6 +96,7 @@ const WebhookDetailsPage: NextPageWithLayout = observer(() => {
return (
<>
+
setDeleteWebhookModal(false)} />
await handleUpdateWebhook(data)} data={currentWebhook} />
diff --git a/web/pages/[workspaceSlug]/settings/webhooks/index.tsx b/web/pages/[workspaceSlug]/settings/webhooks/index.tsx
index cafac485e62..46c7e99cb7b 100644
--- a/web/pages/[workspaceSlug]/settings/webhooks/index.tsx
+++ b/web/pages/[workspaceSlug]/settings/webhooks/index.tsx
@@ -19,6 +19,7 @@ import { WebhookSettingsLoader } from "components/ui";
import { NextPageWithLayout } from "lib/types";
// constants
import { WORKSPACE_SETTINGS_EMPTY_STATE_DETAILS } from "constants/empty-state";
+import { PageHead } from "components/core";
const WebhooksListPage: NextPageWithLayout = observer(() => {
// states
@@ -47,6 +48,7 @@ const WebhooksListPage: NextPageWithLayout = observer(() => {
const isLightMode = resolvedTheme ? resolvedTheme === "light" : currentUser?.theme.theme === "light";
const emptyStateImage = getEmptyStateImagePath("workspace-settings", "webhooks", isLightMode);
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Webhooks` : undefined;
// clear secret key when modal is closed.
useEffect(() => {
@@ -55,53 +57,59 @@ const WebhooksListPage: NextPageWithLayout = observer(() => {
if (!isAdmin)
return (
-
-
You are not authorized to access this page.
-
+ <>
+
+
+
You are not authorized to access this page.
+
+ >
);
if (!webhooks) return ;
return (
-
-
{
- setShowCreateWebhookModal(false);
- }}
- />
- {Object.keys(webhooks).length > 0 ? (
-
-
-
Webhooks
-
-
-
-
- ) : (
-
-
-
Webhooks
-
+ <>
+
+
+
{
+ setShowCreateWebhookModal(false);
+ }}
+ />
+ {Object.keys(webhooks).length > 0 ? (
+
+
+
Webhooks
+
+
+
-
-
+ ) : (
+
+
+
Webhooks
+
+
+
+
+
-
- )}
-
+ )}
+
+ >
);
});
diff --git a/web/pages/[workspaceSlug]/workspace-views/[globalViewId].tsx b/web/pages/[workspaceSlug]/workspace-views/[globalViewId].tsx
index e89e2c70f9b..43a0ad49439 100644
--- a/web/pages/[workspaceSlug]/workspace-views/[globalViewId].tsx
+++ b/web/pages/[workspaceSlug]/workspace-views/[globalViewId].tsx
@@ -7,15 +7,26 @@ import { AllIssueLayoutRoot } from "components/issues";
import { GlobalIssuesHeader } from "components/headers";
// types
import { NextPageWithLayout } from "lib/types";
+import { observer } from "mobx-react";
+import { useWorkspace } from "hooks/store";
+import { PageHead } from "components/core";
-const GlobalViewIssuesPage: NextPageWithLayout = () => (
-
-);
+const GlobalViewIssuesPage: NextPageWithLayout = observer(() => {
+ const { currentWorkspace } = useWorkspace();
+ // derived values
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace?.name} - Views` : undefined;
+ return (
+ <>
+
+
+ >
+ );
+});
GlobalViewIssuesPage.getLayout = function getLayout(page: ReactElement) {
return
}>{page};
diff --git a/web/pages/[workspaceSlug]/workspace-views/index.tsx b/web/pages/[workspaceSlug]/workspace-views/index.tsx
index db1a6fca72f..656120a3eac 100644
--- a/web/pages/[workspaceSlug]/workspace-views/index.tsx
+++ b/web/pages/[workspaceSlug]/workspace-views/index.tsx
@@ -1,7 +1,9 @@
import React, { useState, ReactElement } from "react";
+import { observer } from "mobx-react";
// layouts
import { AppLayout } from "layouts/app-layout";
// components
+import { PageHead } from "components/core";
import { GlobalDefaultViewListItem, GlobalViewsList } from "components/workspace";
import { GlobalIssuesHeader } from "components/headers";
// ui
@@ -12,31 +14,40 @@ import { Search } from "lucide-react";
import { NextPageWithLayout } from "lib/types";
// constants
import { DEFAULT_GLOBAL_VIEWS_LIST } from "constants/workspace";
+// hooks
+import { useWorkspace } from "hooks/store";
-const WorkspaceViewsPage: NextPageWithLayout = () => {
+const WorkspaceViewsPage: NextPageWithLayout = observer(() => {
const [query, setQuery] = useState("");
+ // store
+ const { currentWorkspace } = useWorkspace();
+ // derived values
+ const pageTitle = currentWorkspace?.name ? `${currentWorkspace?.name} - All Views` : undefined;
return (
-
-
-
-
-
setQuery(e.target.value)}
- placeholder="Search"
- mode="true-transparent"
- />
+ <>
+
+
+
+ {DEFAULT_GLOBAL_VIEWS_LIST.filter((v) => v.label.toLowerCase().includes(query.toLowerCase())).map((option) => (
+
+ ))}
+
- {DEFAULT_GLOBAL_VIEWS_LIST.filter((v) => v.label.toLowerCase().includes(query.toLowerCase())).map((option) => (
-
- ))}
-
-
+ >
);
-};
+});
WorkspaceViewsPage.getLayout = function getLayout(page: ReactElement) {
return
}>{page};
diff --git a/web/pages/accounts/forgot-password.tsx b/web/pages/accounts/forgot-password.tsx
index 07fa86045ec..0eef16009c3 100644
--- a/web/pages/accounts/forgot-password.tsx
+++ b/web/pages/accounts/forgot-password.tsx
@@ -12,6 +12,7 @@ import { useEventTracker } from "hooks/store";
import DefaultLayout from "layouts/default-layout";
// components
import { LatestFeatureBlock } from "components/common";
+import { PageHead } from "components/core";
// ui
import { Button, Input } from "@plane/ui";
// images
@@ -85,59 +86,62 @@ const ForgotPasswordPage: NextPageWithLayout = () => {
};
return (
-
-
-
-
-
Plane
+ <>
+
+
-
-
-
-
- Get on your flight deck
-
-
Get a link to reset your password
-
+
+
+
+
+ Get on your flight deck
+
+
Get a link to reset your password
+
+
+
-
-
+ >
);
};
diff --git a/web/pages/accounts/reset-password.tsx b/web/pages/accounts/reset-password.tsx
index c4258f39e4a..c848245ac1c 100644
--- a/web/pages/accounts/reset-password.tsx
+++ b/web/pages/accounts/reset-password.tsx
@@ -12,6 +12,7 @@ import { useEventTracker } from "hooks/store";
import DefaultLayout from "layouts/default-layout";
// components
import { LatestFeatureBlock } from "components/common";
+import { PageHead } from "components/core";
// ui
import { Button, Input } from "@plane/ui";
// images
@@ -90,90 +91,93 @@ const ResetPasswordPage: NextPageWithLayout = () => {
};
return (
-
-
-
-
-
Plane
+ <>
+
+
-
-
-
-
- Let{"'"}s get a new password
-
-
-
+ >
);
};
diff --git a/web/pages/accounts/sign-up.tsx b/web/pages/accounts/sign-up.tsx
index 5b5648439c5..cba9c0166e8 100644
--- a/web/pages/accounts/sign-up.tsx
+++ b/web/pages/accounts/sign-up.tsx
@@ -7,6 +7,7 @@ import { useApplication, useUser } from "hooks/store";
import DefaultLayout from "layouts/default-layout";
// components
import { SignUpRoot } from "components/account";
+import { PageHead } from "components/core";
// ui
import { Spinner } from "@plane/ui";
// assets
@@ -29,20 +30,23 @@ const SignUpPage: NextPageWithLayout = observer(() => {
);
return (
-
-
-
-
-
Plane
+ <>
+
+
-
+ >
);
});
diff --git a/web/pages/create-workspace.tsx b/web/pages/create-workspace.tsx
index 10eb11f554e..952ed0b6874 100644
--- a/web/pages/create-workspace.tsx
+++ b/web/pages/create-workspace.tsx
@@ -11,6 +11,7 @@ import DefaultLayout from "layouts/default-layout";
import { UserAuthWrapper } from "layouts/auth-layout";
// components
import { CreateWorkspaceForm } from "components/workspace";
+import { PageHead } from "components/core";
// images
import BlackHorizontalLogo from "public/plane-logos/black-horizontal-with-blue-logo.svg";
import WhiteHorizontalLogo from "public/plane-logos/white-horizontal-with-blue-logo.svg";
@@ -37,38 +38,41 @@ const CreateWorkspacePage: NextPageWithLayout = observer(() => {
};
return (
-
-
-
-
-
- {theme === "light" ? (
-
- ) : (
-
- )}
+ <>
+
+
+
+
+
+
+ {theme === "light" ? (
+
+ ) : (
+
+ )}
+
+
+
+ {currentUser?.email}
-
-
- {currentUser?.email}
-
-
-
-
Create your workspace
-
-
+
+
+
Create your workspace
+
+
+
-
+ >
);
});
diff --git a/web/pages/god-mode/ai.tsx b/web/pages/god-mode/ai.tsx
index 3ceb902c902..b84e98098d3 100644
--- a/web/pages/god-mode/ai.tsx
+++ b/web/pages/god-mode/ai.tsx
@@ -13,6 +13,7 @@ import { Loader } from "@plane/ui";
import { Lightbulb } from "lucide-react";
// components
import { InstanceAIForm } from "components/instance";
+import { PageHead } from "components/core";
const InstanceAdminAIPage: NextPageWithLayout = observer(() => {
// store
@@ -23,37 +24,40 @@ const InstanceAdminAIPage: NextPageWithLayout = observer(() => {
useSWR("INSTANCE_CONFIGURATIONS", () => fetchInstanceConfigurations());
return (
-
-
-
AI features for all your workspaces
-
- Configure your AI API credentials so Plane AI features are turned on for all your workspaces.
-
-
- {formattedConfig ? (
- <>
-
-
OpenAI
-
If you use ChatGPT, this is for you.
+ <>
+
+
+
+
AI features for all your workspaces
+
+ Configure your AI API credentials so Plane AI features are turned on for all your workspaces.
-
-
-
-
-
If you have a preferred AI models vendor, please get in touch with us.
+
+ {formattedConfig ? (
+ <>
+
+
OpenAI
+
If you use ChatGPT, this is for you.
+
+
+
+
+
+
If you have a preferred AI models vendor, please get in touch with us.
+
+
+ >
+ ) : (
+
+
+
+
-
- >
- ) : (
-
-
-
-
-
-
- )}
-
+
+ )}
+
+ >
);
});
diff --git a/web/pages/god-mode/authorization.tsx b/web/pages/god-mode/authorization.tsx
index 5085ff61ae1..e36a1a455c3 100644
--- a/web/pages/god-mode/authorization.tsx
+++ b/web/pages/god-mode/authorization.tsx
@@ -14,6 +14,7 @@ import useToast from "hooks/use-toast";
import { Loader, ToggleSwitch } from "@plane/ui";
// components
import { InstanceGithubConfigForm, InstanceGoogleConfigForm } from "components/instance";
+import { PageHead } from "components/core";
const InstanceAdminAuthorizationPage: NextPageWithLayout = observer(() => {
// store
@@ -64,69 +65,71 @@ const InstanceAdminAuthorizationPage: NextPageWithLayout = observer(() => {
};
return (
-
-
-
Single sign-on and OAuth
-
- Make your teams life easy by letting them sign-up with their Google and GitHub accounts, and below are the
- settings.
+ <>
+
+
+
+
Single sign-on and OAuth
+
+ Make your teams life easy by letting them sign-up with their Google and GitHub accounts, and below are the
+ settings.
+
-
- {formattedConfig ? (
- <>
-
-
-
-
- Turn Magic Links {Boolean(parseInt(enableMagicLogin)) ? "off" : "on"}
+ {formattedConfig ? (
+ <>
+
+
+
+
+ Turn Magic Links {Boolean(parseInt(enableMagicLogin)) ? "off" : "on"}
+
+
+
Slack-like emails for authentication.
+ You need to have set up email{" "}
+
+
here
+ {" "}
+ to enable this.
+
-
-
Slack-like emails for authentication.
- You need to have set up email{" "}
-
-
here
- {" "}
- to enable this.
+
+ {
+ // Boolean(parseInt(enableMagicLogin)) === true
+ // ? updateConfig("ENABLE_MAGIC_LINK_LOGIN", "0")
+ // : updateConfig("ENABLE_MAGIC_LINK_LOGIN", "1");
+ // }}
+ onChange={() => {}}
+ size="sm"
+ disabled={isSubmitting}
+ />
-
- {
- // Boolean(parseInt(enableMagicLogin)) === true
- // ? updateConfig("ENABLE_MAGIC_LINK_LOGIN", "0")
- // : updateConfig("ENABLE_MAGIC_LINK_LOGIN", "1");
- // }}
- onChange={() => {}}
- size="sm"
- disabled={isSubmitting}
- />
-
-
-
-
-
- Let your users log in via the methods below
+
+
+
+ Let your users log in via the methods below
+
+
+ Toggling this off will disable all previous configs. Users will only be able to login with an e-mail
+ and password combo.
+
-
- Toggling this off will disable all previous configs. Users will only be able to login with an e-mail
- and password combo.
+
+ {
+ Boolean(parseInt(enableSignup)) === true
+ ? updateConfig("ENABLE_SIGNUP", "0")
+ : updateConfig("ENABLE_SIGNUP", "1");
+ }}
+ size="sm"
+ disabled={isSubmitting}
+ />
-
- {
- Boolean(parseInt(enableSignup)) === true
- ? updateConfig("ENABLE_SIGNUP", "0")
- : updateConfig("ENABLE_SIGNUP", "1");
- }}
- size="sm"
- disabled={isSubmitting}
- />
-
-
- {/*
+ {/*
Turn Email Password {Boolean(parseInt(enableEmailPassword)) ? "off" : "on"}
@@ -146,36 +149,37 @@ const InstanceAdminAuthorizationPage: NextPageWithLayout = observer(() => {
/>
*/}
-
-
-
-
-
-
Github
+
- >
- ) : (
-
-
-
+ >
+ ) : (
+
+
+
+
+
-
-
-
- )}
-
+
+ )}
+
+ >
);
});
diff --git a/web/pages/god-mode/email.tsx b/web/pages/god-mode/email.tsx
index bea14a357dd..65889607fa6 100644
--- a/web/pages/god-mode/email.tsx
+++ b/web/pages/god-mode/email.tsx
@@ -11,6 +11,7 @@ import { useApplication } from "hooks/store";
import { Loader } from "@plane/ui";
// components
import { InstanceEmailForm } from "components/instance";
+import { PageHead } from "components/core";
const InstanceAdminEmailPage: NextPageWithLayout = observer(() => {
// store
@@ -21,29 +22,32 @@ const InstanceAdminEmailPage: NextPageWithLayout = observer(() => {
useSWR("INSTANCE_CONFIGURATIONS", () => fetchInstanceConfigurations());
return (
-
-
-
Secure emails from your own instance
-
- Plane can send useful emails to you and your users from your own instance without talking to the Internet.
-
-
- Set it up below and please test your settings before you save them.{" "}
-
Misconfigs can lead to email bounces and errors.
+ <>
+
+
+
+
Secure emails from your own instance
+
+ Plane can send useful emails to you and your users from your own instance without talking to the Internet.
+
+
+ Set it up below and please test your settings before you save them.{" "}
+ Misconfigs can lead to email bounces and errors.
+
-
- {formattedConfig ? (
-
- ) : (
-
-
+ {formattedConfig ? (
+
+ ) : (
+
+
+
+
+
-
-
-
-
- )}
-
+
+ )}
+
+ >
);
});
diff --git a/web/pages/god-mode/image.tsx b/web/pages/god-mode/image.tsx
index f7cf21c2f55..349dccf4bf6 100644
--- a/web/pages/god-mode/image.tsx
+++ b/web/pages/god-mode/image.tsx
@@ -11,6 +11,7 @@ import { useApplication } from "hooks/store";
import { Loader } from "@plane/ui";
// components
import { InstanceImageConfigForm } from "components/instance";
+import { PageHead } from "components/core";
const InstanceAdminImagePage: NextPageWithLayout = observer(() => {
// store
@@ -21,25 +22,28 @@ const InstanceAdminImagePage: NextPageWithLayout = observer(() => {
useSWR("INSTANCE_CONFIGURATIONS", () => fetchInstanceConfigurations());
return (
-
-
-
Third-party image libraries
-
- Let your users search and choose images from third-party libraries
+ <>
+
+
+
+
Third-party image libraries
+
+ Let your users search and choose images from third-party libraries
+
-
- {formattedConfig ? (
-
- ) : (
-
-
-
+ {formattedConfig ? (
+
+ ) : (
+
+
+
+
+
-
-
-
- )}
-
+
+ )}
+
+ >
);
});
diff --git a/web/pages/god-mode/index.tsx b/web/pages/god-mode/index.tsx
index 35a8ed0c4de..a93abad3105 100644
--- a/web/pages/god-mode/index.tsx
+++ b/web/pages/god-mode/index.tsx
@@ -11,6 +11,7 @@ import { useApplication } from "hooks/store";
import { Loader } from "@plane/ui";
// components
import { InstanceGeneralForm } from "components/instance";
+import { PageHead } from "components/core";
const InstanceAdminPage: NextPageWithLayout = observer(() => {
// store hooks
@@ -22,26 +23,29 @@ const InstanceAdminPage: NextPageWithLayout = observer(() => {
useSWR("INSTANCE_ADMINS", () => fetchInstanceAdmins());
return (
-
-
-
ID your instance easily
-
- Change the name of your instance and instance admin e-mail addresses. If you have a paid subscription, you
- will find your license key here.
+ <>
+
+
+
+
ID your instance easily
+
+ Change the name of your instance and instance admin e-mail addresses. If you have a paid subscription, you
+ will find your license key here.
+
-
- {instance && instanceAdmins ? (
-
- ) : (
-
-
-
+ {instance && instanceAdmins ? (
+
+ ) : (
+
+
+
+
+
-
-
-
- )}
-
+
+ )}
+
+ >
);
});
diff --git a/web/pages/invitations/index.tsx b/web/pages/invitations/index.tsx
index 26ced201012..b5acec19689 100644
--- a/web/pages/invitations/index.tsx
+++ b/web/pages/invitations/index.tsx
@@ -32,7 +32,7 @@ import { ROLE } from "constants/workspace";
import { MEMBER_ACCEPTED } from "constants/event-tracker";
// components
import { EmptyState } from "components/common";
-
+import { PageHead } from "components/core";
// services
const workspaceService = new WorkspaceService();
const userService = new UserService();
@@ -126,108 +126,111 @@ const UserInvitationsPage: NextPageWithLayout = observer(() => {
};
return (
-
-
-
-
-
- {theme === "light" ? (
-
- ) : (
-
- )}
+ <>
+
+
+
+
+
+
+ {theme === "light" ? (
+
+ ) : (
+
+ )}
+
+
+
+ {currentUser?.email}
-
- {currentUser?.email}
-
-
- {invitations ? (
- invitations.length > 0 ? (
-
-
-
We see that someone has invited you to
-
Join a workspace
-
- {invitations.map((invitation) => {
- const isSelected = invitationsRespond.includes(invitation.id);
+ {invitations ? (
+ invitations.length > 0 ? (
+
+
+
We see that someone has invited you to
+
Join a workspace
+
+ {invitations.map((invitation) => {
+ const isSelected = invitationsRespond.includes(invitation.id);
- return (
-
handleInvitation(invitation, isSelected ? "withdraw" : "accepted")}
- >
-
-
- {invitation.workspace.logo && invitation.workspace.logo.trim() !== "" ? (
-
- ) : (
-
- {invitation.workspace.name[0]}
-
- )}
+ return (
+
handleInvitation(invitation, isSelected ? "withdraw" : "accepted")}
+ >
+
+
+ {invitation.workspace.logo && invitation.workspace.logo.trim() !== "" ? (
+
+ ) : (
+
+ {invitation.workspace.name[0]}
+
+ )}
+
+
+
{truncateText(invitation.workspace.name, 30)}
+
{ROLE[invitation.role]}
+
+
+
+
-
-
{truncateText(invitation.workspace.name, 30)}
-
{ROLE[invitation.role]}
-
-
-
-
-
- );
- })}
-
-
-
-
-
-
-
-
+ );
+ })}
+
+
+
+
+
+
+
+
+
-
- ) : (
-
- router.push("/"),
- }}
- />
-
- )
- ) : null}
-
+ ) : (
+
+ router.push("/"),
+ }}
+ />
+
+ )
+ ) : null}
+
+ >
);
});
diff --git a/web/pages/onboarding/index.tsx b/web/pages/onboarding/index.tsx
index 99886156dcc..5b5b91280f6 100644
--- a/web/pages/onboarding/index.tsx
+++ b/web/pages/onboarding/index.tsx
@@ -17,6 +17,7 @@ import DefaultLayout from "layouts/default-layout";
import { UserAuthWrapper } from "layouts/auth-layout";
// components
import { InviteMembers, JoinWorkspaces, UserDetails, SwitchOrDeleteAccountModal } from "components/onboarding";
+import { PageHead } from "components/core";
// ui
import { Avatar, Spinner } from "@plane/ui";
// images
@@ -142,6 +143,7 @@ const OnboardingPage: NextPageWithLayout = observer(() => {
return (
<>
+
setShowDeleteAccountModal(false)} />
{user && step !== null ? (
diff --git a/web/pages/profile/activity.tsx b/web/pages/profile/activity.tsx
index 051127dd354..4460f2ec506 100644
--- a/web/pages/profile/activity.tsx
+++ b/web/pages/profile/activity.tsx
@@ -9,7 +9,7 @@ import { UserService } from "services/user.service";
// layouts
import { ProfileSettingsLayout } from "layouts/settings-layout";
// components
-import { ActivityIcon, ActivityMessage, IssueLink } from "components/core";
+import { ActivityIcon, ActivityMessage, IssueLink, PageHead } from "components/core";
import { RichReadOnlyEditor } from "@plane/rich-text-editor";
// icons
import { History, MessageSquare } from "lucide-react";
@@ -32,159 +32,162 @@ const ProfileActivityPage: NextPageWithLayout = observer(() => {
const { theme: themeStore } = useApplication();
return (
-
-
- themeStore.toggleSidebar()} />
- Activity
-
- {userActivity ? (
-
-
- {userActivity.results.map((activityItem: any) => {
- if (activityItem.field === "comment") {
- return (
-
-
-
- {activityItem.field ? (
- activityItem.new_value === "restore" && (
-
- )
- ) : activityItem.actor_detail.avatar && activityItem.actor_detail.avatar !== "" ? (
-
- ) : (
-
- {activityItem.actor_detail.display_name?.charAt(0)}
-
- )}
+ <>
+
+
+
+ themeStore.toggleSidebar()} />
+ Activity
+
+ {userActivity ? (
+
+
+ {userActivity.results.map((activityItem: any) => {
+ if (activityItem.field === "comment") {
+ return (
+
+
+
+ {activityItem.field ? (
+ activityItem.new_value === "restore" && (
+
+ )
+ ) : activityItem.actor_detail.avatar && activityItem.actor_detail.avatar !== "" ? (
+
+ ) : (
+
+ {activityItem.actor_detail.display_name?.charAt(0)}
+
+ )}
-
-
-
-
-
-
-
- {activityItem.actor_detail.is_bot
- ? activityItem.actor_detail.first_name + " Bot"
- : activityItem.actor_detail.display_name}
-
-
- Commented {calculateTimeAgo(activityItem.created_at)}
-
+
+
+
-
-
+
+
+
+ {activityItem.actor_detail.is_bot
+ ? activityItem.actor_detail.first_name + " Bot"
+ : activityItem.actor_detail.display_name}
+
+
+ Commented {calculateTimeAgo(activityItem.created_at)}
+
+
+
+
+
-
- );
- }
+ );
+ }
- const message =
- activityItem.verb === "created" &&
+ const message =
+ activityItem.verb === "created" &&
activityItem.field !== "cycles" &&
activityItem.field !== "modules" &&
activityItem.field !== "attachment" &&
activityItem.field !== "link" &&
activityItem.field !== "estimate" &&
!activityItem.field ? (
-
- created
-
- ) : (
-
- );
+
+ created
+
+ ) : (
+
+ );
- if ("field" in activityItem && activityItem.field !== "updated_by") {
- return (
-
-
-
-
- <>
-
-
-
-
- {activityItem.field ? (
- activityItem.new_value === "restore" ? (
-
+ if ("field" in activityItem && activityItem.field !== "updated_by") {
+ return (
+
-
+
+
+ <>
+
+
+
+
+ {activityItem.field ? (
+ activityItem.new_value === "restore" ? (
+
+ ) : (
+
+ )
+ ) : activityItem.actor_detail.avatar && activityItem.actor_detail.avatar !== "" ? (
+
) : (
-
- )
- ) : activityItem.actor_detail.avatar && activityItem.actor_detail.avatar !== "" ? (
-
- ) : (
-
- {activityItem.actor_detail.display_name?.charAt(0)}
-
- )}
+
+ {activityItem.actor_detail.display_name?.charAt(0)}
+
+ )}
+
-
-
-
- {activityItem.field === "archived_at" && activityItem.new_value !== "restore" ? (
-
Plane
- ) : activityItem.actor_detail.is_bot ? (
-
- {activityItem.actor_detail.first_name} Bot
-
- ) : (
-
+
+
+ {activityItem.field === "archived_at" && activityItem.new_value !== "restore" ? (
+
Plane
+ ) : activityItem.actor_detail.is_bot ? (
- {currentUser?.id === activityItem.actor_detail.id
- ? "You"
- : activityItem.actor_detail.display_name}
+ {activityItem.actor_detail.first_name} Bot
-
- )}{" "}
-
- {message}{" "}
-
- {calculateTimeAgo(activityItem.created_at)}
-
+ ) : (
+
+
+ {currentUser?.id === activityItem.actor_detail.id
+ ? "You"
+ : activityItem.actor_detail.display_name}
+
+
+ )}{" "}
+
+ {message}{" "}
+
+ {calculateTimeAgo(activityItem.created_at)}
+
+
-
- >
+ >
+
-
-
- );
- }
- })}
-
-
- ) : (
-
- )}
-
+
+ );
+ }
+ })}
+
+
+ ) : (
+
+ )}
+
+ >
);
});
diff --git a/web/pages/profile/change-password.tsx b/web/pages/profile/change-password.tsx
index 15cb946ed05..80e2965d67e 100644
--- a/web/pages/profile/change-password.tsx
+++ b/web/pages/profile/change-password.tsx
@@ -6,6 +6,8 @@ import { Controller, useForm } from "react-hook-form";
import { useApplication, useUser } from "hooks/store";
// services
import { UserService } from "services/user.service";
+// components
+import { PageHead } from "components/core";
// hooks
import useToast from "hooks/use-toast";
// layout
@@ -88,93 +90,98 @@ const ChangePasswordPage: NextPageWithLayout = observer(() => {
);
return (
-
-
- themeStore.toggleSidebar()} />
-
-