From a9b19fa956681292f9503be10168f4b7fb0b09f9 Mon Sep 17 00:00:00 2001 From: Marco Beretta <81851188+berry-13@users.noreply.github.com> Date: Tue, 5 Aug 2025 03:18:05 +0200 Subject: [PATCH] feat: Refactor UI components for improved styling and accessibility in sharing dialogs --- .../components/Sharing/AccessRolesPicker.tsx | 3 +- .../Sharing/GenericGrantAccessDialog.tsx | 32 +++++++++---------- .../GenericManagePermissionsDialog.tsx | 20 +++--------- .../components/Sharing/GrantAccessDialog.tsx | 2 +- .../Sharing/PeoplePicker/PeoplePicker.tsx | 1 - .../Sharing/PeoplePicker/SearchPicker.tsx | 28 ++-------------- .../PeoplePicker/SelectedPrincipalsList.tsx | 14 ++++---- .../Sharing/PublicSharingToggle.tsx | 2 +- .../SidePanel/Agents/DeleteButton.tsx | 19 ++++++----- .../SidePanel/Agents/DuplicateAgent.tsx | 13 +++----- client/src/locales/en/translation.json | 1 - 11 files changed, 47 insertions(+), 88 deletions(-) diff --git a/client/src/components/Sharing/AccessRolesPicker.tsx b/client/src/components/Sharing/AccessRolesPicker.tsx index 008c32edb4..64f427fcda 100644 --- a/client/src/components/Sharing/AccessRolesPicker.tsx +++ b/client/src/components/Sharing/AccessRolesPicker.tsx @@ -79,8 +79,7 @@ export default function AccessRolesPicker({ diff --git a/client/src/components/Sharing/GenericGrantAccessDialog.tsx b/client/src/components/Sharing/GenericGrantAccessDialog.tsx index 8dfa7704ae..9c719472b3 100644 --- a/client/src/components/Sharing/GenericGrantAccessDialog.tsx +++ b/client/src/components/Sharing/GenericGrantAccessDialog.tsx @@ -1,8 +1,10 @@ import React, { useState } from 'react'; import { AccessRoleIds, ResourceType } from 'librechat-data-provider'; -import { Share2Icon, Users, Loader, Shield, Link, CopyCheck } from 'lucide-react'; +import { Share2Icon, Users, Shield, Link, CopyCheck } from 'lucide-react'; import { + Label, Button, + Spinner, OGDialog, OGDialogTitle, OGDialogClose, @@ -20,8 +22,8 @@ import { import GenericManagePermissionsDialog from './GenericManagePermissionsDialog'; import PublicSharingToggle from './PublicSharingToggle'; import AccessRolesPicker from './AccessRolesPicker'; -import { cn, removeFocusOutlines } from '~/utils'; import { PeoplePicker } from './PeoplePicker'; +import { cn } from '~/utils'; export default function GenericGrantAccessDialog({ resourceName, @@ -109,7 +111,6 @@ export default function GenericGrantAccessDialog({ setDefaultPermissionId(config?.defaultViewerRoleId); setIsPublic(false); setPublicRole(config?.defaultViewerRoleId); - setIsModalOpen(false); } catch (error) { console.error('Error granting access:', error); showToast({ @@ -134,26 +135,24 @@ export default function GenericGrantAccessDialog({ const TriggerComponent = children ? ( children ) : ( - + ); return ( @@ -203,7 +202,7 @@ export default function GenericGrantAccessDialog({ onPublicRoleChange={setPublicRole} resourceType={resourceType} /> -
+
{hasPeoplePickerAccess && ( { if (isCopying) return; copyResourceUrl(setIsCopying); @@ -250,7 +248,7 @@ export default function GenericGrantAccessDialog({ > {updatePermissionsMutation.isLoading ? (
- + {localize('com_ui_granting')}
) : ( diff --git a/client/src/components/Sharing/GenericManagePermissionsDialog.tsx b/client/src/components/Sharing/GenericManagePermissionsDialog.tsx index 1935f2e67d..5d9b26c17b 100644 --- a/client/src/components/Sharing/GenericManagePermissionsDialog.tsx +++ b/client/src/components/Sharing/GenericManagePermissionsDialog.tsx @@ -14,7 +14,6 @@ import type { TPrincipal, ResourceType, AccessRoleIds } from 'librechat-data-pro import { useResourcePermissionState } from '~/hooks/Sharing'; import PublicSharingToggle from './PublicSharingToggle'; import { SelectedPrincipalsList } from './PeoplePicker'; -import { cn, removeFocusOutlines } from '~/utils'; import { useLocalize } from '~/hooks'; export default function GenericManagePermissionsDialog({ @@ -190,20 +189,11 @@ export default function GenericManagePermissionsDialog({ const TriggerComponent = children ? ( children ) : ( - + ); return ( diff --git a/client/src/components/Sharing/GrantAccessDialog.tsx b/client/src/components/Sharing/GrantAccessDialog.tsx index 4f8bb7833a..beb69265e3 100644 --- a/client/src/components/Sharing/GrantAccessDialog.tsx +++ b/client/src/components/Sharing/GrantAccessDialog.tsx @@ -232,7 +232,7 @@ export default function GrantAccessDialog({ onPublicRoleChange={setPublicRole} resourceType={resourceType} /> -
+
{hasPeoplePickerAccess && (
diff --git a/client/src/components/Sharing/PeoplePicker/SearchPicker.tsx b/client/src/components/Sharing/PeoplePicker/SearchPicker.tsx index e75f603e9b..e4266f4c83 100644 --- a/client/src/components/Sharing/PeoplePicker/SearchPicker.tsx +++ b/client/src/components/Sharing/PeoplePicker/SearchPicker.tsx @@ -69,15 +69,7 @@ export function SearchPicker({ inputRef.current.focus(); } }; - const showClearIcon = localQuery.trim().length > 0; - const clearText = () => { - setLocalQuery(''); - onQueryChange(''); - debouncedOnQueryChange.cancel(); - if (inputRef.current) { - inputRef.current.focus(); - } - }; + return ( @@ -91,7 +83,7 @@ export function SearchPicker({ )} > {isLoading ? ( - + ) : ( )} @@ -120,26 +112,12 @@ export function SearchPicker({ placeholder={placeholder || localize('com_ui_select_options')} className="m-0 mr-0 w-full rounded-md border-none bg-transparent p-0 py-2 pl-9 pr-3 text-sm leading-tight text-text-primary placeholder-text-secondary placeholder-opacity-100 focus:outline-none focus-visible:outline-none group-focus-within:placeholder-text-primary group-hover:placeholder-text-primary" /> -
0 || diff --git a/client/src/components/Sharing/PeoplePicker/SelectedPrincipalsList.tsx b/client/src/components/Sharing/PeoplePicker/SelectedPrincipalsList.tsx index b323aceb35..3ff26870ec 100644 --- a/client/src/components/Sharing/PeoplePicker/SelectedPrincipalsList.tsx +++ b/client/src/components/Sharing/PeoplePicker/SelectedPrincipalsList.tsx @@ -1,5 +1,5 @@ import React, { useState, useId } from 'react'; -import * as Menu from '@ariakit/react/menu'; +import * as Ariakit from '@ariakit/react/menu'; import { Button, DropdownPopup } from '@librechat/client'; import { Users, X, ExternalLink, ChevronDown } from 'lucide-react'; import type { TPrincipal, TAccessRole, AccessRoleIds } from 'librechat-data-provider'; @@ -34,7 +34,7 @@ export default function SelectedPrincipalsList({ if (principles.length === 0) { return (
-
+

{localize('com_ui_search_above_to_add')}

@@ -80,10 +80,10 @@ export default function SelectedPrincipalsList({ /> )} +
- + ); } diff --git a/client/src/locales/en/translation.json b/client/src/locales/en/translation.json index b67dbaedf7..d286b1cfc8 100644 --- a/client/src/locales/en/translation.json +++ b/client/src/locales/en/translation.json @@ -693,7 +693,6 @@ "com_ui_permission_level": "Permission Level", "com_ui_grant_access": "Grant Access", "com_ui_granting": "Granting...", - "com_ui_search_users_groups": "Search Users and Groups", "com_ui_search_default_placeholder": "Search by name or email (min 2 chars)", "com_ui_user": "User", "com_ui_group": "Group",