* Catch error and show toast when failing to delete review items

* i18n keys

* add link to speed estimation docs in zone edit pane

* Implement reset of tracked object update for each camera

* Cleanup

* register mqtt callbacks for toggling alerts and detections

* clarify snapshots docs

* clarify semantic search reindexing

* add ukrainian

* adjust date granularity for last recording time

The api endpoint only returns granularity down to the day

* Add amd hardware

* fix crash in face library on initial start after enabling

* Fix recordings view for mobile landscape

The events view incorrectly was displaying two columns on landscape view and it only took up 20% of the screen width. Additionally, in landscape view the timeline was too wide (especially on iPads of various screen sizes) and would overlap the main video

* face rec overfitting instructions

* Clarify

* face docs

* clarify

* clarify

---------

Co-authored-by: Nicolas Mowen <nickmowen213@gmail.com>
This commit is contained in:
Josh Hawkins
2025-05-11 12:03:53 -06:00
committed by GitHub
co-authored by Nicolas Mowen
parent 8094dd4075
commit f39ddbc00d
21 changed files with 130 additions and 25 deletions
@@ -17,6 +17,7 @@ import {
} from "../ui/alert-dialog";
import useKeyboardListener from "@/hooks/use-keyboard-listener";
import { Trans, useTranslation } from "react-i18next";
import { toast } from "sonner";
type ReviewActionGroupProps = {
selectedReviews: string[];
@@ -41,11 +42,33 @@ export default function ReviewActionGroup({
pullLatestData();
}, [selectedReviews, setSelectedReviews, pullLatestData]);
const onDelete = useCallback(async () => {
await axios.post(`reviews/delete`, { ids: selectedReviews });
setSelectedReviews([]);
pullLatestData();
}, [selectedReviews, setSelectedReviews, pullLatestData]);
const onDelete = useCallback(() => {
axios
.post(`reviews/delete`, { ids: selectedReviews })
.then((resp) => {
if (resp.status === 200) {
toast.success(t("recording.confirmDelete.toast.success"), {
position: "top-center",
});
setSelectedReviews([]);
pullLatestData();
}
})
.catch((error) => {
const errorMessage =
error.response?.data?.message ||
error.response?.data?.detail ||
"Unknown error";
toast.error(
t("recording.confirmDelete.toast.error", {
error: errorMessage,
}),
{
position: "top-center",
},
);
});
}, [selectedReviews, setSelectedReviews, pullLatestData, t]);
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [bypassDialog, setBypassDialog] = useState(false);
@@ -30,6 +30,8 @@ import { flattenPoints, interpolatePoints } from "@/utils/canvasUtil";
import ActivityIndicator from "../indicators/activity-indicator";
import { getAttributeLabels } from "@/utils/iconUtil";
import { Trans, useTranslation } from "react-i18next";
import { Link } from "react-router-dom";
import { LuExternalLink } from "react-icons/lu";
type ZoneEditPaneProps = {
polygons?: Polygon[];
@@ -669,6 +671,17 @@ export default function ZoneEditPane({
</div>
<FormDescription>
{t("masksAndZones.zones.speedEstimation.desc")}
<div className="mt-2 flex items-center text-primary">
<Link
to="https://docs.frigate.video/configuration/zones#speed-estimation"
target="_blank"
rel="noopener noreferrer"
className="inline"
>
{t("masksAndZones.zones.speedEstimation.docs")}
<LuExternalLink className="ml-2 inline-flex size-3" />
</Link>
</div>
</FormDescription>
<FormMessage />
</FormItem>