Machine Identities
@@ -37,9 +30,6 @@ export const MembersPage = withPermission(
-
-
-
diff --git a/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsSection.tsx b/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsSection.tsx
index 320c115fd..2df78fe5f 100644
--- a/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsSection.tsx
+++ b/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsSection.tsx
@@ -3,16 +3,8 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { createNotification } from "@app/components/notifications";
import { OrgPermissionCan } from "@app/components/permissions";
-import {
- Button,
- DeleteActionModal,
- UpgradePlanModal
-} from "@app/components/v2";
-import {
- OrgPermissionActions,
- OrgPermissionSubjects,
- useSubscription
-} from "@app/context";
+import { Button, DeleteActionModal, UpgradePlanModal } from "@app/components/v2";
+import { OrgPermissionActions, OrgPermissionSubjects, useSubscription } from "@app/context";
import { useDeleteGroup } from "@app/hooks/api";
import { usePopUp } from "@app/hooks/usePopUp";
@@ -21,100 +13,88 @@ import { OrgGroupModal } from "./OrgGroupModal";
import { OrgGroupsTable } from "./OrgGroupsTable";
export const OrgGroupsSection = () => {
- const { subscription } = useSubscription();
- const { mutateAsync: deleteMutateAsync } = useDeleteGroup();
-
- const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([
- "group",
- "groupMembers",
- "deleteGroup",
- "upgradePlan"
- ] as const);
-
- const handleAddGroupModal = () => {
- if (!subscription?.groups) {
- handlePopUpOpen("upgradePlan", {
- description: "You can manage users more efficiently with groups if you upgrade your Infisical plan."
- });
- } else {
- handlePopUpOpen("group");
- }
+ const { subscription } = useSubscription();
+ const { mutateAsync: deleteMutateAsync } = useDeleteGroup();
+
+ const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([
+ "group",
+ "groupMembers",
+ "deleteGroup",
+ "upgradePlan"
+ ] as const);
+
+ const handleAddGroupModal = () => {
+ if (!subscription?.groups) {
+ handlePopUpOpen("upgradePlan", {
+ description:
+ "You can manage users more efficiently with groups if you upgrade your Infisical plan."
+ });
+ } else {
+ handlePopUpOpen("group");
}
-
- const onDeleteGroupSubmit = async ({
- name,
+ };
+
+ const onDeleteGroupSubmit = async ({ name, slug }: { name: string; slug: string }) => {
+ try {
+ await deleteMutateAsync({
slug
- }: {
- name: string;
- slug: string;
- }) => {
- try {
- await deleteMutateAsync({
- slug
- });
- createNotification({
- text: `Successfully deleted the group named ${name}`,
- type: "success"
- });
- } catch (err) {
- console.error(err);
- createNotification({
- text: `Failed to delete the group named ${name}`,
- type: "error"
- });
- }
-
- handlePopUpClose("deleteGroup");
+ });
+ createNotification({
+ text: `Successfully deleted the group named ${name}`,
+ type: "success"
+ });
+ } catch (err) {
+ console.error(err);
+ createNotification({
+ text: `Failed to delete the group named ${name}`,
+ type: "error"
+ });
}
-
- return (
-
-
-
Groups
-
- {(isAllowed) => (
- }
- onClick={() => handleAddGroupModal()}
- isDisabled={!isAllowed}
- >
- Create Group
-
- )}
-
-
-
-
-
-
handlePopUpToggle("deleteGroup", isOpen)}
- deleteKey="confirm"
- onDeleteApproved={() =>
- onDeleteGroupSubmit(
- (popUp?.deleteGroup?.data as { name: string; slug: string })
- )
- }
- />
- handlePopUpToggle("upgradePlan", isOpen)}
- text={(popUp.upgradePlan?.data as { description: string })?.description}
- />
-
- );
-}
\ No newline at end of file
+
+ handlePopUpClose("deleteGroup");
+ };
+
+ return (
+
+
+
User Groups
+
+ {(isAllowed) => (
+ }
+ onClick={() => handleAddGroupModal()}
+ isDisabled={!isAllowed}
+ >
+ Create Group
+
+ )}
+
+
+
+
+
+
handlePopUpToggle("deleteGroup", isOpen)}
+ deleteKey="confirm"
+ onDeleteApproved={() =>
+ onDeleteGroupSubmit(popUp?.deleteGroup?.data as { name: string; slug: string })
+ }
+ />
+ handlePopUpToggle("upgradePlan", isOpen)}
+ text={(popUp.upgradePlan?.data as { description: string })?.description}
+ />
+
+ );
+};
diff --git a/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsTable.tsx
index 79e08bc14..336022189 100644
--- a/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsTable.tsx
+++ b/frontend/src/views/Org/MembersPage/components/OrgGroupsTab/components/OrgGroupsSection/OrgGroupsTable.tsx
@@ -1,12 +1,16 @@
import { useState } from "react";
-import { faMagnifyingGlass, faPencil, faUsers, faXmark } from "@fortawesome/free-solid-svg-icons";
+import { faEllipsis,faMagnifyingGlass, faUsers } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { twMerge } from "tailwind-merge";
import { createNotification } from "@app/components/notifications";
import { OrgPermissionCan } from "@app/components/permissions";
import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
EmptyState,
- IconButton,
Input,
Select,
SelectItem,
@@ -17,218 +21,200 @@ import {
Td,
Th,
THead,
- Tooltip,
Tr
} from "@app/components/v2";
-import {
- OrgPermissionActions,
- OrgPermissionSubjects,
- useOrganization} from "@app/context";
-import {
- useGetOrganizationGroups,
- useGetOrgRoles,
- useUpdateGroup
-} from "@app/hooks/api";
+import { OrgPermissionActions, OrgPermissionSubjects, useOrganization } from "@app/context";
+import { useGetOrganizationGroups, useGetOrgRoles, useUpdateGroup } from "@app/hooks/api";
import { UsePopUpState } from "@app/hooks/usePopUp";
type Props = {
- handlePopUpOpen: (
- popUpName: keyof UsePopUpState<
- ["group", "deleteGroup", "groupMembers"]
- >,
- data?: {
- groupId?: string;
- name?: string;
- slug?: string;
- role?: string;
- customRole?: {
- name: string;
- slug: string;
- }
- }
- ) => void;
- };
+ handlePopUpOpen: (
+ popUpName: keyof UsePopUpState<["group", "deleteGroup", "groupMembers"]>,
+ data?: {
+ groupId?: string;
+ name?: string;
+ slug?: string;
+ role?: string;
+ customRole?: {
+ name: string;
+ slug: string;
+ };
+ }
+ ) => void;
+};
-export const OrgGroupsTable = ({
- handlePopUpOpen
-}: Props) => {
- const [searchGroupsFilter, setSearchGroupsFilter] = useState("");
- const { currentOrg } = useOrganization();
- const orgId = currentOrg?.id || "";
- const { isLoading, data: groups } = useGetOrganizationGroups(orgId);
- const { mutateAsync: updateMutateAsync } = useUpdateGroup();
-
- const { data: roles } = useGetOrgRoles(orgId);
-
- const handleChangeRole = async ({
+export const OrgGroupsTable = ({ handlePopUpOpen }: Props) => {
+ const [searchGroupsFilter, setSearchGroupsFilter] = useState("");
+ const { currentOrg } = useOrganization();
+ const orgId = currentOrg?.id || "";
+ const { isLoading, data: groups } = useGetOrganizationGroups(orgId);
+ const { mutateAsync: updateMutateAsync } = useUpdateGroup();
+
+ const { data: roles } = useGetOrgRoles(orgId);
+
+ const handleChangeRole = async ({ currentSlug, role }: { currentSlug: string; role: string }) => {
+ try {
+ await updateMutateAsync({
currentSlug,
role
- }: {
- currentSlug: string;
- role: string;
- }) => {
- try {
- await updateMutateAsync({
- currentSlug,
- role
- });
-
- createNotification({
- text: "Successfully updated group role",
- type: "success"
- });
- } catch (err) {
- console.error(err);
- createNotification({
- text: "Failed to update group role",
- type: "error"
- });
- }
+ });
+
+ createNotification({
+ text: "Successfully updated group role",
+ type: "success"
+ });
+ } catch (err) {
+ console.error(err);
+ createNotification({
+ text: "Failed to update group role",
+ type: "error"
+ });
}
-
- return (
-
-
setSearchGroupsFilter(e.target.value)}
- leftIcon={
}
- placeholder="Search groups..."
- />
-
-
-
-
- | Name |
- Slug |
- Role |
- |
-
-
-
- {isLoading && }
- {!isLoading && groups?.map(({ id, name, slug, role, customRole }) => {
- return (
-
- | {name} |
- {slug} |
-
-
- {(isAllowed) => {
- return (
-
- );
- }}
-
- |
-
-
-
- {(isAllowed) => (
-
- {
- handlePopUpOpen("groupMembers", {
- slug
- });
- }}
- size="lg"
- colorSchema="primary"
- variant="plain"
- ariaLabel="update"
- isDisabled={!isAllowed}
- >
-
-
-
- )}
-
-
- {(isAllowed) => (
-
- {
- handlePopUpOpen("group", {
- groupId: id,
- name,
- slug,
- role,
- customRole
- });
- }}
- size="lg"
- colorSchema="primary"
- variant="plain"
- ariaLabel="update"
- className="ml-4"
- isDisabled={!isAllowed}
- >
-
-
-
- )}
-
-
- {(isAllowed) => (
-
- {
- handlePopUpOpen("deleteGroup", {
- slug,
- name
- });
- }}
- size="lg"
- colorSchema="danger"
- variant="plain"
- ariaLabel="update"
- className="ml-4"
- isDisabled={!isAllowed}
- >
-
-
-
- )}
-
-
- |
-
- );
- })}
-
-
- {groups?.length === 0 && (
-
- )}
-
-
- );
-}
+ };
+
+ return (
+
+
setSearchGroupsFilter(e.target.value)}
+ leftIcon={
}
+ placeholder="Search groups..."
+ />
+
+
+
+
+ | Name |
+ Slug |
+ Role |
+ |
+
+
+
+ {isLoading && }
+ {!isLoading &&
+ groups?.map(({ id, name, slug, role, customRole }) => {
+ return (
+
+ | {name} |
+ {slug} |
+
+
+ {(isAllowed) => {
+ return (
+
+ );
+ }}
+
+ |
+
+
+
+
+
+
+
+
+
+ {(isAllowed) => (
+ {
+ e.stopPropagation();
+ handlePopUpOpen("groupMembers", {
+ slug
+ });
+ }}
+ disabled={!isAllowed}
+ >
+ Manage Users
+
+ )}
+
+
+ {(isAllowed) => (
+ {
+ e.stopPropagation();
+ handlePopUpOpen("group", {
+ groupId: id,
+ name,
+ slug,
+ role,
+ customRole
+ });
+ }}
+ disabled={!isAllowed}
+ >
+ Edit Group
+
+ )}
+
+
+ {(isAllowed) => (
+ {
+ e.stopPropagation();
+ handlePopUpOpen("deleteGroup", {
+ slug,
+ name
+ });
+ }}
+ disabled={!isAllowed}
+ >
+ Delete Group
+
+ )}
+
+
+
+ |
+
+ );
+ })}
+
+
+ {groups?.length === 0 && }
+
+
+ );
+};
diff --git a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/OrgMembersTab.tsx b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/OrgMembersTab.tsx
index 5d50431b7..36230c971 100644
--- a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/OrgMembersTab.tsx
+++ b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/OrgMembersTab.tsx
@@ -1,17 +1,19 @@
import { motion } from "framer-motion";
+import { OrgGroupsSection } from "../OrgGroupsTab/components";
import { OrgMembersSection } from "./components";
export const OrgMembersTab = () => {
return (
-
+
+
);
-}
+};
diff --git a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx
index 8943f2940..f9dc72f4e 100644
--- a/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx
+++ b/frontend/src/views/Org/MembersPage/components/OrgMembersTab/components/OrgMembersSection/OrgMembersSection.tsx
@@ -90,7 +90,7 @@ export const OrgMembersSection = () => {
return (
-
Members
+
Users
{(isAllowed) => (