feat: 会议中心界面优化
parent
6476b23bb6
commit
77879f4e0e
|
|
@ -741,6 +741,48 @@
|
||||||
background: #ffffff !important;
|
background: #ffffff !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .ant-list-item.transcript-row {
|
||||||
|
display: block !important;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .transcript-entry {
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
display: grid !important;
|
||||||
|
grid-template-columns: 32px minmax(0, 1fr);
|
||||||
|
gap: 12px;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .transcript-content-wrap,
|
||||||
|
.meeting-detail-page-v2 .transcript-meta,
|
||||||
|
.meeting-detail-page-v2 .transcript-bubble,
|
||||||
|
.meeting-detail-page-v2 .transcript-bubble-editing {
|
||||||
|
min-width: 0;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .transcript-avatar {
|
||||||
|
align-self: start;
|
||||||
|
margin-top: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .transcript-meta {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 32px;
|
||||||
|
gap: 6px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .transcript-speaker {
|
||||||
|
max-width: min(100%, 180px);
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
.meeting-detail-page-v2 .transcript-player.transcript-player--embedded {
|
.meeting-detail-page-v2 .transcript-player.transcript-player--embedded {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
@ -845,4 +887,13 @@
|
||||||
.meeting-detail-page-v2 .transcript-panel-header .transcript-stage-tabs button {
|
.meeting-detail-page-v2 .transcript-panel-header .transcript-stage-tabs button {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .transcript-entry {
|
||||||
|
grid-template-columns: 28px minmax(0, 1fr);
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-detail-page-v2 .transcript-meta {
|
||||||
|
min-height: 28px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,6 @@ import {
|
||||||
MeetingTranscriptVO,
|
MeetingTranscriptVO,
|
||||||
MeetingVO,
|
MeetingVO,
|
||||||
reSummary,
|
reSummary,
|
||||||
resolveAudioMimeType,
|
|
||||||
resolveMeetingPlaybackAudioUrl,
|
resolveMeetingPlaybackAudioUrl,
|
||||||
retryMeetingChapter,
|
retryMeetingChapter,
|
||||||
retryMeetingSummary,
|
retryMeetingSummary,
|
||||||
|
|
@ -1738,11 +1737,27 @@ const MeetingDetail: React.FC = () => {
|
||||||
setSummaryVisible(true);
|
setSummaryVisible(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleAudioPlaybackError = useCallback(() => {
|
||||||
|
const currentAudioUrl = playbackAudioUrl || '';
|
||||||
|
if (!currentAudioUrl || audioPlaybackErrorShownRef.current === currentAudioUrl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const normalizedUrl = currentAudioUrl.split('#')[0]?.split('?')[0]?.toLowerCase() || '';
|
||||||
|
const isM4a = normalizedUrl.endsWith('.m4a');
|
||||||
|
message.warning(
|
||||||
|
isM4a
|
||||||
|
? '当前 m4a 文件在本机浏览器中无法直接播放。已确认文件与服务端响应基本正常,更可能是浏览器对该录音参数或容器实现的兼容性问题。建议优先使用 mp3、wav,或下载到本地播放。'
|
||||||
|
: '当前音频文件无法播放,请检查文件是否损坏或格式是否兼容。',
|
||||||
|
);
|
||||||
|
audioPlaybackErrorShownRef.current = currentAudioUrl;
|
||||||
|
setAudioPlaying(false);
|
||||||
|
}, [message, playbackAudioUrl]);
|
||||||
|
|
||||||
const seekTo = useCallback((timeMs: number) => {
|
const seekTo = useCallback((timeMs: number) => {
|
||||||
if (!audioRef.current) return;
|
if (!audioRef.current) return;
|
||||||
audioRef.current.currentTime = timeMs / 1000;
|
audioRef.current.currentTime = timeMs / 1000;
|
||||||
audioRef.current.play();
|
audioRef.current.play().catch(() => handleAudioPlaybackError());
|
||||||
}, []);
|
}, [handleAudioPlaybackError]);
|
||||||
|
|
||||||
const handleTranscriptRowPlay = useCallback((timeMs: number) => {
|
const handleTranscriptRowPlay = useCallback((timeMs: number) => {
|
||||||
setLinkedTranscriptIds([]);
|
setLinkedTranscriptIds([]);
|
||||||
|
|
@ -1948,22 +1963,6 @@ const MeetingDetail: React.FC = () => {
|
||||||
transcriptItemRefs.current[transcriptId] = node;
|
transcriptItemRefs.current[transcriptId] = node;
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const handleAudioPlaybackError = useCallback(() => {
|
|
||||||
const currentAudioUrl = playbackAudioUrl || '';
|
|
||||||
if (!currentAudioUrl || audioPlaybackErrorShownRef.current === currentAudioUrl) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const normalizedUrl = currentAudioUrl.split('#')[0]?.split('?')[0]?.toLowerCase() || '';
|
|
||||||
const isM4a = normalizedUrl.endsWith('.m4a');
|
|
||||||
message.warning(
|
|
||||||
isM4a
|
|
||||||
? '当前 m4a 文件在本机浏览器中无法直接播放。已确认文件与服务端响应基本正常,更可能是浏览器对该录音参数或容器实现的兼容性问题。建议优先使用 mp3、wav,或下载到本地播放。'
|
|
||||||
: '当前音频文件无法播放,请检查文件是否损坏或格式是否兼容。',
|
|
||||||
);
|
|
||||||
audioPlaybackErrorShownRef.current = currentAudioUrl;
|
|
||||||
setAudioPlaying(false);
|
|
||||||
}, [message, playbackAudioUrl]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const audio = audioRef.current;
|
const audio = audioRef.current;
|
||||||
if (!audio) return undefined;
|
if (!audio) return undefined;
|
||||||
|
|
@ -2004,10 +2003,23 @@ const MeetingDetail: React.FC = () => {
|
||||||
};
|
};
|
||||||
}, [audioPlaybackRate, meeting?.status, playbackAudioUrl, handleAudioPlaybackError]);
|
}, [audioPlaybackRate, meeting?.status, playbackAudioUrl, handleAudioPlaybackError]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const audio = audioRef.current;
|
||||||
|
if (!audio) return;
|
||||||
|
|
||||||
|
audio.pause();
|
||||||
|
audio.load();
|
||||||
|
audio.playbackRate = 1;
|
||||||
|
setAudioPlaybackRate(1);
|
||||||
|
setAudioCurrentTime(0);
|
||||||
|
setAudioDuration(0);
|
||||||
|
setAudioPlaying(false);
|
||||||
|
}, [playbackAudioUrl]);
|
||||||
|
|
||||||
const toggleAudioPlayback = () => {
|
const toggleAudioPlayback = () => {
|
||||||
if (!audioRef.current) return;
|
if (!audioRef.current) return;
|
||||||
if (audioRef.current.paused) {
|
if (audioRef.current.paused) {
|
||||||
audioRef.current.play();
|
audioRef.current.play().catch(() => handleAudioPlaybackError());
|
||||||
} else {
|
} else {
|
||||||
audioRef.current.pause();
|
audioRef.current.pause();
|
||||||
}
|
}
|
||||||
|
|
@ -2658,11 +2670,6 @@ const MeetingDetail: React.FC = () => {
|
||||||
|
|
||||||
<div className="transcript-player-anchor">
|
<div className="transcript-player-anchor">
|
||||||
<Card className="left-flow-card" variant="borderless" title={<Space size={8}><AudioOutlined />原文</Space>}>
|
<Card className="left-flow-card" variant="borderless" title={<Space size={8}><AudioOutlined />原文</Space>}>
|
||||||
{playbackAudioUrl && (
|
|
||||||
<audio ref={audioRef} style={{ display: 'none' }} preload="auto">
|
|
||||||
<source src={playbackAudioUrl} type={resolveAudioMimeType(playbackAudioUrl)} />
|
|
||||||
</audio>
|
|
||||||
)}
|
|
||||||
{emptyTranscriptFailureNotice && (
|
{emptyTranscriptFailureNotice && (
|
||||||
<div className="empty-transcript-inline-note">
|
<div className="empty-transcript-inline-note">
|
||||||
<div className="empty-transcript-inline-note__title">当前没有可展示的转录内容</div>
|
<div className="empty-transcript-inline-note__title">当前没有可展示的转录内容</div>
|
||||||
|
|
@ -2715,9 +2722,7 @@ const MeetingDetail: React.FC = () => {
|
||||||
styles={{ body: { padding: 0, height: '100%', display: 'flex', flexDirection: 'column', minHeight: 0 } }}
|
styles={{ body: { padding: 0, height: '100%', display: 'flex', flexDirection: 'column', minHeight: 0 } }}
|
||||||
>
|
>
|
||||||
{playbackAudioUrl && (
|
{playbackAudioUrl && (
|
||||||
<audio ref={audioRef} style={{ display: 'none' }} preload="auto">
|
<audio ref={audioRef} src={playbackAudioUrl} style={{ display: 'none' }} preload="auto" />
|
||||||
<source src={playbackAudioUrl} type={resolveAudioMimeType(playbackAudioUrl)} />
|
|
||||||
</audio>
|
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div className="transcript-panel-header">
|
<div className="transcript-panel-header">
|
||||||
|
|
@ -3854,10 +3859,8 @@ const MeetingDetail: React.FC = () => {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.ant-list-item.transcript-row {
|
.ant-list-item.transcript-row {
|
||||||
display: flex !important;
|
display: block !important;
|
||||||
justify-content: flex-start !important;
|
min-width: 0;
|
||||||
align-items: flex-start !important;
|
|
||||||
gap: 12px;
|
|
||||||
padding: 12px 0 !important;
|
padding: 12px 0 !important;
|
||||||
border-bottom: 0 !important;
|
border-bottom: 0 !important;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
@ -3877,14 +3880,13 @@ const MeetingDetail: React.FC = () => {
|
||||||
box-shadow: 0 12px 28px rgba(60, 112, 245, 0.12);
|
box-shadow: 0 12px 28px rgba(60, 112, 245, 0.12);
|
||||||
}
|
}
|
||||||
.transcript-entry {
|
.transcript-entry {
|
||||||
flex: 1;
|
|
||||||
justify-self: start;
|
|
||||||
text-align: left;
|
|
||||||
display: flex;
|
|
||||||
align-items: flex-start;
|
|
||||||
gap: 16px;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
display: grid !important;
|
||||||
|
grid-template-columns: 32px minmax(0, 1fr);
|
||||||
|
gap: 12px;
|
||||||
|
align-items: flex-start;
|
||||||
|
text-align: left;
|
||||||
}
|
}
|
||||||
.transcript-content-wrap {
|
.transcript-content-wrap {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|
@ -3892,22 +3894,31 @@ const MeetingDetail: React.FC = () => {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
.transcript-meta {
|
.transcript-meta {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8px;
|
gap: 6px 8px;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
min-height: 32px;
|
||||||
|
min-width: 0;
|
||||||
|
max-width: 100%;
|
||||||
color: #8e98b8;
|
color: #8e98b8;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
.transcript-avatar {
|
.transcript-avatar {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
align-self: start;
|
||||||
background: linear-gradient(135deg, #d9ebff, #eaf2ff) !important;
|
background: linear-gradient(135deg, #d9ebff, #eaf2ff) !important;
|
||||||
color: #4362ff !important;
|
color: #4362ff !important;
|
||||||
margin-top: 4px;
|
margin-top: 0 !important;
|
||||||
}
|
}
|
||||||
.transcript-speaker {
|
.transcript-speaker {
|
||||||
|
max-width: min(100%, 180px);
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
color: var(--app-text-main);
|
color: var(--app-text-main);
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,6 @@ import ReactMarkdown from "react-markdown";
|
||||||
import {
|
import {
|
||||||
getMeetingPreviewAccess,
|
getMeetingPreviewAccess,
|
||||||
getPublicMeetingPreview,
|
getPublicMeetingPreview,
|
||||||
resolveAudioMimeType,
|
|
||||||
resolveMeetingPlaybackAudioUrl,
|
resolveMeetingPlaybackAudioUrl,
|
||||||
type MeetingChapterVO,
|
type MeetingChapterVO,
|
||||||
type MeetingTranscriptVO,
|
type MeetingTranscriptVO,
|
||||||
|
|
@ -524,6 +523,20 @@ export default function MeetingPreview() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const audio = audioRef.current;
|
||||||
|
if (!audio) return;
|
||||||
|
|
||||||
|
audio.pause();
|
||||||
|
audio.load();
|
||||||
|
audio.playbackRate = 1;
|
||||||
|
setAudioPlaybackRate(1);
|
||||||
|
setAudioCurrentTime(0);
|
||||||
|
setAudioDuration(0);
|
||||||
|
setAudioPlaying(false);
|
||||||
|
setActiveTranscriptId(null);
|
||||||
|
}, [playbackAudioUrl]);
|
||||||
|
|
||||||
const handleAudioError = () => {
|
const handleAudioError = () => {
|
||||||
const currentAudioUrl = playbackAudioUrl || "";
|
const currentAudioUrl = playbackAudioUrl || "";
|
||||||
if (!currentAudioUrl || audioPlaybackErrorShownRef.current === currentAudioUrl) {
|
if (!currentAudioUrl || audioPlaybackErrorShownRef.current === currentAudioUrl) {
|
||||||
|
|
@ -997,6 +1010,7 @@ export default function MeetingPreview() {
|
||||||
>
|
>
|
||||||
<audio
|
<audio
|
||||||
ref={audioRef}
|
ref={audioRef}
|
||||||
|
src={playbackAudioUrl}
|
||||||
onTimeUpdate={handleAudioTimeUpdate}
|
onTimeUpdate={handleAudioTimeUpdate}
|
||||||
onPlay={handleAudioPlay}
|
onPlay={handleAudioPlay}
|
||||||
onPause={handleAudioPause}
|
onPause={handleAudioPause}
|
||||||
|
|
@ -1005,9 +1019,7 @@ export default function MeetingPreview() {
|
||||||
onError={handleAudioError}
|
onError={handleAudioError}
|
||||||
style={{ display: "none" }}
|
style={{ display: "none" }}
|
||||||
preload="auto"
|
preload="auto"
|
||||||
>
|
/>
|
||||||
<source src={playbackAudioUrl} type={resolveAudioMimeType(playbackAudioUrl)} />
|
|
||||||
</audio>
|
|
||||||
|
|
||||||
<div className="audio-player-content">
|
<div className="audio-player-content">
|
||||||
<button type="button" className="audio-play-btn" onClick={toggleAudioPlayback}>
|
<button type="button" className="audio-play-btn" onClick={toggleAudioPlayback}>
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.meetings-list-panel--cards .data-list-panel__table-area .app-page__table-wrap {
|
.meetings-list-panel--cards .data-list-panel__table-area .app-page__table-wrap {
|
||||||
|
height: 100%;
|
||||||
|
min-height: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -88,24 +92,48 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.meetings-card-scroll {
|
.meetings-card-scroll {
|
||||||
|
--meeting-card-columns: 4;
|
||||||
|
--meeting-card-rows: 3;
|
||||||
|
--meeting-card-grid-gap: clamp(8px, 0.9cqw, 12px);
|
||||||
|
--meeting-card-grid-min-height: clamp(156px, 14vh, 172px);
|
||||||
|
flex: 1 1 auto;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
|
container-type: inline-size;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: 6px 8px 12px;
|
padding: clamp(4px, 0.6cqw, 6px) clamp(6px, 0.8cqw, 8px) clamp(8px, 1cqw, 12px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meetings-card-scroll .ant-skeleton,
|
||||||
|
.meetings-card-scroll .ant-spin-nested-loading,
|
||||||
|
.meetings-card-scroll .ant-spin-container,
|
||||||
.meetings-card-scroll .ant-list {
|
.meetings-card-scroll .ant-list {
|
||||||
min-height: 100%;
|
flex: 1 1 auto;
|
||||||
}
|
height: 100%;
|
||||||
|
min-height: 0;
|
||||||
.meetings-card-scroll .ant-list .ant-row {
|
|
||||||
align-items: stretch;
|
|
||||||
row-gap: 10px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.meetings-card-scroll .ant-list .ant-col {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-card-scroll .ant-list-items {
|
||||||
|
flex: 1 1 auto;
|
||||||
|
min-height: 100%;
|
||||||
|
height: auto;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(var(--meeting-card-columns), minmax(0, 1fr));
|
||||||
|
grid-auto-rows: minmax(var(--meeting-card-grid-min-height), 1fr);
|
||||||
|
gap: var(--meeting-card-grid-gap);
|
||||||
|
align-items: stretch;
|
||||||
|
align-content: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-card-scroll--full-page .ant-list-items {
|
||||||
|
height: 100%;
|
||||||
|
min-height: 0;
|
||||||
|
grid-template-rows: repeat(var(--meeting-card-rows), minmax(var(--meeting-card-grid-min-height), 1fr));
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-list-item.ant-list-item {
|
.meeting-card-list-item.ant-list-item {
|
||||||
|
|
@ -115,15 +143,31 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2.ant-card {
|
.meeting-card-v2.ant-card {
|
||||||
|
--meeting-card-title-font-size: clamp(12px, 4cqw, 16px);
|
||||||
|
--meeting-card-title-line-height: clamp(17px, 5.4cqw, 23px);
|
||||||
|
--meeting-card-meta-font-size: clamp(11px, 3.2cqw, 13px);
|
||||||
|
--meeting-card-meta-icon-size: clamp(12px, 3.6cqw, 15px);
|
||||||
|
--meeting-card-chip-font-size: clamp(10px, 3cqw, 12px);
|
||||||
|
--meeting-card-chip-height: clamp(21px, 6.6cqw, 28px);
|
||||||
|
--meeting-card-chip-line-height: calc(var(--meeting-card-chip-height) - 2px);
|
||||||
|
--meeting-card-status-icon-size: clamp(11px, 3.4cqw, 14px);
|
||||||
|
--meeting-card-footer-tag-line-height: clamp(15px, 4.8cqw, 22px);
|
||||||
|
--meeting-card-dot-size: clamp(6px, 1.6cqw, 7px);
|
||||||
|
--meeting-card-body-padding-block: clamp(9px, 3.2cqw, 14px);
|
||||||
|
--meeting-card-body-padding-inline: clamp(10px, 3.4cqw, 16px);
|
||||||
|
--meeting-card-body-row-gap: clamp(5px, 1.9cqw, 9px);
|
||||||
|
--meeting-card-body-min-height: clamp(17px, 5cqw, 22px);
|
||||||
|
--meeting-card-inline-gap: clamp(4px, 1.6cqw, 8px);
|
||||||
|
--meeting-card-footer-padding-top: clamp(5px, 2.2cqw, 9px);
|
||||||
|
container-type: inline-size;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 156px;
|
height: 100%;
|
||||||
min-height: 156px;
|
min-height: 0;
|
||||||
max-height: 156px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
border: none !important;
|
border: none !important;
|
||||||
border-radius: 16px !important;
|
border-radius: 8px !important;
|
||||||
background: #fff !important;
|
background: #fff !important;
|
||||||
box-shadow:
|
box-shadow:
|
||||||
0 10px 26px rgba(24, 39, 75, 0.07),
|
0 10px 26px rgba(24, 39, 75, 0.07),
|
||||||
|
|
@ -160,27 +204,29 @@
|
||||||
.meeting-card-v2 .ant-card-body {
|
.meeting-card-v2 .ant-card-body {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
display: flex;
|
display: grid;
|
||||||
flex-direction: column;
|
grid-template-rows: auto auto minmax(var(--meeting-card-body-min-height), 1fr) auto;
|
||||||
padding: 11px 14px !important;
|
row-gap: var(--meeting-card-body-row-gap);
|
||||||
|
overflow: hidden;
|
||||||
|
padding: var(--meeting-card-body-padding-block) var(--meeting-card-body-padding-inline) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-status-tag {
|
.meeting-status-tag {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
height: 24px;
|
height: var(--meeting-card-chip-height);
|
||||||
position: relative;
|
position: relative;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 4px;
|
gap: clamp(3px, 1.1cqw, 4px);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 0 8px;
|
padding: 0 clamp(6px, 2cqw, 8px);
|
||||||
border: 1px solid var(--meeting-status-border);
|
border: 1px solid var(--meeting-status-border);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background: var(--meeting-status-bg);
|
background: var(--meeting-status-bg);
|
||||||
color: var(--meeting-status-color);
|
color: var(--meeting-status-color);
|
||||||
font-size: 12px;
|
font-size: var(--meeting-card-meta-font-size);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
line-height: 22px;
|
line-height: var(--meeting-card-chip-line-height);
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -197,22 +243,30 @@
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
|
font-size: var(--meeting-card-status-icon-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-status-tag__spin-icon {
|
.meeting-status-tag__spin-icon {
|
||||||
font-size: 11px;
|
font-size: var(--meeting-card-status-icon-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-status-tag__percent {
|
.meeting-status-tag__percent {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
color: var(--meeting-status-color);
|
color: var(--meeting-status-color);
|
||||||
font-size: 11px;
|
font-size: var(--meeting-card-chip-font-size);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meeting-status-tag > span:not(.meeting-status-tag__icon):not(.meeting-status-tag__percent) {
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
.meeting-status-tag--card,
|
.meeting-status-tag--card,
|
||||||
.meeting-status-tag--table {
|
.meeting-status-tag--table {
|
||||||
width: 155px;
|
width: auto;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__top,
|
.meeting-card-v2__top,
|
||||||
|
|
@ -220,7 +274,6 @@
|
||||||
.meeting-card-v2__status-inner,
|
.meeting-card-v2__status-inner,
|
||||||
.meeting-card-v2__meta,
|
.meeting-card-v2__meta,
|
||||||
.meeting-card-v2__meta-item,
|
.meeting-card-v2__meta-item,
|
||||||
.meeting-card-v2__tags,
|
|
||||||
.meeting-card-v2__owner,
|
.meeting-card-v2__owner,
|
||||||
.meeting-card-v2__top-actions,
|
.meeting-card-v2__top-actions,
|
||||||
.meeting-card-v2__source {
|
.meeting-card-v2__source {
|
||||||
|
|
@ -229,38 +282,61 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__top {
|
.meeting-card-v2__top {
|
||||||
justify-content: space-between;
|
display: grid;
|
||||||
gap: 8px;
|
grid-template-columns: minmax(0, 1fr) auto;
|
||||||
margin-bottom: 8px;
|
align-items: center;
|
||||||
|
gap: var(--meeting-card-inline-gap);
|
||||||
|
min-height: var(--meeting-card-chip-height);
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__top > .meeting-status-tag {
|
||||||
|
flex: 0 1 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__top > .meeting-status-tag--card {
|
||||||
|
width: fit-content;
|
||||||
|
max-width: clamp(86px, 54%, 176px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__top-actions {
|
.meeting-card-v2__top-actions {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
flex-shrink: 0;
|
flex: 0 0 auto;
|
||||||
|
display: grid;
|
||||||
|
grid-auto-flow: column;
|
||||||
|
grid-auto-columns: max-content;
|
||||||
|
align-items: center;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
gap: 6px;
|
gap: clamp(3px, 1.4cqw, 6px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__source {
|
.meeting-card-v2__source {
|
||||||
max-width: 98px;
|
max-width: clamp(58px, 30cqw, 112px);
|
||||||
flex-shrink: 0;
|
height: var(--meeting-card-chip-height);
|
||||||
gap: 5px;
|
flex: 0 1 auto;
|
||||||
padding: 1px 7px;
|
gap: clamp(3px, 1.3cqw, 5px);
|
||||||
|
padding: 0 clamp(5px, 1.8cqw, 8px);
|
||||||
border: 1px solid #e6e6e6;
|
border: 1px solid #e6e6e6;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
color: var(--meeting-source-color);
|
color: var(--meeting-source-color);
|
||||||
background: #fff;
|
background: #fff;
|
||||||
font-size: 11px;
|
font-size: var(--meeting-card-chip-font-size);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
line-height: 20px;
|
line-height: var(--meeting-card-chip-line-height);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__source-text {
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
|
||||||
.meeting-card-v2__source-dot {
|
.meeting-card-v2__source-dot {
|
||||||
width: 6px;
|
width: var(--meeting-card-dot-size);
|
||||||
height: 6px;
|
height: var(--meeting-card-dot-size);
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: var(--meeting-source-color);
|
background: var(--meeting-source-color);
|
||||||
|
|
@ -269,7 +345,7 @@
|
||||||
.meeting-card-v2__title-row {
|
.meeting-card-v2__title-row {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 8px;
|
min-height: var(--meeting-card-title-line-height);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__title.ant-typography {
|
.meeting-card-v2__title.ant-typography {
|
||||||
|
|
@ -277,9 +353,9 @@
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin: 0 !important;
|
margin: 0 !important;
|
||||||
color: #333;
|
color: #333;
|
||||||
font-size: 14px;
|
font-size: var(--meeting-card-title-font-size);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
line-height: 22px;
|
line-height: var(--meeting-card-title-line-height);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__actions {
|
.meeting-card-v2__actions {
|
||||||
|
|
@ -287,8 +363,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__actions .ant-btn {
|
.meeting-card-v2__actions .ant-btn {
|
||||||
width: 24px;
|
width: var(--meeting-card-chip-height);
|
||||||
height: 24px;
|
height: var(--meeting-card-chip-height);
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
border: 1px solid #f0f0f0;
|
border: 1px solid #f0f0f0;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
|
|
@ -299,7 +375,9 @@
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 8px;
|
justify-content: center;
|
||||||
|
gap: var(--meeting-card-body-row-gap);
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__status-note {
|
.meeting-card-v2__status-note {
|
||||||
|
|
@ -310,23 +388,26 @@
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
font-size: 12px;
|
font-size: var(--meeting-card-meta-font-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__status-inner {
|
.meeting-card-v2__status-inner {
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
gap: 8px;
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
gap: var(--meeting-card-inline-gap);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__status-text {
|
.meeting-card-v2__status-text {
|
||||||
|
flex: 1 1 auto;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
max-width: 240px;
|
max-width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 6px;
|
gap: clamp(3px, 1.4cqw, 6px);
|
||||||
color: var(--meeting-progress-color);
|
color: var(--meeting-progress-color);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
line-height: 20px;
|
line-height: var(--meeting-card-title-line-height);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__status-text span {
|
.meeting-card-v2__status-text span {
|
||||||
|
|
@ -336,79 +417,93 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__retry.ant-btn {
|
.meeting-card-v2__retry.ant-btn {
|
||||||
height: 20px;
|
height: var(--meeting-card-chip-height);
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
margin-left: 2px;
|
margin-left: 2px;
|
||||||
padding-inline: 0;
|
padding-inline: 0;
|
||||||
font-size: 12px;
|
font-size: var(--meeting-card-meta-font-size);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
line-height: 20px;
|
line-height: var(--meeting-card-chip-line-height);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__meta {
|
.meeting-card-v2__meta {
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 12px;
|
gap: clamp(6px, 3cqw, 12px);
|
||||||
color: #9095a1;
|
color: #9095a1;
|
||||||
font-size: 12px;
|
font-size: var(--meeting-card-meta-font-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__meta-item {
|
.meeting-card-v2__meta-item {
|
||||||
|
min-width: 0;
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__meta-item span {
|
||||||
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
.meeting-card-v2__meta-item .anticon {
|
.meeting-card-v2__meta-item .anticon {
|
||||||
color: #9095a1;
|
color: #9095a1;
|
||||||
font-size: 13px;
|
font-size: var(--meeting-card-meta-icon-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__footer {
|
.meeting-card-v2__footer {
|
||||||
justify-content: space-between;
|
display: grid;
|
||||||
gap: 10px;
|
grid-template-columns: minmax(0, 1fr) auto;
|
||||||
margin-top: auto;
|
align-items: center;
|
||||||
padding-top: 8px;
|
gap: clamp(5px, 2.4cqw, 10px);
|
||||||
|
min-height: calc(var(--meeting-card-chip-height) + var(--meeting-card-footer-padding-top) + 2px);
|
||||||
|
min-width: 0;
|
||||||
|
padding-top: var(--meeting-card-footer-padding-top);
|
||||||
border-top: 1px solid #f0f0f0;
|
border-top: 1px solid #f0f0f0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__tags {
|
.meeting-card-v2__tags {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
flex: 1;
|
display: flex;
|
||||||
gap: 4px;
|
align-items: center;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
gap: clamp(3px, 1.1cqw, 4px);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__tag {
|
.meeting-card-v2__tag {
|
||||||
max-width: 90px;
|
flex: 0 1 auto;
|
||||||
|
max-width: clamp(62px, 46%, 176px);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 1px 7px;
|
padding: 1px clamp(5px, 1.8cqw, 7px);
|
||||||
border: 1px solid #e6e6e6;
|
border: 1px solid #e6e6e6;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
background: #f9fafe;
|
background: #f9fafe;
|
||||||
color: #596275;
|
color: #596275;
|
||||||
font-size: 11px;
|
font-size: var(--meeting-card-chip-font-size);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
line-height: 18px;
|
line-height: var(--meeting-card-footer-tag-line-height);
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__tag-empty {
|
.meeting-card-v2__tag-empty {
|
||||||
color: #bfbfbf;
|
color: #bfbfbf;
|
||||||
font-size: 11px;
|
font-size: var(--meeting-card-chip-font-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__owner {
|
.meeting-card-v2__owner {
|
||||||
max-width: 112px;
|
max-width: clamp(72px, 34cqw, 140px);
|
||||||
height: 24px;
|
height: var(--meeting-card-chip-height);
|
||||||
flex: 0 0 auto;
|
flex: 0 1 auto;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
gap: 5px;
|
gap: clamp(3px, 1.3cqw, 5px);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
padding: 0 8px;
|
padding: 0 clamp(5px, 1.8cqw, 8px);
|
||||||
border: 1px solid #e6e6e6;
|
border: 1px solid #e6e6e6;
|
||||||
border-radius: 999px;
|
border-radius: 999px;
|
||||||
color: #596275;
|
color: #596275;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
font-size: 11px;
|
font-size: var(--meeting-card-chip-font-size);
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
@ -416,7 +511,7 @@
|
||||||
.meeting-card-v2__owner .anticon {
|
.meeting-card-v2__owner .anticon {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
color: #9095a1;
|
color: #9095a1;
|
||||||
font-size: 12px;
|
font-size: var(--meeting-card-status-icon-size);
|
||||||
}
|
}
|
||||||
|
|
||||||
.meeting-card-v2__owner span {
|
.meeting-card-v2__owner span {
|
||||||
|
|
@ -525,6 +620,114 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media (min-height: 900px) {
|
||||||
|
@container (min-width: 360px) {
|
||||||
|
.meeting-card-v2--spacious .ant-card-body {
|
||||||
|
row-gap: 12px;
|
||||||
|
padding: 16px 16px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2--spacious .meeting-card-v2__body {
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2--spacious .meeting-card-v2__footer {
|
||||||
|
--meeting-card-footer-padding-top: 11px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@container (max-width: 340px) {
|
||||||
|
.meeting-card-v2__source {
|
||||||
|
max-width: clamp(54px, 28cqw, 84px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__actions .ant-btn {
|
||||||
|
padding-inline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__status-text {
|
||||||
|
line-height: clamp(16px, 5cqw, 21px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@container (max-width: 260px) {
|
||||||
|
.meeting-card-v2__footer {
|
||||||
|
grid-template-columns: minmax(0, 1fr);
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__owner {
|
||||||
|
justify-self: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2__owner {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@container (max-width: 1320px) {
|
||||||
|
.meetings-card-scroll .ant-list-items {
|
||||||
|
--meeting-card-columns: 3;
|
||||||
|
--meeting-card-rows: 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meeting-card-v2--spacious .ant-card-body {
|
||||||
|
row-gap: 8px;
|
||||||
|
padding: 12px 14px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@container (max-width: 900px) {
|
||||||
|
.meetings-card-scroll .ant-list-items {
|
||||||
|
--meeting-card-columns: 2;
|
||||||
|
--meeting-card-rows: 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@container (max-width: 560px) {
|
||||||
|
.meetings-card-scroll .ant-list-items {
|
||||||
|
--meeting-card-columns: 1;
|
||||||
|
--meeting-card-rows: 12;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-height: 820px) {
|
||||||
|
.meetings-page.page-container {
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-page .section-card {
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-page .section-card__description {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
line-height: 21px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-page .section-card__content {
|
||||||
|
padding: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-list-panel.data-list-panel {
|
||||||
|
padding: 10px 12px 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-list-toolbar {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-toolbar-stack {
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.meetings-card-scroll {
|
||||||
|
--meeting-card-grid-min-height: clamp(144px, 16vh, 156px);
|
||||||
|
--meeting-card-grid-gap: 8px;
|
||||||
|
padding: 4px 6px 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.meetings-toolbar-primary {
|
.meetings-toolbar-primary {
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
|
|
@ -557,6 +760,12 @@
|
||||||
width: 100% !important;
|
width: 100% !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.meetings-card-scroll .ant-list-items {
|
||||||
|
--meeting-card-columns: 1;
|
||||||
|
--meeting-card-rows: 12;
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
.meeting-card-v2 .ant-card-body {
|
.meeting-card-v2 .ant-card-body {
|
||||||
padding: 14px !important;
|
padding: 14px !important;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -268,7 +268,8 @@ const MeetingCardItem: React.FC<{
|
||||||
onRetrySchedule: (meeting: MeetingVO) => void;
|
onRetrySchedule: (meeting: MeetingVO) => void;
|
||||||
onDelete: (id: number) => void;
|
onDelete: (id: number) => void;
|
||||||
retrying: boolean;
|
retrying: boolean;
|
||||||
}> = ({ item, config, progress, onOpenMeeting, onRetrySchedule, onDelete, retrying }) => {
|
spacious: boolean;
|
||||||
|
}> = ({ item, config, progress, onOpenMeeting, onRetrySchedule, onDelete, retrying, spacious }) => {
|
||||||
const effectiveStatus = getEffectiveStatus(item, progress);
|
const effectiveStatus = getEffectiveStatus(item, progress);
|
||||||
const isProcessing = shouldTrackGenerationProgress(item);
|
const isProcessing = shouldTrackGenerationProgress(item);
|
||||||
const isWaitingUpload = isWaitingUploadProgress(progress) || effectiveStatus === 8;
|
const isWaitingUpload = isWaitingUploadProgress(progress) || effectiveStatus === 8;
|
||||||
|
|
@ -302,7 +303,7 @@ const MeetingCardItem: React.FC<{
|
||||||
}}
|
}}
|
||||||
role="button"
|
role="button"
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
className="meeting-card-v2"
|
className={spacious ? "meeting-card-v2 meeting-card-v2--spacious" : "meeting-card-v2"}
|
||||||
>
|
>
|
||||||
<div className="meeting-card-v2__top">
|
<div className="meeting-card-v2__top">
|
||||||
<IntegratedStatusTag meeting={item} progress={progress} className="meeting-status-tag--card" />
|
<IntegratedStatusTag meeting={item} progress={progress} className="meeting-status-tag--card" />
|
||||||
|
|
@ -312,7 +313,7 @@ const MeetingCardItem: React.FC<{
|
||||||
style={{ "--meeting-source-color": sourceColor } as React.CSSProperties}
|
style={{ "--meeting-source-color": sourceColor } as React.CSSProperties}
|
||||||
>
|
>
|
||||||
<span className="meeting-card-v2__source-dot" />
|
<span className="meeting-card-v2__source-dot" />
|
||||||
{getMeetingSourceLabel(item.meetingSource)}
|
<span className="meeting-card-v2__source-text">{getMeetingSourceLabel(item.meetingSource)}</span>
|
||||||
</div>
|
</div>
|
||||||
{canManageMeeting(item) && (
|
{canManageMeeting(item) && (
|
||||||
<div
|
<div
|
||||||
|
|
@ -335,7 +336,7 @@ const MeetingCardItem: React.FC<{
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="meeting-card-v2__title-row">
|
<div className="meeting-card-v2__title-row">
|
||||||
<Title level={4} className="meeting-card-v2__title" ellipsis={{ tooltip: item.title }}>
|
<Title level={4} className="meeting-card-v2__title" ellipsis={{ rows: spacious ? 2 : 1, tooltip: item.title }}>
|
||||||
{item.title}
|
{item.title}
|
||||||
</Title>
|
</Title>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -432,6 +433,7 @@ const Meetings: React.FC = () => {
|
||||||
const [retryingMeetingIds, setRetryingMeetingIds] = useState<Record<number, boolean>>({});
|
const [retryingMeetingIds, setRetryingMeetingIds] = useState<Record<number, boolean>>({});
|
||||||
|
|
||||||
const activeFilterCount = (statusFilter !== ALL_STATUS_FILTER ? 1 : 0) + (searchTitle ? 1 : 0);
|
const activeFilterCount = (statusFilter !== ALL_STATUS_FILTER ? 1 : 0) + (searchTitle ? 1 : 0);
|
||||||
|
const isFullCardPage = displayMode === "card" && size === CARD_PAGE_SIZE && data.length === CARD_PAGE_SIZE;
|
||||||
|
|
||||||
const handlePaginationChange = (page: number, pageSize: number) => {
|
const handlePaginationChange = (page: number, pageSize: number) => {
|
||||||
setCurrent(pageSize !== size ? 1 : page);
|
setCurrent(pageSize !== size ? 1 : page);
|
||||||
|
|
@ -890,10 +892,9 @@ const Meetings: React.FC = () => {
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{displayMode === "card" ? (
|
{displayMode === "card" ? (
|
||||||
<div className="meetings-card-scroll">
|
<div className={isFullCardPage ? "meetings-card-scroll meetings-card-scroll--full-page" : "meetings-card-scroll"}>
|
||||||
<Skeleton loading={loading} active paragraph={{ rows: 8 }}>
|
<Skeleton loading={loading} active paragraph={{ rows: 8 }}>
|
||||||
<List
|
<List
|
||||||
grid={{ gutter: [12, 12], xs: 1, sm: 2, md: 2, lg: 3, xl: 4, xxl: 4 }}
|
|
||||||
dataSource={data}
|
dataSource={data}
|
||||||
renderItem={(item) => {
|
renderItem={(item) => {
|
||||||
const progress = progressMap[item.id] || null;
|
const progress = progressMap[item.id] || null;
|
||||||
|
|
@ -908,6 +909,7 @@ const Meetings: React.FC = () => {
|
||||||
onRetrySchedule={(meeting) => { void handleRetrySchedule(meeting); }}
|
onRetrySchedule={(meeting) => { void handleRetrySchedule(meeting); }}
|
||||||
onDelete={(id) => { deleteMeeting(id).then(() => { message.success('删除成功'); fetchData(); }) }}
|
onDelete={(id) => { deleteMeeting(id).then(() => { message.success('删除成功'); fetchData(); }) }}
|
||||||
retrying={!!retryingMeetingIds[item.id]}
|
retrying={!!retryingMeetingIds[item.id]}
|
||||||
|
spacious={isFullCardPage}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue