Skip to content

Commit 1ec2feb

Browse files
committed
feat: picker need to receive the placement aligned by popup
1 parent 281bf37 commit 1ec2feb

File tree

5 files changed

+33
-8
lines changed

5 files changed

+33
-8
lines changed

src/PickerInput/Popup/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
8484
onSubmit,
8585
} = props;
8686

87-
const { prefixCls } = React.useContext(PickerContext);
87+
const { prefixCls, alignedPlacement } = React.useContext(PickerContext);
8888
const panelPrefixCls = `${prefixCls}-panel`;
8989

9090
const rtl = direction === 'rtl';
@@ -213,7 +213,7 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
213213
);
214214

215215
if (range) {
216-
const realPlacement = getRealPlacement(placement, rtl);
216+
const realPlacement = getRealPlacement(alignedPlacement || placement, rtl);
217217
const offsetUnit = getoffsetUnit(realPlacement, rtl);
218218
renderNode = (
219219
<div

src/PickerInput/RangePicker.tsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,9 @@ function RangePicker<DateType extends object = any>(
666666
onKeyDown?.(event, preventDefault);
667667
};
668668

669+
// ======================= popup align =======================
670+
const [alignedPlacement, setAlignedPlacement] = React.useState<string>();
671+
669672
// ======================= Context ========================
670673
const context = React.useMemo(
671674
() => ({
@@ -674,8 +677,18 @@ function RangePicker<DateType extends object = any>(
674677
generateConfig,
675678
button: components.button,
676679
input: components.input,
680+
alignedPlacement,
681+
setAlignedPlacement,
677682
}),
678-
[prefixCls, locale, generateConfig, components.button, components.input],
683+
[
684+
prefixCls,
685+
locale,
686+
generateConfig,
687+
components.button,
688+
components.input,
689+
alignedPlacement,
690+
setAlignedPlacement,
691+
],
679692
);
680693

681694
// ======================== Effect ========================

src/PickerInput/Selector/RangeSelector.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ function RangeSelector<DateType extends object = any>(
120120
const rtl = direction === 'rtl';
121121

122122
// ======================== Prefix ========================
123-
const { prefixCls } = React.useContext(PickerContext);
123+
const { prefixCls, alignedPlacement } = React.useContext(PickerContext);
124124

125125
// ========================== Id ==========================
126126
const ids = React.useMemo(() => {
@@ -173,7 +173,7 @@ function RangeSelector<DateType extends object = any>(
173173
});
174174

175175
// ====================== ActiveBar =======================
176-
const realPlacement = getRealPlacement(placement, rtl);
176+
const realPlacement = getRealPlacement(alignedPlacement || placement, rtl);
177177
const offsetUnit = getoffsetUnit(realPlacement, rtl);
178178
const placementRight = realPlacement?.toLowerCase().endsWith('right');
179179
const [activeBarStyle, setActiveBarStyle] = React.useState<React.CSSProperties>({
@@ -186,7 +186,7 @@ function RangeSelector<DateType extends object = any>(
186186
if (input) {
187187
const { offsetWidth, offsetLeft, offsetParent } = input.nativeElement;
188188
const parentWidth = (offsetParent as HTMLElement)?.offsetWidth || 0;
189-
const activeOffset = placementRight ? (parentWidth - offsetWidth - offsetLeft) : offsetLeft;
189+
const activeOffset = placementRight ? parentWidth - offsetWidth - offsetLeft : offsetLeft;
190190
setActiveBarStyle((ori) => ({
191191
...ori,
192192
width: offsetWidth,

src/PickerInput/context.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ export interface PickerContextProps<DateType = any> {
99
/** Customize button component */
1010
button?: Components['button'];
1111
input?: Components['input'];
12-
12+
/** trigger will change placement while aligining */
13+
alignedPlacement?: string;
14+
setAlignedPlacement?: React.Dispatch<React.SetStateAction<string>>;
1315
}
1416

1517
const PickerContext = React.createContext<PickerContextProps>(null!);

src/PickerTrigger/index.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function PickerTrigger({
7777
visible,
7878
onClose,
7979
}: PickerTriggerProps) {
80-
const { prefixCls } = React.useContext(PickerContext);
80+
const { prefixCls, setAlignedPlacement } = React.useContext(PickerContext);
8181
const dropdownPrefixCls = `${prefixCls}-dropdown`;
8282

8383
const realPlacement = getRealPlacement(placement, direction === 'rtl');
@@ -100,6 +100,16 @@ function PickerTrigger({
100100
popupStyle={popupStyle}
101101
stretch="minWidth"
102102
getPopupContainer={getPopupContainer}
103+
onPopupAlign={(_, align) => {
104+
Object.keys(BUILT_IN_PLACEMENTS).forEach((key) => {
105+
if (
106+
BUILT_IN_PLACEMENTS[key].points[0] === align.points[0] &&
107+
BUILT_IN_PLACEMENTS[key].points[1] === align.points[1]
108+
) {
109+
setAlignedPlacement?.(key);
110+
}
111+
});
112+
}}
103113
onPopupVisibleChange={(nextVisible) => {
104114
if (!nextVisible) {
105115
onClose();

0 commit comments

Comments
 (0)