Merge detector and model in settings UI (#23216)

* add embedded mode to BaseSection so parents can host the save action

* add optional action slot to current Frigate+ model summary

* add w-full to action slot flex wrapper for explicit width contract

* i18n

* merged detectors and model settings view

* fix document title

* Embed detector form in merged settings view

* add detection model card with tabs and custom model embed

* add Frigate+ model selector with filter popover to merged page

* Add mismatch banner and gate save on detector and model compatibility

* Wire atomic save, restart toast, and undo on detectors and model page

* Clear child pending data on undo

* route merged detectors and model view in settings

* trim Frigate+ page to account-only and remove old detection model view

* basic e2e

* Fix unsaved-changes guard, custom path leak, and post-failure cache resync

* Rename to Detectors and model, float Modified badge, use ConfigMessageBanner for mismatch

* Hide Plus/Custom tabs when Frigate+ is not enabled

* Detect active Plus model via model.plus.id instead of path prefix

* Sync state back to snapshot when child form un-modifies and remount on undo

* Always require restart on save since model changes also need one

* Wrap Frigate+ model selector in SplitCardRow with label and description

* rename tab

* update docs

* sync top-level model with default detector's resolved model

when the user doesn't define a top-level `model:` block, `FrigateConfig.model` stayed at pydantic field defaults (320×320, /labelmap.txt) while the per-detector model picked up `DEFAULT_MODEL` for openvino on cpu (300×300, coco_91cl_bkgr.txt introduced in #23127), causing `RemoteObjectDetector` to fail with "buffer is too small for requested array" because the SHM was sized from the per-detector model but mapped using the top-level one. After the detector loop, copy the first detector's resolved model up to `self.model` so both sides agree on dimensions and labelmap

* revert to cpu detector by default

use openvino cpu for new configs only

* add defaults
This commit is contained in:
Josh Hawkins
2026-05-17 11:54:21 -06:00
committed by GitHub
parent b712e1fbd9
commit 7413ce08d4
18 changed files with 1107 additions and 719 deletions
@@ -1,3 +1,4 @@
import { ReactNode } from "react";
import {
SettingsGroupCard,
SplitCardRow,
@@ -7,15 +8,26 @@ import { useTranslation } from "react-i18next";
type FrigatePlusCurrentModelSummaryProps = {
plusModel: FrigateConfig["model"]["plus"];
action?: ReactNode;
};
export default function FrigatePlusCurrentModelSummary({
plusModel,
action,
}: FrigatePlusCurrentModelSummaryProps) {
const { t } = useTranslation("views/settings");
const title = action ? (
<div className="flex w-full items-center justify-between gap-3">
<span>{t("frigatePlus.cardTitles.currentModel")}</span>
{action}
</div>
) : (
t("frigatePlus.cardTitles.currentModel")
);
return (
<SettingsGroupCard title={t("frigatePlus.cardTitles.currentModel")}>
<SettingsGroupCard title={title}>
{!plusModel && (
<p className="text-muted-foreground">
{t("frigatePlus.modelInfo.noModelLoaded")}