@actuate-media/cms-admin 0.58.1 → 0.60.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 +16 -0
- package/dist/__tests__/lib/editor-preview.test.d.ts +2 -0
- package/dist/__tests__/lib/editor-preview.test.d.ts.map +1 -0
- package/dist/__tests__/lib/editor-preview.test.js +18 -0
- package/dist/__tests__/lib/editor-preview.test.js.map +1 -0
- package/dist/__tests__/lib/post-editor-service.test.js +16 -0
- package/dist/__tests__/lib/post-editor-service.test.js.map +1 -1
- package/dist/__tests__/views/dashboard.test.js +23 -0
- package/dist/__tests__/views/dashboard.test.js.map +1 -1
- package/dist/__tests__/views/use-site-preview.render.test.js +10 -1
- package/dist/__tests__/views/use-site-preview.render.test.js.map +1 -1
- package/dist/components/PlanUpgradeCallout.d.ts +7 -0
- package/dist/components/PlanUpgradeCallout.d.ts.map +1 -0
- package/dist/components/PlanUpgradeCallout.js +8 -0
- package/dist/components/PlanUpgradeCallout.js.map +1 -0
- package/dist/components/seo/SeoIssueFixPanel.d.ts +3 -1
- package/dist/components/seo/SeoIssueFixPanel.d.ts.map +1 -1
- package/dist/components/seo/SeoIssueFixPanel.js +8 -3
- package/dist/components/seo/SeoIssueFixPanel.js.map +1 -1
- package/dist/lib/editor-preview.d.ts +4 -0
- package/dist/lib/editor-preview.d.ts.map +1 -0
- package/dist/lib/editor-preview.js +10 -0
- package/dist/lib/editor-preview.js.map +1 -0
- package/dist/lib/plan.d.ts +12 -0
- package/dist/lib/plan.d.ts.map +1 -0
- package/dist/lib/plan.js +30 -0
- package/dist/lib/plan.js.map +1 -0
- package/dist/lib/post-editor-service.d.ts.map +1 -1
- package/dist/lib/post-editor-service.js +4 -1
- package/dist/lib/post-editor-service.js.map +1 -1
- package/dist/lib/seo-service.d.ts.map +1 -1
- package/dist/lib/seo-service.js +11 -3
- package/dist/lib/seo-service.js.map +1 -1
- package/dist/views/SEO.d.ts.map +1 -1
- package/dist/views/SEO.js +6 -1
- package/dist/views/SEO.js.map +1 -1
- package/dist/views/Users.js +1 -1
- package/dist/views/Users.js.map +1 -1
- package/dist/views/page-editor/EditorCanvas.d.ts +2 -1
- package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -1
- package/dist/views/page-editor/EditorCanvas.js +2 -2
- package/dist/views/page-editor/EditorCanvas.js.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
- package/dist/views/page-editor/PageSectionEditor.js +4 -1
- package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
- package/dist/views/page-editor/StructureNotice.d.ts +4 -3
- package/dist/views/page-editor/StructureNotice.d.ts.map +1 -1
- package/dist/views/page-editor/StructureNotice.js +9 -7
- package/dist/views/page-editor/StructureNotice.js.map +1 -1
- package/dist/views/page-editor/useSitePreview.d.ts +3 -1
- package/dist/views/page-editor/useSitePreview.d.ts.map +1 -1
- package/dist/views/page-editor/useSitePreview.js +44 -31
- package/dist/views/page-editor/useSitePreview.js.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts +3 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.js +2 -2
- package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.d.ts +8 -0
- package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.js +4 -1
- package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
- package/dist/views/seo/AuditTab.d.ts +3 -1
- package/dist/views/seo/AuditTab.d.ts.map +1 -1
- package/dist/views/seo/AuditTab.js +6 -3
- package/dist/views/seo/AuditTab.js.map +1 -1
- package/dist/views/settings/MonthlyUsageCard.d.ts.map +1 -1
- package/dist/views/settings/MonthlyUsageCard.js +1 -1
- package/dist/views/settings/MonthlyUsageCard.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/lib/editor-preview.test.ts +21 -0
- package/src/__tests__/lib/post-editor-service.test.ts +17 -0
- package/src/__tests__/views/dashboard.test.tsx +26 -0
- package/src/__tests__/views/use-site-preview.render.test.tsx +12 -0
- package/src/components/PlanUpgradeCallout.tsx +42 -0
- package/src/components/seo/SeoIssueFixPanel.tsx +37 -18
- package/src/lib/editor-preview.ts +12 -0
- package/src/lib/plan.ts +44 -0
- package/src/lib/post-editor-service.ts +4 -1
- package/src/lib/seo-service.ts +14 -3
- package/src/views/SEO.tsx +7 -0
- package/src/views/Users.tsx +1 -1
- package/src/views/page-editor/EditorCanvas.tsx +6 -1
- package/src/views/page-editor/PageSectionEditor.tsx +5 -0
- package/src/views/page-editor/StructureNotice.tsx +42 -8
- package/src/views/page-editor/useSitePreview.ts +47 -31
- package/src/views/post-editor/PostEditorCanvas.tsx +7 -1
- package/src/views/post-editor/PostSectionEditor.tsx +6 -0
- package/src/views/seo/AuditTab.tsx +23 -10
- package/src/views/settings/MonthlyUsageCard.tsx +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditTab.js","sourceRoot":"","sources":["../../../src/views/seo/AuditTab.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AuditTab.js","sourceRoot":"","sources":["../../../src/views/seo/AuditTab.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonthlyUsageCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/MonthlyUsageCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAYrD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,OAAO,GACR,EAAE;IACD,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB,
|
|
1
|
+
{"version":3,"file":"MonthlyUsageCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/MonthlyUsageCard.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAYrD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,OAAO,GACR,EAAE;IACD,KAAK,EAAE,WAAW,GAAG,IAAI,CAAA;IACzB,iBAAiB,EAAE,MAAM,CAAA;IACzB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB,2CAiFA"}
|
|
@@ -25,6 +25,6 @@ export function MonthlyUsageCard({ usage, monthlyTokenLimit, onChangeLimit, budg
|
|
|
25
25
|
const periodLabel = usage?.periodStart
|
|
26
26
|
? new Date(usage.periodStart).toLocaleDateString(undefined, { month: 'long', year: 'numeric' })
|
|
27
27
|
: 'This month';
|
|
28
|
-
return (_jsx(SettingsCard, { title: "Monthly Usage", description: `Token usage for ${periodLabel}. Aggregated from completed AI runs.`, children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between text-sm", children: [_jsxs("span", { className: "text-foreground font-medium", children: [formatTokens(used), " tokens used"] }), limit && limit > 0 && (_jsxs("span", { className: "text-muted-foreground", children: ["of ", formatTokens(limit)] }))] }), pct !== null ? (_jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", role: "progressbar", "aria-valuenow": pct, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuetext": `${pct}% of monthly token budget used`, children: _jsx("div", { className: `h-full rounded-full transition-all ${over ? 'bg-destructive' : 'bg-brand'}`, style: { width: `${pct}%` } }) })) : (_jsx("p", { className: "text-muted-foreground text-sm", children: "No monthly limit set. Usage is tracked but not capped." })), over && (_jsx("p", { className: "text-destructive mt-1 text-sm", role: "status", children: "Usage has exceeded the monthly limit." }))] }), _jsxs("div", { children: [_jsx("label", { htmlFor: limitId, className: LABEL_CLASS, children: "Monthly token limit" }), _jsx("input", { id: limitId, type: "text", inputMode: "numeric", value: monthlyTokenLimit, disabled: !canEdit, placeholder: "No limit", "aria-invalid": Boolean(budgetError), "aria-describedby": budgetError ? `${limitId}-error` : undefined, onChange: (e) => onChangeLimit(e.target.value), className: INPUT_CLASS }), budgetError ? (_jsx("p", { id: `${limitId}-error`, className: "text-destructive mt-1 text-sm", children: budgetError })) : (_jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Leave blank for no limit.
|
|
28
|
+
return (_jsx(SettingsCard, { title: "Monthly Usage", description: `Token usage for ${periodLabel}. Aggregated from completed AI runs.`, children: _jsxs("div", { className: "space-y-4", children: [_jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between text-sm", children: [_jsxs("span", { className: "text-foreground font-medium", children: [formatTokens(used), " tokens used"] }), limit && limit > 0 && (_jsxs("span", { className: "text-muted-foreground", children: ["of ", formatTokens(limit)] }))] }), pct !== null ? (_jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", role: "progressbar", "aria-valuenow": pct, "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuetext": `${pct}% of monthly token budget used`, children: _jsx("div", { className: `h-full rounded-full transition-all ${over ? 'bg-destructive' : 'bg-brand'}`, style: { width: `${pct}%` } }) })) : (_jsx("p", { className: "text-muted-foreground text-sm", children: "No monthly limit set. Usage is tracked but not capped." })), over && (_jsx("p", { className: "text-destructive mt-1 text-sm", role: "status", children: "Usage has exceeded the monthly limit." }))] }), _jsxs("div", { children: [_jsx("label", { htmlFor: limitId, className: LABEL_CLASS, children: "Monthly token limit" }), _jsx("input", { id: limitId, type: "text", inputMode: "numeric", value: monthlyTokenLimit, disabled: !canEdit, placeholder: "No limit", "aria-invalid": Boolean(budgetError), "aria-describedby": budgetError ? `${limitId}-error` : undefined, onChange: (e) => onChangeLimit(e.target.value), className: INPUT_CLASS }), budgetError ? (_jsx("p", { id: `${limitId}-error`, className: "text-destructive mt-1 text-sm", children: budgetError })) : (_jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Leave blank for no limit. When set, new AI requests are blocked with HTTP 429 after the limit is reached." }))] })] }) }));
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=MonthlyUsageCard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonthlyUsageCard.js","sourceRoot":"","sources":["../../../src/views/settings/MonthlyUsageCard.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MonthlyUsageCard.js","sourceRoot":"","sources":["../../../src/views/settings/MonthlyUsageCard.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuate-media/cms-admin",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.60.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/actuate-media/actuatecms.git",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"tailwindcss": "^4.0.0",
|
|
91
91
|
"typescript": "^5.7.0",
|
|
92
92
|
"vitest": "^4.1.0",
|
|
93
|
-
"@actuate-media/cms-core": "0.
|
|
93
|
+
"@actuate-media/cms-core": "0.82.0",
|
|
94
94
|
"@actuate-media/component-blocks": "0.2.1"
|
|
95
95
|
},
|
|
96
96
|
"scripts": {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { resolveDefaultSitePreview } from '../../lib/editor-preview.js'
|
|
4
|
+
|
|
5
|
+
describe('resolveDefaultSitePreview', () => {
|
|
6
|
+
it('returns false when unset', () => {
|
|
7
|
+
expect(resolveDefaultSitePreview(undefined, 'pages')).toBe(false)
|
|
8
|
+
expect(resolveDefaultSitePreview({}, 'posts')).toBe(false)
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
it('honours a global true flag', () => {
|
|
12
|
+
expect(resolveDefaultSitePreview({ defaultSitePreview: true }, 'pages')).toBe(true)
|
|
13
|
+
expect(resolveDefaultSitePreview({ defaultSitePreview: true }, 'posts')).toBe(true)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('honours per-collection flags', () => {
|
|
17
|
+
const editor = { defaultSitePreview: { pages: true, posts: false } }
|
|
18
|
+
expect(resolveDefaultSitePreview(editor, 'pages')).toBe(true)
|
|
19
|
+
expect(resolveDefaultSitePreview(editor, 'posts')).toBe(false)
|
|
20
|
+
})
|
|
21
|
+
})
|
|
@@ -289,6 +289,23 @@ describe('unmanaged section round-trip (data-loss regression)', () => {
|
|
|
289
289
|
settings: { paddingY: 'lg' as const },
|
|
290
290
|
}
|
|
291
291
|
|
|
292
|
+
it('fetchPostForEditor prefers data.title over denormalized doc.title', async () => {
|
|
293
|
+
cmsApiMock.mockResolvedValueOnce({
|
|
294
|
+
data: {
|
|
295
|
+
id: 'p1',
|
|
296
|
+
title: 'Foster-Independence-In-Children-With-Autism',
|
|
297
|
+
slug: 'foster-independence-in-children-with-autism',
|
|
298
|
+
status: 'DRAFT',
|
|
299
|
+
data: {
|
|
300
|
+
title: 'Foster independence in children with autism',
|
|
301
|
+
sections: [],
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
})
|
|
305
|
+
const post = await fetchPostForEditor('blog', 'p1')
|
|
306
|
+
expect(post.title).toBe('Foster independence in children with autism')
|
|
307
|
+
})
|
|
308
|
+
|
|
292
309
|
it('fetchPostForEditor preserves unknown section types as unmanaged', async () => {
|
|
293
310
|
cmsApiMock.mockResolvedValueOnce({
|
|
294
311
|
data: {
|
|
@@ -78,6 +78,32 @@ describe('Dashboard', () => {
|
|
|
78
78
|
expect(refetch).toHaveBeenCalledTimes(1)
|
|
79
79
|
})
|
|
80
80
|
|
|
81
|
+
it('renders Delivery API metrics when api-delivery stats are available', () => {
|
|
82
|
+
responses['/stats'] = statsResult()
|
|
83
|
+
responses['/stats/api-delivery'] = {
|
|
84
|
+
data: {
|
|
85
|
+
hasData: true,
|
|
86
|
+
requests24h: 1200,
|
|
87
|
+
deltaPercent: 8,
|
|
88
|
+
errorRate: 0.01,
|
|
89
|
+
avgLatencyMs: 42,
|
|
90
|
+
p95LatencyMs: 110,
|
|
91
|
+
maxLatencyMs: 500,
|
|
92
|
+
webhookCount: 2,
|
|
93
|
+
webhookActiveCount: 1,
|
|
94
|
+
},
|
|
95
|
+
loading: false,
|
|
96
|
+
error: null,
|
|
97
|
+
exhausted: false,
|
|
98
|
+
refetch: () => {},
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
render(<Dashboard config={{ collections: [] }} session={{}} onNavigate={() => {}} />)
|
|
102
|
+
|
|
103
|
+
expect(screen.getByText('Delivery API')).toBeTruthy()
|
|
104
|
+
expect(screen.getByText('1.2K')).toBeTruthy()
|
|
105
|
+
})
|
|
106
|
+
|
|
81
107
|
// ── EI-1 regression: recent-activity rows must open the *correct* editor ──
|
|
82
108
|
|
|
83
109
|
it('routes a recent post to the section-based post editor (not the legacy editor)', () => {
|
|
@@ -36,12 +36,14 @@ function Harness({
|
|
|
36
36
|
dirty = false,
|
|
37
37
|
saveState = 'idle' as SaveState,
|
|
38
38
|
saveDraft = vi.fn(async () => true),
|
|
39
|
+
defaultActive = false,
|
|
39
40
|
}: {
|
|
40
41
|
documentId?: string | null
|
|
41
42
|
slug?: string | null
|
|
42
43
|
dirty?: boolean
|
|
43
44
|
saveState?: SaveState
|
|
44
45
|
saveDraft?: () => Promise<boolean>
|
|
46
|
+
defaultActive?: boolean
|
|
45
47
|
}) {
|
|
46
48
|
const sp = useSitePreview({
|
|
47
49
|
collection: 'pages',
|
|
@@ -52,6 +54,7 @@ function Harness({
|
|
|
52
54
|
dirty,
|
|
53
55
|
saveState,
|
|
54
56
|
saveDraft,
|
|
57
|
+
defaultActive,
|
|
55
58
|
})
|
|
56
59
|
return (
|
|
57
60
|
<div>
|
|
@@ -109,6 +112,15 @@ describe('useSitePreview', () => {
|
|
|
109
112
|
expect(state().active).toBe(false)
|
|
110
113
|
})
|
|
111
114
|
|
|
115
|
+
it('auto-activates when defaultActive is true', async () => {
|
|
116
|
+
render(<Harness defaultActive />)
|
|
117
|
+
await waitFor(() => {
|
|
118
|
+
expect(state().active).toBe(true)
|
|
119
|
+
expect(state().url).toBe('https://site.test/about?preview=tok-123')
|
|
120
|
+
})
|
|
121
|
+
expect(createPreviewToken).toHaveBeenCalledWith('pages', 'doc-1')
|
|
122
|
+
})
|
|
123
|
+
|
|
112
124
|
it('bumps reloadKey after a save completes while the preview is open', async () => {
|
|
113
125
|
const { rerender } = render(<Harness saveState="idle" />)
|
|
114
126
|
fireEvent.click(screen.getByText('toggle'))
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { ArrowUpRight } from 'lucide-react'
|
|
4
|
+
import type { PlanFeature } from '../lib/plan.js'
|
|
5
|
+
import { planFeatureLabel } from '../lib/plan.js'
|
|
6
|
+
|
|
7
|
+
export function PlanUpgradeCallout({
|
|
8
|
+
feature,
|
|
9
|
+
requiredTier = 'pro',
|
|
10
|
+
upgradeUrl,
|
|
11
|
+
}: {
|
|
12
|
+
feature: PlanFeature
|
|
13
|
+
requiredTier?: string
|
|
14
|
+
upgradeUrl?: string | null
|
|
15
|
+
}) {
|
|
16
|
+
return (
|
|
17
|
+
<div
|
|
18
|
+
className="border-border bg-muted/40 space-y-2 rounded-md border p-4"
|
|
19
|
+
role="status"
|
|
20
|
+
aria-live="polite"
|
|
21
|
+
>
|
|
22
|
+
<p className="text-foreground text-sm font-medium">
|
|
23
|
+
Upgrade to unlock {planFeatureLabel(feature)}
|
|
24
|
+
</p>
|
|
25
|
+
<p className="text-muted-foreground text-sm">
|
|
26
|
+
This feature requires the {requiredTier} plan. Audits, issue tracking, and export remain
|
|
27
|
+
available on your current plan.
|
|
28
|
+
</p>
|
|
29
|
+
{upgradeUrl ? (
|
|
30
|
+
<a
|
|
31
|
+
href={upgradeUrl}
|
|
32
|
+
target="_blank"
|
|
33
|
+
rel="noopener noreferrer"
|
|
34
|
+
className="text-primary inline-flex items-center gap-1 text-sm font-medium hover:underline"
|
|
35
|
+
>
|
|
36
|
+
View plans
|
|
37
|
+
<ArrowUpRight className="h-4 w-4" aria-hidden />
|
|
38
|
+
</a>
|
|
39
|
+
) : null}
|
|
40
|
+
</div>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
@@ -20,6 +20,8 @@ import {
|
|
|
20
20
|
type SeoIssue,
|
|
21
21
|
type SeoIssueFixSuggestion,
|
|
22
22
|
} from '../../lib/seo-service.js'
|
|
23
|
+
import { hasPlanFeature, type PlanInfo } from '../../lib/plan.js'
|
|
24
|
+
import { PlanUpgradeCallout } from '../PlanUpgradeCallout.js'
|
|
23
25
|
import { SeoErrorState, btnPrimary, btnSecondary } from './primitives.js'
|
|
24
26
|
|
|
25
27
|
function formatValue(value: string | boolean | null): string {
|
|
@@ -220,16 +222,21 @@ export function SeoIssueFixPanel({
|
|
|
220
222
|
onChanged,
|
|
221
223
|
onNavigate,
|
|
222
224
|
onOpenDetails,
|
|
225
|
+
planInfo,
|
|
223
226
|
}: {
|
|
224
227
|
issue: SeoIssue
|
|
225
228
|
expanded: boolean
|
|
226
229
|
onChanged?: () => void
|
|
227
230
|
onNavigate?: (path: string) => void
|
|
228
231
|
onOpenDetails?: () => void
|
|
232
|
+
planInfo?: PlanInfo | null
|
|
229
233
|
}) {
|
|
230
234
|
const inlineFix = isInlineSeoFixIssue(issue.type)
|
|
231
235
|
const contentBriefEligible = supportsSeoContentBrief(issue.type)
|
|
232
236
|
const researchEligible = supportsSeoContentResearch(issue.type)
|
|
237
|
+
const inlineApplyEnabled = hasPlanFeature(planInfo, 'seo.inlineApply')
|
|
238
|
+
const contentBriefEnabled = hasPlanFeature(planInfo, 'seo.contentBrief')
|
|
239
|
+
const contentResearchEnabled = hasPlanFeature(planInfo, 'seo.contentResearch')
|
|
233
240
|
|
|
234
241
|
const [suggestion, setSuggestion] = useState<SeoIssueFixSuggestion | null>(null)
|
|
235
242
|
const [contentBrief, setContentBrief] = useState<SeoContentBrief | null>(null)
|
|
@@ -468,7 +475,7 @@ export function SeoIssueFixPanel({
|
|
|
468
475
|
) : null}
|
|
469
476
|
|
|
470
477
|
<div className="flex flex-wrap items-center gap-2">
|
|
471
|
-
{inlineFix && suggestion?.autoFixable ? (
|
|
478
|
+
{inlineFix && suggestion?.autoFixable && inlineApplyEnabled ? (
|
|
472
479
|
<button
|
|
473
480
|
type="button"
|
|
474
481
|
className={btnPrimary}
|
|
@@ -478,6 +485,8 @@ export function SeoIssueFixPanel({
|
|
|
478
485
|
<Check className="h-4 w-4" aria-hidden />
|
|
479
486
|
{busy ? 'Applying…' : 'Approve fix'}
|
|
480
487
|
</button>
|
|
488
|
+
) : inlineFix && suggestion?.autoFixable && !inlineApplyEnabled ? (
|
|
489
|
+
<PlanUpgradeCallout feature="seo.inlineApply" upgradeUrl={planInfo?.upgradeUrl} />
|
|
481
490
|
) : inlineFix && suggestion?.aiUnavailable ? (
|
|
482
491
|
<p className="text-muted-foreground text-sm">
|
|
483
492
|
Configure an AI provider in Settings → AI to enable generated fixes for this
|
|
@@ -487,7 +496,15 @@ export function SeoIssueFixPanel({
|
|
|
487
496
|
|
|
488
497
|
{contentBriefEligible ? (
|
|
489
498
|
<>
|
|
490
|
-
{
|
|
499
|
+
{!contentBriefEnabled || !contentResearchEnabled ? (
|
|
500
|
+
<PlanUpgradeCallout
|
|
501
|
+
feature={
|
|
502
|
+
!contentResearchEnabled ? 'seo.contentResearch' : 'seo.contentBrief'
|
|
503
|
+
}
|
|
504
|
+
upgradeUrl={planInfo?.upgradeUrl}
|
|
505
|
+
/>
|
|
506
|
+
) : null}
|
|
507
|
+
{researchEligible && contentResearchEnabled ? (
|
|
491
508
|
<button
|
|
492
509
|
type="button"
|
|
493
510
|
className={!contentBrief && !contentResearch ? btnPrimary : btnSecondary}
|
|
@@ -501,22 +518,24 @@ export function SeoIssueFixPanel({
|
|
|
501
518
|
{researching ? 'Researching…' : 'Research & brief'}
|
|
502
519
|
</button>
|
|
503
520
|
) : null}
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
521
|
+
{contentBriefEnabled ? (
|
|
522
|
+
<button
|
|
523
|
+
type="button"
|
|
524
|
+
className={contentBrief ? btnSecondary : btnPrimary}
|
|
525
|
+
onClick={handleGenerateBrief}
|
|
526
|
+
disabled={busy || generatingBrief || researching}
|
|
527
|
+
>
|
|
528
|
+
<Wand2
|
|
529
|
+
className={`h-4 w-4 ${generatingBrief ? 'motion-safe:animate-pulse' : ''}`}
|
|
530
|
+
aria-hidden
|
|
531
|
+
/>
|
|
532
|
+
{generatingBrief
|
|
533
|
+
? 'Generating brief…'
|
|
534
|
+
: contentBrief
|
|
535
|
+
? 'Regenerate brief'
|
|
536
|
+
: 'Generate content brief'}
|
|
537
|
+
</button>
|
|
538
|
+
) : null}
|
|
520
539
|
</>
|
|
521
540
|
) : null}
|
|
522
541
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AdminEditorConfig } from '@actuate-media/cms-core'
|
|
2
|
+
|
|
3
|
+
/** Resolve whether a section editor should open with Site preview active. */
|
|
4
|
+
export function resolveDefaultSitePreview(
|
|
5
|
+
editor: AdminEditorConfig | undefined,
|
|
6
|
+
kind: 'pages' | 'posts',
|
|
7
|
+
): boolean {
|
|
8
|
+
const setting = editor?.defaultSitePreview
|
|
9
|
+
if (setting === true) return true
|
|
10
|
+
if (setting == null || setting === false) return false
|
|
11
|
+
return kind === 'pages' ? setting.pages === true : setting.posts === true
|
|
12
|
+
}
|
package/src/lib/plan.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { cmsApi } from './api.js'
|
|
2
|
+
|
|
3
|
+
export type PlanTier = 'starter' | 'pro' | 'enterprise'
|
|
4
|
+
|
|
5
|
+
export type PlanFeature =
|
|
6
|
+
| 'seo.inlineApply'
|
|
7
|
+
| 'seo.contentBrief'
|
|
8
|
+
| 'seo.contentResearch'
|
|
9
|
+
| 'seo.batchContentBriefs'
|
|
10
|
+
|
|
11
|
+
export interface PlanInfo {
|
|
12
|
+
tier: PlanTier
|
|
13
|
+
features: PlanFeature[]
|
|
14
|
+
upgradeUrl: string | null
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export async function fetchPlanInfo(): Promise<PlanInfo | null> {
|
|
18
|
+
const res = await cmsApi<PlanInfo>('/plan')
|
|
19
|
+
if (res.error || !res.data) return null
|
|
20
|
+
return res.data
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** When plan info is unavailable, assume full access (self-hosted default). */
|
|
24
|
+
export function hasPlanFeature(plan: PlanInfo | null | undefined, feature: PlanFeature): boolean {
|
|
25
|
+
if (!plan) return true
|
|
26
|
+
return plan.features.includes(feature)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function planFeatureLabel(feature: PlanFeature): string {
|
|
30
|
+
switch (feature) {
|
|
31
|
+
case 'seo.inlineApply':
|
|
32
|
+
return 'SEO inline apply'
|
|
33
|
+
case 'seo.contentBrief':
|
|
34
|
+
return 'SEO content briefs'
|
|
35
|
+
case 'seo.contentResearch':
|
|
36
|
+
return 'SEO topic research'
|
|
37
|
+
case 'seo.batchContentBriefs':
|
|
38
|
+
return 'SEO batch content briefs'
|
|
39
|
+
default: {
|
|
40
|
+
const _exhaustive: never = feature
|
|
41
|
+
return _exhaustive
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -220,10 +220,13 @@ export function parseTags(raw: unknown): string[] {
|
|
|
220
220
|
|
|
221
221
|
function rowToEditorPost(postType: string, doc: DocumentApiRow): EditorPost {
|
|
222
222
|
const data = doc.data ?? {}
|
|
223
|
+
const dataTitle = dataStr(data, 'title')
|
|
223
224
|
return {
|
|
224
225
|
id: doc.id,
|
|
225
226
|
postType,
|
|
226
|
-
|
|
227
|
+
// Prefer the JSON field — the denormalized `doc.title` column can lag or
|
|
228
|
+
// reflect slug-derived fallbacks on imported/legacy rows.
|
|
229
|
+
title: dataTitle || (doc.title ?? ''),
|
|
227
230
|
slug: doc.slug ?? dataStr(data, 'slug'),
|
|
228
231
|
excerpt: dataStr(data, 'excerpt'),
|
|
229
232
|
featuredImage: dataStr(data, 'featuredImage'),
|
package/src/lib/seo-service.ts
CHANGED
|
@@ -817,9 +817,20 @@ export async function fetchRedirectOverview(): Promise<RedirectOverview> {
|
|
|
817
817
|
}
|
|
818
818
|
|
|
819
819
|
export async function fetchRedirectRules(): Promise<RedirectRule[]> {
|
|
820
|
-
const
|
|
821
|
-
|
|
822
|
-
|
|
820
|
+
const rules: RedirectRule[] = []
|
|
821
|
+
let page = 1
|
|
822
|
+
let totalPages = 1
|
|
823
|
+
do {
|
|
824
|
+
const res = await cmsApi<{
|
|
825
|
+
rules: RedirectRule[]
|
|
826
|
+
totalPages?: number
|
|
827
|
+
}>(`/seo/redirects?page=${page}&pageSize=500`)
|
|
828
|
+
throwIfError(res)
|
|
829
|
+
rules.push(...(res.data?.rules ?? []))
|
|
830
|
+
totalPages = res.data?.totalPages ?? 1
|
|
831
|
+
page += 1
|
|
832
|
+
} while (page <= totalPages)
|
|
833
|
+
return rules
|
|
823
834
|
}
|
|
824
835
|
|
|
825
836
|
export interface RedirectRulePayload {
|
package/src/views/SEO.tsx
CHANGED
|
@@ -20,6 +20,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'
|
|
|
20
20
|
import { toast } from 'sonner'
|
|
21
21
|
import { ErrorBoundary } from '../components/ErrorBoundary.js'
|
|
22
22
|
import { fetchSeoOverview, runSeoAudit } from '../lib/seo-service.js'
|
|
23
|
+
import { fetchPlanInfo, type PlanInfo } from '../lib/plan.js'
|
|
23
24
|
import { ScorePill, btnPrimary, btnSecondary } from '../components/seo/primitives.js'
|
|
24
25
|
import { SeoCopilotDrawer } from '../components/seo/SeoCopilotDrawer.js'
|
|
25
26
|
import { useSeoResource } from './seo/useSeoResource.js'
|
|
@@ -77,6 +78,11 @@ export function SEO({ onNavigate, initialTab = 'overview' }: SEOProps) {
|
|
|
77
78
|
const [auditing, setAuditing] = useState(false)
|
|
78
79
|
const [copilotOpen, setCopilotOpen] = useState(false)
|
|
79
80
|
const [deepLink, setDeepLink] = useState<UrlState>(initialUrl)
|
|
81
|
+
const [planInfo, setPlanInfo] = useState<PlanInfo | null>(null)
|
|
82
|
+
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
void fetchPlanInfo().then(setPlanInfo)
|
|
85
|
+
}, [])
|
|
80
86
|
|
|
81
87
|
// Overview resource is owned here so the header score pill and the Overview
|
|
82
88
|
// tab share a single request; `refetchKey` re-runs it after an audit.
|
|
@@ -217,6 +223,7 @@ export function SEO({ onNavigate, initialTab = 'overview' }: SEOProps) {
|
|
|
217
223
|
refetchKey={refetchKey}
|
|
218
224
|
initialIssueId={deepLink.issueId}
|
|
219
225
|
onNavigate={onNavigate}
|
|
226
|
+
planInfo={planInfo}
|
|
220
227
|
/>
|
|
221
228
|
)}
|
|
222
229
|
</Tabs.Content>
|
package/src/views/Users.tsx
CHANGED
|
@@ -677,7 +677,7 @@ export interface UsersProps {
|
|
|
677
677
|
}
|
|
678
678
|
|
|
679
679
|
export function Users({ embedded = false }: UsersProps = {}) {
|
|
680
|
-
const members = useApiData<ApiMember[]>('/users')
|
|
680
|
+
const members = useApiData<ApiMember[]>('/users?pageSize=200')
|
|
681
681
|
const invites = useApiData<ApiInvite[]>('/invites')
|
|
682
682
|
const stats = useApiData<ApiStats>('/users/stats')
|
|
683
683
|
const review = useApiData<ApiRecommendation[]>('/access-review')
|
|
@@ -15,6 +15,7 @@ interface EditorCanvasProps {
|
|
|
15
15
|
onAddSection: () => void
|
|
16
16
|
/** Section types rendered as placeholders — shows the "Structure view" notice. */
|
|
17
17
|
structuralTypes?: string[]
|
|
18
|
+
sitePreviewAvailable?: boolean
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
/**
|
|
@@ -30,6 +31,7 @@ export function EditorCanvas({
|
|
|
30
31
|
onSelect,
|
|
31
32
|
onAddSection,
|
|
32
33
|
structuralTypes = [],
|
|
34
|
+
sitePreviewAvailable = false,
|
|
33
35
|
}: EditorCanvasProps) {
|
|
34
36
|
const vp = getViewport(viewport)
|
|
35
37
|
const containerRef = useRef<HTMLDivElement>(null)
|
|
@@ -78,7 +80,10 @@ export function EditorCanvas({
|
|
|
78
80
|
<EmptyCanvas onAddSection={onAddSection} />
|
|
79
81
|
) : (
|
|
80
82
|
<>
|
|
81
|
-
<StructureNotice
|
|
83
|
+
<StructureNotice
|
|
84
|
+
structuralTypes={structuralTypes}
|
|
85
|
+
sitePreviewAvailable={sitePreviewAvailable}
|
|
86
|
+
/>
|
|
82
87
|
<div
|
|
83
88
|
className="mx-auto"
|
|
84
89
|
style={{ width: vp.width * scale, height: surfaceHeight ?? undefined }}
|
|
@@ -43,6 +43,7 @@ import { SectionInspector } from './SectionInspector.js'
|
|
|
43
43
|
import { AddSectionModal } from './AddSectionModal.js'
|
|
44
44
|
import { PageSettingsModal } from './PageSettingsModal.js'
|
|
45
45
|
import { ValidationSummary } from './ValidationSummary.js'
|
|
46
|
+
import { resolveDefaultSitePreview } from '../../lib/editor-preview.js'
|
|
46
47
|
|
|
47
48
|
interface PageSectionEditorProps {
|
|
48
49
|
/** undefined when creating a new page (`/pages/new`) */
|
|
@@ -275,8 +276,11 @@ export function PageSectionEditor({
|
|
|
275
276
|
dirty,
|
|
276
277
|
saveState,
|
|
277
278
|
saveDraft: handleSaveDraft,
|
|
279
|
+
defaultActive: resolveDefaultSitePreview(config?.admin?.editor, 'pages'),
|
|
278
280
|
})
|
|
279
281
|
|
|
282
|
+
const sitePreviewAvailable = Boolean(page?.id && page?.slug)
|
|
283
|
+
|
|
280
284
|
const requestPublish = useCallback(() => {
|
|
281
285
|
if (!page) return
|
|
282
286
|
const result = validatePage(page, true)
|
|
@@ -550,6 +554,7 @@ export function PageSectionEditor({
|
|
|
550
554
|
onSelect={setSelectedId}
|
|
551
555
|
onAddSection={() => setAddOpen(true)}
|
|
552
556
|
structuralTypes={structuralTypes}
|
|
557
|
+
sitePreviewAvailable={sitePreviewAvailable && !sitePreview.active}
|
|
553
558
|
/>
|
|
554
559
|
)}
|
|
555
560
|
</div>
|
|
@@ -5,12 +5,47 @@ import { Puzzle } from 'lucide-react'
|
|
|
5
5
|
/**
|
|
6
6
|
* Banner shown above the canvas surface when the document contains section
|
|
7
7
|
* types the canvas can only render as placeholders (custom / unmanaged
|
|
8
|
-
* types)
|
|
9
|
-
* lives on the public site behind "View on site".
|
|
8
|
+
* types), or when Site preview is available for accurate styling.
|
|
10
9
|
*/
|
|
11
|
-
export function StructureNotice({
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
export function StructureNotice({
|
|
11
|
+
structuralTypes,
|
|
12
|
+
sitePreviewAvailable = false,
|
|
13
|
+
}: {
|
|
14
|
+
structuralTypes: string[]
|
|
15
|
+
/** When true, nudge editors toward the Site preview toggle for WYSIWYG. */
|
|
16
|
+
sitePreviewAvailable?: boolean
|
|
17
|
+
}) {
|
|
18
|
+
if (structuralTypes.length === 0 && !sitePreviewAvailable) return null
|
|
19
|
+
|
|
20
|
+
if (structuralTypes.length > 0) {
|
|
21
|
+
const count = structuralTypes.length
|
|
22
|
+
return (
|
|
23
|
+
<div
|
|
24
|
+
role="note"
|
|
25
|
+
className="border-border bg-card text-muted-foreground mx-auto mb-4 flex w-fit max-w-full items-center gap-2 rounded-lg border px-3 py-1.5 text-xs"
|
|
26
|
+
>
|
|
27
|
+
<Puzzle className="h-3.5 w-3.5 shrink-0" aria-hidden />
|
|
28
|
+
<span>
|
|
29
|
+
<span className="text-foreground font-medium">Structure view</span> — {count} custom
|
|
30
|
+
section type{count > 1 ? 's' : ''} shown as placeholders.
|
|
31
|
+
{sitePreviewAvailable ? (
|
|
32
|
+
<>
|
|
33
|
+
{' '}
|
|
34
|
+
Use <span className="text-foreground font-medium">Site preview</span> for accurate
|
|
35
|
+
styling.
|
|
36
|
+
</>
|
|
37
|
+
) : (
|
|
38
|
+
<>
|
|
39
|
+
{' '}
|
|
40
|
+
Use <span className="text-foreground font-medium">View on site</span> for the real
|
|
41
|
+
design.
|
|
42
|
+
</>
|
|
43
|
+
)}
|
|
44
|
+
</span>
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
|
|
14
49
|
return (
|
|
15
50
|
<div
|
|
16
51
|
role="note"
|
|
@@ -18,9 +53,8 @@ export function StructureNotice({ structuralTypes }: { structuralTypes: string[]
|
|
|
18
53
|
>
|
|
19
54
|
<Puzzle className="h-3.5 w-3.5 shrink-0" aria-hidden />
|
|
20
55
|
<span>
|
|
21
|
-
<span className="text-foreground font-medium">Structure
|
|
22
|
-
|
|
23
|
-
<span className="text-foreground font-medium">View on site</span> for the real design.
|
|
56
|
+
<span className="text-foreground font-medium">Structure preview</span> — use{' '}
|
|
57
|
+
<span className="text-foreground font-medium">Site preview</span> for accurate styling.
|
|
24
58
|
</span>
|
|
25
59
|
</div>
|
|
26
60
|
)
|