diff --git a/apps/live/src/controllers/iframely.controller.ts b/apps/live/src/controllers/iframely.controller.ts index 0cb240fb06..9decc4cfb1 100644 --- a/apps/live/src/controllers/iframely.controller.ts +++ b/apps/live/src/controllers/iframely.controller.ts @@ -102,8 +102,8 @@ export class IframelyController { errorCode = "TIMEOUT"; break; default: - errorMessage = "An unexpected error occurred"; - errorCode = "SERVER_ERROR"; + errorMessage = "An unexpected error occurred"; + errorCode = "SERVER_ERROR"; } return res.status(status).json({ diff --git a/apps/silo/src/services/oauth/auth.ts b/apps/silo/src/services/oauth/auth.ts index f9c93bef56..c658d5ad30 100644 --- a/apps/silo/src/services/oauth/auth.ts +++ b/apps/silo/src/services/oauth/auth.ts @@ -199,7 +199,7 @@ class PlaneOAuthService { */ getPlaneOAuthRedirectUrl(clientId: string, redirectUri: string, state: string): string { try { - const baseUrl = env.IS_MULTI_TENANT === "1" ? env.API_BASE_URL : env.APP_BASE_URL + const baseUrl = env.IS_MULTI_TENANT === "1" ? env.API_BASE_URL : env.APP_BASE_URL; const data = new URLSearchParams({ client_id: clientId, response_type: "code", diff --git a/apps/space/app/intake/[anchor]/page.tsx b/apps/space/app/intake/[anchor]/page.tsx index 1604370e46..65b4ce5e26 100644 --- a/apps/space/app/intake/[anchor]/page.tsx +++ b/apps/space/app/intake/[anchor]/page.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react"; // hooks import { usePublish } from "@/hooks/store/publish"; import CreateIssueModal from "@/plane-web/components/intake/create/create-issue-modal"; -import type { Route } from "./+types/layout"; +import type { Route } from "./+types/page"; const IssuesPage = observer((props: Route.ComponentProps) => { const { params } = props; diff --git a/apps/space/app/pages/[anchor]/page.tsx b/apps/space/app/pages/[anchor]/page.tsx index e3b9f6df0e..aea702351c 100644 --- a/apps/space/app/pages/[anchor]/page.tsx +++ b/apps/space/app/pages/[anchor]/page.tsx @@ -6,7 +6,7 @@ import { useMember } from "@/hooks/store/use-member"; import { useStates } from "@/hooks/store/use-state"; // components import { PageDetailsMainContent } from "@/plane-web/components/pages"; -import type { Route } from "./+types/layout"; +import type { Route } from "./+types/page"; export default function PageDetailsPage(props: Route.ComponentProps) { const { params } = props; diff --git a/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/layout.tsx index cf4c66ce93..3085a4eac0 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/layout.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; @@ -13,11 +12,12 @@ import { PiChatLayout } from "@/plane-web/components/pi-chat/layout"; import { useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { WorkspaceAuthWrapper } from "@/plane-web/layouts/workspace-wrapper"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/layout"; import { PiAppSidebar } from "./sidebar"; -function PiLayout() { +function PiLayout({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; const { isWorkspaceFeatureEnabled } = useWorkspaceFeatures(); return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/new/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/new/page.tsx index 1c960ed023..fa44ae456d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/new/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/new/page.tsx @@ -11,7 +11,7 @@ import { useUser } from "@/hooks/store/user/user-user"; import { NewConversation } from "@/plane-web/components/pi-chat/conversation/new-converstaion"; import { InputBox } from "@/plane-web/components/pi-chat/input"; -const NewChatPage = observer(() => { +function NewChatPage() { // store hooks const { data: currentUser } = useUser(); @@ -27,6 +27,6 @@ const NewChatPage = observer(() => { ); -}); +} -export default NewChatPage; +export default observer(NewChatPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/page.tsx index 9b623f871c..7a4241513a 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(pi)/pi-chat/page.tsx @@ -2,14 +2,12 @@ import { useEffect } from "react"; import { observer } from "mobx-react"; -import { cn } from "@plane/utils"; import { PageHead } from "@/components/core/page-title"; import { PiChatDetail } from "@/plane-web/components/pi-chat/detail"; -import { AllChats } from "@/plane-web/components/pi-chat/list/root"; import { usePiChat } from "@/plane-web/hooks/store/use-pi-chat"; -const NewChatPage = observer(() => { +function NewChatPage() { // store hooks const { initPiChat } = usePiChat(); @@ -22,6 +20,6 @@ const NewChatPage = observer(() => { ); -}); +} -export default NewChatPage; +export default observer(NewChatPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/customers/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/customers/layout.tsx index c949a41cf2..4dea135c71 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/customers/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/customers/layout.tsx @@ -8,7 +8,7 @@ import { CustomerUpgrade } from "@/plane-web/components/customers"; import { EpicPeekOverview } from "@/plane-web/components/epics/peek-overview"; import { useCustomers } from "@/plane-web/hooks/store"; -const CustomersLayout = observer(() => { +function CustomersLayout() { // hooks const { loader, isCustomersFeatureEnabled } = useCustomers(); // derived values @@ -30,6 +30,6 @@ const CustomersLayout = observer(() => { )} ); -}); +} -export default CustomersLayout; +export default observer(CustomersLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/dashboards/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/dashboards/layout.tsx index f3ce434409..bef570d547 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/dashboards/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/dashboards/layout.tsx @@ -1,6 +1,5 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import useSWR from "swr"; // plane web components @@ -9,19 +8,17 @@ import { DashboardsFeatureFlagFallback } from "@/plane-web/components/dashboards import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; // plane web hooks import { useDashboards } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function WorkspaceDashboardsLayout() { +export default function WorkspaceDashboardsLayout({ params }: Route.ComponentProps) { // navigation - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { workspaceDashboards: { fetchDashboards }, } = useDashboards(); - useSWR( - workspaceSlug ? `WORKSPACE_DASHBOARDS_LIST_${workspaceSlug.toString()}` : null, - workspaceSlug ? () => fetchDashboards() : null - ); + useSWR(`WORKSPACE_DASHBOARDS_LIST_${workspaceSlug}`, () => fetchDashboards()); return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/(overview)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/(overview)/page.tsx index b6b37a07ce..de8163cd04 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/(overview)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/(overview)/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { useTheme } from "next-themes"; import useSWR from "swr"; import { useTranslation } from "@plane/i18n"; @@ -23,11 +21,12 @@ import { useFlag, useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { useProjectAdvanced } from "@/plane-web/hooks/store/projects/use-projects"; import { useInitiatives } from "@/plane-web/hooks/store/use-initiatives"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const InitiativeDetailsPage = observer(() => { +function InitiativeDetailsPage({ params }: Route.ComponentProps) { // router const router = useAppRouter(); - const { workspaceSlug, initiativeId } = useParams(); + const { workspaceSlug, initiativeId } = params; // hooks const { t } = useTranslation(); @@ -42,20 +41,17 @@ const InitiativeDetailsPage = observer(() => { const { isWorkspaceFeatureEnabled } = useWorkspaceFeatures(); // fetching issue details - const { isLoading, error } = useSWR( - workspaceSlug && initiativeId ? `INITIATIVE_DETAIL_${workspaceSlug}_${initiativeId}` : null, - workspaceSlug && initiativeId - ? () => fetchInitiativeDetails(workspaceSlug.toString(), initiativeId.toString()) - : null + const { isLoading, error } = useSWR(`INITIATIVE_DETAIL_${workspaceSlug}_${initiativeId}`, () => + fetchInitiativeDetails(workspaceSlug, initiativeId) ); // derived values - const initiativeDetails = getInitiativeById(initiativeId.toString()); + const initiativeDetails = getInitiativeById(initiativeId); const loader = !initiativeDetails || isLoading; const pageTitle = initiativeDetails ? `Initiative - ${initiativeDetails.name}` : "Initiative"; + const isProjectGroupingFeatureFlagEnabled = useFlag(workspaceSlug, "PROJECT_GROUPING"); const isProjectGroupingEnabled = - isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && - useFlag(workspaceSlug.toString(), "PROJECT_GROUPING"); + isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && isProjectGroupingFeatureFlagEnabled; // fetch initiative project analytics count useSWR( @@ -72,18 +68,12 @@ const InitiativeDetailsPage = observer(() => { ); // fetch initiative project attributes useSWR( - workspaceSlug && - isProjectGroupingEnabled && - initiativeDetails?.project_ids && - initiativeDetails?.project_ids.length > 0 + isProjectGroupingEnabled && initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 ? ["initiativeProjectAttributes", workspaceSlug, isProjectGroupingEnabled, ...initiativeDetails?.project_ids] : null, - workspaceSlug && - isProjectGroupingEnabled && - initiativeDetails?.project_ids && - initiativeDetails?.project_ids.length > 0 + isProjectGroupingEnabled && initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 ? () => - fetchProjectAttributes(workspaceSlug.toString(), { + fetchProjectAttributes(workspaceSlug, { project_ids: initiativeDetails?.project_ids?.join(","), }) : null @@ -118,13 +108,10 @@ const InitiativeDetailsPage = observer(() => { ) : ( - workspaceSlug && - initiativeDetails && ( - - ) + )} ); -}); +} -export default InitiativeDetailsPage; +export default observer(InitiativeDetailsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/scope/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/scope/page.tsx index e9528adeb2..e3d7603d36 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/scope/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(detail)/[initiativeId]/scope/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { useTheme } from "next-themes"; import useSWR from "swr"; import { useTranslation } from "@plane/i18n"; @@ -18,16 +16,16 @@ import { useProject } from "@/hooks/store/use-project"; import { useAppRouter } from "@/hooks/use-app-router"; import { InitiativeScopeRoot } from "@/plane-web/components/initiatives/scope/root"; // Plane-web -import { useFlag } from "@/plane-web/hooks/store"; -import * as store from "@/plane-web/hooks/store"; +import { useFlag, useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { useProjectAdvanced } from "@/plane-web/hooks/store/projects/use-projects"; import { useInitiatives } from "@/plane-web/hooks/store/use-initiatives"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const IssueDetailsPage = observer(() => { +function IssueDetailsPage({ params }: Route.ComponentProps) { // router const router = useAppRouter(); - const { workspaceSlug, initiativeId } = useParams(); + const { workspaceSlug, initiativeId } = params; // hooks const { resolvedTheme } = useTheme(); // store hooks @@ -43,38 +41,32 @@ const IssueDetailsPage = observer(() => { const { t } = useTranslation(); - const { isWorkspaceFeatureEnabled } = store.useWorkspaceFeatures(); + const { isWorkspaceFeatureEnabled } = useWorkspaceFeatures(); // fetching issue details - const { isLoading, error } = useSWR( - workspaceSlug && initiativeId ? `INITIATIVE_DETAIL_${workspaceSlug}_${initiativeId}` : null, - workspaceSlug && initiativeId - ? () => fetchInitiativeDetails(workspaceSlug.toString(), initiativeId.toString()) - : null + const { isLoading, error } = useSWR(`INITIATIVE_DETAIL_${workspaceSlug}_${initiativeId}`, () => + fetchInitiativeDetails(workspaceSlug, initiativeId) ); // fetch initiative epics - const { isLoading: isEpicsLoading } = useSWR( - workspaceSlug && initiativeId ? `INITIATIVE_EPICS_${workspaceSlug}_${initiativeId}` : null, - workspaceSlug && initiativeId - ? () => fetchInitiativeEpicsDetail(workspaceSlug.toString(), initiativeId.toString()) - : null + const { isLoading: isEpicsLoading } = useSWR(`INITIATIVE_EPICS_${workspaceSlug}_${initiativeId}`, () => + fetchInitiativeEpicsDetail(workspaceSlug, initiativeId) ); // derived values - const initiativeDetails = getInitiativeById(initiativeId.toString()); + const initiativeDetails = getInitiativeById(initiativeId); const loader = !initiativeDetails || isLoading || isEpicsLoading; const pageTitle = initiativeDetails ? `Initiative - ${initiativeDetails.name} | Scope` : "Initiative | Scope"; + const isProjectGroupingFeatureFlagEnabled = useFlag(workspaceSlug, "PROJECT_GROUPING"); const isProjectGroupingEnabled = - isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && - useFlag(workspaceSlug.toString(), "PROJECT_GROUPING"); + isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && isProjectGroupingFeatureFlagEnabled; // fetch initiative project analytics count useSWR( - workspaceSlug && initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 + initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 ? ["initiativeProjectAnalyticsCount", workspaceSlug, ...initiativeDetails?.project_ids] : null, - workspaceSlug && initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 + initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 ? () => - fetchProjectAnalyticsCount(workspaceSlug.toString(), { + fetchProjectAnalyticsCount(workspaceSlug, { project_ids: initiativeDetails?.project_ids?.join(","), fields: "total_issues,completed_issues", }) @@ -82,18 +74,12 @@ const IssueDetailsPage = observer(() => { ); // fetch initiative project attributes useSWR( - workspaceSlug && - isProjectGroupingEnabled && - initiativeDetails?.project_ids && - initiativeDetails?.project_ids.length > 0 + isProjectGroupingEnabled && initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 ? ["initiativeProjectAttributes", workspaceSlug, isProjectGroupingEnabled, ...initiativeDetails?.project_ids] : null, - workspaceSlug && - isProjectGroupingEnabled && - initiativeDetails?.project_ids && - initiativeDetails?.project_ids.length > 0 + isProjectGroupingEnabled && initiativeDetails?.project_ids && initiativeDetails?.project_ids.length > 0 ? () => - fetchProjectAttributes(workspaceSlug.toString(), { + fetchProjectAttributes(workspaceSlug, { project_ids: initiativeDetails?.project_ids?.join(","), }) : null @@ -115,10 +101,10 @@ const IssueDetailsPage = observer(() => { ) : loader ? ( ) : ( - workspaceSlug && initiativeDetails && + initiativeDetails && )} ); -}); +} -export default IssueDetailsPage; +export default observer(IssueDetailsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(list)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(list)/page.tsx index dbb6f4da8d..a6f3154c20 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(list)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/(list)/page.tsx @@ -7,7 +7,7 @@ import { useWorkspace } from "@/hooks/store/use-workspace"; // plane web components import { InitiativesPageRoot } from "@/plane-web/components/initiatives/layout/page"; -const InitiativesPage = observer(() => { +function InitiativesPage() { // store hooks const { currentWorkspace } = useWorkspace(); @@ -20,5 +20,5 @@ const InitiativesPage = observer(() => { ); -}); -export default InitiativesPage; +} +export default observer(InitiativesPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/layout.tsx index 37aa03eb5c..92a9bae2ca 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/initiatives/layout.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // components import { Outlet } from "react-router"; import { PageHead } from "@/components/core/page-title"; @@ -13,10 +12,11 @@ import { InitiativesUpgrade } from "@/plane-web/components/initiatives/upgrade"; // plane web hooks import { useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/layout"; -const InitiativesLayout = observer(() => { +function InitiativesLayout({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store const { currentWorkspace } = useWorkspace(); // plane web stores @@ -31,7 +31,7 @@ const InitiativesLayout = observer(() => { {shouldUpgrade ? (
- +
) : ( <> @@ -41,6 +41,6 @@ const InitiativesLayout = observer(() => { )}
); -}); +} -export default InitiativesLayout; +export default observer(InitiativesLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/layout.tsx index 978f2d1356..c601690714 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/layout.tsx @@ -12,13 +12,8 @@ import { AutomationsListWrapper } from "@/plane-web/components/automations/list/ import type { Route } from "./+types/layout"; import { ProjectAutomationDetailsHeader } from "./header"; -const AutomationDetailsLayout: React.FC = observer((props) => { - const { - params: { automationId: automationIdParam, projectId: projectIdParam, workspaceSlug: workspaceSlugParam }, - } = props; - const automationId = automationIdParam?.toString(); - const projectId = projectIdParam?.toString(); - const workspaceSlug = workspaceSlugParam?.toString(); +function AutomationDetailsLayout({ params }: Route.ComponentProps) { + const { automationId, projectId, workspaceSlug } = params; return ( @@ -38,6 +33,6 @@ const AutomationDetailsLayout: React.FC = observer((props) ); -}); +} -export default AutomationDetailsLayout; +export default observer(AutomationDetailsLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/page.tsx index 066cd584b5..89b14fdcc6 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/automations/[automationId]/page.tsx @@ -1,6 +1,5 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; // plane imports import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; @@ -13,19 +12,11 @@ import { useUserPermissions } from "@/hooks/store/user/user-permissions"; // plane web components import { AutomationDetailsMainContentRoot } from "@/plane-web/components/automations/details/main-content/root"; import { AutomationDetailsSidebarRoot } from "@/plane-web/components/automations/details/sidebar/root"; +import type { Route } from "./+types/page"; -type Props = { - params: { - automationId: string; - }; -}; - -const AutomationDetailsPage: React.FC = observer((props) => { +function AutomationDetailsPage({ params }: Route.ComponentProps) { // params - const { - params: { automationId: automationIdParam }, - } = props; - const automationId = automationIdParam?.toString(); + const { automationId } = params; // store hooks const { workspaceUserInfo, allowPermissions } = useUserPermissions(); const { currentProjectDetails: projectDetails } = useProject(); @@ -46,6 +37,6 @@ const AutomationDetailsPage: React.FC = observer((props) => { ); -}); +} -export default AutomationDetailsPage; +export default observer(AutomationDetailsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/(list)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/(list)/page.tsx index de2608004e..e623357fa8 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/(list)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/(list)/page.tsx @@ -1,23 +1,22 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // components import { PageHead } from "@/components/core/page-title"; // hooks import { useProject } from "@/hooks/store/use-project"; // plane web components import { ProjectEpicsLayoutRoot } from "@/plane-web/components/issues/issue-layouts/epic-layout-root"; +import type { Route } from "./+types/page"; -const ProjectEpicsPage = observer(() => { +function ProjectEpicsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, projectId } = useParams(); + const { projectId } = params; // store hooks const { getProjectById } = useProject(); // derived values - const project = projectId ? getProjectById(projectId.toString()) : undefined; + const project = getProjectById(projectId); const pageTitle = project?.name ? `${project?.name} - Epics` : undefined; - if (!workspaceSlug || !projectId) return <>; return ( <> @@ -29,6 +28,6 @@ const ProjectEpicsPage = observer(() => { ); -}); +} -export default ProjectEpicsPage; +export default observer(ProjectEpicsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/layout.tsx index d725784833..32744ed629 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/epics/layout.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; // plane imports import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; @@ -14,17 +13,18 @@ import { useUserPermissions } from "@/hooks/store/user/user-permissions"; // plane web imports import { EpicsEmptyState } from "@/plane-web/components/epics/settings/empty-state"; import { useProjectAdvanced } from "@/plane-web/hooks/store/projects/use-projects"; +import type { Route } from "./+types/layout"; -const EpicsLayout = observer(() => { +function EpicsLayout({ params }: Route.ComponentProps) { // router - const { workspaceSlug, projectId } = useParams(); + const { workspaceSlug, projectId } = params; // store hooks const { getProjectById } = useProject(); const { getProjectFeatures } = useProjectAdvanced(); const { allowPermissions } = useUserPermissions(); // derived values - const project = getProjectById(projectId?.toString()); - const projectFeatures = getProjectFeatures(projectId?.toString()); + const project = getProjectById(projectId); + const projectFeatures = getProjectFeatures(projectId); const isEpicsEnabled = projectFeatures?.is_epic_enabled; const pageTitle = project?.name ? `${project?.name} - Epics` : undefined; @@ -32,7 +32,7 @@ const EpicsLayout = observer(() => { if (project && !isEpicsEnabled) return (
- +
); @@ -58,6 +58,6 @@ const EpicsLayout = observer(() => { ); -}); +} -export default EpicsLayout; +export default observer(EpicsLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/overview/(list)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/overview/(list)/page.tsx index 1a6935a86f..e5c1f7fa2b 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/overview/(list)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/overview/(list)/page.tsx @@ -1,12 +1,12 @@ "use client"; -import { useParams } from "next/navigation"; // components import { ProjectOverviewRoot } from "@/plane-web/components/project-overview/details/root"; +import type { Route } from "./+types/page"; -const ProjectOverviewPage = () => { - const { workspaceSlug, projectId } = useParams(); - return ; -}; +function ProjectOverviewPage({ params }: Route.ComponentProps) { + const { workspaceSlug, projectId } = params; + return ; +} export default ProjectOverviewPage; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/[chatId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/[chatId]/page.tsx index c424343a1d..1216e7043f 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/[chatId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/[chatId]/page.tsx @@ -4,6 +4,8 @@ import { observer } from "mobx-react"; // plane web imports import { PiChatDetail } from "@/plane-web/components/pi-chat/detail"; -const PiChatPage = observer(() => ); +function PiChatPage() { + return ; +} -export default PiChatPage; +export default observer(PiChatPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/layout.tsx index 0a8c767e5d..dcd6d4d4ed 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/layout.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; // plane web imports import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; @@ -9,13 +8,14 @@ import { EmptyPiChat } from "@/plane-web/components/pi-chat/empty"; import { PiChatLayout } from "@/plane-web/components/pi-chat/layout"; import { useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/layout"; -export default observer(function Layout() { +function Layout({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; const { isWorkspaceFeatureEnabled } = useWorkspaceFeatures(); return isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PI_ENABLED) ? ( - }> + }> @@ -23,4 +23,6 @@ export default observer(function Layout() { ) : ( ); -}); +} + +export default observer(Layout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/new/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/new/page.tsx index 63f94f8e16..2ebd5f28c4 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/new/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/new/page.tsx @@ -11,7 +11,7 @@ import { useUser } from "@/hooks/store/user/user-user"; import { NewConversation } from "@/plane-web/components/pi-chat/conversation/new-converstaion"; import { InputBox } from "@/plane-web/components/pi-chat/input"; -const NewChatPage = observer(() => { +function NewChatPage() { // store hooks const { data: currentUser } = useUser(); @@ -27,6 +27,6 @@ const NewChatPage = observer(() => { ); -}); +} -export default NewChatPage; +export default observer(NewChatPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/page.tsx index 60cd4ab37a..8f62e0c373 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/projects/pi-chat/page.tsx @@ -4,7 +4,7 @@ import { observer } from "mobx-react"; import { PiChatDetail } from "@/plane-web/components/pi-chat/detail"; import { usePiChat } from "@/plane-web/hooks/store/use-pi-chat"; -const NewChatPage = observer(() => { +function NewChatPage() { // store hooks const { initPiChat } = usePiChat(); @@ -12,5 +12,5 @@ const NewChatPage = observer(() => { initPiChat(); }, []); return ; -}); -export default NewChatPage; +} +export default observer(NewChatPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/search/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/search/page.tsx index 42d2146f72..2098707357 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/search/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/search/page.tsx @@ -1,19 +1,19 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane web components import { SidebarHamburgerToggle } from "@/components/core/sidebar/sidebar-menu-hamburger-toggle"; import { isSidebarToggleVisible } from "@/plane-web/components/desktop"; import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { AppSearchRoot } from "@/plane-web/components/workspace/search"; +import type { Route } from "./+types/page"; -const AppSearchPage = observer(() => { +function AppSearchPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; return ( - }> + }> {isSidebarToggleVisible() && (
@@ -22,6 +22,6 @@ const AppSearchPage = observer(() => { ); -}); +} -export default AppSearchPage; +export default observer(AppSearchPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/layout.tsx index e973bfcc7c..e8cbd3c33e 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/layout.tsx @@ -1,6 +1,5 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ETeamspaceNavigationItem } from "@plane/constants"; // components @@ -11,13 +10,14 @@ import { PageHead } from "@/components/core/page-title"; import { TeamspaceDetailHeader } from "@/plane-web/components/teamspaces/headers/detail-header"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function TeamspaceOverviewLayout() { - const { teamspaceId } = useParams(); +export default function TeamspaceOverviewLayout({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store hooks const { getTeamspaceById } = useTeamspaces(); // derived values - const currentTeam = getTeamspaceById(teamspaceId?.toString()); + const currentTeam = getTeamspaceById(teamspaceId); const pageTitle = currentTeam?.name ? `Teamspace ${currentTeam?.name} - Overview` : undefined; return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/page.tsx index 00d79c106a..3c4fb4a389 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/(overview)/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import useSWR from "swr"; // components import { LogoSpinner } from "@/components/common/logo-spinner"; @@ -11,28 +10,29 @@ import { TeamsOverviewRoot } from "@/plane-web/components/teamspaces/overview/ro import { useFlag, useTeamspaces, useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { useProjectAdvanced } from "@/plane-web/hooks/store/projects/use-projects"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const TeamspaceOverviewPage = observer(() => { +function TeamspaceOverviewPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, teamspaceId } = useParams(); + const { workspaceSlug, teamspaceId } = params; // store const { fetchProjectAttributes } = useProjectAdvanced(); const { loader, getTeamspaceById, getTeamspaceProjectIds } = useTeamspaces(); const { isWorkspaceFeatureEnabled } = useWorkspaceFeatures(); // derived values - const teamspace = getTeamspaceById(teamspaceId?.toString()); - const teamspaceProjectIds = getTeamspaceProjectIds(teamspaceId?.toString()); + const teamspace = getTeamspaceById(teamspaceId); + const teamspaceProjectIds = getTeamspaceProjectIds(teamspaceId); + const isProjectGroupingFeatureFlagEnabled = useFlag(workspaceSlug, "PROJECT_GROUPING"); const isProjectGroupingEnabled = - isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && - useFlag(workspaceSlug.toString(), "PROJECT_GROUPING"); + isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && isProjectGroupingFeatureFlagEnabled; // fetch team project attributes useSWR( - workspaceSlug && isProjectGroupingEnabled && teamspaceProjectIds && teamspaceProjectIds.length > 0 + isProjectGroupingEnabled && teamspaceProjectIds && teamspaceProjectIds.length > 0 ? ["teamspaceProjectAttributes", workspaceSlug, isProjectGroupingEnabled, ...teamspaceProjectIds] : null, - workspaceSlug && isProjectGroupingEnabled && teamspaceProjectIds && teamspaceProjectIds.length > 0 + isProjectGroupingEnabled && teamspaceProjectIds && teamspaceProjectIds.length > 0 ? () => - fetchProjectAttributes(workspaceSlug.toString(), { + fetchProjectAttributes(workspaceSlug, { project_ids: teamspaceProjectIds?.join(","), }) : null @@ -46,9 +46,9 @@ const TeamspaceOverviewPage = observer(() => { ); // Empty state if teamspace is not found - if (!teamspaceId || !teamspace) return null; + if (!teamspace) return null; - return ; -}); + return ; +} -export default TeamspaceOverviewPage; +export default observer(TeamspaceOverviewPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/layout.tsx index e3e44db250..211c1d9c4e 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/layout.tsx @@ -1,6 +1,5 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ETeamspaceNavigationItem } from "@plane/constants"; // components @@ -11,13 +10,14 @@ import { PageHead } from "@/components/core/page-title"; import { TeamspaceDetailHeader } from "@/plane-web/components/teamspaces/headers/detail-header"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function TeamspaceCyclesLayout() { - const { teamspaceId } = useParams(); +export default function TeamspaceCyclesLayout({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store hooks const { getTeamspaceById } = useTeamspaces(); // derived values - const currentTeam = getTeamspaceById(teamspaceId?.toString()); + const currentTeam = getTeamspaceById(teamspaceId); const pageTitle = currentTeam?.name ? `Teamspace ${currentTeam?.name} - Cycles` : undefined; return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/page.tsx index 9c38050324..5063e09f0d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/cycles/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import useSWR from "swr"; // ui import { Tabs, Loader } from "@plane/ui"; @@ -12,6 +11,7 @@ import { TeamCurrentCyclesRoot } from "@/plane-web/components/teamspaces/cycles/ import { TeamUpcomingCyclesRoot } from "@/plane-web/components/teamspaces/cycles/upcoming"; // plane web hooks import { useTeamspaceCycles } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; const TeamspaceCyclesLoader = ({ height }: { height: string }) => Array.from({ length: 3 }).map((_, index) => ( @@ -20,22 +20,18 @@ const TeamspaceCyclesLoader = ({ height }: { height: string }) => )); -const TeamspaceCyclesPage = observer(() => { - const { workspaceSlug, teamspaceId } = useParams(); +function TeamspaceCyclesPage({ params }: Route.ComponentProps) { + const { workspaceSlug, teamspaceId } = params; // store hooks const { getTeamspaceCyclesLoader, fetchTeamspaceCycles } = useTeamspaceCycles(); // derived values - const teamspaceCyclesLoader = getTeamspaceCyclesLoader(teamspaceId!.toString()); + const teamspaceCyclesLoader = getTeamspaceCyclesLoader(teamspaceId); const isTeamspaceCyclesLoading = teamspaceCyclesLoader === "init-loader"; // fetch teamspace cycles - useSWR( - workspaceSlug && teamspaceId ? ["teamspaceCycles", workspaceSlug, teamspaceId] : null, - () => fetchTeamspaceCycles(workspaceSlug!.toString(), teamspaceId!.toString()), - { - revalidateOnFocus: false, - revalidateIfStale: false, - } - ); + useSWR(["teamspaceCycles", workspaceSlug, teamspaceId], () => fetchTeamspaceCycles(workspaceSlug, teamspaceId), { + revalidateOnFocus: false, + revalidateIfStale: false, + }); const TEAM_CYCLES_TABS = [ { @@ -44,7 +40,7 @@ const TeamspaceCyclesPage = observer(() => { content: isTeamspaceCyclesLoading ? ( ) : ( - + ), }, { @@ -53,7 +49,7 @@ const TeamspaceCyclesPage = observer(() => { content: isTeamspaceCyclesLoading ? ( ) : ( - + ), }, { @@ -62,7 +58,7 @@ const TeamspaceCyclesPage = observer(() => { content: isTeamspaceCyclesLoading ? ( ) : ( - + ), }, ]; @@ -78,9 +74,9 @@ const TeamspaceCyclesPage = observer(() => { tabListClassName="my-2 max-w-64" tabPanelClassName="h-full w-full overflow-hidden overflow-y-auto" /> - +
); -}); +} -export default TeamspaceCyclesPage; +export default observer(TeamspaceCyclesPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/layout.tsx index 5ce67fe56c..8294b2a171 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/layout.tsx @@ -1,6 +1,5 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ETeamspaceNavigationItem } from "@plane/constants"; // components @@ -11,13 +10,14 @@ import { PageHead } from "@/components/core/page-title"; import { TeamspaceDetailHeader } from "@/plane-web/components/teamspaces/headers/detail-header"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function TeamspaceWorkItemsLayout() { - const { teamspaceId } = useParams(); +export default function TeamspaceWorkItemsLayout({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store hooks const { getTeamspaceById } = useTeamspaces(); // derived values - const currentTeam = getTeamspaceById(teamspaceId?.toString()); + const currentTeam = getTeamspaceById(teamspaceId); const pageTitle = currentTeam?.name ? `Teamspace ${currentTeam?.name} - Issues` : undefined; return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/page.tsx index 23945b8450..9ffcb3b7de 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/issues/page.tsx @@ -1,25 +1,21 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // components import { PageHead } from "@/components/core/page-title"; // plane web components import { TeamspaceLayoutRoot } from "@/plane-web/components/issues/issue-layouts/roots/teamspace-layout-root"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const TeamspaceWorkItemsPage = observer(() => { - const { teamspaceId } = useParams(); +function TeamspaceWorkItemsPage({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store const { getTeamspaceById } = useTeamspaces(); - if (!teamspaceId) { - return <>; - } - // derived values - const teamspace = getTeamspaceById(teamspaceId.toString()); + const teamspace = getTeamspaceById(teamspaceId); const pageTitle = teamspace?.name ? `${teamspace?.name} - Issues` : undefined; return ( @@ -30,6 +26,6 @@ const TeamspaceWorkItemsPage = observer(() => { ); -}); +} -export default TeamspaceWorkItemsPage; +export default observer(TeamspaceWorkItemsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/layout.tsx index f70024c513..9dca592e53 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/layout.tsx @@ -1,39 +1,31 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import useSWR from "swr"; import { useTeamspaces, useTeamspaceViews } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function TeamspaceDetailLayout() { +export default function TeamspaceDetailLayout({ params }: Route.ComponentProps) { // router - const { workspaceSlug: routerWorkspaceSlug, teamspaceId: routerTeamSpaceId } = useParams(); + const { workspaceSlug, teamspaceId } = params; // store hooks const { isCurrentUserMemberOfTeamspace, fetchTeamspaceDetails } = useTeamspaces(); const { fetchTeamspaceViews } = useTeamspaceViews(); // derived values - const workspaceSlug = routerWorkspaceSlug!.toString(); - const teamspaceId = routerTeamSpaceId!.toString(); const isTeamspaceMember = isCurrentUserMemberOfTeamspace(teamspaceId); // fetching teamspace details useSWR( - workspaceSlug && teamspaceId && isTeamspaceMember - ? `WORKSPACE_TEAMSPACES_${workspaceSlug}_${teamspaceId}_${isTeamspaceMember}` - : null, - workspaceSlug && teamspaceId && isTeamspaceMember ? () => fetchTeamspaceDetails(workspaceSlug, teamspaceId) : null, + isTeamspaceMember ? `WORKSPACE_TEAMSPACES_${workspaceSlug}_${teamspaceId}_${isTeamspaceMember}` : null, + isTeamspaceMember ? () => fetchTeamspaceDetails(workspaceSlug, teamspaceId) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch teamspace views - useSWR( - workspaceSlug && teamspaceId ? ["teamspaceViews", workspaceSlug, teamspaceId] : null, - () => (workspaceSlug && teamspaceId ? fetchTeamspaceViews(workspaceSlug, teamspaceId) : null), - { - revalidateOnFocus: false, - revalidateIfStale: false, - } - ); + useSWR(["teamspaceViews", workspaceSlug, teamspaceId], () => fetchTeamspaceViews(workspaceSlug, teamspaceId), { + revalidateOnFocus: false, + revalidateIfStale: false, + }); return ; } diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(detail)/[pageId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(detail)/[pageId]/page.tsx index d1b27914aa..e91c46cf1b 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(detail)/[pageId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(detail)/[pageId]/page.tsx @@ -3,7 +3,6 @@ import { useCallback, useMemo } from "react"; import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import useSWR from "swr"; // plane types import { getButtonStyling } from "@plane/propel/button"; @@ -28,34 +27,32 @@ import { EPageStoreType, usePage, usePageStore } from "@/plane-web/hooks/store"; import { WorkspaceService } from "@/plane-web/services"; import { TeamspacePageVersionService } from "@/plane-web/services/teamspace/teamspace-page-version.service"; import { TeamspacePageService } from "@/plane-web/services/teamspace/teamspace-pages.service"; +import type { Route } from "./+types/page"; const workspaceService = new WorkspaceService(); const teamspacePageService = new TeamspacePageService(); const teamspacePageVersionService = new TeamspacePageVersionService(); const storeType = EPageStoreType.TEAMSPACE; -const TeamspacePageDetailsPage = observer(() => { - const { workspaceSlug: routerWorkspaceSlug, teamspaceId: routerTeamSpaceId, pageId: routerPageId } = useParams(); - const workspaceSlug = routerWorkspaceSlug?.toString(); - const teamspaceId = routerTeamSpaceId?.toString(); - const pageId = routerPageId?.toString(); +function TeamspacePageDetailsPage({ params }: Route.ComponentProps) { + const { workspaceSlug, teamspaceId, pageId } = params; // store hooks const { createPage, fetchPageDetails } = usePageStore(storeType); const page = usePage({ - pageId: pageId?.toString() ?? "", + pageId, storeType, }); const { getWorkspaceBySlug } = useWorkspace(); const { uploadEditorAsset } = useEditorAsset(); // derived values - const workspaceId = workspaceSlug ? (getWorkspaceBySlug(workspaceSlug)?.id ?? "") : ""; + const workspaceId = getWorkspaceBySlug(workspaceSlug)?.id ?? ""; const { id, name, updateDescription } = page ?? {}; // entity search handler const fetchEntityCallback = useCallback( async (payload: TSearchEntityRequestPayload) => - await workspaceService.searchEntity(workspaceSlug?.toString() ?? "", { + await workspaceService.searchEntity(workspaceSlug, { ...payload, - team_id: teamspaceId?.toString() ?? "", + team_id: teamspaceId, }), [teamspaceId, workspaceSlug] ); @@ -63,8 +60,8 @@ const TeamspacePageDetailsPage = observer(() => { const { getEditorFileHandlers } = useEditorConfig(); // fetch page details const { error: pageDetailsError } = useSWR( - workspaceSlug && teamspaceId && pageId ? `TEAM_PAGE_DETAILS_${pageId}` : null, - workspaceSlug && teamspaceId && pageId ? () => fetchPageDetails(teamspaceId, pageId) : null, + `TEAM_PAGE_DETAILS_${pageId}`, + () => fetchPageDetails(teamspaceId, pageId), { revalidateIfStale: true, revalidateOnFocus: true, @@ -75,23 +72,17 @@ const TeamspacePageDetailsPage = observer(() => { const pageRootHandlers: TPageRootHandlers = useMemo( () => ({ create: createPage, - fetchAllVersions: async (pageId) => { - if (!workspaceSlug || !teamspaceId) return; - return await teamspacePageVersionService.fetchAllVersions(workspaceSlug, teamspaceId, pageId); - }, + fetchAllVersions: async (pageId) => + await teamspacePageVersionService.fetchAllVersions(workspaceSlug, teamspaceId, pageId), fetchDescriptionBinary: async () => { - if (!workspaceSlug || !teamspaceId || !id) return; + if (!id) return; return await teamspacePageService.fetchDescriptionBinary(workspaceSlug, teamspaceId, id); }, fetchEntity: fetchEntityCallback, - fetchVersionDetails: async (pageId, versionId) => { - if (!workspaceSlug || !teamspaceId) return; - return await teamspacePageVersionService.fetchVersionById(workspaceSlug, teamspaceId, pageId, versionId); - }, - restoreVersion: async (pageId, versionId) => { - if (!workspaceSlug || !teamspaceId) return; - return await teamspacePageVersionService.restoreVersion(workspaceSlug, teamspaceId, pageId, versionId); - }, + fetchVersionDetails: async (pageId, versionId) => + await teamspacePageVersionService.fetchVersionById(workspaceSlug, teamspaceId, pageId, versionId), + restoreVersion: async (pageId, versionId) => + await teamspacePageVersionService.restoreVersion(workspaceSlug, teamspaceId, pageId, versionId), getRedirectionLink: (pageId) => { if (pageId) { return `/${workspaceSlug}/teamspaces/${teamspaceId}/pages/${pageId}`; @@ -179,6 +170,6 @@ const TeamspacePageDetailsPage = observer(() => { ); -}); +} -export default TeamspacePageDetailsPage; +export default observer(TeamspacePageDetailsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/layout.tsx index ffdf35e768..6e1690ce68 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/layout.tsx @@ -1,6 +1,5 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ETeamspaceNavigationItem } from "@plane/constants"; // components @@ -11,13 +10,14 @@ import { PageHead } from "@/components/core/page-title"; import { TeamspaceDetailHeader } from "@/plane-web/components/teamspaces/headers/detail-header"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function TeamspacePagesLayout() { - const { teamspaceId } = useParams(); +export default function TeamspacePagesLayout({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store hooks const { getTeamspaceById } = useTeamspaces(); // derived values - const currentTeam = getTeamspaceById(teamspaceId?.toString()); + const currentTeam = getTeamspaceById(teamspaceId); const pageTitle = currentTeam?.name ? `Teamspace ${currentTeam?.name} - Pages` : undefined; return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/page.tsx index a2a706b953..bdf2a5242d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/(list)/page.tsx @@ -1,43 +1,30 @@ "use client"; -import { observer } from "mobx-react"; -import { useParams, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; // plane imports import type { TPageNavigationTabs } from "@plane/types"; // components -import { PageHead } from "@/components/core/page-title"; // plane web imports import { TeamspacePagesListView } from "@/plane-web/components/teamspaces/pages/pages-list-view"; -import { EPageStoreType, usePageStore, useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const storeType = EPageStoreType.TEAMSPACE; +const getPageType = (pageType: string | null): TPageNavigationTabs => { + switch (pageType) { + case "archived": + return "archived"; + default: + return "public"; + } +}; -const TeamspacePagesPage = observer(() => { - const { workspaceSlug: routerWorkspaceSlug, teamspaceId: routerTeamSpaceId } = useParams(); +function TeamspacePagesPage({ params }: Route.ComponentProps) { + const { workspaceSlug, teamspaceId } = params; const searchParams = useSearchParams(); - const workspaceSlug = routerWorkspaceSlug!.toString(); - const teamspaceId = routerTeamSpaceId!.toString(); - - // store hooks - const { getTeamspaceById } = useTeamspaces(); - - // derived values - const currentTeamspace = getTeamspaceById(teamspaceId); - const pageTitle = currentTeamspace?.name ? `Teamspace ${currentTeamspace?.name} - Pages` : undefined; - - if (!workspaceSlug || !teamspaceId) return <>; - // Get current page type (only public/archived for teamspaces) - const currentPageType = (): TPageNavigationTabs => { - const pageType = searchParams.get("type"); - if (pageType === "archived") return "archived"; - return "public"; // Default to public - }; + const pageType = getPageType(searchParams.get("type")); - return ( - - ); -}); + return ; +} export default TeamspacePagesPage; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/layout.tsx index 7584402b8a..2482f9de9c 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/pages/layout.tsx @@ -1,23 +1,19 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import useSWR from "swr"; // plane web hooks import { EPageStoreType, usePageStore } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function TeamspacePagesLayout() { - const { workspaceSlug, teamspaceId } = useParams(); +export default function TeamspacePagesLayout({ params }: Route.ComponentProps) { + const { workspaceSlug, teamspaceId } = params; // store hooks const { fetchPagesList } = usePageStore(EPageStoreType.TEAMSPACE); // fetch teamspace pages - useSWR( - workspaceSlug && teamspaceId ? ["teamspacePages", workspaceSlug, teamspaceId] : null, - () => (workspaceSlug && teamspaceId ? fetchPagesList(workspaceSlug.toString(), teamspaceId.toString()) : null), - { - revalidateOnFocus: false, - revalidateIfStale: false, - } - ); + useSWR(["teamspacePages", workspaceSlug, teamspaceId], () => fetchPagesList(workspaceSlug, teamspaceId), { + revalidateOnFocus: false, + revalidateIfStale: false, + }); return ; } diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(detail)/[projectId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(detail)/[projectId]/page.tsx index 59d2894264..302e4b5f29 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(detail)/[projectId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(detail)/[projectId]/page.tsx @@ -1,25 +1,20 @@ "use client"; -import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // components import { PageHead } from "@/components/core/page-title"; // plane web components import { TeamspaceProjectWorkLayoutRoot } from "@/plane-web/components/issues/issue-layouts/roots/teamspace-project-root"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const TeamspaceProjectDetailPage = observer(() => { - const { teamspaceId } = useParams(); +function TeamspaceProjectDetailPage({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store const { getTeamspaceById } = useTeamspaces(); - if (!teamspaceId) { - return <>; - } - // derived values - const teamspace = getTeamspaceById(teamspaceId.toString()); + const teamspace = getTeamspaceById(teamspaceId); const pageTitle = teamspace?.name ? `${teamspace?.name} - Work items` : undefined; return ( @@ -30,6 +25,6 @@ const TeamspaceProjectDetailPage = observer(() => { ); -}); +} export default TeamspaceProjectDetailPage; diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/layout.tsx index ad26d93bb8..64d764a9b7 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/layout.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ETeamspaceNavigationItem } from "@plane/constants"; // components @@ -12,13 +11,14 @@ import { PageHead } from "@/components/core/page-title"; import { TeamspaceDetailHeader } from "@/plane-web/components/teamspaces/headers/detail-header"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -const TeamspaceProjectsLayout = observer(() => { - const { teamspaceId } = useParams(); +function TeamspaceProjectsLayout({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store hooks const { getTeamspaceById } = useTeamspaces(); // derived values - const currentTeam = getTeamspaceById(teamspaceId?.toString()); + const currentTeam = getTeamspaceById(teamspaceId); const pageTitle = currentTeam?.name ? `Teamspace ${currentTeam?.name} - Projects` : undefined; return ( @@ -30,6 +30,6 @@ const TeamspaceProjectsLayout = observer(() => { ); -}); +} -export default TeamspaceProjectsLayout; +export default observer(TeamspaceProjectsLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/page.tsx index 1cd557530f..eaa51cae3f 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/projects/(list)/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { useTheme } from "next-themes"; // plane imports import useSWR from "swr"; @@ -19,9 +18,10 @@ import { TeamspaceProjectsWithGroupingRoot } from "@/plane-web/components/teamsp import { TeamspaceProjectsWithoutGroupingRoot } from "@/plane-web/components/teamspaces/projects/non-grouping-root"; import { useFlag, useTeamspaces, useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const TeamspaceProjectsPage = observer(() => { - const { workspaceSlug, teamspaceId } = useParams(); +function TeamspaceProjectsPage({ params }: Route.ComponentProps) { + const { workspaceSlug, teamspaceId } = params; // plane hooks const { t } = useTranslation(); // theme hook @@ -31,19 +31,18 @@ const TeamspaceProjectsPage = observer(() => { const { getTeamspaceById, getTeamspaceProjectIds } = useTeamspaces(); const { isWorkspaceFeatureEnabled } = useWorkspaceFeatures(); // derived values - const teamspace = teamspaceId ? getTeamspaceById(teamspaceId.toString()) : undefined; - const teamspaceProjectIds = teamspaceId ? getTeamspaceProjectIds(teamspaceId.toString()) : undefined; + const teamspace = getTeamspaceById(teamspaceId); + const teamspaceProjectIds = getTeamspaceProjectIds(teamspaceId); const pageTitle = teamspace?.name ? `${teamspace?.name} - Projects` : undefined; + const isProjectGroupingFlagEnabled = useFlag(workspaceSlug.toString(), "PROJECT_GROUPING"); const isProjectGroupingEnabled = - isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && - useFlag(workspaceSlug.toString(), "PROJECT_GROUPING"); + isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED) && isProjectGroupingFlagEnabled; const resolvedPath = resolvedTheme === "light" ? teamsLight : teamsDark; // fetching workspace projects - useSWR( - workspaceSlug ? `WORKSPACE_PROJECTS_${workspaceSlug}` : null, - workspaceSlug ? () => fetchProjects(workspaceSlug.toString()) : null, - { revalidateIfStale: false, revalidateOnFocus: false } - ); + useSWR(`WORKSPACE_PROJECTS_${workspaceSlug}`, () => fetchProjects(workspaceSlug), { + revalidateIfStale: false, + revalidateOnFocus: false, + }); if (teamspaceProjectIds?.length === 0) { return ( @@ -60,12 +59,12 @@ const TeamspaceProjectsPage = observer(() => { <> {isProjectGroupingEnabled ? ( - + ) : ( - + )} ); -}); +} -export default TeamspaceProjectsPage; +export default observer(TeamspaceProjectsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(detail)/[viewId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(detail)/[viewId]/page.tsx index cade13d95e..0bd5b81a7b 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(detail)/[viewId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(detail)/[viewId]/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import useSWR from "swr"; // assets import emptyView from "@/app/assets/empty-state/view.svg?url"; @@ -14,24 +13,22 @@ import { useAppRouter } from "@/hooks/use-app-router"; import { TeamspaceViewLayoutRoot } from "@/plane-web/components/issues/issue-layouts/roots/teamspace-view-layout-root"; // plane web hooks import { useTeamspaces, useTeamspaceViews } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const TeamspaceViewWorkItemsPage = observer(() => { +function TeamspaceViewWorkItemsPage({ params }: Route.ComponentProps) { // router const router = useAppRouter(); - const { workspaceSlug, teamspaceId, viewId } = useParams(); + const { workspaceSlug, teamspaceId, viewId } = params; // store hooks const { getTeamspaceById } = useTeamspaces(); const { fetchTeamspaceViewDetails, getViewById } = useTeamspaceViews(); // derived values - const teamspaceView = teamspaceId && viewId ? getViewById(teamspaceId.toString(), viewId.toString()) : undefined; - const teamspace = teamspaceId ? getTeamspaceById(teamspaceId.toString()) : undefined; + const teamspaceView = getViewById(teamspaceId, viewId); + const teamspace = getTeamspaceById(teamspaceId); const pageTitle = teamspace?.name && teamspaceView?.name ? `${teamspace?.name} - ${teamspaceView?.name}` : undefined; // fetch teamspace view details - const { error } = useSWR( - workspaceSlug && teamspaceId && viewId ? `TEAMSPACE_VIEW_DETAILS_${viewId.toString()}` : null, - workspaceSlug && teamspaceId && viewId - ? () => fetchTeamspaceViewDetails(workspaceSlug.toString(), teamspaceId.toString(), viewId.toString()) - : null + const { error } = useSWR(`TEAMSPACE_VIEW_DETAILS_${viewId}`, () => + fetchTeamspaceViewDetails(workspaceSlug, teamspaceId, viewId) ); if (error) { @@ -54,6 +51,6 @@ const TeamspaceViewWorkItemsPage = observer(() => { ); -}); +} -export default TeamspaceViewWorkItemsPage; +export default observer(TeamspaceViewWorkItemsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/layout.tsx index 34ab1314cd..ba7ddbf047 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/layout.tsx @@ -1,6 +1,5 @@ "use client"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ETeamspaceNavigationItem } from "@plane/constants"; // components @@ -11,13 +10,14 @@ import { PageHead } from "@/components/core/page-title"; import { TeamspaceDetailHeader } from "@/plane-web/components/teamspaces/headers/detail-header"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/layout"; -export default function TeamspaceViewsLayout() { - const { teamspaceId } = useParams(); +export default function TeamspaceViewsLayout({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store hooks const { getTeamspaceById } = useTeamspaces(); // derived values - const currentTeam = getTeamspaceById(teamspaceId?.toString()); + const currentTeam = getTeamspaceById(teamspaceId); const pageTitle = currentTeam?.name ? `Teamspace ${currentTeam?.name} - Views` : undefined; return ( diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/page.tsx index 7df28df8a7..e54cb69c4f 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(detail)/[teamspaceId]/views/(list)/page.tsx @@ -2,7 +2,6 @@ import { useCallback } from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import type { EViewAccess, TViewFilterProps } from "@plane/types"; import { calculateTotalFilters } from "@plane/utils"; @@ -11,11 +10,10 @@ import { ViewAppliedFiltersList } from "@/components/views/applied-filters"; // plane web imports import { TeamspaceViewsList } from "@/plane-web/components/teamspaces/views/views-list"; import { useTeamspaceViews } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const TeamspaceViewsPage = observer(() => { - const { workspaceSlug: routerWorkspaceSlug, teamspaceId: routerTeamSpaceId } = useParams(); - const workspaceSlug = routerWorkspaceSlug!.toString(); - const teamspaceId = routerTeamSpaceId!.toString(); +function TeamspaceViewsPage({ params }: Route.ComponentProps) { + const { teamspaceId } = params; // store hooks const { getTeamspaceViewsFilters, updateFilters, clearAllFilters } = useTeamspaceViews(); // derived values @@ -43,8 +41,6 @@ const TeamspaceViewsPage = observer(() => { [teamspaceId, teamspaceViewsFilters?.filters, updateFilters] ); - if (!workspaceSlug || !teamspaceId) return <>; - return (
{isFiltersApplied && ( @@ -62,6 +58,6 @@ const TeamspaceViewsPage = observer(() => {
); -}); +} -export default TeamspaceViewsPage; +export default observer(TeamspaceViewsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(list)/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(list)/page.tsx index fc823a43f7..1d81f57811 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(list)/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/(list)/page.tsx @@ -4,6 +4,8 @@ import { observer } from "mobx-react"; // plane web components import TeamspacesListRoot from "@/plane-web/components/teamspaces/list/root"; -const TeamspacesListPage = observer(() => ); +function TeamspacesListPage() { + return ; +} -export default TeamspacesListPage; +export default observer(TeamspacesListPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/layout.tsx index 624cf25687..e1269940df 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(projects)/teamspaces/layout.tsx @@ -11,7 +11,7 @@ import { TeamspaceUpgrade } from "@/plane-web/components/teamspaces/upgrade"; // plane web hooks import { useTeamspaces } from "@/plane-web/hooks/store"; -const TeamspacesLayout = observer(() => { +function TeamspacesLayout() { // store const { currentWorkspace } = useWorkspace(); // plane web stores @@ -35,6 +35,6 @@ const TeamspacesLayout = observer(() => { )}
); -}); +} -export default TeamspacesLayout; +export default observer(TeamspacesLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/customers/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/customers/page.tsx index 3a5fc2321a..d3f6f7d172 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/customers/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/customers/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -23,10 +21,11 @@ import { CustomerUpgrade, CustomerSettingsRoot } from "@/plane-web/components/cu import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { useCustomers, useFlag, useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const CustomerSettingsPage = observer(() => { +function CustomerSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { getWorkspaceRoleByWorkspaceSlug } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); @@ -35,50 +34,46 @@ const CustomerSettingsPage = observer(() => { const { t } = useTranslation(); // derived values - const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString()); + const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Customers` : undefined; const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; const { isCustomersFeatureEnabled } = useCustomers(); - const isFeatureFlagEnabled = useFlag(workspaceSlug?.toString(), E_FEATURE_FLAGS.CUSTOMERS); + const isFeatureFlagEnabled = useFlag(workspaceSlug, E_FEATURE_FLAGS.CUSTOMERS); - if (!workspaceSlug || !currentWorkspace?.id) return <>; + if (!currentWorkspace?.id) return <>; if (!isAdmin) return ; const toggleCustomersFeature = async () => { try { - try { - const payload = { - [EWorkspaceFeatures.IS_CUSTOMERS_ENABLED]: !isCustomersFeatureEnabled, - }; - const toggleCustomersFeaturePromise = updateWorkspaceFeature(workspaceSlug.toString(), payload); - setPromiseToast(toggleCustomersFeaturePromise, { - loading: isCustomersFeatureEnabled - ? t("customers.settings.toasts.disable.loading") - : t("customers.settings.toasts.enable.loading"), - success: { - title: isCustomersFeatureEnabled - ? t("customers.settings.toasts.disable.success.title") - : t("customers.settings.toasts.enable.success.title"), - message: () => - isCustomersFeatureEnabled - ? t("customers.settings.toasts.disable.success.message") - : t("customers.settings.toasts.enable.success.message"), - }, - error: { - title: isCustomersFeatureEnabled - ? t("customers.settings.toasts.disable.error.title") - : t("customers.settings.toasts.enable.error.title"), - message: () => - isCustomersFeatureEnabled - ? t("customers.settings.toasts.disable.error.message") - : t("customers.settings.toasts.enable.error.message"), - }, - }); - await toggleCustomersFeaturePromise; - } catch (error) { - console.error(error); - } + const payload = { + [EWorkspaceFeatures.IS_CUSTOMERS_ENABLED]: !isCustomersFeatureEnabled, + }; + const toggleCustomersFeaturePromise = updateWorkspaceFeature(workspaceSlug, payload); + setPromiseToast(toggleCustomersFeaturePromise, { + loading: isCustomersFeatureEnabled + ? t("customers.settings.toasts.disable.loading") + : t("customers.settings.toasts.enable.loading"), + success: { + title: isCustomersFeatureEnabled + ? t("customers.settings.toasts.disable.success.title") + : t("customers.settings.toasts.enable.success.title"), + message: () => + isCustomersFeatureEnabled + ? t("customers.settings.toasts.disable.success.message") + : t("customers.settings.toasts.enable.success.message"), + }, + error: { + title: isCustomersFeatureEnabled + ? t("customers.settings.toasts.disable.error.title") + : t("customers.settings.toasts.enable.error.title"), + message: () => + isCustomersFeatureEnabled + ? t("customers.settings.toasts.disable.error.message") + : t("customers.settings.toasts.enable.error.message"), + }, + }); + await toggleCustomersFeaturePromise; } catch (error) { console.error(error); } @@ -101,7 +96,7 @@ const CustomerSettingsPage = observer(() => { } /> - } workspaceSlug={workspaceSlug?.toString()}> + } workspaceSlug={workspaceSlug}> { ); -}); +} -export default CustomerSettingsPage; +export default observer(CustomerSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/asana/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/asana/page.tsx index fe9e7fdeb8..9327ab8c46 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/asana/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/asana/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -11,7 +10,7 @@ import { AsanaDashboardRoot } from "@/plane-web/components/importers/asana/dashb import { DashboardLoaderRoot } from "@/plane-web/components/importers/common/dashboard"; import { useAsanaImporter } from "@/plane-web/hooks/store"; -const AsanaImporter: FC = observer(() => { +function AsanaImporter() { const { user, workspace, @@ -78,6 +77,6 @@ const AsanaImporter: FC = observer(() => { )} ); -}); +} -export default AsanaImporter; +export default observer(AsanaImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/clickup/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/clickup/page.tsx index b228c6efb4..eb2dc4482c 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/clickup/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/clickup/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -12,7 +11,7 @@ import { ClickUpDashboardRoot } from "@/plane-web/components/importers/clickup/d import { DashboardLoaderRoot } from "@/plane-web/components/importers/common/dashboard"; import { useClickUpImporter, useFlag } from "@/plane-web/hooks/store"; -const ClickUpImporter: FC = observer(() => { +function ClickUpImporter() { const { user, workspace, @@ -62,6 +61,6 @@ const ClickUpImporter: FC = observer(() => { )} ); -}); +} -export default ClickUpImporter; +export default observer(ClickUpImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/confluence/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/confluence/page.tsx index 82b19eee65..97ec3a4860 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/confluence/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/confluence/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -14,14 +13,13 @@ import { useZipImporter } from "@/plane-web/hooks/store/importers/use-zip-import import type { TZipImporterProps } from "@/plane-web/types/importers/zip-importer"; import { EZipDriverType } from "@/plane-web/types/importers/zip-importer"; -const ConfluenceImporter: FC = observer(() => { +function ConfluenceImporter() { const { // Properties workspace, user, externalApiToken, dashboardView, - // Actions fetchExternalApiToken, verifyAndAddCredentials, @@ -97,6 +95,6 @@ const ConfluenceImporter: FC = observer(() => { }; return {dashboardView ? : }; -}); +} -export default ConfluenceImporter; +export default observer(ConfluenceImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/csv/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/csv/page.tsx index ef4dc750bc..b9caa0e0a0 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/csv/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/csv/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -9,14 +8,13 @@ import { FlatfileDashboardRoot } from "@/plane-web/components/importers/flatfile import { StepsRoot } from "@/plane-web/components/importers/flatfile/steps"; import { useFlatfileImporter } from "@/plane-web/hooks/store"; -const FlatfileImporter: FC = observer(() => { +function FlatfileImporter() { const { // Properties workspace, user, externalApiToken, dashboardView, - // Actions fetchProjects, fetchExternalApiToken, @@ -83,6 +81,6 @@ const FlatfileImporter: FC = observer(() => { ); return {dashboardView ? : }; -}); +} -export default FlatfileImporter; +export default observer(FlatfileImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira-server/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira-server/page.tsx index 175da38db8..3a12ba5179 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira-server/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira-server/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -10,7 +9,7 @@ import { AuthenticationRoot, JiraServerDashboardRoot, StepsRoot } from "@/plane- // plane web hooks import { useJiraServerImporter } from "@/plane-web/hooks/store"; -const JiraServerImporter: FC = observer(() => { +function JiraServerImporter() { const { user, workspace, @@ -80,6 +79,6 @@ const JiraServerImporter: FC = observer(() => { )} ); -}); +} -export default JiraServerImporter; +export default observer(JiraServerImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira/page.tsx index 106790a42a..6928f52203 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/jira/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -10,7 +9,7 @@ import { AuthenticationRoot, StepsRoot, JiraDashboardRoot } from "@/plane-web/co // plane web hooks import { useJiraImporter } from "@/plane-web/hooks/store"; -const JiraImporter: FC = observer(() => { +function JiraImporter() { const { user, workspace, @@ -80,6 +79,6 @@ const JiraImporter: FC = observer(() => { )} ); -}); +} -export default JiraImporter; +export default observer(JiraImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/layout.tsx index 3effa8ca2e..c250362dc4 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/layout.tsx @@ -2,7 +2,6 @@ import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { SILO_BASE_URL, SILO_BASE_PATH } from "@plane/constants"; import { ChevronLeftIcon } from "@plane/propel/icons"; @@ -10,10 +9,11 @@ import { ChevronLeftIcon } from "@plane/propel/icons"; import { SettingsContentWrapper } from "@/components/settings/content-wrapper"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser } from "@/hooks/store/user"; +import type { Route } from "./+types/layout"; -const ImporterLayout = observer(() => { +function ImporterLayout({ params }: Route.ComponentProps) { // router params - const { workspaceSlug: workspaceSlugParam } = useParams(); + const { workspaceSlug } = params; // hooks const { currentWorkspace } = useWorkspace(); @@ -21,12 +21,11 @@ const ImporterLayout = observer(() => { // derived values const siloBaseUrl = encodeURI(SILO_BASE_URL + SILO_BASE_PATH) || undefined; - const workspaceSlug = workspaceSlugParam?.toString() || undefined; const workspaceId = currentWorkspace?.id || undefined; const userId = currentUser?.id || undefined; // check if workspace exists - if (!workspaceSlug || !workspaceId || !userId || !siloBaseUrl) return null; + if (!workspaceId || !userId || !siloBaseUrl) return null; return ( @@ -40,6 +39,6 @@ const ImporterLayout = observer(() => { ); -}); +} -export default ImporterLayout; +export default observer(ImporterLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/linear/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/linear/page.tsx index 591578f10e..2b5febe3df 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/linear/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/linear/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -11,7 +10,7 @@ import { AuthenticationRoot, StepsRoot } from "@/plane-web/components/importers/ import { LinearDashboardRoot } from "@/plane-web/components/importers/linear/dashboard/root"; import { useLinearImporter } from "@/plane-web/hooks/store"; -const LinearImporter: FC = observer(() => { +function LinearImporter() { const { user, workspace, @@ -81,6 +80,6 @@ const LinearImporter: FC = observer(() => { )} ); -}); +} -export default LinearImporter; +export default observer(LinearImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/notion/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/notion/page.tsx index defaffb3dc..0a86c502fd 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/notion/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/(importers)/notion/page.tsx @@ -1,6 +1,5 @@ "use client"; -import type { FC } from "react"; import { Fragment, useEffect } from "react"; import { observer } from "mobx-react"; import useSWR from "swr"; @@ -14,14 +13,13 @@ import { useZipImporter } from "@/plane-web/hooks/store/importers/use-zip-import import type { TZipImporterProps } from "@/plane-web/types/importers/zip-importer"; import { EZipDriverType } from "@/plane-web/types/importers/zip-importer"; -const NotionImporter: FC = observer(() => { +function NotionImporter() { const { // Properties workspace, user, externalApiToken, dashboardView, - // Actions fetchProjects, fetchExternalApiToken, @@ -105,6 +103,6 @@ const NotionImporter: FC = observer(() => { }; return {dashboardView ? : }; -}); +} -export default NotionImporter; +export default observer(NotionImporter); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/page.tsx index 8b83df5cb0..7919f0d1cd 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/imports/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; // components @@ -15,10 +14,11 @@ import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUserPermissions } from "@/hooks/store/user"; // plane web components import { ImportersList } from "@/plane-web/components/importers"; +import type { Route } from "./+types/page"; -function ImportsPage() { +function ImportsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { currentWorkspace } = useWorkspace(); const { allowPermissions } = useUserPermissions(); @@ -37,7 +37,7 @@ function ImportsPage() { title={t("workspace_settings.settings.imports.heading")} description={t("workspace_settings.settings.imports.description")} /> - {workspaceSlug && } + ); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/initiatives/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/initiatives/page.tsx index 394e37e56e..6e3e4e5640 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/initiatives/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/initiatives/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { INITIATIVE_TRACKER_EVENTS, INITIATIVES_TRACKER_ELEMENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -25,10 +24,11 @@ import { InitiativeLabelList } from "@/plane-web/components/initiatives/componen import { InitiativesUpgrade } from "@/plane-web/components/initiatives/upgrade"; import { useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const InitiativesSettingsPage = observer(() => { +function InitiativesSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { getWorkspaceRoleByWorkspaceSlug } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); @@ -36,12 +36,12 @@ const InitiativesSettingsPage = observer(() => { const { t } = useTranslation(); // derived values - const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString()); + const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Initiatives` : undefined; const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; const isInitiativesFeatureEnabled = isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_INITIATIVES_ENABLED); - if (!workspaceSlug || !currentWorkspace?.id) return <>; + if (!currentWorkspace?.id) return <>; if (!isAdmin) return ; @@ -53,7 +53,7 @@ const InitiativesSettingsPage = observer(() => { const payload = { [EWorkspaceFeatures.IS_INITIATIVES_ENABLED]: !isInitiativesFeatureEnabled, }; - const toggleInitiativesFeaturePromise = updateWorkspaceFeature(workspaceSlug.toString(), payload); + const toggleInitiativesFeaturePromise = updateWorkspaceFeature(workspaceSlug, payload); setPromiseToast(toggleInitiativesFeaturePromise, { loading: t("project_settings.initiatives.toast.updating"), success: { @@ -95,8 +95,8 @@ const InitiativesSettingsPage = observer(() => { /> } - workspaceSlug={workspaceSlug?.toString()} + fallback={} + workspaceSlug={workspaceSlug} >
@@ -120,6 +120,6 @@ const InitiativesSettingsPage = observer(() => {
); -}); +} -export default InitiativesSettingsPage; +export default observer(InitiativesSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github-enterprise/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github-enterprise/page.tsx index f7dc72e1e1..749bd6277d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github-enterprise/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github-enterprise/page.tsx @@ -1,9 +1,9 @@ "use client"; -import type { FC } from "react"; import { useEffect } from "react"; import { observer } from "mobx-react"; import Image from "next/image"; +import { useSearchParams } from "next/navigation"; import { useTheme } from "next-themes"; import useSWR from "swr"; // plane web components components @@ -23,8 +23,9 @@ import { SiloAppService } from "@/plane-web/services/integrations/silo.service"; const siloAppService = new SiloAppService(); -const GitHubEnterpriseIntegration: FC<{ searchParams?: { error: string } }> = observer(({ searchParams }) => { +function GitHubEnterpriseIntegration() { // hooks + const searchParams = useSearchParams(); const { resolvedTheme } = useTheme(); const { workspace, @@ -64,7 +65,7 @@ const GitHubEnterpriseIntegration: FC<{ searchParams?: { error: string } }> = ob ); // error message - const errorCode = searchParams?.error; + const errorCode = searchParams?.get("error"); useEffect(() => { if (!errorCode) { return; @@ -133,6 +134,6 @@ const GitHubEnterpriseIntegration: FC<{ searchParams?: { error: string } }> = ob {organization && }
); -}); +} -export default GitHubEnterpriseIntegration; +export default observer(GitHubEnterpriseIntegration); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github/page.tsx index e282cb9e6d..11a9b5ef75 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/github/page.tsx @@ -1,8 +1,8 @@ "use client"; -import type { FC } from "react"; import { useEffect } from "react"; import { observer } from "mobx-react"; +import { useSearchParams } from "next/navigation"; import useSWR from "swr"; // plane web components components import { Cloud } from "lucide-react"; @@ -20,7 +20,8 @@ import { SiloAppService } from "@/plane-web/services/integrations/silo.service"; const siloAppService = new SiloAppService(); -const GitHubIntegration: FC<{ searchParams?: { error: string } }> = observer(({ searchParams }) => { +function GitHubIntegration() { + const searchParams = useSearchParams(); // hooks const { workspace, @@ -58,7 +59,7 @@ const GitHubIntegration: FC<{ searchParams?: { error: string } }> = observer(({ ); // error message - const errorCode = searchParams?.error; + const errorCode = searchParams.get("error"); useEffect(() => { if (!errorCode) { return; @@ -135,6 +136,6 @@ const GitHubIntegration: FC<{ searchParams?: { error: string } }> = observer(({ {organization && } ); -}); +} -export default GitHubIntegration; +export default observer(GitHubIntegration); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab-enterprise/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab-enterprise/page.tsx index c67772260c..3bd458f6b2 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab-enterprise/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab-enterprise/page.tsx @@ -1,8 +1,8 @@ "use client"; -import type { FC } from "react"; import { useEffect } from "react"; import { observer } from "mobx-react"; +import { useSearchParams } from "next/navigation"; import useSWR from "swr"; // plane web components components import { Cloud } from "lucide-react"; @@ -20,8 +20,9 @@ import { SiloAppService } from "@/plane-web/services/integrations/silo.service"; const siloAppService = new SiloAppService(); -const GitlabEnterpriseIntegration: FC<{ searchParams?: { error: string } }> = observer(({ searchParams }) => { +function GitlabEnterpriseIntegration() { // hooks + const searchParams = useSearchParams(); const { workspace, externalApiToken, @@ -59,7 +60,7 @@ const GitlabEnterpriseIntegration: FC<{ searchParams?: { error: string } }> = ob ); // error message - const errorCode = searchParams?.error; + const errorCode = searchParams.get("error"); useEffect(() => { if (!errorCode) { return; @@ -137,6 +138,6 @@ const GitlabEnterpriseIntegration: FC<{ searchParams?: { error: string } }> = ob {organization && } ); -}); +} -export default GitlabEnterpriseIntegration; +export default observer(GitlabEnterpriseIntegration); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab/page.tsx index 883f34115c..314000d89a 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/gitlab/page.tsx @@ -1,8 +1,8 @@ "use client"; -import type { FC } from "react"; import { useEffect } from "react"; import { observer } from "mobx-react"; +import { useSearchParams } from "next/navigation"; import useSWR from "swr"; // plane web components components import { Cloud } from "lucide-react"; @@ -20,8 +20,9 @@ import { SiloAppService } from "@/plane-web/services/integrations/silo.service"; const siloAppService = new SiloAppService(); -const GitlabIntegration: FC<{ searchParams?: { error: string } }> = observer(({ searchParams }) => { +function GitlabIntegration() { // hooks + const searchParams = useSearchParams(); const { workspace, externalApiToken, @@ -58,7 +59,7 @@ const GitlabIntegration: FC<{ searchParams?: { error: string } }> = observer(({ ); // error message - const errorCode = searchParams?.error; + const errorCode = searchParams.get("error"); useEffect(() => { if (!errorCode) { return; @@ -136,6 +137,6 @@ const GitlabIntegration: FC<{ searchParams?: { error: string } }> = observer(({ {organization && } ); -}); +} -export default GitlabIntegration; +export default observer(GitlabIntegration); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/layout.tsx index 7b701a4d5b..fc3704be8b 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/layout.tsx @@ -2,7 +2,6 @@ import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ChevronLeftIcon } from "lucide-react"; import { SILO_BASE_URL, SILO_BASE_PATH, E_FEATURE_FLAGS } from "@plane/constants"; @@ -12,10 +11,11 @@ import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser, useUserProfile } from "@/hooks/store/user"; import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { IntegrationsEmptyState } from "@/plane-web/components/integrations"; +import type { Route } from "./+types/layout"; -const IntegrationLayout = observer(() => { +function IntegrationLayout({ params }: Route.ComponentProps) { // router params - const { workspaceSlug: workspaceSlugParam } = useParams(); + const { workspaceSlug } = params; // hooks const { currentWorkspace } = useWorkspace(); @@ -24,12 +24,11 @@ const IntegrationLayout = observer(() => { // derived values const siloBaseUrl = encodeURI(SILO_BASE_URL + SILO_BASE_PATH) || undefined; - const workspaceSlug = workspaceSlugParam?.toString() || undefined; const workspaceId = currentWorkspace?.id || undefined; const userId = currentUser?.id || undefined; // check if workspace exists - if (!workspaceSlug || !workspaceId || !userId || !siloBaseUrl) return null; + if (!workspaceId || !userId || !siloBaseUrl) return null; return ( { ); -}); +} -export default IntegrationLayout; +export default observer(IntegrationLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/sentry/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/sentry/page.tsx index da74b55bfc..8fddccb41b 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/sentry/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/sentry/page.tsx @@ -1,9 +1,8 @@ "use client"; -import type { FC } from "react"; import { useEffect } from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; import useSWR from "swr"; import { Cloud } from "lucide-react"; // plane web components @@ -17,14 +16,16 @@ import { SentryIntegrationRoot } from "@/plane-web/components/integrations/sentr import { useFlag, useWorkspaceSubscription } from "@/plane-web/hooks/store"; // plane web constants import { SiloAppService } from "@/plane-web/services/integrations/silo.service"; +import type { Route } from "./+types/page"; const siloAppService = new SiloAppService(); -const SentryIntegration: FC<{ searchParams?: { error: string } }> = observer(({ searchParams }) => { +function SentryIntegration({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; + const searchParams = useSearchParams(); // derived values - const isFeatureEnabled = useFlag(workspaceSlug?.toString(), "SENTRY_INTEGRATION"); + const isFeatureEnabled = useFlag(workspaceSlug, "SENTRY_INTEGRATION"); const { currentWorkspaceSubscribedPlanDetail: subscriptionDetail } = useWorkspaceSubscription(); // derived values @@ -41,7 +42,7 @@ const SentryIntegration: FC<{ searchParams?: { error: string } }> = observer(({ const { t } = useTranslation(); // error message - const errorCode = searchParams?.error; + const errorCode = searchParams.get("error"); useEffect(() => { if (!errorCode) { return; @@ -103,6 +104,6 @@ const SentryIntegration: FC<{ searchParams?: { error: string } }> = observer(({ )} ); -}); +} -export default SentryIntegration; +export default observer(SentryIntegration); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/slack/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/slack/page.tsx index 8fc3688fad..b1756ce66a 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/slack/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/(integrations)/slack/page.tsx @@ -1,9 +1,8 @@ "use client"; -import type { FC } from "react"; import { useEffect } from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; import useSWR from "swr"; import { Cloud } from "lucide-react"; // plane web components @@ -19,16 +18,18 @@ import { useFlag, useWorkspaceSubscription } from "@/plane-web/hooks/store"; // plane web constants import { useSlackIntegration } from "@/plane-web/hooks/store/integrations/use-slack"; import { SiloAppService } from "@/plane-web/services/integrations/silo.service"; +import type { Route } from "./+types/page"; const siloAppService = new SiloAppService(); -const SlackIntegration: FC<{ searchParams?: { error: string } }> = observer(({ searchParams }) => { +function SlackIntegration({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; + const searchParams = useSearchParams(); // store hooks const { fetchExternalApiToken, externalApiToken } = useSlackIntegration(); // derived values - const isFeatureEnabled = useFlag(workspaceSlug?.toString(), E_FEATURE_FLAGS.SLACK_INTEGRATION) || false; + const isFeatureEnabled = useFlag(workspaceSlug, E_FEATURE_FLAGS.SLACK_INTEGRATION) || false; const { currentWorkspaceSubscribedPlanDetail: subscriptionDetail } = useWorkspaceSubscription(); // derived values @@ -46,13 +47,13 @@ const SlackIntegration: FC<{ searchParams?: { error: string } }> = observer(({ s // fetching external api token const { isLoading: externalApiTokenIsLoading } = useSWR( - workspaceSlug && !externalApiToken ? `IMPORTER_EXTERNAL_SERVICE_TOKEN` : null, - workspaceSlug && !externalApiToken ? async () => fetchExternalApiToken(workspaceSlug?.toString()) : null, + !externalApiToken ? `IMPORTER_EXTERNAL_SERVICE_TOKEN` : null, + !externalApiToken ? async () => fetchExternalApiToken(workspaceSlug) : null, { errorRetryCount: 0 } ); // error message - const errorCode = searchParams?.error; + const errorCode = searchParams.get("error"); useEffect(() => { if (!errorCode) { return; @@ -130,6 +131,6 @@ const SlackIntegration: FC<{ searchParams?: { error: string } }> = observer(({ s )} ); -}); +} -export default SlackIntegration; +export default observer(SlackIntegration); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/edit/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/edit/page.tsx index 8408192618..6e6d78e576 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/edit/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/edit/page.tsx @@ -3,7 +3,6 @@ import { observer } from "mobx-react"; // component -import { useParams } from "next/navigation"; import useSWR from "swr"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { setToast, TOAST_TYPE } from "@plane/propel/toast"; @@ -18,26 +17,24 @@ import { useUserPermissions } from "@/hooks/store/user"; // plane web components import { CreateUpdateApplication } from "@/plane-web/components/marketplace"; import { useApplications } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const ApplicationEditPage = observer(() => { +function ApplicationEditPage({ params }: Route.ComponentProps) { // store hooks const { workspaceUserInfo, allowPermissions } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); - const { appSlug } = useParams(); + const { appSlug } = params; const { updateApplication, getApplicationBySlug, fetchApplication, fetchApplicationCategories } = useApplications(); // derived values const canPerformWorkspaceAdminActions = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.WORKSPACE); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Edit Application` : undefined; - const application = getApplicationBySlug(appSlug?.toString() || ""); + const application = getApplicationBySlug(appSlug); // state - const { data, isLoading } = useSWR( - appSlug ? APPLICATION_DETAILS(appSlug.toString()) : null, - appSlug ? async () => fetchApplication(appSlug.toString()) : null - ); + const { data, isLoading } = useSWR(APPLICATION_DETAILS(appSlug), () => fetchApplication(appSlug)); - useSWR(APPLICATION_CATEGORIES_LIST(), async () => fetchApplicationCategories()); + useSWR(APPLICATION_CATEGORIES_LIST(), () => fetchApplicationCategories()); const handleFormSubmit = async (data: Partial): Promise => { try { @@ -74,6 +71,6 @@ const ApplicationEditPage = observer(() => { ); -}); +} -export default ApplicationEditPage; +export default observer(ApplicationEditPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/install/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/install/page.tsx index 5221765044..1c061e2248 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/install/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/install/page.tsx @@ -3,7 +3,6 @@ import { observer } from "mobx-react"; // component -import { useParams } from "next/navigation"; import useSWR from "swr"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view"; @@ -16,23 +15,21 @@ import { useUserPermissions } from "@/hooks/store/user"; // plane web components import { ApplicationInstallationDetails } from "@/plane-web/components/marketplace/applications"; import { useApplications } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const ApplicationInstallPage: React.FC = observer(() => { +function ApplicationInstallPage({ params }: Route.ComponentProps) { // store hooks const { workspaceUserInfo, allowPermissions } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); - const { appSlug } = useParams(); + const { appSlug } = params; const { getApplicationBySlug, fetchApplication } = useApplications(); // derived values const canPerformWorkspaceAdminActions = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.WORKSPACE); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Install Application` : undefined; - const application = getApplicationBySlug(appSlug?.toString() || ""); - const { data, isLoading } = useSWR( - appSlug ? APPLICATION_DETAILS(appSlug.toString()) : null, - appSlug ? async () => fetchApplication(appSlug.toString()) : null - ); + const application = getApplicationBySlug(appSlug); + const { data, isLoading } = useSWR(APPLICATION_DETAILS(appSlug), () => fetchApplication(appSlug)); if (!data || !application || isLoading) { return ; @@ -48,6 +45,6 @@ const ApplicationInstallPage: React.FC = observer(() => { ); -}); +} -export default ApplicationInstallPage; +export default observer(ApplicationInstallPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/layout.tsx index f25b561c84..5de9e67763 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/[appSlug]/layout.tsx @@ -1,12 +1,12 @@ "use client"; import Link from "next/link"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ChevronLeftIcon } from "lucide-react"; +import type { Route } from "./+types/layout"; -const IntegrationLayout = () => { - const { workspaceSlug } = useParams(); +function IntegrationLayout({ params }: Route.ComponentProps) { + const { workspaceSlug } = params; return (
{
); -}; +} export default IntegrationLayout; diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/create/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/create/page.tsx index 8273b91805..b3fffc23db 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/create/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/integrations/create/page.tsx @@ -4,7 +4,6 @@ import { observer } from "mobx-react"; // component import Link from "next/link"; -import { useParams } from "next/navigation"; import useSWR from "swr"; import { ChevronLeftIcon } from "lucide-react"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; @@ -12,25 +11,26 @@ import { setToast, TOAST_TYPE } from "@plane/propel/toast"; import type { TUserApplication } from "@plane/types"; import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view"; import { PageHead } from "@/components/core/page-title"; -import { APPLICATION_CATEGORIES_LIST } from "@/constants/fetch-keys"; // hooks +import { APPLICATION_CATEGORIES_LIST } from "@/constants/fetch-keys"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUserPermissions } from "@/hooks/store/user"; // plane web components import { CreateUpdateApplication } from "@/plane-web/components/marketplace"; import { useApplications } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const ApplicationCreatePage = observer(() => { +function ApplicationCreatePage({ params }: Route.ComponentProps) { // store hooks const { workspaceUserInfo, allowPermissions } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); const { createApplication, fetchApplicationCategories } = useApplications(); - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // derived values const canPerformWorkspaceAdminActions = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.WORKSPACE); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Create Application` : undefined; - const { data: categories } = useSWR(APPLICATION_CATEGORIES_LIST(), async () => fetchApplicationCategories()); + useSWR(APPLICATION_CATEGORIES_LIST(), async () => fetchApplicationCategories()); const handleFormSubmit = async (data: Partial) => { try { @@ -71,6 +71,6 @@ const ApplicationCreatePage = observer(() => { ); -}); +} -export default ApplicationCreatePage; +export default observer(ApplicationCreatePage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/plane-intelligence/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/plane-intelligence/page.tsx index 9a15dd32d6..154f619948 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/plane-intelligence/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/plane-intelligence/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS, @@ -28,10 +26,11 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { PiChatUpgrade } from "@/plane-web/components/pi-chat/upgrade"; import { useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const PlaneIntelligenceSettingsPage = observer(() => { +function PlaneIntelligenceSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { getWorkspaceRoleByWorkspaceSlug } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); @@ -39,12 +38,12 @@ const PlaneIntelligenceSettingsPage = observer(() => { const { t } = useTranslation(); // derived values - const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString()); + const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Plane Intelligence` : undefined; const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; const isPlaneIntelligenceFeatureEnabled = isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PI_ENABLED); - if (!workspaceSlug || !currentWorkspace?.id) return <>; + if (!currentWorkspace?.id) return <>; if (!isAdmin) return ; @@ -56,7 +55,7 @@ const PlaneIntelligenceSettingsPage = observer(() => { const payload = { [EWorkspaceFeatures.IS_PI_ENABLED]: !isPlaneIntelligenceFeatureEnabled, }; - const toggleTeamsFeaturePromise = updateWorkspaceFeature(workspaceSlug.toString(), payload); + const toggleTeamsFeaturePromise = updateWorkspaceFeature(workspaceSlug, payload); setPromiseToast(toggleTeamsFeaturePromise, { loading: "Updating Plane Intelligence feature...", success: { @@ -72,7 +71,7 @@ const PlaneIntelligenceSettingsPage = observer(() => { captureSuccess({ eventName: PLANE_INTELLIGENCE_TRACKER_EVENTS.TOGGLE, payload: { - workspace_slug: workspaceSlug.toString(), + workspace_slug: workspaceSlug, type: isPlaneIntelligenceFeatureEnabled ? "disable" : "enable", }, }); @@ -81,7 +80,7 @@ const PlaneIntelligenceSettingsPage = observer(() => { captureError({ eventName: PLANE_INTELLIGENCE_TRACKER_EVENTS.TOGGLE, payload: { - workspace_slug: workspaceSlug.toString(), + workspace_slug: workspaceSlug, type: isPlaneIntelligenceFeatureEnabled ? "disable" : "enable", }, }); @@ -95,7 +94,7 @@ const PlaneIntelligenceSettingsPage = observer(() => { } - workspaceSlug={workspaceSlug?.toString()} + workspaceSlug={workspaceSlug} >
@@ -117,6 +116,6 @@ const PlaneIntelligenceSettingsPage = observer(() => { ); -}); +} -export default PlaneIntelligenceSettingsPage; +export default observer(PlaneIntelligenceSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/project-states/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/project-states/page.tsx index cb6a783a7d..b364dd943c 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/project-states/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/project-states/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { PROJECT_GROUPING_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -27,23 +25,25 @@ import { // plane web hooks import { useFlag, useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; -const WorklogsPage = observer(() => { +import type { Route } from "./+types/page"; + +function WorklogsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { getWorkspaceRoleByWorkspaceSlug } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); const { isWorkspaceFeatureEnabled, updateWorkspaceFeature } = useWorkspaceFeatures(); - const isFeatureEnabled = useFlag(workspaceSlug?.toString(), "PROJECT_GROUPING"); + const isFeatureEnabled = useFlag(workspaceSlug, "PROJECT_GROUPING"); const { t } = useTranslation(); // derived values - const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString()); + const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Project States` : undefined; const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; const isProjectGroupingEnabled = isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED); - if (!workspaceSlug || !currentWorkspace?.id) return <>; + if (!currentWorkspace?.id) return <>; if (!isAdmin) return ; @@ -53,7 +53,7 @@ const WorklogsPage = observer(() => { const payload = { [EWorkspaceFeatures.IS_PROJECT_GROUPING_ENABLED]: willEnableProjectGrouping, }; - await updateWorkspaceFeature(workspaceSlug.toString(), payload); + await updateWorkspaceFeature(workspaceSlug, payload); captureSuccess({ eventName: willEnableProjectGrouping ? PROJECT_GROUPING_TRACKER_EVENTS.ENABLE @@ -87,12 +87,12 @@ const WorklogsPage = observer(() => { } - workspaceSlug={workspaceSlug?.toString()} + workspaceSlug={workspaceSlug} >
@@ -101,6 +101,6 @@ const WorklogsPage = observer(() => {
); -}); +} -export default WorklogsPage; +export default observer(WorklogsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/teamspaces/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/teamspaces/page.tsx index 3e3827c12b..faf04f33d3 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/teamspaces/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/teamspaces/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { TEAMSPACE_TRACKER_ELEMENTS, TEAMSPACE_TRACKER_EVENTS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -24,10 +22,11 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { TeamspaceUpgrade } from "@/plane-web/components/teamspaces/upgrade"; import { useWorkspaceFeatures } from "@/plane-web/hooks/store"; import { EWorkspaceFeatures } from "@/plane-web/types/workspace-feature"; +import type { Route } from "./+types/page"; -const TeamspaceSettingsPage = observer(() => { +function TeamspaceSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { getWorkspaceRoleByWorkspaceSlug } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); @@ -35,12 +34,12 @@ const TeamspaceSettingsPage = observer(() => { const { t } = useTranslation(); // derived values - const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString()); + const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Teamspaces` : undefined; const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; const isTeamspacesFeatureEnabled = isWorkspaceFeatureEnabled(EWorkspaceFeatures.IS_TEAMSPACES_ENABLED); - if (!workspaceSlug || !currentWorkspace?.id) return <>; + if (!currentWorkspace?.id) return <>; if (!isAdmin) return ; @@ -52,7 +51,7 @@ const TeamspaceSettingsPage = observer(() => { const payload = { [EWorkspaceFeatures.IS_TEAMSPACES_ENABLED]: !isTeamspacesFeatureEnabled, }; - const toggleTeamsFeaturePromise = updateWorkspaceFeature(workspaceSlug.toString(), payload); + const toggleTeamsFeaturePromise = updateWorkspaceFeature(workspaceSlug, payload); setPromiseToast(toggleTeamsFeaturePromise, { loading: "Updating teamspaces feature...", success: { @@ -68,7 +67,7 @@ const TeamspaceSettingsPage = observer(() => { captureSuccess({ eventName: isTeamspacesFeatureEnabled ? TEAMSPACE_TRACKER_EVENTS.DISABLE : TEAMSPACE_TRACKER_EVENTS.ENABLE, payload: { - workspace_slug: workspaceSlug.toString(), + workspace_slug: workspaceSlug, }, }); } catch (error) { @@ -76,7 +75,7 @@ const TeamspaceSettingsPage = observer(() => { captureError({ eventName: isTeamspacesFeatureEnabled ? TEAMSPACE_TRACKER_EVENTS.DISABLE : TEAMSPACE_TRACKER_EVENTS.ENABLE, payload: { - workspace_slug: workspaceSlug.toString(), + workspace_slug: workspaceSlug, }, }); } @@ -89,7 +88,7 @@ const TeamspaceSettingsPage = observer(() => { title={t("workspace_settings.settings.teamspaces.heading")} description={t("workspace_settings.settings.teamspaces.description")} /> - } workspaceSlug={workspaceSlug?.toString()}> + } workspaceSlug={workspaceSlug}>
@@ -120,6 +119,6 @@ const TeamspaceSettingsPage = observer(() => { ); -}); +} -export default TeamspaceSettingsPage; +export default observer(TeamspaceSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/layout.tsx index 8ebb408f76..4dcb606305 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/layout.tsx @@ -2,14 +2,14 @@ import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ChevronLeftIcon } from "lucide-react"; import { SettingsContentWrapper } from "@/components/settings/content-wrapper"; +import type { Route } from "./+types/layout"; -const TemplatesLayout = observer(() => { +function TemplatesLayout({ params }: Route.ComponentProps) { // router params - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; return ( @@ -25,6 +25,6 @@ const TemplatesLayout = observer(() => {
); -}); +} -export default TemplatesLayout; +export default observer(TemplatesLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/page/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/page/page.tsx index 9c3a95cf0c..fc631fd18f 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/page/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/page/page.tsx @@ -1,7 +1,7 @@ "use client"; import { observer } from "mobx-react"; -import { useParams, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS, ETemplateLevel } from "@plane/constants"; // plane web imports @@ -9,10 +9,11 @@ import { useTranslation } from "@plane/i18n"; import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { TemplatesUpgrade } from "@/plane-web/components/templates/settings"; import { CreateUpdatePageTemplate } from "@/plane-web/components/templates/settings/page/create-update"; +import type { Route } from "./+types/page"; -const CreateWorkspaceLevelPageTemplatePage = observer(() => { +function CreateWorkspaceLevelPageTemplatePage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; const searchParams = useSearchParams(); // store hooks const { t } = useTranslation(); @@ -21,7 +22,7 @@ const CreateWorkspaceLevelPageTemplatePage = observer(() => { return ( } > @@ -31,12 +32,12 @@ const CreateWorkspaceLevelPageTemplatePage = observer(() => {
); -}); +} -export default CreateWorkspaceLevelPageTemplatePage; +export default observer(CreateWorkspaceLevelPageTemplatePage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/[templateId]/publish/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/[templateId]/publish/page.tsx index 1313e64f1a..af75f070a8 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/[templateId]/publish/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/[templateId]/publish/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS } from "@plane/constants"; // plane web imports @@ -9,28 +8,29 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { TemplatesUpgrade } from "@/plane-web/components/templates/settings"; import { PublishTemplate } from "@/plane-web/components/templates/settings/publish"; import { useProjectTemplates } from "@/plane-web/hooks/store"; +import type { Route } from "./+types/page"; -const PublishProjectTemplatePage = observer(() => { +function PublishProjectTemplatePage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, templateId } = useParams(); + const { workspaceSlug, templateId } = params; // store hooks const { isInitializingTemplates, getTemplateById } = useProjectTemplates(); // derived values - const templateInstance = getTemplateById(templateId?.toString()); + const templateInstance = getTemplateById(templateId); return ( } > ); -}); +} -export default PublishProjectTemplatePage; +export default observer(PublishProjectTemplatePage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/page.tsx index eb90e2560e..517b020246 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/project/page.tsx @@ -1,7 +1,7 @@ "use client"; import { observer } from "mobx-react"; -import { useParams, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; // plane web imports import { E_FEATURE_FLAGS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -9,10 +9,11 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { IssueModalProvider } from "@/plane-web/components/issues/issue-modal/provider"; import { TemplatesUpgrade } from "@/plane-web/components/templates/settings"; import { CreateUpdateProjectTemplate } from "@/plane-web/components/templates/settings/project"; +import type { Route } from "./+types/page"; -const CreateProjectTemplatePage = observer(() => { +function CreateProjectTemplatePage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; const searchParams = useSearchParams(); // store hooks const { t } = useTranslation(); @@ -21,7 +22,7 @@ const CreateProjectTemplatePage = observer(() => { return ( } > @@ -31,10 +32,10 @@ const CreateProjectTemplatePage = observer(() => {
- +
); -}); +} -export default CreateProjectTemplatePage; +export default observer(CreateProjectTemplatePage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/work-item/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/work-item/page.tsx index 3f78aa80b3..e0f7b428d1 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/work-item/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/(templates)/work-item/page.tsx @@ -1,7 +1,7 @@ "use client"; import { observer } from "mobx-react"; -import { useParams, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS, ETemplateLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -10,10 +10,11 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { IssueModalProvider } from "@/plane-web/components/issues/issue-modal/provider"; import { TemplatesUpgrade } from "@/plane-web/components/templates/settings"; import { CreateUpdateWorkItemTemplate } from "@/plane-web/components/templates/settings/work-item"; +import type { Route } from "./+types/page"; -const CreateWorkspaceLevelWorkItemTemplatePage = observer(() => { +function CreateWorkspaceLevelWorkItemTemplatePage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; const searchParams = useSearchParams(); // store hooks const { t } = useTranslation(); @@ -22,7 +23,7 @@ const CreateWorkspaceLevelWorkItemTemplatePage = observer(() => { return ( } > @@ -33,13 +34,13 @@ const CreateWorkspaceLevelWorkItemTemplatePage = observer(() => { ); -}); +} -export default CreateWorkspaceLevelWorkItemTemplatePage; +export default observer(CreateWorkspaceLevelWorkItemTemplatePage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/page.tsx index e8605312a3..5bc9238484 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/templates/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS, ETemplateLevel, EUserPermissionsLevel } from "@plane/constants"; // component @@ -23,9 +21,11 @@ import { WorkspaceTemplatesSettingsRoot, } from "@/plane-web/components/templates/settings"; import { useFlag, useProjectTemplates, useWorkItemTemplates, usePageTemplates } from "@/plane-web/hooks/store"; -const TemplatesWorkspaceSettingsPage = observer(() => { +import type { Route } from "./+types/page"; + +function TemplatesWorkspaceSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // plane hooks const { t } = useTranslation(); // store hooks @@ -35,19 +35,19 @@ const TemplatesWorkspaceSettingsPage = observer(() => { const { isAnyWorkItemTemplatesAvailable } = useWorkItemTemplates(); const { isAnyPageTemplatesAvailable } = usePageTemplates(); // derived values - const isProjectTemplatesEnabled = useFlag(workspaceSlug?.toString(), "PROJECT_TEMPLATES"); - const isProjectTemplatesAvailable = isAnyProjectTemplatesAvailable(workspaceSlug?.toString()); - const isWorkItemTemplatesEnabled = useFlag(workspaceSlug?.toString(), "WORKITEM_TEMPLATES"); - const isWorkItemTemplatesAvailable = isAnyWorkItemTemplatesAvailable(workspaceSlug?.toString()); - const isPageTemplatesEnabled = useFlag(workspaceSlug?.toString(), "PAGE_TEMPLATES"); - const isPageTemplatesAvailable = isAnyPageTemplatesAvailable(workspaceSlug?.toString()); + const isProjectTemplatesEnabled = useFlag(workspaceSlug, "PROJECT_TEMPLATES"); + const isProjectTemplatesAvailable = isAnyProjectTemplatesAvailable(workspaceSlug); + const isWorkItemTemplatesEnabled = useFlag(workspaceSlug, "WORKITEM_TEMPLATES"); + const isWorkItemTemplatesAvailable = isAnyWorkItemTemplatesAvailable(workspaceSlug); + const isPageTemplatesEnabled = useFlag(workspaceSlug, "PAGE_TEMPLATES"); + const isPageTemplatesAvailable = isAnyPageTemplatesAvailable(workspaceSlug); const isAnyTemplatesEnabled = isProjectTemplatesEnabled || isWorkItemTemplatesEnabled || isPageTemplatesEnabled; const isAnyTemplatesAvailable = isProjectTemplatesAvailable || isWorkItemTemplatesAvailable || isPageTemplatesAvailable; const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - ${t("common.templates")}` : undefined; const hasAdminPermission = allowPermissions([EUserWorkspaceRoles.ADMIN], EUserPermissionsLevel.WORKSPACE); - if (!workspaceSlug || !currentWorkspace?.id) return <>; + if (!currentWorkspace?.id) return <>; if (workspaceUserInfo && !hasAdminPermission) { return ; @@ -63,7 +63,7 @@ const TemplatesWorkspaceSettingsPage = observer(() => { <> {isAnyTemplatesEnabled && isAnyTemplatesAvailable && hasAdminPermission && ( { } - workspaceSlug={workspaceSlug?.toString()} + workspaceSlug={workspaceSlug} > - + ); -}); +} -export default TemplatesWorkspaceSettingsPage; +export default observer(TemplatesWorkspaceSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/worklogs/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/worklogs/page.tsx index 7ad97bdd49..379cd71067 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/worklogs/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/(workspace)/worklogs/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { EUserWorkspaceRoles } from "@plane/types"; // plane imports // component @@ -16,35 +14,33 @@ import { useUserPermissions } from "@/hooks/store/user"; import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { WorkspaceWorklogRoot, WorkspaceWorklogsUpgrade } from "@/plane-web/components/worklogs"; import { useFlag } from "@/plane-web/hooks/store"; -const WorklogsPage = observer(() => { +import type { Route } from "./+types/page"; + +function WorklogsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { getWorkspaceRoleByWorkspaceSlug } = useUserPermissions(); const { currentWorkspace } = useWorkspace(); - const isFeatureEnabled = useFlag(workspaceSlug.toString(), "ISSUE_WORKLOG"); + const isFeatureEnabled = useFlag(workspaceSlug, "ISSUE_WORKLOG"); // derived values - const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug.toString()); + const currentWorkspaceRole = getWorkspaceRoleByWorkspaceSlug(workspaceSlug); const pageTitle = currentWorkspace?.name ? `${currentWorkspace.name} - Worklogs` : undefined; const isAdmin = currentWorkspaceRole === EUserWorkspaceRoles.ADMIN; - if (!workspaceSlug || !currentWorkspace) return <>; + if (!currentWorkspace) return <>; if (!isAdmin) return ; return ( - } - > - + }> + ); -}); +} -export default WorklogsPage; +export default observer(WorklogsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/epics/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/epics/page.tsx index 6869141419..aa65cd4321 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/epics/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/epics/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { EUserPermissionsLevel } from "@plane/constants"; import { EUserProjectRoles } from "@plane/types"; @@ -16,10 +15,11 @@ import { useUserPermissions } from "@/hooks/store/user/user-permissions"; import { EpicsRoot } from "@/plane-web/components/epics/settings"; import { EpicsUpgrade } from "@/plane-web/components/epics/upgrade"; import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; +import type { Route } from "./+types/page"; -const EpicsSettingsPage = observer(() => { +function EpicsSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; // store hooks const { allowPermissions } = useUserPermissions(); const { currentProjectDetails } = useProject(); @@ -35,12 +35,12 @@ const EpicsSettingsPage = observer(() => {
- } workspaceSlug={workspaceSlug?.toString()}> + } workspaceSlug={workspaceSlug}>
); -}); +} -export default EpicsSettingsPage; +export default observer(EpicsSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/features/cycles/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/features/cycles/page.tsx index 36f3d1f4fd..e52a9a3649 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/features/cycles/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/features/cycles/page.tsx @@ -2,7 +2,6 @@ import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; // plane imports import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; import { ChevronLeftIcon } from "@plane/propel/icons"; @@ -19,17 +18,16 @@ import { useUserPermissions } from "@/hooks/store/user"; import { AutoScheduleCycles } from "@/plane-web/components/cycles/settings"; // plane web imports import { PROJECT_BASE_FEATURES_LIST } from "@/plane-web/constants/project/settings"; +import type { Route } from "./+types/page"; -const CyclesFeatureSettingsPage = observer(() => { - const { workspaceSlug, projectId } = useParams(); +function CyclesFeatureSettingsPage({ params }: Route.ComponentProps) { + const { workspaceSlug, projectId } = params; // permissions const { workspaceUserInfo, allowPermissions } = useUserPermissions(); const canPerformProjectAdminActions = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.PROJECT); // project store const { getProjectById, updateProject } = useProject(); - const currentProjectDetails = projectId ? getProjectById(projectId.toString()) : undefined; - - if (!workspaceSlug || !projectId) return null; + const currentProjectDetails = getProjectById(projectId); if (workspaceUserInfo && !canPerformProjectAdminActions) { return ; @@ -39,8 +37,8 @@ const CyclesFeatureSettingsPage = observer(() => { const handleToggle = async () => { if (!currentProjectDetails) return; - const payload = { cycle_view: !Boolean(currentProjectDetails.cycle_view) }; - const promise = updateProject(workspaceSlug.toString(), projectId.toString(), payload); + const payload = { cycle_view: !currentProjectDetails.cycle_view }; + const promise = updateProject(workspaceSlug, projectId, payload); setPromiseToast(promise, { loading: "Updating project feature...", success: { title: "Success!", message: () => "Project feature updated successfully." }, @@ -81,7 +79,7 @@ const CyclesFeatureSettingsPage = observer(() => { { {currentProjectDetails?.cycle_view && } ); -}); +} -export default CyclesFeatureSettingsPage; +export default observer(CyclesFeatureSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/integrations/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/integrations/page.tsx index cbab615be4..84de0c683f 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/integrations/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/integrations/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { useTheme } from "next-themes"; import useSWR from "swr"; // plane imports @@ -20,27 +19,26 @@ import { PROJECT_DETAILS, WORKSPACE_INTEGRATIONS } from "@/constants/fetch-keys" // services import { IntegrationService } from "@/services/integrations"; import { ProjectService } from "@/services/project"; +import type { Route } from "./+types/page"; // services const integrationService = new IntegrationService(); const projectService = new ProjectService(); -const ProjectIntegrationsPage = observer(() => { +function ProjectIntegrationsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, projectId } = useParams(); + const { workspaceSlug, projectId } = params; // plane hooks const { t } = useTranslation(); // theme hook const { resolvedTheme } = useTheme(); // fetch project details - const { data: projectDetails } = useSWR( - workspaceSlug && projectId ? PROJECT_DETAILS(workspaceSlug?.toString(), projectId?.toString()) : null, - workspaceSlug && projectId ? () => projectService.getProject(workspaceSlug as string, projectId as string) : null + const { data: projectDetails } = useSWR(PROJECT_DETAILS(workspaceSlug, projectId), () => + projectService.getProject(workspaceSlug, projectId) ); // fetch Integrations list - const { data: workspaceIntegrations } = useSWR( - workspaceSlug ? WORKSPACE_INTEGRATIONS(workspaceSlug as string) : null, - () => (workspaceSlug ? integrationService.getWorkspaceIntegrationsList(workspaceSlug as string) : null) + const { data: workspaceIntegrations } = useSWR(WORKSPACE_INTEGRATIONS(workspaceSlug), () => + integrationService.getWorkspaceIntegrationsList(workspaceSlug) ); // derived values const isAdmin = projectDetails?.member_role === 20; @@ -76,6 +74,6 @@ const ProjectIntegrationsPage = observer(() => { ); -}); +} -export default ProjectIntegrationsPage; +export default observer(ProjectIntegrationsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/project-updates/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/project-updates/page.tsx index dbcb31f09e..8c5c3ed7ff 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/project-updates/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/project-updates/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { EUserPermissionsLevel } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -20,16 +18,17 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; // plane web constants import { ProjectUpdatesUpgrade } from "@/plane-web/components/project-overview/upgrade"; import { useProjectAdvanced } from "@/plane-web/hooks/store/projects/use-projects"; +import type { Route } from "./+types/page"; -const UpdatesSettingsPage = observer(() => { +function UpdatesSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, projectId } = useParams(); + const { workspaceSlug, projectId } = params; // store hooks const { allowPermissions } = useUserPermissions(); const { getProjectFeatures, toggleProjectFeatures } = useProjectAdvanced(); const { t } = useTranslation(); // derived values - const currentProjectDetails = getProjectFeatures(projectId?.toString()); + const currentProjectDetails = getProjectFeatures(projectId); const canPerformProjectAdminActions = allowPermissions([EUserProjectRoles.ADMIN], EUserPermissionsLevel.PROJECT); if (!canPerformProjectAdminActions) { @@ -51,7 +50,7 @@ const UpdatesSettingsPage = observer(() => { const settingsPayload = { is_project_updates_enabled: !currentProjectDetails?.["is_project_updates_enabled"], }; - const updateProjectPromise = toggleProjectFeatures(workspaceSlug.toString(), projectId.toString(), settingsPayload); + const updateProjectPromise = toggleProjectFeatures(workspaceSlug, projectId, settingsPayload); setPromiseToast(updateProjectPromise, { loading: "Updating project feature...", success: { @@ -72,11 +71,7 @@ const UpdatesSettingsPage = observer(() => { title={t("project_settings.project_updates.heading")} description={t("project_settings.project_updates.description")} /> - } - workspaceSlug={workspaceSlug?.toString()} - > + } workspaceSlug={workspaceSlug}> <>
@@ -104,6 +99,6 @@ const UpdatesSettingsPage = observer(() => {
); -}); +} -export default UpdatesSettingsPage; +export default observer(UpdatesSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/[recurringWorkItemId]/update/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/[recurringWorkItemId]/update/page.tsx index 5a91e6f029..c415b54220 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/[recurringWorkItemId]/update/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/[recurringWorkItemId]/update/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS } from "@plane/constants"; // plane web imports @@ -10,17 +9,11 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { IssueModalProvider } from "@/plane-web/components/issues/issue-modal/provider"; import { CreateUpdateRecurringWorkItem } from "@/plane-web/components/recurring-work-items/settings/create-update/root"; import { RecurringWorkItemsUpgrade } from "@/plane-web/components/recurring-work-items/settings/upgrade"; +import type { Route } from "./+types/page"; -const UpdateRecurringWorkItemPage = observer(() => { +function UpdateRecurringWorkItemPage({ params }: Route.ComponentProps) { // router - const { - workspaceSlug: routerWorkspaceSlug, - projectId: routerProjectId, - recurringWorkItemId: routerRecurringWorkItemId, - } = useParams(); - const workspaceSlug = routerWorkspaceSlug?.toString(); - const projectId = routerProjectId?.toString(); - const recurringWorkItemId = routerRecurringWorkItemId?.toString(); + const { workspaceSlug, projectId, recurringWorkItemId } = params; // plane hooks const { t } = useTranslation(); @@ -44,6 +37,6 @@ const UpdateRecurringWorkItemPage = observer(() => { ); -}); +} -export default UpdateRecurringWorkItemPage; +export default observer(UpdateRecurringWorkItemPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/create/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/create/page.tsx index ed546a1097..056a498072 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/create/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/create/page.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS } from "@plane/constants"; import { useTranslation } from "@plane/i18n"; @@ -10,12 +9,11 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { IssueModalProvider } from "@/plane-web/components/issues/issue-modal/provider"; import { CreateUpdateRecurringWorkItem } from "@/plane-web/components/recurring-work-items/settings/create-update/root"; import { RecurringWorkItemsUpgrade } from "@/plane-web/components/recurring-work-items/settings/upgrade"; +import type { Route } from "./+types/page"; -const CreateRecurringWorkItemPage = observer(() => { +function CreateRecurringWorkItemPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug: routerWorkspaceSlug, projectId: routerProjectId } = useParams(); - const workspaceSlug = routerWorkspaceSlug?.toString(); - const projectId = routerProjectId?.toString(); + const { workspaceSlug, projectId } = params; // plane hooks const { t } = useTranslation(); @@ -35,6 +33,6 @@ const CreateRecurringWorkItemPage = observer(() => { ); -}); +} -export default CreateRecurringWorkItemPage; +export default observer(CreateRecurringWorkItemPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/layout.tsx index e2e505dae6..ec29ea0e3d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/(details)/layout.tsx @@ -2,7 +2,6 @@ import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ChevronLeftIcon } from "lucide-react"; // plane imports @@ -14,12 +13,11 @@ import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view import { SettingsContentWrapper } from "@/components/settings/content-wrapper"; // hooks import { useUserPermissions } from "@/hooks/store/user"; +import type { Route } from "./+types/layout"; -const RecurringWorkItemsDetailsLayout = observer(() => { +function RecurringWorkItemsDetailsLayout({ params }: Route.ComponentProps) { // router params - const { workspaceSlug: routerWorkspaceSlug, projectId: routerProjectId } = useParams(); - const workspaceSlug = routerWorkspaceSlug?.toString(); - const projectId = routerProjectId?.toString(); + const { workspaceSlug, projectId } = params; // store hooks const { workspaceUserInfo, allowPermissions } = useUserPermissions(); // derived values @@ -45,6 +43,6 @@ const RecurringWorkItemsDetailsLayout = observer(() => {
); -}); +} -export default RecurringWorkItemsDetailsLayout; +export default observer(RecurringWorkItemsDetailsLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/layout.tsx index 8cd719810b..5c7428cf7f 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/layout.tsx @@ -1,7 +1,6 @@ "use client"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import useSWR from "swr"; // plane imports @@ -16,12 +15,11 @@ import { useUserPermissions } from "@/hooks/store/user"; // plane web components import { useRecurringWorkItems } from "@/plane-web/hooks/store/recurring-work-items/use-recurring-work-items"; import { useFlag } from "@/plane-web/hooks/store/use-flag"; +import type { Route } from "./+types/layout"; -const RecurringWorkItemsProjectSettingsLayout = observer(() => { +function RecurringWorkItemsProjectSettingsLayout({ params }: Route.ComponentProps) { // router - const { workspaceSlug: routerWorkspaceSlug, projectId: routerProjectId } = useParams(); - const workspaceSlug = routerWorkspaceSlug?.toString(); - const projectId = routerProjectId?.toString(); + const { workspaceSlug, projectId } = params; // store hooks const { workspaceUserInfo, allowPermissions } = useUserPermissions(); const { getProjectById } = useProject(); @@ -36,16 +34,12 @@ const RecurringWorkItemsProjectSettingsLayout = observer(() => { // fetching recurring work items useSWR( - workspaceSlug && isRecurringWorkItemsEnabled - ? ["recurringWorkItems", workspaceSlug, projectId, isRecurringWorkItemsEnabled] - : null, - workspaceSlug && projectId && isRecurringWorkItemsEnabled - ? () => fetchRecurringWorkItems(workspaceSlug, projectId) - : null, + isRecurringWorkItemsEnabled ? ["recurringWorkItems", workspaceSlug, projectId, isRecurringWorkItemsEnabled] : null, + isRecurringWorkItemsEnabled ? () => fetchRecurringWorkItems(workspaceSlug, projectId) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); - if (!workspaceSlug || !currentProjectDetails?.id) return <>; + if (!currentProjectDetails?.id) return <>; if (workspaceUserInfo && !hasMemberLevelPermission) { return ; @@ -56,6 +50,6 @@ const RecurringWorkItemsProjectSettingsLayout = observer(() => { ); -}); +} -export default RecurringWorkItemsProjectSettingsLayout; +export default observer(RecurringWorkItemsProjectSettingsLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/page.tsx index 9edf817377..fd0c146e0a 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/recurring-work-items/page.tsx @@ -1,8 +1,6 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; -import { useParams } from "next/navigation"; // plane imports import { EUserPermissionsLevel } from "@plane/constants"; // component @@ -20,12 +18,11 @@ import { RecurringWorkItemsSettingsRoot } from "@/plane-web/components/recurring import { RecurringWorkItemsUpgrade } from "@/plane-web/components/recurring-work-items/settings/upgrade"; import { useRecurringWorkItems } from "@/plane-web/hooks/store/recurring-work-items/use-recurring-work-items"; import { useFlag } from "@/plane-web/hooks/store/use-flag"; +import type { Route } from "./+types/page"; -const RecurringWorkItemsProjectSettingsPage = observer(() => { +function RecurringWorkItemsProjectSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug: routerWorkspaceSlug, projectId: routerProjectId } = useParams(); - const workspaceSlug = routerWorkspaceSlug?.toString(); - const projectId = routerProjectId?.toString(); + const { workspaceSlug, projectId } = params; // plane hooks const { t } = useTranslation(); // store hooks @@ -63,6 +60,6 @@ const RecurringWorkItemsProjectSettingsPage = observer(() => {
); -}); +} -export default RecurringWorkItemsProjectSettingsPage; +export default observer(RecurringWorkItemsProjectSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/layout.tsx index 8ee70a0d57..3014945cb5 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/layout.tsx @@ -3,7 +3,6 @@ import { observer } from "mobx-react"; // plane imports import Link from "next/link"; -import { useParams } from "next/navigation"; import { Outlet } from "react-router"; import { ChevronLeftIcon } from "lucide-react"; import { EUserPermissionsLevel } from "@plane/constants"; @@ -13,10 +12,11 @@ import { NotAuthorizedView } from "@/components/auth-screens/not-authorized-view // hooks import { SettingsContentWrapper } from "@/components/settings/content-wrapper"; import { useUserPermissions } from "@/hooks/store/user"; +import type { Route } from "./+types/layout"; -const ProjectLevelTemplatesLayout = observer(() => { +function ProjectLevelTemplatesLayout({ params }: Route.ComponentProps) { // router params - const { workspaceSlug, projectId } = useParams(); + const { workspaceSlug, projectId } = params; // store hooks const { workspaceUserInfo, allowPermissions } = useUserPermissions(); // derived values @@ -42,6 +42,6 @@ const ProjectLevelTemplatesLayout = observer(() => { ); -}); +} -export default ProjectLevelTemplatesLayout; +export default observer(ProjectLevelTemplatesLayout); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/page/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/page/page.tsx index d440caeab8..7c5e06eecf 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/page/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/page/page.tsx @@ -1,7 +1,7 @@ "use client"; import { observer } from "mobx-react"; -import { useParams, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS, ETemplateLevel } from "@plane/constants"; // plane web imports @@ -9,9 +9,10 @@ import { useTranslation } from "@plane/i18n"; import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { TemplatesUpgrade } from "@/plane-web/components/templates/settings"; import { CreateUpdatePageTemplate } from "@/plane-web/components/templates/settings/page"; -const CreateProjectLevelPageTemplatePage = observer(() => { +import type { Route } from "./+types/page"; +function CreateProjectLevelPageTemplatePage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, projectId } = useParams(); + const { workspaceSlug, projectId } = params; const searchParams = useSearchParams(); // derived values const templateId = searchParams.get("templateId"); @@ -19,7 +20,7 @@ const CreateProjectLevelPageTemplatePage = observer(() => { return ( } > @@ -29,13 +30,13 @@ const CreateProjectLevelPageTemplatePage = observer(() => { ); -}); +} -export default CreateProjectLevelPageTemplatePage; +export default observer(CreateProjectLevelPageTemplatePage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/work-item/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/work-item/page.tsx index 801e4633e3..9523cfaeac 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/work-item/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/(templates)/work-item/page.tsx @@ -1,7 +1,7 @@ "use client"; import { observer } from "mobx-react"; -import { useParams, useSearchParams } from "next/navigation"; +import { useSearchParams } from "next/navigation"; // plane imports import { E_FEATURE_FLAGS, ETemplateLevel } from "@plane/constants"; // plane web imports @@ -10,10 +10,11 @@ import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { IssueModalProvider } from "@/plane-web/components/issues/issue-modal/provider"; import { TemplatesUpgrade } from "@/plane-web/components/templates/settings"; import { CreateUpdateWorkItemTemplate } from "@/plane-web/components/templates/settings/work-item"; +import type { Route } from "./+types/page"; -const CreateProjectLevelWorkItemTemplatePage = observer(() => { +function CreateProjectLevelWorkItemTemplatePage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, projectId } = useParams(); + const { workspaceSlug, projectId } = params; const searchParams = useSearchParams(); // plane hooks const { t } = useTranslation(); @@ -22,7 +23,7 @@ const CreateProjectLevelWorkItemTemplatePage = observer(() => { return ( } > @@ -33,14 +34,14 @@ const CreateProjectLevelWorkItemTemplatePage = observer(() => { ); -}); +} -export default CreateProjectLevelWorkItemTemplatePage; +export default observer(CreateProjectLevelWorkItemTemplatePage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/page.tsx index 45332e2f89..4e3adeee3d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/templates/page.tsx @@ -23,8 +23,8 @@ import { import { useFlag, usePageTemplates, useWorkItemTemplates } from "@/plane-web/hooks/store"; import type { Route } from "./+types/page"; -const TemplatesProjectSettingsPage = observer((props: Route.ComponentProps) => { - const { params } = props; +function TemplatesProjectSettingsPage({ params }: Route.ComponentProps) { + // router const { workspaceSlug, projectId } = params; // plane hooks const { t } = useTranslation(); @@ -51,7 +51,7 @@ const TemplatesProjectSettingsPage = observer((props: Route.ComponentProps) => { EUserPermissionsLevel.PROJECT ); - if (!workspaceSlug || !currentProjectDetails?.id) return <>; + if (!currentProjectDetails?.id) return <>; if (workspaceUserInfo && !hasMemberLevelPermission) { return ; @@ -83,6 +83,6 @@ const TemplatesProjectSettingsPage = observer((props: Route.ComponentProps) => {
); -}); +} -export default TemplatesProjectSettingsPage; +export default observer(TemplatesProjectSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/work-item-types/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/work-item-types/page.tsx index cff9895139..631bd4e85d 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/work-item-types/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/work-item-types/page.tsx @@ -15,7 +15,7 @@ import { useUserPermissions } from "@/hooks/store/user"; // plane web imports import { IssueTypesRoot } from "@/plane-web/components/issue-types"; -const WorkItemTypesSettingsPage = observer(() => { +function WorkItemTypesSettingsPage() { // plane hooks const { t } = useTranslation(); // store hooks @@ -39,6 +39,6 @@ const WorkItemTypesSettingsPage = observer(() => { ); -}); +} -export default WorkItemTypesSettingsPage; +export default observer(WorkItemTypesSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/workflows/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/workflows/page.tsx index 528e844268..67b5f1b452 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/workflows/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/workflows/page.tsx @@ -26,10 +26,11 @@ import { StateWorkflowRoot } from "@/plane-web/components/workflow/page/root"; import { WorkflowUpgrade } from "@/plane-web/components/workflow/page/upgrade"; import { useFlag } from "@/plane-web/hooks/store"; import { useProjectAdvanced } from "@/plane-web/hooks/store/projects/use-projects"; +import type { Route } from "./+types/page"; -const WorkflowsSettingsPage = observer(() => { +function WorkflowsSettingsPage({ params }: Route.ComponentProps) { // router - const { workspaceSlug, projectId } = useParams(); + const { workspaceSlug, projectId } = params; // plane hooks const { t } = useTranslation(); // store @@ -41,24 +42,20 @@ const WorkflowsSettingsPage = observer(() => { const pageTitle = currentProjectDetails?.name ? `${currentProjectDetails?.name} - ${t("common.workflows")}` : undefined; - const isWorkflowFeatureFlagEnabled = useFlag(workspaceSlug?.toString(), "WORKFLOWS"); - const isWorkflowEnabled = isProjectFeatureEnabled(projectId?.toString(), "is_workflow_enabled"); + const isWorkflowFeatureFlagEnabled = useFlag(workspaceSlug, "WORKFLOWS"); + const isWorkflowEnabled = isProjectFeatureEnabled(projectId, "is_workflow_enabled"); const hasAdminPermission = allowPermissions([EUserProjectRoles.ADMIN], EUserPermissionsLevel.PROJECT); // fetch project states const { isLoading } = useSWR( - workspaceSlug && projectId ? `PROJECT_STATES_${workspaceSlug}_${projectId}` : null, - workspaceSlug && projectId ? () => fetchProjectStates(workspaceSlug.toString(), projectId.toString()) : null, + `PROJECT_STATES_${workspaceSlug}_${projectId}`, + () => fetchProjectStates(workspaceSlug, projectId), { revalidateIfStale: false, revalidateOnFocus: false } ); // fetch project workflows useSWR( - workspaceSlug && projectId && isWorkflowFeatureFlagEnabled - ? `PROJECT_WORKFLOWS_${workspaceSlug}_${projectId}` - : null, - workspaceSlug && projectId && isWorkflowFeatureFlagEnabled - ? () => fetchWorkflowStates(workspaceSlug.toString(), projectId.toString()) - : null, + isWorkflowFeatureFlagEnabled ? `PROJECT_WORKFLOWS_${workspaceSlug}_${projectId}` : null, + isWorkflowFeatureFlagEnabled ? () => fetchWorkflowStates(workspaceSlug, projectId) : null, { revalidateIfStale: false, revalidateOnFocus: false } ); @@ -68,7 +65,7 @@ const WorkflowsSettingsPage = observer(() => { const handleEnableDisableWorkflow = async () => { const featureState = !isWorkflowEnabled; - const featureTogglePromise = toggleProjectFeatures(workspaceSlug?.toString(), projectId?.toString(), { + const featureTogglePromise = toggleProjectFeatures(workspaceSlug, projectId, { is_workflow_enabled: featureState, }) .then(() => { @@ -130,10 +127,7 @@ const WorkflowsSettingsPage = observer(() => { disabled={isLoading} data-ph-element={WORKFLOW_TRACKER_ELEMENTS.WORK_FLOW_ENABLE_DISABLE_BUTTON} /> - + )} @@ -141,13 +135,13 @@ const WorkflowsSettingsPage = observer(() => { />
- } workspaceSlug={workspaceSlug?.toString()}> - + } workspaceSlug={workspaceSlug}> +
); -}); +} -export default WorkflowsSettingsPage; +export default observer(WorkflowsSettingsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/(pageType)/shared/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/(pageType)/shared/page.tsx index e947807ec2..9acf2e0d0a 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/(pageType)/shared/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/(pageType)/shared/page.tsx @@ -1,21 +1,17 @@ "use client"; -import { useParams } from "next/navigation"; // plane web components import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags"; import { WikiPagesListLayoutRoot } from "@/plane-web/components/pages"; // local components +import type { Route } from "./+types/layout"; import { SharedPagesFallback } from "./empty-shared-pages"; -export default function SharedPagesList() { - const { workspaceSlug } = useParams(); +export default function SharedPagesList({ params }: Route.ComponentProps) { + const { workspaceSlug } = params; return ( - } - > + }> ); diff --git a/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/[pageId]/page.tsx b/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/[pageId]/page.tsx index 66e22d69b0..6873e117c3 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/[pageId]/page.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/[pageId]/page.tsx @@ -3,7 +3,6 @@ import { useCallback, useEffect, useMemo } from "react"; import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import useSWR from "swr"; // plane imports import { getButtonStyling } from "@plane/propel/button"; @@ -26,6 +25,7 @@ import { EpicPeekOverview } from "@/plane-web/components/epics/peek-overview"; import { EPageStoreType, usePage, usePageStore } from "@/plane-web/hooks/store"; import { WorkspaceService } from "@/plane-web/services"; import { WorkspacePageService, WorkspacePageVersionService } from "@/plane-web/services/page"; +import type { Route } from "./+types/page"; // services const workspaceService = new WorkspaceService(); const workspacePageService = new WorkspacePageService(); @@ -33,29 +33,25 @@ const workspacePageVersionService = new WorkspacePageVersionService(); const storeType = EPageStoreType.WORKSPACE; -const PageDetailsPage = observer(() => { +function PageDetailsPage({ params }: Route.ComponentProps) { // router const router = useAppRouter(); - const { workspaceSlug, pageId } = useParams(); + const { workspaceSlug, pageId } = params; // flag // store hooks const { getWorkspaceBySlug } = useWorkspace(); const { createPage, fetchPageDetails, isNestedPagesEnabled } = usePageStore(storeType); const page = usePage({ - pageId: pageId?.toString() ?? "", + pageId, storeType, }); const { uploadEditorAsset } = useEditorAsset(); // derived values - const workspaceId = useMemo( - () => (workspaceSlug ? (getWorkspaceBySlug(workspaceSlug?.toString())?.id ?? "") : ""), - [getWorkspaceBySlug, workspaceSlug] - ); + const workspaceId = useMemo(() => getWorkspaceBySlug(workspaceSlug)?.id ?? "", [getWorkspaceBySlug, workspaceSlug]); const { canCurrentUserAccessPage, id, name, updateDescription } = page ?? {}; // entity search handler const fetchEntityCallback = useCallback( - async (payload: TSearchEntityRequestPayload) => - await workspaceService.searchEntity(workspaceSlug?.toString() ?? "", payload), + async (payload: TSearchEntityRequestPayload) => await workspaceService.searchEntity(workspaceSlug ?? "", payload), [workspaceSlug] ); // editor config @@ -74,22 +70,16 @@ const PageDetailsPage = observer(() => { const pageRootHandlers: TPageRootHandlers = useMemo( () => ({ create: createPage, - fetchAllVersions: async (pageId) => { - if (!workspaceSlug) return; - return await workspacePageVersionService.fetchAllVersions(workspaceSlug.toString(), pageId); - }, + fetchAllVersions: async (pageId) => await workspacePageVersionService.fetchAllVersions(workspaceSlug, pageId), fetchDescriptionBinary: async () => { - if (!workspaceSlug || !id) return; - return await workspacePageService.fetchDescriptionBinary(workspaceSlug.toString(), id); + if (!id) return; + return await workspacePageService.fetchDescriptionBinary(workspaceSlug, id); }, fetchEntity: fetchEntityCallback, - fetchVersionDetails: async (pageId, versionId) => { - if (!workspaceSlug) return; - return await workspacePageVersionService.fetchVersionById(workspaceSlug.toString(), pageId, versionId); - }, + fetchVersionDetails: async (pageId, versionId) => + await workspacePageVersionService.fetchVersionById(workspaceSlug, pageId, versionId), restoreVersion: async (pageId, versionId) => { - if (!workspaceSlug) return; - await workspacePageVersionService.restoreVersion(workspaceSlug.toString(), pageId, versionId); + await workspacePageVersionService.restoreVersion(workspaceSlug, pageId, versionId); }, getRedirectionLink: (pageId) => { if (pageId) { @@ -114,12 +104,12 @@ const PageDetailsPage = observer(() => { entity_identifier: id ?? "", entity_type: EFileAssetType.PAGE_DESCRIPTION, }, - workspaceSlug: workspaceSlug?.toString() ?? "", + workspaceSlug, }); return asset_id; }, workspaceId, - workspaceSlug: workspaceSlug?.toString() ?? "", + workspaceSlug, }), }), [getEditorFileHandlers, id, uploadEditorAsset, workspaceId, workspaceSlug] @@ -128,7 +118,7 @@ const PageDetailsPage = observer(() => { const webhookConnectionParams: TWebhookConnectionQueryParams = useMemo( () => ({ documentType: "workspace_page", - workspaceSlug: workspaceSlug?.toString() ?? "", + workspaceSlug, }), [workspaceSlug] ); @@ -146,7 +136,7 @@ const PageDetailsPage = observer(() => { ); - if (!isNestedPagesEnabled(workspaceSlug?.toString()) && page?.parent_id) + if (!isNestedPagesEnabled(workspaceSlug) && page?.parent_id) return (

Please upgrade your plan to view this nested page

@@ -185,7 +175,7 @@ const PageDetailsPage = observer(() => { page={page} storeType={storeType} webhookConnectionParams={webhookConnectionParams} - workspaceSlug={workspaceSlug.toString()} + workspaceSlug={workspaceSlug} /> @@ -193,6 +183,6 @@ const PageDetailsPage = observer(() => {
); -}); +} -export default PageDetailsPage; +export default observer(PageDetailsPage); diff --git a/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/layout.tsx b/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/layout.tsx index 7a228a7afd..75cd45ccfe 100644 --- a/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/layout.tsx +++ b/apps/web/app/(all)/[workspaceSlug]/(wiki)/wiki/layout.tsx @@ -1,6 +1,6 @@ "use client"; -import { useParams } from "next/navigation"; +// layouts import { Outlet } from "react-router"; // components import { EUserPermissions } from "@plane/constants"; @@ -12,21 +12,22 @@ import { WikiAppPowerKProvider } from "@/plane-web/components/command-palette/wi import { WithFeatureFlagHOC } from "@/plane-web/components/feature-flags/with-feature-flag-hoc"; import { WikiUpgradeScreen } from "@/plane-web/components/wiki/upgrade-screen"; import { WorkspaceAuthWrapper } from "@/plane-web/layouts/workspace-wrapper"; -// local imports +// local components +import type { Route } from "./+types/layout"; import { PagesAppSidebar } from "./_sidebar"; -export default function WikiLayout() { +export default function WikiLayout({ params }: Route.ComponentProps) { // router - const { workspaceSlug } = useParams(); + const { workspaceSlug } = params; return ( } + fallback={} > {currentUser && } - {workspaceSlug && ( -
-
- -
-
- -
+
+
+
- )} +
+ +
+
); diff --git a/apps/web/app/m/auth/page.tsx b/apps/web/app/m/auth/page.tsx index d864ef586f..3947b976ab 100644 --- a/apps/web/app/m/auth/page.tsx +++ b/apps/web/app/m/auth/page.tsx @@ -1,6 +1,5 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; import type { TInstanceConfig } from "@plane/types"; // hooks @@ -13,7 +12,7 @@ export const meta: Route.MetaFunction = () => [ { name: "viewport", content: "width=device-width, initial-scale=1, maximum-scale=1" }, ]; -const MobileAuth = observer(() => { +function MobileAuth() { // hooks const { config } = useInstance(); @@ -26,6 +25,6 @@ const MobileAuth = observer(() => {
); -}); +} -export default MobileAuth; +export default observer(MobileAuth); diff --git a/apps/web/app/oauth/page.tsx b/apps/web/app/oauth/page.tsx index a6d1df3659..e70d70fa37 100644 --- a/apps/web/app/oauth/page.tsx +++ b/apps/web/app/oauth/page.tsx @@ -1,6 +1,5 @@ "use client"; -import React from "react"; import { observer } from "mobx-react"; import Link from "next/link"; import { useSearchParams } from "next/navigation"; @@ -21,7 +20,7 @@ import { AppConsent } from "@/plane-web/components/marketplace"; import { ApplicationService } from "@/plane-web/services/marketplace"; const applicationService = new ApplicationService(); -const OAuthPage = observer(() => { +function OAuthPage() { const searchParams = useSearchParams(); const { workspace_slug, @@ -45,7 +44,7 @@ const OAuthPage = observer(() => { }); const application = data?.application; - const applicationPermissions = data?.applicationPermissions?.reduce((acc: any, curr: any) => { + const applicationPermissions = data?.applicationPermissions?.reduce((acc, curr) => { acc[curr.workspace_id] = curr.state; return acc; }, {} as any); @@ -103,6 +102,6 @@ const OAuthPage = observer(() => {
); -}); +} -export default OAuthPage; +export default observer(OAuthPage); diff --git a/apps/web/app/workspace-selector/[feature]/[identifier]/page.tsx b/apps/web/app/workspace-selector/[feature]/[identifier]/page.tsx index 4f32663b82..30550904f1 100644 --- a/apps/web/app/workspace-selector/[feature]/[identifier]/page.tsx +++ b/apps/web/app/workspace-selector/[feature]/[identifier]/page.tsx @@ -1,29 +1,32 @@ "use client"; -import React, { useCallback } from "react"; +import { useMemo } from "react"; import { observer } from "mobx-react"; import Link from "next/link"; -import { useParams } from "next/navigation"; import { PlaneLockup } from "@plane/propel/icons"; // hooks import { useUser } from "@/hooks/store/user"; // services import { AuthenticationWrapper } from "@/lib/wrappers/authentication-wrapper"; // local imports +import type { Route } from "./+types/page"; import { ESupportedFeatures, WorkspaceSelector } from "./workspace-selector"; const NOT_FOUND_CLASSNAME = "flex items-center justify-center h-full text-custom-text-100 text-lg font-medium"; -const WorkspacePickerPage = observer(() => { +function isValidFeature(feature: string): feature is ESupportedFeatures { + return Object.values(ESupportedFeatures).includes(feature as ESupportedFeatures); +} + +function WorkspacePickerPage({ params }: Route.ComponentProps) { // router - const { feature: featureFromRoute, identifier } = useParams(); - const feature = featureFromRoute as ESupportedFeatures; + const { feature, identifier } = params; // hooks const { data: currentUser } = useUser(); // derived values - const isFeatureSupported = Object.values(ESupportedFeatures).includes(feature); + const isFeatureSupported = isValidFeature(feature); - const renderContent = useCallback(() => { + const content = useMemo(() => { if (!isFeatureSupported) { return
Invalid feature
; } @@ -42,10 +45,10 @@ const WorkspacePickerPage = observer(() => {
{currentUser?.email}
- {renderContent()} + {content} ); -}); +} -export default WorkspacePickerPage; +export default observer(WorkspacePickerPage); diff --git a/apps/web/core/components/auth-screens/not-authorized-view.tsx b/apps/web/core/components/auth-screens/not-authorized-view.tsx index 2147815b04..5ff8b13ab7 100644 --- a/apps/web/core/components/auth-screens/not-authorized-view.tsx +++ b/apps/web/core/components/auth-screens/not-authorized-view.tsx @@ -2,11 +2,11 @@ import React from "react"; import { observer } from "mobx-react"; import Image from "next/image"; // assets +import { cn } from "@plane/utils"; import ProjectNotAuthorizedImg from "@/app/assets/auth/project-not-authorized.svg?url"; import Unauthorized from "@/app/assets/auth/unauthorized.svg?url"; import WorkspaceNotAuthorizedImg from "@/app/assets/auth/workspace-not-authorized.svg?url"; // layouts -import { cn } from "@plane/utils"; import DefaultLayout from "@/layouts/default-layout"; type Props = { diff --git a/apps/web/core/components/views/quick-actions.tsx b/apps/web/core/components/views/quick-actions.tsx index eb041ffe2d..bc7d257e32 100644 --- a/apps/web/core/components/views/quick-actions.tsx +++ b/apps/web/core/components/views/quick-actions.tsx @@ -11,10 +11,10 @@ import type { TContextMenuItem } from "@plane/ui"; import { ContextMenu, CustomMenu } from "@plane/ui"; import { copyUrlToClipboard, cn } from "@plane/utils"; // helpers +import { useViewMenuItems } from "@/components/common/quick-actions-helper"; import { captureClick } from "@/helpers/event-tracker.helper"; // hooks import { useUser, useUserPermissions } from "@/hooks/store/user"; -import { useViewMenuItems } from "@/components/common/quick-actions-helper"; import { PublishViewModal, useViewPublish } from "@/plane-web/components/views/publish"; // local imports import { DeleteProjectViewModal } from "./delete-view-modal"; diff --git a/apps/web/core/components/workspace/views/quick-action.tsx b/apps/web/core/components/workspace/views/quick-action.tsx index 7e30b3bda5..a07dbf09b7 100644 --- a/apps/web/core/components/workspace/views/quick-action.tsx +++ b/apps/web/core/components/workspace/views/quick-action.tsx @@ -9,10 +9,10 @@ import type { IWorkspaceView } from "@plane/types"; import { CustomMenu } from "@plane/ui"; import { copyUrlToClipboard, cn } from "@plane/utils"; // helpers +import { useViewMenuItems } from "@/components/common/quick-actions-helper"; import { captureClick } from "@/helpers/event-tracker.helper"; // hooks import { useUser, useUserPermissions } from "@/hooks/store/user"; -import { useViewMenuItems } from "@/components/common/quick-actions-helper"; // local imports import { DeleteGlobalViewModal } from "./delete-view-modal"; import { CreateUpdateWorkspaceViewModal } from "./modal"; diff --git a/apps/web/ee/components/integrations/gitlab/sections/repository-mapping/form/entity-form.tsx b/apps/web/ee/components/integrations/gitlab/sections/repository-mapping/form/entity-form.tsx index 03c9b54dee..68e25cd36f 100644 --- a/apps/web/ee/components/integrations/gitlab/sections/repository-mapping/form/entity-form.tsx +++ b/apps/web/ee/components/integrations/gitlab/sections/repository-mapping/form/entity-form.tsx @@ -6,15 +6,14 @@ import Image from "next/image"; // components import { EConnectionType } from "@plane/etl/gitlab"; import { useTranslation } from "@plane/i18n"; -import { Logo } from "@plane/propel/emoji-icon-picker"; -import { ProjectIcon } from "@plane/propel/icons"; +// assets +import GitlabLogo from "@/app/assets/services/gitlab.svg?url"; // plane web components import { Dropdown } from "@/plane-web/components/importers/ui"; // plane web hooks import { useGitlabIntegration } from "@/plane-web/hooks/store"; // plane web types import type { TProjectMap } from "@/plane-web/types/integrations"; -import GitlabLogo from "@/app/assets/services/gitlab.svg?url"; type TEntityForm = { value: TProjectMap; diff --git a/apps/web/ee/components/projects/layouts/project-layout-HOC.tsx b/apps/web/ee/components/projects/layouts/project-layout-HOC.tsx index 48626bf4d9..9295099d49 100644 --- a/apps/web/ee/components/projects/layouts/project-layout-HOC.tsx +++ b/apps/web/ee/components/projects/layouts/project-layout-HOC.tsx @@ -7,10 +7,10 @@ import { EUserPermissionsLevel, PROJECT_TRACKER_ELEMENTS } from "@plane/constant import { useTranslation } from "@plane/i18n"; import { EUserProjectRoles } from "@plane/types"; // assets -import allFiltersDarkSvg from "@/app/assets/empty-state/project/all-filters-dark.svg?url"; -import allFiltersLightSvg from "@/app/assets/empty-state/project/all-filters-light.svg?url"; import projectsDark from "@/app/assets/empty-state/onboarding/projects-dark.webp?url"; import projectsLight from "@/app/assets/empty-state/onboarding/projects-light.webp?url"; +import allFiltersDarkSvg from "@/app/assets/empty-state/project/all-filters-dark.svg?url"; +import allFiltersLightSvg from "@/app/assets/empty-state/project/all-filters-light.svg?url"; // components import { ComicBoxButton } from "@/components/empty-state/comic-box-button"; import { DetailedEmptyState } from "@/components/empty-state/detailed-empty-state-root"; diff --git a/apps/web/ee/components/projects/teamspaces/link-teamspace-modal.tsx b/apps/web/ee/components/projects/teamspaces/link-teamspace-modal.tsx index 905225edc2..850fcbb8fb 100644 --- a/apps/web/ee/components/projects/teamspaces/link-teamspace-modal.tsx +++ b/apps/web/ee/components/projects/teamspaces/link-teamspace-modal.tsx @@ -15,7 +15,6 @@ import noResultsDark from "@/app/assets/empty-state/teams/no-results-dark.webp?u import noResultsLight from "@/app/assets/empty-state/teams/no-results-light.webp?url"; import noTeamspacesDark from "@/app/assets/empty-state/teams/no-teamspace-dark.webp?url"; import noTeamspacesLight from "@/app/assets/empty-state/teams/no-teamspaces-light.webp?url"; -// components // plane web imports import { useTeamspaces } from "@/plane-web/hooks/store"; diff --git a/apps/web/ee/components/wiki/download-nested-pages-modal/sub-page-item.tsx b/apps/web/ee/components/wiki/download-nested-pages-modal/sub-page-item.tsx index dbf813e83d..eb5b593281 100644 --- a/apps/web/ee/components/wiki/download-nested-pages-modal/sub-page-item.tsx +++ b/apps/web/ee/components/wiki/download-nested-pages-modal/sub-page-item.tsx @@ -1,9 +1,10 @@ import React from "react"; import { observer } from "mobx-react"; // components -import { Logo } from "@/components/common/logo"; +import { Logo } from "@plane/propel/emoji-icon-picker"; // plane web imports -import { EPageStoreType, usePage } from "@/plane-web/hooks/store"; +import type { EPageStoreType } from "@/plane-web/hooks/store"; +import { usePage } from "@/plane-web/hooks/store"; type Props = { pageId: string; diff --git a/apps/web/ee/services/initiative.service.ts b/apps/web/ee/services/initiative.service.ts index 6eec38845a..794c753a4e 100644 --- a/apps/web/ee/services/initiative.service.ts +++ b/apps/web/ee/services/initiative.service.ts @@ -271,8 +271,8 @@ export class InitiativeService extends APIService { initiativeId: string, params: | { - created_at__gt: string; - } + created_at__gt: string; + } | object = {} ): Promise { return this.get(`/api/workspaces/${workspaceSlug}/initiatives/${initiativeId}/activities/`, { diff --git a/apps/web/ee/store/timeline/project-timeline.store.ts b/apps/web/ee/store/timeline/project-timeline.store.ts index 91cb7366f0..3d93e04529 100644 --- a/apps/web/ee/store/timeline/project-timeline.store.ts +++ b/apps/web/ee/store/timeline/project-timeline.store.ts @@ -1,8 +1,8 @@ +import { autorun } from "mobx"; +import type { RootStore } from "@/plane-web/store/root.store"; import type { IBaseTimelineStore } from "ce/store/timeline/base-timeline.store"; import { BaseTimeLineStore } from "ce/store/timeline/base-timeline.store"; -import { autorun } from "mobx"; // Store -import type { RootStore } from "@/plane-web/store/root.store"; export interface IProjectsTimeLineStore extends IBaseTimelineStore { isDependencyEnabled: boolean; diff --git a/packages/etl/src/jira-server/etl/transform.ts b/packages/etl/src/jira-server/etl/transform.ts index 5f0e10fc8d..cadaed5aac 100644 --- a/packages/etl/src/jira-server/etl/transform.ts +++ b/packages/etl/src/jira-server/etl/transform.ts @@ -98,7 +98,7 @@ export const transformComment = ( created_by: comment.author?.name, comment_html: comment.renderedBody ?? "

", actor: comment.author?.name, - issue: `${projectId}_${resourceId}_${comment.issue_id}` + issue: `${projectId}_${resourceId}_${comment.issue_id}`, }); export const transformUser = (user: ImportedJiraUser): Partial => { @@ -150,7 +150,7 @@ export const transformIssueType = ( is_epic: isEpic, external_id: `${projectId}_${resourceId}_${issueType.id}`, external_source: E_IMPORTER_KEYS.JIRA_SERVER, - } + }; }; export const transformIssueFields = ( diff --git a/packages/i18n/src/locales/cs/empty-state-extended.ts b/packages/i18n/src/locales/cs/empty-state-extended.ts index d4c2815b96..ece262e4ed 100644 --- a/packages/i18n/src/locales/cs/empty-state-extended.ts +++ b/packages/i18n/src/locales/cs/empty-state-extended.ts @@ -22,67 +22,80 @@ export default { }, active_cycles: { title: "Žádné aktivní cykly", - description: "Momentálně nemáte žádné probíhající cykly. Aktivní cykly se zde zobrazí, když budou zahrnovat dnešní datum.", + description: + "Momentálně nemáte žádné probíhající cykly. Aktivní cykly se zde zobrazí, když budou zahrnovat dnešní datum.", }, teamspaces: { title: "S týmovými prostory odemkněte lepší organizaci a sledování", - description: "Vytvořte vyhrazený prostor pro každý skutečný tým, oddělený od všech ostatních pracovních povrchů v Plane, a přizpůsobte je tomu, jak váš tým pracuje.", + description: + "Vytvořte vyhrazený prostor pro každý skutečný tým, oddělený od všech ostatních pracovních povrchů v Plane, a přizpůsobte je tomu, jak váš tým pracuje.", cta_primary: "Vytvořit nový týmový prostor", }, initiatives: { title: "Sledujte projekty a epiky z jednoho místa", - description: "Použijte iniciativy ke seskupení a sledování souvisejících projektů a epiků. Zobrazujte pokrok, priority a výsledky—vše z jediné obrazovky.", + description: + "Použijte iniciativy ke seskupení a sledování souvisejících projektů a epiků. Zobrazujte pokrok, priority a výsledky—vše z jediné obrazovky.", cta_primary: "Vytvořit iniciativu", }, customers: { title: "Spravujte práci podle toho, co je důležité pro vaše zákazníky", - description: "Propojte požadavky zákazníků s pracovními položkami, přiřaďte prioritu podle požadavků a shrňte stavy pracovních položek do záznamů zákazníků. Brzy se budete moci integrovat s vaším CRM nebo nástrojem podpory pro ještě lepší správu práce podle atributů zákazníků.", + description: + "Propojte požadavky zákazníků s pracovními položkami, přiřaďte prioritu podle požadavků a shrňte stavy pracovních položek do záznamů zákazníků. Brzy se budete moci integrovat s vaším CRM nebo nástrojem podpory pro ještě lepší správu práce podle atributů zákazníků.", cta_primary: "Vytvořit záznam zákazníka", }, dashboard: { title: "Vizualizujte svůj pokrok pomocí přehledů", - description: "Vytvářejte přizpůsobitelné přehledy pro sledování metrik, měření výsledků a efektivní prezentaci poznatků.", + description: + "Vytvářejte přizpůsobitelné přehledy pro sledování metrik, měření výsledků a efektivní prezentaci poznatků.", cta_primary: "Vytvořit nový přehled", }, wiki: { title: "Napište poznámku, dokument nebo celou znalostní bázi.", - description: "Stránky jsou prostorem pro zachycení myšlenek v Plane. Pořizujte poznámky ze schůzek, snadno je formátujte, vkládejte pracovní položky, uspořádejte je pomocí knihovny komponent a udržujte vše v kontextu vašeho projektu.", + description: + "Stránky jsou prostorem pro zachycení myšlenek v Plane. Pořizujte poznámky ze schůzek, snadno je formátujte, vkládejte pracovní položky, uspořádejte je pomocí knihovny komponent a udržujte vše v kontextu vašeho projektu.", cta_primary: "Vytvořte svou stránku", }, }, settings_empty_state: { teamspace: { title: "Zatím žádný týmový prostor", - description: "Spojte své členy v týmovém prostoru pro sledování pokroku, pracovní zátěže a aktivity - bez námahy. Zjistit více", + description: + "Spojte své členy v týmovém prostoru pro sledování pokroku, pracovní zátěže a aktivity - bez námahy. Zjistit více", cta_primary: "Přidat týmový prostor", }, work_item_types: { title: "Vytvářejte a přizpůsobujte typy pracovních položek", - description: "Definujte jedinečné typy pracovních položek pro váš projekt. Každý typ může mít své vlastní vlastnosti, pracovní postupy a pole - přizpůsobené potřebám vašeho projektu a týmu.", + description: + "Definujte jedinečné typy pracovních položek pro váš projekt. Každý typ může mít své vlastní vlastnosti, pracovní postupy a pole - přizpůsobené potřebám vašeho projektu a týmu.", cta_primary: "Povolit", }, work_item_type_properties: { - title: "Definujte vlastnost a podrobnosti, které chcete zachytit pro tento typ pracovní položky. Přizpůsobte jej pracovnímu postupu vašeho projektu.", + title: + "Definujte vlastnost a podrobnosti, které chcete zachytit pro tento typ pracovní položky. Přizpůsobte jej pracovnímu postupu vašeho projektu.", cta_secondary: "Přidat vlastnost", }, epic_setting: { title: "Povolit epiky", - description: "Seskupte související pracovní položky do větších celků, které se rozprostírají přes více cyklů a modulů - ideální pro sledování celkového pokroku.", + description: + "Seskupte související pracovní položky do větších celků, které se rozprostírají přes více cyklů a modulů - ideální pro sledování celkového pokroku.", cta_primary: "Povolit", }, templates: { title: "Zatím žádné šablony", - description: "Zkraťte dobu nastavení vytvářením šablon pro pracovní položky a stránky — a začněte novou práci během několika sekund.", + description: + "Zkraťte dobu nastavení vytvářením šablon pro pracovní položky a stránky — a začněte novou práci během několika sekund.", cta_primary: "Vytvořte svou první šablonu", }, recurring_work_items: { title: "Zatím žádná opakující se pracovní položka", - description: "Nastavte opakující se pracovní položky pro automatizaci opakujících se úkolů a snadné dodržování harmonogramu.", + description: + "Nastavte opakující se pracovní položky pro automatizaci opakujících se úkolů a snadné dodržování harmonogramu.", cta_primary: "Vytvořit opakující se pracovní položku", }, worklogs: { title: "Sledujte časové výkazy pro všechny členy", - description: "Zaznamenávejte čas na pracovních položkách pro zobrazení podrobných časových výkazů pro jakéhokoli člena týmu napříč projekty.", + description: + "Zaznamenávejte čas na pracovních položkách pro zobrazení podrobných časových výkazů pro jakéhokoli člena týmu napříč projekty.", }, customers_setting: { title: "Povolte správu zákazníků pro začátek.", @@ -90,7 +103,8 @@ export default { }, template_setting: { title: "Zatím žádné šablony", - description: "Zkraťte dobu nastavení vytvářením šablon pro projekty, pracovní položky a stránky — a začněte novou práci během několika sekund.", + description: + "Zkraťte dobu nastavení vytvářením šablon pro projekty, pracovní položky a stránky — a začněte novou práci během několika sekund.", cta_primary: "Vytvořit šablonu", }, webhooks: { diff --git a/packages/i18n/src/locales/de/empty-state-extended.ts b/packages/i18n/src/locales/de/empty-state-extended.ts index 352399647d..621f294435 100644 --- a/packages/i18n/src/locales/de/empty-state-extended.ts +++ b/packages/i18n/src/locales/de/empty-state-extended.ts @@ -14,75 +14,90 @@ export default { }, workspace_empty_state: { home_widget_stickies: { - title: "Notieren Sie eine Idee, erfassen Sie einen Aha-Moment oder halten Sie einen Geistesblitz fest. Fügen Sie einen Haftnotiz hinzu, um zu beginnen.", + title: + "Notieren Sie eine Idee, erfassen Sie einen Aha-Moment oder halten Sie einen Geistesblitz fest. Fügen Sie einen Haftnotiz hinzu, um zu beginnen.", }, stickies: { - title: "Notieren Sie eine Idee, erfassen Sie einen Aha-Moment oder halten Sie einen Geistesblitz fest. Fügen Sie einen Haftnotiz hinzu, um zu beginnen.", + title: + "Notieren Sie eine Idee, erfassen Sie einen Aha-Moment oder halten Sie einen Geistesblitz fest. Fügen Sie einen Haftnotiz hinzu, um zu beginnen.", cta_primary: "Haftnotiz hinzufügen", }, active_cycles: { title: "Keine aktiven Zyklen", - description: "Sie haben derzeit keine laufenden Zyklen. Aktive Zyklen erscheinen hier, wenn sie das heutige Datum enthalten.", + description: + "Sie haben derzeit keine laufenden Zyklen. Aktive Zyklen erscheinen hier, wenn sie das heutige Datum enthalten.", }, teamspaces: { title: "Mit Teamspaces bessere Organisation und Nachverfolgung freischalten", - description: "Erstellen Sie eine dedizierte Oberfläche für jedes reale Team, getrennt von allen anderen Arbeitsoberflächen in Plane, und passen Sie sie an die Arbeitsweise Ihres Teams an.", + description: + "Erstellen Sie eine dedizierte Oberfläche für jedes reale Team, getrennt von allen anderen Arbeitsoberflächen in Plane, und passen Sie sie an die Arbeitsweise Ihres Teams an.", cta_primary: "Neuen Teamspace erstellen", }, initiatives: { title: "Verfolgen Sie Projekte und Epics von einem Ort aus", - description: "Verwenden Sie Initiativen, um verwandte Projekte und Epics zu gruppieren und zu überwachen. Sehen Sie Fortschritt, Prioritäten und Ergebnisse—alles von einem einzigen Bildschirm aus.", + description: + "Verwenden Sie Initiativen, um verwandte Projekte und Epics zu gruppieren und zu überwachen. Sehen Sie Fortschritt, Prioritäten und Ergebnisse—alles von einem einzigen Bildschirm aus.", cta_primary: "Initiative erstellen", }, customers: { title: "Verwalten Sie Arbeit nach dem, was für Ihre Kunden wichtig ist", - description: "Bringen Sie Kundenanfragen zu Arbeitselementen, weisen Sie Prioritäten nach Anfragen zu und fassen Sie Arbeitselementzustände in Kundendatensätzen zusammen. Bald werden Sie sich mit Ihrem CRM oder Support-Tool integrieren können für eine noch bessere Arbeitsverwaltung nach Kundenattributen.", + description: + "Bringen Sie Kundenanfragen zu Arbeitselementen, weisen Sie Prioritäten nach Anfragen zu und fassen Sie Arbeitselementzustände in Kundendatensätzen zusammen. Bald werden Sie sich mit Ihrem CRM oder Support-Tool integrieren können für eine noch bessere Arbeitsverwaltung nach Kundenattributen.", cta_primary: "Kundendatensatz erstellen", }, dashboard: { title: "Visualisieren Sie Ihren Fortschritt mit Dashboards", - description: "Erstellen Sie anpassbare Dashboards, um Metriken zu verfolgen, Ergebnisse zu messen und Erkenntnisse effektiv zu präsentieren.", + description: + "Erstellen Sie anpassbare Dashboards, um Metriken zu verfolgen, Ergebnisse zu messen und Erkenntnisse effektiv zu präsentieren.", cta_primary: "Neues Dashboard erstellen", }, wiki: { title: "Schreiben Sie eine Notiz, ein Dokument oder eine vollständige Wissensdatenbank.", - description: "Seiten sind Gedankenraum in Plane. Notieren Sie Besprechungsnotizen, formatieren Sie sie einfach, betten Sie Arbeitselemente ein, ordnen Sie sie mit einer Bibliothek von Komponenten an und behalten Sie alles im Kontext Ihres Projekts.", + description: + "Seiten sind Gedankenraum in Plane. Notieren Sie Besprechungsnotizen, formatieren Sie sie einfach, betten Sie Arbeitselemente ein, ordnen Sie sie mit einer Bibliothek von Komponenten an und behalten Sie alles im Kontext Ihres Projekts.", cta_primary: "Erstellen Sie Ihre Seite", }, }, settings_empty_state: { teamspace: { title: "Noch kein Teamspace", - description: "Bringen Sie Ihre Mitglieder in einem Teamspace zusammen, um Fortschritt, Arbeitslast und Aktivität mühelos zu verfolgen. Mehr erfahren", + description: + "Bringen Sie Ihre Mitglieder in einem Teamspace zusammen, um Fortschritt, Arbeitslast und Aktivität mühelos zu verfolgen. Mehr erfahren", cta_primary: "Teamspace hinzufügen", }, work_item_types: { title: "Arbeitselementtypen erstellen und anpassen", - description: "Definieren Sie einzigartige Arbeitselementtypen für Ihr Projekt. Jeder Typ kann seine eigenen Eigenschaften, Workflows und Felder haben - zugeschnitten auf die Bedürfnisse Ihres Projekts und Teams.", + description: + "Definieren Sie einzigartige Arbeitselementtypen für Ihr Projekt. Jeder Typ kann seine eigenen Eigenschaften, Workflows und Felder haben - zugeschnitten auf die Bedürfnisse Ihres Projekts und Teams.", cta_primary: "Aktivieren", }, work_item_type_properties: { - title: "Definieren Sie die Eigenschaft und Details, die Sie für diesen Arbeitselementtyp erfassen möchten. Passen Sie ihn an den Workflow Ihres Projekts an.", + title: + "Definieren Sie die Eigenschaft und Details, die Sie für diesen Arbeitselementtyp erfassen möchten. Passen Sie ihn an den Workflow Ihres Projekts an.", cta_secondary: "Eigenschaft hinzufügen", }, epic_setting: { title: "Epics aktivieren", - description: "Gruppieren Sie verwandte Arbeitselemente in größere Einheiten, die sich über mehrere Zyklen und Module erstrecken - perfekt für die Verfolgung des Gesamtfortschritts.", + description: + "Gruppieren Sie verwandte Arbeitselemente in größere Einheiten, die sich über mehrere Zyklen und Module erstrecken - perfekt für die Verfolgung des Gesamtfortschritts.", cta_primary: "Aktivieren", }, templates: { title: "Noch keine Vorlagen", - description: "Reduzieren Sie die Einrichtungszeit, indem Sie Vorlagen für Arbeitselemente und Seiten erstellen — und starten Sie neue Arbeit in Sekunden.", + description: + "Reduzieren Sie die Einrichtungszeit, indem Sie Vorlagen für Arbeitselemente und Seiten erstellen — und starten Sie neue Arbeit in Sekunden.", cta_primary: "Erstellen Sie Ihre erste Vorlage", }, recurring_work_items: { title: "Noch kein wiederkehrendes Arbeitselement", - description: "Richten Sie wiederkehrende Arbeitselemente ein, um wiederholte Aufgaben zu automatisieren und mühelos im Zeitplan zu bleiben.", + description: + "Richten Sie wiederkehrende Arbeitselemente ein, um wiederholte Aufgaben zu automatisieren und mühelos im Zeitplan zu bleiben.", cta_primary: "Wiederkehrendes Arbeitselement erstellen", }, worklogs: { title: "Zeiterfassungen für alle Mitglieder verfolgen", - description: "Erfassen Sie Zeit für Arbeitselemente, um detaillierte Zeiterfassungen für jedes Teammitglied über Projekte hinweg anzuzeigen.", + description: + "Erfassen Sie Zeit für Arbeitselemente, um detaillierte Zeiterfassungen für jedes Teammitglied über Projekte hinweg anzuzeigen.", }, customers_setting: { title: "Aktivieren Sie Kundenverwaltung, um zu beginnen.", @@ -90,7 +105,8 @@ export default { }, template_setting: { title: "Noch keine Vorlagen", - description: "Reduzieren Sie die Einrichtungszeit, indem Sie Vorlagen für Projekte, Arbeitselemente und Seiten erstellen — und starten Sie neue Arbeit in Sekunden.", + description: + "Reduzieren Sie die Einrichtungszeit, indem Sie Vorlagen für Projekte, Arbeitselemente und Seiten erstellen — und starten Sie neue Arbeit in Sekunden.", cta_primary: "Vorlage erstellen", }, webhooks: { diff --git a/packages/i18n/src/locales/en/empty-state-extended.ts b/packages/i18n/src/locales/en/empty-state-extended.ts index e74c927e77..2e66f17c1f 100644 --- a/packages/i18n/src/locales/en/empty-state-extended.ts +++ b/packages/i18n/src/locales/en/empty-state-extended.ts @@ -22,52 +22,62 @@ export default { }, active_cycles: { title: "No active cycles", - description: "You don't have any ongoing cycles right now. Active cycles appear here when they include today's date.", + description: + "You don't have any ongoing cycles right now. Active cycles appear here when they include today's date.", }, teamspaces: { title: "With teamspaces unlock better organization and tracking", - description: "Create a dedicated surface for every real-world team, separate from all other work surfaces in Plane, and customize them to suit how your team works.", + description: + "Create a dedicated surface for every real-world team, separate from all other work surfaces in Plane, and customize them to suit how your team works.", cta_primary: "Create a new Teamspace", }, initiatives: { title: "Track projects and epics from one place", - description: "Use initiatives to group and monitor related projects and epics. View progress, priorities, and outcomes—all from a single screen.", + description: + "Use initiatives to group and monitor related projects and epics. View progress, priorities, and outcomes—all from a single screen.", cta_primary: "Create an Initiative", }, customers: { title: "Manage work by what's important to your customers", - description: "Bring customer requests to work items, assign priority by requests, and roll up work items' states into customer records. Soon, you will integrate with your CRM or Support tool for even better work management by customer attributes.", + description: + "Bring customer requests to work items, assign priority by requests, and roll up work items' states into customer records. Soon, you will integrate with your CRM or Support tool for even better work management by customer attributes.", cta_primary: "Create customer record", }, dashboard: { title: "Visualize your progress with dashboards", - description: "Build customizable dashboards to track metrics, measure outcomes, and present insights effectively.", + description: + "Build customizable dashboards to track metrics, measure outcomes, and present insights effectively.", cta_primary: "Create new dashboard", }, wiki: { title: "Write a note, a doc, or a full knowledge base.", - description: "Pages are thought spotting space in Plane. Take down meeting notes, format them easily, embed work items, lay them out using a library of components, and keep them all in your project's context.", + description: + "Pages are thought spotting space in Plane. Take down meeting notes, format them easily, embed work items, lay them out using a library of components, and keep them all in your project's context.", cta_primary: "Create your page", }, }, settings_empty_state: { teamspace: { title: "No teamspace yet", - description: "Bring together your members in a teamspace to track progress, workload, and activity - effortlessly.. Learn more", + description: + "Bring together your members in a teamspace to track progress, workload, and activity - effortlessly.. Learn more", cta_primary: "Add teamspace", }, work_item_types: { title: "Create and customize work item types", - description: "Define unique work item types for your project. Each type can have its own properties, workflows, and fields - tailored to your project and team's needs.", + description: + "Define unique work item types for your project. Each type can have its own properties, workflows, and fields - tailored to your project and team's needs.", cta_primary: "Enable", }, work_item_type_properties: { - title: "Define the property and details you want to capture for this work item type. Customize it to match your project's workflow.", + title: + "Define the property and details you want to capture for this work item type. Customize it to match your project's workflow.", cta_secondary: "Add property", }, epic_setting: { title: "Enable Epics", - description: "Group related work items into larger bodies that span multiple cycles and modules - perfect for tracking big-picture progress.", + description: + "Group related work items into larger bodies that span multiple cycles and modules - perfect for tracking big-picture progress.", cta_primary: "Enable", }, templates: { @@ -90,7 +100,8 @@ export default { }, template_setting: { title: "No templates yet", - description: "Reduce setup time by creating templates for projects, work items, and pages — and start new work in seconds.", + description: + "Reduce setup time by creating templates for projects, work items, and pages — and start new work in seconds.", cta_primary: "Create template", }, webhooks: { diff --git a/packages/i18n/src/locales/es/empty-state-extended.ts b/packages/i18n/src/locales/es/empty-state-extended.ts index c9268df37f..a32980255a 100644 --- a/packages/i18n/src/locales/es/empty-state-extended.ts +++ b/packages/i18n/src/locales/es/empty-state-extended.ts @@ -14,75 +14,90 @@ export default { }, workspace_empty_state: { home_widget_stickies: { - title: "Anota una idea, captura un descubrimiento o registra una lluvia de ideas. Agrega una nota adhesiva para comenzar.", + title: + "Anota una idea, captura un descubrimiento o registra una lluvia de ideas. Agrega una nota adhesiva para comenzar.", }, stickies: { - title: "Anota una idea, captura un descubrimiento o registra una lluvia de ideas. Agrega una nota adhesiva para comenzar.", + title: + "Anota una idea, captura un descubrimiento o registra una lluvia de ideas. Agrega una nota adhesiva para comenzar.", cta_primary: "Agregar nota adhesiva", }, active_cycles: { title: "No hay ciclos activos", - description: "No tienes ningún ciclo en curso en este momento. Los ciclos activos aparecen aquí cuando incluyen la fecha de hoy.", + description: + "No tienes ningún ciclo en curso en este momento. Los ciclos activos aparecen aquí cuando incluyen la fecha de hoy.", }, teamspaces: { title: "Con teamspaces desbloquea mejor organización y seguimiento", - description: "Crea una superficie dedicada para cada equipo del mundo real, separada de todas las demás superficies de trabajo en Plane, y personalízalas para adaptarse a cómo trabaja tu equipo.", + description: + "Crea una superficie dedicada para cada equipo del mundo real, separada de todas las demás superficies de trabajo en Plane, y personalízalas para adaptarse a cómo trabaja tu equipo.", cta_primary: "Crear un nuevo Teamspace", }, initiatives: { title: "Rastrea proyectos y épicas desde un solo lugar", - description: "Usa iniciativas para agrupar y monitorear proyectos y épicas relacionados. Ve el progreso, prioridades y resultados — todo desde una sola pantalla.", + description: + "Usa iniciativas para agrupar y monitorear proyectos y épicas relacionados. Ve el progreso, prioridades y resultados — todo desde una sola pantalla.", cta_primary: "Crear una Iniciativa", }, customers: { title: "Gestiona el trabajo según lo que es importante para tus clientes", - description: "Vincula las solicitudes de los clientes a los elementos de trabajo, asigna prioridad según las solicitudes y agrupa los estados de los elementos de trabajo en los registros de los clientes. Pronto, podrás integrarte con tu herramienta de CRM o Soporte para una gestión del trabajo aún mejor según los atributos de los clientes.", + description: + "Vincula las solicitudes de los clientes a los elementos de trabajo, asigna prioridad según las solicitudes y agrupa los estados de los elementos de trabajo en los registros de los clientes. Pronto, podrás integrarte con tu herramienta de CRM o Soporte para una gestión del trabajo aún mejor según los atributos de los clientes.", cta_primary: "Crear registro de cliente", }, dashboard: { title: "Visualiza tu progreso con paneles de control", - description: "Crea paneles personalizables para rastrear métricas, medir resultados y presentar insights de manera efectiva.", + description: + "Crea paneles personalizables para rastrear métricas, medir resultados y presentar insights de manera efectiva.", cta_primary: "Crear nuevo panel", }, wiki: { title: "Escribe una nota, un documento o una base de conocimientos completa.", - description: "Las páginas son un espacio para capturar ideas en Plane. Toma notas de reuniones, dales formato fácilmente, incrusta elementos de trabajo, organízalas usando una biblioteca de componentes y mantenlas todas en el contexto de tu proyecto.", + description: + "Las páginas son un espacio para capturar ideas en Plane. Toma notas de reuniones, dales formato fácilmente, incrusta elementos de trabajo, organízalas usando una biblioteca de componentes y mantenlas todas en el contexto de tu proyecto.", cta_primary: "Crea tu página", }, }, settings_empty_state: { teamspace: { title: "Aún no hay teamspace", - description: "Reúne a tus miembros en un teamspace para rastrear el progreso, carga de trabajo y actividad — sin esfuerzo. Más información", + description: + "Reúne a tus miembros en un teamspace para rastrear el progreso, carga de trabajo y actividad — sin esfuerzo. Más información", cta_primary: "Agregar teamspace", }, work_item_types: { title: "Crea y personaliza tipos de elementos de trabajo", - description: "Define tipos únicos de elementos de trabajo para tu proyecto. Cada tipo puede tener sus propias propiedades, flujos de trabajo y campos — adaptados a las necesidades de tu proyecto y equipo.", + description: + "Define tipos únicos de elementos de trabajo para tu proyecto. Cada tipo puede tener sus propias propiedades, flujos de trabajo y campos — adaptados a las necesidades de tu proyecto y equipo.", cta_primary: "Habilitar", }, work_item_type_properties: { - title: "Define la propiedad y los detalles que deseas capturar para este tipo de elemento de trabajo. Personalízalo para que coincida con el flujo de trabajo de tu proyecto.", + title: + "Define la propiedad y los detalles que deseas capturar para este tipo de elemento de trabajo. Personalízalo para que coincida con el flujo de trabajo de tu proyecto.", cta_secondary: "Agregar propiedad", }, epic_setting: { title: "Habilitar Épicas", - description: "Agrupa elementos de trabajo relacionados en cuerpos más grandes que abarquen múltiples ciclos y módulos — perfecto para rastrear el progreso general.", + description: + "Agrupa elementos de trabajo relacionados en cuerpos más grandes que abarquen múltiples ciclos y módulos — perfecto para rastrear el progreso general.", cta_primary: "Habilitar", }, templates: { title: "Aún no hay plantillas", - description: "Reduce el tiempo de configuración creando plantillas para elementos de trabajo y páginas — y comienza un nuevo trabajo en segundos.", + description: + "Reduce el tiempo de configuración creando plantillas para elementos de trabajo y páginas — y comienza un nuevo trabajo en segundos.", cta_primary: "Crea tu primera plantilla", }, recurring_work_items: { title: "Aún no hay elementos de trabajo recurrentes", - description: "Configura elementos de trabajo recurrentes para automatizar tareas repetidas y mantenerte en el horario sin esfuerzo.", + description: + "Configura elementos de trabajo recurrentes para automatizar tareas repetidas y mantenerte en el horario sin esfuerzo.", cta_primary: "Crear elemento de trabajo recurrente", }, worklogs: { title: "Rastrea hojas de tiempo para todos los miembros", - description: "Registra el tiempo en los elementos de trabajo para ver hojas de tiempo detalladas de cualquier miembro del equipo en todos los proyectos.", + description: + "Registra el tiempo en los elementos de trabajo para ver hojas de tiempo detalladas de cualquier miembro del equipo en todos los proyectos.", }, customers_setting: { title: "Habilita la gestión de clientes para comenzar.", @@ -90,7 +105,8 @@ export default { }, template_setting: { title: "Aún no hay plantillas", - description: "Reduce el tiempo de configuración creando plantillas para proyectos, elementos de trabajo y páginas — y comienza un nuevo trabajo en segundos.", + description: + "Reduce el tiempo de configuración creando plantillas para proyectos, elementos de trabajo y páginas — y comienza un nuevo trabajo en segundos.", cta_primary: "Crear plantilla", }, webhooks: { diff --git a/packages/i18n/src/locales/fr/empty-state-extended.ts b/packages/i18n/src/locales/fr/empty-state-extended.ts index e34a71e955..391398e943 100644 --- a/packages/i18n/src/locales/fr/empty-state-extended.ts +++ b/packages/i18n/src/locales/fr/empty-state-extended.ts @@ -22,67 +22,80 @@ export default { }, active_cycles: { title: "Aucun cycle actif", - description: "Vous n'avez aucun cycle en cours pour le moment. Les cycles actifs apparaissent ici lorsqu'ils incluent la date d'aujourd'hui.", + description: + "Vous n'avez aucun cycle en cours pour le moment. Les cycles actifs apparaissent ici lorsqu'ils incluent la date d'aujourd'hui.", }, teamspaces: { title: "Avec les teamspaces, débloquez une meilleure organisation et un meilleur suivi", - description: "Créez une surface dédiée pour chaque équipe réelle, séparée de toutes les autres surfaces de travail dans Plane, et personnalisez-les pour correspondre à la façon dont votre équipe travaille.", + description: + "Créez une surface dédiée pour chaque équipe réelle, séparée de toutes les autres surfaces de travail dans Plane, et personnalisez-les pour correspondre à la façon dont votre équipe travaille.", cta_primary: "Créer un nouveau Teamspace", }, initiatives: { title: "Suivez les projets et les épiques depuis un seul endroit", - description: "Utilisez les initiatives pour regrouper et surveiller les projets et épiques connexes. Visualisez les progrès, les priorités et les résultats—tous à partir d'un seul écran.", + description: + "Utilisez les initiatives pour regrouper et surveiller les projets et épiques connexes. Visualisez les progrès, les priorités et les résultats—tous à partir d'un seul écran.", cta_primary: "Créer une Initiative", }, customers: { title: "Gérez le travail en fonction de ce qui est important pour vos clients", - description: "Apportez les demandes des clients aux éléments de travail, attribuez une priorité par demandes, et regroupez les états des éléments de travail dans les enregistrements clients. Bientôt, vous intégrerez votre CRM ou outil de Support pour une meilleure gestion du travail selon les attributs clients.", + description: + "Apportez les demandes des clients aux éléments de travail, attribuez une priorité par demandes, et regroupez les états des éléments de travail dans les enregistrements clients. Bientôt, vous intégrerez votre CRM ou outil de Support pour une meilleure gestion du travail selon les attributs clients.", cta_primary: "Créer un enregistrement client", }, dashboard: { title: "Visualisez votre progression avec des tableaux de bord", - description: "Créez des tableaux de bord personnalisables pour suivre les métriques, mesurer les résultats et présenter efficacement les insights.", + description: + "Créez des tableaux de bord personnalisables pour suivre les métriques, mesurer les résultats et présenter efficacement les insights.", cta_primary: "Créer un nouveau tableau de bord", }, wiki: { title: "Écrivez une note, un document ou une base de connaissances complète.", - description: "Les pages sont un espace de repérage de pensées dans Plane. Prenez des notes de réunion, formatez-les facilement, intégrez des éléments de travail, organisez-les à l'aide d'une bibliothèque de composants, et gardez-les tous dans le contexte de votre projet.", + description: + "Les pages sont un espace de repérage de pensées dans Plane. Prenez des notes de réunion, formatez-les facilement, intégrez des éléments de travail, organisez-les à l'aide d'une bibliothèque de composants, et gardez-les tous dans le contexte de votre projet.", cta_primary: "Créer votre page", }, }, settings_empty_state: { teamspace: { title: "Aucun teamspace pour le moment", - description: "Rassemblez vos membres dans un teamspace pour suivre les progrès, la charge de travail et l'activité - sans effort.. En savoir plus", + description: + "Rassemblez vos membres dans un teamspace pour suivre les progrès, la charge de travail et l'activité - sans effort.. En savoir plus", cta_primary: "Ajouter un teamspace", }, work_item_types: { title: "Créer et personnaliser les types d'éléments de travail", - description: "Définissez des types d'éléments de travail uniques pour votre projet. Chaque type peut avoir ses propres propriétés, flux de travail et champs - adaptés aux besoins de votre projet et de votre équipe.", + description: + "Définissez des types d'éléments de travail uniques pour votre projet. Chaque type peut avoir ses propres propriétés, flux de travail et champs - adaptés aux besoins de votre projet et de votre équipe.", cta_primary: "Activer", }, work_item_type_properties: { - title: "Définissez la propriété et les détails que vous souhaitez capturer pour ce type d'élément de travail. Personnalisez-le pour correspondre au flux de travail de votre projet.", + title: + "Définissez la propriété et les détails que vous souhaitez capturer pour ce type d'élément de travail. Personnalisez-le pour correspondre au flux de travail de votre projet.", cta_secondary: "Ajouter une propriété", }, epic_setting: { title: "Activer les Épiques", - description: "Regroupez les éléments de travail connexes en ensembles plus larges qui s'étendent sur plusieurs cycles et modules - parfait pour suivre les progrès d'ensemble.", + description: + "Regroupez les éléments de travail connexes en ensembles plus larges qui s'étendent sur plusieurs cycles et modules - parfait pour suivre les progrès d'ensemble.", cta_primary: "Activer", }, templates: { title: "Aucun modèle pour le moment", - description: "Réduisez le temps de configuration en créant des modèles pour les éléments de travail et les pages — et démarrez un nouveau travail en quelques secondes.", + description: + "Réduisez le temps de configuration en créant des modèles pour les éléments de travail et les pages — et démarrez un nouveau travail en quelques secondes.", cta_primary: "Créer votre premier modèle", }, recurring_work_items: { title: "Aucun élément de travail récurrent pour le moment", - description: "Configurez des éléments de travail récurrents pour automatiser les tâches répétitives et rester à l'heure sans effort.", + description: + "Configurez des éléments de travail récurrents pour automatiser les tâches répétitives et rester à l'heure sans effort.", cta_primary: "Créer un élément de travail récurrent", }, worklogs: { title: "Suivez les feuilles de temps pour tous les membres", - description: "Enregistrez le temps sur les éléments de travail pour afficher des feuilles de temps détaillées pour tout membre de l'équipe à travers les projets.", + description: + "Enregistrez le temps sur les éléments de travail pour afficher des feuilles de temps détaillées pour tout membre de l'équipe à travers les projets.", }, customers_setting: { title: "Activez la gestion des clients pour commencer.", @@ -90,12 +103,14 @@ export default { }, template_setting: { title: "Aucun modèle pour le moment", - description: "Réduisez le temps de configuration en créant des modèles pour les projets, les éléments de travail et les pages — et démarrez un nouveau travail en quelques secondes.", + description: + "Réduisez le temps de configuration en créant des modèles pour les projets, les éléments de travail et les pages — et démarrez un nouveau travail en quelques secondes.", cta_primary: "Créer un modèle", }, webhooks: { title: "Aucun Webhook ajouté pour le moment", - description: "Automatisez les notifications vers des services externes lorsque des événements de projet se produisent.", + description: + "Automatisez les notifications vers des services externes lorsque des événements de projet se produisent.", cta_primary: "Ajouter un webhook", }, }, diff --git a/packages/i18n/src/locales/id/empty-state-extended.ts b/packages/i18n/src/locales/id/empty-state-extended.ts index 8b2c448599..ce6fa029b3 100644 --- a/packages/i18n/src/locales/id/empty-state-extended.ts +++ b/packages/i18n/src/locales/id/empty-state-extended.ts @@ -22,67 +22,80 @@ export default { }, active_cycles: { title: "Tidak ada siklus aktif", - description: "Anda tidak memiliki siklus yang sedang berjalan saat ini. Siklus aktif muncul di sini ketika mereka mencakup tanggal hari ini.", + description: + "Anda tidak memiliki siklus yang sedang berjalan saat ini. Siklus aktif muncul di sini ketika mereka mencakup tanggal hari ini.", }, teamspaces: { title: "Dengan ruang tim buka kunci organisasi dan pelacakan yang lebih baik", - description: "Buat permukaan khusus untuk setiap tim dunia nyata, terpisah dari semua permukaan kerja lainnya di Plane, dan sesuaikan agar sesuai dengan cara kerja tim Anda.", + description: + "Buat permukaan khusus untuk setiap tim dunia nyata, terpisah dari semua permukaan kerja lainnya di Plane, dan sesuaikan agar sesuai dengan cara kerja tim Anda.", cta_primary: "Buat Ruang Tim baru", }, initiatives: { title: "Lacak proyek dan epik dari satu tempat", - description: "Gunakan inisiatif untuk mengelompokkan dan memantau proyek dan epik terkait. Lihat kemajuan, prioritas, dan hasil—semua dari satu layar.", + description: + "Gunakan inisiatif untuk mengelompokkan dan memantau proyek dan epik terkait. Lihat kemajuan, prioritas, dan hasil—semua dari satu layar.", cta_primary: "Buat Inisiatif", }, customers: { title: "Kelola pekerjaan berdasarkan apa yang penting bagi pelanggan Anda", - description: "Bawa permintaan pelanggan ke item kerja, tetapkan prioritas berdasarkan permintaan, dan gulung status item kerja ke dalam catatan pelanggan. Segera, Anda akan berintegrasi dengan alat CRM atau Dukungan Anda untuk manajemen pekerjaan yang lebih baik berdasarkan atribut pelanggan.", + description: + "Bawa permintaan pelanggan ke item kerja, tetapkan prioritas berdasarkan permintaan, dan gulung status item kerja ke dalam catatan pelanggan. Segera, Anda akan berintegrasi dengan alat CRM atau Dukungan Anda untuk manajemen pekerjaan yang lebih baik berdasarkan atribut pelanggan.", cta_primary: "Buat catatan pelanggan", }, dashboard: { title: "Visualisasikan kemajuan Anda dengan dasbor", - description: "Bangun dasbor yang dapat disesuaikan untuk melacak metrik, mengukur hasil, dan menyajikan wawasan secara efektif.", + description: + "Bangun dasbor yang dapat disesuaikan untuk melacak metrik, mengukur hasil, dan menyajikan wawasan secara efektif.", cta_primary: "Buat dasbor baru", }, wiki: { title: "Tulis catatan, dokumen, atau basis pengetahuan lengkap.", - description: "Halaman adalah ruang penangkapan pemikiran di Plane. Catat catatan rapat, format dengan mudah, sematkan item kerja, tata menggunakan perpustakaan komponen, dan simpan semuanya dalam konteks proyek Anda.", + description: + "Halaman adalah ruang penangkapan pemikiran di Plane. Catat catatan rapat, format dengan mudah, sematkan item kerja, tata menggunakan perpustakaan komponen, dan simpan semuanya dalam konteks proyek Anda.", cta_primary: "Buat halaman Anda", }, }, settings_empty_state: { teamspace: { title: "Belum ada ruang tim", - description: "Kumpulkan anggota Anda dalam ruang tim untuk melacak kemajuan, beban kerja, dan aktivitas - dengan mudah. Pelajari lebih lanjut", + description: + "Kumpulkan anggota Anda dalam ruang tim untuk melacak kemajuan, beban kerja, dan aktivitas - dengan mudah. Pelajari lebih lanjut", cta_primary: "Tambahkan ruang tim", }, work_item_types: { title: "Buat dan sesuaikan jenis item kerja", - description: "Tentukan jenis item kerja unik untuk proyek Anda. Setiap jenis dapat memiliki properti, alur kerja, dan bidangnya sendiri - disesuaikan dengan kebutuhan proyek dan tim Anda.", + description: + "Tentukan jenis item kerja unik untuk proyek Anda. Setiap jenis dapat memiliki properti, alur kerja, dan bidangnya sendiri - disesuaikan dengan kebutuhan proyek dan tim Anda.", cta_primary: "Aktifkan", }, work_item_type_properties: { - title: "Tentukan properti dan detail yang ingin Anda tangkap untuk jenis item kerja ini. Sesuaikan agar sesuai dengan alur kerja proyek Anda.", + title: + "Tentukan properti dan detail yang ingin Anda tangkap untuk jenis item kerja ini. Sesuaikan agar sesuai dengan alur kerja proyek Anda.", cta_secondary: "Tambahkan properti", }, epic_setting: { title: "Aktifkan Epik", - description: "Kelompokkan item kerja terkait menjadi badan yang lebih besar yang mencakup beberapa siklus dan modul - sempurna untuk melacak kemajuan gambaran besar.", + description: + "Kelompokkan item kerja terkait menjadi badan yang lebih besar yang mencakup beberapa siklus dan modul - sempurna untuk melacak kemajuan gambaran besar.", cta_primary: "Aktifkan", }, templates: { title: "Belum ada templat", - description: "Kurangi waktu pengaturan dengan membuat templat untuk item kerja, dan halaman — dan mulai pekerjaan baru dalam hitungan detik.", + description: + "Kurangi waktu pengaturan dengan membuat templat untuk item kerja, dan halaman — dan mulai pekerjaan baru dalam hitungan detik.", cta_primary: "Buat templat pertama Anda", }, recurring_work_items: { title: "Belum ada item kerja berulang", - description: "Siapkan item kerja berulang untuk mengotomatisasi tugas yang berulang dan tetap sesuai jadwal dengan mudah.", + description: + "Siapkan item kerja berulang untuk mengotomatisasi tugas yang berulang dan tetap sesuai jadwal dengan mudah.", cta_primary: "Buat item kerja berulang", }, worklogs: { title: "Lacak lembar waktu untuk semua anggota", - description: "Catat waktu pada item kerja untuk melihat lembar waktu terperinci untuk anggota tim mana pun di seluruh proyek.", + description: + "Catat waktu pada item kerja untuk melihat lembar waktu terperinci untuk anggota tim mana pun di seluruh proyek.", }, customers_setting: { title: "Aktifkan manajemen pelanggan untuk memulai.", @@ -90,7 +103,8 @@ export default { }, template_setting: { title: "Belum ada templat", - description: "Kurangi waktu pengaturan dengan membuat templat untuk proyek, item kerja, dan halaman — dan mulai pekerjaan baru dalam hitungan detik.", + description: + "Kurangi waktu pengaturan dengan membuat templat untuk proyek, item kerja, dan halaman — dan mulai pekerjaan baru dalam hitungan detik.", cta_primary: "Buat templat", }, webhooks: { diff --git a/packages/i18n/src/locales/it/empty-state-extended.ts b/packages/i18n/src/locales/it/empty-state-extended.ts index 3be1ed5db3..cd7f04ddd9 100644 --- a/packages/i18n/src/locales/it/empty-state-extended.ts +++ b/packages/i18n/src/locales/it/empty-state-extended.ts @@ -26,63 +26,75 @@ export default { }, teamspaces: { title: "Con i teamspace sblocca una migliore organizzazione e tracciamento", - description: "Crea una superficie dedicata per ogni team reale, separata da tutte le altre superfici di lavoro in Plane, e personalizzale per adattarle al modo in cui lavora il tuo team.", + description: + "Crea una superficie dedicata per ogni team reale, separata da tutte le altre superfici di lavoro in Plane, e personalizzale per adattarle al modo in cui lavora il tuo team.", cta_primary: "Crea un nuovo Teamspace", }, initiatives: { title: "Traccia progetti ed epiche da un unico posto", - description: "Usa le iniziative per raggruppare e monitorare progetti ed epiche correlati. Visualizza progressi, priorità e risultati—tutto da un'unica schermata.", + description: + "Usa le iniziative per raggruppare e monitorare progetti ed epiche correlati. Visualizza progressi, priorità e risultati—tutto da un'unica schermata.", cta_primary: "Crea un'Iniziativa", }, customers: { title: "Gestisci il lavoro in base a ciò che è importante per i tuoi clienti", - description: "Porta le richieste dei clienti agli elementi di lavoro, assegna priorità per richieste e riassumi gli stati degli elementi di lavoro nei record dei clienti. Presto potrai integrarti con il tuo CRM o strumento di supporto per una gestione del lavoro ancora migliore in base agli attributi dei clienti.", + description: + "Porta le richieste dei clienti agli elementi di lavoro, assegna priorità per richieste e riassumi gli stati degli elementi di lavoro nei record dei clienti. Presto potrai integrarti con il tuo CRM o strumento di supporto per una gestione del lavoro ancora migliore in base agli attributi dei clienti.", cta_primary: "Crea record cliente", }, dashboard: { title: "Visualizza i tuoi progressi con le dashboard", - description: "Crea dashboard personalizzabili per tracciare metriche, misurare risultati e presentare intuizioni in modo efficace.", + description: + "Crea dashboard personalizzabili per tracciare metriche, misurare risultati e presentare intuizioni in modo efficace.", cta_primary: "Crea nuova dashboard", }, wiki: { title: "Scrivi una nota, un documento o un'intera base di conoscenza.", - description: "Le pagine sono spazi per catturare pensieri in Plane. Prendi note di riunioni, formattale facilmente, incorpora elementi di lavoro, organizzali usando una libreria di componenti e mantienili tutti nel contesto del tuo progetto.", + description: + "Le pagine sono spazi per catturare pensieri in Plane. Prendi note di riunioni, formattale facilmente, incorpora elementi di lavoro, organizzali usando una libreria di componenti e mantienili tutti nel contesto del tuo progetto.", cta_primary: "Crea la tua pagina", }, }, settings_empty_state: { teamspace: { title: "Nessun teamspace ancora", - description: "Riunisci i tuoi membri in un teamspace per tracciare progressi, carico di lavoro e attività - senza sforzo. Scopri di più", + description: + "Riunisci i tuoi membri in un teamspace per tracciare progressi, carico di lavoro e attività - senza sforzo. Scopri di più", cta_primary: "Aggiungi teamspace", }, work_item_types: { title: "Crea e personalizza tipi di elementi di lavoro", - description: "Definisci tipi di elementi di lavoro unici per il tuo progetto. Ogni tipo può avere le proprie proprietà, flussi di lavoro e campi - personalizzati per le esigenze del tuo progetto e team.", + description: + "Definisci tipi di elementi di lavoro unici per il tuo progetto. Ogni tipo può avere le proprie proprietà, flussi di lavoro e campi - personalizzati per le esigenze del tuo progetto e team.", cta_primary: "Abilita", }, work_item_type_properties: { - title: "Definisci la proprietà e i dettagli che vuoi catturare per questo tipo di elemento di lavoro. Personalizzalo per adattarlo al flusso di lavoro del tuo progetto.", + title: + "Definisci la proprietà e i dettagli che vuoi catturare per questo tipo di elemento di lavoro. Personalizzalo per adattarlo al flusso di lavoro del tuo progetto.", cta_secondary: "Aggiungi proprietà", }, epic_setting: { title: "Abilita Epiche", - description: "Raggruppa elementi di lavoro correlati in corpi più grandi che si estendono su più cicli e moduli - perfetti per tracciare i progressi nel quadro generale.", + description: + "Raggruppa elementi di lavoro correlati in corpi più grandi che si estendono su più cicli e moduli - perfetti per tracciare i progressi nel quadro generale.", cta_primary: "Abilita", }, templates: { title: "Nessun modello ancora", - description: "Riduci i tempi di configurazione creando modelli per elementi di lavoro e pagine — e inizia nuovi lavori in pochi secondi.", + description: + "Riduci i tempi di configurazione creando modelli per elementi di lavoro e pagine — e inizia nuovi lavori in pochi secondi.", cta_primary: "Crea il tuo primo modello", }, recurring_work_items: { title: "Nessun elemento di lavoro ricorrente ancora", - description: "Configura elementi di lavoro ricorrenti per automatizzare attività ripetute e rispettare facilmente la pianificazione.", + description: + "Configura elementi di lavoro ricorrenti per automatizzare attività ripetute e rispettare facilmente la pianificazione.", cta_primary: "Crea elemento di lavoro ricorrente", }, worklogs: { title: "Traccia i fogli ore per tutti i membri", - description: "Registra il tempo sugli elementi di lavoro per visualizzare fogli ore dettagliati per qualsiasi membro del team attraverso i progetti.", + description: + "Registra il tempo sugli elementi di lavoro per visualizzare fogli ore dettagliati per qualsiasi membro del team attraverso i progetti.", }, customers_setting: { title: "Abilita la gestione clienti per iniziare.", @@ -90,7 +102,8 @@ export default { }, template_setting: { title: "Nessun modello ancora", - description: "Riduci i tempi di configurazione creando modelli per progetti, elementi di lavoro e pagine — e inizia nuovi lavori in pochi secondi.", + description: + "Riduci i tempi di configurazione creando modelli per progetti, elementi di lavoro e pagine — e inizia nuovi lavori in pochi secondi.", cta_primary: "Crea modello", }, webhooks: { diff --git a/packages/i18n/src/locales/ja/empty-state-extended.ts b/packages/i18n/src/locales/ja/empty-state-extended.ts index e39372bd83..27b117a44b 100644 --- a/packages/i18n/src/locales/ja/empty-state-extended.ts +++ b/packages/i18n/src/locales/ja/empty-state-extended.ts @@ -26,27 +26,32 @@ export default { }, teamspaces: { title: "チームスペースでより良い組織化と追跡を実現", - description: "実世界のチームごとに専用のスペースを作成し、Planeの他のすべての作業スペースから分離して、チームの働き方に合わせてカスタマイズします。", + description: + "実世界のチームごとに専用のスペースを作成し、Planeの他のすべての作業スペースから分離して、チームの働き方に合わせてカスタマイズします。", cta_primary: "新しいチームスペースを作成", }, initiatives: { title: "1か所からプロジェクトとエピックを追跡", - description: "イニシアチブを使用して、関連するプロジェクトとエピックをグループ化して監視します。進捗、優先度、結果を表示 — すべて1つの画面から。", + description: + "イニシアチブを使用して、関連するプロジェクトとエピックをグループ化して監視します。進捗、優先度、結果を表示 — すべて1つの画面から。", cta_primary: "イニシアチブを作成", }, customers: { title: "顧客にとって重要なことで作業を管理", - description: "顧客のリクエストを作業項目に結び付け、リクエストごとに優先度を割り当て、作業項目の状態を顧客レコードにロールアップします。まもなく、CRMまたはサポートツールと統合して、顧客属性によるさらに優れた作業管理を実現できます。", + description: + "顧客のリクエストを作業項目に結び付け、リクエストごとに優先度を割り当て、作業項目の状態を顧客レコードにロールアップします。まもなく、CRMまたはサポートツールと統合して、顧客属性によるさらに優れた作業管理を実現できます。", cta_primary: "顧客レコードを作成", }, dashboard: { title: "ダッシュボードで進捗を視覚化", - description: "カスタマイズ可能なダッシュボードを構築して、メトリクスを追跡し、成果を測定し、インサイトを効果的に提示します。", + description: + "カスタマイズ可能なダッシュボードを構築して、メトリクスを追跡し、成果を測定し、インサイトを効果的に提示します。", cta_primary: "新しいダッシュボードを作成", }, wiki: { title: "メモ、ドキュメント、または完全なナレッジベースを作成します。", - description: "ページはPlaneでの思考スポッティングスペースです。会議のメモを取り、簡単にフォーマットし、作業項目を埋め込み、コンポーネントのライブラリを使用してレイアウトし、すべてをプロジェクトのコンテキストで保管します。", + description: + "ページはPlaneでの思考スポッティングスペースです。会議のメモを取り、簡単にフォーマットし、作業項目を埋め込み、コンポーネントのライブラリを使用してレイアウトし、すべてをプロジェクトのコンテキストで保管します。", cta_primary: "ページを作成", }, }, @@ -58,16 +63,19 @@ export default { }, work_item_types: { title: "作業項目タイプを作成してカスタマイズ", - description: "プロジェクト用の固有の作業項目タイプを定義します。各タイプには、プロジェクトとチームのニーズに合わせた独自のプロパティ、ワークフロー、フィールドを設定できます。", + description: + "プロジェクト用の固有の作業項目タイプを定義します。各タイプには、プロジェクトとチームのニーズに合わせた独自のプロパティ、ワークフロー、フィールドを設定できます。", cta_primary: "有効化", }, work_item_type_properties: { - title: "この作業項目タイプに対してキャプチャするプロパティと詳細を定義します。プロジェクトのワークフローに合わせてカスタマイズします。", + title: + "この作業項目タイプに対してキャプチャするプロパティと詳細を定義します。プロジェクトのワークフローに合わせてカスタマイズします。", cta_secondary: "プロパティを追加", }, epic_setting: { title: "エピックを有効化", - description: "関連する作業項目を、複数のサイクルやモジュールにまたがる大きな単位にグループ化 — 全体像の進捗を追跡するのに最適です。", + description: + "関連する作業項目を、複数のサイクルやモジュールにまたがる大きな単位にグループ化 — 全体像の進捗を追跡するのに最適です。", cta_primary: "有効化", }, templates: { @@ -90,7 +98,8 @@ export default { }, template_setting: { title: "まだテンプレートはありません", - description: "プロジェクト、作業項目、ページのテンプレートを作成してセットアップ時間を短縮し、数秒で新しい作業を開始します。", + description: + "プロジェクト、作業項目、ページのテンプレートを作成してセットアップ時間を短縮し、数秒で新しい作業を開始します。", cta_primary: "テンプレートを作成", }, webhooks: { diff --git a/packages/i18n/src/locales/ko/empty-state-extended.ts b/packages/i18n/src/locales/ko/empty-state-extended.ts index 5489eb721a..f2d03c27c9 100644 --- a/packages/i18n/src/locales/ko/empty-state-extended.ts +++ b/packages/i18n/src/locales/ko/empty-state-extended.ts @@ -26,17 +26,20 @@ export default { }, teamspaces: { title: "팀스페이스로 더 나은 구성 및 추적 잠금 해제", - description: "실제 팀마다 Plane의 다른 모든 작업 표면과 분리된 전용 표면을 만들고 팀의 작업 방식에 맞게 사용자 정의하세요.", + description: + "실제 팀마다 Plane의 다른 모든 작업 표면과 분리된 전용 표면을 만들고 팀의 작업 방식에 맞게 사용자 정의하세요.", cta_primary: "새 팀스페이스 생성", }, initiatives: { title: "한 곳에서 프로젝트와 에픽 추적", - description: "이니셔티브를 사용하여 관련 프로젝트와 에픽을 그룹화하고 모니터링하세요. 진행 상황, 우선순위 및 결과를 모두 단일 화면에서 확인하세요.", + description: + "이니셔티브를 사용하여 관련 프로젝트와 에픽을 그룹화하고 모니터링하세요. 진행 상황, 우선순위 및 결과를 모두 단일 화면에서 확인하세요.", cta_primary: "이니셔티브 생성", }, customers: { title: "고객에게 중요한 것에 따라 작업 관리", - description: "고객 요청을 작업 항목으로 가져오고, 요청별로 우선순위를 할당하며, 작업 항목의 상태를 고객 기록으로 롤업하세요. 곧 CRM 또는 지원 도구와 통합하여 고객 속성별로 더 나은 작업 관리를 할 수 있습니다.", + description: + "고객 요청을 작업 항목으로 가져오고, 요청별로 우선순위를 할당하며, 작업 항목의 상태를 고객 기록으로 롤업하세요. 곧 CRM 또는 지원 도구와 통합하여 고객 속성별로 더 나은 작업 관리를 할 수 있습니다.", cta_primary: "고객 기록 생성", }, dashboard: { @@ -46,7 +49,8 @@ export default { }, wiki: { title: "메모, 문서 또는 전체 지식 베이스를 작성하세요.", - description: "페이지는 Plane의 생각 포착 공간입니다. 회의록을 기록하고, 쉽게 서식을 지정하고, 작업 항목을 삽입하고, 구성 요소 라이브러리를 사용하여 배치하고, 프로젝트 컨텍스트에 모두 보관하세요.", + description: + "페이지는 Plane의 생각 포착 공간입니다. 회의록을 기록하고, 쉽게 서식을 지정하고, 작업 항목을 삽입하고, 구성 요소 라이브러리를 사용하여 배치하고, 프로젝트 컨텍스트에 모두 보관하세요.", cta_primary: "페이지 생성", }, }, @@ -58,16 +62,19 @@ export default { }, work_item_types: { title: "작업 항목 유형 생성 및 사용자 정의", - description: "프로젝트에 대한 고유한 작업 항목 유형을 정의하세요. 각 유형은 프로젝트 및 팀의 요구 사항에 맞춰 자체 속성, 워크플로우 및 필드를 가질 수 있습니다.", + description: + "프로젝트에 대한 고유한 작업 항목 유형을 정의하세요. 각 유형은 프로젝트 및 팀의 요구 사항에 맞춰 자체 속성, 워크플로우 및 필드를 가질 수 있습니다.", cta_primary: "활성화", }, work_item_type_properties: { - title: "이 작업 항목 유형에 대해 캡처하려는 속성과 세부 정보를 정의하세요. 프로젝트 워크플로우에 맞게 사용자 정의하세요.", + title: + "이 작업 항목 유형에 대해 캡처하려는 속성과 세부 정보를 정의하세요. 프로젝트 워크플로우에 맞게 사용자 정의하세요.", cta_secondary: "속성 추가", }, epic_setting: { title: "에픽 활성화", - description: "관련 작업 항목을 여러 사이클과 모듈에 걸쳐 있는 더 큰 본체로 그룹화하세요. 큰 그림 진행 상황을 추적하는 데 완벽합니다.", + description: + "관련 작업 항목을 여러 사이클과 모듈에 걸쳐 있는 더 큰 본체로 그룹화하세요. 큰 그림 진행 상황을 추적하는 데 완벽합니다.", cta_primary: "활성화", }, templates: { @@ -90,7 +97,8 @@ export default { }, template_setting: { title: "아직 템플릿이 없습니다", - description: "프로젝트, 작업 항목 및 페이지에 대한 템플릿을 생성하여 설정 시간을 줄이고 몇 초 만에 새 작업을 시작하세요.", + description: + "프로젝트, 작업 항목 및 페이지에 대한 템플릿을 생성하여 설정 시간을 줄이고 몇 초 만에 새 작업을 시작하세요.", cta_primary: "템플릿 생성", }, webhooks: { diff --git a/packages/i18n/src/locales/pl/empty-state-extended.ts b/packages/i18n/src/locales/pl/empty-state-extended.ts index 06e788beb4..3e121eb565 100644 --- a/packages/i18n/src/locales/pl/empty-state-extended.ts +++ b/packages/i18n/src/locales/pl/empty-state-extended.ts @@ -22,67 +22,80 @@ export default { }, active_cycles: { title: "Brak aktywnych cykli", - description: "Nie masz teraz żadnych trwających cykli. Aktywne cykle pojawiają się tutaj, gdy obejmują dzisiejszą datę.", + description: + "Nie masz teraz żadnych trwających cykli. Aktywne cykle pojawiają się tutaj, gdy obejmują dzisiejszą datę.", }, teamspaces: { title: "Dzięki przestrzeniom zespołowym odblokuj lepszą organizację i śledzenie", - description: "Utwórz dedykowaną przestrzeń dla każdego rzeczywistego zespołu, oddzieloną od wszystkich innych powierzchni roboczych w Plane i dostosuj je do sposobu pracy Twojego zespołu.", + description: + "Utwórz dedykowaną przestrzeń dla każdego rzeczywistego zespołu, oddzieloną od wszystkich innych powierzchni roboczych w Plane i dostosuj je do sposobu pracy Twojego zespołu.", cta_primary: "Utwórz nową przestrzeń zespołową", }, initiatives: { title: "Śledź projekty i epiki z jednego miejsca", - description: "Używaj inicjatyw do grupowania i monitorowania powiązanych projektów i epików. Przeglądaj postępy, priorytety i wyniki — wszystko z jednego ekranu.", + description: + "Używaj inicjatyw do grupowania i monitorowania powiązanych projektów i epików. Przeglądaj postępy, priorytety i wyniki — wszystko z jednego ekranu.", cta_primary: "Utwórz inicjatywę", }, customers: { title: "Zarządzaj pracą według tego, co jest ważne dla Twoich klientów", - description: "Przenieś prośby klientów do elementów roboczych, przypisz priorytet według próśb i przenieś stany elementów roboczych do rekordów klientów. Wkrótce zintegrujesz się z narzędziem CRM lub wsparciem, aby jeszcze lepiej zarządzać pracą według atrybutów klientów.", + description: + "Przenieś prośby klientów do elementów roboczych, przypisz priorytet według próśb i przenieś stany elementów roboczych do rekordów klientów. Wkrótce zintegrujesz się z narzędziem CRM lub wsparciem, aby jeszcze lepiej zarządzać pracą według atrybutów klientów.", cta_primary: "Utwórz rekord klienta", }, dashboard: { title: "Wizualizuj swój postęp za pomocą pulpitów nawigacyjnych", - description: "Twórz konfigurowalne pulpity nawigacyjne do śledzenia metryk, mierzenia wyników i efektywnego prezentowania spostrzeżeń.", + description: + "Twórz konfigurowalne pulpity nawigacyjne do śledzenia metryk, mierzenia wyników i efektywnego prezentowania spostrzeżeń.", cta_primary: "Utwórz nowy pulpit nawigacyjny", }, wiki: { title: "Napisz notatkę, dokument lub pełną bazę wiedzy.", - description: "Strony to przestrzeń do wychwytywania myśli w Plane. Zapisuj notatki ze spotkań, łatwo je formatuj, osadzaj elementy robocze, układaj je za pomocą biblioteki komponentów i zachowuj wszystkie w kontekście projektu.", + description: + "Strony to przestrzeń do wychwytywania myśli w Plane. Zapisuj notatki ze spotkań, łatwo je formatuj, osadzaj elementy robocze, układaj je za pomocą biblioteki komponentów i zachowuj wszystkie w kontekście projektu.", cta_primary: "Utwórz swoją stronę", }, }, settings_empty_state: { teamspace: { title: "Brak przestrzeni zespołowej", - description: "Zgromadź swoich członków w przestrzeni zespołowej, aby śledzić postępy, obciążenie pracą i aktywność - bez wysiłku. Dowiedz się więcej", + description: + "Zgromadź swoich członków w przestrzeni zespołowej, aby śledzić postępy, obciążenie pracą i aktywność - bez wysiłku. Dowiedz się więcej", cta_primary: "Dodaj przestrzeń zespołową", }, work_item_types: { title: "Twórz i dostosowuj typy elementów roboczych", - description: "Zdefiniuj unikalne typy elementów roboczych dla swojego projektu. Każdy typ może mieć własne właściwości, przepływy pracy i pola - dostosowane do potrzeb Twojego projektu i zespołu.", + description: + "Zdefiniuj unikalne typy elementów roboczych dla swojego projektu. Każdy typ może mieć własne właściwości, przepływy pracy i pola - dostosowane do potrzeb Twojego projektu i zespołu.", cta_primary: "Włącz", }, work_item_type_properties: { - title: "Zdefiniuj właściwości i szczegóły, które chcesz przechwycić dla tego typu elementu roboczego. Dostosuj go do przepływu pracy Twojego projektu.", + title: + "Zdefiniuj właściwości i szczegóły, które chcesz przechwycić dla tego typu elementu roboczego. Dostosuj go do przepływu pracy Twojego projektu.", cta_secondary: "Dodaj właściwość", }, epic_setting: { title: "Włącz epiki", - description: "Grupuj powiązane elementy robocze w większe całości obejmujące wiele cykli i modułów - idealnie do śledzenia postępów w szerszej perspektywie.", + description: + "Grupuj powiązane elementy robocze w większe całości obejmujące wiele cykli i modułów - idealnie do śledzenia postępów w szerszej perspektywie.", cta_primary: "Włącz", }, templates: { title: "Brak szablonów", - description: "Skróć czas konfiguracji, tworząc szablony dla elementów roboczych i stron — i rozpocznij nową pracę w ciągu kilku sekund.", + description: + "Skróć czas konfiguracji, tworząc szablony dla elementów roboczych i stron — i rozpocznij nową pracę w ciągu kilku sekund.", cta_primary: "Utwórz swój pierwszy szablon", }, recurring_work_items: { title: "Brak powtarzających się elementów roboczych", - description: "Skonfiguruj powtarzające się elementy robocze, aby zautomatyzować powtarzające się zadania i bez wysiłku dotrzymywać harmonogramu.", + description: + "Skonfiguruj powtarzające się elementy robocze, aby zautomatyzować powtarzające się zadania i bez wysiłku dotrzymywać harmonogramu.", cta_primary: "Utwórz powtarzający się element roboczy", }, worklogs: { title: "Śledź karty czasu pracy dla wszystkich członków", - description: "Rejestruj czas w elementach roboczych, aby wyświetlać szczegółowe karty czasu pracy dla każdego członka zespołu w projektach.", + description: + "Rejestruj czas w elementach roboczych, aby wyświetlać szczegółowe karty czasu pracy dla każdego członka zespołu w projektach.", }, customers_setting: { title: "Włącz zarządzanie klientami, aby rozpocząć.", @@ -90,7 +103,8 @@ export default { }, template_setting: { title: "Brak szablonów", - description: "Skróć czas konfiguracji, tworząc szablony dla projektów, elementów roboczych i stron — i rozpocznij nową pracę w ciągu kilku sekund.", + description: + "Skróć czas konfiguracji, tworząc szablony dla projektów, elementów roboczych i stron — i rozpocznij nową pracę w ciągu kilku sekund.", cta_primary: "Utwórz szablon", }, webhooks: { diff --git a/packages/i18n/src/locales/pt-BR/empty-state-extended.ts b/packages/i18n/src/locales/pt-BR/empty-state-extended.ts index 56ffbcd448..dcf47b9acb 100644 --- a/packages/i18n/src/locales/pt-BR/empty-state-extended.ts +++ b/packages/i18n/src/locales/pt-BR/empty-state-extended.ts @@ -14,75 +14,90 @@ export default { }, workspace_empty_state: { home_widget_stickies: { - title: "Anote uma ideia, capture um momento de inspiração ou registre um lampejo. Adicione um adesivo para começar.", + title: + "Anote uma ideia, capture um momento de inspiração ou registre um lampejo. Adicione um adesivo para começar.", }, stickies: { - title: "Anote uma ideia, capture um momento de inspiração ou registre um lampejo. Adicione um adesivo para começar.", + title: + "Anote uma ideia, capture um momento de inspiração ou registre um lampejo. Adicione um adesivo para começar.", cta_primary: "Adicionar adesivo", }, active_cycles: { title: "Nenhum ciclo ativo", - description: "Você não tem nenhum ciclo em andamento no momento. Os ciclos ativos aparecem aqui quando incluem a data de hoje.", + description: + "Você não tem nenhum ciclo em andamento no momento. Os ciclos ativos aparecem aqui quando incluem a data de hoje.", }, teamspaces: { title: "Com espaços de equipe, desbloqueie melhor organização e rastreamento", - description: "Crie uma superfície dedicada para cada equipe do mundo real, separada de todas as outras superfícies de trabalho no Plane, e personalize-as para se adequar à forma como sua equipe trabalha.", + description: + "Crie uma superfície dedicada para cada equipe do mundo real, separada de todas as outras superfícies de trabalho no Plane, e personalize-as para se adequar à forma como sua equipe trabalha.", cta_primary: "Criar um novo Espaço de Equipe", }, initiatives: { title: "Acompanhe projetos e épicos de um só lugar", - description: "Use iniciativas para agrupar e monitorar projetos e épicos relacionados. Veja progresso, prioridades e resultados — tudo em uma única tela.", + description: + "Use iniciativas para agrupar e monitorar projetos e épicos relacionados. Veja progresso, prioridades e resultados — tudo em uma única tela.", cta_primary: "Criar uma Iniciativa", }, customers: { title: "Gerencie o trabalho pelo que é importante para seus clientes", - description: "Traga solicitações de clientes para itens de trabalho, atribua prioridade por solicitações e consolide os estados dos itens de trabalho nos registros de clientes. Em breve, você integrará com sua ferramenta de CRM ou Suporte para um gerenciamento de trabalho ainda melhor por atributos de clientes.", + description: + "Traga solicitações de clientes para itens de trabalho, atribua prioridade por solicitações e consolide os estados dos itens de trabalho nos registros de clientes. Em breve, você integrará com sua ferramenta de CRM ou Suporte para um gerenciamento de trabalho ainda melhor por atributos de clientes.", cta_primary: "Criar registro de cliente", }, dashboard: { title: "Visualize seu progresso com painéis", - description: "Crie painéis personalizáveis para rastrear métricas, medir resultados e apresentar insights de forma eficaz.", + description: + "Crie painéis personalizáveis para rastrear métricas, medir resultados e apresentar insights de forma eficaz.", cta_primary: "Criar novo painel", }, wiki: { title: "Escreva uma nota, um documento ou uma base de conhecimento completa.", - description: "As páginas são espaço para capturar pensamentos no Plane. Anote notas de reuniões, formate-as facilmente, incorpore itens de trabalho, organize-as usando uma biblioteca de componentes e mantenha todas no contexto do seu projeto.", + description: + "As páginas são espaço para capturar pensamentos no Plane. Anote notas de reuniões, formate-as facilmente, incorpore itens de trabalho, organize-as usando uma biblioteca de componentes e mantenha todas no contexto do seu projeto.", cta_primary: "Criar sua página", }, }, settings_empty_state: { teamspace: { title: "Ainda não há espaço de equipe", - description: "Reúna seus membros em um espaço de equipe para rastrear progresso, carga de trabalho e atividade - sem esforço. Saiba mais", + description: + "Reúna seus membros em um espaço de equipe para rastrear progresso, carga de trabalho e atividade - sem esforço. Saiba mais", cta_primary: "Adicionar espaço de equipe", }, work_item_types: { title: "Crie e personalize tipos de itens de trabalho", - description: "Defina tipos de itens de trabalho exclusivos para seu projeto. Cada tipo pode ter suas próprias propriedades, fluxos de trabalho e campos - adaptados às necessidades do seu projeto e equipe.", + description: + "Defina tipos de itens de trabalho exclusivos para seu projeto. Cada tipo pode ter suas próprias propriedades, fluxos de trabalho e campos - adaptados às necessidades do seu projeto e equipe.", cta_primary: "Ativar", }, work_item_type_properties: { - title: "Defina a propriedade e os detalhes que você deseja capturar para este tipo de item de trabalho. Personalize-o para corresponder ao fluxo de trabalho do seu projeto.", + title: + "Defina a propriedade e os detalhes que você deseja capturar para este tipo de item de trabalho. Personalize-o para corresponder ao fluxo de trabalho do seu projeto.", cta_secondary: "Adicionar propriedade", }, epic_setting: { title: "Ativar Épicos", - description: "Agrupe itens de trabalho relacionados em corpos maiores que abrangem múltiplos ciclos e módulos - perfeito para rastrear o progresso do panorama geral.", + description: + "Agrupe itens de trabalho relacionados em corpos maiores que abrangem múltiplos ciclos e módulos - perfeito para rastrear o progresso do panorama geral.", cta_primary: "Ativar", }, templates: { title: "Ainda não há modelos", - description: "Reduza o tempo de configuração criando modelos para itens de trabalho e páginas — e comece novo trabalho em segundos.", + description: + "Reduza o tempo de configuração criando modelos para itens de trabalho e páginas — e comece novo trabalho em segundos.", cta_primary: "Criar seu primeiro modelo", }, recurring_work_items: { title: "Ainda não há item de trabalho recorrente", - description: "Configure itens de trabalho recorrentes para automatizar tarefas repetidas e manter-se no cronograma sem esforço.", + description: + "Configure itens de trabalho recorrentes para automatizar tarefas repetidas e manter-se no cronograma sem esforço.", cta_primary: "Criar item de trabalho recorrente", }, worklogs: { title: "Acompanhe folhas de ponto para todos os membros", - description: "Registre tempo em itens de trabalho para ver folhas de ponto detalhadas para qualquer membro da equipe em projetos.", + description: + "Registre tempo em itens de trabalho para ver folhas de ponto detalhadas para qualquer membro da equipe em projetos.", }, customers_setting: { title: "Ative o gerenciamento de clientes para começar.", @@ -90,7 +105,8 @@ export default { }, template_setting: { title: "Ainda não há modelos", - description: "Reduza o tempo de configuração criando modelos para projetos, itens de trabalho e páginas — e comece novo trabalho em segundos.", + description: + "Reduza o tempo de configuração criando modelos para projetos, itens de trabalho e páginas — e comece novo trabalho em segundos.", cta_primary: "Criar modelo", }, webhooks: { diff --git a/packages/i18n/src/locales/ro/empty-state-extended.ts b/packages/i18n/src/locales/ro/empty-state-extended.ts index 4417eb2cb2..855c889dc3 100644 --- a/packages/i18n/src/locales/ro/empty-state-extended.ts +++ b/packages/i18n/src/locales/ro/empty-state-extended.ts @@ -14,75 +14,90 @@ export default { }, workspace_empty_state: { home_widget_stickies: { - title: "Notați o idee, capturați un moment de inspirație sau înregistrați o idee genială. Adăugați un notă pentru a începe.", + title: + "Notați o idee, capturați un moment de inspirație sau înregistrați o idee genială. Adăugați un notă pentru a începe.", }, stickies: { - title: "Notați o idee, capturați un moment de inspirație sau înregistrați o idee genială. Adăugați un notă pentru a începe.", + title: + "Notați o idee, capturați un moment de inspirație sau înregistrați o idee genială. Adăugați un notă pentru a începe.", cta_primary: "Adăugați notă", }, active_cycles: { title: "Niciun ciclu activ", - description: "Nu aveți cicluri în desfășurare în acest moment. Ciclurile active apar aici când includ data de azi.", + description: + "Nu aveți cicluri în desfășurare în acest moment. Ciclurile active apar aici când includ data de azi.", }, teamspaces: { title: "Cu spații de echipă deblocați o mai bună organizare și urmărire", - description: "Creați o suprafață dedicată pentru fiecare echipă reală, separată de toate celelalte suprafețe de lucru din Plane și personalizați-le pentru a se potrivi modului în care lucrează echipa dvs.", + description: + "Creați o suprafață dedicată pentru fiecare echipă reală, separată de toate celelalte suprafețe de lucru din Plane și personalizați-le pentru a se potrivi modului în care lucrează echipa dvs.", cta_primary: "Creați un nou Spațiu de Echipă", }, initiatives: { title: "Urmăriți proiecte și epopei dintr-un singur loc", - description: "Utilizați inițiative pentru a grupa și monitoriza proiecte și epopei conexe. Vizualizați progresul, prioritățile și rezultatele — toate dintr-un singur ecran.", + description: + "Utilizați inițiative pentru a grupa și monitoriza proiecte și epopei conexe. Vizualizați progresul, prioritățile și rezultatele — toate dintr-un singur ecran.", cta_primary: "Creați o Inițiativă", }, customers: { title: "Gestionați munca în funcție de ceea ce este important pentru clienții dvs.", - description: "Aduceți solicitările clienților la elemente de lucru, alocați prioritate în funcție de solicitări și consolidați stările elementelor de lucru în înregistrările clienților. În curând, veți integra cu instrumentul dvs. CRM sau Suport pentru o gestionare și mai bună a muncii în funcție de atributele clienților.", + description: + "Aduceți solicitările clienților la elemente de lucru, alocați prioritate în funcție de solicitări și consolidați stările elementelor de lucru în înregistrările clienților. În curând, veți integra cu instrumentul dvs. CRM sau Suport pentru o gestionare și mai bună a muncii în funcție de atributele clienților.", cta_primary: "Creați înregistrare client", }, dashboard: { title: "Vizualizați progresul dvs. cu tablouri de bord", - description: "Construiți tablouri de bord personalizabile pentru a urmări metricile, a măsura rezultatele și a prezenta informații eficient.", + description: + "Construiți tablouri de bord personalizabile pentru a urmări metricile, a măsura rezultatele și a prezenta informații eficient.", cta_primary: "Creați tablou de bord nou", }, wiki: { title: "Scrieți o notă, un document sau o bază de cunoștințe completă.", - description: "Paginile sunt spațiu de captare a gândurilor în Plane. Notați note de întâlnire, formatați-le cu ușurință, încorporați elemente de lucru, aranjați-le folosind o bibliotecă de componente și păstrați-le toate în contextul proiectului dvs.", + description: + "Paginile sunt spațiu de captare a gândurilor în Plane. Notați note de întâlnire, formatați-le cu ușurință, încorporați elemente de lucru, aranjați-le folosind o bibliotecă de componente și păstrați-le toate în contextul proiectului dvs.", cta_primary: "Creați pagina dvs.", }, }, settings_empty_state: { teamspace: { title: "Încă nu există spațiu de echipă", - description: "Adunați-vă membrii într-un spațiu de echipă pentru a urmări progresul, volumul de lucru și activitatea - fără efort. Aflați mai multe", + description: + "Adunați-vă membrii într-un spațiu de echipă pentru a urmări progresul, volumul de lucru și activitatea - fără efort. Aflați mai multe", cta_primary: "Adăugați spațiu de echipă", }, work_item_types: { title: "Creați și personalizați tipuri de elemente de lucru", - description: "Definiți tipuri unice de elemente de lucru pentru proiectul dvs. Fiecare tip poate avea propriile proprietăți, fluxuri de lucru și câmpuri - adaptate la nevoile proiectului și echipei dvs.", + description: + "Definiți tipuri unice de elemente de lucru pentru proiectul dvs. Fiecare tip poate avea propriile proprietăți, fluxuri de lucru și câmpuri - adaptate la nevoile proiectului și echipei dvs.", cta_primary: "Activați", }, work_item_type_properties: { - title: "Definiți proprietatea și detaliile pe care doriți să le capturați pentru acest tip de element de lucru. Personalizați-l pentru a se potrivi fluxului de lucru al proiectului dvs.", + title: + "Definiți proprietatea și detaliile pe care doriți să le capturați pentru acest tip de element de lucru. Personalizați-l pentru a se potrivi fluxului de lucru al proiectului dvs.", cta_secondary: "Adăugați proprietate", }, epic_setting: { title: "Activați Epopeile", - description: "Grupați elemente de lucru conexe în corpuri mai mari care se întind pe mai multe cicluri și module - perfect pentru urmărirea progresului de ansamblu.", + description: + "Grupați elemente de lucru conexe în corpuri mai mari care se întind pe mai multe cicluri și module - perfect pentru urmărirea progresului de ansamblu.", cta_primary: "Activați", }, templates: { title: "Încă nu există șabloane", - description: "Reduceți timpul de configurare prin crearea de șabloane pentru elemente de lucru și pagini — și începeți munca nouă în câteva secunde.", + description: + "Reduceți timpul de configurare prin crearea de șabloane pentru elemente de lucru și pagini — și începeți munca nouă în câteva secunde.", cta_primary: "Creați primul dvs. șablon", }, recurring_work_items: { title: "Încă nu există elemente de lucru recurente", - description: "Configurați elemente de lucru recurente pentru a automatiza sarcinile repetitive și a rămâne la timp fără efort.", + description: + "Configurați elemente de lucru recurente pentru a automatiza sarcinile repetitive și a rămâne la timp fără efort.", cta_primary: "Creați element de lucru recurent", }, worklogs: { title: "Urmăriți foile de pontaj pentru toți membrii", - description: "Înregistrați timpul pe elemente de lucru pentru a vedea foi de pontaj detaliate pentru orice membru al echipei din proiecte.", + description: + "Înregistrați timpul pe elemente de lucru pentru a vedea foi de pontaj detaliate pentru orice membru al echipei din proiecte.", }, customers_setting: { title: "Activați gestionarea clienților pentru a începe.", @@ -90,7 +105,8 @@ export default { }, template_setting: { title: "Încă nu există șabloane", - description: "Reduceți timpul de configurare prin crearea de șabloane pentru proiecte, elemente de lucru și pagini — și începeți munca nouă în câteva secunde.", + description: + "Reduceți timpul de configurare prin crearea de șabloane pentru proiecte, elemente de lucru și pagini — și începeți munca nouă în câteva secunde.", cta_primary: "Creați șablon", }, webhooks: { diff --git a/packages/i18n/src/locales/ru/empty-state-extended.ts b/packages/i18n/src/locales/ru/empty-state-extended.ts index a645f62726..aa5a460b67 100644 --- a/packages/i18n/src/locales/ru/empty-state-extended.ts +++ b/packages/i18n/src/locales/ru/empty-state-extended.ts @@ -22,67 +22,80 @@ export default { }, active_cycles: { title: "Нет активных циклов", - description: "У вас сейчас нет активных циклов. Активные циклы появляются здесь, когда они включают сегодняшнюю дату.", + description: + "У вас сейчас нет активных циклов. Активные циклы появляются здесь, когда они включают сегодняшнюю дату.", }, teamspaces: { title: "С командными пространствами откройте лучшую организацию и отслеживание", - description: "Создайте выделенное пространство для каждой реальной команды, отдельное от всех других рабочих поверхностей в Plane, и настройте их в соответствии с тем, как работает ваша команда.", + description: + "Создайте выделенное пространство для каждой реальной команды, отдельное от всех других рабочих поверхностей в Plane, и настройте их в соответствии с тем, как работает ваша команда.", cta_primary: "Создать новое командное пространство", }, initiatives: { title: "Отслеживайте проекты и эпики из одного места", - description: "Используйте инициативы для группировки и мониторинга связанных проектов и эпиков. Просматривайте прогресс, приоритеты и результаты — все с одного экрана.", + description: + "Используйте инициативы для группировки и мониторинга связанных проектов и эпиков. Просматривайте прогресс, приоритеты и результаты — все с одного экрана.", cta_primary: "Создать инициативу", }, customers: { title: "Управляйте работой по тому, что важно для ваших клиентов", - description: "Связывайте запросы клиентов с рабочими элементами, назначайте приоритет по запросам и сворачивайте состояния рабочих элементов в записи клиентов. Скоро вы сможете интегрироваться с вашей CRM или инструментом поддержки для еще лучшего управления работой по атрибутам клиентов.", + description: + "Связывайте запросы клиентов с рабочими элементами, назначайте приоритет по запросам и сворачивайте состояния рабочих элементов в записи клиентов. Скоро вы сможете интегрироваться с вашей CRM или инструментом поддержки для еще лучшего управления работой по атрибутам клиентов.", cta_primary: "Создать запись клиента", }, dashboard: { title: "Визуализируйте свой прогресс с помощью панелей", - description: "Создавайте настраиваемые панели для отслеживания метрик, измерения результатов и эффективного представления аналитики.", + description: + "Создавайте настраиваемые панели для отслеживания метрик, измерения результатов и эффективного представления аналитики.", cta_primary: "Создать новую панель", }, wiki: { title: "Напишите заметку, документ или полную базу знаний.", - description: "Страницы — это пространство для фиксации мыслей в Plane. Делайте заметки со встреч, легко форматируйте их, встраивайте рабочие элементы, размещайте их с помощью библиотеки компонентов и храните все в контексте вашего проекта.", + description: + "Страницы — это пространство для фиксации мыслей в Plane. Делайте заметки со встреч, легко форматируйте их, встраивайте рабочие элементы, размещайте их с помощью библиотеки компонентов и храните все в контексте вашего проекта.", cta_primary: "Создать вашу страницу", }, }, settings_empty_state: { teamspace: { title: "Командных пространств пока нет", - description: "Соберите своих участников в командном пространстве для отслеживания прогресса, рабочей нагрузки и активности — без усилий. Узнать больше", + description: + "Соберите своих участников в командном пространстве для отслеживания прогресса, рабочей нагрузки и активности — без усилий. Узнать больше", cta_primary: "Добавить командное пространство", }, work_item_types: { title: "Создавайте и настраивайте типы рабочих элементов", - description: "Определите уникальные типы рабочих элементов для вашего проекта. Каждый тип может иметь свои собственные свойства, рабочие процессы и поля — адаптированные к потребностям вашего проекта и команды.", + description: + "Определите уникальные типы рабочих элементов для вашего проекта. Каждый тип может иметь свои собственные свойства, рабочие процессы и поля — адаптированные к потребностям вашего проекта и команды.", cta_primary: "Включить", }, work_item_type_properties: { - title: "Определите свойство и детали, которые вы хотите зафиксировать для этого типа рабочего элемента. Настройте его в соответствии с рабочим процессом вашего проекта.", + title: + "Определите свойство и детали, которые вы хотите зафиксировать для этого типа рабочего элемента. Настройте его в соответствии с рабочим процессом вашего проекта.", cta_secondary: "Добавить свойство", }, epic_setting: { title: "Включить эпики", - description: "Группируйте связанные рабочие элементы в более крупные блоки, охватывающие несколько циклов и модулей — идеально подходит для отслеживания прогресса в целом.", + description: + "Группируйте связанные рабочие элементы в более крупные блоки, охватывающие несколько циклов и модулей — идеально подходит для отслеживания прогресса в целом.", cta_primary: "Включить", }, templates: { title: "Шаблонов пока нет", - description: "Сократите время настройки, создавая шаблоны для рабочих элементов и страниц — и начинайте новую работу за секунды.", + description: + "Сократите время настройки, создавая шаблоны для рабочих элементов и страниц — и начинайте новую работу за секунды.", cta_primary: "Создать свой первый шаблон", }, recurring_work_items: { title: "Повторяющихся рабочих элементов пока нет", - description: "Настройте повторяющиеся рабочие элементы для автоматизации повторяющихся задач и легкого соблюдения графика.", + description: + "Настройте повторяющиеся рабочие элементы для автоматизации повторяющихся задач и легкого соблюдения графика.", cta_primary: "Создать повторяющийся рабочий элемент", }, worklogs: { title: "Отслеживайте учет времени для всех участников", - description: "Регистрируйте время на рабочих элементах, чтобы просматривать подробные табели для любого члена команды по проектам.", + description: + "Регистрируйте время на рабочих элементах, чтобы просматривать подробные табели для любого члена команды по проектам.", }, customers_setting: { title: "Включите управление клиентами, чтобы начать.", @@ -90,7 +103,8 @@ export default { }, template_setting: { title: "Шаблонов пока нет", - description: "Сократите время настройки, создавая шаблоны для проектов, рабочих элементов и страниц — и начинайте новую работу за секунды.", + description: + "Сократите время настройки, создавая шаблоны для проектов, рабочих элементов и страниц — и начинайте новую работу за секунды.", cta_primary: "Создать шаблон", }, webhooks: { diff --git a/packages/i18n/src/locales/sk/empty-state-extended.ts b/packages/i18n/src/locales/sk/empty-state-extended.ts index bd5b4c8e96..51bd431d5b 100644 --- a/packages/i18n/src/locales/sk/empty-state-extended.ts +++ b/packages/i18n/src/locales/sk/empty-state-extended.ts @@ -22,67 +22,80 @@ export default { }, active_cycles: { title: "Žiadne aktívne cykly", - description: "Momentálne nemáte žiadne prebiehajúce cykly. Aktívne cykly sa tu zobrazia, keď budú zahŕňať dnešný dátum.", + description: + "Momentálne nemáte žiadne prebiehajúce cykly. Aktívne cykly sa tu zobrazia, keď budú zahŕňať dnešný dátum.", }, teamspaces: { title: "S tímovými priestormi odomknite lepšiu organizáciu a sledovanie", - description: "Vytvorte vyhradený priestor pre každý skutočný tím, oddelený od všetkých ostatných pracovných povrchov v Plane, a prispôsobte ich tomu, ako váš tím pracuje.", + description: + "Vytvorte vyhradený priestor pre každý skutočný tím, oddelený od všetkých ostatných pracovných povrchov v Plane, a prispôsobte ich tomu, ako váš tím pracuje.", cta_primary: "Vytvoriť nový tímový priestor", }, initiatives: { title: "Sledujte projekty a epiky z jedného miesta", - description: "Použite iniciatívy na zoskupenie a sledovanie súvisiacich projektov a epikov. Zobrazujte pokrok, priority a výsledky—všetko z jedinej obrazovky.", + description: + "Použite iniciatívy na zoskupenie a sledovanie súvisiacich projektov a epikov. Zobrazujte pokrok, priority a výsledky—všetko z jedinej obrazovky.", cta_primary: "Vytvoriť iniciatívu", }, customers: { title: "Spravujte prácu podľa toho, čo je dôležité pre vašich zákazníkov", - description: "Prepojte požiadavky zákazníkov s pracovnými položkami, priraďte prioritu podľa požiadaviek a zhrňte stavy pracovných položiek do záznamov zákazníkov. Čoskoro sa budete môcť integrovať s vaším CRM alebo nástrojom podpory pre ešte lepšiu správu práce podľa atribútov zákazníkov.", + description: + "Prepojte požiadavky zákazníkov s pracovnými položkami, priraďte prioritu podľa požiadaviek a zhrňte stavy pracovných položiek do záznamov zákazníkov. Čoskoro sa budete môcť integrovať s vaším CRM alebo nástrojom podpory pre ešte lepšiu správu práce podľa atribútov zákazníkov.", cta_primary: "Vytvoriť záznam zákazníka", }, dashboard: { title: "Vizualizujte svoj pokrok pomocou prehľadov", - description: "Vytvárajte prispôsobiteľné prehľady na sledovanie metrík, meranie výsledkov a efektívnu prezentáciu poznatkov.", + description: + "Vytvárajte prispôsobiteľné prehľady na sledovanie metrík, meranie výsledkov a efektívnu prezentáciu poznatkov.", cta_primary: "Vytvoriť nový prehľad", }, wiki: { title: "Napíšte poznámku, dokument alebo celú vedomostnú bázu.", - description: "Stránky sú priestorom pre zachytenie myšlienok v Plane. Robte poznámky zo stretnutí, jednoducho ich formátujte, vkladajte pracovné položky, usporiadajte ich pomocou knižnice komponentov a udržujte všetko v kontexte vášho projektu.", + description: + "Stránky sú priestorom pre zachytenie myšlienok v Plane. Robte poznámky zo stretnutí, jednoducho ich formátujte, vkladajte pracovné položky, usporiadajte ich pomocou knižnice komponentov a udržujte všetko v kontexte vášho projektu.", cta_primary: "Vytvorte svoju stránku", }, }, settings_empty_state: { teamspace: { title: "Zatiaľ žiadny tímový priestor", - description: "Spojte svojich členov v tímovom priestore na sledovanie pokroku, pracovnej záťaže a aktivity - bez námahy. Zistiť viac", + description: + "Spojte svojich členov v tímovom priestore na sledovanie pokroku, pracovnej záťaže a aktivity - bez námahy. Zistiť viac", cta_primary: "Pridať tímový priestor", }, work_item_types: { title: "Vytvárajte a prispôsobujte typy pracovných položiek", - description: "Definujte jedinečné typy pracovných položiek pre váš projekt. Každý typ môže mať svoje vlastné vlastnosti, pracovné postupy a polia - prispôsobené potrebám vášho projektu a tímu.", + description: + "Definujte jedinečné typy pracovných položiek pre váš projekt. Každý typ môže mať svoje vlastné vlastnosti, pracovné postupy a polia - prispôsobené potrebám vášho projektu a tímu.", cta_primary: "Povoliť", }, work_item_type_properties: { - title: "Definujte vlastnosť a podrobnosti, ktoré chcete zachytiť pre tento typ pracovnej položky. Prispôsobte ho pracovnému postupu vášho projektu.", + title: + "Definujte vlastnosť a podrobnosti, ktoré chcete zachytiť pre tento typ pracovnej položky. Prispôsobte ho pracovnému postupu vášho projektu.", cta_secondary: "Pridať vlastnosť", }, epic_setting: { title: "Povoliť epiky", - description: "Zoskupte súvisiace pracovné položky do väčších celkov, ktoré sa rozprestierajú cez viac cyklov a modulov - ideálne na sledovanie celkového pokroku.", + description: + "Zoskupte súvisiace pracovné položky do väčších celkov, ktoré sa rozprestierajú cez viac cyklov a modulov - ideálne na sledovanie celkového pokroku.", cta_primary: "Povoliť", }, templates: { title: "Zatiaľ žiadne šablóny", - description: "Skráťte dobu nastavenia vytváraním šablón pre pracovné položky a stránky — a začnite novú prácu počas niekoľkých sekúnd.", + description: + "Skráťte dobu nastavenia vytváraním šablón pre pracovné položky a stránky — a začnite novú prácu počas niekoľkých sekúnd.", cta_primary: "Vytvorte svoju prvú šablónu", }, recurring_work_items: { title: "Zatiaľ žiadna opakujúca sa pracovná položka", - description: "Nastavte opakujúce sa pracovné položky na automatizáciu opakujúcich sa úloh a jednoduché dodržiavanie harmonogramu.", + description: + "Nastavte opakujúce sa pracovné položky na automatizáciu opakujúcich sa úloh a jednoduché dodržiavanie harmonogramu.", cta_primary: "Vytvoriť opakujúcu sa pracovnú položku", }, worklogs: { title: "Sledujte časové výkazy pre všetkých členov", - description: "Zaznamenávajte čas na pracovných položkách na zobrazenie podrobných časových výkazov pre akéhokoľvek člena tímu naprieč projektmi.", + description: + "Zaznamenávajte čas na pracovných položkách na zobrazenie podrobných časových výkazov pre akéhokoľvek člena tímu naprieč projektmi.", }, customers_setting: { title: "Povoľte správu zákazníkov na začiatok.", @@ -90,7 +103,8 @@ export default { }, template_setting: { title: "Zatiaľ žiadne šablóny", - description: "Skráťte dobu nastavenia vytváraním šablón pre projekty, pracovné položky a stránky — a začnite novú prácu počas niekoľkých sekúnd.", + description: + "Skráťte dobu nastavenia vytváraním šablón pre projekty, pracovné položky a stránky — a začnite novú prácu počas niekoľkých sekúnd.", cta_primary: "Vytvoriť šablónu", }, webhooks: { diff --git a/packages/i18n/src/locales/tr-TR/empty-state-extended.ts b/packages/i18n/src/locales/tr-TR/empty-state-extended.ts index 467e6aeb13..cea954602a 100644 --- a/packages/i18n/src/locales/tr-TR/empty-state-extended.ts +++ b/packages/i18n/src/locales/tr-TR/empty-state-extended.ts @@ -2,7 +2,8 @@ export default { project_empty_state: { epics: { title: "Karmaşık projeleri yapılandırılmış destanlara dönüştürün.", - description: "Bir destan, büyük hedefleri daha küçük, takip edilebilir görevlere organize etmenize yardımcı olur.", + description: + "Bir destan, büyük hedefleri daha küçük, takip edilebilir görevlere organize etmenize yardımcı olur.", cta_primary: "Destan Oluştur", cta_secondary: "Belgeler", }, @@ -14,10 +15,12 @@ export default { }, workspace_empty_state: { home_widget_stickies: { - title: "Bir fikir yazın, bir aha anını yakalayın veya bir beyin dalgasını kaydedin. Başlamak için yapışkan not ekleyin.", + title: + "Bir fikir yazın, bir aha anını yakalayın veya bir beyin dalgasını kaydedin. Başlamak için yapışkan not ekleyin.", }, stickies: { - title: "Bir fikir yazın, bir aha anını yakalayın veya bir beyin dalgasını kaydedin. Başlamak için yapışkan not ekleyin.", + title: + "Bir fikir yazın, bir aha anını yakalayın veya bir beyin dalgasını kaydedin. Başlamak için yapışkan not ekleyin.", cta_primary: "Yapışkan not ekle", }, active_cycles: { @@ -26,63 +29,75 @@ export default { }, teamspaces: { title: "Ekip alanlarıyla daha iyi organizasyon ve takibin kilidini açın", - description: "Plane'deki diğer tüm çalışma yüzeylerinden ayrı, her gerçek dünya ekibi için özel bir yüzey oluşturun ve ekibinizin çalışma şekline uyacak şekilde özelleştirin.", + description: + "Plane'deki diğer tüm çalışma yüzeylerinden ayrı, her gerçek dünya ekibi için özel bir yüzey oluşturun ve ekibinizin çalışma şekline uyacak şekilde özelleştirin.", cta_primary: "Yeni Ekip Alanı Oluştur", }, initiatives: { title: "Projeleri ve destanları tek bir yerden takip edin", - description: "İlgili projeleri ve destanları gruplamak ve izlemek için girişimleri kullanın. İlerlemeyi, öncelikleri ve sonuçları görün—hepsi tek bir ekrandan.", + description: + "İlgili projeleri ve destanları gruplamak ve izlemek için girişimleri kullanın. İlerlemeyi, öncelikleri ve sonuçları görün—hepsi tek bir ekrandan.", cta_primary: "Girişim Oluştur", }, customers: { title: "Müşterileriniz için önemli olan şeye göre çalışmayı yönetin", - description: "Müşteri isteklerini iş öğelerine getirin, isteklere göre öncelik atayın ve iş öğelerinin durumlarını müşteri kayıtlarına yuvarlayın. Yakında, müşteri özniteliklerine göre daha da iyi iş yönetimi için CRM veya Destek aracınızla entegre olacaksınız.", + description: + "Müşteri isteklerini iş öğelerine getirin, isteklere göre öncelik atayın ve iş öğelerinin durumlarını müşteri kayıtlarına yuvarlayın. Yakında, müşteri özniteliklerine göre daha da iyi iş yönetimi için CRM veya Destek aracınızla entegre olacaksınız.", cta_primary: "Müşteri kaydı oluştur", }, dashboard: { title: "İlerlemenizi kontrol panelleriyle görselleştirin", - description: "Metrikleri takip etmek, sonuçları ölçmek ve içgörüleri etkili bir şekilde sunmak için özelleştirilebilir kontrol panelleri oluşturun.", + description: + "Metrikleri takip etmek, sonuçları ölçmek ve içgörüleri etkili bir şekilde sunmak için özelleştirilebilir kontrol panelleri oluşturun.", cta_primary: "Yeni kontrol paneli oluştur", }, wiki: { title: "Bir not, bir belge veya tam bir bilgi tabanı yazın.", - description: "Sayfalar Plane'de düşünce yakalama alanıdır. Toplantı notları alın, kolayca biçimlendirin, iş öğelerini yerleştirin, bir bileşenler kütüphanesi kullanarak düzenleyin ve hepsini projenizin bağlamında tutun.", + description: + "Sayfalar Plane'de düşünce yakalama alanıdır. Toplantı notları alın, kolayca biçimlendirin, iş öğelerini yerleştirin, bir bileşenler kütüphanesi kullanarak düzenleyin ve hepsini projenizin bağlamında tutun.", cta_primary: "Sayfanızı oluşturun", }, }, settings_empty_state: { teamspace: { title: "Henüz ekip alanı yok", - description: "İlerlemeyi, iş yükünü ve etkinliği zahmetsizce takip etmek için üyelerinizi bir ekip alanında bir araya getirin. Daha fazla bilgi edinin", + description: + "İlerlemeyi, iş yükünü ve etkinliği zahmetsizce takip etmek için üyelerinizi bir ekip alanında bir araya getirin. Daha fazla bilgi edinin", cta_primary: "Ekip alanı ekle", }, work_item_types: { title: "İş öğesi türleri oluşturun ve özelleştirin", - description: "Projeniz için benzersiz iş öğesi türleri tanımlayın. Her tür, projenizin ve ekibinizin ihtiyaçlarına göre uyarlanmış kendi özellikleri, iş akışları ve alanlarına sahip olabilir.", + description: + "Projeniz için benzersiz iş öğesi türleri tanımlayın. Her tür, projenizin ve ekibinizin ihtiyaçlarına göre uyarlanmış kendi özellikleri, iş akışları ve alanlarına sahip olabilir.", cta_primary: "Etkinleştir", }, work_item_type_properties: { - title: "Bu iş öğesi türü için yakalamak istediğiniz özelliği ve ayrıntıları tanımlayın. Projenizin iş akışına uyacak şekilde özelleştirin.", + title: + "Bu iş öğesi türü için yakalamak istediğiniz özelliği ve ayrıntıları tanımlayın. Projenizin iş akışına uyacak şekilde özelleştirin.", cta_secondary: "Özellik ekle", }, epic_setting: { title: "Destanları Etkinleştir", - description: "İlgili iş öğelerini birden fazla döngü ve modülü kapsayan daha büyük gövdelere gruplayın - büyük resim ilerlemesini takip etmek için mükemmel.", + description: + "İlgili iş öğelerini birden fazla döngü ve modülü kapsayan daha büyük gövdelere gruplayın - büyük resim ilerlemesini takip etmek için mükemmel.", cta_primary: "Etkinleştir", }, templates: { title: "Henüz şablon yok", - description: "İş öğeleri ve sayfalar için şablonlar oluşturarak kurulum süresini azaltın — ve saniyeler içinde yeni çalışmaya başlayın.", + description: + "İş öğeleri ve sayfalar için şablonlar oluşturarak kurulum süresini azaltın — ve saniyeler içinde yeni çalışmaya başlayın.", cta_primary: "İlk şablonunuzu oluşturun", }, recurring_work_items: { title: "Henüz yinelenen iş öğesi yok", - description: "Tekrarlanan görevleri otomatikleştirmek ve zahmetsizce programa sadık kalmak için yinelenen iş öğeleri ayarlayın.", + description: + "Tekrarlanan görevleri otomatikleştirmek ve zahmetsizce programa sadık kalmak için yinelenen iş öğeleri ayarlayın.", cta_primary: "Yinelenen iş öğesi oluştur", }, worklogs: { title: "Tüm üyeler için zaman çizelgelerini takip edin", - description: "Projeler arasında herhangi bir ekip üyesi için ayrıntılı zaman çizelgelerini görmek için iş öğelerinde zaman kaydedin.", + description: + "Projeler arasında herhangi bir ekip üyesi için ayrıntılı zaman çizelgelerini görmek için iş öğelerinde zaman kaydedin.", }, customers_setting: { title: "Başlamak için müşteri yönetimini etkinleştirin.", @@ -90,7 +105,8 @@ export default { }, template_setting: { title: "Henüz şablon yok", - description: "Projeler, iş öğeleri ve sayfalar için şablonlar oluşturarak kurulum süresini azaltın — ve saniyeler içinde yeni çalışmaya başlayın.", + description: + "Projeler, iş öğeleri ve sayfalar için şablonlar oluşturarak kurulum süresini azaltın — ve saniyeler içinde yeni çalışmaya başlayın.", cta_primary: "Şablon oluştur", }, webhooks: { diff --git a/packages/i18n/src/locales/ua/empty-state-extended.ts b/packages/i18n/src/locales/ua/empty-state-extended.ts index 60cc71cdb8..4b69399f91 100644 --- a/packages/i18n/src/locales/ua/empty-state-extended.ts +++ b/packages/i18n/src/locales/ua/empty-state-extended.ts @@ -22,67 +22,80 @@ export default { }, active_cycles: { title: "Немає активних циклів", - description: "У вас зараз немає поточних циклів. Активні цикли з'являються тут, коли вони включають сьогоднішню дату.", + description: + "У вас зараз немає поточних циклів. Активні цикли з'являються тут, коли вони включають сьогоднішню дату.", }, teamspaces: { title: "З командними просторами відкрийте кращу організацію та відстеження", - description: "Створіть виділену поверхню для кожної реальної команди, окремо від усіх інших робочих поверхонь у Plane, та налаштуйте їх відповідно до того, як працює ваша команда.", + description: + "Створіть виділену поверхню для кожної реальної команди, окремо від усіх інших робочих поверхонь у Plane, та налаштуйте їх відповідно до того, як працює ваша команда.", cta_primary: "Створити новий Командний простір", }, initiatives: { title: "Відстежуйте проєкти та епіки з одного місця", - description: "Використовуйте ініціативи для групування та моніторингу пов'язаних проєктів та епіків. Переглядайте прогрес, пріоритети та результати—все з одного екрана.", + description: + "Використовуйте ініціативи для групування та моніторингу пов'язаних проєктів та епіків. Переглядайте прогрес, пріоритети та результати—все з одного екрана.", cta_primary: "Створити Ініціативу", }, customers: { title: "Керуйте роботою за тим, що важливо для ваших клієнтів", - description: "Приносьте запити клієнтів до робочих елементів, призначайте пріоритет за запитами та згортайте стани робочих елементів у записи клієнтів. Незабаром ви зможете інтегруватися з вашою CRM або інструментом підтримки для ще кращого управління роботою за атрибутами клієнтів.", + description: + "Приносьте запити клієнтів до робочих елементів, призначайте пріоритет за запитами та згортайте стани робочих елементів у записи клієнтів. Незабаром ви зможете інтегруватися з вашою CRM або інструментом підтримки для ще кращого управління роботою за атрибутами клієнтів.", cta_primary: "Створити запис клієнта", }, dashboard: { title: "Візуалізуйте свій прогрес за допомогою панелей", - description: "Створюйте налаштовувані панелі для відстеження метрик, вимірювання результатів та ефективного представлення аналітики.", + description: + "Створюйте налаштовувані панелі для відстеження метрик, вимірювання результатів та ефективного представлення аналітики.", cta_primary: "Створити нову панель", }, wiki: { title: "Напишіть нотатку, документ або повну базу знань.", - description: "Сторінки — це простір для фіксації думок у Plane. Робіть нотатки зустрічей, легко форматуйте їх, вбудовуйте робочі елементи, розміщуйте їх за допомогою бібліотеки компонентів і зберігайте все в контексті вашого проєкту.", + description: + "Сторінки — це простір для фіксації думок у Plane. Робіть нотатки зустрічей, легко форматуйте їх, вбудовуйте робочі елементи, розміщуйте їх за допомогою бібліотеки компонентів і зберігайте все в контексті вашого проєкту.", cta_primary: "Створіть вашу сторінку", }, }, settings_empty_state: { teamspace: { title: "Ще немає командного простору", - description: "Зберіть своїх учасників у командному просторі для відстеження прогресу, робочого навантаження та активності — без зусиль. Дізнатися більше", + description: + "Зберіть своїх учасників у командному просторі для відстеження прогресу, робочого навантаження та активності — без зусиль. Дізнатися більше", cta_primary: "Додати командний простір", }, work_item_types: { title: "Створюйте та налаштовуйте типи робочих елементів", - description: "Визначте унікальні типи робочих елементів для вашого проєкту. Кожен тип може мати власні властивості, робочі процеси та поля — адаптовані до потреб вашого проєкту та команди.", + description: + "Визначте унікальні типи робочих елементів для вашого проєкту. Кожен тип може мати власні властивості, робочі процеси та поля — адаптовані до потреб вашого проєкту та команди.", cta_primary: "Увімкнути", }, work_item_type_properties: { - title: "Визначте властивість та деталі, які ви хочете зафіксувати для цього типу робочого елемента. Налаштуйте його відповідно до робочого процесу вашого проєкту.", + title: + "Визначте властивість та деталі, які ви хочете зафіксувати для цього типу робочого елемента. Налаштуйте його відповідно до робочого процесу вашого проєкту.", cta_secondary: "Додати властивість", }, epic_setting: { title: "Увімкнути Епіки", - description: "Групуйте пов'язані робочі елементи в більші блоки, що охоплюють декілька циклів та модулів — ідеально для відстеження прогресу в цілому.", + description: + "Групуйте пов'язані робочі елементи в більші блоки, що охоплюють декілька циклів та модулів — ідеально для відстеження прогресу в цілому.", cta_primary: "Увімкнути", }, templates: { title: "Ще немає шаблонів", - description: "Скоротіть час налаштування, створюючи шаблони для робочих елементів та сторінок — і починайте нову роботу за секунди.", + description: + "Скоротіть час налаштування, створюючи шаблони для робочих елементів та сторінок — і починайте нову роботу за секунди.", cta_primary: "Створіть свій перший шаблон", }, recurring_work_items: { title: "Ще немає повторюваного робочого елемента", - description: "Налаштуйте повторювані робочі елементи для автоматизації повторюваних завдань та легкого дотримання графіка.", + description: + "Налаштуйте повторювані робочі елементи для автоматизації повторюваних завдань та легкого дотримання графіка.", cta_primary: "Створити повторюваний робочий елемент", }, worklogs: { title: "Відстежуйте табелі обліку часу для всіх учасників", - description: "Реєструйте час на робочих елементах для перегляду детальних табелів для будь-якого члена команди по проєктах.", + description: + "Реєструйте час на робочих елементах для перегляду детальних табелів для будь-якого члена команди по проєктах.", }, customers_setting: { title: "Увімкніть управління клієнтами, щоб почати.", @@ -90,7 +103,8 @@ export default { }, template_setting: { title: "Ще немає шаблонів", - description: "Скоротіть час налаштування, створюючи шаблони для проєктів, робочих елементів та сторінок — і починайте нову роботу за секунди.", + description: + "Скоротіть час налаштування, створюючи шаблони для проєктів, робочих елементів та сторінок — і починайте нову роботу за секунди.", cta_primary: "Створити шаблон", }, webhooks: { diff --git a/packages/i18n/src/locales/vi-VN/empty-state-extended.ts b/packages/i18n/src/locales/vi-VN/empty-state-extended.ts index 2513eebdd7..1536182296 100644 --- a/packages/i18n/src/locales/vi-VN/empty-state-extended.ts +++ b/packages/i18n/src/locales/vi-VN/empty-state-extended.ts @@ -2,7 +2,8 @@ export default { project_empty_state: { epics: { title: "Biến các dự án phức tạp thành các câu chuyện sử thi có cấu trúc.", - description: "Một câu chuyện sử thi giúp bạn tổ chức các mục tiêu lớn thành các nhiệm vụ nhỏ hơn, có thể theo dõi.", + description: + "Một câu chuyện sử thi giúp bạn tổ chức các mục tiêu lớn thành các nhiệm vụ nhỏ hơn, có thể theo dõi.", cta_primary: "Tạo Câu chuyện Sử thi", cta_secondary: "Tài liệu", }, @@ -22,67 +23,80 @@ export default { }, active_cycles: { title: "Không có chu kỳ hoạt động", - description: "Bạn không có chu kỳ đang tiến hành ngay bây giờ. Các chu kỳ hoạt động xuất hiện ở đây khi chúng bao gồm ngày hôm nay.", + description: + "Bạn không có chu kỳ đang tiến hành ngay bây giờ. Các chu kỳ hoạt động xuất hiện ở đây khi chúng bao gồm ngày hôm nay.", }, teamspaces: { title: "Với không gian nhóm, mở khóa tổ chức và theo dõi tốt hơn", - description: "Tạo một bề mặt chuyên dụng cho mỗi đội thực tế, tách biệt khỏi tất cả các bề mặt làm việc khác trong Plane và tùy chỉnh chúng để phù hợp với cách đội của bạn làm việc.", + description: + "Tạo một bề mặt chuyên dụng cho mỗi đội thực tế, tách biệt khỏi tất cả các bề mặt làm việc khác trong Plane và tùy chỉnh chúng để phù hợp với cách đội của bạn làm việc.", cta_primary: "Tạo Không gian Nhóm mới", }, initiatives: { title: "Theo dõi các dự án và câu chuyện sử thi từ một nơi", - description: "Sử dụng sáng kiến để nhóm và giám sát các dự án và câu chuyện sử thi liên quan. Xem tiến độ, ưu tiên và kết quả—tất cả từ một màn hình duy nhất.", + description: + "Sử dụng sáng kiến để nhóm và giám sát các dự án và câu chuyện sử thi liên quan. Xem tiến độ, ưu tiên và kết quả—tất cả từ một màn hình duy nhất.", cta_primary: "Tạo Sáng kiến", }, customers: { title: "Quản lý công việc theo những gì quan trọng với khách hàng của bạn", - description: "Đưa yêu cầu của khách hàng vào các mục công việc, gán mức độ ưu tiên theo yêu cầu và tổng hợp trạng thái của các mục công việc vào hồ sơ khách hàng. Sớm, bạn sẽ tích hợp với công cụ CRM hoặc Hỗ trợ của mình để quản lý công việc tốt hơn theo thuộc tính khách hàng.", + description: + "Đưa yêu cầu của khách hàng vào các mục công việc, gán mức độ ưu tiên theo yêu cầu và tổng hợp trạng thái của các mục công việc vào hồ sơ khách hàng. Sớm, bạn sẽ tích hợp với công cụ CRM hoặc Hỗ trợ của mình để quản lý công việc tốt hơn theo thuộc tính khách hàng.", cta_primary: "Tạo hồ sơ khách hàng", }, dashboard: { title: "Trực quan hóa tiến độ của bạn với bảng điều khiển", - description: "Xây dựng bảng điều khiển có thể tùy chỉnh để theo dõi số liệu, đo lường kết quả và trình bày thông tin hiệu quả.", + description: + "Xây dựng bảng điều khiển có thể tùy chỉnh để theo dõi số liệu, đo lường kết quả và trình bày thông tin hiệu quả.", cta_primary: "Tạo bảng điều khiển mới", }, wiki: { title: "Viết một ghi chú, một tài liệu hoặc một cơ sở kiến thức đầy đủ.", - description: "Các trang là không gian ghi lại suy nghĩ trong Plane. Ghi chú cuộc họp, định dạng chúng dễ dàng, nhúng các mục công việc, bố trí chúng bằng thư viện các thành phần và giữ chúng tất cả trong bối cảnh dự án của bạn.", + description: + "Các trang là không gian ghi lại suy nghĩ trong Plane. Ghi chú cuộc họp, định dạng chúng dễ dàng, nhúng các mục công việc, bố trí chúng bằng thư viện các thành phần và giữ chúng tất cả trong bối cảnh dự án của bạn.", cta_primary: "Tạo trang của bạn", }, }, settings_empty_state: { teamspace: { title: "Chưa có không gian nhóm", - description: "Tập hợp các thành viên của bạn trong một không gian nhóm để theo dõi tiến độ, khối lượng công việc và hoạt động - một cách dễ dàng. Tìm hiểu thêm", + description: + "Tập hợp các thành viên của bạn trong một không gian nhóm để theo dõi tiến độ, khối lượng công việc và hoạt động - một cách dễ dàng. Tìm hiểu thêm", cta_primary: "Thêm không gian nhóm", }, work_item_types: { title: "Tạo và tùy chỉnh các loại mục công việc", - description: "Xác định các loại mục công việc độc đáo cho dự án của bạn. Mỗi loại có thể có thuộc tính, quy trình làm việc và trường riêng - được điều chỉnh theo nhu cầu của dự án và đội của bạn.", + description: + "Xác định các loại mục công việc độc đáo cho dự án của bạn. Mỗi loại có thể có thuộc tính, quy trình làm việc và trường riêng - được điều chỉnh theo nhu cầu của dự án và đội của bạn.", cta_primary: "Kích hoạt", }, work_item_type_properties: { - title: "Xác định thuộc tính và chi tiết bạn muốn thu thập cho loại mục công việc này. Tùy chỉnh nó để phù hợp với quy trình làm việc của dự án.", + title: + "Xác định thuộc tính và chi tiết bạn muốn thu thập cho loại mục công việc này. Tùy chỉnh nó để phù hợp với quy trình làm việc của dự án.", cta_secondary: "Thêm thuộc tính", }, epic_setting: { title: "Kích hoạt Câu chuyện Sử thi", - description: "Nhóm các mục công việc liên quan thành các thực thể lớn hơn trải dài qua nhiều chu kỳ và mô-đun - hoàn hảo để theo dõi tiến độ tổng thể.", + description: + "Nhóm các mục công việc liên quan thành các thực thể lớn hơn trải dài qua nhiều chu kỳ và mô-đun - hoàn hảo để theo dõi tiến độ tổng thể.", cta_primary: "Kích hoạt", }, templates: { title: "Chưa có mẫu", - description: "Giảm thời gian thiết lập bằng cách tạo mẫu cho các mục công việc và trang — và bắt đầu công việc mới trong vài giây.", + description: + "Giảm thời gian thiết lập bằng cách tạo mẫu cho các mục công việc và trang — và bắt đầu công việc mới trong vài giây.", cta_primary: "Tạo mẫu đầu tiên của bạn", }, recurring_work_items: { title: "Chưa có mục công việc định kỳ", - description: "Thiết lập các mục công việc định kỳ để tự động hóa các nhiệm vụ lặp lại và giữ đúng lịch trình một cách dễ dàng.", + description: + "Thiết lập các mục công việc định kỳ để tự động hóa các nhiệm vụ lặp lại và giữ đúng lịch trình một cách dễ dàng.", cta_primary: "Tạo mục công việc định kỳ", }, worklogs: { title: "Theo dõi bảng chấm công cho tất cả thành viên", - description: "Ghi nhật ký thời gian trên các mục công việc để xem bảng chấm công chi tiết cho bất kỳ thành viên nào trong đội qua các dự án.", + description: + "Ghi nhật ký thời gian trên các mục công việc để xem bảng chấm công chi tiết cho bất kỳ thành viên nào trong đội qua các dự án.", }, customers_setting: { title: "Kích hoạt quản lý khách hàng để bắt đầu.", @@ -90,7 +104,8 @@ export default { }, template_setting: { title: "Chưa có mẫu", - description: "Giảm thời gian thiết lập bằng cách tạo mẫu cho dự án, mục công việc và trang — và bắt đầu công việc mới trong vài giây.", + description: + "Giảm thời gian thiết lập bằng cách tạo mẫu cho dự án, mục công việc và trang — và bắt đầu công việc mới trong vài giây.", cta_primary: "Tạo mẫu", }, webhooks: { diff --git a/packages/i18n/src/locales/zh-CN/empty-state-extended.ts b/packages/i18n/src/locales/zh-CN/empty-state-extended.ts index afa4cf05fd..7fff9575e2 100644 --- a/packages/i18n/src/locales/zh-CN/empty-state-extended.ts +++ b/packages/i18n/src/locales/zh-CN/empty-state-extended.ts @@ -26,7 +26,8 @@ export default { }, teamspaces: { title: "使用团队空间解锁更好的组织和跟踪", - description: "为每个真实世界的团队创建专用空间,与 Plane 中的所有其他工作空间分离,并自定义它们以适应您的团队工作方式。", + description: + "为每个真实世界的团队创建专用空间,与 Plane 中的所有其他工作空间分离,并自定义它们以适应您的团队工作方式。", cta_primary: "创建新的团队空间", }, initiatives: { @@ -36,7 +37,8 @@ export default { }, customers: { title: "按对客户重要的内容管理工作", - description: "将客户请求与工作项关联,按请求分配优先级,并将工作项状态汇总到客户记录中。很快,您将能够与您的 CRM 或支持工具集成,以便按客户属性进行更好的工作管理。", + description: + "将客户请求与工作项关联,按请求分配优先级,并将工作项状态汇总到客户记录中。很快,您将能够与您的 CRM 或支持工具集成,以便按客户属性进行更好的工作管理。", cta_primary: "创建客户记录", }, dashboard: { @@ -46,7 +48,8 @@ export default { }, wiki: { title: "编写笔记、文档或完整的知识库。", - description: "页面是 Plane 中的思想捕捉空间。记录会议笔记,轻松格式化,嵌入工作项,使用组件库进行布局,并将它们全部保留在项目上下文中。", + description: + "页面是 Plane 中的思想捕捉空间。记录会议笔记,轻松格式化,嵌入工作项,使用组件库进行布局,并将它们全部保留在项目上下文中。", cta_primary: "创建您的页面", }, }, @@ -58,7 +61,8 @@ export default { }, work_item_types: { title: "创建和自定义工作项类型", - description: "为项目定义独特的工作项类型。每种类型都可以有自己的属性、工作流程和字段 — 根据项目和团队需求量身定制。", + description: + "为项目定义独特的工作项类型。每种类型都可以有自己的属性、工作流程和字段 — 根据项目和团队需求量身定制。", cta_primary: "启用", }, work_item_type_properties: { diff --git a/packages/i18n/src/locales/zh-TW/empty-state-extended.ts b/packages/i18n/src/locales/zh-TW/empty-state-extended.ts index 8d894c40ff..ecb60dc763 100644 --- a/packages/i18n/src/locales/zh-TW/empty-state-extended.ts +++ b/packages/i18n/src/locales/zh-TW/empty-state-extended.ts @@ -26,7 +26,8 @@ export default { }, teamspaces: { title: "使用團隊空間解鎖更好的組織和追蹤", - description: "為每個真實世界的團隊建立專用空間,與 Plane 中的所有其他工作空間分離,並自訂它們以適應您的團隊工作方式。", + description: + "為每個真實世界的團隊建立專用空間,與 Plane 中的所有其他工作空間分離,並自訂它們以適應您的團隊工作方式。", cta_primary: "建立新的團隊空間", }, initiatives: { @@ -36,7 +37,8 @@ export default { }, customers: { title: "按對客戶重要的內容管理工作", - description: "將客戶請求與工作項關聯,按請求分配優先順序,並將工作項狀態彙總到客戶記錄中。很快,您將能夠與您的 CRM 或支援工具整合,以便按客戶屬性進行更好的工作管理。", + description: + "將客戶請求與工作項關聯,按請求分配優先順序,並將工作項狀態彙總到客戶記錄中。很快,您將能夠與您的 CRM 或支援工具整合,以便按客戶屬性進行更好的工作管理。", cta_primary: "建立客戶記錄", }, dashboard: { @@ -46,7 +48,8 @@ export default { }, wiki: { title: "撰寫筆記、文件或完整的知識庫。", - description: "頁面是 Plane 中的思想捕捉空間。記錄會議筆記,輕鬆格式化,嵌入工作項,使用元件庫進行配置,並將它們全部保留在專案上下文中。", + description: + "頁面是 Plane 中的思想捕捉空間。記錄會議筆記,輕鬆格式化,嵌入工作項,使用元件庫進行配置,並將它們全部保留在專案上下文中。", cta_primary: "建立您的頁面", }, }, @@ -58,7 +61,8 @@ export default { }, work_item_types: { title: "建立和自訂工作項類型", - description: "為專案定義獨特的工作項類型。每種類型都可以有自己的屬性、工作流程和欄位 — 根據專案和團隊需求量身訂製。", + description: + "為專案定義獨特的工作項類型。每種類型都可以有自己的屬性、工作流程和欄位 — 根據專案和團隊需求量身訂製。", cta_primary: "啟用", }, work_item_type_properties: { diff --git a/packages/sdk/src/services/issue.service.ts b/packages/sdk/src/services/issue.service.ts index 387a10a82b..02aab84f0a 100644 --- a/packages/sdk/src/services/issue.service.ts +++ b/packages/sdk/src/services/issue.service.ts @@ -25,7 +25,9 @@ export class IssueService extends APIService { issueSequence: number, include_epics: boolean = false ): Promise { - return this.get(`/api/v1/workspaces/${workspaceSlug}/issues/${projectIdentifier}-${issueSequence.toString()}/?include_epics=${include_epics}`) + return this.get( + `/api/v1/workspaces/${workspaceSlug}/issues/${projectIdentifier}-${issueSequence.toString()}/?include_epics=${include_epics}` + ) .then((response) => response.data) .catch((error) => { throw error?.response?.data; diff --git a/packages/types/src/initiatives/initiatives.ts b/packages/types/src/initiatives/initiatives.ts index 5f08a1a59f..258f224704 100644 --- a/packages/types/src/initiatives/initiatives.ts +++ b/packages/types/src/initiatives/initiatives.ts @@ -1,5 +1,5 @@ -import { TFileSignedURLResponse } from "../file"; import { TBaseLayoutType } from "../base-layouts"; +import { TFileSignedURLResponse } from "../file"; import { EIssueLayoutTypes } from "../issues/base"; export enum EInitiativeNavigationItem {