@commercetools-demo/puck-content-manager 0.5.1 → 0.6.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 +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +791 -498
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +817 -460
- package/dist/index.mjs.map +1 -1
- package/package.json +8 -19
package/dist/index.mjs.map
CHANGED
|
@@ -1 +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';\nimport Stamp from '@commercetools-uikit/stamp';\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 fontWeight=\"bold\">{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 style={{ display: 'inline-flex', gap: '4px', flexWrap: 'wrap' }}>\n {hasDraft && <Stamp tone=\"warning\" label=\"Draft\" isCondensed />}\n {hasPublished && <Stamp tone=\"positive\" label=\"Published\" isCondensed />}\n {!hasDraft && !hasPublished && <Stamp tone=\"secondary\" label=\"No state\" isCondensed />}\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 ContentManagerListProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nexport const ContentManagerList: React.FC<ContentManagerListProps> = ({\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 { PuckContentVersionEntry, PuckData } from '@commercetools-demo/puck-types';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n EditorToolbar,\n} from '@commercetools-demo/puck-editor';\nimport {\n VersionHistoryProvider,\n VersionPreviewBanner,\n VersionAwareFieldsPanel,\n VersionHistoryButton,\n useVersionHistoryPanel,\n useVersionDiff,\n} from '@commercetools-demo/puck-version-history';\nimport LoadingSpinner from '@commercetools-uikit/loading-spinner';\nimport Text from '@commercetools-uikit/text';\nimport Spacings from '@commercetools-uikit/spacings';\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 versions,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n loadVersions,\n } = usePuckContent(contentKey);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n const [isApplyingVersion, setIsApplyingVersion] = useState(false);\n\n // Current live data (draft preferred, fallback to content value)\n const currentData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n // Version history panel state\n const versionHistory = useVersionHistoryPanel({\n versions: versions as PuckContentVersionEntry[],\n loadVersions,\n currentData,\n });\n\n // Diff between selected historical version and current draft\n const diff = useVersionDiff(\n versionHistory.previewData,\n currentData\n );\n\n // Ref so handleChange can read the latest preview state without stale closure\n const isPreviewingRef = useRef(false);\n isPreviewingRef.current = versionHistory.isPreviewingHistory;\n\n // -------------------------------------------------------------------------\n // Normal editor handlers\n // -------------------------------------------------------------------------\n\n const handleChange = useCallback((data: Data) => {\n if (isPreviewingRef.current) return;\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 // Version history handlers\n // -------------------------------------------------------------------------\n\n const handleApplyVersion = useCallback(async () => {\n const versionData = versionHistory.previewData;\n if (!versionData) return;\n setIsApplyingVersion(true);\n try {\n await saveDraft(versionData);\n setHasUnsavedChanges(false);\n onSave?.(versionData);\n versionHistory.clearSelection();\n } catch (err) {\n onError?.(err as Error);\n } finally {\n setIsApplyingVersion(false);\n }\n }, [versionHistory, saveDraft, onSave, onError]);\n\n // -------------------------------------------------------------------------\n // Content-specific Puck config: inject title + slot root fields\n // -------------------------------------------------------------------------\n\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 style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100vh' }}>\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <LoadingSpinner />\n <Text.Body tone=\"secondary\">Loading editor…</Text.Body>\n </Spacings.Stack>\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text.Body tone=\"negative\"><strong>Error loading content:</strong> {error}</Text.Body>\n </div>\n );\n }\n\n // Data shown in Puck canvas — historical preview takes precedence\n const activeData: PuckData = versionHistory.previewData ?? currentData;\n\n // Cast states for EditorToolbar (PuckContentStateInfo is compatible with PuckStateInfo)\n const toolbarStates = states as unknown as Parameters<typeof EditorToolbar>[0]['states'];\n\n return (\n <VersionHistoryProvider\n diff={diff}\n isPreviewingHistory={versionHistory.isPreviewingHistory}\n versions={versions as PuckContentVersionEntry[]}\n isLoadingVersions={versionHistory.isLoadingVersions}\n selectedVersionId={versionHistory.selectedVersionId}\n isApplying={isApplyingVersion}\n onVersionSelect={versionHistory.selectVersion}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n onLoadVersions={versionHistory.openPanel}\n >\n <ComponentSearchProvider>\n <Puck\n key={versionHistory.selectedVersionId ?? 'current'}\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () =>\n versionHistory.isPreviewingHistory ? (\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <VersionPreviewBanner\n timestamp={versionHistory.selectedVersion!.timestamp}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n isApplying={isApplyingVersion}\n />\n <VersionHistoryButton disabled={isApplyingVersion} />\n </Spacings.Inline>\n ) : (\n <EditorToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={toolbarStates}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n showPublishButton\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n fields: ({ children, isLoading }) => (\n <VersionAwareFieldsPanel isLoading={isLoading}>\n {children}\n </VersionAwareFieldsPanel>\n ),\n }}\n />\n </ComponentSearchProvider>\n </VersionHistoryProvider>\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 Switch,\n Route,\n useHistory,\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 defaultPuckConfig,\n EditorToolbar,\n} from '@commercetools-demo/puck-editor';\nimport {\n VersionHistoryProvider,\n VersionHistoryButton,\n VersionPreviewBanner,\n VersionAwareFieldsPanel,\n useVersionHistoryPanel,\n useVersionDiff,\n} from '@commercetools-demo/puck-version-history';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckContent,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n PuckContentVersionEntry,\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 Stamp from '@commercetools-uikit/stamp';\nimport { PlusThinIcon, SearchIcon, AngleLeftIcon } from '@commercetools-uikit/icons';\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 history = useHistory();\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 history.push(`/${created.key}`, { 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 fontWeight=\"bold\">{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 style={{ display: 'inline-flex', gap: '4px', flexWrap: 'wrap' }}>\n {hasDraft && <Stamp tone=\"warning\" label=\"Draft\" isCondensed />}\n {hasPublished && <Stamp tone=\"positive\" label=\"Published\" isCondensed />}\n {!hasDraft && !hasPublished && <Stamp tone=\"secondary\" label=\"No state\" isCondensed />}\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 <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <PrimaryButton\n label=\"Edit\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}`, { 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 </Spacings.Inline>\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 history = useHistory();\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 versions,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n loadVersions,\n } = usePuckContent(contentKey!);\n\n const latestDataRef = useRef<Data | null>(null);\n const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);\n const [isApplyingVersion, setIsApplyingVersion] = useState(false);\n\n const currentData: PuckData =\n states.draft?.data ??\n content?.data ?? { content: [], root: { props: {} } };\n\n const versionHistory = useVersionHistoryPanel({\n versions: versions as PuckContentVersionEntry[],\n loadVersions,\n currentData,\n });\n\n const diff = useVersionDiff(versionHistory.previewData, currentData);\n\n const isPreviewingRef = useRef(false);\n isPreviewingRef.current = versionHistory.isPreviewingHistory;\n\n const handleChange = useCallback((data: Data) => {\n if (isPreviewingRef.current) return;\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 const handleApplyVersion = useCallback(async () => {\n const versionData = versionHistory.previewData;\n if (!versionData) return;\n setIsApplyingVersion(true);\n try {\n await saveDraft(versionData);\n setHasUnsavedChanges(false);\n versionHistory.clearSelection();\n } catch (err) {\n console.error('[ContentManagerRouter] apply version error:', err);\n } finally {\n setIsApplyingVersion(false);\n }\n }, [versionHistory, saveDraft]);\n\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 style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100vh' }}>\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <LoadingSpinner />\n <Text.Body tone=\"secondary\">Loading editor…</Text.Body>\n </Spacings.Stack>\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text.Body tone=\"negative\"><strong>Error loading content:</strong> {error}</Text.Body>\n </div>\n );\n }\n\n const activeData: PuckData = versionHistory.previewData ?? currentData;\n const toolbarStates = states as unknown as Parameters<typeof EditorToolbar>[0]['states'];\n\n return (\n <VersionHistoryProvider\n diff={diff}\n isPreviewingHistory={versionHistory.isPreviewingHistory}\n versions={versions as PuckContentVersionEntry[]}\n isLoadingVersions={versionHistory.isLoadingVersions}\n selectedVersionId={versionHistory.selectedVersionId}\n isApplying={isApplyingVersion}\n onVersionSelect={versionHistory.selectVersion}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n onLoadVersions={versionHistory.openPanel}\n >\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={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body fontWeight=\"bold\">{contentName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <ComponentSearchProvider>\n <Puck\n key={versionHistory.selectedVersionId ?? 'current'}\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n headerActions: () =>\n versionHistory.isPreviewingHistory ? (\n <Spacings.Inline scale=\"s\" alignItems=\"center\">\n <VersionPreviewBanner\n timestamp={versionHistory.selectedVersion!.timestamp}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n isApplying={isApplyingVersion}\n />\n <VersionHistoryButton disabled={isApplyingVersion} />\n </Spacings.Inline>\n ) : (\n <EditorToolbar\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={toolbarStates}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n showPublishButton\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n fields: ({ children, isLoading }) => (\n <VersionAwareFieldsPanel isLoading={isLoading}>\n {children}\n </VersionAwareFieldsPanel>\n ),\n }}\n />\n </ComponentSearchProvider>\n </div>\n </div>\n </VersionHistoryProvider>\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 <Switch>\n <Route\n exact\n path=\"/\"\n render={() => (\n <ContentListRoute defaultContentType={defaultContentType} backButton={backButton} />\n )}\n />\n <Route\n path=\"/:contentKey\"\n render={() => <ContentEditorRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerProps {\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. Defaults to defaultPuckConfig. */\n config?: Config;\n defaultContentType?: string;\n /** Optional element rendered before the breadcrumb in the editor header */\n backButton?: ReactNode;\n}\n\nexport const ContentManager: React.FC<ContentManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config = DEFAULT_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","LoadingSpinner","Text","Spacings","jsx","jsxs","useState","useCallback","useMemo","useRef","Puck","ComponentSearchProvider","ComponentsPanel","ComponentItemFilter","EditorToolbar","VersionHistoryProvider","VersionHistoryButton","VersionPreviewBanner","VersionAwareFieldsPanel","useVersionHistoryPanel","useVersionDiff","PuckApiProvider","usePuckContents","usePuckContent","DataTable","PrimaryButton","SecondaryButton","FlatButton","Card","Spacings","Text","LoadingSpinner","TextInput","Label","Stamp","PlusThinIcon","SearchIcon","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/ContentManager.tsx","../src/EnsureIntlProvider.tsx","../src/EnsureNimbusProvider.tsx","../src/ContentEditor.tsx","../src/ContentManagerRouter.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckTemplates,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n} from '@commercetools-demo/puck-types';\nimport {\n Badge,\n Button,\n Card,\n DataTable,\n Dialog,\n FormField,\n Icon,\n IconButton,\n LoadingSpinner,\n Select,\n Stack,\n Text,\n TextInput,\n type DataTableColumnItem,\n} from '@commercetools/nimbus';\nimport { Add, Close, Delete, Edit } from '@commercetools/nimbus-icons';\nimport { EnsureIntlProvider } from './EnsureIntlProvider';\nimport { EnsureNimbusProvider } from './EnsureNimbusProvider';\n\n// ---------------------------------------------------------------------------\n// Row type for DataTable\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string; [key: string]: unknown };\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, createContent, deleteContent } =\n usePuckContents(defaultContentType);\n const { templates } = usePuckTemplates('content');\n\n const [search, setSearch] = useState('');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n const [templateKey, setTemplateKey] = useState('');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n // Content item targeted by the (Nimbus) delete-confirmation dialog.\n const [pendingDelete, setPendingDelete] = useState<PuckContentListItem | null>(null);\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 template = templateKey\n ? templates.find((t) => t.key === templateKey)\n : undefined;\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: template?.value.puckData ?? { content: [], root: { props: {} } },\n };\n await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n setTemplateKey('');\n } catch (err) {\n setCreateError((err as Error).message);\n } finally {\n setCreating(false);\n }\n };\n\n const handleDelete = async (item: PuckContentListItem) => {\n setDeleting(item.key);\n try {\n await deleteContent(item.key);\n setPendingDelete(null);\n } finally {\n setDeleting(null);\n }\n };\n\n const term = search.trim().toLowerCase();\n const filteredContents = term\n ? contents.filter(\n (c) =>\n c.value.name.toLowerCase().includes(term) ||\n c.value.contentType.toLowerCase().includes(term)\n )\n : contents;\n\n const rows: ContentRow[] = filteredContents.map((c) => ({ ...c, id: c.key }));\n\n const columns: DataTableColumnItem<ContentRow>[] = [\n {\n id: 'name',\n header: 'Name',\n accessor: (row) => row.value.name,\n render: ({ row }) => <Text fontWeight=\"bold\">{row.value.name}</Text>,\n },\n {\n id: 'contentType',\n header: 'Content Type',\n accessor: (row) => row.value.contentType,\n render: ({ row }) => (\n <code\n style={{\n background: '#f4f4f4',\n padding: '2px 6px',\n borderRadius: '4px',\n fontSize: '11px',\n fontFamily: 'monospace',\n }}\n >\n {row.value.contentType}\n </code>\n ),\n },\n {\n id: 'status',\n header: 'Status',\n accessor: () => '',\n isSortable: false,\n render: ({ row }) => {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <Stack direction=\"row\" gap=\"100\" wrap=\"wrap\">\n {hasDraft && <Badge colorPalette=\"warning\" size=\"xs\">Draft</Badge>}\n {hasPublished && <Badge colorPalette=\"positive\" size=\"xs\">Published</Badge>}\n {!hasDraft && !hasPublished && <Badge colorPalette=\"neutral\" size=\"xs\">No state</Badge>}\n </Stack>\n );\n },\n },\n {\n id: 'updatedAt',\n header: 'Updated',\n accessor: (row) => row.value.updatedAt,\n render: ({ row }) => (\n <Text color=\"neutral.11\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text>\n ),\n },\n {\n id: 'actions',\n header: 'Actions',\n accessor: () => '',\n isSortable: false,\n render: ({ row }) => (\n <Stack direction=\"row\" gap=\"100\" alignItems=\"center\">\n <IconButton\n aria-label={`Edit ${row.value.name}`}\n variant=\"ghost\"\n size=\"xs\"\n onPress={() => onEdit(row)}\n >\n <Edit />\n </IconButton>\n <IconButton\n aria-label={`Delete ${row.value.name}`}\n variant=\"ghost\"\n colorPalette=\"critical\"\n size=\"xs\"\n isDisabled={deleting === row.key}\n onPress={() => setPendingDelete(row)}\n >\n <Delete />\n </IconButton>\n </Stack>\n ),\n },\n ];\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Stack direction=\"column\" gap=\"600\">\n {/* Header */}\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\">\n <Text as=\"h1\" fontSize=\"2xl\" fontWeight=\"700\">Content Items</Text>\n <Button variant=\"solid\" onPress={() => setShowCreate((v) => !v)}>\n <Icon as={Add} /> New Content\n </Button>\n </Stack>\n\n {/* Create form */}\n {showCreate && (\n <Card.Root variant=\"outlined\">\n <Card.Body>\n <Stack direction=\"column\" gap=\"400\">\n <Text as=\"h4\" fontSize=\"xl\" fontWeight=\"700\">Create Content Item</Text>\n {createError && <Text color=\"critical.11\">{createError}</Text>}\n <Stack direction=\"row\" gap=\"400\">\n <div style={{ flex: 1 }}>\n <FormField.Root>\n <FormField.Label>Name</FormField.Label>\n <FormField.Input>\n <TextInput\n value={createName}\n onChange={(v) => setCreateName(v)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </FormField.Input>\n </FormField.Root>\n </div>\n <div style={{ flex: 1 }}>\n <FormField.Root>\n <FormField.Label>Content Type</FormField.Label>\n <FormField.Input>\n <TextInput\n value={createType}\n onChange={(v) => setCreateType(v)}\n placeholder=\"e.g. hero, banner\"\n />\n </FormField.Input>\n </FormField.Root>\n </div>\n </Stack>\n <FormField.Root>\n <FormField.Label>Template</FormField.Label>\n <FormField.Input>\n <Select.Root\n aria-label=\"Template\"\n selectedKey={templateKey || 'empty'}\n onSelectionChange={(key) =>\n setTemplateKey(key == null || key === 'empty' ? '' : String(key))\n }\n >\n <Select.Options>\n <Select.Option id=\"empty\">Empty</Select.Option>\n {templates.map((t) => (\n <Select.Option key={t.key} id={t.key}>\n {t.value.name}\n </Select.Option>\n ))}\n </Select.Options>\n </Select.Root>\n </FormField.Input>\n </FormField.Root>\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"solid\" onPress={() => void handleCreate()} isDisabled={creating}>\n {creating ? 'Creating…' : 'Create'}\n </Button>\n <Button variant=\"outline\" onPress={() => setShowCreate(false)}>Cancel</Button>\n </Stack>\n </Stack>\n </Card.Body>\n </Card.Root>\n )}\n\n {/* Search by name or content type */}\n <div style={{ maxWidth: 360 }}>\n <TextInput\n aria-label=\"Search content\"\n placeholder=\"Search by name or content type…\"\n value={search}\n onChange={(v) => setSearch(v)}\n width=\"100%\"\n trailingElement={\n search !== '' ? (\n <IconButton\n aria-label=\"Clear search\"\n variant=\"ghost\"\n colorPalette=\"neutral\"\n size=\"2xs\"\n onPress={() => setSearch('')}\n >\n <Close />\n </IconButton>\n ) : undefined\n }\n />\n </div>\n\n {error && <Text color=\"critical.11\">{error}</Text>}\n\n {/* Table */}\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Stack direction=\"column\" gap=\"400\" alignItems=\"center\">\n <Text color=\"neutral.11\">No content items found.</Text>\n </Stack>\n ) : (\n <DataTable columns={columns} rows={rows} aria-label=\"Content items\" />\n )}\n </Stack>\n\n {/* Delete confirmation (Nimbus) */}\n <Dialog.Root\n isOpen={pendingDelete !== null}\n onOpenChange={(open) => {\n if (!open) setPendingDelete(null);\n }}\n >\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Delete content item?</Dialog.Title>\n <Dialog.CloseTrigger />\n </Dialog.Header>\n <Dialog.Body>\n <Text>\n Are you sure you want to delete{' '}\n <Text as=\"span\" fontWeight=\"700\">\n {pendingDelete?.value.name}\n </Text>{' '}\n and all its versions? This cannot be undone.\n </Text>\n </Dialog.Body>\n <Dialog.Footer>\n <Button slot=\"close\" variant=\"outline\" isDisabled={deleting !== null}>\n Cancel\n </Button>\n <Button\n colorPalette=\"critical\"\n isDisabled={deleting !== null}\n onPress={() => {\n if (pendingDelete) void handleDelete(pendingDelete);\n }}\n >\n {deleting !== null ? 'Deleting…' : 'Delete'}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Public component — wraps its own PuckApiProvider\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerListProps {\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n defaultContentType?: string;\n onEdit: (item: PuckContentListItem) => void;\n}\n\nexport const ContentManagerList: React.FC<ContentManagerListProps> = ({\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n defaultContentType,\n onEdit,\n}) => (\n <EnsureNimbusProvider>\n <EnsureIntlProvider>\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <ContentList defaultContentType={defaultContentType} onEdit={onEdit} />\n </PuckApiProvider>\n </EnsureIntlProvider>\n </EnsureNimbusProvider>\n);\n","import React, { useContext, type PropsWithChildren } from 'react';\nimport { IntlContext, IntlProvider, ReactIntlErrorCode } from 'react-intl';\n\n/**\n * Ensures a react-intl context exists for the commercetools UIKit components\n * rendered by this package.\n *\n * UIKit components (DataTable, Text, buttons, …) call react-intl internally and\n * require an `<IntlProvider>` in the ancestry. If the host already provides one\n * (e.g. the Merchant Center ApplicationShell, or a storefront that set up\n * react-intl), it is reused as-is. Otherwise a minimal English provider is\n * mounted so the package also works standalone.\n *\n * Detection mirrors react-intl's own `useIntl`: `IntlContext` defaults to `null`\n * when no provider is present.\n */\nexport const EnsureIntlProvider: React.FC<PropsWithChildren> = ({ children }) => {\n const intl = useContext(IntlContext);\n\n if (intl) {\n return <>{children}</>;\n }\n\n return (\n <IntlProvider\n locale=\"en\"\n defaultLocale=\"en\"\n messages={{}}\n onError={(err) => {\n // UIKit ships `defaultMessage`s, so a missing-translation against an\n // empty catalog is expected and would otherwise flood the console.\n if (err.code === ReactIntlErrorCode.MISSING_TRANSLATION) return;\n // eslint-disable-next-line no-console\n console.error(err);\n }}\n >\n {children}\n </IntlProvider>\n );\n};\n","import React, { type PropsWithChildren } from 'react';\nimport { NimbusProvider } from '@commercetools/nimbus';\n\n/**\n * Ensures a Nimbus context (theme + Chakra + React Aria i18n) exists for the\n * Nimbus components rendered by this package.\n *\n * NimbusProvider is safe to nest: locale overrides the nearest ancestor, color\n * mode is global, and the Inter font links are deduplicated across instances.\n */\nexport const EnsureNimbusProvider: React.FC<PropsWithChildren<{ locale?: string }>> = ({\n locale = 'en',\n children,\n}) => <NimbusProvider locale={locale}>{children}</NimbusProvider>;\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Puck, type Config, type Data } from '@measured/puck';\nimport '@measured/puck/puck.css';\nimport {\n PuckApiProvider,\n usePuckContent,\n usePuckTemplates,\n} from '@commercetools-demo/puck-api';\nimport type { PuckContentVersionEntry, PuckData } from '@commercetools-demo/puck-types';\nimport { EnsureIntlProvider } from './EnsureIntlProvider';\nimport { EnsureNimbusProvider } from './EnsureNimbusProvider';\nimport {\n ComponentSearchProvider,\n ComponentsPanel,\n ComponentItemFilter,\n CreateTemplateDialog,\n EditorToolbar,\n nimbusFieldTypes,\n stripPuckDataToTemplate,\n useDirtyState,\n} from '@commercetools-demo/puck-editor';\nimport {\n VersionHistoryProvider,\n VersionPreviewBanner,\n VersionAwareFieldsPanel,\n VersionHistoryButton,\n useVersionHistoryPanel,\n useVersionDiff,\n} from '@commercetools-demo/puck-version-history';\nimport { LoadingSpinner, Stack, Text } from '@commercetools/nimbus';\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 versions,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n loadVersions,\n } = usePuckContent(contentKey);\n\n const { createTemplate } = usePuckTemplates('content');\n\n const latestDataRef = useRef<Data | null>(null);\n const [isApplyingVersion, setIsApplyingVersion] = useState(false);\n // Bumped on revert so the Puck canvas remounts and re-reads the restored data.\n const [reloadNonce, setReloadNonce] = useState(0);\n // \"Create template from this content\" dialog.\n const [templateDialogOpen, setTemplateDialogOpen] = useState(false);\n const [templateSaving, setTemplateSaving] = useState(false);\n\n // Current live data (draft preferred, fallback to content value)\n const currentData: PuckData =\n states.draft?.data ??\n content?.data ?? {\n content: [],\n root: { props: {} },\n };\n\n // Version history panel state\n const versionHistory = useVersionHistoryPanel({\n versions: versions as PuckContentVersionEntry[],\n loadVersions,\n currentData,\n });\n\n // Diff between selected historical version and current draft\n const diff = useVersionDiff(\n versionHistory.previewData,\n currentData\n );\n\n // Ref so handleChange can read the latest preview state without stale closure\n const isPreviewingRef = useRef(false);\n isPreviewingRef.current = versionHistory.isPreviewingHistory;\n\n // Unsaved-changes tracking — keyed so a new content item / version / revert\n // gets a fresh baseline (and ignores Puck's normalising onChange on mount).\n const canvasKey = `${contentKey}:${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`;\n const { isDirty: hasUnsavedChanges, markChange, markSaved } =\n useDirtyState(canvasKey);\n\n // -------------------------------------------------------------------------\n // Normal editor handlers\n // -------------------------------------------------------------------------\n\n const handleChange = useCallback(\n (data: Data) => {\n if (isPreviewingRef.current) return;\n latestDataRef.current = data;\n markChange(data);\n },\n [markChange]\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 markSaved(data);\n onSave?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [saveDraft, onSave, onError, markSaved]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n markSaved(data);\n await publish(false);\n onPublish?.(data as PuckData);\n } catch (err) {\n onError?.(err as Error);\n }\n },\n [saveDraft, publish, onPublish, onError, markSaved]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setReloadNonce((n) => n + 1);\n } catch (err) {\n onError?.(err as Error);\n }\n }, [revertToPublished, onError]);\n\n // -------------------------------------------------------------------------\n // Version history handlers\n // -------------------------------------------------------------------------\n\n const handleApplyVersion = useCallback(async () => {\n const versionData = versionHistory.previewData;\n if (!versionData) return;\n setIsApplyingVersion(true);\n try {\n await saveDraft(versionData);\n markSaved(versionData);\n onSave?.(versionData);\n versionHistory.clearSelection();\n } catch (err) {\n onError?.(err as Error);\n } finally {\n setIsApplyingVersion(false);\n }\n }, [versionHistory, saveDraft, onSave, onError, markSaved]);\n\n // -------------------------------------------------------------------------\n // Content-specific Puck config: inject title + slot root fields\n // -------------------------------------------------------------------------\n\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 const handleCreateTemplate = useCallback(\n async (name: string, withoutData: boolean) => {\n const source =\n (latestDataRef.current as PuckData | null) ?? currentData;\n const puckData = withoutData\n ? (stripPuckDataToTemplate(source as Data, contentConfig) as PuckData)\n : source;\n setTemplateSaving(true);\n try {\n await createTemplate({ name, kind: 'content', puckData });\n setTemplateDialogOpen(false);\n } catch (err) {\n onError?.(err as Error);\n } finally {\n setTemplateSaving(false);\n }\n },\n [createTemplate, currentData, contentConfig, onError]\n );\n\n if (loading) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100vh' }}>\n <Stack direction=\"column\" gap=\"400\" alignItems=\"center\">\n <LoadingSpinner />\n <Text color=\"neutral.11\">Loading editor…</Text>\n </Stack>\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text color=\"critical.11\"><strong>Error loading content:</strong> {error}</Text>\n </div>\n );\n }\n\n // Data shown in Puck canvas — historical preview takes precedence\n const activeData: PuckData = versionHistory.previewData ?? currentData;\n\n // Cast states for EditorToolbar (PuckContentStateInfo is compatible with PuckStateInfo)\n const toolbarStates = states as unknown as Parameters<typeof EditorToolbar>[0]['states'];\n\n return (\n <VersionHistoryProvider\n diff={diff}\n isPreviewingHistory={versionHistory.isPreviewingHistory}\n versions={versions as PuckContentVersionEntry[]}\n isLoadingVersions={versionHistory.isLoadingVersions}\n selectedVersionId={versionHistory.selectedVersionId}\n isApplying={isApplyingVersion}\n onVersionSelect={versionHistory.selectVersion}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n onLoadVersions={versionHistory.openPanel}\n >\n <ComponentSearchProvider>\n <Puck\n key={`${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`}\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n fieldTypes: nimbusFieldTypes,\n header: () =>\n versionHistory.isPreviewingHistory ? (\n <Stack\n gridArea=\"header\"\n direction=\"row\"\n gap=\"200\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n padding=\"200\"\n >\n <VersionPreviewBanner\n timestamp={versionHistory.selectedVersion!.timestamp}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n isApplying={isApplyingVersion}\n />\n <VersionHistoryButton disabled={isApplyingVersion} />\n </Stack>\n ) : (\n <EditorToolbar\n title={content?.name ?? 'Content'}\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={toolbarStates}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n onCreateTemplate={() => setTemplateDialogOpen(true)}\n createTemplateLabel=\"Create a template from this content\"\n showPublishButton\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n fields: ({ children, isLoading }) => (\n <VersionAwareFieldsPanel isLoading={isLoading}>\n {children}\n </VersionAwareFieldsPanel>\n ),\n }}\n />\n <CreateTemplateDialog\n isOpen={templateDialogOpen}\n onOpenChange={(open) => setTemplateDialogOpen(open)}\n onConfirm={handleCreateTemplate}\n saving={templateSaving}\n />\n </ComponentSearchProvider>\n </VersionHistoryProvider>\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 /** Content locale (e.g. \"en-US\") used for locale-aware calls like product search */\n locale?: 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 locale,\n contentKey,\n config,\n onPublish,\n onSave,\n onError,\n}) => (\n <EnsureNimbusProvider locale={locale}>\n <EnsureIntlProvider>\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n locale={locale}\n >\n <ContentEditorInner\n contentKey={contentKey}\n config={config}\n onPublish={onPublish}\n onSave={onSave}\n onError={onError}\n />\n </PuckApiProvider>\n </EnsureIntlProvider>\n </EnsureNimbusProvider>\n);\n","import React, { useState, useCallback, useMemo, useRef, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\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 CreateTemplateDialog,\n defaultPuckConfig,\n EditorToolbar,\n nimbusFieldTypes,\n PropertiesResizer,\n stripPuckDataToTemplate,\n UnsavedChangesDialog,\n useDirtyState,\n} from '@commercetools-demo/puck-editor';\nimport { PuckRenderer } from '@commercetools-demo/puck-renderer';\nimport {\n VersionHistoryProvider,\n VersionHistoryButton,\n VersionPreviewBanner,\n VersionAwareFieldsPanel,\n useVersionHistoryPanel,\n useVersionDiff,\n} from '@commercetools-demo/puck-version-history';\nimport { EnsureIntlProvider } from './EnsureIntlProvider';\nimport { EnsureNimbusProvider } from './EnsureNimbusProvider';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport {\n PuckApiProvider,\n usePuckContents,\n usePuckContent,\n usePuckTemplates,\n} from '@commercetools-demo/puck-api';\nimport type {\n CreatePuckContentInput,\n PuckContentListItem,\n PuckContentVersionEntry,\n PuckData,\n} from '@commercetools-demo/puck-types';\nimport {\n Badge,\n Button,\n Card,\n DataTable,\n Dialog,\n FormField,\n Icon,\n IconButton,\n LoadingSpinner,\n Select,\n Stack,\n Text,\n TextInput,\n type DataTableColumnItem,\n} from '@commercetools/nimbus';\nimport {\n Add,\n ChevronLeft,\n Close,\n Delete,\n Edit,\n Visibility,\n} from '@commercetools/nimbus-icons';\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, #e0e0e0)',\n zIndex: 200,\n flexShrink: 0,\n};\n\n// ---------------------------------------------------------------------------\n// Table row type\n// ---------------------------------------------------------------------------\n\ntype ContentRow = PuckContentListItem & { id: string; [key: string]: unknown };\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 history = useHistory();\n const { contents, loading, error, createContent, deleteContent } =\n usePuckContents(defaultContentType);\n const { templates } = usePuckTemplates('content');\n\n const [search, setSearch] = useState('');\n const [showCreate, setShowCreate] = useState(false);\n const [createName, setCreateName] = useState('');\n const [createType, setCreateType] = useState(defaultContentType ?? '');\n // Selected template for the new content item ('' = Empty).\n const [templateKey, setTemplateKey] = useState('');\n const [createError, setCreateError] = useState<string | null>(null);\n const [creating, setCreating] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n // Content item targeted by the (Nimbus) delete-confirmation dialog.\n const [pendingDelete, setPendingDelete] = useState<PuckContentListItem | null>(null);\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 template = templateKey\n ? templates.find((t) => t.key === templateKey)\n : undefined;\n const input: CreatePuckContentInput = {\n name: createName.trim(),\n contentType: createType.trim(),\n data: template?.value.puckData ?? { content: [], root: { props: {} } },\n };\n const created = await createContent(input);\n setShowCreate(false);\n setCreateName('');\n setCreateType(defaultContentType ?? '');\n setTemplateKey('');\n history.push(`/${created.key}`, { 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 (item: PuckContentListItem) => {\n setDeleting(item.key);\n try {\n await deleteContent(item.key);\n setPendingDelete(null);\n } finally {\n setDeleting(null);\n }\n };\n\n const term = search.trim().toLowerCase();\n const filteredContents = term\n ? contents.filter(\n (c) =>\n c.value.name.toLowerCase().includes(term) ||\n c.value.contentType.toLowerCase().includes(term)\n )\n : contents;\n\n const rows: ContentRow[] = filteredContents.map((c) => ({ ...c, id: c.key }));\n\n const columns: DataTableColumnItem<ContentRow>[] = [\n {\n id: 'name',\n header: 'Name',\n accessor: (row) => row.value.name,\n render: ({ row }) => <Text fontWeight=\"bold\">{row.value.name}</Text>,\n },\n {\n id: 'contentType',\n header: 'Content Type',\n accessor: (row) => row.value.contentType,\n render: ({ row }) => (\n <code\n style={{\n background: '#f4f4f4',\n padding: '2px 6px',\n borderRadius: '4px',\n fontSize: '11px',\n fontFamily: 'monospace',\n }}\n >\n {row.value.contentType}\n </code>\n ),\n },\n {\n id: 'status',\n header: 'Status',\n accessor: () => '',\n isSortable: false,\n render: ({ row }) => {\n const hasDraft = !!row.states.draft;\n const hasPublished = !!row.states.published;\n return (\n <Stack direction=\"row\" gap=\"100\" wrap=\"wrap\">\n {hasDraft && <Badge colorPalette=\"warning\" size=\"xs\">Draft</Badge>}\n {hasPublished && <Badge colorPalette=\"positive\" size=\"xs\">Published</Badge>}\n {!hasDraft && !hasPublished && <Badge colorPalette=\"neutral\" size=\"xs\">No state</Badge>}\n </Stack>\n );\n },\n },\n {\n id: 'updatedAt',\n header: 'Updated',\n accessor: (row) => row.value.updatedAt,\n render: ({ row }) => (\n <Text color=\"neutral.11\">\n {new Date(row.value.updatedAt).toLocaleDateString()}\n </Text>\n ),\n },\n {\n id: 'actions',\n header: 'Actions',\n accessor: () => '',\n isSortable: false,\n render: ({ row }) => (\n <Stack direction=\"row\" gap=\"100\" alignItems=\"center\">\n <IconButton\n aria-label={`Edit ${row.value.name}`}\n variant=\"ghost\"\n size=\"xs\"\n onPress={() => history.push(`/${row.key}`, { contentName: row.value.name })}\n >\n <Edit />\n </IconButton>\n <IconButton\n aria-label={`Preview ${row.value.name}`}\n variant=\"ghost\"\n size=\"xs\"\n onPress={() =>\n history.push(`/${row.key}/preview`, { contentName: row.value.name })\n }\n >\n <Visibility />\n </IconButton>\n <IconButton\n aria-label={`Delete ${row.value.name}`}\n variant=\"ghost\"\n colorPalette=\"critical\"\n size=\"xs\"\n isDisabled={deleting === row.key}\n onPress={() => setPendingDelete(row)}\n >\n <Delete />\n </IconButton>\n </Stack>\n ),\n },\n ];\n\n return (\n <div style={{ maxWidth: '1200px', margin: '0 auto', padding: '32px 24px' }}>\n <Stack direction=\"column\" gap=\"600\">\n <Stack direction=\"row\" justifyContent=\"space-between\" alignItems=\"center\">\n <Stack direction=\"row\" gap=\"400\" alignItems=\"center\">\n {backButton}\n <Text as=\"h1\" fontSize=\"2xl\" fontWeight=\"700\">Content Items</Text>\n </Stack>\n <Button variant=\"solid\" onPress={() => setShowCreate((v) => !v)}>\n <Icon as={Add} /> New Content\n </Button>\n </Stack>\n\n {showCreate && (\n <Card.Root variant=\"outlined\">\n <Card.Body>\n <Stack direction=\"column\" gap=\"400\">\n <Text as=\"h4\" fontSize=\"xl\" fontWeight=\"700\">Create Content Item</Text>\n {createError && <Text color=\"critical.11\">{createError}</Text>}\n <Stack direction=\"row\" gap=\"400\">\n <div style={{ flex: 1 }}>\n <FormField.Root>\n <FormField.Label>Name</FormField.Label>\n <FormField.Input>\n <TextInput\n value={createName}\n onChange={(v) => setCreateName(v)}\n placeholder=\"e.g. Homepage Hero\"\n />\n </FormField.Input>\n </FormField.Root>\n </div>\n <div style={{ flex: 1 }}>\n <FormField.Root>\n <FormField.Label>Content Type</FormField.Label>\n <FormField.Input>\n <TextInput\n value={createType}\n onChange={(v) => setCreateType(v)}\n placeholder=\"e.g. hero, banner\"\n />\n </FormField.Input>\n </FormField.Root>\n </div>\n </Stack>\n <FormField.Root>\n <FormField.Label>Template</FormField.Label>\n <FormField.Input>\n <Select.Root\n aria-label=\"Template\"\n selectedKey={templateKey || 'empty'}\n onSelectionChange={(key) =>\n setTemplateKey(key == null || key === 'empty' ? '' : String(key))\n }\n >\n <Select.Options>\n <Select.Option id=\"empty\">Empty</Select.Option>\n {templates.map((t) => (\n <Select.Option key={t.key} id={t.key}>\n {t.value.name}\n </Select.Option>\n ))}\n </Select.Options>\n </Select.Root>\n </FormField.Input>\n </FormField.Root>\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"solid\" onPress={() => void handleCreate()} isDisabled={creating}>\n {creating ? 'Creating…' : 'Create'}\n </Button>\n <Button variant=\"outline\" onPress={() => setShowCreate(false)}>Cancel</Button>\n </Stack>\n </Stack>\n </Card.Body>\n </Card.Root>\n )}\n\n <div style={{ maxWidth: 360 }}>\n <TextInput\n aria-label=\"Search content\"\n placeholder=\"Search by name or content type…\"\n value={search}\n onChange={(v) => setSearch(v)}\n width=\"100%\"\n trailingElement={\n search !== '' ? (\n <IconButton\n aria-label=\"Clear search\"\n variant=\"ghost\"\n colorPalette=\"neutral\"\n size=\"2xs\"\n onPress={() => setSearch('')}\n >\n <Close />\n </IconButton>\n ) : undefined\n }\n />\n </div>\n\n {error && <Text color=\"critical.11\">{error}</Text>}\n\n {loading ? (\n <div style={{ display: 'flex', justifyContent: 'center', padding: '48px' }}>\n <LoadingSpinner />\n </div>\n ) : contents.length === 0 ? (\n <Stack direction=\"column\" gap=\"400\" alignItems=\"center\">\n <Text color=\"neutral.11\">No content items found.</Text>\n </Stack>\n ) : (\n <DataTable columns={columns} rows={rows} aria-label=\"Content items\" />\n )}\n </Stack>\n\n {/* Delete confirmation (Nimbus) */}\n <Dialog.Root\n isOpen={pendingDelete !== null}\n onOpenChange={(open) => {\n if (!open) setPendingDelete(null);\n }}\n >\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Delete content item?</Dialog.Title>\n <Dialog.CloseTrigger />\n </Dialog.Header>\n <Dialog.Body>\n <Text>\n Are you sure you want to delete{' '}\n <Text as=\"span\" fontWeight=\"700\">\n {pendingDelete?.value.name}\n </Text>{' '}\n and all its versions? This cannot be undone.\n </Text>\n </Dialog.Body>\n <Dialog.Footer>\n <Button slot=\"close\" variant=\"outline\" isDisabled={deleting !== null}>\n Cancel\n </Button>\n <Button\n colorPalette=\"critical\"\n isDisabled={deleting !== null}\n onPress={() => {\n if (pendingDelete) void handleDelete(pendingDelete);\n }}\n >\n {deleting !== null ? 'Deleting…' : 'Delete'}\n </Button>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Root>\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 history = useHistory();\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 versions,\n saving,\n loading,\n error,\n saveDraft,\n publish,\n revertToPublished,\n loadVersions,\n } = usePuckContent(contentKey!);\n\n const { createTemplate } = usePuckTemplates('content');\n\n const latestDataRef = useRef<Data | null>(null);\n const [isApplyingVersion, setIsApplyingVersion] = useState(false);\n // Bumped on revert so the Puck canvas remounts and re-reads the restored data.\n const [reloadNonce, setReloadNonce] = useState(0);\n // Deferred navigation while the unsaved-changes dialog is open.\n const [pendingNav, setPendingNav] = useState<(() => void) | null>(null);\n // \"Create template from this content\" dialog.\n const [templateDialogOpen, setTemplateDialogOpen] = useState(false);\n const [templateSaving, setTemplateSaving] = useState(false);\n\n const currentData: PuckData =\n states.draft?.data ??\n content?.data ?? { content: [], root: { props: {} } };\n\n const versionHistory = useVersionHistoryPanel({\n versions: versions as PuckContentVersionEntry[],\n loadVersions,\n currentData,\n });\n\n const diff = useVersionDiff(versionHistory.previewData, currentData);\n\n const isPreviewingRef = useRef(false);\n isPreviewingRef.current = versionHistory.isPreviewingHistory;\n\n // Unsaved-changes tracking — keyed so a new content item / version / revert\n // gets a fresh baseline (and ignores Puck's normalising onChange on mount).\n const canvasKey = `${contentKey}:${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`;\n const { isDirty: hasUnsavedChanges, markChange, markSaved } =\n useDirtyState(canvasKey);\n\n const guardedNavigate = useCallback(\n (navFn: () => void) => {\n if (hasUnsavedChanges) {\n setPendingNav(() => navFn);\n } else {\n navFn();\n }\n },\n [hasUnsavedChanges]\n );\n\n const handleChange = useCallback(\n (data: Data) => {\n if (isPreviewingRef.current) return;\n latestDataRef.current = data;\n markChange(data);\n },\n [markChange]\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 markSaved(data);\n } catch (err) {\n console.error('[ContentManagerRouter] save error:', err);\n }\n }, [saveDraft, markSaved]);\n\n const handlePublish = useCallback(\n async (data: Data) => {\n try {\n await saveDraft(data as PuckData);\n markSaved(data);\n await publish(false);\n } catch (err) {\n console.error('[ContentManagerRouter] publish error:', err);\n }\n },\n [saveDraft, publish, markSaved]\n );\n\n const handleRevert = useCallback(async () => {\n try {\n await revertToPublished();\n setReloadNonce((n) => n + 1);\n } catch (err) {\n console.error('[ContentManagerRouter] revert error:', err);\n }\n }, [revertToPublished]);\n\n const handleApplyVersion = useCallback(async () => {\n const versionData = versionHistory.previewData;\n if (!versionData) return;\n setIsApplyingVersion(true);\n try {\n await saveDraft(versionData);\n markSaved(versionData);\n versionHistory.clearSelection();\n } catch (err) {\n console.error('[ContentManagerRouter] apply version error:', err);\n } finally {\n setIsApplyingVersion(false);\n }\n }, [versionHistory, saveDraft, markSaved]);\n\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 const handleCreateTemplate = useCallback(\n async (name: string, withoutData: boolean) => {\n const source =\n (latestDataRef.current as PuckData | null) ?? currentData;\n const puckData = withoutData\n ? (stripPuckDataToTemplate(source as Data, contentConfig) as PuckData)\n : source;\n setTemplateSaving(true);\n try {\n await createTemplate({ name, kind: 'content', puckData });\n setTemplateDialogOpen(false);\n } catch (err) {\n console.error('[ContentManagerRouter] create template error:', err);\n } finally {\n setTemplateSaving(false);\n }\n },\n [createTemplate, currentData, contentConfig]\n );\n\n if (loading) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100vh' }}>\n <Stack direction=\"column\" gap=\"400\" alignItems=\"center\">\n <LoadingSpinner />\n <Text color=\"neutral.11\">Loading editor…</Text>\n </Stack>\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text color=\"critical.11\"><strong>Error loading content:</strong> {error}</Text>\n </div>\n );\n }\n\n const activeData: PuckData = versionHistory.previewData ?? currentData;\n const toolbarStates = states as unknown as Parameters<typeof EditorToolbar>[0]['states'];\n\n return (\n <VersionHistoryProvider\n diff={diff}\n isPreviewingHistory={versionHistory.isPreviewingHistory}\n versions={versions as PuckContentVersionEntry[]}\n isLoadingVersions={versionHistory.isLoadingVersions}\n selectedVersionId={versionHistory.selectedVersionId}\n isApplying={isApplyingVersion}\n onVersionSelect={versionHistory.selectVersion}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n onLoadVersions={versionHistory.openPanel}\n >\n <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text color=\"neutral.11\">/</Text>}\n <Button\n variant=\"ghost\"\n onPress={() => guardedNavigate(() => history.push('/'))}\n >\n <Icon as={ChevronLeft} /> Content Items\n </Button>\n <Text color=\"neutral.11\">/</Text>\n <Text fontWeight=\"bold\">{contentName}</Text>\n </div>\n <div className=\"puck-editor-fill\" style={{ flex: 1, overflow: 'hidden' }}>\n <ComponentSearchProvider>\n <Puck\n key={`${versionHistory.selectedVersionId ?? 'current'}:${reloadNonce}`}\n config={contentConfig}\n data={activeData as Data}\n onChange={handleChange}\n onPublish={handlePublish}\n overrides={{\n fieldTypes: nimbusFieldTypes,\n header: () =>\n versionHistory.isPreviewingHistory ? (\n <Stack\n gridArea=\"header\"\n direction=\"row\"\n gap=\"200\"\n alignItems=\"center\"\n justifyContent=\"flex-end\"\n padding=\"200\"\n >\n <VersionPreviewBanner\n timestamp={versionHistory.selectedVersion!.timestamp}\n onApply={() => void handleApplyVersion()}\n onDiscard={versionHistory.clearSelection}\n isApplying={isApplyingVersion}\n />\n <VersionHistoryButton disabled={isApplyingVersion} />\n </Stack>\n ) : (\n <EditorToolbar\n title={content?.name ?? contentName}\n saving={saving}\n isDirty={hasUnsavedChanges}\n states={toolbarStates}\n onSave={() => void handleSave()}\n onPublish={() => void handlePublish(activeData as Data)}\n onRevert={() => void handleRevert()}\n onPreview={() =>\n guardedNavigate(() =>\n history.push(`/${contentKey}/preview`, { contentName })\n )\n }\n onCreateTemplate={() => setTemplateDialogOpen(true)}\n createTemplateLabel=\"Create a template from this content\"\n showPublishButton\n />\n ),\n components: ({ children }) => <ComponentsPanel>{children}</ComponentsPanel>,\n componentItem: ({ children, name }) => (\n <ComponentItemFilter name={name}>{children}</ComponentItemFilter>\n ),\n fields: ({ children, isLoading }) => (\n <VersionAwareFieldsPanel isLoading={isLoading}>\n {children}\n </VersionAwareFieldsPanel>\n ),\n }}\n />\n </ComponentSearchProvider>\n <PropertiesResizer />\n </div>\n </div>\n <UnsavedChangesDialog\n isOpen={pendingNav !== null}\n onOpenChange={(open) => {\n if (!open) setPendingNav(null);\n }}\n onConfirm={() => pendingNav?.()}\n />\n <CreateTemplateDialog\n isOpen={templateDialogOpen}\n onOpenChange={(open) => setTemplateDialogOpen(open)}\n onConfirm={handleCreateTemplate}\n saving={templateSaving}\n />\n </VersionHistoryProvider>\n );\n};\n\n// ---------------------------------------------------------------------------\n// ContentPreviewRoute\n// ---------------------------------------------------------------------------\n\nconst ContentPreviewRoute: React.FC<ContentEditorRouteProps> = ({ config, backButton }) => {\n const { contentKey } = useParams<{ contentKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const contentName =\n (location.state as { contentName?: string } | null)?.contentName ?? contentKey ?? 'Content';\n\n return (\n <div>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text color=\"neutral.11\">/</Text>}\n <Button variant=\"ghost\" onPress={() => history.push('/')}>\n <Icon as={ChevronLeft} /> Content Items\n </Button>\n <Text color=\"neutral.11\">/</Text>\n <Button\n variant=\"ghost\"\n onPress={() => history.push(`/${contentKey}`, { contentName })}\n >\n {contentName}\n </Button>\n <Badge colorPalette=\"primary\" size=\"xs\">Preview</Badge>\n <div style={{ marginLeft: 'auto' }}>\n <Button variant=\"outline\" size=\"xs\" onPress={() => history.goBack()}>\n <Icon as={Close} /> Close preview\n </Button>\n </div>\n </div>\n <PuckRenderer type=\"content\" contentKey={contentKey} mode=\"preview\" config={config} />\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 <Switch>\n <Route\n exact\n path=\"/\"\n render={() => (\n <ContentListRoute defaultContentType={defaultContentType} backButton={backButton} />\n )}\n />\n {/* Preview must precede the catch-all editor route (\"/:contentKey\" also\n matches \"/:contentKey/preview\" because it is not exact). */}\n <Route\n path=\"/:contentKey/preview\"\n render={() => <ContentPreviewRoute config={config} backButton={backButton} />}\n />\n <Route\n path=\"/:contentKey\"\n render={() => <ContentEditorRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface ContentManagerProps {\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 /** Content locale (e.g. \"en-US\") used for locale-aware calls like product search */\n locale?: string;\n /** Puck component config — must match what's used in the renderer. Defaults to defaultPuckConfig. */\n config?: Config;\n defaultContentType?: string;\n /** Optional element rendered before the breadcrumb in the editor header */\n backButton?: ReactNode;\n}\n\nexport const ContentManager: React.FC<ContentManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n locale,\n config = DEFAULT_CONFIG,\n defaultContentType,\n backButton,\n}) => (\n <EnsureNimbusProvider locale={locale}>\n <EnsureIntlProvider>\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n locale={locale}\n >\n <BrowserRouter basename={parentUrl}>\n <ContentManagerRouterInner\n config={config}\n defaultContentType={defaultContentType}\n backButton={backButton}\n />\n </BrowserRouter>\n </PuckApiProvider>\n </EnsureIntlProvider>\n </EnsureNimbusProvider>\n);\n"],"mappings":"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","names":["jsx","jsx","useState","PuckApiProvider","usePuckTemplates","LoadingSpinner","Stack","Text","jsx","jsxs","usePuckTemplates","useState","PuckApiProvider","useState","useCallback","useMemo","useRef","Puck","ComponentSearchProvider","ComponentsPanel","ComponentItemFilter","CreateTemplateDialog","EditorToolbar","nimbusFieldTypes","stripPuckDataToTemplate","useDirtyState","VersionHistoryProvider","VersionHistoryButton","VersionPreviewBanner","VersionAwareFieldsPanel","useVersionHistoryPanel","useVersionDiff","PuckApiProvider","usePuckContents","usePuckContent","usePuckTemplates","Badge","Button","Card","DataTable","Dialog","FormField","Icon","IconButton","LoadingSpinner","Select","Stack","Text","TextInput","Add","Close","Delete","Edit","jsx","jsxs","useState","useRef","useVersionHistoryPanel","useVersionDiff","useDirtyState","useCallback","useMemo","stripPuckDataToTemplate","VersionHistoryProvider","ComponentSearchProvider","Puck","nimbusFieldTypes","VersionPreviewBanner","VersionHistoryButton","EditorToolbar","ComponentsPanel","ComponentItemFilter","VersionAwareFieldsPanel","CreateTemplateDialog"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commercetools-demo/puck-content-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "UI components for managing standalone Puck content items",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -25,27 +25,16 @@
|
|
|
25
25
|
"typecheck": "tsc --noEmit"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@commercetools-demo/puck-api": "^0.
|
|
29
|
-
"@commercetools-demo/puck-editor": "^0.
|
|
30
|
-
"@commercetools-demo/puck-
|
|
31
|
-
"@commercetools-demo/puck-
|
|
32
|
-
"@commercetools-
|
|
33
|
-
"@commercetools-uikit/data-table": "^20.5.0",
|
|
34
|
-
"@commercetools-uikit/design-system": "^20.5.0",
|
|
35
|
-
"@commercetools-uikit/flat-button": "^20.5.0",
|
|
36
|
-
"@commercetools-uikit/icons": "^20.5.0",
|
|
37
|
-
"@commercetools-uikit/label": "^20.5.0",
|
|
38
|
-
"@commercetools-uikit/loading-spinner": "^20.5.0",
|
|
39
|
-
"@commercetools-uikit/primary-button": "^20.5.0",
|
|
40
|
-
"@commercetools-uikit/secondary-button": "^20.5.0",
|
|
41
|
-
"@commercetools-uikit/spacings": "^20.5.0",
|
|
42
|
-
"@commercetools-uikit/stamp": "^20.5.0",
|
|
43
|
-
"@commercetools-uikit/tag": "^20.5.0",
|
|
44
|
-
"@commercetools-uikit/text": "^20.5.0",
|
|
45
|
-
"@commercetools-uikit/text-input": "^20.5.0",
|
|
28
|
+
"@commercetools-demo/puck-api": "^0.6.0",
|
|
29
|
+
"@commercetools-demo/puck-editor": "^0.6.0",
|
|
30
|
+
"@commercetools-demo/puck-renderer": "^0.6.0",
|
|
31
|
+
"@commercetools-demo/puck-types": "^0.6.0",
|
|
32
|
+
"@commercetools-demo/puck-version-history": "^0.6.0",
|
|
46
33
|
"@measured/puck": "^0.18.2"
|
|
47
34
|
},
|
|
48
35
|
"peerDependencies": {
|
|
36
|
+
"@commercetools/nimbus": "^3.2.0",
|
|
37
|
+
"@commercetools/nimbus-icons": "^3.2.0",
|
|
49
38
|
"react": ">=19.0.0",
|
|
50
39
|
"react-dom": ">=19.0.0",
|
|
51
40
|
"react-intl": ">=6.0.0",
|