@prenta/admin 1.2.0 → 1.3.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/CHANGELOG.md +12 -0
- package/design-system/README.md +1 -1
- package/design-system/tokens.css +3 -3
- package/design-system/tokens.json +2 -2
- package/design-system/tokens.scss +1 -3
- package/dist/__tests__/lib/page-audit-input.test.js +81 -0
- package/dist/__tests__/lib/page-audit-input.test.js.map +1 -1
- package/dist/__tests__/lib/version-history.test.js +18 -0
- package/dist/__tests__/lib/version-history.test.js.map +1 -1
- package/dist/__tests__/no-server-barrel-imports.test.js +3 -4
- package/dist/__tests__/no-server-barrel-imports.test.js.map +1 -1
- package/dist/__tests__/views/editor-top-bar.render.test.js +5 -0
- package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
- package/dist/__tests__/views/post-section-editor.test.js +38 -0
- package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
- package/dist/__tests__/views/post-tab.render.test.d.ts +2 -0
- package/dist/__tests__/views/post-tab.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/post-tab.render.test.js +86 -0
- package/dist/__tests__/views/post-tab.render.test.js.map +1 -0
- package/dist/components/CanvasEditTip.js +1 -1
- package/dist/components/CanvasEditTip.js.map +1 -1
- package/dist/components/seo/SeoEditorPane.d.ts +9 -1
- package/dist/components/seo/SeoEditorPane.d.ts.map +1 -1
- package/dist/components/seo/SeoEditorPane.js +5 -2
- package/dist/components/seo/SeoEditorPane.js.map +1 -1
- package/dist/hooks/usePageAudit.d.ts +4 -1
- package/dist/hooks/usePageAudit.d.ts.map +1 -1
- package/dist/hooks/usePageAudit.js +3 -3
- package/dist/hooks/usePageAudit.js.map +1 -1
- package/dist/lib/page-audit-input.d.ts +26 -1
- package/dist/lib/page-audit-input.d.ts.map +1 -1
- package/dist/lib/page-audit-input.js +48 -2
- package/dist/lib/page-audit-input.js.map +1 -1
- package/dist/lib/version-history.d.ts +5 -0
- package/dist/lib/version-history.d.ts.map +1 -1
- package/dist/lib/version-history.js +18 -0
- package/dist/lib/version-history.js.map +1 -1
- package/dist/prenta-admin.css +1 -1
- package/dist/views/page-editor/EditorTopBar.js +1 -1
- package/dist/views/page-editor/EditorTopBar.js.map +1 -1
- package/dist/views/post-editor/PostEditorCanvas.d.ts +14 -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/PostFieldsForm.d.ts +39 -0
- package/dist/views/post-editor/PostFieldsForm.d.ts.map +1 -0
- package/dist/views/post-editor/PostFieldsForm.js +85 -0
- package/dist/views/post-editor/PostFieldsForm.js.map +1 -0
- package/dist/views/post-editor/PostFieldsModal.d.ts +2 -14
- package/dist/views/post-editor/PostFieldsModal.d.ts.map +1 -1
- package/dist/views/post-editor/PostFieldsModal.js +20 -81
- package/dist/views/post-editor/PostFieldsModal.js.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
- package/dist/views/post-editor/PostSectionEditor.js +122 -34
- package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
- package/dist/views/post-editor/PostTab.d.ts +17 -0
- package/dist/views/post-editor/PostTab.d.ts.map +1 -0
- package/dist/views/post-editor/PostTab.js +23 -0
- package/dist/views/post-editor/PostTab.js.map +1 -0
- package/dist/views/settings/useAppearanceSettings.js +1 -1
- package/dist/views/settings/useAppearanceSettings.js.map +1 -1
- package/package.json +6 -6
- package/src/__tests__/lib/page-audit-input.test.ts +99 -0
- package/src/__tests__/lib/version-history.test.ts +20 -0
- package/src/__tests__/no-server-barrel-imports.test.ts +3 -4
- package/src/__tests__/views/editor-top-bar.render.test.tsx +6 -0
- package/src/__tests__/views/post-section-editor.test.tsx +59 -0
- package/src/__tests__/views/post-tab.render.test.tsx +116 -0
- package/src/components/CanvasEditTip.tsx +2 -2
- package/src/components/seo/SeoEditorPane.tsx +16 -1
- package/src/hooks/usePageAudit.ts +9 -2
- package/src/lib/page-audit-input.ts +67 -1
- package/src/lib/version-history.ts +23 -0
- package/src/styles/prenta-tokens.css +3 -3
- package/src/views/page-editor/EditorTopBar.tsx +2 -2
- package/src/views/post-editor/PostEditorCanvas.tsx +27 -5
- package/src/views/post-editor/PostFieldsForm.tsx +322 -0
- package/src/views/post-editor/PostFieldsModal.tsx +30 -281
- package/src/views/post-editor/PostSectionEditor.tsx +204 -59
- package/src/views/post-editor/PostTab.tsx +46 -0
- package/src/views/settings/useAppearanceSettings.ts +1 -1
|
@@ -16,6 +16,19 @@ interface PostEditorCanvasProps {
|
|
|
16
16
|
onAddSection?: () => void;
|
|
17
17
|
/** Section types rendered as placeholders — shows the "Structure view" notice. */
|
|
18
18
|
structuralTypes?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Read-only render of a past version. Suppresses selection and the editing
|
|
21
|
+
* affordances, and turns on the changed-section outlines.
|
|
22
|
+
*/
|
|
23
|
+
reviewing?: boolean;
|
|
24
|
+
/** Sections that differ from the version before the one being reviewed. */
|
|
25
|
+
changedSectionIds?: ReadonlySet<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Rendered in place of the editing tip / structure notice while reviewing.
|
|
28
|
+
* Passed in rather than built here because the review bar's actions belong
|
|
29
|
+
* to the editor's history state, which the canvas knows nothing about.
|
|
30
|
+
*/
|
|
31
|
+
reviewBar?: React.ReactNode;
|
|
19
32
|
}
|
|
20
33
|
/**
|
|
21
34
|
* Post preview canvas.
|
|
@@ -30,6 +43,6 @@ interface PostEditorCanvasProps {
|
|
|
30
43
|
* `container.clientWidth - 48`, which disagrees with the canvas's own metrics
|
|
31
44
|
* once a scrollbar appears, and it had no breakpoint/scale readout at all.
|
|
32
45
|
*/
|
|
33
|
-
export declare function PostEditorCanvas({ sections, header, context, selectedId, viewport, zoom, onSelect, onScaleChange, onCanvasElement, onAddSection, structuralTypes, }: PostEditorCanvasProps): import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
export declare function PostEditorCanvas({ sections, header, context, selectedId, viewport, zoom, onSelect, onScaleChange, onCanvasElement, onAddSection, structuralTypes, reviewing, changedSectionIds, reviewBar, }: PostEditorCanvasProps): import("react/jsx-runtime").JSX.Element;
|
|
34
47
|
export {};
|
|
35
48
|
//# sourceMappingURL=PostEditorCanvas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostEditorCanvas.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostEditorCanvas.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAErF,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAE1F,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAG7D,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,iBAAiB,CAAA;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,UAAU,CAAA;IACpB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IAClD,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"PostEditorCanvas.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostEditorCanvas.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAErF,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAE1F,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAG7D,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;IACxB,OAAO,EAAE,iBAAiB,CAAA;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,UAAU,CAAA;IACpB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAA;IAClD,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;IACzB,kFAAkF;IAClF,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,OAAO,EACP,UAAU,EACV,QAAQ,EACR,IAAY,EACZ,QAAQ,EACR,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAoB,EACpB,SAAiB,EACjB,iBAAiB,EACjB,SAAS,GACV,EAAE,qBAAqB,2CA0CvB"}
|
|
@@ -19,9 +19,9 @@ import { PostHeader } from './PostHeader.js';
|
|
|
19
19
|
* `container.clientWidth - 48`, which disagrees with the canvas's own metrics
|
|
20
20
|
* once a scrollbar appears, and it had no breakpoint/scale readout at all.
|
|
21
21
|
*/
|
|
22
|
-
export function PostEditorCanvas({ sections, header, context, selectedId, viewport, zoom = 'fit', onSelect, onScaleChange, onCanvasElement, onAddSection, structuralTypes = [], }) {
|
|
22
|
+
export function PostEditorCanvas({ sections, header, context, selectedId, viewport, zoom = 'fit', onSelect, onScaleChange, onCanvasElement, onAddSection, structuralTypes = [], reviewing = false, changedSectionIds, reviewBar, }) {
|
|
23
23
|
const registerRef = useSectionRefs(selectedId);
|
|
24
|
-
return (_jsx(CanvasScroll, { children: _jsxs(CanvasSurface, { breakpoint: viewport, zoom: zoom, onScaleChange: onScaleChange, onCanvasElement: onCanvasElement, chrome: _jsxs(_Fragment, { children: [sections.length > 0 && _jsx(CanvasEditTip, {}), _jsx(StructureNotice, { structuralTypes: structuralTypes })] }), children: [_jsx(PostHeader, { config: header, context: context }), sections.length === 0 ? (_jsx(EmptyBody, { onAddSection: onAddSection })) : (sections.map((section) => (_jsx(SectionRenderer, { section: section, context: context, editable: true, selected: section.id === selectedId, onSelect: onSelect, registerRef: registerRef }, section.id))))] }) }));
|
|
24
|
+
return (_jsx(CanvasScroll, { children: _jsxs(CanvasSurface, { breakpoint: viewport, zoom: zoom, onScaleChange: onScaleChange, onCanvasElement: onCanvasElement, chrome: reviewing ? (reviewBar) : (_jsxs(_Fragment, { children: [sections.length > 0 && _jsx(CanvasEditTip, {}), _jsx(StructureNotice, { structuralTypes: structuralTypes })] })), children: [_jsx(PostHeader, { config: header, context: context }), sections.length === 0 ? (_jsx(EmptyBody, { onAddSection: reviewing ? undefined : onAddSection })) : (sections.map((section) => (_jsx(SectionRenderer, { section: section, context: context, editable: true, reviewing: reviewing, changed: changedSectionIds?.has(section.id) ?? false, selected: section.id === selectedId, onSelect: onSelect, registerRef: registerRef }, section.id))))] }) }));
|
|
25
25
|
}
|
|
26
26
|
function EmptyBody({ onAddSection }) {
|
|
27
27
|
// This block sits inside the fixed-white preview surface, so the neutral
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostEditorCanvas.js","sourceRoot":"","sources":["../../../src/views/post-editor/PostEditorCanvas.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAGjE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAC7F,OAAO,EAAE,eAAe,EAA0B,MAAM,kCAAkC,CAAA;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"PostEditorCanvas.js","sourceRoot":"","sources":["../../../src/views/post-editor/PostEditorCanvas.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAA;AAGjE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAC7F,OAAO,EAAE,eAAe,EAA0B,MAAM,kCAAkC,CAAA;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AA+B5C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,OAAO,EACP,UAAU,EACV,QAAQ,EACR,IAAI,GAAG,KAAK,EACZ,QAAQ,EACR,aAAa,EACb,eAAe,EACf,YAAY,EACZ,eAAe,GAAG,EAAE,EACpB,SAAS,GAAG,KAAK,EACjB,iBAAiB,EACjB,SAAS,GACa;IACtB,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;IAE9C,OAAO,CACL,KAAC,YAAY,cACX,MAAC,aAAa,IACZ,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,IAAI,EACV,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,MAAM,EACJ,SAAS,CAAC,CAAC,CAAC,CACV,SAAS,CACV,CAAC,CAAC,CAAC,CACF,8BACG,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAC,aAAa,KAAG,EACzC,KAAC,eAAe,IAAC,eAAe,EAAE,eAAe,GAAI,IACpD,CACJ,aAGH,KAAC,UAAU,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAI,EAC/C,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,KAAC,SAAS,IAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,GAAI,CAClE,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACxB,KAAC,eAAe,IAEd,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,QACR,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,iBAAiB,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,KAAK,EACpD,QAAQ,EAAE,OAAO,CAAC,EAAE,KAAK,UAAU,EACnC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,IARnB,OAAO,CAAC,EAAE,CASf,CACH,CAAC,CACH,IACa,GACH,CAChB,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,YAAY,EAAiC;IAChE,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,4EAA4E;IAC5E,wEAAwE;IACxE,gEAAgE;IAChE,OAAO,CACL,eAAK,SAAS,EAAC,iGAAiG,aAC9G,eAAM,SAAS,EAAC,kEAAkE,YAChF,KAAC,QAAQ,IAAC,SAAS,EAAC,+BAA+B,wBAAe,GAC7D,EACP,YAAG,SAAS,EAAC,+BAA+B,YACzC,YAAY;oBACX,CAAC,CAAC,gKAAgK;oBAClK,CAAC,CAAC,2LAA2L,GAC7L,EACH,YAAY,IAAI,CACf,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,SAAS,EAAC,kJAAkJ,aAE5J,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,wBAAe,mBAEjC,CACV,IACG,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of a collection's field config the form reads to pick controls:
|
|
3
|
+
* a `select` category renders a dropdown (structured vocabulary), an `array`
|
|
4
|
+
* tags field renders the chip input with autocomplete.
|
|
5
|
+
*/
|
|
6
|
+
export interface PostFieldConfig {
|
|
7
|
+
type?: string;
|
|
8
|
+
options?: Array<{
|
|
9
|
+
label: string;
|
|
10
|
+
value: string;
|
|
11
|
+
}>;
|
|
12
|
+
maxRows?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface PostFieldsFormValues {
|
|
15
|
+
title: string;
|
|
16
|
+
slug: string;
|
|
17
|
+
excerpt: string;
|
|
18
|
+
featuredImage: string;
|
|
19
|
+
category: string;
|
|
20
|
+
tags: string[];
|
|
21
|
+
}
|
|
22
|
+
export interface PostFieldsFormProps {
|
|
23
|
+
values: PostFieldsFormValues;
|
|
24
|
+
canEdit: boolean;
|
|
25
|
+
/** Field definitions from the post type's collection config. */
|
|
26
|
+
fields?: Record<string, PostFieldConfig | undefined>;
|
|
27
|
+
postType: string;
|
|
28
|
+
/** HTML body, used as AI excerpt context. */
|
|
29
|
+
bodyHtml?: string;
|
|
30
|
+
slugTouched: boolean;
|
|
31
|
+
onSlugTouched: () => void;
|
|
32
|
+
onChange: (patch: Partial<PostFieldsFormValues>) => void;
|
|
33
|
+
titleRef?: React.Ref<HTMLInputElement>;
|
|
34
|
+
/** Prefix for input ids so the modal and the rail tab can coexist. */
|
|
35
|
+
idPrefix?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Title, slug, excerpt, featured image, category, and tags. SEO lives in the SEO tab. */
|
|
38
|
+
export declare function PostFieldsForm({ values, canEdit, fields, postType, bodyHtml, slugTouched, onSlugTouched, onChange, titleRef, idPrefix, }: PostFieldsFormProps): import("react/jsx-runtime").JSX.Element;
|
|
39
|
+
//# sourceMappingURL=PostFieldsForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostFieldsForm.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostFieldsForm.tsx"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,oBAAoB,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC,CAAA;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,OAAO,CAAA;IACpB,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,oBAAoB,CAAC,KAAK,IAAI,CAAA;IACxD,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IACtC,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAoDD,0FAA0F;AAC1F,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,OAAO,EACP,MAAM,EACN,QAAQ,EACR,QAAa,EACb,WAAW,EACX,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,QAAe,GAChB,EAAE,mBAAmB,2CAqNrB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Loader2, Sparkles } from 'lucide-react';
|
|
5
|
+
import { toast } from 'sonner';
|
|
6
|
+
import { normalizeSlug, validateSlug } from '@prenta/core/client';
|
|
7
|
+
import { MediaPickerModal } from '../../components/MediaPickerModal.js';
|
|
8
|
+
import { TagInput } from '../../components/TagInput.js';
|
|
9
|
+
import { coauthorText } from '../../lib/coauthor-client.js';
|
|
10
|
+
const LABEL = 'text-foreground mb-1 block text-xs font-medium';
|
|
11
|
+
/** Match TipTap body editor borders — `border-input` is transparent in theme.css. */
|
|
12
|
+
const INPUT = 'border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-md border px-2.5 py-1.5 text-sm focus-visible:ring-2 focus-visible:outline-none';
|
|
13
|
+
const slugify = normalizeSlug;
|
|
14
|
+
function stripHtml(html) {
|
|
15
|
+
return html
|
|
16
|
+
.replace(/<[^>]*>/g, ' ')
|
|
17
|
+
.replace(/\s+/g, ' ')
|
|
18
|
+
.trim();
|
|
19
|
+
}
|
|
20
|
+
function buildContentContext(title, body, excerpt) {
|
|
21
|
+
const plain = stripHtml(body);
|
|
22
|
+
const parts = [title.trim(), excerpt.trim(), plain].filter(Boolean);
|
|
23
|
+
return parts.join('\n\n');
|
|
24
|
+
}
|
|
25
|
+
function AiFieldButton({ label, busy, disabled, onClick, }) {
|
|
26
|
+
return (_jsxs("button", { type: "button", "aria-label": label, title: label, disabled: disabled || busy, onClick: onClick, className: "inline-flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] font-medium text-[var(--acc)] transition-colors duration-[var(--motion-fast)] hover:bg-[var(--acc-l)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:outline-none disabled:opacity-60", children: [busy ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin", "aria-hidden": true })) : (_jsx(Sparkles, { className: "h-3 w-3", "aria-hidden": true })), busy ? 'Generating…' : 'AI'] }));
|
|
27
|
+
}
|
|
28
|
+
/** Title, slug, excerpt, featured image, category, and tags. SEO lives in the SEO tab. */
|
|
29
|
+
export function PostFieldsForm({ values, canEdit, fields, postType, bodyHtml = '', slugTouched, onSlugTouched, onChange, titleRef, idPrefix = 'pf', }) {
|
|
30
|
+
const [mediaOpen, setMediaOpen] = useState(false);
|
|
31
|
+
const [aiBusy, setAiBusy] = useState(false);
|
|
32
|
+
const categoryField = fields?.category;
|
|
33
|
+
const categoryOptions = categoryField?.type === 'select' && Array.isArray(categoryField.options)
|
|
34
|
+
? categoryField.options
|
|
35
|
+
: null;
|
|
36
|
+
const tagsField = fields?.tags;
|
|
37
|
+
const hasTags = tagsField?.type === 'array';
|
|
38
|
+
const slugError = validateSlug(values.slug);
|
|
39
|
+
function handleTitle(next) {
|
|
40
|
+
const patch = { title: next };
|
|
41
|
+
if (!slugTouched)
|
|
42
|
+
patch.slug = slugify(next);
|
|
43
|
+
onChange(patch);
|
|
44
|
+
}
|
|
45
|
+
async function handleAiGenerateExcerpt() {
|
|
46
|
+
const context = buildContentContext(values.title, bodyHtml, values.excerpt);
|
|
47
|
+
if (!context.trim()) {
|
|
48
|
+
toast.error('Add a title or write body content in the Article Body section before generating with AI.');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
setAiBusy(true);
|
|
52
|
+
try {
|
|
53
|
+
const outcome = await coauthorText('compress', context, {
|
|
54
|
+
instructions: 'Write a 1–2 sentence excerpt for blog listings and cards. Return only the excerpt text.',
|
|
55
|
+
targetLength: 45,
|
|
56
|
+
});
|
|
57
|
+
if (!outcome.ok) {
|
|
58
|
+
toast.error(outcome.error);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
onChange({ excerpt: outcome.result.text.trim() });
|
|
62
|
+
toast.success('Excerpt generated — review before saving.');
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
toast.error('AI request failed.');
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
setAiBusy(false);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const titleId = `${idPrefix}-title`;
|
|
72
|
+
const slugId = `${idPrefix}-slug`;
|
|
73
|
+
const categoryId = `${idPrefix}-category`;
|
|
74
|
+
const tagsId = `${idPrefix}-tags`;
|
|
75
|
+
const excerptId = `${idPrefix}-excerpt`;
|
|
76
|
+
const imageId = `${idPrefix}-image`;
|
|
77
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsxs("label", { className: LABEL, htmlFor: titleId, children: ["Title ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx("input", { id: titleId, ref: titleRef, className: INPUT, value: values.title, disabled: !canEdit, placeholder: "e.g. Announcing our new product", onChange: (e) => handleTitle(e.target.value) })] }), _jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { children: [_jsxs("label", { className: LABEL, htmlFor: slugId, children: ["Slug ", _jsx("span", { className: "text-destructive", children: "*" })] }), _jsx("input", { id: slugId, className: INPUT, value: values.slug, disabled: !canEdit, placeholder: slugTouched ? undefined : 'Generated from title…', "aria-invalid": Boolean(slugError), "aria-describedby": slugError ? `${slugId}-error` : undefined, onChange: (e) => {
|
|
78
|
+
onSlugTouched();
|
|
79
|
+
onChange({ slug: slugify(e.target.value) });
|
|
80
|
+
} }), slugError && (_jsx("p", { id: `${slugId}-error`, className: "text-destructive mt-1 text-xs", children: slugError }))] }), _jsxs("div", { children: [_jsx("label", { className: LABEL, htmlFor: categoryId, children: "Category" }), categoryOptions ? (_jsxs("select", { id: categoryId, className: INPUT, value: values.category, disabled: !canEdit, onChange: (e) => onChange({ category: e.target.value }), children: [_jsx("option", { value: "", children: "No category" }), categoryOptions.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value))), values.category && !categoryOptions.some((o) => o.value === values.category) && (_jsx("option", { value: values.category, children: values.category }))] })) : (_jsx("input", { id: categoryId, className: INPUT, value: values.category, disabled: !canEdit, placeholder: "e.g. Product", onChange: (e) => onChange({ category: e.target.value }) }))] })] }), hasTags && (_jsxs("div", { children: [_jsx("label", { className: LABEL, htmlFor: tagsId, children: "Tags" }), _jsx(TagInput, { id: tagsId, value: values.tags, onChange: (tags) => onChange({ tags }), collection: postType, field: "tags", disabled: !canEdit, maxTags: tagsField?.maxRows })] })), _jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between gap-2", children: [_jsx("label", { className: `${LABEL} mb-0`, htmlFor: excerptId, children: "Excerpt" }), _jsx(AiFieldButton, { label: "Generate excerpt from content", busy: aiBusy, disabled: !canEdit, onClick: () => void handleAiGenerateExcerpt() })] }), _jsx("textarea", { id: excerptId, className: `${INPUT} min-h-[72px] resize-y`, value: values.excerpt, disabled: !canEdit, placeholder: "A short summary shown in listings and the header.", onChange: (e) => onChange({ excerpt: e.target.value }) })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL, htmlFor: imageId, children: "Featured image" }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { id: imageId, className: `${INPUT} min-w-0 flex-1`, value: values.featuredImage, disabled: !canEdit, placeholder: "https://\u2026 or pick from the media library", onChange: (e) => onChange({ featuredImage: e.target.value }) }), _jsx("button", { type: "button", disabled: !canEdit, onClick: () => setMediaOpen(true), className: "bg-accent text-foreground border-border hover:bg-accent/80 shrink-0 rounded-md border px-3 py-1.5 text-xs font-medium disabled:opacity-50", children: "Browse" })] }), values.featuredImage && (_jsx("div", { className: "border-border bg-muted mt-2 overflow-hidden rounded-md border", children: _jsx("img", { src: values.featuredImage, alt: "", className: "h-28 w-full object-cover" }) }))] })] }), _jsx(MediaPickerModal, { open: mediaOpen, onClose: () => setMediaOpen(false), onSelect: (url) => {
|
|
81
|
+
onChange({ featuredImage: url });
|
|
82
|
+
setMediaOpen(false);
|
|
83
|
+
}, accept: "image/*" })] }));
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=PostFieldsForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostFieldsForm.js","sourceRoot":"","sources":["../../../src/views/post-editor/PostFieldsForm.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
import type { EditorPost } from '../../lib/post-editor-service.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* a `select` category renders a dropdown (structured vocabulary), an `array`
|
|
5
|
-
* tags field renders the chip input with autocomplete.
|
|
6
|
-
*/
|
|
7
|
-
export interface PostFieldConfig {
|
|
8
|
-
type?: string;
|
|
9
|
-
options?: Array<{
|
|
10
|
-
label: string;
|
|
11
|
-
value: string;
|
|
12
|
-
}>;
|
|
13
|
-
maxRows?: number;
|
|
14
|
-
}
|
|
2
|
+
import { type PostFieldConfig } from './PostFieldsForm.js';
|
|
3
|
+
export type { PostFieldConfig };
|
|
15
4
|
interface PostFieldsModalProps {
|
|
16
5
|
open: boolean;
|
|
17
6
|
post: EditorPost;
|
|
@@ -23,5 +12,4 @@ interface PostFieldsModalProps {
|
|
|
23
12
|
}
|
|
24
13
|
/** Edits post metadata: title, slug, excerpt, featured image, category, and tags. SEO lives in the SEO tab. */
|
|
25
14
|
export declare function PostFieldsModal({ open, post, canEdit, fields, onClose, onSave, }: PostFieldsModalProps): import("react/jsx-runtime").JSX.Element;
|
|
26
|
-
export {};
|
|
27
15
|
//# sourceMappingURL=PostFieldsModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostFieldsModal.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostFieldsModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PostFieldsModal.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostFieldsModal.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,qBAAqB,CAAA;AAE5B,YAAY,EAAE,eAAe,EAAE,CAAA;AAE/B,UAAU,oBAAoB;IAC5B,IAAI,EAAE,OAAO,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC,CAAA;IACpD,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAA;CAC7C;AA6BD,+GAA+G;AAC/G,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE,oBAAoB,2CA8GtB"}
|
|
@@ -1,19 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx,
|
|
2
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
4
|
-
import {
|
|
5
|
-
import { toast } from 'sonner';
|
|
6
|
-
import { normalizeSlug, validateSlug } from '@prenta/core/client';
|
|
4
|
+
import { validateSlug } from '@prenta/core/client';
|
|
7
5
|
import { Modal } from '../../components/ui/Modal.js';
|
|
8
6
|
import { Button } from '../../components/ui/Button.js';
|
|
9
7
|
import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js';
|
|
10
|
-
import {
|
|
11
|
-
import { TagInput } from '../../components/TagInput.js';
|
|
12
|
-
import { coauthorText } from '../../lib/coauthor-client.js';
|
|
13
|
-
const LABEL = 'text-foreground mb-1 block text-xs font-medium';
|
|
14
|
-
/** Match TipTap body editor borders — `border-input` is transparent in theme.css. */
|
|
15
|
-
const INPUT = 'border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-md border px-2.5 py-1.5 text-sm focus-visible:ring-2 focus-visible:outline-none';
|
|
16
|
-
const slugify = normalizeSlug;
|
|
8
|
+
import { PostFieldsForm, } from './PostFieldsForm.js';
|
|
17
9
|
function snapshotFromPost(post) {
|
|
18
10
|
return {
|
|
19
11
|
title: post.title,
|
|
@@ -30,20 +22,6 @@ function snapshotFromFields(input) {
|
|
|
30
22
|
tags: [...input.tags].sort().join('\0'),
|
|
31
23
|
};
|
|
32
24
|
}
|
|
33
|
-
function stripHtml(html) {
|
|
34
|
-
return html
|
|
35
|
-
.replace(/<[^>]*>/g, ' ')
|
|
36
|
-
.replace(/\s+/g, ' ')
|
|
37
|
-
.trim();
|
|
38
|
-
}
|
|
39
|
-
function buildContentContext(title, body, excerpt) {
|
|
40
|
-
const plain = stripHtml(body);
|
|
41
|
-
const parts = [title.trim(), excerpt.trim(), plain].filter(Boolean);
|
|
42
|
-
return parts.join('\n\n');
|
|
43
|
-
}
|
|
44
|
-
function AiFieldButton({ label, busy, disabled, onClick, }) {
|
|
45
|
-
return (_jsxs("button", { type: "button", "aria-label": label, title: label, disabled: disabled || busy, onClick: onClick, className: "inline-flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[11px] font-medium text-[var(--acc)] transition-colors duration-[var(--motion-fast)] hover:bg-[var(--acc-l)] focus-visible:ring-2 focus-visible:ring-[var(--ring)] focus-visible:outline-none disabled:opacity-60", children: [busy ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin", "aria-hidden": true })) : (_jsx(Sparkles, { className: "h-3 w-3", "aria-hidden": true })), busy ? 'Generating…' : 'AI'] }));
|
|
46
|
-
}
|
|
47
25
|
/** Edits post metadata: title, slug, excerpt, featured image, category, and tags. SEO lives in the SEO tab. */
|
|
48
26
|
export function PostFieldsModal({ open, post, canEdit, fields, onClose, onSave, }) {
|
|
49
27
|
const [title, setTitle] = useState(post.title);
|
|
@@ -53,18 +31,10 @@ export function PostFieldsModal({ open, post, canEdit, fields, onClose, onSave,
|
|
|
53
31
|
const [category, setCategory] = useState(post.category);
|
|
54
32
|
const [tags, setTags] = useState(post.tags);
|
|
55
33
|
const [slugTouched, setSlugTouched] = useState(Boolean(post.slug));
|
|
56
|
-
const [mediaOpen, setMediaOpen] = useState(false);
|
|
57
|
-
const [aiBusy, setAiBusy] = useState(false);
|
|
58
34
|
const [confirmDiscard, setConfirmDiscard] = useState(false);
|
|
59
35
|
const baselineRef = useRef(null);
|
|
60
36
|
// Land the user in the Title field (name-it-first flow for new posts).
|
|
61
37
|
const titleRef = useRef(null);
|
|
62
|
-
const categoryField = fields?.category;
|
|
63
|
-
const categoryOptions = categoryField?.type === 'select' && Array.isArray(categoryField.options)
|
|
64
|
-
? categoryField.options
|
|
65
|
-
: null;
|
|
66
|
-
const tagsField = fields?.tags;
|
|
67
|
-
const hasTags = tagsField?.type === 'array';
|
|
68
38
|
useEffect(() => {
|
|
69
39
|
if (!open) {
|
|
70
40
|
baselineRef.current = null;
|
|
@@ -78,22 +48,14 @@ export function PostFieldsModal({ open, post, canEdit, fields, onClose, onSave,
|
|
|
78
48
|
setCategory(post.category);
|
|
79
49
|
setTags(post.tags);
|
|
80
50
|
setSlugTouched(Boolean(post.slug));
|
|
81
|
-
setAiBusy(false);
|
|
82
51
|
baselineRef.current = snapshotFromPost(post);
|
|
83
52
|
}, [open, post]);
|
|
53
|
+
const values = { title, slug, excerpt, featuredImage, category, tags };
|
|
84
54
|
const isDirty = useMemo(() => {
|
|
85
55
|
if (!open || !baselineRef.current)
|
|
86
56
|
return false;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
slug,
|
|
90
|
-
excerpt,
|
|
91
|
-
featuredImage,
|
|
92
|
-
category,
|
|
93
|
-
tags,
|
|
94
|
-
});
|
|
95
|
-
return JSON.stringify(current) !== JSON.stringify(baselineRef.current);
|
|
96
|
-
}, [open, title, slug, excerpt, featuredImage, category, tags]);
|
|
57
|
+
return JSON.stringify(snapshotFromFields(values)) !== JSON.stringify(baselineRef.current);
|
|
58
|
+
}, [open, values]);
|
|
97
59
|
function requestDismiss() {
|
|
98
60
|
if (isDirty) {
|
|
99
61
|
setConfirmDiscard(true);
|
|
@@ -101,50 +63,27 @@ export function PostFieldsModal({ open, post, canEdit, fields, onClose, onSave,
|
|
|
101
63
|
}
|
|
102
64
|
onClose();
|
|
103
65
|
}
|
|
104
|
-
function
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
66
|
+
function handleChange(patch) {
|
|
67
|
+
if (patch.title !== undefined)
|
|
68
|
+
setTitle(patch.title);
|
|
69
|
+
if (patch.slug !== undefined)
|
|
70
|
+
setSlug(patch.slug);
|
|
71
|
+
if (patch.excerpt !== undefined)
|
|
72
|
+
setExcerpt(patch.excerpt);
|
|
73
|
+
if (patch.featuredImage !== undefined)
|
|
74
|
+
setFeaturedImage(patch.featuredImage);
|
|
75
|
+
if (patch.category !== undefined)
|
|
76
|
+
setCategory(patch.category);
|
|
77
|
+
if (patch.tags !== undefined)
|
|
78
|
+
setTags(patch.tags);
|
|
108
79
|
}
|
|
109
80
|
const slugError = validateSlug(slug);
|
|
110
|
-
async function handleAiGenerateExcerpt() {
|
|
111
|
-
const context = buildContentContext(title, post.body, excerpt);
|
|
112
|
-
if (!context.trim()) {
|
|
113
|
-
toast.error('Add a title or write body content in the Article Body section before generating with AI.');
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
setAiBusy(true);
|
|
117
|
-
try {
|
|
118
|
-
const outcome = await coauthorText('compress', context, {
|
|
119
|
-
instructions: 'Write a 1–2 sentence excerpt for blog listings and cards. Return only the excerpt text.',
|
|
120
|
-
targetLength: 45,
|
|
121
|
-
});
|
|
122
|
-
if (!outcome.ok) {
|
|
123
|
-
toast.error(outcome.error);
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
setExcerpt(outcome.result.text.trim());
|
|
127
|
-
toast.success('Excerpt generated — review before saving.');
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
toast.error('AI request failed.');
|
|
131
|
-
}
|
|
132
|
-
finally {
|
|
133
|
-
setAiBusy(false);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
81
|
function handleSave() {
|
|
137
82
|
if (slugError)
|
|
138
83
|
return;
|
|
139
84
|
onSave({ title, slug, excerpt, featuredImage, category, tags });
|
|
140
85
|
onClose();
|
|
141
86
|
}
|
|
142
|
-
return (_jsxs(_Fragment, { children: [_jsx(Modal, { open: open, onClose: onClose, onDismiss: requestDismiss, title: "Post details", size: "lg", initialFocusRef: titleRef, actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", onClick: requestDismiss, children: "Cancel" }), _jsx(Button, { variant: "primary", onClick: handleSave, disabled: !canEdit || Boolean(slugError), children: "Done" })] }), children:
|
|
143
|
-
setSlugTouched(true);
|
|
144
|
-
setSlug(slugify(e.target.value));
|
|
145
|
-
} }), slugError && (_jsx("p", { id: "pf-slug-error", className: "text-destructive mt-1 text-xs", children: slugError }))] }), _jsxs("div", { children: [_jsx("label", { className: LABEL, htmlFor: "pf-category", children: "Category" }), categoryOptions ? (_jsxs("select", { id: "pf-category", className: INPUT, value: category, disabled: !canEdit, onChange: (e) => setCategory(e.target.value), children: [_jsx("option", { value: "", children: "No category" }), categoryOptions.map((o) => (_jsx("option", { value: o.value, children: o.label }, o.value))), category && !categoryOptions.some((o) => o.value === category) && (_jsx("option", { value: category, children: category }))] })) : (_jsx("input", { id: "pf-category", className: INPUT, value: category, disabled: !canEdit, placeholder: "e.g. Product", onChange: (e) => setCategory(e.target.value) }))] })] }), hasTags && (_jsxs("div", { children: [_jsx("label", { className: LABEL, htmlFor: "pf-tags", children: "Tags" }), _jsx(TagInput, { id: "pf-tags", value: tags, onChange: setTags, collection: post.postType, field: "tags", disabled: !canEdit, maxTags: tagsField?.maxRows })] })), _jsxs("div", { children: [_jsxs("div", { className: "mb-1 flex items-center justify-between gap-2", children: [_jsx("label", { className: `${LABEL} mb-0`, htmlFor: "pf-excerpt", children: "Excerpt" }), _jsx(AiFieldButton, { label: "Generate excerpt from content", busy: aiBusy, disabled: !canEdit, onClick: () => void handleAiGenerateExcerpt() })] }), _jsx("textarea", { id: "pf-excerpt", className: `${INPUT} min-h-[72px] resize-y`, value: excerpt, disabled: !canEdit, placeholder: "A short summary shown in listings and the header.", onChange: (e) => setExcerpt(e.target.value) })] }), _jsxs("div", { children: [_jsx("label", { className: LABEL, htmlFor: "pf-image", children: "Featured image" }), _jsxs("div", { className: "flex gap-2", children: [_jsx("input", { id: "pf-image", className: `${INPUT} min-w-0 flex-1`, value: featuredImage, disabled: !canEdit, placeholder: "https://\u2026 or pick from the media library", onChange: (e) => setFeaturedImage(e.target.value) }), _jsx("button", { type: "button", disabled: !canEdit, onClick: () => setMediaOpen(true), className: "bg-accent text-foreground border-border hover:bg-accent/80 shrink-0 rounded-md border px-3 py-1.5 text-xs font-medium disabled:opacity-50", children: "Browse" })] }), featuredImage && (_jsx("div", { className: "border-border bg-muted mt-2 overflow-hidden rounded-md border", children: _jsx("img", { src: featuredImage, alt: "", className: "h-28 w-full object-cover" }) }))] })] }) }), _jsx(MediaPickerModal, { open: mediaOpen, onClose: () => setMediaOpen(false), onSelect: (url) => {
|
|
146
|
-
setFeaturedImage(url);
|
|
147
|
-
setMediaOpen(false);
|
|
148
|
-
}, accept: "image/*" }), _jsx(ConfirmDialog, { open: confirmDiscard, onClose: () => setConfirmDiscard(false), onConfirm: onClose, title: "Discard unsaved changes?", description: "You have unsaved post details. Closing now will discard them.", confirmLabel: "Discard", cancelLabel: "Keep editing", destructive: true })] }));
|
|
87
|
+
return (_jsxs(_Fragment, { children: [_jsx(Modal, { open: open, onClose: onClose, onDismiss: requestDismiss, title: "Post details", size: "lg", initialFocusRef: titleRef, actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", onClick: requestDismiss, children: "Cancel" }), _jsx(Button, { variant: "primary", onClick: handleSave, disabled: !canEdit || Boolean(slugError), children: "Done" })] }), children: _jsx(PostFieldsForm, { values: values, canEdit: canEdit, fields: fields, postType: post.postType, bodyHtml: post.body, slugTouched: slugTouched, onSlugTouched: () => setSlugTouched(true), onChange: handleChange, titleRef: titleRef }) }), _jsx(ConfirmDialog, { open: confirmDiscard, onClose: () => setConfirmDiscard(false), onConfirm: onClose, title: "Discard unsaved changes?", description: "You have unsaved post details. Closing now will discard them.", confirmLabel: "Discard", cancelLabel: "Keep editing", destructive: true })] }));
|
|
149
88
|
}
|
|
150
89
|
//# sourceMappingURL=PostFieldsModal.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostFieldsModal.js","sourceRoot":"","sources":["../../../src/views/post-editor/PostFieldsModal.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"PostFieldsModal.js","sourceRoot":"","sources":["../../../src/views/post-editor/PostFieldsModal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostSectionEditor.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostSectionEditor.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PostSectionEditor.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostSectionEditor.tsx"],"names":[],"mappings":"AA0DA,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAc5E,8DAA8D;AAC9D,UAAU,YAAY;IACpB,WAAW,CAAC,EAAE,MAAM,CAClB,MAAM,EACJ;QACE,MAAM,CAAC,EAAE;YAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC,CAAA;KACrD,GACD,SAAS,CACZ,CAAA;IACD,GAAG,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC3B;AAED,wDAAwD;AACxD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACxD;AAED,UAAU,sBAAsB;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAgBD,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,UAAU,EACV,MAAM,EACN,OAAO,EACP,UAAU,GACX,EAAE,sBAAsB,2CAizBxB"}
|