diff --git a/frontend/src/components/permissions/OrgPermissionCan.tsx b/frontend/src/components/permissions/OrgPermissionCan.tsx index bbe5bf986..d2e698e88 100644 --- a/frontend/src/components/permissions/OrgPermissionCan.tsx +++ b/frontend/src/components/permissions/OrgPermissionCan.tsx @@ -1,26 +1,14 @@ import { FunctionComponent, ReactNode } from "react"; import { BoundCanProps, Can } from "@casl/react"; -import { faLock } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { TOrgPermission, useOrgPermission } from "@app/context/OrgPermissionContext"; -import { Tooltip } from "../v2"; +import { AccessRestrictedBanner, Tooltip } from "../v2"; export const OrgPermissionGuardBanner = () => { return (
-
-
- -
-
-
Access Restricted
-
- Your role has limited permissions, please
contact your admin to gain access -
-
-
+
); }; diff --git a/frontend/src/components/permissions/PermissionDeniedBanner.tsx b/frontend/src/components/permissions/PermissionDeniedBanner.tsx index b3c7a4f53..3f86a7257 100644 --- a/frontend/src/components/permissions/PermissionDeniedBanner.tsx +++ b/frontend/src/components/permissions/PermissionDeniedBanner.tsx @@ -1,15 +1,12 @@ -import { ReactNode } from "react"; -import { faLock } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { twMerge } from "tailwind-merge"; +import { AccessRestrictedBanner } from "@app/components/v2"; + type Props = { containerClassName?: string; - className?: string; - children?: ReactNode; }; -export const PermissionDeniedBanner = ({ containerClassName, className, children }: Props) => { +export const PermissionDeniedBanner = ({ containerClassName }: Props) => { return (
-
-
-
- -
-
-
Access Restricted
- {children || ( -
- Your role has limited permissions, please
contact your administrator to gain - access -
- )} -
-
-
+
); }; diff --git a/frontend/src/components/permissions/ProjectPermissionCan.tsx b/frontend/src/components/permissions/ProjectPermissionCan.tsx index f49709ff3..88a8c6ad9 100644 --- a/frontend/src/components/permissions/ProjectPermissionCan.tsx +++ b/frontend/src/components/permissions/ProjectPermissionCan.tsx @@ -1,9 +1,8 @@ import { FunctionComponent, ReactNode } from "react"; import { AbilityTuple, MongoAbility } from "@casl/ability"; import { Can } from "@casl/react"; -import { faLock } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { AccessRestrictedBanner } from "@app/components/v2"; import { ProjectPermissionSet, useProjectPermission } from "@app/context/ProjectPermissionContext"; import { Tooltip } from "../v2/Tooltip"; @@ -11,17 +10,7 @@ import { Tooltip } from "../v2/Tooltip"; export const ProjectPermissionGuardBanner = () => { return (
-
-
- -
-
-
Access Restricted
-
- Your role has limited permissions, please
contact your admin to gain access -
-
-
+
); }; diff --git a/frontend/src/components/v2/AccessRestrictedBanner/AccessRestrictedBanner.tsx b/frontend/src/components/v2/AccessRestrictedBanner/AccessRestrictedBanner.tsx new file mode 100644 index 000000000..27fa3c982 --- /dev/null +++ b/frontend/src/components/v2/AccessRestrictedBanner/AccessRestrictedBanner.tsx @@ -0,0 +1,26 @@ +import { ReactNode } from "react"; + +type Props = { + title?: string; + body?: ReactNode; +}; + +export const AccessRestrictedBanner = ({ + title = "Access Restricted", + + body = ( + <> + Your current role doesn't provide access to this feature. +
Contact your administrator to request access. + + ) +}: Props) => { + return ( +
+
+
{title}
+
{body}
+
+
+ ); +}; diff --git a/frontend/src/components/v2/AccessRestrictedBanner/index.ts b/frontend/src/components/v2/AccessRestrictedBanner/index.ts new file mode 100644 index 000000000..d60468572 --- /dev/null +++ b/frontend/src/components/v2/AccessRestrictedBanner/index.ts @@ -0,0 +1 @@ +export * from "./AccessRestrictedBanner"; diff --git a/frontend/src/components/v2/index.tsx b/frontend/src/components/v2/index.tsx index 1256cf005..8019c3589 100644 --- a/frontend/src/components/v2/index.tsx +++ b/frontend/src/components/v2/index.tsx @@ -1,4 +1,5 @@ /* eslint-disable react-refresh/only-export-components */ +export * from "./AccessRestrictedBanner"; export * from "./Accordion"; export * from "./Alert"; export * from "./Badge"; diff --git a/frontend/src/hoc/withPermission/withPermission.tsx b/frontend/src/hoc/withPermission/withPermission.tsx index ef814d958..529a74930 100644 --- a/frontend/src/hoc/withPermission/withPermission.tsx +++ b/frontend/src/hoc/withPermission/withPermission.tsx @@ -1,9 +1,8 @@ import { ComponentType } from "react"; import { Abilities, AbilityTuple, Generics, SubjectType } from "@casl/ability"; -import { faLock } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { twMerge } from "tailwind-merge"; +import { AccessRestrictedBanner } from "@app/components/v2"; import { TOrgPermission, useOrgPermission } from "@app/context"; type Props = (T extends AbilityTuple @@ -14,11 +13,11 @@ type Props = (T extends AbilityTuple : { action: string; subject: string; - }) & { className?: string; containerClassName?: string }; + }) & { containerClassName?: string }; export const withPermission = ( Component: ComponentType, - { action, subject, className, containerClassName }: Props["abilities"]> + { action, subject, containerClassName }: Props["abilities"]> ) => { const HOC = (hocProps: T) => { const { permission } = useOrgPermission(); @@ -33,22 +32,7 @@ export const withPermission = ( containerClassName )} > -
-
- -
-
-
Access Restricted
-
- Your role has limited permissions, please
contact your admin to gain access -
-
-
+ ); } diff --git a/frontend/src/hoc/withProjectPermission/withProjectPermission.tsx b/frontend/src/hoc/withProjectPermission/withProjectPermission.tsx index 564d44adc..7ba6efc57 100644 --- a/frontend/src/hoc/withProjectPermission/withProjectPermission.tsx +++ b/frontend/src/hoc/withProjectPermission/withProjectPermission.tsx @@ -1,14 +1,12 @@ import { ComponentType } from "react"; import { AbilityTuple } from "@casl/ability"; -import { faLock } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { twMerge } from "tailwind-merge"; +import { AccessRestrictedBanner } from "@app/components/v2"; import { useProjectPermission } from "@app/context"; import { ProjectPermissionSet } from "@app/context/ProjectPermissionContext"; type Props = { - className?: string; containerClassName?: string; action: T[0]; subject: T[1]; @@ -16,7 +14,7 @@ type Props = { export const withProjectPermission = ( Component: ComponentType, "action" | "subject"> & T>, - { action, subject, className, containerClassName }: Props + { action, subject, containerClassName }: Props ) => { const HOC = (hocProps: Omit, "action" | "subject"> & T) => { const { permission } = useProjectPermission(); @@ -31,23 +29,7 @@ export const withProjectPermission = ( containerClassName )} > -
-
- -
-
-
Permission Denied
-
- You do not have permission to this page.
Kindly contact your organization - administrator -
-
-
+ ); } diff --git a/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx b/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx index c11ff454d..3c2c0c859 100644 --- a/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx +++ b/frontend/src/pages/secret-manager/SecretDashboardPage/SecretDashboardPage.tsx @@ -948,12 +948,12 @@ const Page = () => { /> )} {noAccessSecretCount > 0 && } - {!canReadSecret && - !canReadDynamicSecret && - !canReadSecretImports && - folders?.length === 0 && } + {!canReadSecret && + !canReadDynamicSecret && + !canReadSecretImports && + folders?.length === 0 && } {!isDetailsLoading && (totalCount > 0 || pendingChanges.secrets.length > 0 || diff --git a/frontend/src/pages/secret-scanning/SettingsPage/components/ProjectScanningConfigTab/ProjectScanningConfigTab.tsx b/frontend/src/pages/secret-scanning/SettingsPage/components/ProjectScanningConfigTab/ProjectScanningConfigTab.tsx index 73fd26c8b..e8d3206d8 100644 --- a/frontend/src/pages/secret-scanning/SettingsPage/components/ProjectScanningConfigTab/ProjectScanningConfigTab.tsx +++ b/frontend/src/pages/secret-scanning/SettingsPage/components/ProjectScanningConfigTab/ProjectScanningConfigTab.tsx @@ -1,6 +1,6 @@ import { faBan } from "@fortawesome/free-solid-svg-icons"; -import { ContentLoader, EmptyState } from "@app/components/v2"; +import { AccessRestrictedBanner, ContentLoader, EmptyState } from "@app/components/v2"; import { useSubscription, useWorkspace } from "@app/context"; import { useGetSecretScanningConfig } from "@app/hooks/api/secretScanningV2"; @@ -16,16 +16,14 @@ export const ProjectScanningConfigTab = () => { if (!subscription.secretScanning) { return ( -
- +
+ Your current plan doesn't support Secret Scanning.
Please contact Infisical Support or reach out through our Slack channel for assistance. - + } />