@prenta/admin 1.14.0 → 1.15.0
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/CHANGELOG.md +10 -0
- package/dist/__tests__/lib/api.test.d.ts +2 -0
- package/dist/__tests__/lib/api.test.d.ts.map +1 -0
- package/dist/__tests__/lib/api.test.js +58 -0
- package/dist/__tests__/lib/api.test.js.map +1 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.d.ts +2 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.d.ts.map +1 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.js +171 -0
- package/dist/__tests__/lib/seo-service-autopilot.test.js.map +1 -0
- package/dist/__tests__/lib/seo-service-proposals.test.js +28 -0
- package/dist/__tests__/lib/seo-service-proposals.test.js.map +1 -1
- package/dist/__tests__/views/redirects-pane.render.test.js +30 -12
- package/dist/__tests__/views/redirects-pane.render.test.js.map +1 -1
- package/dist/__tests__/views/seo-autopilot-applied.render.test.d.ts +2 -0
- package/dist/__tests__/views/seo-autopilot-applied.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/seo-autopilot-applied.render.test.js +330 -0
- package/dist/__tests__/views/seo-autopilot-applied.render.test.js.map +1 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.d.ts +2 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.js +512 -0
- package/dist/__tests__/views/seo-autopilot-card.render.test.js.map +1 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.js +139 -0
- package/dist/__tests__/views/seo-proposals-tab.render.test.js.map +1 -1
- package/dist/__tests__/views/seo-settings.render.test.js +41 -4
- package/dist/__tests__/views/seo-settings.render.test.js.map +1 -1
- package/dist/lib/api.d.ts +13 -2
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +1 -2
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/seo-service.d.ts +206 -2
- package/dist/lib/seo-service.d.ts.map +1 -1
- package/dist/lib/seo-service.js +139 -5
- package/dist/lib/seo-service.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/SEO.js +1 -1
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/seo/AutopilotAppliedSection.d.ts +10 -0
- package/dist/views/seo/AutopilotAppliedSection.d.ts.map +1 -0
- package/dist/views/seo/AutopilotAppliedSection.js +295 -0
- package/dist/views/seo/AutopilotAppliedSection.js.map +1 -0
- package/dist/views/seo/ProposalsTab.d.ts.map +1 -1
- package/dist/views/seo/ProposalsTab.js +53 -17
- package/dist/views/seo/ProposalsTab.js.map +1 -1
- package/dist/views/seo/RedirectsTab.d.ts +3 -1
- package/dist/views/seo/RedirectsTab.d.ts.map +1 -1
- package/dist/views/seo/RedirectsTab.js +14 -19
- package/dist/views/seo/RedirectsTab.js.map +1 -1
- package/dist/views/seo/relative-age.d.ts +7 -0
- package/dist/views/seo/relative-age.d.ts.map +1 -0
- package/dist/views/seo/relative-age.js +20 -0
- package/dist/views/seo/relative-age.js.map +1 -0
- package/dist/views/settings/SeoAutopilotCard.d.ts +30 -0
- package/dist/views/settings/SeoAutopilotCard.d.ts.map +1 -0
- package/dist/views/settings/SeoAutopilotCard.js +375 -0
- package/dist/views/settings/SeoAutopilotCard.js.map +1 -0
- package/dist/views/settings/SeoSettingsTab.d.ts.map +1 -1
- package/dist/views/settings/SeoSettingsTab.js +2 -1
- package/dist/views/settings/SeoSettingsTab.js.map +1 -1
- package/dist/views/settings/components.d.ts +3 -1
- package/dist/views/settings/components.d.ts.map +1 -1
- package/dist/views/settings/components.js +2 -2
- package/dist/views/settings/components.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/lib/api.test.ts +76 -0
- package/src/__tests__/lib/seo-service-autopilot.test.ts +196 -0
- package/src/__tests__/lib/seo-service-proposals.test.ts +29 -0
- package/src/__tests__/views/redirects-pane.render.test.tsx +36 -16
- package/src/__tests__/views/seo-autopilot-applied.render.test.tsx +382 -0
- package/src/__tests__/views/seo-autopilot-card.render.test.tsx +610 -0
- package/src/__tests__/views/seo-proposals-tab.render.test.tsx +161 -0
- package/src/__tests__/views/seo-settings.render.test.tsx +47 -7
- package/src/lib/api.ts +19 -3
- package/src/lib/seo-service.ts +334 -6
- package/src/views/SEO.tsx +1 -1
- package/src/views/seo/AutopilotAppliedSection.tsx +597 -0
- package/src/views/seo/ProposalsTab.tsx +92 -12
- package/src/views/seo/RedirectsTab.tsx +39 -60
- package/src/views/seo/relative-age.ts +15 -0
- package/src/views/settings/SeoAutopilotCard.tsx +826 -0
- package/src/views/settings/SeoSettingsTab.tsx +2 -0
- package/src/views/settings/components.tsx +10 -1
package/dist/views/SEO.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SEO.js","sourceRoot":"","sources":["../../src/views/SEO.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SEO.js","sourceRoot":"","sources":["../../src/views/SEO.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function AutopilotAppliedSection({ onNavigate, onChanged, refreshKey, }: {
|
|
2
|
+
onNavigate?: (path: string) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Fired after a successful revert. The server reopens the originating issue
|
|
5
|
+
* or redirect suggestion, so the parent inbox / overview must refetch.
|
|
6
|
+
*/
|
|
7
|
+
onChanged?: () => void;
|
|
8
|
+
refreshKey?: number;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=AutopilotAppliedSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutopilotAppliedSection.d.ts","sourceRoot":"","sources":["../../../src/views/seo/AutopilotAppliedSection.tsx"],"names":[],"mappings":"AAiNA,wBAAgB,uBAAuB,CAAC,EACtC,UAAU,EACV,SAAS,EACT,UAAc,GACf,EAAE;IACD,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,2CAuXA"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* SEO → Proposals "Applied by autopilot": the ledger of every unattended change
|
|
5
|
+
* (spec §4), newest first, with its gate results and Search Console outcome.
|
|
6
|
+
* Revert is admin-only (`canRevert` from the list payload) and confirmed; a 409
|
|
7
|
+
* conflict re-prompts with the fields a human edited since and offers a forced
|
|
8
|
+
* retry. One mutation is allowed in flight at a time (same guard pattern as
|
|
9
|
+
* `ProposalsTab`).
|
|
10
|
+
*/
|
|
11
|
+
import { useCallback, useEffect, useId, useRef, useState } from 'react';
|
|
12
|
+
import { ArrowRight, Bot, Undo2 } from 'lucide-react';
|
|
13
|
+
import { toast } from 'sonner';
|
|
14
|
+
import { fetchAutopilotApplied, revertAutopilotChange, } from '../../lib/seo-service.js';
|
|
15
|
+
import { sourceEditPath } from '../../lib/collection-routes.js';
|
|
16
|
+
import { brandAlignmentLabel, brandAlignmentTone } from '../../lib/brand-voice-client.js';
|
|
17
|
+
import { SectionCard, SeoEmptyState, SeoErrorState, SeoLoading, SeoStatusBadge, btnSecondary, } from '../../components/seo/primitives.js';
|
|
18
|
+
import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js';
|
|
19
|
+
import { relativeAge } from './relative-age.js';
|
|
20
|
+
const PAGE_SIZE = 20;
|
|
21
|
+
const SEO_SETTINGS_PATH = '/settings?tab=seo';
|
|
22
|
+
const SELECT_CLASS = 'border-border bg-input-background text-foreground focus-visible:ring-ring rounded-md border px-2 py-1.5 text-sm focus-visible:ring-2 focus-visible:outline-none disabled:opacity-60';
|
|
23
|
+
/** Compact secondary button for table rows (parity with the Settings autopilot card). */
|
|
24
|
+
const ROW_BUTTON_CLASS = 'border-border text-foreground hover:bg-accent focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-sm font-medium whitespace-nowrap transition-colors focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-60';
|
|
25
|
+
const PAGER_BUTTON_CLASS = 'text-foreground hover:bg-accent focus-visible:ring-ring rounded-md px-3 py-1.5 text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50';
|
|
26
|
+
const STATUS_OPTIONS = [
|
|
27
|
+
{ value: '', label: 'All statuses' },
|
|
28
|
+
{ value: 'applied', label: 'Applied' },
|
|
29
|
+
{ value: 'reverted', label: 'Reverted' },
|
|
30
|
+
{ value: 'outcome_reverted', label: 'Reverted after regression' },
|
|
31
|
+
{ value: 'verify_failed', label: 'Verify failed' },
|
|
32
|
+
];
|
|
33
|
+
const OUTCOME_OPTIONS = [
|
|
34
|
+
{ value: '', label: 'All outcomes' },
|
|
35
|
+
{ value: 'pending', label: 'Watching' },
|
|
36
|
+
{ value: 'held', label: 'Held' },
|
|
37
|
+
{ value: 'regressed', label: 'Regressed' },
|
|
38
|
+
{ value: 'insufficient_data', label: 'Not enough data' },
|
|
39
|
+
{ value: 'skipped', label: 'Not watched' },
|
|
40
|
+
];
|
|
41
|
+
function isStatus(v) {
|
|
42
|
+
return STATUS_OPTIONS.some((o) => o.value !== '' && o.value === v);
|
|
43
|
+
}
|
|
44
|
+
function isOutcome(v) {
|
|
45
|
+
return OUTCOME_OPTIONS.some((o) => o.value !== '' && o.value === v);
|
|
46
|
+
}
|
|
47
|
+
function StatusBadge({ status }) {
|
|
48
|
+
switch (status) {
|
|
49
|
+
case 'applied':
|
|
50
|
+
return _jsx(SeoStatusBadge, { label: "Applied", tone: "good" });
|
|
51
|
+
case 'verify_failed':
|
|
52
|
+
return _jsx(SeoStatusBadge, { label: "Verify failed", tone: "poor" });
|
|
53
|
+
case 'reverted':
|
|
54
|
+
return _jsx(SeoStatusBadge, { label: "Reverted", tone: "neutral" });
|
|
55
|
+
case 'outcome_reverted':
|
|
56
|
+
return _jsx(SeoStatusBadge, { label: "Reverted \u00B7 regression", tone: "fair" });
|
|
57
|
+
default: {
|
|
58
|
+
const _exhaustive = status;
|
|
59
|
+
return _exhaustive;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Only outcomes that carry information get a badge; `pending` / `skipped` stay quiet. */
|
|
64
|
+
function OutcomeBadge({ outcome }) {
|
|
65
|
+
switch (outcome) {
|
|
66
|
+
case 'pending':
|
|
67
|
+
case 'skipped':
|
|
68
|
+
return null;
|
|
69
|
+
case 'held':
|
|
70
|
+
return _jsx(SeoStatusBadge, { label: "Held", tone: "good" });
|
|
71
|
+
case 'regressed':
|
|
72
|
+
return _jsx(SeoStatusBadge, { label: "Regressed", tone: "poor" });
|
|
73
|
+
case 'insufficient_data':
|
|
74
|
+
return _jsx(SeoStatusBadge, { label: "Not enough data", tone: "neutral" });
|
|
75
|
+
default: {
|
|
76
|
+
const _exhaustive = outcome;
|
|
77
|
+
return _exhaustive;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function KindBadge({ kind }) {
|
|
82
|
+
switch (kind) {
|
|
83
|
+
case 'issue-fix':
|
|
84
|
+
return _jsx(SeoStatusBadge, { label: "Issue fix", tone: "neutral" });
|
|
85
|
+
case 'redirect':
|
|
86
|
+
return _jsx(SeoStatusBadge, { label: "Redirect", tone: "neutral" });
|
|
87
|
+
default: {
|
|
88
|
+
const _exhaustive = kind;
|
|
89
|
+
return _exhaustive;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** `missing-meta-title` → `Missing meta title`; the redirect pseudo-type names its producer. */
|
|
94
|
+
function issueTypeLabel(issueType) {
|
|
95
|
+
if (issueType === 'redirect')
|
|
96
|
+
return '404 recovery';
|
|
97
|
+
const words = issueType.replace(/[-_]+/g, ' ').trim();
|
|
98
|
+
return words ? words.charAt(0).toUpperCase() + words.slice(1) : issueType;
|
|
99
|
+
}
|
|
100
|
+
/** `metaTitle` → `Meta title`. */
|
|
101
|
+
function fieldLabel(field) {
|
|
102
|
+
const spaced = field.replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/[-_]+/g, ' ');
|
|
103
|
+
return spaced.charAt(0).toUpperCase() + spaced.slice(1).toLowerCase();
|
|
104
|
+
}
|
|
105
|
+
function formatValue(v) {
|
|
106
|
+
if (v === null || v === undefined || v === '')
|
|
107
|
+
return '—';
|
|
108
|
+
if (typeof v === 'string')
|
|
109
|
+
return v;
|
|
110
|
+
if (typeof v === 'number' || typeof v === 'boolean')
|
|
111
|
+
return String(v);
|
|
112
|
+
return JSON.stringify(v);
|
|
113
|
+
}
|
|
114
|
+
function displayTitle(row) {
|
|
115
|
+
if (row.kind === 'redirect')
|
|
116
|
+
return formatValue(row.after.source ?? row.entityUrl);
|
|
117
|
+
return row.entityTitle ?? row.entityUrl ?? row.path ?? issueTypeLabel(row.issueType);
|
|
118
|
+
}
|
|
119
|
+
function AppliedTime({ iso }) {
|
|
120
|
+
const absolute = new Date(iso).toLocaleString();
|
|
121
|
+
const relative = relativeAge(iso);
|
|
122
|
+
return (_jsxs("time", { dateTime: iso, title: absolute, children: [relative || absolute, relative ? _jsxs("span", { className: "sr-only", children: [" (", absolute, ")"] }) : null] }));
|
|
123
|
+
}
|
|
124
|
+
function Diff({ row }) {
|
|
125
|
+
if (row.kind === 'redirect') {
|
|
126
|
+
return (_jsxs("p", { className: "text-foreground flex flex-wrap items-center gap-1 font-mono text-sm break-all", children: [_jsx("span", { children: formatValue(row.after.source) }), _jsx(ArrowRight, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0", "aria-hidden": true }), _jsx("span", { className: "sr-only", children: "to" }), _jsx("span", { className: "text-muted-foreground", children: formatValue(row.after.destination) })] }));
|
|
127
|
+
}
|
|
128
|
+
const fields = Object.keys(row.after);
|
|
129
|
+
if (fields.length === 0)
|
|
130
|
+
return _jsx("span", { className: "text-muted-foreground text-sm", children: "\u2014" });
|
|
131
|
+
return (_jsx("ul", { className: "space-y-1 text-sm", children: fields.map((field) => (_jsxs("li", { className: "flex flex-wrap items-baseline gap-x-1.5", children: [_jsxs("span", { className: "text-muted-foreground", children: [fieldLabel(field), ":"] }), _jsx("span", { className: "text-muted-foreground line-through", children: formatValue(row.before?.[field]) }), _jsx(ArrowRight, { className: "text-muted-foreground h-3 w-3 shrink-0 self-center", "aria-hidden": true }), _jsx("span", { className: "sr-only", children: "to" }), _jsx("span", { className: "text-foreground", children: formatValue(row.after[field]) })] }, field))) }));
|
|
132
|
+
}
|
|
133
|
+
function Quality({ gate }) {
|
|
134
|
+
if (gate.brandAlignment !== null) {
|
|
135
|
+
return (_jsxs("span", { className: "border-border bg-muted/40 inline-flex items-center gap-1.5 rounded-md border px-2 py-0.5 text-xs", "aria-label": `Brand voice score ${gate.brandAlignment} out of 100`, children: [_jsxs("span", { className: `font-medium ${brandAlignmentTone(gate.brandAlignment)}`, children: [gate.brandAlignment, "/100"] }), _jsx("span", { className: "text-muted-foreground", children: brandAlignmentLabel(gate.brandAlignment) })] }));
|
|
136
|
+
}
|
|
137
|
+
if (gate.confidence !== null) {
|
|
138
|
+
const pct = Math.round(gate.confidence * 100);
|
|
139
|
+
return (_jsx(SeoStatusBadge, { label: `${pct}%`, tone: pct >= 70 ? 'good' : pct >= 40 ? 'fair' : 'poor' }));
|
|
140
|
+
}
|
|
141
|
+
return _jsx(SeoStatusBadge, { label: "Rule-based", tone: "neutral" });
|
|
142
|
+
}
|
|
143
|
+
export function AutopilotAppliedSection({ onNavigate, onChanged, refreshKey = 0, }) {
|
|
144
|
+
const baseId = useId();
|
|
145
|
+
const [data, setData] = useState(null);
|
|
146
|
+
const [loading, setLoading] = useState(true);
|
|
147
|
+
const [error, setError] = useState(null);
|
|
148
|
+
const [page, setPage] = useState(1);
|
|
149
|
+
const [status, setStatus] = useState('');
|
|
150
|
+
const [outcome, setOutcome] = useState('');
|
|
151
|
+
const [target, setTarget] = useState(null);
|
|
152
|
+
const [conflict, setConflict] = useState(null);
|
|
153
|
+
const [mutation, setMutation] = useState(null);
|
|
154
|
+
/** The one line that changes after a revert — announced via `role="status"`. */
|
|
155
|
+
const [lastReverted, setLastReverted] = useState(null);
|
|
156
|
+
/** Mirrors `mutation` synchronously so a second click in the same tick cannot slip past. */
|
|
157
|
+
const mutationRef = useRef(null);
|
|
158
|
+
const mountedRef = useRef(true);
|
|
159
|
+
/** Ignore responses from a superseded request (filter/page changed mid-flight). */
|
|
160
|
+
const requestRef = useRef(0);
|
|
161
|
+
const busy = mutation !== null;
|
|
162
|
+
useEffect(() => {
|
|
163
|
+
mountedRef.current = true;
|
|
164
|
+
return () => {
|
|
165
|
+
mountedRef.current = false;
|
|
166
|
+
};
|
|
167
|
+
}, []);
|
|
168
|
+
/**
|
|
169
|
+
* `silent` re-reads keep the table on screen (post-revert / parent refresh);
|
|
170
|
+
* the initial load and filter or page changes show the loading state.
|
|
171
|
+
*/
|
|
172
|
+
const load = useCallback(async (silent) => {
|
|
173
|
+
const requestId = ++requestRef.current;
|
|
174
|
+
if (!silent) {
|
|
175
|
+
setLoading(true);
|
|
176
|
+
setLastReverted(null);
|
|
177
|
+
}
|
|
178
|
+
setError(null);
|
|
179
|
+
try {
|
|
180
|
+
const next = await fetchAutopilotApplied({
|
|
181
|
+
page,
|
|
182
|
+
pageSize: PAGE_SIZE,
|
|
183
|
+
status: status || undefined,
|
|
184
|
+
outcome: outcome || undefined,
|
|
185
|
+
});
|
|
186
|
+
if (!mountedRef.current || requestId !== requestRef.current)
|
|
187
|
+
return;
|
|
188
|
+
setData(next);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
if (!mountedRef.current || requestId !== requestRef.current)
|
|
192
|
+
return;
|
|
193
|
+
setError(err instanceof Error && err.message ? err.message : 'Failed to load autopilot history.');
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
if (mountedRef.current && requestId === requestRef.current)
|
|
197
|
+
setLoading(false);
|
|
198
|
+
}
|
|
199
|
+
}, [page, status, outcome]);
|
|
200
|
+
useEffect(() => {
|
|
201
|
+
void load(false);
|
|
202
|
+
}, [load]);
|
|
203
|
+
const seenRefreshKeyRef = useRef(refreshKey);
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
if (seenRefreshKeyRef.current === refreshKey)
|
|
206
|
+
return;
|
|
207
|
+
seenRefreshKeyRef.current = refreshKey;
|
|
208
|
+
void load(true);
|
|
209
|
+
}, [load, refreshKey]);
|
|
210
|
+
// A filtered refetch can land on a page that no longer exists (e.g. the
|
|
211
|
+
// only `applied` row on page 3 was just reverted). Snap back to the last page.
|
|
212
|
+
useEffect(() => {
|
|
213
|
+
if (!data || data.docs.length > 0 || page <= 1)
|
|
214
|
+
return;
|
|
215
|
+
setPage(Math.max(1, Math.ceil(data.total / data.pageSize)));
|
|
216
|
+
}, [data, page]);
|
|
217
|
+
const beginMutation = useCallback((kind) => {
|
|
218
|
+
if (mutationRef.current !== null)
|
|
219
|
+
return false;
|
|
220
|
+
mutationRef.current = kind;
|
|
221
|
+
setMutation(kind);
|
|
222
|
+
return true;
|
|
223
|
+
}, []);
|
|
224
|
+
const endMutation = useCallback(() => {
|
|
225
|
+
mutationRef.current = null;
|
|
226
|
+
if (mountedRef.current)
|
|
227
|
+
setMutation(null);
|
|
228
|
+
}, []);
|
|
229
|
+
const doRevert = useCallback(async (row, force) => {
|
|
230
|
+
if (!beginMutation('revert'))
|
|
231
|
+
return;
|
|
232
|
+
try {
|
|
233
|
+
const res = await revertAutopilotChange(row.id, force);
|
|
234
|
+
if (!mountedRef.current)
|
|
235
|
+
return;
|
|
236
|
+
if (res.ok) {
|
|
237
|
+
toast.success('Change reverted.');
|
|
238
|
+
setLastReverted(displayTitle(row));
|
|
239
|
+
onChanged?.();
|
|
240
|
+
await load(true);
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (res.conflictFields !== undefined) {
|
|
244
|
+
setConflict({ row, fields: res.conflictFields });
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
toast.error(res.error);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
if (mountedRef.current) {
|
|
251
|
+
toast.error(err instanceof Error && err.message ? err.message : 'Request failed.');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
finally {
|
|
255
|
+
endMutation();
|
|
256
|
+
}
|
|
257
|
+
}, [beginMutation, endMutation, load, onChanged]);
|
|
258
|
+
const rows = data?.docs ?? [];
|
|
259
|
+
const total = data?.total ?? 0;
|
|
260
|
+
const pageSize = data?.pageSize ?? PAGE_SIZE;
|
|
261
|
+
const totalPages = Math.max(1, Math.ceil(total / pageSize));
|
|
262
|
+
const rangeStart = total === 0 ? 0 : (page - 1) * pageSize + 1;
|
|
263
|
+
const rangeEnd = Math.min(total, page * pageSize);
|
|
264
|
+
const filtering = status !== '' || outcome !== '';
|
|
265
|
+
const statusId = `${baseId}-status`;
|
|
266
|
+
const outcomeId = `${baseId}-outcome`;
|
|
267
|
+
return (_jsxs(SectionCard, { title: "Applied by autopilot", description: "Every unattended change with its gate results and Search Console outcome. Revert restores the previous values and reopens the issue.", action: _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("label", { htmlFor: statusId, className: "sr-only", children: "Filter by status" }), _jsx("select", { id: statusId, className: SELECT_CLASS, value: status, disabled: busy, onChange: (e) => {
|
|
268
|
+
const v = e.target.value;
|
|
269
|
+
setStatus(isStatus(v) ? v : '');
|
|
270
|
+
setPage(1);
|
|
271
|
+
}, children: STATUS_OPTIONS.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value))) }), _jsx("label", { htmlFor: outcomeId, className: "sr-only", children: "Filter by outcome" }), _jsx("select", { id: outcomeId, className: SELECT_CLASS, value: outcome, disabled: busy, onChange: (e) => {
|
|
272
|
+
const v = e.target.value;
|
|
273
|
+
setOutcome(isOutcome(v) ? v : '');
|
|
274
|
+
setPage(1);
|
|
275
|
+
}, children: OUTCOME_OPTIONS.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value))) })] }), children: [_jsx("p", { className: `text-muted-foreground text-sm ${lastReverted && !loading ? 'mb-3' : ''}`, role: "status", "aria-live": "polite", children: lastReverted && !loading ? `Reverted the change to “${lastReverted}”.` : '' }), loading ? (_jsx(SeoLoading, { label: "Loading autopilot history\u2026" })) : error ? (_jsx(SeoErrorState, { message: error, onRetry: () => void load(false) })) : rows.length === 0 ? (_jsx(SeoEmptyState, { icon: _jsx(Bot, { size: 24 }), title: filtering ? 'No changes match these filters' : 'Autopilot has not applied anything yet', description: filtering
|
|
276
|
+
? 'Clear the status or outcome filter to see the full ledger.'
|
|
277
|
+
: 'Enable fix types in Settings → SEO → SEO Autopilot; changes show up here after the daily run.', action: filtering ? (_jsx("button", { type: "button", className: btnSecondary, onClick: () => {
|
|
278
|
+
setStatus('');
|
|
279
|
+
setOutcome('');
|
|
280
|
+
setPage(1);
|
|
281
|
+
}, children: "Clear filters" })) : onNavigate ? (_jsx("button", { type: "button", className: btnSecondary, onClick: () => onNavigate(SEO_SETTINGS_PATH), children: "Open autopilot settings" })) : undefined })) : (_jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "border-border overflow-x-auto rounded-md border", children: _jsxs("table", { className: "w-full text-sm", "aria-label": "Changes applied by autopilot", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-border bg-muted/40 text-muted-foreground border-b text-left text-xs", children: [_jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Change" }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Before \u2192 after" }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Quality" }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Applied on" }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Outcome" }), _jsx("th", { scope: "col", className: "px-3 py-2.5", children: _jsx("span", { className: "sr-only", children: "Actions" }) })] }) }), _jsx("tbody", { className: "divide-border divide-y", children: rows.map((row) => {
|
|
282
|
+
const title = displayTitle(row);
|
|
283
|
+
const editPath = row.entityId !== null
|
|
284
|
+
? sourceEditPath(row.collection ?? undefined, row.entityId)
|
|
285
|
+
: null;
|
|
286
|
+
return (_jsxs("tr", { className: "hover:bg-accent/20 align-top transition-colors", children: [_jsxs("td", { className: "px-3 py-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [editPath && onNavigate ? (_jsx("button", { type: "button", className: "text-foreground focus-visible:ring-ring rounded-sm text-left font-medium hover:underline focus-visible:ring-2 focus-visible:outline-none", onClick: () => onNavigate(editPath), "aria-label": `Open ${title} in editor`, children: title })) : (_jsx("span", { className: "text-foreground font-medium", children: title })), _jsx(KindBadge, { kind: row.kind }), _jsx(StatusBadge, { status: row.status })] }), _jsxs("p", { className: "text-muted-foreground mt-0.5 text-xs", children: [_jsx("span", { children: issueTypeLabel(row.issueType) }), row.entityUrl && row.entityTitle ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": true, children: " \u00B7 " }), _jsx("span", { children: row.entityUrl })] })) : null] })] }), _jsx("td", { className: "max-w-md px-3 py-3", children: _jsx(Diff, { row: row }) }), _jsx("td", { className: "px-3 py-3", children: _jsx(Quality, { gate: row.gate }) }), _jsx("td", { className: "text-muted-foreground px-3 py-3 text-xs whitespace-nowrap", children: _jsx(AppliedTime, { iso: row.appliedAt }) }), _jsx("td", { className: "px-3 py-3", children: _jsx(OutcomeBadge, { outcome: row.outcome }) }), _jsx("td", { className: "px-3 py-3 text-right", children: data?.canRevert && row.status === 'applied' ? (_jsxs("button", { type: "button", className: ROW_BUTTON_CLASS, onClick: () => setTarget(row), disabled: busy, "aria-label": `Revert change to ${title}`, children: [_jsx(Undo2, { className: "h-4 w-4", "aria-hidden": true }), "Revert"] })) : null })] }, row.id));
|
|
287
|
+
}) })] }) }), total > pageSize ? (_jsxs("nav", { className: "flex items-center justify-between gap-3 text-sm", "aria-label": "Autopilot history pagination", children: [_jsxs("p", { className: "text-muted-foreground", children: [rangeStart, "\u2013", rangeEnd, " of ", total] }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { type: "button", className: PAGER_BUTTON_CLASS, disabled: page <= 1 || busy, onClick: () => setPage((p) => Math.max(1, p - 1)), children: "Previous" }), _jsx("button", { type: "button", className: PAGER_BUTTON_CLASS, disabled: page >= totalPages || busy, onClick: () => setPage((p) => Math.min(totalPages, p + 1)), children: "Next" })] })] })) : null] })), _jsx(ConfirmDialog, { open: target !== null, onClose: () => setTarget(null), onConfirm: () => {
|
|
288
|
+
if (target)
|
|
289
|
+
void doRevert(target, false);
|
|
290
|
+
}, title: "Revert this autopilot change?", description: "The previous values are restored (a new version is created) and the issue is reopened. Autopilot will not touch this issue again for 30 days.", confirmLabel: "Revert change", destructive: true }), _jsx(ConfirmDialog, { open: conflict !== null, onClose: () => setConflict(null), onConfirm: () => {
|
|
291
|
+
if (conflict)
|
|
292
|
+
void doRevert(conflict.row, true);
|
|
293
|
+
}, title: "Someone edited this since", description: `These fields were changed after autopilot applied them: ${conflict?.fields.join(', ') ?? ''}. Reverting anyway overwrites those edits.`, confirmLabel: "Revert anyway", destructive: true })] }));
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=AutopilotAppliedSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AutopilotAppliedSection.js","sourceRoot":"","sources":["../../../src/views/seo/AutopilotAppliedSection.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProposalsTab.d.ts","sourceRoot":"","sources":["../../../src/views/seo/ProposalsTab.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProposalsTab.d.ts","sourceRoot":"","sources":["../../../src/views/seo/ProposalsTab.tsx"],"names":[],"mappings":"AAiCA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AA4IjE,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,UAAU,GACX,EAAE;IACD,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,2CA6bA"}
|
|
@@ -8,7 +8,7 @@ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-run
|
|
|
8
8
|
* loops client-side while the server reports `remaining > 0`.
|
|
9
9
|
*/
|
|
10
10
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
11
|
-
import { ArrowRightLeft, Check, ChevronDown, Inbox, Loader2, Sparkles, Square, X, } from 'lucide-react';
|
|
11
|
+
import { AlertTriangle, ArrowRightLeft, Bot, Check, ChevronDown, Inbox, Loader2, Sparkles, Square, X, } from 'lucide-react';
|
|
12
12
|
import { toast } from 'sonner';
|
|
13
13
|
import { bulkApplySeoProposals, dismissRedirectSuggestion, dismissSeoIssueFix, fetchSeoProposals, generateSeoProposals, } from '../../lib/seo-service.js';
|
|
14
14
|
import { hasPlanFeature } from '../../lib/plan.js';
|
|
@@ -17,28 +17,17 @@ import { PlanUpgradeCallout } from '../../components/PlanUpgradeCallout.js';
|
|
|
17
17
|
import { ChangePreview } from '../../components/seo/ChangePreview.js';
|
|
18
18
|
import { SectionCard, SeoEmptyState, SeoErrorState, SeoLoading, SeoStatusBadge, btnPrimary, btnSecondary, } from '../../components/seo/primitives.js';
|
|
19
19
|
import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js';
|
|
20
|
+
import { AutopilotAppliedSection } from './AutopilotAppliedSection.js';
|
|
21
|
+
import { relativeAge } from './relative-age.js';
|
|
20
22
|
import { useSeoResource } from './useSeoResource.js';
|
|
21
23
|
const GENERATE_BATCH_SIZE = 10;
|
|
22
24
|
const AI_SETTINGS_PATH = '/settings?tab=ai';
|
|
25
|
+
const SEO_SETTINGS_PATH = '/settings?tab=seo';
|
|
23
26
|
/** Stable empty list so memoised derivations don't recompute while loading. */
|
|
24
27
|
const NO_PROPOSALS = [];
|
|
25
28
|
function errorMessage(err) {
|
|
26
29
|
return err instanceof Error && err.message ? err.message : 'Request failed.';
|
|
27
30
|
}
|
|
28
|
-
function relativeAge(iso) {
|
|
29
|
-
if (!iso)
|
|
30
|
-
return '';
|
|
31
|
-
const ms = Date.now() - new Date(iso).getTime();
|
|
32
|
-
if (!Number.isFinite(ms) || ms < 0)
|
|
33
|
-
return '';
|
|
34
|
-
const minutes = Math.round(ms / 60_000);
|
|
35
|
-
if (minutes < 60)
|
|
36
|
-
return `${Math.max(1, minutes)}m ago`;
|
|
37
|
-
const hours = Math.round(minutes / 60);
|
|
38
|
-
if (hours < 48)
|
|
39
|
-
return `${hours}h ago`;
|
|
40
|
-
return `${Math.round(hours / 24)}d ago`;
|
|
41
|
-
}
|
|
42
31
|
function confidenceTone(c) {
|
|
43
32
|
return c >= 0.7 ? 'good' : c >= 0.4 ? 'fair' : 'poor';
|
|
44
33
|
}
|
|
@@ -67,6 +56,38 @@ function SourceBadge({ source }) {
|
|
|
67
56
|
}
|
|
68
57
|
}
|
|
69
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Short chip wording for the engine-level pause reasons the server emits
|
|
61
|
+
* (`AutopilotPauseReason`). An unknown value falls through verbatim so a new
|
|
62
|
+
* reason is still visible rather than hidden behind a generic label.
|
|
63
|
+
*/
|
|
64
|
+
const CHIP_PAUSE_LABEL = {
|
|
65
|
+
outcome_regression: 'traffic regression',
|
|
66
|
+
owner_unavailable: 'owner unavailable',
|
|
67
|
+
manual: 'paused by admin',
|
|
68
|
+
};
|
|
69
|
+
function chipPauseLabel(reason) {
|
|
70
|
+
return CHIP_PAUSE_LABEL[reason] ?? reason;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Header chip summarising the autopilot's state. Hidden while autopilot is off
|
|
74
|
+
* (nothing to report — including an engine disabled while it was still paused,
|
|
75
|
+
* since `PUT { enabled: false }` does not clear the pause); a paused engine
|
|
76
|
+
* gets the warning tone and names the reason. Clicking opens the Autopilot
|
|
77
|
+
* card in Settings → SEO.
|
|
78
|
+
*/
|
|
79
|
+
function AutopilotChip({ autopilot, onNavigate, }) {
|
|
80
|
+
if (!autopilot.enabled)
|
|
81
|
+
return null;
|
|
82
|
+
const paused = autopilot.pausedReason !== null;
|
|
83
|
+
const label = autopilot.pausedReason !== null
|
|
84
|
+
? `Autopilot paused — ${chipPauseLabel(autopilot.pausedReason)}`
|
|
85
|
+
: `Autopilot on · ${autopilot.appliedLast7d} applied this week`;
|
|
86
|
+
const tone = paused
|
|
87
|
+
? 'border-warning/40 bg-warning/10 text-foreground hover:bg-warning/20'
|
|
88
|
+
: 'border-border bg-muted/40 text-foreground hover:bg-accent';
|
|
89
|
+
return (_jsxs("button", { type: "button", className: `focus-visible:ring-ring inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-sm font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none ${tone}`, onClick: () => onNavigate?.(SEO_SETTINGS_PATH), children: [paused ? (_jsx(AlertTriangle, { className: "text-warning h-3.5 w-3.5", "aria-hidden": true })) : (_jsx(Bot, { className: "h-3.5 w-3.5", "aria-hidden": true })), label] }));
|
|
90
|
+
}
|
|
70
91
|
export function ProposalsTab({ planInfo, onChanged, onNavigate, }) {
|
|
71
92
|
const { data, loading, error, refetch } = useSeoResource(fetchSeoProposals, []);
|
|
72
93
|
const [selected, setSelected] = useState(new Set());
|
|
@@ -76,6 +97,8 @@ export function ProposalsTab({ planInfo, onChanged, onNavigate, }) {
|
|
|
76
97
|
const [mutation, setMutation] = useState(null);
|
|
77
98
|
const [pendingItems, setPendingItems] = useState([]);
|
|
78
99
|
const [generating, setGenerating] = useState(null);
|
|
100
|
+
/** Bumped after every mutation so the autopilot ledger below refetches with the inbox. */
|
|
101
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
79
102
|
const stopRef = useRef(false);
|
|
80
103
|
/** Mirrors `mutation` synchronously so a second call in the same tick cannot slip past. */
|
|
81
104
|
const mutationRef = useRef(null);
|
|
@@ -142,6 +165,16 @@ export function ProposalsTab({ planInfo, onChanged, onNavigate, }) {
|
|
|
142
165
|
}, []);
|
|
143
166
|
const afterMutation = useCallback(() => {
|
|
144
167
|
setSelected(new Set());
|
|
168
|
+
refetch();
|
|
169
|
+
setRefreshKey((k) => k + 1);
|
|
170
|
+
onChanged?.();
|
|
171
|
+
}, [refetch, onChanged]);
|
|
172
|
+
/**
|
|
173
|
+
* A revert in the ledger reopens its issue / suggestion server-side, so the
|
|
174
|
+
* inbox and the SEO page refetch. Not `afterMutation`: that bumps
|
|
175
|
+
* `refreshKey`, and the ledger already reloads itself after a revert.
|
|
176
|
+
*/
|
|
177
|
+
const handleLedgerChanged = useCallback(() => {
|
|
145
178
|
refetch();
|
|
146
179
|
onChanged?.();
|
|
147
180
|
}, [refetch, onChanged]);
|
|
@@ -281,12 +314,15 @@ export function ProposalsTab({ planInfo, onChanged, onNavigate, }) {
|
|
|
281
314
|
const generateAction = inlineApplyEnabled ? (generating ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-2 text-sm", role: "status", "aria-live": "polite", children: [_jsx(Loader2, { className: "h-4 w-4 motion-safe:animate-spin", "aria-hidden": true }), "Generating\u2026 ", generating.done, " of ", generating.total] }), _jsxs("button", { type: "button", className: btnSecondary, onClick: () => {
|
|
282
315
|
stopRef.current = true;
|
|
283
316
|
}, children: [_jsx(Square, { className: "h-4 w-4", "aria-hidden": true }), "Stop"] })] })) : (_jsxs("button", { type: "button", className: btnPrimary, onClick: () => setConfirmGenerate(true), disabled: eligible === 0 || loading || busy, children: [_jsx(Sparkles, { className: "h-4 w-4", "aria-hidden": true }), "Generate proposals (", eligible, " eligible)"] }))) : null;
|
|
284
|
-
|
|
317
|
+
// `data?.autopilot` (not just `data`): a core deployed before autopilot omits the field.
|
|
318
|
+
const autopilotChip = data?.autopilot ? (_jsx(AutopilotChip, { autopilot: data.autopilot, onNavigate: onNavigate })) : null;
|
|
319
|
+
const headerAction = autopilotChip || generateAction ? (_jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [autopilotChip, generateAction] })) : undefined;
|
|
320
|
+
return (_jsxs("div", { className: "space-y-6", children: [!inlineApplyEnabled ? (_jsx(PlanUpgradeCallout, { feature: "seo.inlineApply", upgradeUrl: planInfo?.upgradeUrl })) : null, _jsx(SectionCard, { title: "Proposals", description: "Review, approve, or dismiss what the AI proposes across issue fixes and 404 redirects.", action: headerAction, children: loading ? (_jsx(SeoLoading, {})) : error ? (_jsx(SeoErrorState, { message: error, onRetry: refetch })) : proposals.length === 0 ? (_jsx(SeoEmptyState, { icon: _jsx(Inbox, { size: 24 }), title: "No proposals yet", description: "Generate proposals to draft fixes for open, fixable issues, or run 404 recovery from the Redirects tab." })) : (_jsxs("div", { className: "space-y-3", children: [pendingItems.length > 0 && (_jsxs("div", { className: "border-border bg-muted/40 flex flex-wrap items-center gap-2 rounded-lg border px-3 py-2 text-sm", role: "status", "aria-live": "polite", children: [_jsxs("span", { className: "text-foreground", children: [plural(pendingItems.length, 'proposal'), " not reached within the time budget."] }), _jsxs("button", { type: "button", className: "text-primary hover:bg-accent focus-visible:ring-ring rounded-md px-2 py-1 font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none disabled:opacity-60", onClick: () => void runApply(pendingItems), disabled: busy, children: ["Apply remaining (", pendingItems.length, ")"] }), _jsx("button", { type: "button", className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring ml-auto rounded-md px-2 py-1 font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none", onClick: () => setPendingItems([]), children: "Dismiss" })] })), selected.size > 0 && (_jsxs("div", { className: "border-border bg-accent/40 flex flex-wrap items-center gap-2 rounded-lg border px-3 py-2 text-sm", role: "region", "aria-label": "Bulk actions", children: [_jsxs("span", { className: "text-foreground font-medium", children: [selected.size, " selected"] }), _jsx("span", { className: "bg-border mx-1 h-4 w-px", "aria-hidden": true }), _jsx("button", { type: "button", className: "text-foreground hover:bg-accent focus-visible:ring-ring rounded-md px-2 py-1 font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none disabled:opacity-60", onClick: () => setConfirmApply(true), disabled: busy || bulkBlockedReason !== null, children: "Approve selected" }), _jsx("button", { type: "button", className: "text-foreground hover:bg-accent focus-visible:ring-ring rounded-md px-2 py-1 font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none disabled:opacity-60", onClick: () => void handleDismissSelected(), disabled: busy, children: "Dismiss selected" }), _jsx("button", { type: "button", className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring ml-auto rounded-md px-2 py-1 font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none", onClick: () => setSelected(new Set()), children: "Clear" }), bulkBlockedReason && (_jsxs("p", { className: "text-muted-foreground basis-full text-sm", role: "status", children: ["Applying several ", bulkBlockedReason, " proposals at once needs \u201CAllow bulk apply\u201D.", onNavigate ? (_jsx("button", { type: "button", onClick: () => onNavigate(AI_SETTINGS_PATH), className: "text-primary focus-visible:ring-ring ml-1 rounded-sm font-medium hover:underline focus-visible:ring-2 focus-visible:outline-none", children: "Open Settings \u2192 AI" })) : null] }))] })), _jsx("div", { className: "border-border overflow-x-auto rounded-md border", children: _jsxs("table", { className: "w-full text-sm", "aria-label": "AI proposals", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-border bg-muted/40 text-muted-foreground border-b text-left text-xs", children: [_jsx("th", { scope: "col", className: "w-10 px-3 py-2.5", children: _jsx("input", { type: "checkbox", checked: allSelected, onChange: toggleSelectAll, disabled: live.length === 0, "aria-label": "Select all proposals", className: "border-border text-primary focus-visible:ring-ring h-4 w-4 rounded" }) }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Proposal" }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Change" }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Signals" }), _jsx("th", { scope: "col", className: "px-3 py-2.5 font-medium", children: "Age" }), _jsx("th", { scope: "col", className: "px-3 py-2.5", children: _jsx("span", { className: "sr-only", children: "Actions" }) })] }) }), _jsx("tbody", { className: "divide-border divide-y", children: proposals.map((p) => {
|
|
285
321
|
const first = p.changes[0];
|
|
286
322
|
return (_jsx(ProposalRow, { proposal: p, selected: selected.has(p.id), expanded: expanded.has(p.id), summary: first
|
|
287
323
|
? `${String(first.before ?? '—')} → ${String(first.after ?? '—')}`
|
|
288
324
|
: p.justification, onToggleSelect: () => toggleSelect(p.id), onToggleExpanded: () => toggleExpanded(p.id), onApprove: () => void runApply([toBulkItem(p)]), onDismiss: () => void handleDismissOne(p), busy: busy, canApply: inlineApplyEnabled || p.kind === 'redirect' }, p.id));
|
|
289
|
-
}) })] }) })] })) }), _jsx(ConfirmDialog, { open: confirmApply, onClose: () => setConfirmApply(false), onConfirm: () => void runApply(selectedProposals.map(toBulkItem)), title: `Apply ${plural(selectedProposals.length, 'proposal')}?`, description: "Approved fixes write SEO fields, content links, or redirects immediately and mark their issues resolved. Each document keeps a version you can restore.", confirmLabel: `Apply ${plural(selectedProposals.length, 'proposal')}` }), _jsx(ConfirmDialog, { open: confirmGenerate, onClose: () => setConfirmGenerate(false), onConfirm: () => void handleGenerate(), title: `Generate proposals for ${plural(eligible, 'eligible issue')}?`, description: `Runs in passes of ${GENERATE_BATCH_SIZE}. AI tokens are spent for each issue; you can stop between passes.`, confirmLabel: "Generate" })] }));
|
|
325
|
+
}) })] }) })] })) }), _jsx(AutopilotAppliedSection, { onNavigate: onNavigate, refreshKey: refreshKey, onChanged: handleLedgerChanged }), _jsx(ConfirmDialog, { open: confirmApply, onClose: () => setConfirmApply(false), onConfirm: () => void runApply(selectedProposals.map(toBulkItem)), title: `Apply ${plural(selectedProposals.length, 'proposal')}?`, description: "Approved fixes write SEO fields, content links, or redirects immediately and mark their issues resolved. Each document keeps a version you can restore.", confirmLabel: `Apply ${plural(selectedProposals.length, 'proposal')}` }), _jsx(ConfirmDialog, { open: confirmGenerate, onClose: () => setConfirmGenerate(false), onConfirm: () => void handleGenerate(), title: `Generate proposals for ${plural(eligible, 'eligible issue')}?`, description: `Runs in passes of ${GENERATE_BATCH_SIZE}. AI tokens are spent for each issue; you can stop between passes.`, confirmLabel: "Generate" })] }));
|
|
290
326
|
}
|
|
291
327
|
function ProposalRow({ proposal: p, selected, expanded, summary, onToggleSelect, onToggleExpanded, onApprove, onDismiss, busy, canApply, }) {
|
|
292
328
|
return (_jsxs(_Fragment, { children: [_jsxs("tr", { className: `${selected ? 'bg-accent/30' : ''} hover:bg-accent/20 transition-colors`, children: [_jsx("td", { className: "px-3 py-3 align-top", children: p.stale ? null : (_jsx("input", { type: "checkbox", checked: selected, onChange: onToggleSelect, "aria-label": `Select proposal ${p.title}`, className: "border-border text-primary focus-visible:ring-ring h-4 w-4 rounded" })) }), _jsxs("td", { className: "px-3 py-3 align-top", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "text-foreground font-medium", children: p.title }), p.severity ? (_jsx(SeoStatusBadge, { label: p.severity, tone: p.severity === 'critical'
|