@commercetools-demo/puck-content-manager 0.1.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/dist/index.d.mts +44 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +1125 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1105 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ContentManager.tsx","../src/ContentEditor.tsx","../src/ContentManagerRouter.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport { PuckApiProvider, usePuckContents } from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n} from '@commercetools-demo/puck-types';\nimport DataTable from '@commercetools-uikit/data-table';\nimport PrimaryButton from '@commercetools-uikit/primary-button';\nimport SecondaryButton from '@commercetools-uikit/secondary-button';\nimport FlatButton from '@commercetools-uikit/flat-button';\nimport Card from '@commercetools-uikit/card';\nimport Spacings from '@commercetools-uikit/spacings';\nimport Text from '@commercetools-uikit/text';\nimport LoadingSpinner from '@commercetools-uikit/loading-spinner';\nimport TextInput from '@commercetools-uikit/text-input';\nimport Label from '@commercetools-uikit/label';\nimport { PlusThinIcon, SearchIcon } from '@commercetools-uikit/icons';\n\n// ---------------------------------------------------------------------------\n// Status badge\n// ---------------------------------------------------------------------------\n\nconst StatusBadge: React.FC<{ variant: 'draft' | 'published' | 'none' }> = ({ variant }) => {\n const styles: React.CSSProperties =\n variant === 'published'\n ? { background: 'var(--color-success-95)', color: 'var(--color-success-40)', border: '1px solid var(--color-success-85)' }\n : variant === 'draft'\n ? { background: 'var(--color-warning-95)', color: 'var(--color-warning-40)', border: '1px solid var(--color-warning-85)' }\n : { background: 'var(--color-neutral-95)', color: 'var(--color-neutral-50)', border: '1px solid var(--color-neutral-85)' };\n return (\n <span\n style={{\n ...styles,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n marginRight: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {variant === 'published' ? 'Published' : variant === 'draft' ? 'Draft' : 'No state'}\n </span>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Row type for DataTable\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string };\n\nconst columns = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// Inner list component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentListProps {\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nconst ContentList: React.FC<ContentListProps> = ({ defaultContentType, onEdit }) => {\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n {/* Header */}\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Text.Headline as=\"h1\">Content Items</Text.Headline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {/* Create form */}\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-name\">Name</Label>\n <TextInput\n id=\"create-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-type\">Content Type</Label>\n <TextInput\n id=\"create-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {/* Filter row */}\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {/* Table */}\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={columns}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\n return (\n <code\n style={{\n background: 'var(--color-neutral-95)',\n padding: '2px 6px',\n borderRadius: 'var(--border-radius-4)',\n fontSize: 'var(--font-size-10)',\n fontFamily: 'monospace',\n }}\n >\n {row.value.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton label=\"Edit\" size=\"20\" onClick={() => onEdit(row)} />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nexport const ContentManager: React.FC<ContentManagerProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n defaultContentType,\n onEdit,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentList defaultContentType={defaultContentType} onEdit={onEdit} />\n </PuckApiProvider>\n);\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport { PuckApiProvider, usePuckContent } from '@commercetools-demo/puck-api';\nimport type { PuckContentStateInfo, PuckData } from '@commercetools-demo/puck-types';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\n\n// ---------------------------------------------------------------------------\n// Inline toolbar — mirrors EditorToolbar but uses PuckContentStateInfo\n// ---------------------------------------------------------------------------\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst StatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({\n label,\n variant,\n}) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({\n saving,\n isDirty,\n states,\n onSave,\n onPublish,\n onRevert,\n}) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <StatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <StatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && (\n <StatusBadge label=\"Draft\" variant=\"draft\" />\n )}\n {hasPublished && <StatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner editor component (uses context)\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorInnerProps {\n contentKey: string;\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nconst ContentEditorInner: React.FC<ContentEditorInnerProps> = ({\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => {\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n onPublish?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n },\n [saveDraft, publish, onPublish, onError]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n // Use draft state data if available, otherwise fall back to the main content value\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n\n return (\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentEditorProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n contentKey: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n onPublish?: (data: PuckData) => void;\n onSave?: (data: PuckData) => void;\n onError?: (error: Error) => void;\n}\n\nexport const ContentEditor: React.FC<ContentEditorProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentEditorInner\n contentKey={contentKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n />\n </PuckApiProvider>\n);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Routes,\n Route,\n useNavigate,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n} from '@commercetools-demo/puck-editor';\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckContent,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n PuckContentStateInfo,\n PuckData,\n} from '@commercetools-demo/puck-types';\nimport DataTable from '@commercetools-uikit/data-table';\nimport PrimaryButton from '@commercetools-uikit/primary-button';\nimport SecondaryButton from '@commercetools-uikit/secondary-button';\nimport FlatButton from '@commercetools-uikit/flat-button';\nimport Card from '@commercetools-uikit/card';\nimport Spacings from '@commercetools-uikit/spacings';\nimport Text from '@commercetools-uikit/text';\nimport LoadingSpinner from '@commercetools-uikit/loading-spinner';\nimport TextInput from '@commercetools-uikit/text-input';\nimport Label from '@commercetools-uikit/label';\nimport { PlusThinIcon, SearchIcon, AngleLeftIcon } from '@commercetools-uikit/icons';\n\n// ---------------------------------------------------------------------------\n// Status badge\n// ---------------------------------------------------------------------------\n\nconst StatusBadge: React.FC<{ variant: 'draft' | 'published' | 'none' }> = ({ variant }) => {\n const styles: React.CSSProperties =\n variant === 'published'\n ? { background: 'var(--color-success-95)', color: 'var(--color-success-40)', border: '1px solid var(--color-success-85)' }\n : variant === 'draft'\n ? { background: 'var(--color-warning-95)', color: 'var(--color-warning-40)', border: '1px solid var(--color-warning-85)' }\n : { background: 'var(--color-neutral-95)', color: 'var(--color-neutral-50)', border: '1px solid var(--color-neutral-85)' };\n return (\n <span\n style={{\n ...styles,\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 8px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n marginRight: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {variant === 'published' ? 'Published' : variant === 'draft' ? 'Draft' : 'No state'}\n </span>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Content toolbar (status badges + publish/revert buttons)\n// ---------------------------------------------------------------------------\n\ntype BadgeVariant = 'saving' | 'unsaved' | 'draft' | 'published';\n\nconst BADGE_STYLES: Record<BadgeVariant, { bg: string; color: string; border: string }> = {\n saving: { bg: 'rgba(251, 191, 36, 0.12)', color: 'var(--status-saving)', border: 'rgba(251, 191, 36, 0.3)' },\n unsaved: { bg: 'rgba(100, 116, 139, 0.12)', color: 'var(--text-muted)', border: 'rgba(100, 116, 139, 0.3)' },\n draft: { bg: 'rgba(129, 140, 248, 0.12)', color: 'var(--status-draft)', border: 'rgba(129, 140, 248, 0.3)' },\n published: { bg: 'rgba(6, 214, 160, 0.12)', color: 'var(--status-published)', border: 'rgba(6, 214, 160, 0.3)' },\n};\n\nconst EditorStatusBadge: React.FC<{ label: string; variant: BadgeVariant }> = ({ label, variant }) => {\n const bs = BADGE_STYLES[variant];\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: 600,\n background: bs.bg,\n color: bs.color,\n border: `1px solid ${bs.border}`,\n }}\n >\n {label}\n </span>\n );\n};\n\ninterface ContentToolbarProps {\n saving: boolean;\n isDirty: boolean;\n states: PuckContentStateInfo;\n onSave: () => void;\n onPublish: () => void;\n onRevert: () => void;\n}\n\nconst ContentToolbar: React.FC<ContentToolbarProps> = ({ saving, isDirty, states, onSave, onPublish, onRevert }) => {\n const hasDraft = Boolean(states.draft);\n const hasPublished = Boolean(states.published);\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '12px', flexWrap: 'wrap' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '6px' }}>\n {saving && <EditorStatusBadge label=\"Saving…\" variant=\"saving\" />}\n {!saving && isDirty && <EditorStatusBadge label=\"Unsaved\" variant=\"unsaved\" />}\n {!saving && !isDirty && hasDraft && <EditorStatusBadge label=\"Draft\" variant=\"draft\" />}\n {hasPublished && <EditorStatusBadge label=\"Published\" variant=\"published\" />}\n </div>\n {hasDraft && hasPublished && (\n <button\n onClick={onRevert}\n disabled={saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n }}\n >\n Revert to Published\n </button>\n )}\n <button\n onClick={onSave}\n disabled={!isDirty || saving}\n style={{\n padding: '6px 14px',\n borderRadius: '4px',\n border: '1px solid var(--border-glow)',\n background: 'transparent',\n color: 'var(--text-muted)',\n fontWeight: 500,\n fontSize: '13px',\n cursor: (!isDirty || saving) ? 'not-allowed' : 'pointer',\n opacity: (!isDirty || saving) ? 0.4 : 1,\n }}\n >\n Save\n </button>\n <button\n onClick={onPublish}\n disabled={saving}\n style={{\n padding: '6px 16px',\n borderRadius: '4px',\n border: '1px solid var(--accent-cyan)',\n background: 'rgba(0, 212, 255, 0.1)',\n color: 'var(--accent-cyan)',\n fontWeight: 600,\n fontSize: '13px',\n cursor: saving ? 'not-allowed' : 'pointer',\n opacity: saving ? 0.5 : 1,\n boxShadow: '0 0 12px rgba(0, 212, 255, 0.15)',\n }}\n >\n {hasPublished ? 'Re-publish' : 'Publish'}\n </button>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Nav bar style\n// ---------------------------------------------------------------------------\n\nconst NAV_BAR_STYLE: React.CSSProperties = {\n position: 'sticky',\n top: 0,\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '8px 16px',\n background: 'var(--color-surface, #fff)',\n borderBottom: '1px solid var(--color-neutral-90)',\n zIndex: 200,\n flexShrink: 0,\n};\n\n// ---------------------------------------------------------------------------\n// Table columns\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'contentType', label: 'Content Type' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// ContentListRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentListRouteProps {\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentListRoute: React.FC<ContentListRouteProps> = ({ defaultContentType, backButton }) => {\n const navigate = useNavigate();\n const { contents, loading, error, fetchContents, createContent, deleteContent, refresh } =\n usePuckContents(defaultContentType);\n\n const [filterType, setFilterType] = useState(defaultContentType ?? '');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleFilter = () => void fetchContents(filterType || undefined);\n\n const handleCreate = async () => {\n setCreateError(null);\n if (!createName.trim()) { setCreateError('Name is required'); return; }\n if (!createType.trim()) { setCreateError('Content type is required'); return; }\n setCreating(true);\n try {\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: { content: [], root: { props: {} } },\n };\n const created = await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n navigate(`/${created.key}`, { state: { contentName: created.value.name } });\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (key: string) => {\n if (!confirm('Delete this content item and all its versions?')) return;\n setDeleting(key);\n try {\n await deleteContent(key);\n } finally {\n setDeleting(null);\n }\n };\n\n const rows: ContentRow[] = contents.map((c) => ({ ...c, id: c.key }));\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Spacings.Stack scale=\"l\">\n <Spacings.Inline justifyContent=\"space-between\" alignItems=\"center\">\n <Spacings.Inline scale=\"m\" alignItems=\"center\">\n {backButton}\n <Text.Headline as=\"h1\">Content Items</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Content\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setShowCreate((v) => !v)}\n />\n </Spacings.Inline>\n\n {showCreate && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create Content Item</Text.Subheadline>\n {createError && <Text.Body tone=\"negative\">{createError}</Text.Body>}\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-name\">Name</Label>\n <TextInput\n id=\"create-content-name\"\n value={createName}\n onChange={(e) => setCreateName(e.target.value)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"create-content-type\">Content Type</Label>\n <TextInput\n id=\"create-content-type\"\n value={createType}\n onChange={(e) => setCreateType(e.target.value)}\n placeholder=\"e.g. hero, banner\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={creating ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={creating}\n />\n <SecondaryButton label=\"Cancel\" onClick={() => setShowCreate(false)} />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <div style={{ flex: 1, maxWidth: '280px' }}>\n <TextInput\n value={filterType}\n onChange={(e) => setFilterType(e.target.value)}\n placeholder=\"Filter by content type…\"\n />\n </div>\n <SecondaryButton\n label=\"Filter\"\n iconLeft={<SearchIcon />}\n onClick={handleFilter}\n />\n <FlatButton\n label=\"Clear\"\n onClick={() => { setFilterType(''); void fetchContents(undefined); }}\n />\n <FlatButton label=\"Refresh\" onClick={() => void refresh()} />\n </Spacings.Inline>\n\n {error && <Text.Body tone=\"negative\">{error}</Text.Body>}\n\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No content items found.</Text.Body>\n </Spacings.Stack>\n ) : (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: ContentRow, column) => {\n switch (column.key) {\n case 'name':\n return <Text.Body isBold>{row.value.name}</Text.Body>;\n case 'contentType':\n return (\n <code\n style={{\n background: 'var(--color-neutral-95)',\n padding: '2px 6px',\n borderRadius: 'var(--border-radius-4)',\n fontSize: 'var(--font-size-10)',\n fontFamily: 'monospace',\n }}\n >\n {row.value.contentType}\n </code>\n );\n case 'status': {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <span>\n {hasDraft && <StatusBadge variant=\"draft\" />}\n {hasPublished && <StatusBadge variant=\"published\" />}\n {!hasDraft && !hasPublished && <StatusBadge variant=\"none\" />}\n </span>\n );\n }\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text.Body>\n );\n case 'actions':\n return (\n <div style={{ display: 'flex', alignItems: 'center', gap: '8px' }}>\n <PrimaryButton\n label=\"Edit\"\n size=\"20\"\n onClick={() =>\n navigate(`/${row.key}`, { state: { contentName: row.value.name } })\n }\n />\n <FlatButton\n tone=\"critical\"\n label={deleting === row.key ? '…' : 'Delete'}\n isDisabled={deleting === row.key}\n onClick={() => void handleDelete(row.key)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n )}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContentEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface ContentEditorRouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst ContentEditorRoute: React.FC<ContentEditorRouteProps> = ({ config, backButton }) => {\n const { contentKey } = useParams<{ contentKey: string }>();\n const navigate = useNavigate();\n const location = useLocation();\n const contentName =\n (location.state as { contentName?: string } | null)?.contentName ?? contentKey ?? 'Content';\n\n const {\n content,\n states,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n } = usePuckContent(contentKey!);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n\n const handleChange = useCallback((data: Data) => {\n latestDataRef.current = data;\n setHasUnsavedChanges(true);\n }, []);\n\n const handleSave = useCallback(async () => {\n const data = latestDataRef.current;\n if (!data) return;\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] save error:', err);\n }\n }, [saveDraft]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n setHasUnsavedChanges(false);\n await publish(false);\n } catch (err) {\n console.error('[ContentManagerRouter] publish error:', err);\n }\n },\n [saveDraft, publish]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setHasUnsavedChanges(false);\n } catch (err) {\n console.error('[ContentManagerRouter] revert error:', err);\n }\n }, [revertToPublished]);\n\n // Override root fields with content-specific labels and add slot field.\n // Stored in content.data.root.props (title, slot, backgroundColor, etc.).\n const contentConfig = useMemo((): Config => {\n const otherRootFields = Object.fromEntries(\n Object.entries(config.root?.fields ?? {}).filter(([k]) => k !== 'title')\n );\n return {\n ...config,\n root: {\n ...config.root,\n fields: {\n title: { type: 'text', label: 'Content Title' },\n slot: { type: 'text', label: 'Slot' },\n ...otherRootFields,\n },\n defaultProps: {\n title: 'New Content',\n slot: '',\n ...config.root?.defaultProps,\n },\n },\n };\n }, [config]);\n\n if (loading) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100vh',\n fontSize: '16px',\n color: 'var(--text-muted)',\n }}\n >\n Loading editor…\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n padding: '32px',\n color: 'var(--status-error)',\n background: 'rgba(248, 113, 113, 0.08)',\n border: '1px solid rgba(248, 113, 113, 0.25)',\n borderRadius: '8px',\n margin: '16px',\n }}\n >\n <strong>Error loading content:</strong> {error}\n </div>\n );\n }\n\n const activeData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Content Items\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => navigate('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{contentName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <ComponentSearchProvider>\n <Puck\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () => (\n <ContentToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={states}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n }}\n />\n </ComponentSearchProvider>\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface ContentManagerRouterInnerProps {\n config: Config;\n defaultContentType?: string;\n backButton?: ReactNode;\n}\n\nconst ContentManagerRouterInner: React.FC<ContentManagerRouterInnerProps> = ({\n config,\n defaultContentType,\n backButton,\n}) => (\n <Routes>\n <Route\n path=\"/\"\n element={\n <ContentListRoute defaultContentType={defaultContentType} backButton={backButton} />\n }\n />\n <Route\n path=\"/:contentKey\"\n element={<ContentEditorRoute config={config} backButton={backButton} />}\n />\n </Routes>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerRouterProps {\n /** URL path where this manager is mounted, e.g. \"/content\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — must match what's used in the renderer */\n config: Config;\n defaultContentType?: string;\n /** Optional element rendered before the breadcrumb in the editor header */\n backButton?: ReactNode;\n}\n\nexport const ContentManagerRouter: React.FC<ContentManagerRouterProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config,\n defaultContentType,\n backButton,\n}) => (\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <ContentManagerRouterInner\n config={config}\n defaultContentType={defaultContentType}\n backButton={backButton}\n />\n </BrowserRouter>\n </PuckApiProvider>\n);\n"],"mappings":"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","names":["useState","PuckApiProvider","jsx","jsxs","StatusBadge","useState","useCallback","useMemo","useRef","Puck","ComponentSearchProvider","ComponentsPanel","ComponentItemFilter","PuckApiProvider","usePuckContents","usePuckContent","DataTable","PrimaryButton","SecondaryButton","FlatButton","Card","Spacings","Text","LoadingSpinner","TextInput","Label","PlusThinIcon","SearchIcon","jsx","jsxs","StatusBadge","BADGE_STYLES","ContentToolbar"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@commercetools-demo/puck-content-manager",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "UI components for managing standalone Puck content items",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.mjs",
|
|
12
|
+
"require": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"package.json"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsup",
|
|
24
|
+
"build:watch": "tsup --watch",
|
|
25
|
+
"typecheck": "tsc --noEmit"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@commercetools-demo/puck-api": "^0.1.0",
|
|
29
|
+
"@commercetools-demo/puck-editor": "^0.1.0",
|
|
30
|
+
"@commercetools-demo/puck-types": "^0.1.0",
|
|
31
|
+
"@commercetools-uikit/card": "^20.5.0",
|
|
32
|
+
"@commercetools-uikit/data-table": "^20.5.0",
|
|
33
|
+
"@commercetools-uikit/design-system": "^20.5.0",
|
|
34
|
+
"@commercetools-uikit/flat-button": "^20.5.0",
|
|
35
|
+
"@commercetools-uikit/icons": "^20.5.0",
|
|
36
|
+
"@commercetools-uikit/label": "^20.5.0",
|
|
37
|
+
"@commercetools-uikit/loading-spinner": "^20.5.0",
|
|
38
|
+
"@commercetools-uikit/primary-button": "^20.5.0",
|
|
39
|
+
"@commercetools-uikit/secondary-button": "^20.5.0",
|
|
40
|
+
"@commercetools-uikit/spacings": "^20.5.0",
|
|
41
|
+
"@commercetools-uikit/text": "^20.5.0",
|
|
42
|
+
"@commercetools-uikit/text-input": "^20.5.0",
|
|
43
|
+
"@measured/puck": "0.18.2"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"react": ">=19.0.0",
|
|
47
|
+
"react-dom": ">=19.0.0",
|
|
48
|
+
"react-intl": ">=6.0.0",
|
|
49
|
+
"react-router-dom": ">=5.0.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/react": "^18",
|
|
53
|
+
"@types/react-dom": "^18",
|
|
54
|
+
"tsup": "^8.3.0",
|
|
55
|
+
"typescript": "^5.7.2"
|
|
56
|
+
}
|
|
57
|
+
}
|