From ee72a49ab14ab3bbd38eb8488e178ff6dae31772 Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Thu, 14 May 2026 14:40:08 +0530 Subject: [PATCH] refactor: replace button elements with Button component for improved consistency and styling across additional UI components --- .../components/composio-drive-config.tsx | 24 +-- .../components/dropbox-config.tsx | 24 +-- .../components/google-drive-config.tsx | 27 ++-- .../components/onedrive-config.tsx | 24 +-- .../views/connector-accounts-list-view.tsx | 14 +- .../assistant-ui/inline-citation.tsx | 15 +- .../connectors/drive-folder-tree.tsx | 23 +-- .../components/documents/DocumentNode.tsx | 24 ++- .../ui/sidebar/AllPrivateChatsSidebar.tsx | 14 +- .../ui/sidebar/LocalFilesystemBrowser.tsx | 23 ++- surfsense_web/components/markdown-viewer.tsx | 88 ++--------- .../components/new-chat/prompt-picker.tsx | 15 +- .../components/settings/buy-pages-content.tsx | 23 +-- .../settings/buy-tokens-content.tsx | 23 +-- .../components/settings/roles-manager.tsx | 147 ++++++++++-------- .../components/settings/settings-dialog.tsx | 15 +- .../components/shared/llm-config-form.tsx | 14 +- 17 files changed, 274 insertions(+), 263 deletions(-) diff --git a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/composio-drive-config.tsx b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/composio-drive-config.tsx index 8e92af44b..6d119e8a2 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/composio-drive-config.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/composio-drive-config.tsx @@ -14,6 +14,7 @@ import { import type { FC } from "react"; import { useCallback, useState } from "react"; import { DriveFolderTree, type SelectedFolder } from "@/components/connectors/drive-folder-tree"; +import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Select, @@ -196,14 +197,16 @@ export const ComposioDriveConfig: FC = ({ connector, onCon > {folder.name} - + ))} {selectedFiles.map((file) => ( @@ -214,14 +217,16 @@ export const ComposioDriveConfig: FC = ({ connector, onCon > {getFileIconFromName(file.name)} {file.name} - + ))} @@ -237,10 +242,11 @@ export const ComposioDriveConfig: FC = ({ connector, onCon {isEditMode ? (
- + {isFolderTreeOpen && ( = ({ connector, onConfigCha > {folder.name} - +
))} {selectedFiles.map((file) => ( @@ -195,14 +198,16 @@ export const DropboxConfig: FC = ({ connector, onConfigCha > {getFileIconFromName(file.name)} {file.name} - + ))} @@ -217,10 +222,11 @@ export const DropboxConfig: FC = ({ connector, onConfigCha {isEditMode ? (
- + {isFolderTreeOpen && ( = ({ connector, onConfi const [selectedFiles, setSelectedFiles] = useState(existingFiles); const [indexingOptions, setIndexingOptions] = useState(existingIndexingOptions); - const updateConfig = ( - folders: SelectedItem[], - files: SelectedItem[], - options: IndexingOptions - ) => { + const updateConfig = useCallback((folders: SelectedItem[], files: SelectedItem[], options: IndexingOptions) => { if (onConfigChange) { onConfigChange({ ...connector.config, @@ -105,7 +101,7 @@ export const GoogleDriveConfig: FC = ({ connector, onConfi indexing_options: options, }); } - }; + }, [connector.config, onConfigChange]); const handlePicked = useCallback( (result: PickerResult) => { @@ -115,8 +111,7 @@ export const GoogleDriveConfig: FC = ({ connector, onConfi setSelectedFiles(files); updateConfig(folders, files, indexingOptions); }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [indexingOptions, connector.config] + [indexingOptions, updateConfig] ); const { @@ -188,14 +183,16 @@ export const GoogleDriveConfig: FC = ({ connector, onConfi > {folder.name} - +
))} {selectedFiles.map((file) => ( @@ -206,14 +203,16 @@ export const GoogleDriveConfig: FC = ({ connector, onConfi > {getFileIconFromName(file.name)} {file.name} - + ))} diff --git a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/onedrive-config.tsx b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/onedrive-config.tsx index 208a42123..5ecaee045 100644 --- a/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/onedrive-config.tsx +++ b/surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/onedrive-config.tsx @@ -14,6 +14,7 @@ import { import type { FC } from "react"; import { useCallback, useEffect, useState } from "react"; import { DriveFolderTree, type SelectedFolder } from "@/components/connectors/drive-folder-tree"; +import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Select, @@ -178,14 +179,16 @@ export const OneDriveConfig: FC = ({ connector, onConfigCh > {folder.name} - + ))} {selectedFiles.map((file) => ( @@ -196,14 +199,16 @@ export const OneDriveConfig: FC = ({ connector, onConfigCh > {getFileIconFromName(file.name)} {file.name} - + ))} @@ -218,10 +223,11 @@ export const OneDriveConfig: FC = ({ connector, onConfigCh {isEditMode ? (
- + {isFolderTreeOpen && ( = ({ {/* Header */}
{/* Back button */} - + {/* Connector header */}
@@ -135,12 +136,13 @@ export const ConnectorAccountsListView: FC = ({
{/* Add Account Button with dashed border */} -
{buttonText} - + diff --git a/surfsense_web/components/assistant-ui/inline-citation.tsx b/surfsense_web/components/assistant-ui/inline-citation.tsx index 1a3d04262..abb89d5da 100644 --- a/surfsense_web/components/assistant-ui/inline-citation.tsx +++ b/surfsense_web/components/assistant-ui/inline-citation.tsx @@ -9,6 +9,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { openCitationPanelAtom } from "@/atoms/citation/citation-panel.atom"; import { useCitationMetadata } from "@/components/assistant-ui/citation-metadata-context"; import { Citation } from "@/components/tool-ui/citation"; +import { Button } from "@/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Spinner } from "@/components/ui/spinner"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; @@ -76,15 +77,16 @@ const NumericChunkCitation: FC<{ chunkId: number }> = ({ chunkId }) => { const openCitationPanel = useSetAtom(openCitationPanelAtom); return ( - + ); }; @@ -121,8 +123,9 @@ const SurfsenseDocCitation: FC<{ chunkId: number }> = ({ chunkId }) => { return ( - + {isFolder ? ( - + ) : ( )} @@ -314,13 +317,14 @@ export function DriveFolderTree({ {isFolder ? ( - + ) : ( {item.name} @@ -356,13 +360,14 @@ export function DriveFolderTree({ className="shrink-0 h-3.5 w-3.5 sm:h-4 sm:w-4 border-slate-400/20 dark:border-white/20" /> - + diff --git a/surfsense_web/components/documents/DocumentNode.tsx b/surfsense_web/components/documents/DocumentNode.tsx index 826feb51d..0f3cd4a19 100644 --- a/surfsense_web/components/documents/DocumentNode.tsx +++ b/surfsense_web/components/documents/DocumentNode.tsx @@ -138,10 +138,7 @@ export const DocumentNode = React.memo(function DocumentNode({ return ( - {/* biome-ignore lint/a11y/useSemanticElements: contains nested interactive children (Checkbox) that render as {doc.title} diff --git a/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx b/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx index e5bc0bd31..a2e912c72 100644 --- a/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx +++ b/surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx @@ -348,8 +348,9 @@ export function AllPrivateChatsSidebarContent({ return (
{isMobile ? ( - + ) : ( - +

diff --git a/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx b/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx index 9184ed511..aa773f3e1 100644 --- a/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx +++ b/surfsense_web/components/layout/ui/sidebar/LocalFilesystemBrowser.tsx @@ -3,9 +3,11 @@ import { ChevronDown, ChevronRight, FileText, Folder, FolderOpen } from "lucide-react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { DEFAULT_EXCLUDE_PATTERNS } from "@/components/sources/FolderWatchDialog"; +import { Button } from "@/components/ui/button"; import { Skeleton } from "@/components/ui/skeleton"; import { Spinner } from "@/components/ui/spinner"; import { useElectronAPI } from "@/hooks/use-platform"; +import { cn } from "@/lib/utils"; interface LocalFilesystemBrowserProps { rootPaths: string[]; @@ -409,10 +411,11 @@ export function LocalFilesystemBrowser({ const files = [...folder.files].sort((a, b) => a.relativePath.localeCompare(b.relativePath)); return (

- + {isExpanded && ( <> {childFolders.map((childFolder) => renderFolder(childFolder, depth + 1, mount))} @@ -431,17 +434,21 @@ export function LocalFilesystemBrowser({ const extension = getNormalizedExtension(file.relativePath); const isOpenable = openableExtensions.has(extension); return ( - + ); })} diff --git a/surfsense_web/components/markdown-viewer.tsx b/surfsense_web/components/markdown-viewer.tsx index 6caf01917..45bdc7be1 100644 --- a/surfsense_web/components/markdown-viewer.tsx +++ b/surfsense_web/components/markdown-viewer.tsx @@ -13,10 +13,7 @@ const code = createCodePlugin({ }); const math = createMathPlugin({ - // Disabled so currency like "$3,120.00 and ... $0.00" isn't parsed as - // inline LaTeX. convertLatexDelimiters() below normalises any genuine - // inline math (\(...\), $...$ starting with a LaTeX command, etc.) to - // $$...$$, so this flip doesn't lose any math rendering. + // Keep currency from being parsed as math; real math is normalized below. singleDollarTextMath: false, }); @@ -24,76 +21,37 @@ interface MarkdownViewerProps { content: string; className?: string; maxLength?: number; - /** - * When true, render `[citation:N]` / `[citation:URL]` tokens as the - * interactive citation badges/popovers used in chat. Default `false` - * so callers that don't need citations are unchanged. - * - * Note: we deliberately do NOT override `` to inject citations into - * link text — that would produce `
{filtered.map((action, index) => ( - + ))}
- +
)}
diff --git a/surfsense_web/components/settings/buy-pages-content.tsx b/surfsense_web/components/settings/buy-pages-content.tsx index 5e2c6f9db..3cb8e7133 100644 --- a/surfsense_web/components/settings/buy-pages-content.tsx +++ b/surfsense_web/components/settings/buy-pages-content.tsx @@ -72,44 +72,49 @@ export function BuyPagesContent() {
{/* Stepper */}
- + {totalPages.toLocaleString()} - +
{/* Quick-pick presets */}
{PRESET_MULTIPLIERS.map((m) => ( - + ))}
diff --git a/surfsense_web/components/settings/buy-tokens-content.tsx b/surfsense_web/components/settings/buy-tokens-content.tsx index 79a1b4943..abda14266 100644 --- a/surfsense_web/components/settings/buy-tokens-content.tsx +++ b/surfsense_web/components/settings/buy-tokens-content.tsx @@ -105,43 +105,48 @@ export function BuyTokensContent() {
- + ${(totalCreditMicros / 1_000_000).toFixed(0)} of credit - +
{PRESET_MULTIPLIERS.map((m) => ( - + ))}
diff --git a/surfsense_web/components/settings/roles-manager.tsx b/surfsense_web/components/settings/roles-manager.tsx index eb049d8fa..d2ddba9a0 100644 --- a/surfsense_web/components/settings/roles-manager.tsx +++ b/surfsense_web/components/settings/roles-manager.tsx @@ -462,47 +462,44 @@ function RolesContent({ return (
- {/* biome-ignore lint/a11y/useSemanticElements: row contains nested interactive elements (DropdownMenu); using a
-
- -
+
+ +
+ {!role.is_system_role && ( -
e.stopPropagation()}> +
)} -
+
+
{isExpanded && ( @@ -692,40 +697,44 @@ function PermissionsEditor({ return (
- {/* biome-ignore lint/a11y/useSemanticElements: row contains a nested interactive Checkbox; using a
+
e.stopPropagation()} onCheckedChange={() => onToggleCategory(category)} aria-label={`Select all ${config.label} permissions`} /> - +
@@ -745,16 +754,19 @@ function PermissionsEditor({ isSelected ? "bg-muted/60 hover:bg-accent hover:text-accent-foreground" : "hover:bg-accent hover:text-accent-foreground" )} > - + + {actionLabel} + + {perm.description} + + + onTogglePermission(perm.value)} @@ -871,12 +883,13 @@ function CreateRoleDialog({
{Object.entries(ROLE_PRESETS).map(([key, preset]) => ( - + ))}
diff --git a/surfsense_web/components/settings/settings-dialog.tsx b/surfsense_web/components/settings/settings-dialog.tsx index 7bfcb9a60..d3f75c2a8 100644 --- a/surfsense_web/components/settings/settings-dialog.tsx +++ b/surfsense_web/components/settings/settings-dialog.tsx @@ -2,6 +2,7 @@ import type * as React from "react"; import { useCallback, useRef, useState } from "react"; +import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogTitle } from "@/components/ui/dialog"; import { Separator } from "@/components/ui/separator"; import { cn } from "@/lib/utils"; @@ -55,12 +56,13 @@ export function SettingsDialog({ @@ -88,13 +90,14 @@ export function SettingsDialog({ >
{navItems.map((item) => ( - + ))}
diff --git a/surfsense_web/components/shared/llm-config-form.tsx b/surfsense_web/components/shared/llm-config-form.tsx index 3581ac302..6b00408cb 100644 --- a/surfsense_web/components/shared/llm-config-form.tsx +++ b/surfsense_web/components/shared/llm-config-form.tsx @@ -407,9 +407,10 @@ export function LLMConfigForm({ - + - + {/* System Instructions */}