From 4e28a2a7785c4d1fb61c0216e12dced08aa03194 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Thu, 14 May 2026 16:44:28 +0800 Subject: [PATCH] Combobox --- .../settings-tab/access/permissions.tsx | 277 +++++++++--------- 1 file changed, 145 insertions(+), 132 deletions(-) diff --git a/web/features/deployments/detail/settings-tab/access/permissions.tsx b/web/features/deployments/detail/settings-tab/access/permissions.tsx index b99a768185..9af13f3e05 100644 --- a/web/features/deployments/detail/settings-tab/access/permissions.tsx +++ b/web/features/deployments/detail/settings-tab/access/permissions.tsx @@ -6,20 +6,36 @@ import type { EnvironmentAccessRow, Subject, } from '@dify/contracts/enterprise/types.gen' +import type { ComboboxRootChangeEventDetails } from '@langgenius/dify-ui/combobox' import { cn } from '@langgenius/dify-ui/cn' +import { + Combobox, + ComboboxChip, + ComboboxChipRemove, + ComboboxChips, + ComboboxContent, + ComboboxEmpty, + ComboboxInput, + ComboboxInputGroup, + ComboboxInputTrigger, + ComboboxItem, + ComboboxItemIndicator, + ComboboxItemText, + ComboboxList, + ComboboxStatus, + ComboboxValue, +} from '@langgenius/dify-ui/combobox' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@langgenius/dify-ui/dropdown-menu' -import { Popover, PopoverContent, PopoverTrigger } from '@langgenius/dify-ui/popover' import { toast } from '@langgenius/dify-ui/toast' import { useMutation, useQuery } from '@tanstack/react-query' import { useDebounce } from 'ahooks' import { useState } from 'react' import { useTranslation } from 'react-i18next' -import Input from '@/app/components/base/input' import { SkeletonRectangle, SkeletonRow } from '@/app/components/base/skeleton' import { consoleQuery } from '@/service/client' import { environmentName } from '../../../environment' @@ -130,6 +146,18 @@ function subjectKey(subject: Pick return `${subject.subjectType}:${subject.id}` } +function getSubjectLabel(subject: SelectableAccessSubject) { + return subject.name || subject.id +} + +function getSubjectValue(subject: SelectableAccessSubject) { + return subjectKey(subject) +} + +function isSameSubject(item: SelectableAccessSubject, value: SelectableAccessSubject) { + return item.id === value.id && item.subjectType === value.subjectType +} + const SUBJECT_PICKER_SKELETON_KEYS = ['first-subject', 'second-subject', 'third-subject'] function policySubjects(subjects: SelectableAccessSubject[]): AccessSubject[] { @@ -145,34 +173,13 @@ function selectedSubjectsFromPolicy(policy?: EnvironmentAccessRow) { .filter((subject): subject is SelectableAccessSubject => Boolean(subject)) ?? [] } -function SubjectPill({ subject, disabled, onRemove }: { +function SubjectIcon({ subject }: { subject: SelectableAccessSubject - disabled?: boolean - onRemove: () => void }) { - const { t } = useTranslation('deployments') const isGroup = subject.subjectType === 'group' return ( -
- - {subject.name || subject.id} - {isGroup && subject.memberCount != null && ( - {subject.memberCount} - )} - -
+