misc: updated no license behavior for PAM

This commit is contained in:
Sheen Capadngan
2025-10-07 01:33:48 +08:00
parent 6e488954c5
commit 7288066d96
7 changed files with 53 additions and 15 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -1,5 +1,8 @@
export enum PamResourceType { export enum PamResourceType {
Postgres = "postgres" Postgres = "postgres",
RDP = "rdp",
SSH = "ssh",
Kubernetes = "kubernetes"
} }
export enum PamSessionStatus { export enum PamSessionStatus {

View File

@@ -4,5 +4,8 @@ export const PAM_RESOURCE_TYPE_MAP: Record<
PamResourceType, PamResourceType,
{ name: string; image: string; size?: number } { name: string; image: string; size?: number }
> = { > = {
[PamResourceType.Postgres]: { name: "PostgreSQL", image: "Postgres.png" } [PamResourceType.Postgres]: { name: "PostgreSQL", image: "Postgres.png" },
[PamResourceType.RDP]: { name: "RDP", image: "RDP.png" },
[PamResourceType.SSH]: { name: "SSH", image: "SSH.png" },
[PamResourceType.Kubernetes]: { name: "Kubernetes", image: "Kubernetes.png" }
}; };

View File

@@ -35,7 +35,6 @@ import {
Tr Tr
} from "@app/components/v2"; } from "@app/components/v2";
import { ROUTE_PATHS } from "@app/const/routes"; import { ROUTE_PATHS } from "@app/const/routes";
import { useSubscription } from "@app/context";
import { import {
ProjectPermissionActions, ProjectPermissionActions,
ProjectPermissionPamAccountActions, ProjectPermissionPamAccountActions,
@@ -71,7 +70,6 @@ type Props = {
}; };
export const PamAccountsTable = ({ accounts, folders, projectId }: Props) => { export const PamAccountsTable = ({ accounts, folders, projectId }: Props) => {
const { subscription } = useSubscription();
const navigate = useNavigate({ from: ROUTE_PATHS.Pam.AccountsPage.path }); const navigate = useNavigate({ from: ROUTE_PATHS.Pam.AccountsPage.path });
const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([ const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([
@@ -357,7 +355,7 @@ export const PamAccountsTable = ({ accounts, folders, projectId }: Props) => {
variant="outline_bg" variant="outline_bg"
leftIcon={<FontAwesomeIcon icon={faPlus} />} leftIcon={<FontAwesomeIcon icon={faPlus} />}
onClick={() => handlePopUpOpen("addAccount")} onClick={() => handlePopUpOpen("addAccount")}
isDisabled={!isAllowedToCreateAccounts || !subscription.pam} isDisabled={!isAllowedToCreateAccounts}
className={`h-10 transition-colors ${accountView === AccountView.Flat ? "" : "rounded-r-none"}`} className={`h-10 transition-colors ${accountView === AccountView.Flat ? "" : "rounded-r-none"}`}
> >
Add Account Add Account

View File

@@ -34,7 +34,7 @@ import {
Tr Tr
} from "@app/components/v2"; } from "@app/components/v2";
import { ROUTE_PATHS } from "@app/const/routes"; import { ROUTE_PATHS } from "@app/const/routes";
import { ProjectPermissionActions, ProjectPermissionSub, useSubscription } from "@app/context"; import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context";
import { import {
OrgGatewayPermissionActions, OrgGatewayPermissionActions,
OrgPermissionSubjects OrgPermissionSubjects
@@ -62,8 +62,6 @@ type Props = {
}; };
export const PamResourcesTable = ({ projectId, resources }: Props) => { export const PamResourcesTable = ({ projectId, resources }: Props) => {
const { subscription } = useSubscription();
const navigate = useNavigate({ from: ROUTE_PATHS.Pam.ResourcesPage.path }); const navigate = useNavigate({ from: ROUTE_PATHS.Pam.ResourcesPage.path });
const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([ const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([
@@ -246,9 +244,7 @@ export const PamResourcesTable = ({ projectId, resources }: Props) => {
colorSchema="secondary" colorSchema="secondary"
leftIcon={<FontAwesomeIcon icon={faPlus} />} leftIcon={<FontAwesomeIcon icon={faPlus} />}
onClick={() => handlePopUpOpen("addResource")} onClick={() => handlePopUpOpen("addResource")}
isDisabled={ isDisabled={!isAllowed || !isGatewayAllowed}
!isAllowed || !isGatewayAllowed || !subscription.gateway || !subscription.pam
}
> >
Add Resource Add Resource
</Button> </Button>

View File

@@ -2,8 +2,10 @@ import { useMemo } from "react";
import { faInfoCircle, faMagnifyingGlass, faSearch } from "@fortawesome/free-solid-svg-icons"; import { faInfoCircle, faMagnifyingGlass, faSearch } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal";
import { EmptyState, Input, Pagination, Spinner, Tooltip } from "@app/components/v2"; import { EmptyState, Input, Pagination, Spinner, Tooltip } from "@app/components/v2";
import { usePagination, useResetPageHelper } from "@app/hooks"; import { useSubscription } from "@app/context";
import { usePagination, usePopUp, useResetPageHelper } from "@app/hooks";
import { import {
PAM_RESOURCE_TYPE_MAP, PAM_RESOURCE_TYPE_MAP,
PamResourceType, PamResourceType,
@@ -16,6 +18,18 @@ type Props = {
export const ResourceTypeSelect = ({ onSelect }: Props) => { export const ResourceTypeSelect = ({ onSelect }: Props) => {
const { isPending, data: resourceOptions } = useListPamResourceOptions(); const { isPending, data: resourceOptions } = useListPamResourceOptions();
const { subscription } = useSubscription();
const { popUp, handlePopUpToggle } = usePopUp(["upgradePlan"] as const);
const appendedResourceOptions = useMemo(() => {
if (!resourceOptions) return [];
return [
...resourceOptions,
{ name: "RDP", resource: PamResourceType.RDP },
{ name: "SSH", resource: PamResourceType.SSH },
{ name: "Kubernetes", resource: PamResourceType.Kubernetes }
];
}, [resourceOptions]);
const { search, setSearch, setPage, page, perPage, setPerPage, offset } = usePagination("", { const { search, setSearch, setPage, page, perPage, setPerPage, offset } = usePagination("", {
initPerPage: 16 initPerPage: 16
@@ -23,12 +37,12 @@ export const ResourceTypeSelect = ({ onSelect }: Props) => {
const filteredOptions = useMemo( const filteredOptions = useMemo(
() => () =>
resourceOptions?.filter( appendedResourceOptions?.filter(
({ name, resource }) => ({ name, resource }) =>
name.toLowerCase().includes(search.trim().toLowerCase()) || name.toLowerCase().includes(search.trim().toLowerCase()) ||
resource.toLowerCase().includes(search.trim().toLowerCase()) resource.toLowerCase().includes(search.trim().toLowerCase())
) ?? [], ) ?? [],
[resourceOptions, search] [appendedResourceOptions, search]
); );
useResetPageHelper({ useResetPageHelper({
@@ -37,6 +51,23 @@ export const ResourceTypeSelect = ({ onSelect }: Props) => {
setPage setPage
}); });
const handleResourceSelect = (resource: PamResourceType) => {
if (!subscription?.pam) {
handlePopUpToggle("upgradePlan", true);
return;
}
if (
resource === PamResourceType.RDP ||
resource === PamResourceType.SSH ||
resource === PamResourceType.Kubernetes
) {
return;
}
onSelect(resource);
};
if (isPending) { if (isPending) {
return ( return (
<div className="flex h-full flex-col items-center justify-center py-2.5"> <div className="flex h-full flex-col items-center justify-center py-2.5">
@@ -62,7 +93,7 @@ export const ResourceTypeSelect = ({ onSelect }: Props) => {
return ( return (
<button <button
type="button" type="button"
onClick={() => onSelect(option.resource)} onClick={() => handleResourceSelect(option.resource)}
className="group relative flex h-28 cursor-pointer flex-col items-center justify-center rounded-md border border-mineshaft-600 bg-mineshaft-700 p-4 duration-200 hover:bg-mineshaft-600" className="group relative flex h-28 cursor-pointer flex-col items-center justify-center rounded-md border border-mineshaft-600 bg-mineshaft-700 p-4 duration-200 hover:bg-mineshaft-600"
> >
<div className="relative"> <div className="relative">
@@ -136,6 +167,13 @@ export const ResourceTypeSelect = ({ onSelect }: Props) => {
perPageList={[16]} perPageList={[16]}
/> />
)} )}
{subscription && (
<UpgradePlanModal
isOpen={popUp.upgradePlan.isOpen}
onOpenChange={(isOpen) => handlePopUpToggle("upgradePlan", isOpen)}
text="PAM (Privileged Access Management) requires an enterprise plan."
/>
)}
</div> </div>
); );
}; };