Merge pull request #4377 from Infisical/tag-filter-ui-improvements

improvement(frontend): adjust environment view dropdown alignment, add applied tags display and info tooltip to clarify behavior
This commit is contained in:
Scott Wilson
2025-08-13 20:04:43 -07:00
committed by GitHub
@@ -14,6 +14,7 @@ import {
faFingerprint, faFingerprint,
faFolder, faFolder,
faFolderPlus, faFolderPlus,
faInfoCircle,
faKey, faKey,
faLock, faLock,
faPaste, faPaste,
@@ -32,6 +33,7 @@ import { createNotification } from "@app/components/notifications";
import { ProjectPermissionCan } from "@app/components/permissions"; import { ProjectPermissionCan } from "@app/components/permissions";
import { CreateSecretRotationV2Modal } from "@app/components/secret-rotations-v2"; import { CreateSecretRotationV2Modal } from "@app/components/secret-rotations-v2";
import { import {
Badge,
Button, Button,
DeleteActionModal, DeleteActionModal,
DropdownMenu, DropdownMenu,
@@ -70,10 +72,7 @@ import {
useMoveSecrets, useMoveSecrets,
useUpdateSecretBatch useUpdateSecretBatch
} from "@app/hooks/api"; } from "@app/hooks/api";
import { import { dashboardKeys, fetchDashboardProjectSecretsByKeys } from "@app/hooks/api/dashboard/queries";
dashboardKeys,
fetchDashboardProjectSecretsByKeys
} from "@app/hooks/api/dashboard/queries";
import { UsedBySecretSyncs } from "@app/hooks/api/dashboard/types"; import { UsedBySecretSyncs } from "@app/hooks/api/dashboard/types";
import { secretApprovalRequestKeys } from "@app/hooks/api/secretApprovalRequest/queries"; import { secretApprovalRequestKeys } from "@app/hooks/api/secretApprovalRequest/queries";
import { PendingAction } from "@app/hooks/api/secretFolders/types"; import { PendingAction } from "@app/hooks/api/secretFolders/types";
@@ -665,6 +664,8 @@ export const ActionBar = ({
const isTableFiltered = const isTableFiltered =
Object.values(filter.tags).some(Boolean) || Object.values(filter.include).some(Boolean); Object.values(filter.tags).some(Boolean) || Object.values(filter.include).some(Boolean);
const filteredTags = Object.values(filter?.tags ?? {}).filter(Boolean).length;
return ( return (
<> <>
<div className="mt-4 flex items-center space-x-2"> <div className="mt-4 flex items-center space-x-2">
@@ -697,7 +698,7 @@ export const ActionBar = ({
Filters Filters
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent align="end" className="p-0"> <DropdownMenuContent align="end" sideOffset={2} className="p-0">
<DropdownMenuGroup>Filter By</DropdownMenuGroup> <DropdownMenuGroup>Filter By</DropdownMenuGroup>
<DropdownMenuItem <DropdownMenuItem
onClick={(e) => { onClick={(e) => {
@@ -776,11 +777,19 @@ export const ActionBar = ({
iconPos="right" iconPos="right"
icon={<FontAwesomeIcon icon={faChevronRight} size="sm" />} icon={<FontAwesomeIcon icon={faChevronRight} size="sm" />}
> >
Tags <div className="flex w-full justify-between">
<span>Tags</span>
{Boolean(filteredTags) && <Badge>{filteredTags} Applied</Badge>}
</div>
</DropdownSubMenuTrigger> </DropdownSubMenuTrigger>
<DropdownSubMenuContent className="thin-scrollbar max-h-[20rem] overflow-y-auto rounded-l-none"> <DropdownSubMenuContent className="thin-scrollbar max-h-[20rem] overflow-y-auto rounded-l-none">
<DropdownMenuLabel className="sticky top-0 bg-mineshaft-900"> <DropdownMenuLabel className="sticky top-0 bg-mineshaft-900">
Apply Tags to Filter Secrets <div className="flex w-full items-center justify-between">
<span>Filter by Secret Tags</span>
<Tooltip content="Matches secrets with one or more of the applied tags">
<FontAwesomeIcon icon={faInfoCircle} />
</Tooltip>
</div>
</DropdownMenuLabel> </DropdownMenuLabel>
{tags.map(({ id, slug, color }) => ( {tags.map(({ id, slug, color }) => (
<DropdownMenuItem <DropdownMenuItem