conditionally display actions for admin role only

This commit is contained in:
Josh Hawkins 2025-12-09 14:37:38 -06:00
parent 9cdc10008d
commit 8d5349ca85
4 changed files with 72 additions and 55 deletions

View File

@ -19,6 +19,7 @@ import {
import useKeyboardListener from "@/hooks/use-keyboard-listener";
import { Trans, useTranslation } from "react-i18next";
import { toast } from "sonner";
import { useIsAdmin } from "@/hooks/use-is-admin";
type ReviewActionGroupProps = {
selectedReviews: ReviewSegment[];
@ -33,6 +34,7 @@ export default function ReviewActionGroup({
pullLatestData,
}: ReviewActionGroupProps) {
const { t } = useTranslation(["components/dialog"]);
const isAdmin = useIsAdmin();
const onClearSelected = useCallback(() => {
setSelectedReviews([]);
}, [setSelectedReviews]);
@ -185,6 +187,7 @@ export default function ReviewActionGroup({
</div>
)}
</Button>
{isAdmin && (
<Button
className="flex items-center gap-2 p-2"
aria-label={t("button.delete", { ns: "common" })}
@ -200,6 +203,7 @@ export default function ReviewActionGroup({
</div>
)}
</Button>
)}
</div>
</div>
</>

View File

@ -16,6 +16,7 @@ import {
import useKeyboardListener from "@/hooks/use-keyboard-listener";
import { toast } from "sonner";
import { Trans, useTranslation } from "react-i18next";
import { useIsAdmin } from "@/hooks/use-is-admin";
type SearchActionGroupProps = {
selectedObjects: string[];
@ -28,6 +29,7 @@ export default function SearchActionGroup({
pullLatestData,
}: SearchActionGroupProps) {
const { t } = useTranslation(["components/filter"]);
const isAdmin = useIsAdmin();
const onClearSelected = useCallback(() => {
setSelectedObjects([]);
}, [setSelectedObjects]);
@ -123,6 +125,7 @@ export default function SearchActionGroup({
{t("button.unselect", { ns: "common" })}
</div>
</div>
{isAdmin && (
<div className="flex items-center gap-1 md:gap-2">
<Button
className="flex items-center gap-2 p-2"
@ -140,6 +143,7 @@ export default function SearchActionGroup({
)}
</Button>
</div>
)}
</div>
</>
);

View File

@ -31,6 +31,7 @@ import {
import useSWR from "swr";
import { Trans, useTranslation } from "react-i18next";
import BlurredIconButton from "../button/BlurredIconButton";
import { useIsAdmin } from "@/hooks/use-is-admin";
type SearchResultActionsProps = {
searchResult: SearchResult;
@ -52,6 +53,7 @@ export default function SearchResultActions({
children,
}: SearchResultActionsProps) {
const { t } = useTranslation(["views/explore"]);
const isAdmin = useIsAdmin();
const { data: config } = useSWR<FrigateConfig>("config");
@ -137,7 +139,8 @@ export default function SearchResultActions({
<span>{t("itemMenu.findSimilar.label")}</span>
</MenuItem>
)}
{config?.semantic_search?.enabled &&
{isAdmin &&
config?.semantic_search?.enabled &&
searchResult.data.type == "object" && (
<MenuItem
aria-label={t("itemMenu.addTrigger.aria")}
@ -146,12 +149,14 @@ export default function SearchResultActions({
<span>{t("itemMenu.addTrigger.label")}</span>
</MenuItem>
)}
{isAdmin && (
<MenuItem
aria-label={t("itemMenu.deleteTrackedObject.label")}
onClick={() => setDeleteDialogOpen(true)}
>
<span>{t("button.delete", { ns: "common" })}</span>
</MenuItem>
)}
</>
);

View File

@ -15,6 +15,7 @@ import {
import { HiDotsHorizontal } from "react-icons/hi";
import { SearchResult } from "@/types/search";
import { FrigateConfig } from "@/types/frigateConfig";
import { useIsAdmin } from "@/hooks/use-is-admin";
type Props = {
search: SearchResult | Event;
@ -35,6 +36,7 @@ export default function DetailActionsMenu({
const { t } = useTranslation(["views/explore", "views/faceLibrary"]);
const navigate = useNavigate();
const [isOpen, setIsOpen] = useState(false);
const isAdmin = useIsAdmin();
const clipTimeRange = useMemo(() => {
const startTime = (search.start_time ?? 0) - REVIEW_PADDING;
@ -130,7 +132,9 @@ export default function DetailActionsMenu({
</DropdownMenuItem>
)}
{config?.semantic_search.enabled && search.data.type == "object" && (
{isAdmin &&
config?.semantic_search.enabled &&
search.data.type == "object" && (
<DropdownMenuItem
onClick={() => {
setIsOpen(false);