mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-08-02 09:02:15 +03:00
Tweaks (#22656)
* tweak language * show validation errors in json response * fix export hwaccel args field in UI * increase annotation offset consts * fix save button race conditions, add reset spinner, and fix enrichments profile leak - Disable both Save and SaveAll buttons while either operation is in progress so users cannot trigger concurrent saves - Show activity indicator on Reset to Default/Global button during the API call - Enrichments panes (semantic search, genai, face recognition) now always show base config fields regardless of profile selection in the header dropdown * fix genai additional_concerns validation error with textarea array widget The additional_concerns field is list[str] in the backend but was using the textarea widget which produces a string value, causing validation errors. Created a TextareaArrayWidget that converts between array (one item per line) and textarea display, and switched additional_concerns to use it * populate and sort global audio filters for all audio labels * add column labels in profiles view * enforce a minimum value of 2 for min_initialized * reuse widget and refactor for multiline * fix * change record copy preset to transcode audio to aac
This commit is contained in:
@@ -542,6 +542,20 @@ export default function ProfilesView({
|
||||
<CollapsibleContent>
|
||||
{cameras.length > 0 ? (
|
||||
<div className="mx-4 mb-3 ml-11 border-l border-border/50 pl-4">
|
||||
<div className="flex items-baseline gap-3 border-b border-border/30 pb-1.5">
|
||||
<span className="min-w-[120px] shrink-0 text-xs font-semibold uppercase text-muted-foreground">
|
||||
{t("profiles.columnCamera", {
|
||||
ns: "views/settings",
|
||||
defaultValue: "Camera",
|
||||
})}
|
||||
</span>
|
||||
<span className="text-xs font-semibold uppercase text-muted-foreground">
|
||||
{t("profiles.columnOverrides", {
|
||||
ns: "views/settings",
|
||||
defaultValue: "Profile Overrides",
|
||||
})}
|
||||
</span>
|
||||
</div>
|
||||
{cameras.map((camera) => {
|
||||
const sections = cameraData[camera];
|
||||
return (
|
||||
|
||||
@@ -39,6 +39,10 @@ export type SettingsPageProps = {
|
||||
onDeleteProfileSection?: (profileName: string) => void;
|
||||
profilesUIEnabled?: boolean;
|
||||
setProfilesUIEnabled?: React.Dispatch<React.SetStateAction<boolean>>;
|
||||
/** Whether a SaveAll operation is in progress */
|
||||
isSavingAll?: boolean;
|
||||
/** Callback when a section's saving state changes */
|
||||
onSectionSavingChange?: (isSaving: boolean) => void;
|
||||
};
|
||||
|
||||
export type SectionStatus = {
|
||||
@@ -73,6 +77,8 @@ export function SingleSectionPage({
|
||||
onPendingDataChange,
|
||||
profileState,
|
||||
onDeleteProfileSection,
|
||||
isSavingAll,
|
||||
onSectionSavingChange,
|
||||
}: SingleSectionPageProps) {
|
||||
const sectionNamespace =
|
||||
level === "camera" ? "config/cameras" : "config/global";
|
||||
@@ -95,9 +101,10 @@ export function SingleSectionPage({
|
||||
? getLocaleDocUrl(resolvedSectionConfig.sectionDocs)
|
||||
: undefined;
|
||||
|
||||
const currentEditingProfile = selectedCamera
|
||||
? (profileState?.editingProfile[selectedCamera] ?? null)
|
||||
: null;
|
||||
const currentEditingProfile =
|
||||
level === "camera" && selectedCamera
|
||||
? (profileState?.editingProfile[selectedCamera] ?? null)
|
||||
: null;
|
||||
|
||||
const profileColor = useMemo(
|
||||
() =>
|
||||
@@ -273,6 +280,8 @@ export function SingleSectionPage({
|
||||
onDeleteProfileSection={
|
||||
currentEditingProfile ? handleDeleteProfileSection : undefined
|
||||
}
|
||||
isSavingAll={isSavingAll}
|
||||
onSavingChange={onSectionSavingChange}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user