1
This commit is contained in:
@@ -87,6 +87,28 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clusterCoverage: NonNullable<SiteProgress['cluster_coverage']> =
|
||||||
|
progress.cluster_coverage ?? {
|
||||||
|
total_clusters: 0,
|
||||||
|
covered_clusters: 0,
|
||||||
|
details: [] as NonNullable<SiteProgress['cluster_coverage']>['details'],
|
||||||
|
};
|
||||||
|
|
||||||
|
const taxonomyCoverage: NonNullable<SiteProgress['taxonomy_coverage']> =
|
||||||
|
progress.taxonomy_coverage ?? {
|
||||||
|
total_taxonomies: 0,
|
||||||
|
defined_taxonomies: 0,
|
||||||
|
details: [] as NonNullable<SiteProgress['taxonomy_coverage']>['details'],
|
||||||
|
};
|
||||||
|
|
||||||
|
const validationFlags: NonNullable<SiteProgress['validation_flags']> =
|
||||||
|
progress.validation_flags ?? {
|
||||||
|
clusters_attached: false,
|
||||||
|
taxonomies_defined: false,
|
||||||
|
sitemap_generated: false,
|
||||||
|
all_pages_generated: false,
|
||||||
|
};
|
||||||
|
|
||||||
const getStatusColor = (status: string) => {
|
const getStatusColor = (status: string) => {
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case 'complete':
|
case 'complete':
|
||||||
@@ -126,19 +148,19 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4 mb-6">
|
<div className="grid grid-cols-1 sm:grid-cols-3 gap-4 mb-6">
|
||||||
<div className="text-center p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
|
<div className="text-center p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
|
||||||
<div className="text-2xl font-bold text-gray-900 dark:text-white">
|
<div className="text-2xl font-bold text-gray-900 dark:text-white">
|
||||||
{progress.cluster_coverage.covered_clusters}/{progress.cluster_coverage.total_clusters}
|
{clusterCoverage.covered_clusters}/{clusterCoverage.total_clusters}
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-gray-600 dark:text-gray-400 mt-1">Clusters Covered</div>
|
<div className="text-xs text-gray-600 dark:text-gray-400 mt-1">Clusters Covered</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
|
<div className="text-center p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
|
||||||
<div className="text-2xl font-bold text-gray-900 dark:text-white">
|
<div className="text-2xl font-bold text-gray-900 dark:text-white">
|
||||||
{progress.taxonomy_coverage.defined_taxonomies}/{progress.taxonomy_coverage.total_taxonomies}
|
{taxonomyCoverage.defined_taxonomies}/{taxonomyCoverage.total_taxonomies}
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-gray-600 dark:text-gray-400 mt-1">Taxonomies Defined</div>
|
<div className="text-xs text-gray-600 dark:text-gray-400 mt-1">Taxonomies Defined</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
|
<div className="text-center p-3 bg-gray-50 dark:bg-gray-800 rounded-lg">
|
||||||
<div className="text-2xl font-bold text-gray-900 dark:text-white">
|
<div className="text-2xl font-bold text-gray-900 dark:text-white">
|
||||||
{progress.validation_flags.all_pages_generated ? '✓' : '✗'}
|
{validationFlags.all_pages_generated ? '✓' : '✗'}
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-gray-600 dark:text-gray-400 mt-1">All Pages Generated</div>
|
<div className="text-xs text-gray-600 dark:text-gray-400 mt-1">All Pages Generated</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -149,10 +171,14 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
<h4 id="cluster-coverage-title" className="text-sm font-semibold text-gray-700 dark:text-gray-300">
|
<h4 id="cluster-coverage-title" className="text-sm font-semibold text-gray-700 dark:text-gray-300">
|
||||||
Cluster Coverage
|
Cluster Coverage
|
||||||
</h4>
|
</h4>
|
||||||
{progress.cluster_coverage.details && progress.cluster_coverage.details.length > 0 ? (
|
{clusterCoverage.details && clusterCoverage.details.length > 0 ? (
|
||||||
progress.cluster_coverage.details.map((cluster) => {
|
clusterCoverage.details.map((cluster) => {
|
||||||
const totalPages = cluster.hub_pages + cluster.supporting_pages + cluster.attribute_pages;
|
const hubPages = cluster.hub_pages ?? 0;
|
||||||
const completionPercent = totalPages > 0 ? Math.min(100, (cluster.content_count / totalPages) * 100) : 0;
|
const supportingPages = cluster.supporting_pages ?? 0;
|
||||||
|
const attributePages = cluster.attribute_pages ?? 0;
|
||||||
|
const contentCount = cluster.content_count ?? 0;
|
||||||
|
const totalPages = hubPages + supportingPages + attributePages;
|
||||||
|
const completionPercent = totalPages > 0 ? Math.min(100, (contentCount / totalPages) * 100) : 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
@@ -179,7 +205,7 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="text-xs text-gray-600 dark:text-gray-400">
|
<div className="text-xs text-gray-600 dark:text-gray-400">
|
||||||
{cluster.content_count} content / {totalPages} pages
|
{contentCount} content / {totalPages} pages
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
@@ -212,15 +238,15 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
{/* Page Type Breakdown */}
|
{/* Page Type Breakdown */}
|
||||||
<div className="grid grid-cols-3 gap-2 mt-3 text-xs">
|
<div className="grid grid-cols-3 gap-2 mt-3 text-xs">
|
||||||
<div className="text-center p-2 bg-white dark:bg-gray-700 rounded">
|
<div className="text-center p-2 bg-white dark:bg-gray-700 rounded">
|
||||||
<div className="font-medium text-gray-900 dark:text-white">{cluster.hub_pages}</div>
|
<div className="font-medium text-gray-900 dark:text-white">{hubPages}</div>
|
||||||
<div className="text-gray-600 dark:text-gray-400">Hub</div>
|
<div className="text-gray-600 dark:text-gray-400">Hub</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center p-2 bg-white dark:bg-gray-700 rounded">
|
<div className="text-center p-2 bg-white dark:bg-gray-700 rounded">
|
||||||
<div className="font-medium text-gray-900 dark:text-white">{cluster.supporting_pages}</div>
|
<div className="font-medium text-gray-900 dark:text-white">{supportingPages}</div>
|
||||||
<div className="text-gray-600 dark:text-gray-400">Supporting</div>
|
<div className="text-gray-600 dark:text-gray-400">Supporting</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="text-center p-2 bg-white dark:bg-gray-700 rounded">
|
<div className="text-center p-2 bg-white dark:bg-gray-700 rounded">
|
||||||
<div className="font-medium text-gray-900 dark:text-white">{cluster.attribute_pages}</div>
|
<div className="font-medium text-gray-900 dark:text-white">{attributePages}</div>
|
||||||
<div className="text-gray-600 dark:text-gray-400">Attribute</div>
|
<div className="text-gray-600 dark:text-gray-400">Attribute</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -259,7 +285,7 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
</h4>
|
</h4>
|
||||||
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
|
<div className="grid grid-cols-1 sm:grid-cols-2 gap-3">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{progress.validation_flags.clusters_attached ? (
|
{validationFlags.clusters_attached ? (
|
||||||
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
||||||
) : (
|
) : (
|
||||||
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
||||||
@@ -267,7 +293,7 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
<span className="text-sm text-gray-700 dark:text-gray-300">Clusters Attached</span>
|
<span className="text-sm text-gray-700 dark:text-gray-300">Clusters Attached</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{progress.validation_flags.taxonomies_defined ? (
|
{validationFlags.taxonomies_defined ? (
|
||||||
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
||||||
) : (
|
) : (
|
||||||
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
||||||
@@ -275,7 +301,7 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
<span className="text-sm text-gray-700 dark:text-gray-300">Taxonomies Defined</span>
|
<span className="text-sm text-gray-700 dark:text-gray-300">Taxonomies Defined</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{progress.validation_flags.sitemap_generated ? (
|
{validationFlags.sitemap_generated ? (
|
||||||
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
||||||
) : (
|
) : (
|
||||||
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
||||||
@@ -283,7 +309,7 @@ export default function SiteProgressWidget({ blueprintId, siteId }: SiteProgress
|
|||||||
<span className="text-sm text-gray-700 dark:text-gray-300">Sitemap Generated</span>
|
<span className="text-sm text-gray-700 dark:text-gray-300">Sitemap Generated</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{progress.validation_flags.all_pages_generated ? (
|
{validationFlags.all_pages_generated ? (
|
||||||
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
<CheckCircleIcon className="w-4 h-4 text-green-600 dark:text-green-400" />
|
||||||
) : (
|
) : (
|
||||||
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
<XCircleIcon className="w-4 h-4 text-red-600 dark:text-red-400" />
|
||||||
|
|||||||
@@ -2188,7 +2188,7 @@ export interface SiteProgress {
|
|||||||
blueprint_id: number;
|
blueprint_id: number;
|
||||||
blueprint_name: string;
|
blueprint_name: string;
|
||||||
overall_status: 'in_progress' | 'complete' | 'blocked';
|
overall_status: 'in_progress' | 'complete' | 'blocked';
|
||||||
cluster_coverage: {
|
cluster_coverage?: {
|
||||||
total_clusters: number;
|
total_clusters: number;
|
||||||
covered_clusters: number;
|
covered_clusters: number;
|
||||||
details: Array<{
|
details: Array<{
|
||||||
@@ -2205,12 +2205,12 @@ export interface SiteProgress {
|
|||||||
is_complete: boolean;
|
is_complete: boolean;
|
||||||
}>;
|
}>;
|
||||||
};
|
};
|
||||||
taxonomy_coverage: {
|
taxonomy_coverage?: {
|
||||||
total_taxonomies: number;
|
total_taxonomies: number;
|
||||||
defined_taxonomies: number;
|
defined_taxonomies: number;
|
||||||
details: any[];
|
details: any[];
|
||||||
};
|
};
|
||||||
validation_flags: {
|
validation_flags?: {
|
||||||
clusters_attached: boolean;
|
clusters_attached: boolean;
|
||||||
taxonomies_defined: boolean;
|
taxonomies_defined: boolean;
|
||||||
sitemap_generated: boolean;
|
sitemap_generated: boolean;
|
||||||
|
|||||||
Reference in New Issue
Block a user