import type RealmRepresentation from "@keycloak/keycloak-admin-client/lib/defs/realmRepresentation";
import type { UserProfileConfig } from "@keycloak/keycloak-admin-client/lib/defs/userProfileMetadata";
import {
Button,
ButtonVariant,
Dropdown,
DropdownItem,
DropdownList,
InputGroup,
InputGroupItem,
MenuToggle,
SearchInput,
ToolbarItem,
} from "@patternfly/react-core";
import { ArrowRightIcon, EllipsisVIcon } from "@patternfly/react-icons";
import { ReactNode, useState } from "react";
import { useTranslation } from "react-i18next";
import { useAccess } from "../../context/access/Access";
import { SearchDropdown, SearchType } from "../../user/details/SearchFilter";
import DropdownPanel from "../dropdown-panel/DropdownPanel";
import { UserFilter } from "./UserDataTable";
import { UserDataTableAttributeSearchForm } from "./UserDataTableAttributeSearchForm";
type UserDataTableToolbarItemsProps = {
searchDropdownOpen: boolean;
setSearchDropdownOpen: (open: boolean) => void;
realm: RealmRepresentation;
hasSelectedRows: boolean;
toggleDeleteDialog: () => void;
toggleUnlockUsersDialog: () => void;
goToCreate: () => void;
searchType: SearchType;
setSearchType: (searchType: SearchType) => void;
searchUser: string;
setSearchUser: (searchUser: string) => void;
activeFilters: UserFilter;
setActiveFilters: (activeFilters: UserFilter) => void;
refresh: () => void;
profile: UserProfileConfig;
clearAllFilters: () => void;
createAttributeSearchChips: () => ReactNode;
searchUserWithAttributes: () => void;
};
export function UserDataTableToolbarItems({
searchDropdownOpen,
setSearchDropdownOpen,
realm,
hasSelectedRows,
toggleDeleteDialog,
toggleUnlockUsersDialog,
goToCreate,
searchType,
setSearchType,
searchUser,
setSearchUser,
activeFilters,
setActiveFilters,
refresh,
profile,
clearAllFilters,
createAttributeSearchChips,
searchUserWithAttributes,
}: UserDataTableToolbarItemsProps) {
const { t } = useTranslation();
const [kebabOpen, setKebabOpen] = useState(false);
const { hasAccess } = useAccess();
// Only needs query-users access to attempt add/delete of users.
// This is because the user could have fine-grained access to users
// of a group. There is no way to know this without searching the
// permissions of every group.
const isManager = hasAccess("query-users");
const searchItem = () => {
return (
{
clearAllFilters();
setSearchType(searchType);
}}
/>
{searchType === "default" && defaultSearchInput()}
{searchType === "attribute" && attributeSearchInput()}
);
};
const defaultSearchInput = () => {
return (
{
setSearchUser(attribute["haswords"]);
refresh();
}}
onKeyDown={(e) => {
if (e.key === "Enter") {
const target = e.target as HTMLInputElement;
setSearchUser(target.value);
refresh();
}
}}
onClear={() => {
setSearchUser("");
refresh();
}}
/>
);
};
const attributeSearchInput = () => {
return (
<>
{
searchUserWithAttributes();
setSearchDropdownOpen(false);
}}
/>
}
variant="control"
onClick={() => {
searchUserWithAttributes();
setSearchDropdownOpen(false);
}}
aria-label={t("searchAttributes")}
/>
>
);
};
const bruteForceProtectionToolbarItem = !realm.bruteForceProtected ? (
) : (
setKebabOpen(isOpen)}
toggle={(ref) => (
setKebabOpen(!kebabOpen)}
>
)}
isOpen={kebabOpen}
shouldFocusToggleOnSelect
>
{
toggleDeleteDialog();
setKebabOpen(false);
}}
>
{t("deleteUser")}
{
toggleUnlockUsersDialog();
setKebabOpen(false);
}}
>
{t("unlockAllUsers")}
);
const actionItems = (
<>
{bruteForceProtectionToolbarItem}
>
);
return (
<>
{searchItem()}
{isManager ? actionItems : null}
>
);
}