From ee69cecf313f008fb5a9171fb33ab34b5fc0a1a0 Mon Sep 17 00:00:00 2001 From: Archer <545436317@qq.com> Date: Tue, 27 Jan 2026 13:43:06 +0800 Subject: [PATCH] fix: date picker (#6325) --- document/content/docs/upgrading/4-14/4146.mdx | 1 + document/data/doc-last-modified.json | 2 +- .../common/DateTimePicker/index.tsx | 58 ++++++++++++++----- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/document/content/docs/upgrading/4-14/4146.mdx b/document/content/docs/upgrading/4-14/4146.mdx index c1d16b2904..482051a4bf 100644 --- a/document/content/docs/upgrading/4-14/4146.mdx +++ b/document/content/docs/upgrading/4-14/4146.mdx @@ -40,5 +40,6 @@ curl --location --request POST 'https://{{host}}/api/admin/initv4146' \ ## 🐛 修复 1. 系统工具工具集设置系统密钥后,子工具无法读取到设置的系统密钥 +2. 日期选择器溢出问题,增加了动态位置适配。 ## 插件 diff --git a/document/data/doc-last-modified.json b/document/data/doc-last-modified.json index 550494b770..248e71cca2 100644 --- a/document/data/doc-last-modified.json +++ b/document/data/doc-last-modified.json @@ -123,7 +123,7 @@ "document/content/docs/upgrading/4-14/4143.mdx": "2025-11-26T20:52:05+08:00", "document/content/docs/upgrading/4-14/4144.mdx": "2025-12-16T14:56:04+08:00", "document/content/docs/upgrading/4-14/4145.mdx": "2026-01-18T23:59:15+08:00", - "document/content/docs/upgrading/4-14/41451.mdx": "2026-01-19T19:10:54+08:00", + "document/content/docs/upgrading/4-14/41451.mdx": "2026-01-20T11:53:27+08:00", "document/content/docs/upgrading/4-14/4146.mdx": "2026-01-19T19:10:54+08:00", "document/content/docs/upgrading/4-8/40.mdx": "2025-08-02T19:38:37+08:00", "document/content/docs/upgrading/4-8/41.mdx": "2025-08-02T19:38:37+08:00", diff --git a/packages/web/components/common/DateTimePicker/index.tsx b/packages/web/components/common/DateTimePicker/index.tsx index e32d005937..875fee432f 100644 --- a/packages/web/components/common/DateTimePicker/index.tsx +++ b/packages/web/components/common/DateTimePicker/index.tsx @@ -35,20 +35,49 @@ const DateTimePicker = ({ }, [selectedDateTime]); useEffect(() => { - if (showSelected && containerRef.current) { - const rect = containerRef.current.getBoundingClientRect(); - if (popPosition === 'top') { - setPosition({ - top: rect.top - 4, - left: rect.left - }); - } else { - setPosition({ - top: rect.bottom + 4, - left: rect.left - }); + if (!showSelected) return; + const updatePosition = () => { + const rect = containerRef.current?.getBoundingClientRect(); + const popoverRect = popoverRef.current?.getBoundingClientRect(); + if (!rect || !popoverRect) return; + + const padding = 8; + const topBottom = rect.bottom + 4; + const topTop = rect.top - 4 - popoverRect.height; + const maxTop = window.innerHeight - popoverRect.height - padding; + const maxLeft = window.innerWidth - popoverRect.width - padding; + + let top = popPosition === 'top' ? topTop : topBottom; + if ( + popPosition === 'bottom' && + topBottom + popoverRect.height > window.innerHeight - padding && + topTop >= padding + ) { + top = topTop; } - } + if ( + popPosition === 'top' && + topTop < padding && + topBottom + popoverRect.height <= window.innerHeight - padding + ) { + top = topBottom; + } + top = Math.min(Math.max(top, padding), Math.max(padding, maxTop)); + + let left = rect.left; + left = Math.min(Math.max(left, padding), Math.max(padding, maxLeft)); + + setPosition({ top, left }); + }; + + const raf = requestAnimationFrame(updatePosition); + window.addEventListener('resize', updatePosition); + window.addEventListener('scroll', updatePosition, true); + return () => { + cancelAnimationFrame(raf); + window.removeEventListener('resize', updatePosition); + window.removeEventListener('scroll', updatePosition, true); + }; }, [showSelected, popPosition]); // 点击外部关闭 @@ -99,8 +128,7 @@ const DateTimePicker = ({