From 2bc0b55e6086f92453dd570dbd5a9c9ed9bc2053 Mon Sep 17 00:00:00 2001 From: puz <13060209078@163.com> Date: Fri, 3 Jul 2026 15:41:45 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E8=B0=83=E6=95=B4=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/business/MeetingDetail.css | 153 +++-- frontend/src/pages/business/MeetingDetail.tsx | 195 +++---- frontend/src/pages/profile/index.less | 423 +++++++------- frontend/src/pages/profile/index.tsx | 529 ++++++++---------- 4 files changed, 642 insertions(+), 658 deletions(-) diff --git a/frontend/src/pages/business/MeetingDetail.css b/frontend/src/pages/business/MeetingDetail.css index ed5376d..44ae5a5 100644 --- a/frontend/src/pages/business/MeetingDetail.css +++ b/frontend/src/pages/business/MeetingDetail.css @@ -13,7 +13,10 @@ } .meeting-detail-section-card { + flex: 1; + height: 100%; min-width: 0; + min-height: 0; } .meeting-detail-section-card .section-card__header { @@ -65,23 +68,34 @@ .meeting-detail-page-v2 .meeting-detail-title-wrap { display: flex; align-items: flex-start; - gap: 16px; + gap: 12px; min-width: 0; max-width: 100%; } -.meeting-detail-page-v2 .meeting-detail-title-icon { - width: 42px; - height: 42px; - flex: 0 0 42px; +.meeting-detail-page-v2 .meeting-detail-back-button { + width: 30px; + height: 30px; + flex: 0 0 30px; display: inline-flex; align-items: center; justify-content: center; + margin-top: 0; + border: 1px solid #d8e3ff; + border-radius: 6px; + background: #ffffff; + color: #3c70f5; line-height: 1; - font-size: 20px; + font-size: 14px; + cursor: pointer; } -.meeting-detail-page-v2 .meeting-detail-title-icon .anticon { +.meeting-detail-page-v2 .meeting-detail-back-button:hover { + border-color: #9cb8ff; + background: #f3f7ff; +} + +.meeting-detail-page-v2 .meeting-detail-back-button .anticon { display: inline-flex; align-items: center; justify-content: center; @@ -92,13 +106,14 @@ min-width: 0; display: flex; flex-direction: column; - gap: 7px; + gap: 6px; } .meeting-detail-page-v2 .meeting-detail-title-row { display: flex; align-items: center; gap: 8px; + min-height: 30px; min-width: 0; max-width: 100%; } @@ -195,6 +210,8 @@ } .meeting-detail-section-content { + flex: 1; + min-height: 0; overflow: hidden; } @@ -202,11 +219,22 @@ position: relative; flex: 1; height: 100%; + display: flex; + flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; } +.meeting-detail-page-v2 .meeting-detail-workspace > .ant-row { + flex: 1; + min-height: 0; +} + +.meeting-detail-page-v2 .meeting-detail-workspace > .ant-row > .ant-col { + min-height: 0; +} + .meeting-detail-page-v2 .detail-side-column { height: 100%; min-height: 0; @@ -214,6 +242,17 @@ padding-right: 4px; } +.meeting-detail-page-v2 .detail-left-column { + overflow: hidden; + max-height: 100%; + overscroll-behavior: contain; +} + +.meeting-detail-page-v2 .detail-left-column .summary-panel { + flex: 1 1 auto; + min-height: 0; +} + .meeting-detail-page-v2 .left-flow-card.ant-card { border: 1px solid #e6e6e6; border-radius: 4px; @@ -268,14 +307,6 @@ padding: 12px; } -.meeting-detail-page-v2 .transcript-player--floating { - z-index: 20; - border: 1px solid #e6e6e6; - border-radius: 4px; - background: #fff; - box-shadow: none; -} - .meeting-detail-page-v2 .transcript-player { padding: 12px 14px !important; border: 1px solid #e6e6e6 !important; @@ -348,7 +379,6 @@ color: #3c70f5 !important; } -.meeting-detail-page-v2 .meeting-detail-title-icon, .meeting-detail-page-v2 .role-detail-icon, .meeting-detail-page-v2 .catalog-timeline-dot, .meeting-detail-page-v2 .chapter-time::after, @@ -357,7 +387,6 @@ box-shadow: none !important; } -.meeting-detail-page-v2 .meeting-detail-title-icon, .meeting-detail-page-v2 .role-detail-icon { border-radius: 4px !important; } @@ -381,12 +410,38 @@ backdrop-filter: none !important; } -.meeting-detail-page-v2 .summary-content-box, .meeting-detail-page-v2 .transcript-keyword-bar, .meeting-detail-page-v2 .empty-transcript-inline-note { background: #f9fafe !important; } +.meeting-detail-page-v2 .summary-panel.left-flow-card, +.meeting-detail-page-v2 .summary-panel.left-flow-card.ant-card { + display: flex; + flex-direction: column; + overflow: hidden; + border-color: #e5e7eb !important; + border-radius: 12px !important; + background: #ffffff !important; +} + +.meeting-detail-page-v2 .summary-panel .ant-card-body { + flex: 1 1 auto; + min-height: 0; + overflow-y: auto; + overflow-x: hidden; + padding: 24px !important; + background: #ffffff !important; +} + +.meeting-detail-page-v2 .summary-content-box { + min-height: 0; + padding: 0 !important; + border: 0 !important; + border-radius: 0 !important; + background: #ffffff !important; +} + .meeting-detail-page-v2 .meeting-detail-title-text { color: #333333 !important; font-size: 18px !important; @@ -577,14 +632,14 @@ @media (max-width: 768px) { .meeting-detail-page-v2 .meeting-detail-title-wrap { - gap: 12px; + gap: 10px; } - .meeting-detail-page-v2 .meeting-detail-title-icon { - width: 38px; - height: 38px; - flex-basis: 38px; - font-size: 18px; + .meeting-detail-page-v2 .meeting-detail-back-button { + width: 28px; + height: 28px; + flex-basis: 28px; + font-size: 13px; } .meeting-detail-page-v2 .meeting-detail-title-text { @@ -678,49 +733,77 @@ } .meeting-detail-page-v2 .transcript-scroll-shell { + flex: 1 1 auto; + min-height: 0; + overflow-y: auto; + overflow-x: hidden; padding: 24px 20px 18px 18px !important; background: #ffffff !important; } -.meeting-detail-page-v2 .transcript-player.transcript-player--floating { +.meeting-detail-page-v2 .transcript-player.transcript-player--embedded { display: flex; align-items: center; gap: 14px; - padding: 14px 16px !important; + flex: 0 0 auto; + min-height: 72px; + margin: 0; + padding: 13px 18px !important; border: 0 !important; - border-radius: 18px !important; - background: rgba(255, 255, 255, 0.96) !important; - box-shadow: 0 16px 40px rgba(20, 35, 70, 0.16) !important; - backdrop-filter: blur(12px) !important; + border-top: 1px solid #e5e7eb !important; + border-radius: 0 !important; + background: #ffffff !important; + box-shadow: none !important; + backdrop-filter: none !important; } .meeting-detail-page-v2 .transcript-player .player-main-btn { - width: 46px !important; - height: 46px !important; - flex: 0 0 46px; + width: 40px !important; + height: 40px !important; + flex: 0 0 40px; + padding: 0 !important; border: 0 !important; border-radius: 50% !important; background: linear-gradient(135deg, #3c70f5 0%, #6b8cff 100%) !important; color: #ffffff !important; - box-shadow: 0 10px 24px rgba(60, 112, 245, 0.32) !important; + font-size: 16px; + line-height: 1; + box-shadow: 0 8px 20px rgba(60, 112, 245, 0.28) !important; +} + +.meeting-detail-page-v2 .transcript-player .player-main-btn .anticon { + display: inline-flex; + align-items: center; + justify-content: center; + line-height: 1; + transform: translate(1px, 1px); +} + +.meeting-detail-page-v2 .transcript-player .player-main-btn .anticon-pause { + transform: none; } .meeting-detail-page-v2 .transcript-player .player-ghost-btn { height: 36px !important; + align-self: center; + padding: 0 14px !important; border: 1px solid #dce6ff !important; border-radius: 999px !important; background: #f4f7ff !important; color: #3c70f5 !important; + line-height: 1; box-shadow: none !important; } .meeting-detail-page-v2 .transcript-player .player-progress-shell { flex: 1; min-width: 0; + gap: 6px; } .meeting-detail-page-v2 .transcript-player .player-range { height: 6px !important; + margin: 0; border-radius: 999px !important; background: linear-gradient( 90deg, diff --git a/frontend/src/pages/business/MeetingDetail.tsx b/frontend/src/pages/business/MeetingDetail.tsx index 2d6c07c..3bd5f3b 100644 --- a/frontend/src/pages/business/MeetingDetail.tsx +++ b/frontend/src/pages/business/MeetingDetail.tsx @@ -9,7 +9,6 @@ import { DownloadOutlined, EditOutlined, FastForwardOutlined, - FileTextOutlined, LeftOutlined, LinkOutlined, LoadingOutlined, @@ -1242,10 +1241,6 @@ const MeetingDetail: React.FC = () => { const transcriptItemRefs = useRef>({}); const pendingTranscriptScrollIdRef = useRef(null); - const leftColumnRef = useRef(null); - const transcriptSectionRef = useRef(null); - const [showFloatingTranscriptPlayer, setShowFloatingTranscriptPlayer] = useState(false); - const [floatingTranscriptPlayerLayout, setFloatingTranscriptPlayerLayout] = useState<{ left: number; width: number } | null>(null); const [generationProgress, setGenerationProgress] = useState(null); const autoOpenedCatalogAttemptRef = useRef(null); @@ -1559,60 +1554,6 @@ const MeetingDetail: React.FC = () => { meeting?.status, ]); - useEffect(() => { - if (!playbackAudioUrl) { - setShowFloatingTranscriptPlayer(false); - setFloatingTranscriptPlayerLayout(null); - return undefined; - } - - const updateFloatingPlayerState = () => { - const target = transcriptSectionRef.current; - if (!target) { - setShowFloatingTranscriptPlayer(false); - setFloatingTranscriptPlayerLayout(null); - return; - } - - const rect = target.getBoundingClientRect(); - const rootRect = leftColumnRef.current?.getBoundingClientRect(); - - setFloatingTranscriptPlayerLayout({ - left: rect.left, - width: rect.width, - }); - - if (rootRect) { - const isVisible = rect.bottom > rootRect.top + 80 && rect.top < rootRect.bottom - 40; - setShowFloatingTranscriptPlayer(isVisible); - return; - } - - const isVisible = rect.bottom > 120 && rect.top < window.innerHeight - 80; - setShowFloatingTranscriptPlayer(isVisible); - }; - - updateFloatingPlayerState(); - - const target = transcriptSectionRef.current; - const root = leftColumnRef.current; - const resizeObserver = target ? new ResizeObserver(() => updateFloatingPlayerState()) : null; - if (target && resizeObserver) { - resizeObserver.observe(target); - } - - window.addEventListener('resize', updateFloatingPlayerState); - window.addEventListener('scroll', updateFloatingPlayerState, { passive: true }); - root?.addEventListener('scroll', updateFloatingPlayerState, { passive: true }); - - return () => { - window.removeEventListener('resize', updateFloatingPlayerState); - window.removeEventListener('scroll', updateFloatingPlayerState); - root?.removeEventListener('scroll', updateFloatingPlayerState); - resizeObserver?.disconnect(); - }; - }, [meeting?.status, playbackAudioUrl]); - useEffect(() => { if (!id) return; fetchData(Number(id)); @@ -2371,9 +2312,9 @@ const MeetingDetail: React.FC = () => { contentClassName="meeting-detail-section-content" title={(
-
- -
+
{meeting.title} @@ -2410,9 +2351,6 @@ const MeetingDetail: React.FC = () => { )} extra={( - {canRetrySchedule && ( +
+
+ {formatPlayerTime(audioCurrentTime)} + {formatPlayerTime(audioDuration)} +
+ +
+ +
+ )}
)} @@ -2915,37 +2879,6 @@ const MeetingDetail: React.FC = () => {
- {playbackAudioUrl && showFloatingTranscriptPlayer && floatingTranscriptPlayerLayout && ( -
- -
-
- {formatPlayerTime(audioCurrentTime)} - {formatPlayerTime(audioDuration)} -
- -
- -
- )} -