From 00e578606715a9da34488608edee8c68d4ef4893 Mon Sep 17 00:00:00 2001 From: yyh <92089059+lyzno1@users.noreply.github.com> Date: Sat, 5 Sep 2026 03:49:39 +0000 Subject: [PATCH] fix(select): isolate trigger states and unavailable package selection (#41843) --- packages/dify-ui/src/select/index.tsx | 4 +- .../time-range-picker/range-selector.tsx | 20 +++------ .../steps/__tests__/selectPackage.spec.tsx | 45 ++++++++----------- .../steps/selectPackage.tsx | 2 +- 4 files changed, 28 insertions(+), 43 deletions(-) diff --git a/packages/dify-ui/src/select/index.tsx b/packages/dify-ui/src/select/index.tsx index 029879ad55a..c273c61b165 100644 --- a/packages/dify-ui/src/select/index.tsx +++ b/packages/dify-ui/src/select/index.tsx @@ -62,7 +62,7 @@ type SelectGroupProps = BaseSelect.Group.Props const selectTriggerVariants = cva( [ - 'group flex w-full items-center border-0 bg-components-input-bg-normal text-start text-components-input-text-filled outline-hidden', + 'group/select-trigger flex w-full items-center border-0 bg-components-input-bg-normal text-start text-components-input-text-filled outline-hidden', 'hover:bg-state-base-hover-alt focus-visible:bg-state-base-hover-alt data-popup-open:bg-state-base-hover-alt', 'focus-visible:ring-2 focus-visible:ring-state-accent-solid', 'data-placeholder:text-components-input-text-placeholder', @@ -94,7 +94,7 @@ function SelectTrigger({ className, children, size, ...props }: SelectTriggerPro return ( {children} - + diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/range-selector.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/range-selector.tsx index 9c3113e6df0..3f3cea791d9 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/range-selector.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/range-selector.tsx @@ -12,8 +12,8 @@ import { SelectPortal, SelectPositioner, SelectTrigger, + SelectValue, } from '@langgenius/dify-ui/select' -import { RiArrowDownSLine } from '@remixicon/react' import dayjs from 'dayjs' import * as React from 'react' import { useCallback, useMemo, useState } from 'react' @@ -35,7 +35,6 @@ type Props = Readonly<{ const RangeSelector: FC = ({ isCustomRange, ranges, onSelect }) => { const { t } = useTranslation() - const [open, setOpen] = useState(false) const items = useMemo(() => { return ranges.map((range) => ({ ...range, @@ -69,8 +68,6 @@ const RangeSelector: FC = ({ isCustomRange, ranges, onSelect }) => { return ( value={selectedItem?.value ?? null} - open={open} - onOpenChange={setOpen} onValueChange={(nextValue) => { if (nextValue == null) return const nextItem = items.find((item) => item.value === nextValue) @@ -79,15 +76,12 @@ const RangeSelector: FC = ({ isCustomRange, ranges, onSelect }) => { handleSelectRange(nextItem) }} > - - - - {isCustomRange - ? t(($) => $['filter.period.custom'], { ns: 'appLog' }) - : selectedItem?.name} - - - + + + {isCustomRange + ? t(($) => $['filter.period.custom'], { ns: 'appLog' }) + : selectedItem?.name} + diff --git a/web/app/components/plugins/install-plugin/install-from-github/steps/__tests__/selectPackage.spec.tsx b/web/app/components/plugins/install-plugin/install-from-github/steps/__tests__/selectPackage.spec.tsx index 33b070166a0..f4e3bdda887 100644 --- a/web/app/components/plugins/install-plugin/install-from-github/steps/__tests__/selectPackage.spec.tsx +++ b/web/app/components/plugins/install-plugin/install-from-github/steps/__tests__/selectPackage.spec.tsx @@ -262,16 +262,28 @@ describe('SelectPackage', () => { expect(onSelectVersion).toHaveBeenCalledWith({ value: 'v0.9.0', name: 'v0.9.0' }) }) - it('should select a valid package option', async () => { + it('should only allow package selection after a version is selected', async () => { const user = userEvent.setup() const onSelectPackage = vi.fn() - renderSelectPackage({ - selectedVersion: 'v1.0.0', + const props = { + ...createDefaultProps(), + updatePayload: createUpdatePayload(), onSelectPackage, - }) + } + const { rerender } = render() - const section = getSection('plugin.installFromGitHub.selectPackage') - await user.click(within(section).getByRole('combobox')) + const packageTrigger = screen.getByRole('combobox', { + name: 'plugin.installFromGitHub.selectPackage', + }) + expect(packageTrigger).toBeDisabled() + await user.click(packageTrigger) + expect(screen.queryByRole('listbox')).not.toBeInTheDocument() + expect(onSelectPackage).not.toHaveBeenCalled() + + rerender() + + expect(packageTrigger).toBeEnabled() + await user.click(packageTrigger) await user.click(await screen.findByRole('option', { name: 'plugin.tar.gz' })) expect(onSelectPackage).toHaveBeenCalledWith({ @@ -472,27 +484,6 @@ describe('SelectPackage', () => { }) }) - // ================================ - // PortalSelect Readonly State Tests - // ================================ - describe('PortalSelect Readonly State', () => { - it('should make package select readonly when no version selected', () => { - renderSelectPackage({ selectedVersion: '' }) - - // When no version is selected, package select should be readonly - const trigger = screen.getAllByRole('combobox')[1] - expect(trigger).toHaveAttribute('aria-readonly', 'true') - }) - - it('should make package select active when version is selected', () => { - renderSelectPackage({ selectedVersion: 'v1.0.0' }) - - // When version is selected, package select should be active - const trigger = screen.getAllByRole('combobox')[1] - expect(trigger).not.toHaveAttribute('aria-readonly', 'true') - }) - }) - // ================================ // installedValue Props Tests // ================================ diff --git a/web/app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx b/web/app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx index 77be3236f9f..690088bc7d6 100644 --- a/web/app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx +++ b/web/app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx @@ -128,7 +128,7 @@ const SelectPackage: React.FC = ({ { if (value == null) return const selectedItem = packages.find((item) => item.value === value)