mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-06-23 12:51:54 +03:00
Some checks are pending
CI / AMD64 Build (push) Waiting to run
CI / ARM Build (push) Waiting to run
CI / Jetson Jetpack 6 (push) Waiting to run
CI / AMD64 Extra Build (push) Blocked by required conditions
CI / ARM Extra Build (push) Blocked by required conditions
CI / Synaptics Build (push) Blocked by required conditions
CI / Assemble and push default build (push) Blocked by required conditions
* backend * frontend + i18n * tests + api spec * tweak backend to use Job infrastructure for exports * frontend tweaks and Job infrastructure * tests * tweaks - add ability to remove from case - change location of counts in case card * add stale export reaper on startup * fix toaster close button color * improve add dialog * formatting * hide max_concurrent from camera config export settings * remove border * refactor batch endpoint for multiple review items * frontend * tests and fastapi spec * fix deletion of in-progress exports in a case * tweaks - hide cases when filtering cameras that have no exports from those cameras - remove description from case card - use textarea instead of input for case description in add new case dialog * add auth exceptions for exports * add e2e test for deleting cases with exports * refactor delete and case endpoints allow bulk deleting and reassigning * frontend - bulk selection like Review - gate admin-only actions - consolidate dialogs - spacing/padding tweaks * i18n and tests * update openapi spec * tweaks - add None to case selection list - allow new case creation from single cam export dialog * fix codeql * fix i18n * remove unused * fix frontend tests
76 lines
2.1 KiB
TypeScript
76 lines
2.1 KiB
TypeScript
import { LuVideo, LuX } from "react-icons/lu";
|
|
import { Button } from "../ui/button";
|
|
import { FaCompactDisc } from "react-icons/fa";
|
|
import { cn } from "@/lib/utils";
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
type SaveExportOverlayProps = {
|
|
className: string;
|
|
show: boolean;
|
|
hidePreview?: boolean;
|
|
saveLabel?: string;
|
|
isSaving?: boolean;
|
|
onPreview: () => void;
|
|
onSave: () => void;
|
|
onCancel: () => void;
|
|
};
|
|
export default function SaveExportOverlay({
|
|
className,
|
|
show,
|
|
hidePreview = false,
|
|
saveLabel,
|
|
isSaving = false,
|
|
onPreview,
|
|
onSave,
|
|
onCancel,
|
|
}: SaveExportOverlayProps) {
|
|
const { t } = useTranslation("components/dialog");
|
|
return (
|
|
<div className={className}>
|
|
<div
|
|
className={cn(
|
|
"pointer-events-auto flex items-center justify-center gap-2 rounded-lg px-2",
|
|
show ? "duration-500 animate-in slide-in-from-top" : "invisible",
|
|
"mx-auto mt-5 text-center",
|
|
)}
|
|
>
|
|
<Button
|
|
className="flex items-center gap-1 text-primary"
|
|
aria-label={t("button.cancel", { ns: "common" })}
|
|
size="sm"
|
|
disabled={isSaving}
|
|
onClick={onCancel}
|
|
>
|
|
<LuX />
|
|
{t("button.cancel", { ns: "common" })}
|
|
</Button>
|
|
{!hidePreview && (
|
|
<Button
|
|
className="flex items-center gap-1"
|
|
aria-label={t("export.fromTimeline.previewExport")}
|
|
size="sm"
|
|
disabled={isSaving}
|
|
onClick={onPreview}
|
|
>
|
|
<LuVideo />
|
|
{t("export.fromTimeline.previewExport")}
|
|
</Button>
|
|
)}
|
|
<Button
|
|
className="flex items-center gap-1"
|
|
aria-label={saveLabel || t("export.fromTimeline.saveExport")}
|
|
variant="select"
|
|
size="sm"
|
|
disabled={isSaving}
|
|
onClick={onSave}
|
|
>
|
|
<FaCompactDisc />
|
|
{isSaving
|
|
? t("export.fromTimeline.queueingExport")
|
|
: saveLabel || t("export.fromTimeline.saveExport")}
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|