Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

patch(v5): pr6274 #6402

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
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,13 @@ test.describe('CustomSelect', () => {
}) => {
await mount(<CustomSelectNoMaxHeightPlayground {...componentPlaygroundProps} />);

await page.getByTestId('target-select').click();
await page
.getByTestId('target-select')
/*
* Используем force, потому что на платформе ios у селекта в обычном режиме (не searchable)
* спрятан инпут, чтобы не появлялся тултип autosuggestion на iOS при клике на инпут.
**/
.click({ force: componentPlaygroundProps.platform === 'ios' });

await expectScreenshotClippedToContent();
});
Expand Down
3 changes: 3 additions & 0 deletions packages/vkui/src/components/CustomSelect/CustomSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -857,6 +857,9 @@ export function CustomSelect<OptionInterfaceT extends CustomSelectOptionInterfac
)}
<CustomSelectInput
autoComplete="off"
autoCapitalize="none"
autoCorrect="off"
spellCheck="false"
{...restProps}
{...selectInputAriaProps}
getRef={selectInputRef}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ export const CustomSelectClearButton = ({
}: CustomSelectClearButtonProps) => {
return (
<IconButton
Component="div"
Component="button"
aria-label="Очистить поле"
onKeyDown={stopPropagation}
role="button"
type="button"
activeMode="opacity"
hoverMode="opacity"
{...restProps}
Expand Down
50 changes: 35 additions & 15 deletions packages/vkui/src/components/CustomSelect/CustomSelectInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ import { classNames } from '@vkontakte/vkjs';
import { useAdaptivity } from '../../hooks/useAdaptivity';
import { useExternRef } from '../../hooks/useExternRef';
import { useFocusWithin } from '../../hooks/useFocusWithin';
import { usePlatform } from '../../hooks/usePlatform';
import { SizeType } from '../../lib/adaptivity';
import { getFormFieldModeFromSelectType } from '../../lib/select';
import { HasAlign, HasRef, HasRootRef } from '../../types';
import { FormField, FormFieldProps } from '../FormField/FormField';
import type { SelectType } from '../Select/Select';
import { SelectTypography } from '../SelectTypography/SelectTypography';
import { Text } from '../Typography/Text/Text';
import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
import styles from './CustomSelectInput.module.css';

const sizeYClassNames = {
Expand Down Expand Up @@ -59,6 +61,25 @@ export const CustomSelectInput = ({
const handleRootRef = useExternRef(getRootRef);
const focusWithin = useFocusWithin(handleRootRef);

const input = (
<Text
type="text"
{...restProps}
disabled={disabled && !fetching}
readOnly={restProps.readOnly || (disabled && fetching)}
Component="input"
normalize={false}
className={classNames(
styles['CustomSelectInput__el'],
(restProps.readOnly || (showLabelOrPlaceholder && !focusWithin)) &&
styles['CustomSelectInput__el--cursor-pointer'],
)}
getRootRef={getRef}
placeholder={children ? '' : placeholder}
/>
);

const platform = usePlatform();
return (
<FormField
Component="div"
Expand Down Expand Up @@ -92,21 +113,20 @@ export const CustomSelectInput = ({
{showLabelOrPlaceholder && title}
</SelectTypography>
</div>
<Text
{...restProps}
disabled={disabled && !fetching}
readOnly={restProps.readOnly || (disabled && fetching)}
Component="input"
normalize={false}
type="text"
className={classNames(
styles['CustomSelectInput__el'],
(restProps.readOnly || (showLabelOrPlaceholder && !focusWithin)) &&
styles['CustomSelectInput__el--cursor-pointer'],
)}
getRootRef={getRef}
placeholder={children ? '' : placeholder}
/>
{/* Чтобы отключить autosuggestion в iOS, тултипы которого начинают всплывать даже когда input
* в режиме readonly, мы оборачиваем инпут в VisuallyHidden.
* Тултипы появляются при каждом клике на input.
* смотри: https://github.com/VKCOM/VKUI/issues/6205
*
* Достаточно не дать пользователю кликнуть по инпуту.
* Делаем это только для режима read-only. Потому что проблема именно в режиме read-only.
* Обертка вокруг инпута обрабатывает клики и передаёт фокус, так что на взаимодействии с инпутом это никак не скажется.
**/}
{restProps.readOnly && platform === 'ios' ? (
<VisuallyHidden>{input}</VisuallyHidden>
) : (
input
)}
</div>
</FormField>
);
Expand Down
4 changes: 3 additions & 1 deletion packages/vkui/src/components/CustomSelect/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
- получения текста, введённого пользователем при поиске опций, в режиме `searchable`;
- получения информации о наличии фокуса на компоненте;
- симуляции работы с компонентом с клавиатуры.
- для получения текста, выбранной в данный момент опции используйте свойство `labelTextTestId`.
- используйте `labelTextTestId`:
- для симуляции работы с компонентом с помощью мыши, тач-устройства;
- для получения текста выбранной в данный момент опции.
- для взаимодействия с кнопкой очистки состояния компонента, которая появляется, если `CustomSelect` имеет свойство `searchable` и пользователь выбрал опцию, используйте свойство `clearButtonTestId`.
- `CustomSelect` внутри себя хранит невидимый `<select>`, для того, чтобы `CustomSelect` можно было использовать внутри формы. Для получения доступа к `<select>` используйте свойство `nativeSelectTestId`. Полезно для доступа к значению `value`, выбранной в данный момент опции.

Expand Down
Loading