diff --git a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx index 0c7e14dbb..c46c368ac 100644 --- a/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/users/groups/[id]/members/page.tsx @@ -42,9 +42,9 @@ export default async function GroupsDetailPage(props: GroupsDetailPageProps) { const isReserved = group.name === everyoneGroup; const searchTerm = searchParams.search?.trim().toLowerCase(); - const filteredMembers = searchTerm - ? group.members.filter((member) => member.name?.toLowerCase().includes(searchTerm)) - : group.members; + const filteredMembers = group.members.filter( + (member) => !searchTerm || member.name?.toLowerCase().includes(searchTerm), + ); // "local" = every enabled provider managed locally, "external" = none, "mixed" = some. const managementType = getGroupMemberManagementType(); diff --git a/packages/definitions/src/docs/homarr-docs-sitemap.ts b/packages/definitions/src/docs/homarr-docs-sitemap.ts index 9f906f95e..6309a0d36 100644 --- a/packages/definitions/src/docs/homarr-docs-sitemap.ts +++ b/packages/definitions/src/docs/homarr-docs-sitemap.ts @@ -233,7 +233,6 @@ export type HomarrDocumentationPath = | "/docs/management/search-engines" | "/docs/management/settings" | "/docs/management/tasks" - | "/docs/management/tools/backup" | "/docs/management/users" | "/docs/widgets/anchor-note" | "/docs/widgets/app" diff --git a/packages/integrations/src/mock/data/beszel.ts b/packages/integrations/src/mock/data/beszel.ts index ea191af81..5f2a26389 100644 --- a/packages/integrations/src/mock/data/beszel.ts +++ b/packages/integrations/src/mock/data/beszel.ts @@ -375,7 +375,7 @@ export class BeszelMockService { name: names[i % names.length] ?? "CPU", val: rand(60, 95), created: new Date(now - (i + 1) * 3_600_000).toISOString(), - resolved: i % 2 === 0 ? new Date(now - i * 1_800_000).toISOString() : null, + resolved: i % 2 === 0 && new Date(now - i * 1_800_000).toISOString() || null, })); } } diff --git a/packages/widgets/src/_inputs/widget-integration-select-input.tsx b/packages/widgets/src/_inputs/widget-integration-select-input.tsx index 0b0f8f51b..e91c07a7e 100644 --- a/packages/widgets/src/_inputs/widget-integration-select-input.tsx +++ b/packages/widgets/src/_inputs/widget-integration-select-input.tsx @@ -23,10 +23,8 @@ export const WidgetIntegrationSelectInput = ({ const { data: selectData = [], isPending, isError } = options.useOptions(integrationIds); const currentValue = form.getInputProps(`options.${property}`).value as string; - const data = - currentValue && !selectData.some((opt) => opt.value === currentValue) - ? [...selectData, { value: currentValue, label: currentValue }] - : selectData; + const hasCurrentInData = !currentValue || selectData.some((opt) => opt.value === currentValue); + const data = hasCurrentInData ? selectData : [...selectData, { value: currentValue, label: currentValue }]; if (integrationIds.length === 0) { return ( @@ -36,17 +34,21 @@ export const WidgetIntegrationSelectInput = ({ ); } + const description = options.withDescription ? tInput("description") : undefined; + const placeholder = isPending ? t("loading") : t("placeholder"); + const error = isError ? t("loadError") : undefined; + return ( value && handleSelectSystem(value)} /> diff --git a/packages/widgets/src/custom-api/jsx-interactive-components.tsx b/packages/widgets/src/custom-api/jsx-interactive-components.tsx index 8c35bdca3..2b18342a3 100644 --- a/packages/widgets/src/custom-api/jsx-interactive-components.tsx +++ b/packages/widgets/src/custom-api/jsx-interactive-components.tsx @@ -70,7 +70,8 @@ export function TabsContainer({ children, defaultTab }: TabsContainerProps) { const panels = Children.toArray(children).filter(isTabPanel); const firstPanel = panels[0]; const panelValues = new Set(panels.map((p) => p.props.value)); - const initialTab = (defaultTab && panelValues.has(defaultTab) ? defaultTab : firstPanel?.props.value) ?? null; + const resolvedDefault = defaultTab && panelValues.has(defaultTab) && defaultTab; + const initialTab = resolvedDefault || firstPanel?.props.value || null; const [activeTab, setActiveTab] = useState(initialTab); return (