From b051c38ace2df7c755c61d4bd57ec5ed2e22a02e Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Tue, 17 Dec 2024 21:41:40 +0530 Subject: [PATCH] improvement: billing and plans (#1962) * improvement: update modal UI * chore: total member count chip * chore: seats banner ux copy improvement * improvement: workspace disabled page and seats banner ux copy --- .../(projects)/settings/members/page.tsx | 10 ++++- .../license/banner/seats-banner.tsx | 6 +-- .../license/modal/card/plan-upgrade.tsx | 15 +++++--- .../license/modal/card/talk-to-sales.tsx | 2 + .../license/modal/trial-button/pro.tsx | 2 +- .../license/modal/upgrade-modal.tsx | 2 - .../components/license/workspace-disabled.tsx | 38 ++++++++++++++----- 7 files changed, 52 insertions(+), 23 deletions(-) diff --git a/web/app/[workspaceSlug]/(projects)/settings/members/page.tsx b/web/app/[workspaceSlug]/(projects)/settings/members/page.tsx index 724f81c8af..2f0d5f1ff8 100644 --- a/web/app/[workspaceSlug]/(projects)/settings/members/page.tsx +++ b/web/app/[workspaceSlug]/(projects)/settings/members/page.tsx @@ -10,6 +10,7 @@ import { IWorkspaceBulkInviteFormData } from "@plane/types"; import { Button, CustomMenu, TOAST_TYPE, setToast } from "@plane/ui"; // components import { NotAuthorizedView } from "@/components/auth-screens"; +import { CountChip } from "@/components/common"; import { PageHead } from "@/components/core"; import { SendWorkspaceInvitationModal, WorkspaceMembersList } from "@/components/workspace"; // constants @@ -43,7 +44,7 @@ const WorkspaceMembersSettingsPage = observer(() => { const { workspaceUserInfo, allowPermissions } = useUserPermissions(); const { captureEvent } = useEventTracker(); const { - workspace: { inviteMembersToWorkspace }, + workspace: { workspaceMemberIds, inviteMembersToWorkspace }, } = useMember(); const { currentWorkspace } = useWorkspace(); @@ -145,7 +146,12 @@ const WorkspaceMembersSettingsPage = observer(() => { })} >
-

Members

+

+ Members + {workspaceMemberIds && workspaceMemberIds.length > 0 && ( + + )} +

{ : EPlanMessageKeys.NEAR_LIMIT; const planMessages = { - free_plan: `Your workspace has been grandfathered to ${freeSeats} over the 12-member limit on the Free plan. To add more members, upgrade to Pro.`, - near_limit: `You’ve already ${totalSeats} out of ${freeSeats} members allowed on the Free plan. You can only add ${freeSeats - totalSeats} more members. To remove the limit, upgrade to Pro.`, - limit_reached: `You’ve reached the members limit of ${freeSeats} on this plan. To add more members, upgrade to Pro`, + free_plan: `Your workspace has been grandfathered to ${freeSeats} over the 12-user limit on the Free plan. To add more users, upgrade to a paid plan.`, + near_limit: `You have ${totalSeats} out of ${freeSeats} users allowed on the Free plan. To remove the limit, upgrade to a paid plan.`, + limit_reached: `You have ${totalSeats} out of ${freeSeats} users allowed on the Free plan. To remove the limit, upgrade to a paid plan.`, }; const currentVariant: "primary" | "danger" = currentPlanKey && [EPlanMessageKeys.NEAR_LIMIT, EPlanMessageKeys.LIMIT_REACHED].includes(currentPlanKey) diff --git a/web/ee/components/license/modal/card/plan-upgrade.tsx b/web/ee/components/license/modal/card/plan-upgrade.tsx index 3e8a19d82f..4edad7a83d 100644 --- a/web/ee/components/license/modal/card/plan-upgrade.tsx +++ b/web/ee/components/license/modal/card/plan-upgrade.tsx @@ -204,12 +204,15 @@ export const PlanUpgradeCard: FC = (props) => { ? "Redirecting to Stripe..." : (upgradeCTA ?? `Upgrade to ${planeName}`)} - {isTrialAllowed && - renderTrialButton && - renderTrialButton({ - productId: product?.id, - priceId: price.id, - })} + {isTrialAllowed && ( +
+ {renderTrialButton && + renderTrialButton({ + productId: product?.id, + priceId: price.id, + })} +
+ )}
)}
diff --git a/web/ee/components/license/modal/card/talk-to-sales.tsx b/web/ee/components/license/modal/card/talk-to-sales.tsx index af89be6269..9ea66fcf21 100644 --- a/web/ee/components/license/modal/card/talk-to-sales.tsx +++ b/web/ee/components/license/modal/card/talk-to-sales.tsx @@ -37,6 +37,7 @@ export const TalkToSalesCard: FC = (props) => { const { currentWorkspaceSubscribedPlanDetail: subscriptionDetail } = useWorkspaceSubscription(); // derived values const isSelfHosted = !!subscriptionDetail?.is_self_managed; + const isTrialAllowed = !!subscriptionDetail?.is_trial_allowed; const basePlan = getBasePlanName(planVariant, isSelfHosted); // Plane details const planeName = planVariant.charAt(0).toUpperCase() + planVariant.slice(1).toLowerCase(); @@ -73,6 +74,7 @@ export const TalkToSalesCard: FC = (props) => { > Talk to sales + {isTrialAllowed &&
}
)}
diff --git a/web/ee/components/license/modal/trial-button/pro.tsx b/web/ee/components/license/modal/trial-button/pro.tsx index 3e2010f5b5..b5b42c5f2b 100644 --- a/web/ee/components/license/modal/trial-button/pro.tsx +++ b/web/ee/components/license/modal/trial-button/pro.tsx @@ -50,7 +50,7 @@ export const ProTrialButton: React.FC = (props: TTrialButtonP return ( +
)}