UX Text Improvements: Automation Page - User-Friendly Language
IMPROVEMENTS - Automation Page: - Page title: 'AI Automation Pipeline' → 'Automate Everything' - Page description updated to be more conversational - Status badge: 'Ready to Run' → 'Ready to Go!' with expanded explanation - Schedule display: More conversational format (e.g., 'Runs every day at 2:00 AM | Last run: Never | Uses about 5 credits per run') - Pipeline stage names completely rewritten with descriptions: - 'Keywords → Clusters' → 'ORGANIZE KEYWORDS' (Group related search terms into topic clusters) - 'Clusters → Ideas' → 'CREATE ARTICLE IDEAS' (Generate article titles and outlines for each cluster) - 'Ideas → Tasks' → 'PREPARE WRITING JOBS' (Convert ideas into tasks for the AI writer) - 'Tasks → Content' → 'WRITE ARTICLES' (AI generates full, complete articles) - 'Content → Image Prompts' → 'CREATE IMAGE DESCRIPTIONS' (Generate descriptions for AI to create images) - 'Image Prompts → Images' → 'GENERATE IMAGES' (AI creates custom images for your articles) - 'Manual Review Gate' → 'REVIEW & PUBLISH ⚠️' (Review articles before they go live) - Button updates: - 'Configure' → '⚙️ Adjust Settings' (with tooltip) - 'Run Now' now has tooltip explaining it starts immediately - Pipeline statistics section: - Added header: 'Here's what's in your automation pipeline:' - Metric labels updated with context: - 'Keywords' → 'Search Terms (waiting to organize)' - 'Clusters' → 'Topic Groups (ready for ideas)' - 'Ideas' → 'Article Ideas (waiting to write)' - 'Content' → 'Articles (in various stages)' - 'Images' → 'Images (created and waiting)' NO CODE CHANGES: Only visible user-facing text updates
This commit is contained in:
@@ -37,13 +37,13 @@ import {
|
|||||||
} from '../../icons';
|
} from '../../icons';
|
||||||
|
|
||||||
const STAGE_CONFIG = [
|
const STAGE_CONFIG = [
|
||||||
{ icon: ListIcon, color: 'from-blue-500 to-blue-600', textColor: 'text-blue-600', hoverColor: 'hover:border-blue-500', name: 'Keywords → Clusters' },
|
{ icon: ListIcon, color: 'from-blue-500 to-blue-600', textColor: 'text-blue-600', hoverColor: 'hover:border-blue-500', name: 'ORGANIZE KEYWORDS', desc: 'Group related search terms into topic clusters' },
|
||||||
{ icon: GroupIcon, color: 'from-purple-500 to-purple-600', textColor: 'text-purple-600', hoverColor: 'hover:border-purple-500', name: 'Clusters → Ideas' },
|
{ icon: GroupIcon, color: 'from-purple-500 to-purple-600', textColor: 'text-purple-600', hoverColor: 'hover:border-purple-500', name: 'CREATE ARTICLE IDEAS', desc: 'Generate article titles and outlines for each cluster' },
|
||||||
{ icon: CheckCircleIcon, color: 'from-indigo-500 to-indigo-600', textColor: 'text-indigo-600', hoverColor: 'hover:border-indigo-500', name: 'Ideas → Tasks' },
|
{ icon: CheckCircleIcon, color: 'from-indigo-500 to-indigo-600', textColor: 'text-indigo-600', hoverColor: 'hover:border-indigo-500', name: 'PREPARE WRITING JOBS', desc: 'Convert ideas into tasks for the AI writer' },
|
||||||
{ icon: PencilIcon, color: 'from-green-500 to-green-600', textColor: 'text-green-600', hoverColor: 'hover:border-green-500', name: 'Tasks → Content' },
|
{ icon: PencilIcon, color: 'from-green-500 to-green-600', textColor: 'text-green-600', hoverColor: 'hover:border-green-500', name: 'WRITE ARTICLES', desc: 'AI generates full, complete articles' },
|
||||||
{ icon: FileIcon, color: 'from-amber-500 to-amber-600', textColor: 'text-amber-600', hoverColor: 'hover:border-amber-500', name: 'Content → Image Prompts' },
|
{ icon: FileIcon, color: 'from-amber-500 to-amber-600', textColor: 'text-amber-600', hoverColor: 'hover:border-amber-500', name: 'CREATE IMAGE DESCRIPTIONS', desc: 'Generate descriptions for AI to create images' },
|
||||||
{ icon: FileTextIcon, color: 'from-pink-500 to-pink-600', textColor: 'text-pink-600', hoverColor: 'hover:border-pink-500', name: 'Image Prompts → Images' },
|
{ icon: FileTextIcon, color: 'from-pink-500 to-pink-600', textColor: 'text-pink-600', hoverColor: 'hover:border-pink-500', name: 'GENERATE IMAGES', desc: 'AI creates custom images for your articles' },
|
||||||
{ icon: PaperPlaneIcon, color: 'from-teal-500 to-teal-600', textColor: 'text-teal-600', hoverColor: 'hover:border-teal-500', name: 'Manual Review Gate' },
|
{ icon: PaperPlaneIcon, color: 'from-teal-500 to-teal-600', textColor: 'text-teal-600', hoverColor: 'hover:border-teal-500', name: 'REVIEW & PUBLISH ⚠️', desc: 'Review articles before they go live (manual approval needed)' },
|
||||||
];
|
];
|
||||||
|
|
||||||
const AutomationPage: React.FC = () => {
|
const AutomationPage: React.FC = () => {
|
||||||
@@ -378,7 +378,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageMeta title="AI Automation Pipeline | IGNY8" description="Automated content creation from keywords to published articles" />
|
<PageMeta title="Automate Everything | IGNY8" description="Set your content on automatic - Let our AI create and publish content on a schedule" />
|
||||||
|
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
@@ -389,7 +389,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
<BoltIcon className="text-white size-5" />
|
<BoltIcon className="text-white size-5" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-2xl font-bold text-gray-800 dark:text-white/90">AI Automation Pipeline</h2>
|
<h2 className="text-2xl font-bold text-gray-800 dark:text-white/90">Automate Everything</h2>
|
||||||
{activeSite && (
|
{activeSite && (
|
||||||
<p className="text-sm text-gray-500 dark:text-gray-400 mt-0.5">
|
<p className="text-sm text-gray-500 dark:text-gray-400 mt-0.5">
|
||||||
Site: <span className="font-medium text-brand-600 dark:text-brand-400">{activeSite.name}</span>
|
Site: <span className="font-medium text-brand-600 dark:text-brand-400">{activeSite.name}</span>
|
||||||
@@ -411,11 +411,11 @@ const AutomationPage: React.FC = () => {
|
|||||||
<div className="text-sm font-semibold text-slate-900 dark:text-white truncate">
|
<div className="text-sm font-semibold text-slate-900 dark:text-white truncate">
|
||||||
{currentRun?.status === 'running' && `Running - Stage ${currentRun.current_stage}/7`}
|
{currentRun?.status === 'running' && `Running - Stage ${currentRun.current_stage}/7`}
|
||||||
{currentRun?.status === 'paused' && 'Paused'}
|
{currentRun?.status === 'paused' && 'Paused'}
|
||||||
{!currentRun && totalPending > 0 && 'Ready to Run'}
|
{!currentRun && totalPending > 0 && 'Ready to Go!'}
|
||||||
{!currentRun && totalPending === 0 && 'No Items Pending'}
|
{!currentRun && totalPending === 0 && 'No Items Pending'}
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-slate-600 dark:text-gray-400 truncate">
|
<div className="text-xs text-slate-600 dark:text-gray-400 truncate">
|
||||||
{currentRun ? `Started: ${new Date(currentRun.started_at).toLocaleTimeString()}` : (totalPending > 0 ? `${totalPending} items in pipeline` : 'All stages clear')}
|
{currentRun ? `Started: ${new Date(currentRun.started_at).toLocaleTimeString()}` : (totalPending > 0 ? `${totalPending} items waiting - Everything is queued up and ready for the next run` : 'All stages clear')}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -444,16 +444,15 @@ const AutomationPage: React.FC = () => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="h-4 w-px bg-white/25"></div>
|
<div className="h-4 w-px bg-white/25"></div>
|
||||||
<div className="text-sm text-white/90">
|
<div className="text-sm text-white/90">
|
||||||
<span className="font-medium capitalize">{config.frequency}</span> at <span className="font-medium">{config.scheduled_time}</span>
|
Runs <span className="font-medium capitalize">{config.frequency === 'daily' ? 'every day' : config.frequency}</span> at <span className="font-medium">{config.scheduled_time}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="h-4 w-px bg-white/25"></div>
|
<div className="h-4 w-px bg-white/25"></div>
|
||||||
<div className="text-sm text-white/80">
|
<div className="text-sm text-white/80">
|
||||||
Last: <span className="font-medium">{config.last_run_at ? new Date(config.last_run_at).toLocaleDateString() : 'Never'}</span>
|
Last run: <span className="font-medium">{config.last_run_at ? new Date(config.last_run_at).toLocaleDateString() : 'Never'}</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="h-4 w-px bg-white/25"></div>
|
<div className="h-4 w-px bg-white/25"></div>
|
||||||
<div className="text-sm text-white/90">
|
<div className="text-sm text-white/90">
|
||||||
<span className="font-medium">Est:</span>{' '}
|
Uses about <span className="font-semibold text-white">{estimate?.estimated_credits || 0} credits</span> per run
|
||||||
<span className="font-semibold text-white">{estimate?.estimated_credits || 0} credits</span>
|
|
||||||
{estimate && !estimate.sufficient && (
|
{estimate && !estimate.sufficient && (
|
||||||
<span className="ml-1 text-white/90 font-semibold">(Low)</span>
|
<span className="ml-1 text-white/90 font-semibold">(Low)</span>
|
||||||
)}
|
)}
|
||||||
@@ -465,9 +464,10 @@ const AutomationPage: React.FC = () => {
|
|||||||
variant="outline"
|
variant="outline"
|
||||||
tone="brand"
|
tone="brand"
|
||||||
size="sm"
|
size="sm"
|
||||||
|
title="Change when this automation runs and how many credits it uses"
|
||||||
className="!border-white !text-white hover:!bg-white hover:!text-brand-700"
|
className="!border-white !text-white hover:!bg-white hover:!text-brand-700"
|
||||||
>
|
>
|
||||||
Configure
|
⚙️ Adjust Settings
|
||||||
</Button>
|
</Button>
|
||||||
{currentRun?.status === 'running' && (
|
{currentRun?.status === 'running' && (
|
||||||
<Button
|
<Button
|
||||||
@@ -498,6 +498,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
tone="success"
|
tone="success"
|
||||||
size="sm"
|
size="sm"
|
||||||
disabled={!config?.is_enabled}
|
disabled={!config?.is_enabled}
|
||||||
|
title="Start the automation immediately instead of waiting for the scheduled time"
|
||||||
className="!bg-white !text-brand-700 hover:!bg-success-600 hover:!text-white"
|
className="!bg-white !text-brand-700 hover:!bg-success-600 hover:!text-white"
|
||||||
>
|
>
|
||||||
Run Now
|
Run Now
|
||||||
@@ -508,6 +509,11 @@ const AutomationPage: React.FC = () => {
|
|||||||
</ComponentCard>
|
</ComponentCard>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Pipeline Statistics Header */}
|
||||||
|
<div className="mb-4">
|
||||||
|
<h3 className="text-lg font-semibold text-gray-800 dark:text-white">Here's what's in your automation pipeline:</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* Metrics Summary Cards */}
|
{/* Metrics Summary Cards */}
|
||||||
<div className="grid grid-cols-2 md:grid-cols-5 gap-4">
|
<div className="grid grid-cols-2 md:grid-cols-5 gap-4">
|
||||||
{/* Keywords */}
|
{/* Keywords */}
|
||||||
@@ -517,7 +523,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
<div className="size-10 rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 flex items-center justify-center">
|
<div className="size-10 rounded-lg bg-gradient-to-br from-blue-500 to-blue-600 flex items-center justify-center">
|
||||||
<ListIcon className="size-5 text-white" />
|
<ListIcon className="size-5 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm font-bold text-blue-900 dark:text-blue-100">Keywords</div>
|
<div className="text-sm font-bold text-blue-900 dark:text-blue-100">Search Terms</div>
|
||||||
</div>
|
</div>
|
||||||
{(() => {
|
{(() => {
|
||||||
const res = getStageResult(1);
|
const res = getStageResult(1);
|
||||||
@@ -525,6 +531,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<div className="text-right">
|
<div className="text-right">
|
||||||
<div className="text-3xl font-bold text-blue-900">{total}</div>
|
<div className="text-3xl font-bold text-blue-900">{total}</div>
|
||||||
|
<div className="text-xs text-blue-700 dark:text-blue-300">waiting to organize</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})()}
|
})()}
|
||||||
@@ -549,7 +556,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
<div className="size-10 rounded-lg bg-gradient-to-br from-purple-500 to-purple-600 flex items-center justify-center">
|
<div className="size-10 rounded-lg bg-gradient-to-br from-purple-500 to-purple-600 flex items-center justify-center">
|
||||||
<GroupIcon className="size-5 text-white" />
|
<GroupIcon className="size-5 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm font-bold text-purple-900 dark:text-purple-100">Clusters</div>
|
<div className="text-sm font-bold text-purple-900 dark:text-purple-100">Topic Groups</div>
|
||||||
</div>
|
</div>
|
||||||
{(() => {
|
{(() => {
|
||||||
const res = getStageResult(2);
|
const res = getStageResult(2);
|
||||||
@@ -557,6 +564,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<div className="text-right">
|
<div className="text-right">
|
||||||
<div className="text-3xl font-bold text-purple-900">{total}</div>
|
<div className="text-3xl font-bold text-purple-900">{total}</div>
|
||||||
|
<div className="text-xs text-purple-700 dark:text-purple-300">ready for ideas</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})()}
|
})()}
|
||||||
@@ -581,7 +589,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
<div className="size-10 rounded-lg bg-gradient-to-br from-indigo-500 to-indigo-600 flex items-center justify-center">
|
<div className="size-10 rounded-lg bg-gradient-to-br from-indigo-500 to-indigo-600 flex items-center justify-center">
|
||||||
<CheckCircleIcon className="size-5 text-white" />
|
<CheckCircleIcon className="size-5 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm font-bold text-indigo-900 dark:text-indigo-100">Ideas</div>
|
<div className="text-sm font-bold text-indigo-900 dark:text-indigo-100">Article Ideas</div>
|
||||||
</div>
|
</div>
|
||||||
{(() => {
|
{(() => {
|
||||||
const res = getStageResult(3);
|
const res = getStageResult(3);
|
||||||
@@ -589,6 +597,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<div className="text-right">
|
<div className="text-right">
|
||||||
<div className="text-3xl font-bold text-indigo-900">{total}</div>
|
<div className="text-3xl font-bold text-indigo-900">{total}</div>
|
||||||
|
<div className="text-xs text-indigo-700 dark:text-indigo-300">waiting to write</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})()}
|
})()}
|
||||||
@@ -615,7 +624,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
<div className="size-10 rounded-lg bg-gradient-to-br from-green-500 to-green-600 flex items-center justify-center">
|
<div className="size-10 rounded-lg bg-gradient-to-br from-green-500 to-green-600 flex items-center justify-center">
|
||||||
<FileTextIcon className="size-5 text-white" />
|
<FileTextIcon className="size-5 text-white" />
|
||||||
</div>
|
</div>
|
||||||
<div className="text-sm font-bold text-green-900 dark:text-green-100">Content</div>
|
<div className="text-sm font-bold text-green-900 dark:text-green-100">Articles</div>
|
||||||
</div>
|
</div>
|
||||||
{(() => {
|
{(() => {
|
||||||
const res = getStageResult(4);
|
const res = getStageResult(4);
|
||||||
@@ -623,6 +632,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<div className="text-right">
|
<div className="text-right">
|
||||||
<div className="text-3xl font-bold text-green-900">{total}</div>
|
<div className="text-3xl font-bold text-green-900">{total}</div>
|
||||||
|
<div className="text-xs text-green-700 dark:text-green-300">in various stages</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})()}
|
})()}
|
||||||
@@ -657,6 +667,7 @@ const AutomationPage: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<div className="text-right">
|
<div className="text-right">
|
||||||
<div className="text-3xl font-bold text-pink-900">{total}</div>
|
<div className="text-3xl font-bold text-pink-900">{total}</div>
|
||||||
|
<div className="text-xs text-pink-700 dark:text-pink-300">created and waiting</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
})()}
|
})()}
|
||||||
|
|||||||
Reference in New Issue
Block a user