Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 48 additions & 47 deletions ui/goose2/src/features/extensions/ui/ExtensionsSettings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ import { useTranslation } from "react-i18next";
import { IconChevronDown, IconPlus } from "@tabler/icons-react";
import { Button } from "@/shared/ui/button";
import { SearchBar } from "@/shared/ui/SearchBar";
import { FilterRow } from "@/shared/ui/page-shell";
import { SettingsPage } from "@/shared/ui/SettingsPage";
import { FilterRow, PageHeader } from "@/shared/ui/page-shell";
import { useExtensionsSettings } from "../hooks/useExtensionsSettings";
import {
EXTENSION_CATEGORIES,
Expand Down Expand Up @@ -113,50 +112,52 @@ export function ExtensionsSettings() {
};

return (
<SettingsPage
title={t("extensions.title")}
actions={
<Button
type="button"
variant="outline-flat"
size="xs"
onClick={handleAdd}
>
<IconPlus className="size-3.5" />
{t("extensions.addExtension")}
</Button>
}
controls={
<div className="space-y-3">
<SearchBar
value={searchTerm}
onChange={setSearchTerm}
placeholder={t("extensions.search")}
aria-label={t("extensions.search")}
size="compact"
/>
<FilterRow>
<FilterButton
active={activeFilter === "all"}
onClick={() => setActiveFilter("all")}
>
{t("extensions.filters.all")}
</FilterButton>
{EXTENSION_CATEGORIES.map((category) =>
categoryCounts[category] > 0 ? (
<FilterButton
key={category}
active={activeFilter === category}
onClick={() => setActiveFilter(category)}
>
{t(`extensions.categories.${category}`)}
</FilterButton>
) : null,
)}
</FilterRow>
</div>
}
>
<>
<PageHeader
title={t("extensions.title")}
description={t("extensions.description")}
titleClassName="font-normal text-foreground"
actions={
<Button
type="button"
variant="outline-flat"
size="xs"
onClick={handleAdd}
>
<IconPlus className="size-3.5" />
{t("extensions.addExtension")}
</Button>
}
/>

<div className="space-y-3">
<SearchBar
value={searchTerm}
onChange={setSearchTerm}
placeholder={t("extensions.search")}
aria-label={t("extensions.search")}
/>
<FilterRow>
<FilterButton
active={activeFilter === "all"}
onClick={() => setActiveFilter("all")}
>
{t("extensions.filters.all")}
</FilterButton>
{EXTENSION_CATEGORIES.map((category) =>
categoryCounts[category] > 0 ? (
<FilterButton
key={category}
active={activeFilter === category}
onClick={() => setActiveFilter(category)}
>
{t(`extensions.categories.${category}`)}
</FilterButton>
) : null,
)}
</FilterRow>
</div>

{isLoading ? (
<div className="grid gap-x-12 sm:grid-cols-2">
{[1, 2, 3, 4, 5, 6].map((i) => (
Expand Down Expand Up @@ -225,6 +226,6 @@ export function ExtensionsSettings() {
onClose={handleModalClose}
/>
)}
</SettingsPage>
</>
);
}
1 change: 1 addition & 0 deletions ui/goose2/src/shared/i18n/locales/en/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
},
"extensions": {
"title": "Extensions",
"description": "Connect Goose to apps, services, and built-in capabilities.",
"search": "Search extensions...",
"empty": "No extensions configured.",
"noResults": "No extensions match your search.",
Expand Down
1 change: 1 addition & 0 deletions ui/goose2/src/shared/i18n/locales/es/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@
},
"extensions": {
"title": "Extensiones",
"description": "Conecta Goose con apps, servicios y capacidades integradas.",
"search": "Buscar extensiones...",
"empty": "No hay extensiones configuradas.",
"noResults": "Ninguna extensión coincide con tu búsqueda.",
Expand Down
Loading