From 9541ea2e64f731bc7f67bea51b6873d221a824fa Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 15 Aug 2026 07:35:17 -0700 Subject: [PATCH] Try mobile no flip modifier --- src-ui/src/app/utils/popper-options.spec.ts | 57 ++++++++++++++++++++- src-ui/src/app/utils/popper-options.ts | 16 ++++++ src-ui/src/index.html | 2 +- 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src-ui/src/app/utils/popper-options.spec.ts b/src-ui/src/app/utils/popper-options.spec.ts index b8592d8c9..c7c31d5f0 100644 --- a/src-ui/src/app/utils/popper-options.spec.ts +++ b/src-ui/src/app/utils/popper-options.spec.ts @@ -1,7 +1,11 @@ import { Options } from '@popperjs/core' import { pngxPopperOptions } from './popper-options' -describe('popperOptionsReenablePreventOverflow', () => { +describe('pngxPopperOptions', () => { + afterEach(() => { + jest.restoreAllMocks() + }) + it('should return the config with add padding', () => { const config: Partial = { modifiers: [ @@ -20,4 +24,55 @@ describe('popperOptionsReenablePreventOverflow', () => { expect(result.modifiers[0].name).toBe('preventOverflow') expect(result.modifiers[0].options).toEqual({ padding: 10 }) }) + + it('should keep dropdown fallbacks on the same side on mobile', () => { + jest.spyOn(window, 'matchMedia').mockReturnValue({ + matches: true, + } as MediaQueryList) + const config: Partial = { + placement: 'bottom-start', + modifiers: [ + { + name: 'flip', + fn: function (arg0) { + return + }, + options: { + fallbackPlacements: ['bottom-end', 'top-start', 'top-end'], + }, + }, + ], + } + + const result = pngxPopperOptions(config) + + expect(result.modifiers[0].options.fallbackPlacements).toEqual([ + 'bottom-end', + ]) + }) + + it('should retain all dropdown fallbacks outside mobile layouts', () => { + jest.spyOn(window, 'matchMedia').mockReturnValue({ + matches: false, + } as MediaQueryList) + const fallbackPlacements = ['bottom-end', 'top-start', 'top-end'] + const config: Partial = { + placement: 'bottom-start', + modifiers: [ + { + name: 'flip', + fn: function (arg0) { + return + }, + options: { fallbackPlacements }, + }, + ], + } + + const result = pngxPopperOptions(config) + + expect(result.modifiers[0].options.fallbackPlacements).toEqual( + fallbackPlacements + ) + }) }) diff --git a/src-ui/src/app/utils/popper-options.ts b/src-ui/src/app/utils/popper-options.ts index dd3ec3119..ebd147c47 100644 --- a/src-ui/src/app/utils/popper-options.ts +++ b/src-ui/src/app/utils/popper-options.ts @@ -9,5 +9,21 @@ export function pngxPopperOptions(config: Partial): Partial { padding: 10, } } + + const flipModifier = config.modifiers.find((m) => m.name === 'flip') + const placementSide = config.placement?.split('-')[0] + if ( + flipModifier && + placementSide && + window.matchMedia('(max-width: 575.98px)').matches + ) { + flipModifier.options = { + ...flipModifier.options, + fallbackPlacements: ( + flipModifier.options?.fallbackPlacements ?? [] + ).filter((placement) => placement.startsWith(placementSide)), + } + } + return config } diff --git a/src-ui/src/index.html b/src-ui/src/index.html index 35c9abe3a..de85328f3 100644 --- a/src-ui/src/index.html +++ b/src-ui/src/index.html @@ -4,7 +4,7 @@ Paperless-ngx - +