This commit is contained in:
alorig
2025-12-01 04:31:13 +05:00
parent a95aa8f17c
commit 34d2b3abf9
3 changed files with 80 additions and 1 deletions

View File

@@ -111,6 +111,40 @@ export function createPublishedPageConfig(params: {
);
},
},
{
key: 'wordpress_status',
label: 'WP Status',
sortable: false,
width: '120px',
render: (_value: any, row: Content) => {
// Check if content has been published to WordPress
if (!row.external_id) {
return (
<Badge color="gray" size="xs" variant="soft">
<span className="text-[11px] font-normal">Not Published</span>
</Badge>
);
}
// WordPress status badge - use external_status if available, otherwise show 'Published'
const wpStatus = (row as any).wordpress_status || 'publish';
const statusConfig: Record<string, { color: 'success' | 'amber' | 'blue' | 'gray' | 'red'; label: string }> = {
publish: { color: 'success', label: 'Published' },
draft: { color: 'gray', label: 'Draft' },
pending: { color: 'amber', label: 'Pending' },
future: { color: 'blue', label: 'Scheduled' },
private: { color: 'amber', label: 'Private' },
trash: { color: 'red', label: 'Trashed' },
};
const config = statusConfig[wpStatus] || { color: 'success' as const, label: 'Published' };
return (
<Badge color={config.color} size="xs" variant="soft">
<span className="text-[11px] font-normal">{config.label}</span>
</Badge>
);
},
},
{
key: 'content_type',

View File

@@ -11,6 +11,7 @@ import {
ContentListResponse,
ContentFilters,
fetchAPI,
fetchWordPressStatus,
} from '../../services/api';
import { useNavigate } from 'react-router';
import { useToast } from '../../components/ui/toast/ToastContainer';
@@ -73,7 +74,26 @@ export default function Published() {
filteredResults = filteredResults.filter(c => !c.external_id);
}
setContent(filteredResults);
// Fetch WordPress status for published content
const resultsWithWPStatus = await Promise.all(
filteredResults.map(async (content) => {
if (content.external_id) {
try {
const wpStatus = await fetchWordPressStatus(content.id);
return {
...content,
wordpress_status: wpStatus.wordpress_status,
};
} catch (error) {
console.warn(`Failed to fetch WP status for content ${content.id}:`, error);
return content;
}
}
return content;
})
);
setContent(resultsWithWPStatus);
setTotalCount(data.count || 0);
setTotalPages(Math.ceil((data.count || 0) / pageSize));

View File

@@ -2033,6 +2033,7 @@ export interface Content {
// WordPress integration
external_id?: string | null;
external_url?: string | null;
wordpress_status?: 'publish' | 'draft' | 'pending' | 'future' | 'private' | 'trash' | null;
// Timestamps
created_at: string;
updated_at: string;
@@ -2095,6 +2096,30 @@ export async function fetchContentById(id: number): Promise<Content> {
return fetchAPI(`/v1/writer/content/${id}/`);
}
// Fetch WordPress status for published content
export interface WordPressStatusResult {
wordpress_status: 'publish' | 'draft' | 'pending' | 'future' | 'private' | 'trash' | null;
external_id: string | null;
external_url: string | null;
post_title?: string;
post_modified?: string;
last_checked?: string;
}
export async function fetchWordPressStatus(contentId: number): Promise<WordPressStatusResult> {
try {
const response = await fetchAPI(`/v1/writer/content/${contentId}/wordpress_status/`);
return response.data || response;
} catch (error) {
console.warn(`Failed to fetch WordPress status for content ${contentId}:`, error);
return {
wordpress_status: null,
external_id: null,
external_url: null,
};
}
}
// Content Publishing API
export interface PublishContentResult {
content_id: number;