Skip to content

Commit 0c58984

Browse files
authored
Enable non portalled rendering for popovers (#612)
1 parent 2de1af9 commit 0c58984

4 files changed

Lines changed: 36 additions & 8 deletions

File tree

src/components/AddExpense/DateSelector.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,15 @@ import { CalendarIcon } from 'lucide-react';
66
import { Calendar } from '../ui/calendar';
77
import type { DayPickerProps, PropsSingleRequired } from 'react-day-picker';
88

9-
export const DateSelector: React.FC<DayPickerProps & PropsSingleRequired> = (calendarProps) => {
9+
type DateSelectorProps = DayPickerProps &
10+
PropsSingleRequired & {
11+
popoverPortalled?: boolean;
12+
};
13+
14+
export const DateSelector: React.FC<DateSelectorProps> = ({
15+
popoverPortalled = true,
16+
...calendarProps
17+
}) => {
1018
const { t, toUIDate } = useTranslationWithUtils();
1119

1220
return (
@@ -28,7 +36,7 @@ export const DateSelector: React.FC<DayPickerProps & PropsSingleRequired> = (cal
2836
)}
2937
</Button>
3038
</PopoverTrigger>
31-
<PopoverContent className="w-auto p-0">
39+
<PopoverContent className="w-auto p-0" portalled={popoverPortalled}>
3240
<Calendar fixedWeeks {...calendarProps} />
3341
</PopoverContent>
3442
</Popover>

src/components/Expense/ExpenseDetails.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,13 @@ export const EditSettlement: React.FC<{ expense: ExpenseDetailsOutput }> = ({ ex
364364
className="mx-auto mt-4 w-37.5 text-center text-lg"
365365
onValueChange={onCurrencyInputValueChange}
366366
/>
367-
<DateSelector mode="single" required selected={expenseDate} onSelect={setExpenseDate} />
367+
<DateSelector
368+
mode="single"
369+
required
370+
selected={expenseDate}
371+
onSelect={setExpenseDate}
372+
popoverPortalled={false}
373+
/>
368374
</div>
369375
</AppDrawer>
370376
);

src/components/Friend/CurrencyConversion.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,7 @@ export const CurrencyConversion: React.FC<{
274274
disabled={dateDisabled}
275275
selected={rateDate}
276276
onSelect={setRateDate}
277+
popoverPortalled={false}
277278
/>
278279
</div>
279280
</div>

src/components/ui/popover.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,18 @@ const Popover = PopoverPrimitive.Root;
77

88
const PopoverTrigger = PopoverPrimitive.Trigger;
99

10+
interface PopoverContentProps extends React.ComponentPropsWithoutRef<
11+
typeof PopoverPrimitive.Content
12+
> {
13+
portalled?: boolean;
14+
container?: HTMLElement | null;
15+
}
16+
1017
const PopoverContent = React.forwardRef<
1118
React.ElementRef<typeof PopoverPrimitive.Content>,
12-
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
13-
>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (
14-
<PopoverPrimitive.Portal>
19+
PopoverContentProps
20+
>(({ className, align = 'center', sideOffset = 4, portalled = true, container, ...props }, ref) => {
21+
const content = (
1522
<PopoverPrimitive.Content
1623
ref={ref}
1724
align={align}
@@ -22,8 +29,14 @@ const PopoverContent = React.forwardRef<
2229
)}
2330
{...props}
2431
/>
25-
</PopoverPrimitive.Portal>
26-
));
32+
);
33+
34+
if (!portalled) {
35+
return content;
36+
}
37+
38+
return <PopoverPrimitive.Portal container={container}>{content}</PopoverPrimitive.Portal>;
39+
});
2740
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
2841

2942
export { Popover, PopoverTrigger, PopoverContent };

0 commit comments

Comments
 (0)