upto phase 4 completed

This commit is contained in:
IGNY8 VPS (Salman)
2026-01-10 14:59:57 +00:00
parent 6e15ffb49b
commit 747770ac58
5 changed files with 141 additions and 98 deletions

View File

@@ -797,7 +797,7 @@ const AutomationPage: React.FC = () => {
className={`
relative rounded-xl border border-gray-200 dark:border-gray-800 p-4 transition-all bg-white dark:bg-gray-900
border-l-[5px] ${stageBorderColor}
${isActive
${ isActive
? 'shadow-lg ring-2 ring-brand-200 dark:ring-brand-800'
: isComplete
? ''
@@ -840,10 +840,10 @@ const AutomationPage: React.FC = () => {
</div>
</div>
{/* Credits and Duration - only show during/after run */}
{result && (result.credits_used > 0 || result.time_elapsed) && (
{/* Credits and Duration - show during/after run */}
{result && (result.credits_used !== undefined || result.time_elapsed) && (
<div className="flex justify-between items-center py-2 border-t border-gray-200 dark:border-gray-700 text-xs">
{result.credits_used > 0 && (
{result.credits_used !== undefined && (
<span className="font-semibold text-warning-600 dark:text-warning-400">{result.credits_used} credits</span>
)}
{result.time_elapsed && (
@@ -960,7 +960,7 @@ const AutomationPage: React.FC = () => {
{pending}
</div>
</div>
<div className="h-8 w-px bg-gray-200 dark:bg-gray-700"></div>
<div className="h-8 w-px bg-gray-200 dark:border-gray-700"></div>
<div className="text-center">
<div className="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase mb-0.5">Processed</div>
<div className={`text-xl font-bold ${processed > 0 ? 'text-success-600 dark:text-success-400' : 'text-gray-400 dark:text-gray-500'}`}>
@@ -969,10 +969,10 @@ const AutomationPage: React.FC = () => {
</div>
</div>
{/* Credits and Duration - only show during/after run */}
{result && (result.credits_used > 0 || result.time_elapsed) && (
{/* Credits and Duration - show during/after run */}
{result && (result.credits_used !== undefined || result.time_elapsed) && (
<div className="flex justify-between items-center py-2 border-t border-gray-200 dark:border-gray-700 text-xs">
{result.credits_used > 0 && (
{result.credits_used !== undefined && (
<span className="font-semibold text-warning-600 dark:text-warning-400">{result.credits_used} credits</span>
)}
{result.time_elapsed && (

View File

@@ -104,31 +104,38 @@ export default function ContentCalendar() {
const thirtyDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
const thirtyDaysFromNow = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000);
// Published in last 30 days (items with external_id)
// Published in last 30 days - check EITHER external_id OR site_status='published'
const publishedLast30Days = allContent.filter((c: Content) => {
if (!c.external_id || c.external_id === '') return false;
const isPublished = (c.external_id && c.external_id !== '') || c.site_status === 'published';
if (!isPublished) return false;
// Use updated_at as publish date since site_status_updated_at may not be set
const publishDate = c.updated_at ? new Date(c.updated_at) : null;
return publishDate && publishDate >= thirtyDaysAgo;
}).length;
// Scheduled in next 30 days (exclude already published items with external_id)
// Scheduled in next 30 days (exclude already published items)
const scheduledNext30Days = allContent.filter((c: Content) => {
if (c.site_status !== 'scheduled') return false;
if (c.external_id && c.external_id !== '') return false; // Exclude already published
// Exclude already published (either has external_id OR site_status='published')
if ((c.external_id && c.external_id !== '') || c.site_status === 'published') return false;
const schedDate = c.scheduled_publish_at ? new Date(c.scheduled_publish_at) : null;
return schedDate && schedDate >= now && schedDate <= thirtyDaysFromNow;
}).length;
return {
// Scheduled count excludes items that are already published (have external_id)
// Scheduled count excludes items that are already published
scheduled: allContent.filter((c: Content) =>
c.site_status === 'scheduled' && (!c.external_id || c.external_id === '')
c.site_status === 'scheduled' && (!c.external_id || c.external_id === '') && c.site_status !== 'published'
).length,
publishing: allContent.filter((c: Content) => c.site_status === 'publishing').length,
published: allContent.filter((c: Content) => c.external_id && c.external_id !== '').length,
// Published: check EITHER external_id OR site_status='published'
published: allContent.filter((c: Content) =>
(c.external_id && c.external_id !== '') || c.site_status === 'published'
).length,
review: allContent.filter((c: Content) => c.status === 'review').length,
approved: allContent.filter((c: Content) => c.status === 'approved' && (!c.external_id || c.external_id === '')).length,
approved: allContent.filter((c: Content) =>
c.status === 'approved' && (!c.external_id || c.external_id === '') && c.site_status !== 'published'
).length,
publishedLast30Days,
scheduledNext30Days,
};

View File

@@ -1268,6 +1268,19 @@ export default function SiteSettings() {
</div>
</div>
</Card>
{/* Save Button */}
<div className="flex justify-end">
<Button
variant="primary"
tone="brand"
onClick={() => savePublishingSettings(publishingSettings)}
isLoading={publishingSettingsSaving}
disabled={publishingSettingsSaving}
>
Save Publishing Settings
</Button>
</div>
</>
) : (
<Card>