- {workspaceTab === 'catalog' ? (
+ {aiCatalogEnabled && workspaceTab === 'catalog' ? (
{catalogPanelNotice && (
splitDisplayItems(meeting?.tags), [meeting?.tags]);
const keywords = useMemo(() => analysis.keywords || [], [analysis.keywords]);
const playbackAudioUrl = useMemo(() => resolveMeetingPlaybackAudioUrl(meeting), [meeting]);
+ const aiCatalogEnabled = meeting?.aiCatalogEnabled !== false;
const statusMeta = STATUS_META[meeting?.status || 0] || {
label: TEXT.statusPending,
className: "is-warning",
@@ -416,6 +417,12 @@ export default function MeetingPreview() {
});
}, [analysis.chapters, meetingChapters, transcripts]);
+ useEffect(() => {
+ if (!aiCatalogEnabled && pageTab === "catalog") {
+ setPageTab("summary");
+ }
+ }, [aiCatalogEnabled, pageTab]);
+
useEffect(() => {
if (!activeTranscriptId) {
return;
@@ -967,7 +974,7 @@ export default function MeetingPreview() {
onChange={(key) => setPageTab(key as PreviewPageTab)}
items={[
{ key: "summary", label: TEXT.pageSummary },
- { key: "catalog", label: TEXT.pageCatalog },
+ ...(aiCatalogEnabled ? [{ key: "catalog", label: TEXT.pageCatalog }] : []),
{ key: "transcript", label: TEXT.pageTranscript },
]}
/>
@@ -975,7 +982,7 @@ export default function MeetingPreview() {
{pageTab === "summary" ? summaryTabContent : null}
- {pageTab === "catalog" ? catalogTabContent : null}
+ {aiCatalogEnabled && pageTab === "catalog" ? catalogTabContent : null}
{pageTab === "transcript" ? transcriptTabContent : null}
diff --git a/frontend/src/pages/business/Meetings.tsx b/frontend/src/pages/business/Meetings.tsx
index 2e4ad4e..4b0e3d8 100644
--- a/frontend/src/pages/business/Meetings.tsx
+++ b/frontend/src/pages/business/Meetings.tsx
@@ -10,7 +10,6 @@
InfoCircleOutlined,
PauseCircleOutlined,
PlusOutlined,
- RightOutlined,
SearchOutlined,
SettingOutlined,
SyncOutlined,
@@ -136,6 +135,9 @@ const shouldPollMeetingCard = (item: MeetingVO) =>
const getUnifiedStatusCode = (progress: MeetingProgress | null | undefined) =>
progress?.unifiedStatus?.statusCode;
+const isWaitingUploadProgress = (progress: MeetingProgress | null | undefined) =>
+ getUnifiedStatusCode(progress) === "WAITING_UPLOAD";
+
const getEffectiveStatus = (item: MeetingVO, progress: MeetingProgress | null) => {
const unifiedStatusCode = getUnifiedStatusCode(progress);
if (unifiedStatusCode === "WAITING_UPLOAD") {
@@ -285,12 +287,17 @@ const MeetingCardItem: React.FC<{
}> = ({ item, config, progress, onOpenMeeting, onRetrySchedule, onDelete, retrying }) => {
const effectiveStatus = getEffectiveStatus(item, progress);
const isProcessing = shouldTrackGenerationProgress(item);
+ const isWaitingUpload = isWaitingUploadProgress(progress) || effectiveStatus === 8;
const isPaused = effectiveStatus === PAUSED_DISPLAY_STATUS;
const isRealtimeActive = effectiveStatus === REALTIME_ACTIVE_DISPLAY_STATUS;
const isRealtimeIdle = effectiveStatus === REALTIME_IDLE_DISPLAY_STATUS;
const isCrossPlatformRealtime = (isPaused || isRealtimeActive || isRealtimeIdle) && !canControlRealtimeFromCurrentPlatform(item);
const crossPlatformHint = `在 ${getRealtimeSourceLabel(item)} 继续`;
const canRetry = canRetryQueuedMeeting(item, progress);
+ const ownerName = item.creatorName || "未知";
+ const processingMessage = isWaitingUpload
+ ? (progress?.message || progress?.unifiedStatus?.message || config.text)
+ : (progress?.unifiedStatus?.message || progress?.message || "深度分析中...");
const sourceColor = item.meetingSource === "ANDROID" ? "#10b981" : "#3b82f6";
@@ -375,26 +382,28 @@ const MeetingCardItem: React.FC<{
fontSize: "12px"
}}
>
-
- {isProcessing ?
:
}
-
- {isProcessing ? (progress?.message || "深度分析中...") : (isCrossPlatformRealtime ? crossPlatformHint : config.text)}
-
+
+
+ {isProcessing ? : }
+
+ {isProcessing ? processingMessage : (isCrossPlatformRealtime ? crossPlatformHint : config.text)}
+
+
+ {canRetry && (
+
+ )}
- {canRetry && (
-
- )}
) : (
@@ -402,10 +411,6 @@ const MeetingCardItem: React.FC<{
{dayjs(item.meetingTime).format("MM-DD HH:mm")}
-
-
- {item.creatorName || "未知"}
-
)}
@@ -433,34 +438,30 @@ const MeetingCardItem: React.FC<{
)) ||