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: pr7736 #7901

Closed
wants to merge 21 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
a8ec2f5
fix(Select): disabled for options (#7622)
SevereCloud Sep 19, 2024
10601b0
fix(CarouselBase): fix two slides transition (#7615)
EldarMuhamethanov Sep 19, 2024
200abbf
SevereCloud/revert/CustomSelect-pr7235 (#7619)
SevereCloud Sep 19, 2024
bf0a093
fix(TabsItem): gaps use first-child (#7629)
SevereCloud Sep 20, 2024
66405d2
fix(Spacing): fix padding top with spacing tokens (#7632)
EldarMuhamethanov Sep 23, 2024
ffc08bf
Merge pull request #7652 from VKCOM/patch/pr7632
EldarMuhamethanov Sep 24, 2024
03b47fc
fix(UseFloatingWithInteractions): fix bug with disableAfterClickClose…
EldarMuhamethanov Sep 24, 2024
1e3ff50
fix(CellButton): decrease space between icon and text (#7658)
andrey-medvedev-vk Sep 25, 2024
061a94f
docs(SimpleCell): `expandable` description update (#7664)
SevereCloud Sep 26, 2024
2b4a2c7
Use memo for AppRootContext value (#7667)
andrey-medvedev-vk Sep 27, 2024
cddf1d0
docs(HorizontalScroll): rm TODO from description (#7674)
SevereCloud Sep 30, 2024
aeeb56c
fix(CarouselBase): fix error when no slides (#7686)
BlackySoul Oct 1, 2024
166ef39
fix(Button): import Tappable.module.css (#7734)
SevereCloud Oct 10, 2024
3a60521
fix(FormItem): rm TODO from topNode description (#7814)
inomdzhon Oct 23, 2024
8cd85f2
fix(CustomSelect): Fix input focus on arrow click on touch device (#7…
andrey-medvedev-vk Oct 24, 2024
d1da0e4
fix(Gallery): navigation doesn't work when align="center" and slides …
andrey-medvedev-vk Oct 29, 2024
8dbe6ab
Fix selectors in test (#7871)
andrey-medvedev-vk Oct 30, 2024
badc56d
feat(DateInput, DateRangeInput): add prop `onCalendarOpenChanged` (#7…
EldarMuhamethanov Nov 5, 2024
b7b5b48
patch: pr7882 in v6 (#7898)
EldarMuhamethanov Nov 5, 2024
7ce9a90
feat(Calendar): add doneButtonShow, doneButtonDisabled props flags (#…
EldarMuhamethanov Nov 5, 2024
79a18dc
fix: formatting prettier
EldarMuhamethanov Nov 5, 2024
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
Prev Previous commit
Next Next commit
fix(Gallery): navigation doesn't work when align="center" and slides …
…overflow just a little (#7862)

 Добавлено особое условия в режиме align="center" для подсчёта флага отключения навигации, учитывающее отступ, появляющийся при выравнивании по центру.

В условиях, когда слайды выравниваются по центру, у активного слайда слева появляется отступ от левого края, за счёт которого слайды смещаются вправо.

В такой ситуации перестаёт правильно работать условие, выключающее переключение между слайдами, когда общая ширина слайдов меньше контейнера.

Если общая ширина слайдов меньше контейнера и они за счёт отступа всё же не помещаются в контейнере, то нужно также учесть этот отступ в условии, иначе при отключении навигации будет невозможно полностью увидеть скрытый слайд.
andrey-medvedev-vk authored and actions-user committed Oct 29, 2024
commit d1da0e4ae55adf0008a4747412249c73ce916ce4
9 changes: 8 additions & 1 deletion packages/vkui/src/components/BaseGallery/BaseGallery.tsx
Original file line number Diff line number Diff line change
@@ -141,6 +141,13 @@ export const BaseGallery = ({
localSlides.length <= layoutState.current.slides.length ||
layoutState.current.slides[slideIndex]?.coordX !== localSlides[slideIndex]?.coordX;

const currentSlideOffsetOnCenterAlignment =
(localContainerWidth - (localSlides[slideIndex]?.width ?? 0)) / 2;
const isFullyVisible =
align === 'center'
? localLayerWidth + currentSlideOffsetOnCenterAlignment <= localContainerWidth
: localLayerWidth <= localContainerWidth;

layoutState.current = {
containerWidth: localContainerWidth,
viewportOffsetWidth: localViewportOffsetWidth,
@@ -159,7 +166,7 @@ export const BaseGallery = ({
align,
}),
slides: localSlides,
isFullyVisible: localLayerWidth <= localContainerWidth,
isFullyVisible,
};

setShiftState((prevState) => ({
98 changes: 82 additions & 16 deletions packages/vkui/src/components/Gallery/Gallery.test.tsx
Original file line number Diff line number Diff line change
@@ -73,20 +73,22 @@ const setup = ({
looped,
containerWidth: defaultContainerWidth,
isCustomSlideWidth = false,
viewPortWidth,
viewPortWidth: defaultViewPortWidth,
align,
onChange,
onNext,
onPrev,
onDragStart,
onDragEnd,
numberOfSlides = 5,
}: {
defaultSlideIndex: number;
looped: boolean;
slideWidth: number;
isCustomSlideWidth?: boolean;
containerWidth: number;
viewPortWidth: number;
numberOfSlides?: number;
align?: AlignType;
onChange: VoidFunction;
onNext?: VoidFunction;
@@ -99,6 +101,7 @@ const setup = ({
let layerTransform = '';
let viewPort: HTMLDivElement;
let containerWidth = defaultContainerWidth;
let viewPortWidth = defaultViewPortWidth;

const mockContainerData = (element: HTMLDivElement) => {
if (!element) {
@@ -161,21 +164,15 @@ const setup = ({
getRootRef={mockContainerData}
getRef={mockViewportData}
>
<Slide data-testid="slide-1" getRef={(e: HTMLDivElement) => mockSlideData(e, 0)}>
1
</Slide>
<Slide data-testid="slide-2" getRef={(e: HTMLDivElement) => mockSlideData(e, 1)}>
2
</Slide>
<Slide data-testid="slide-3" getRef={(e: HTMLDivElement) => mockSlideData(e, 2)}>
3
</Slide>
<Slide data-testid="slide-4" getRef={(e: HTMLDivElement) => mockSlideData(e, 3)}>
4
</Slide>
<Slide data-testid="slide-5" getRef={(e: HTMLDivElement) => mockSlideData(e, 4)}>
5
</Slide>
{Array.from({ length: numberOfSlides }).map((_v, index) => (
<Slide
key={index}
data-testid={`slide-${index + 1}`}
getRef={(e: HTMLDivElement) => mockSlideData(e, index)}
>
{index + 1}
</Slide>
))}
</Gallery>
);

@@ -200,6 +197,9 @@ const setup = ({
set containerWidth(newWidth: number) {
containerWidth = newWidth;
},
set viewPortWidth(newWidth: number) {
viewPortWidth = newWidth;
},
};
};

@@ -640,4 +640,70 @@ describe('Gallery', () => {
process.env.NODE_ENV = 'test';
});
});

it('checks gallery arrows and navigation in center alignment', () => {
const onChange = jest.fn();
const onDragStart = jest.fn();
const onDragEnd = jest.fn();

// в контейнере недостаточно места для
// двух слайдов с выравниванием по центру
// поэтому мы показываем кнопки и позволяем drag
const mockedData = setup({
numberOfSlides: 2,
defaultSlideIndex: 2,
slideWidth: 180,
containerWidth: 300,
viewPortWidth: 300,
align: 'center',
looped: false,
onDragStart,
onDragEnd,
onChange,
});
const {
component: { container },
rerender,
} = mockedData;

checkActiveSlide(container, 1);
expect(Array.from(container.getElementsByClassName(styles.arrow))).toHaveLength(1);

simulateDrag(mockedData.viewPort, [150, 0]);

expect(onDragStart).toHaveBeenCalledTimes(1);
expect(onDragEnd).toHaveBeenCalledTimes(1);

// это пограничное состояние при котором слайды ещё
// не помещаются в контейнер,
// при ширине контейнера 540 они уже будут влезать
mockedData.containerWidth = 539;
mockedData.viewPortWidth = 539;
onDragStart.mockClear();
onDragEnd.mockClear();

rerender({ slideIndex: 2 });

expect(Array.from(container.getElementsByClassName(styles.arrow))).toHaveLength(1);

simulateDrag(mockedData.viewPort, [150, 0]);

expect(onDragStart).toHaveBeenCalledTimes(1);
expect(onDragEnd).toHaveBeenCalledTimes(1);

// слайды полностью помещаются, поэтому мы отключаем drag и не показываем стрелочки
mockedData.containerWidth = 540;
mockedData.viewPortWidth = 540;
onDragStart.mockClear();
onDragEnd.mockClear();

rerender({ slideIndex: 2 });

expect(Array.from(container.getElementsByClassName(styles.arrow))).toHaveLength(0);

simulateDrag(mockedData.viewPort, [150, 0]);

expect(onDragStart).not.toHaveBeenCalled();
expect(onDragEnd).not.toHaveBeenCalled();
});
});