Miscellaneous fixes (#24528)

* revert disable save buttons when there are no changes in config editor

* pass migrated config to each step in the config migration chain

* use 150 as the default max when typing a min speed in the search filter

* fix preview export outpoint to be relative to the start of the preview file

* don't crash on invalid trusted proxy entries or non-ip forwarded hops

* translate the camera count badge in the roles table

* run every batch through the lpr recognition model

* log rejected motion and notification mqtt payloads

* log invalid addresses in x-forwarded-for

* add test

* remove unused autotracked_object_region

* remove unreachable autotracker setup call in camera maintenance

* apply onvif retry limit when initialization fails

* fix reindex progress overcounting when there are fewer events than a batch

* match the register device button aria label to its text

* reset the add profile form on cancel

* ignore case when filtering search suggestions

* tweak comment
This commit is contained in:
Josh Hawkins
2026-10-01 07:19:31 -06:00
committed by GitHub
parent 16eac66463
commit 24a236a152
16 changed files with 83 additions and 35 deletions
+3 -1
View File
@@ -1162,7 +1162,9 @@
"actions": "Actions",
"noRoles": "No custom roles found.",
"editCameras": "Edit Cameras",
"deleteRole": "Delete Role"
"deleteRole": "Delete Role",
"cameraCount_one": "{{count}} camera",
"cameraCount_other": "{{count}} cameras"
},
"toast": {
"success": {
@@ -627,7 +627,11 @@ export default function NotificationsSettingsExtras({
<SettingsGroupCard title={t("notification.deviceSpecific")}>
<div className={cn("space-y-2", isAdmin && "md:max-w-[50%]")}>
<Button
aria-label={t("notification.registerDevice")}
aria-label={
registration != null
? t("notification.unregisterDevice")
: t("notification.registerDevice")
}
className="w-full md:w-auto"
disabled={!shouldFetchPubKey || publicKey == undefined}
onClick={() => {
+1 -1
View File
@@ -218,7 +218,7 @@ export default function InputWithTags({
}
return current_suggestions.filter((suggestion) =>
suggestion.toLowerCase().startsWith(currentWord),
suggestion.toLowerCase().startsWith(currentWord.toLowerCase()),
);
},
[inputValue, suggestions, currentFilterType],
@@ -631,7 +631,7 @@ export function SpeedFilterContent({
const value = e.target.value;
if (value) {
setSpeedRange(parseInt(value), maxSpeed ?? 1.0);
setSpeedRange(parseInt(value), maxSpeed ?? 150);
}
}}
/>
-2
View File
@@ -287,7 +287,6 @@ function ConfigEditor() {
</Button>
<Button
size="sm"
disabled={!hasChanges}
className="flex items-center gap-2"
aria-label={t("saveAndRestart")}
onClick={handleSaveAndRestart}
@@ -300,7 +299,6 @@ function ConfigEditor() {
</Button>
<Button
size="sm"
disabled={!hasChanges}
className="flex items-center gap-2"
aria-label={t("saveOnly")}
onClick={() => onHandleSaveConfig("saveonly")}
@@ -657,7 +657,9 @@ export default function AuthenticationView({
</Badge>
) : roleData.cameras.length > 5 ? (
<Badge variant="outline" className="text-xs">
{roleData.cameras.length} cameras
{t("roles.table.cameraCount", {
count: roleData.cameras.length,
})}
</Badge>
) : (
<div className="flex flex-wrap gap-1">
+4 -1
View File
@@ -661,7 +661,10 @@ export default function ProfilesView({
<DialogFooter>
<Button
type="button"
onClick={() => setAddDialogOpen(false)}
onClick={() => {
setAddDialogOpen(false);
addForm.reset();
}}
disabled={addingProfile}
>
{t("button.cancel", { ns: "common" })}