@orion-studios/payload-seo-audit 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/collections/SeoDashboardView.d.ts +3 -0
- package/dist/collections/SeoDashboardView.d.ts.map +1 -0
- package/dist/collections/SeoDashboardView.js +30 -0
- package/dist/components/layout/SeoReportShell.js +2 -2
- package/dist/components/views/SeoDashboard.d.ts.map +1 -1
- package/dist/components/views/SeoDashboard.js +55 -52
- package/dist/components/views/SeoPageReport.d.ts.map +1 -1
- package/dist/components/views/SeoPageReport.js +21 -10
- package/dist/components/views/SeoSnapshotReport.d.ts.map +1 -1
- package/dist/components/views/SeoSnapshotReport.js +21 -10
- package/dist/globals/SeoDashboard.js +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SeoDashboardView.d.ts","sourceRoot":"","sources":["../../src/collections/SeoDashboardView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAG/C,eAAO,MAAM,gBAAgB,EAAE,gBAyB9B,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SeoDashboardView = void 0;
|
|
4
|
+
const access_1 = require("../utilities/access");
|
|
5
|
+
exports.SeoDashboardView = {
|
|
6
|
+
slug: 'seo-dashboard-view',
|
|
7
|
+
labels: {
|
|
8
|
+
singular: 'SEO Dashboard',
|
|
9
|
+
plural: 'SEO Dashboard',
|
|
10
|
+
},
|
|
11
|
+
admin: {
|
|
12
|
+
group: 'SEO',
|
|
13
|
+
hideAPIURL: true,
|
|
14
|
+
defaultColumns: [],
|
|
15
|
+
components: {
|
|
16
|
+
views: {
|
|
17
|
+
list: {
|
|
18
|
+
Component: '@orion-studios/payload-seo-audit/components#SeoDashboard',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
access: {
|
|
24
|
+
read: access_1.seoAdminAccess,
|
|
25
|
+
create: () => false,
|
|
26
|
+
update: () => false,
|
|
27
|
+
delete: () => false,
|
|
28
|
+
},
|
|
29
|
+
fields: [],
|
|
30
|
+
};
|
|
@@ -8,8 +8,8 @@ exports.SeoReportShell = void 0;
|
|
|
8
8
|
const react_1 = __importDefault(require("react"));
|
|
9
9
|
const SeoReportShell = ({ children, onBack, backLabel = 'Back', }) => {
|
|
10
10
|
return (react_1.default.createElement("div", { className: "seo-report mx-auto max-w-7xl space-y-6 p-6" },
|
|
11
|
-
onBack && (react_1.default.createElement("button", { type: "button", onClick: onBack, className: "flex items-center gap-1 text-sm text-slate-500 hover:
|
|
12
|
-
react_1.default.createElement("svg", { width: "
|
|
11
|
+
onBack && (react_1.default.createElement("button", { type: "button", onClick: onBack, className: "inline-flex items-center gap-2 rounded-full border border-slate-300/80 bg-white/85 px-3.5 py-1.5 text-xs font-semibold tracking-wide text-slate-700 shadow-sm transition-colors hover:border-slate-400 hover:bg-white hover:text-slate-900 dark:border-slate-600 dark:bg-slate-800/70 dark:text-slate-200 dark:hover:border-slate-500 dark:hover:bg-slate-800 dark:hover:text-white" },
|
|
12
|
+
react_1.default.createElement("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", className: "inline" },
|
|
13
13
|
react_1.default.createElement("path", { d: "M10 12L6 8l4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })),
|
|
14
14
|
backLabel)),
|
|
15
15
|
children));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeoDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/views/SeoDashboard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SeoDashboard.d.ts","sourceRoot":"","sources":["../../../src/components/views/SeoDashboard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAsBxE,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EA0ShC,CAAA"}
|
|
@@ -42,6 +42,7 @@ const MetricCardRow_1 = require("../visualization/MetricCardRow");
|
|
|
42
42
|
const CategoryScoreGrid_1 = require("../visualization/CategoryScoreGrid");
|
|
43
43
|
const ScoreTrendChart_1 = require("../visualization/ScoreTrendChart");
|
|
44
44
|
const IssueTable_1 = require("../tables/IssueTable");
|
|
45
|
+
const SeoReportShell_1 = require("../layout/SeoReportShell");
|
|
45
46
|
const SeoReportHeader_1 = require("../layout/SeoReportHeader");
|
|
46
47
|
const scoreHelpers_1 = require("../utils/scoreHelpers");
|
|
47
48
|
const formatters_1 = require("../utils/formatters");
|
|
@@ -194,58 +195,60 @@ const SeoDashboard = () => {
|
|
|
194
195
|
return (c.critical ?? 0) + (c.high ?? 0) + (c.medium ?? 0) + (c.low ?? 0) + (c.info ?? 0);
|
|
195
196
|
}, [latest]);
|
|
196
197
|
if (loading) {
|
|
197
|
-
return (react_1.default.createElement(
|
|
198
|
-
react_1.default.createElement("
|
|
199
|
-
react_1.default.createElement("div", { className: "
|
|
200
|
-
|
|
198
|
+
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, null,
|
|
199
|
+
react_1.default.createElement("section", { className: "rounded-xl border border-slate-200 bg-white p-6 dark:border-slate-700 dark:bg-slate-800" },
|
|
200
|
+
react_1.default.createElement("div", { className: "flex items-center gap-3" },
|
|
201
|
+
react_1.default.createElement("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-slate-300 border-t-slate-600 dark:border-slate-600 dark:border-t-slate-300" }),
|
|
202
|
+
react_1.default.createElement("p", { className: "text-sm text-slate-500 dark:text-slate-400" }, "Loading SEO data...")))));
|
|
201
203
|
}
|
|
202
|
-
return (react_1.default.createElement(
|
|
203
|
-
react_1.default.createElement(
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
react_1.default.createElement("div", { className: "
|
|
209
|
-
react_1.default.createElement("div", { className: "
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
react_1.default.createElement("div", { className: "h-full rounded-full bg-blue-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
react_1.default.createElement("
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
react_1.default.createElement(
|
|
222
|
-
|
|
223
|
-
delta.text,
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
react_1.default.createElement(
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
react_1.default.createElement("
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
react_1.default.createElement("
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
react_1.default.createElement("div",
|
|
247
|
-
react_1.default.createElement("
|
|
248
|
-
|
|
249
|
-
|
|
204
|
+
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, null,
|
|
205
|
+
react_1.default.createElement("section", { className: "space-y-6 rounded-xl border border-slate-200 bg-white p-6 dark:border-slate-700 dark:bg-slate-800" },
|
|
206
|
+
react_1.default.createElement(SeoReportHeader_1.SeoReportHeader, { title: "SEO Health Report", subtitle: latest ? `Last audit: ${(0, formatters_1.formatTimestamp)(latest.startedAt)}` : 'No audits have been run yet.', actions: react_1.default.createElement(react_1.default.Fragment, null,
|
|
207
|
+
react_1.default.createElement("a", { href: "/admin/globals/seo-integrations", className: "rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm font-medium text-slate-700 transition-colors hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-700 dark:text-slate-200 dark:hover:bg-slate-600" }, "Integrations"),
|
|
208
|
+
react_1.default.createElement("button", { type: "button", onClick: () => void fetchData(), className: "rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm font-medium text-slate-700 transition-colors hover:bg-slate-50 dark:border-slate-600 dark:bg-slate-700 dark:text-slate-200 dark:hover:bg-slate-600" }, "Refresh"),
|
|
209
|
+
react_1.default.createElement("button", { type: "button", onClick: () => void runAuditNow(), disabled: running, className: "rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white transition-colors hover:bg-slate-700 disabled:cursor-not-allowed disabled:opacity-60 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-white" }, running ? 'Running Audit...' : 'Run Audit Now')) }),
|
|
210
|
+
running && runningStep && (react_1.default.createElement("div", { className: "rounded-md border border-blue-200 bg-blue-50 px-4 py-3 dark:border-blue-800 dark:bg-blue-900/30" },
|
|
211
|
+
react_1.default.createElement("div", { className: "mb-2 flex items-center gap-3" },
|
|
212
|
+
react_1.default.createElement("div", { className: "h-4 w-4 animate-spin rounded-full border-2 border-blue-300 border-t-blue-600 dark:border-blue-700 dark:border-t-blue-400" }),
|
|
213
|
+
react_1.default.createElement("p", { className: "text-sm text-blue-700 dark:text-blue-300" }, runningStep),
|
|
214
|
+
react_1.default.createElement("span", { className: "ml-auto text-sm font-medium text-blue-700 dark:text-blue-300" },
|
|
215
|
+
runningProgress,
|
|
216
|
+
"%")),
|
|
217
|
+
react_1.default.createElement("div", { className: "h-2 w-full overflow-hidden rounded-full bg-blue-100 dark:bg-blue-900" },
|
|
218
|
+
react_1.default.createElement("div", { className: "h-full rounded-full bg-blue-600 transition-all duration-500 ease-out dark:bg-blue-400", style: { width: `${runningProgress}%` } })))),
|
|
219
|
+
error && (react_1.default.createElement("div", { className: "rounded-md border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/30 dark:text-red-300" }, error)),
|
|
220
|
+
!latest ? (react_1.default.createElement("div", { className: "flex flex-col items-center justify-center gap-3 rounded-lg border-2 border-dashed border-slate-200 py-16 dark:border-slate-700" },
|
|
221
|
+
react_1.default.createElement("p", { className: "text-lg font-medium text-slate-600 dark:text-slate-300" }, "No SEO audits yet"),
|
|
222
|
+
react_1.default.createElement("p", { className: "text-sm text-slate-500 dark:text-slate-400" }, "Run your first audit to see your site's SEO health."))) : (react_1.default.createElement(react_1.default.Fragment, null,
|
|
223
|
+
react_1.default.createElement("div", { className: "flex flex-col items-center gap-2 rounded-lg border border-slate-200 bg-gradient-to-br from-slate-50 to-white py-8 dark:border-slate-700 dark:from-slate-800/50 dark:to-slate-900/50" },
|
|
224
|
+
react_1.default.createElement(ScoreGauge_1.ScoreGauge, { score: overallScore, size: 140, showGrade: true }),
|
|
225
|
+
delta && react_1.default.createElement("span", { className: `text-sm font-medium ${delta.className}` },
|
|
226
|
+
delta.text,
|
|
227
|
+
" from previous")),
|
|
228
|
+
react_1.default.createElement(MetricCardRow_1.MetricCardRow, null,
|
|
229
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "Pages Crawled", value: (0, formatters_1.formatNumber)(latest.metrics?.pagesCrawled) }),
|
|
230
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "Critical Issues", value: latest.issueCounts?.critical ?? 0, valueClassName: (latest.issueCounts?.critical ?? 0) > 0
|
|
231
|
+
? 'text-red-600 dark:text-red-400'
|
|
232
|
+
: 'text-slate-900 dark:text-slate-100' }),
|
|
233
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "High Issues", value: latest.issueCounts?.high ?? 0, valueClassName: (latest.issueCounts?.high ?? 0) > 0
|
|
234
|
+
? 'text-orange-600 dark:text-orange-400'
|
|
235
|
+
: 'text-slate-900 dark:text-slate-100' }),
|
|
236
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "Lighthouse", value: latest.metrics?.avgLighthousePerformance != null ? `${Math.round(latest.metrics.avgLighthousePerformance)}` : '-', subtext: "Performance" }),
|
|
237
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "Avg LCP", value: (0, formatters_1.formatMs)(latest.metrics?.avgLCPMs), subtext: "Largest Contentful Paint" }),
|
|
238
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "Avg CLS", value: (0, formatters_1.formatCLS)(latest.metrics?.avgCLS), subtext: "Cumulative Layout Shift" }),
|
|
239
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "CrUX LCP p75", value: (0, formatters_1.formatMs)(latest.metrics?.cruxP75LCPMs), subtext: latest.metrics?.cruxAvailable ? 'Field Data' : 'Unavailable' }),
|
|
240
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "CrUX INP p75", value: (0, formatters_1.formatMs)(latest.metrics?.cruxP75INPMs), subtext: latest.metrics?.cruxAvailable ? 'Field Data' : 'Unavailable' }),
|
|
241
|
+
react_1.default.createElement(MetricCard_1.MetricCard, { label: "CrUX CLS p75", value: (0, formatters_1.formatCLS)(latest.metrics?.cruxP75CLS), subtext: latest.metrics?.cruxSource ? `Source: ${latest.metrics.cruxSource}` : 'No source' })),
|
|
242
|
+
react_1.default.createElement("div", null,
|
|
243
|
+
react_1.default.createElement("h2", { className: "mb-3 text-sm font-semibold text-slate-900 dark:text-slate-100" }, "Category Breakdown"),
|
|
244
|
+
react_1.default.createElement(CategoryScoreGrid_1.CategoryScoreGrid, { scores: latest.scores || {}, previousScores: previous?.scores })),
|
|
245
|
+
react_1.default.createElement("div", null,
|
|
246
|
+
react_1.default.createElement("h2", { className: "mb-3 text-sm font-semibold text-slate-900 dark:text-slate-100" }, "Score Trend"),
|
|
247
|
+
react_1.default.createElement(ScoreTrendChart_1.ScoreTrendChart, { points: trendPoints })),
|
|
248
|
+
react_1.default.createElement("div", null,
|
|
249
|
+
react_1.default.createElement("div", { className: "mb-3 flex items-center justify-between" },
|
|
250
|
+
react_1.default.createElement("h2", { className: "text-sm font-semibold text-slate-900 dark:text-slate-100" }, "Top Issues"),
|
|
251
|
+
latest && (react_1.default.createElement("a", { href: `/admin/collections/seo-snapshots/${latest.id}`, className: "text-sm text-slate-500 hover:text-slate-700 dark:text-slate-400 dark:hover:text-slate-200" }, "View Full Report \u2192"))),
|
|
252
|
+
react_1.default.createElement(IssueTable_1.IssueTable, { issues: latestIssues, pageSize: 10 })))))));
|
|
250
253
|
};
|
|
251
254
|
exports.SeoDashboard = SeoDashboard;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeoPageReport.d.ts","sourceRoot":"","sources":["../../../src/components/views/SeoPageReport.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SeoPageReport.d.ts","sourceRoot":"","sources":["../../../src/components/views/SeoPageReport.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;AA4DxE,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAwTjC,CAAA"}
|
|
@@ -36,6 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
37
|
exports.SeoPageReport = void 0;
|
|
38
38
|
const react_1 = __importStar(require("react"));
|
|
39
|
+
const navigation_1 = require("next/navigation");
|
|
39
40
|
const lucide_react_1 = require("lucide-react");
|
|
40
41
|
const ScoreGauge_1 = require("../visualization/ScoreGauge");
|
|
41
42
|
const ScoreBar_1 = require("../visualization/ScoreBar");
|
|
@@ -46,15 +47,15 @@ const SeoReportHeader_1 = require("../layout/SeoReportHeader");
|
|
|
46
47
|
const PdfDownloadButton_1 = require("../pdf/PdfDownloadButton");
|
|
47
48
|
const formatters_1 = require("../utils/formatters");
|
|
48
49
|
const types_1 = require("../types");
|
|
49
|
-
const getIdFromPath = () => {
|
|
50
|
-
if (
|
|
50
|
+
const getIdFromPath = (pathname) => {
|
|
51
|
+
if (!pathname)
|
|
51
52
|
return null;
|
|
52
|
-
const segments =
|
|
53
|
+
const segments = pathname.split('/').filter(Boolean);
|
|
53
54
|
const idx = segments.indexOf('seo-page-results');
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return
|
|
55
|
+
const id = idx >= 0 ? segments[idx + 1] : null;
|
|
56
|
+
if (!id || id === 'create')
|
|
57
|
+
return null;
|
|
58
|
+
return decodeURIComponent(id);
|
|
58
59
|
};
|
|
59
60
|
const CATEGORY_ICONS = {
|
|
60
61
|
metadata: react_1.default.createElement(lucide_react_1.FileText, { size: 16 }),
|
|
@@ -80,10 +81,20 @@ const CATEGORIES = [
|
|
|
80
81
|
'performance',
|
|
81
82
|
];
|
|
82
83
|
const SeoPageReport = () => {
|
|
84
|
+
const pathname = (0, navigation_1.usePathname)();
|
|
83
85
|
const [pageResult, setPageResult] = (0, react_1.useState)(null);
|
|
84
86
|
const [loading, setLoading] = (0, react_1.useState)(true);
|
|
85
87
|
const [error, setError] = (0, react_1.useState)(null);
|
|
86
|
-
const pageResultId = (0, react_1.useMemo)(() => getIdFromPath(), []);
|
|
88
|
+
const pageResultId = (0, react_1.useMemo)(() => getIdFromPath(pathname), [pathname]);
|
|
89
|
+
const handleBack = (0, react_1.useCallback)(() => {
|
|
90
|
+
if (typeof window === 'undefined')
|
|
91
|
+
return;
|
|
92
|
+
if (window.history.length > 1) {
|
|
93
|
+
window.history.back();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
window.location.href = '/admin/collections/seo-snapshots';
|
|
97
|
+
}, []);
|
|
87
98
|
const fetchPageResult = (0, react_1.useCallback)(async () => {
|
|
88
99
|
if (!pageResultId) {
|
|
89
100
|
setError('Could not determine page result ID.');
|
|
@@ -136,13 +147,13 @@ const SeoPageReport = () => {
|
|
|
136
147
|
react_1.default.createElement("p", { className: "text-sm text-slate-500 dark:text-slate-400" }, "Loading page report..."))));
|
|
137
148
|
}
|
|
138
149
|
if (error || !pageResult) {
|
|
139
|
-
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack:
|
|
150
|
+
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack: handleBack, backLabel: "Back" },
|
|
140
151
|
react_1.default.createElement("div", { className: "rounded-md border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/30 dark:text-red-300" }, error || 'No data available.')));
|
|
141
152
|
}
|
|
142
153
|
const overallScore = pageResult.overallScore ?? 0;
|
|
143
154
|
const titleInfo = (0, formatters_1.formatCharCount)(pageResult.title, 20, 65);
|
|
144
155
|
const descInfo = (0, formatters_1.formatCharCount)(pageResult.metaDescription, 70, 165);
|
|
145
|
-
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack:
|
|
156
|
+
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack: handleBack, backLabel: "Back to Snapshot" },
|
|
146
157
|
react_1.default.createElement("div", { className: "space-y-6", id: "seo-page-report" },
|
|
147
158
|
react_1.default.createElement(SeoReportHeader_1.SeoReportHeader, { title: "Page SEO Report", subtitle: pageResult.url, actions: react_1.default.createElement(PdfDownloadButton_1.PdfDownloadButton, { targetId: "seo-page-report", filename: `page-seo-${pageResult.path || pageResultId}` }), badges: pageResult.statusCode ? (react_1.default.createElement("span", { className: `inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-medium ${pageResult.statusCode === 200
|
|
148
159
|
? 'border-green-200 bg-green-50 text-green-700'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SeoSnapshotReport.d.ts","sourceRoot":"","sources":["../../../src/components/views/SeoSnapshotReport.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SeoSnapshotReport.d.ts","sourceRoot":"","sources":["../../../src/components/views/SeoSnapshotReport.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;AA8BxE,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAoVrC,CAAA"}
|
|
@@ -36,6 +36,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
36
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
37
|
exports.SeoSnapshotReport = void 0;
|
|
38
38
|
const react_1 = __importStar(require("react"));
|
|
39
|
+
const navigation_1 = require("next/navigation");
|
|
39
40
|
const ScoreGauge_1 = require("../visualization/ScoreGauge");
|
|
40
41
|
const MetricCard_1 = require("../visualization/MetricCard");
|
|
41
42
|
const CategoryScoreGrid_1 = require("../visualization/CategoryScoreGrid");
|
|
@@ -49,17 +50,18 @@ const PdfDownloadButton_1 = require("../pdf/PdfDownloadButton");
|
|
|
49
50
|
const formatters_1 = require("../utils/formatters");
|
|
50
51
|
const scoreHelpers_1 = require("../utils/scoreHelpers");
|
|
51
52
|
const types_1 = require("../types");
|
|
52
|
-
const getIdFromPath = () => {
|
|
53
|
-
if (
|
|
53
|
+
const getIdFromPath = (pathname) => {
|
|
54
|
+
if (!pathname)
|
|
54
55
|
return null;
|
|
55
|
-
const segments =
|
|
56
|
+
const segments = pathname.split('/').filter(Boolean);
|
|
56
57
|
const idx = segments.indexOf('seo-snapshots');
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return
|
|
58
|
+
const id = idx >= 0 ? segments[idx + 1] : null;
|
|
59
|
+
if (!id || id === 'create')
|
|
60
|
+
return null;
|
|
61
|
+
return decodeURIComponent(id);
|
|
61
62
|
};
|
|
62
63
|
const SeoSnapshotReport = () => {
|
|
64
|
+
const pathname = (0, navigation_1.usePathname)();
|
|
63
65
|
const [reportData, setReportData] = (0, react_1.useState)(null);
|
|
64
66
|
const [loading, setLoading] = (0, react_1.useState)(true);
|
|
65
67
|
const [error, setError] = (0, react_1.useState)(null);
|
|
@@ -73,7 +75,16 @@ const SeoSnapshotReport = () => {
|
|
|
73
75
|
});
|
|
74
76
|
const [pageResultsLoading, setPageResultsLoading] = (0, react_1.useState)(false);
|
|
75
77
|
const [activeTab, setActiveTab] = (0, react_1.useState)('overview');
|
|
76
|
-
const snapshotId = (0, react_1.useMemo)(() => getIdFromPath(), []);
|
|
78
|
+
const snapshotId = (0, react_1.useMemo)(() => getIdFromPath(pathname), [pathname]);
|
|
79
|
+
const handleBackToSnapshots = (0, react_1.useCallback)(() => {
|
|
80
|
+
if (typeof window === 'undefined')
|
|
81
|
+
return;
|
|
82
|
+
if (window.history.length > 1) {
|
|
83
|
+
window.history.back();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
window.location.href = '/admin/collections/seo-snapshots';
|
|
87
|
+
}, []);
|
|
77
88
|
const fetchReport = (0, react_1.useCallback)(async () => {
|
|
78
89
|
if (!snapshotId) {
|
|
79
90
|
setError('Could not determine snapshot ID.');
|
|
@@ -144,7 +155,7 @@ const SeoSnapshotReport = () => {
|
|
|
144
155
|
react_1.default.createElement("p", { className: "text-sm text-slate-500 dark:text-slate-400" }, "Loading snapshot report..."))));
|
|
145
156
|
}
|
|
146
157
|
if (error || !reportData) {
|
|
147
|
-
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack:
|
|
158
|
+
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack: handleBackToSnapshots, backLabel: "Back to Snapshots" },
|
|
148
159
|
react_1.default.createElement("div", { className: "rounded-md border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 dark:border-red-800 dark:bg-red-900/30 dark:text-red-300" }, error || 'No data available.')));
|
|
149
160
|
}
|
|
150
161
|
const { snapshot, aggregated } = reportData;
|
|
@@ -152,7 +163,7 @@ const SeoSnapshotReport = () => {
|
|
|
152
163
|
const metrics = snapshot.metrics || {};
|
|
153
164
|
const issueCounts = snapshot.issueCounts || {};
|
|
154
165
|
const overallScore = scores.overall ?? 0;
|
|
155
|
-
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack:
|
|
166
|
+
return (react_1.default.createElement(SeoReportShell_1.SeoReportShell, { onBack: handleBackToSnapshots, backLabel: "Back to Snapshots" },
|
|
156
167
|
react_1.default.createElement("div", { className: "space-y-6", id: "seo-snapshot-report" },
|
|
157
168
|
react_1.default.createElement(SeoReportHeader_1.SeoReportHeader, { title: snapshot.runLabel || 'SEO Audit Report', subtitle: (0, formatters_1.formatTimestamp)(snapshot.startedAt), actions: react_1.default.createElement(PdfDownloadButton_1.PdfDownloadButton, { targetId: "seo-snapshot-report", filename: `seo-report-${snapshot.runLabel || snapshotId}` }), badges: react_1.default.createElement(react_1.default.Fragment, null,
|
|
158
169
|
react_1.default.createElement("span", { className: "inline-flex items-center rounded-full border border-slate-200 bg-slate-50 px-2.5 py-0.5 text-xs font-medium text-slate-600 dark:border-slate-700 dark:bg-slate-800 dark:text-slate-400" }, snapshot.runType || 'manual'),
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AACrC,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAYzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAEpD,eAAO,MAAM,cAAc,GAAI,cAAc,oBAAoB,MACvD,gBAAgB,MAAM,KAAG,MAwBlC,CAAA;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,mBAAmB,GAAG,IAAI,CAErE"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ const SeoSnapshots_1 = require("./collections/SeoSnapshots");
|
|
|
7
7
|
const SeoPageResults_1 = require("./collections/SeoPageResults");
|
|
8
8
|
const SeoKeywordVisibility_1 = require("./collections/SeoKeywordVisibility");
|
|
9
9
|
const SeoAuthoritySnapshots_1 = require("./collections/SeoAuthoritySnapshots");
|
|
10
|
+
const SeoDashboardView_1 = require("./collections/SeoDashboardView");
|
|
10
11
|
const SeoDashboard_1 = require("./globals/SeoDashboard");
|
|
11
12
|
const SeoIntegrations_1 = require("./globals/SeoIntegrations");
|
|
12
13
|
const seoAuditPlugin = (pluginConfig) => {
|
|
@@ -14,6 +15,7 @@ const seoAuditPlugin = (pluginConfig) => {
|
|
|
14
15
|
const seoConfig = (0, config_1.normalizeConfig)(pluginConfig);
|
|
15
16
|
const collections = [
|
|
16
17
|
...(incomingConfig.collections || []),
|
|
18
|
+
SeoDashboardView_1.SeoDashboardView,
|
|
17
19
|
SeoSnapshots_1.SeoSnapshots,
|
|
18
20
|
SeoPageResults_1.SeoPageResults,
|
|
19
21
|
SeoKeywordVisibility_1.SeoKeywordVisibility,
|
package/package.json
CHANGED