@commercetools-demo/puck-page-manager 0.5.2 → 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 +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +331 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +355 -236
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -16
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/PageManager.tsx","../src/EnsureIntlProvider.tsx"],"sourcesContent":["import React, { useState, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport {\n PuckApiProvider,\n usePuckPages,\n usePuckApiContext,\n} from '@commercetools-demo/puck-api';\nimport { PuckEditor, defaultPuckConfig } from '@commercetools-demo/puck-editor';\nimport { PuckRenderer } from '@commercetools-demo/puck-renderer';\nimport { EnsureIntlProvider } from './EnsureIntlProvider';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport type { Config } from '@measured/puck';\nimport type { CreatePuckPageInput, PuckPageListItem } 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, 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// Shared 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 PageRow = PuckPageListItem & { id: string };\n\nconst COLUMNS = [\n { key: 'name', label: 'Name' },\n { key: 'slug', label: 'Slug' },\n { key: 'status', label: 'Status' },\n { key: 'updatedAt', label: 'Updated' },\n { key: 'actions', label: 'Actions', shouldIgnoreRowClick: true },\n];\n\n// ---------------------------------------------------------------------------\n// PageList route\n// ---------------------------------------------------------------------------\n\ninterface PageListProps {\n backButton?: ReactNode;\n}\n\nconst PageList: React.FC<PageListProps> = ({ backButton }) => {\n const history = useHistory();\n const { pages, loading, error, createPage, deletePage, refresh } = usePuckPages();\n\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newSlug, setNewSlug] = useState('');\n const [formError, setFormError] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n\n const handleCreate = async () => {\n if (!newName.trim()) { setFormError('Name is required'); return; }\n if (!newSlug.trim()) { setFormError('Slug is required'); return; }\n setFormError('');\n setSubmitting(true);\n try {\n const input: CreatePuckPageInput = {\n name: newName.trim(),\n slug: newSlug.trim().startsWith('/') ? newSlug.trim() : `/${newSlug.trim()}`,\n };\n const created = await createPage(input);\n setCreating(false);\n setNewName('');\n setNewSlug('');\n history.push(`/${created.key}/edit`, { pageName: created.value.name });\n } catch (err) {\n setFormError((err as Error).message);\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleDelete = async (page: PuckPageListItem) => {\n if (!confirm(`Delete \"${page.value.name}\"? This cannot be undone.`)) return;\n setDeleting(page.key);\n try {\n await deletePage(page.key);\n await refresh();\n } finally {\n setDeleting(null);\n }\n };\n\n if (loading) {\n return (\n <div style={{ padding: '64px', display: 'flex', justifyContent: 'center' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text.Body tone=\"negative\">Error: {error}</Text.Body>\n </div>\n );\n }\n\n const rows: PageRow[] = pages.map((p: PuckPageListItem) => ({ ...p, id: p.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\">Puck Pages</Text.Headline>\n </Spacings.Inline>\n <PrimaryButton\n label=\"New Page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Inline>\n\n {creating && (\n <Card insetScale=\"l\">\n <Spacings.Stack scale=\"m\">\n <Text.Subheadline as=\"h4\" isBold>Create New Page</Text.Subheadline>\n <Spacings.Inline scale=\"m\">\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-name\">Name *</Label>\n <TextInput\n id=\"new-page-name\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder=\"Home Page\"\n />\n </Spacings.Stack>\n </div>\n <div style={{ flex: 1 }}>\n <Spacings.Stack scale=\"xs\">\n <Label htmlFor=\"new-page-slug\">Slug *</Label>\n <TextInput\n id=\"new-page-slug\"\n value={newSlug}\n onChange={(e) => setNewSlug(e.target.value)}\n placeholder=\"/home\"\n />\n </Spacings.Stack>\n </div>\n </Spacings.Inline>\n {formError && <Text.Body tone=\"negative\">{formError}</Text.Body>}\n <Spacings.Inline scale=\"s\">\n <PrimaryButton\n label={submitting ? 'Creating…' : 'Create'}\n onClick={() => void handleCreate()}\n isDisabled={submitting}\n />\n <SecondaryButton\n label=\"Cancel\"\n onClick={() => { setCreating(false); setFormError(''); }}\n />\n </Spacings.Inline>\n </Spacings.Stack>\n </Card>\n )}\n\n {pages.length === 0 && !creating ? (\n <Spacings.Stack scale=\"m\" alignItems=\"center\">\n <Text.Body tone=\"secondary\">No pages yet.</Text.Body>\n <PrimaryButton\n label=\"Create first page\"\n iconLeft={<PlusThinIcon />}\n onClick={() => setCreating(true)}\n />\n </Spacings.Stack>\n ) : pages.length > 0 ? (\n <DataTable\n columns={COLUMNS}\n rows={rows}\n itemRenderer={(row: PageRow, column) => {\n switch (column.key) {\n case 'name':\n return (\n <Spacings.Stack scale=\"xs\">\n <Text.Body isBold>{row.value.name}</Text.Body>\n <Text.Detail tone=\"secondary\">{row.key}</Text.Detail>\n </Spacings.Stack>\n );\n case 'slug':\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.slug}\n </code>\n );\n case 'status':\n return (\n <span>\n {row.states.draft && <StatusBadge variant=\"draft\" />}\n {row.states.published && <StatusBadge variant=\"published\" />}\n {!row.states.draft && !row.states.published && <StatusBadge variant=\"none\" />}\n </span>\n );\n case 'updatedAt':\n return (\n <Text.Body tone=\"secondary\">\n {new Date(row.value.updatedAt).toLocaleString()}\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 history.push(`/${row.key}/edit`, { pageName: row.value.name })\n }\n />\n <SecondaryButton\n label=\"Preview\"\n size=\"20\"\n onClick={() =>\n history.push(`/${row.key}/preview`, { pageName: 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)}\n />\n </div>\n );\n default:\n return null;\n }\n }}\n />\n ) : null}\n </Spacings.Stack>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PageEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface RouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageEditorRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const { baseURL, projectKey, businessUnitKey, jwtToken } = usePuckApiContext();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\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=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n </div>\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <PuckEditor\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken ?? ''}\n pageKey={pageKey!}\n config={config}\n onError={(err: Error) => { console.error('[PageManager] editor error:', err); }}\n />\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PagePreviewRoute\n// ---------------------------------------------------------------------------\n\nconst PagePreviewRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n return (\n <div>\n <div style={NAV_BAR_STYLE}>\n {backButton}\n {backButton && <Text.Body tone=\"secondary\">/</Text.Body>}\n <FlatButton\n label=\"Pages\"\n icon={<AngleLeftIcon />}\n iconPosition=\"left\"\n onClick={() => history.push('/')}\n />\n <Text.Body tone=\"secondary\">/</Text.Body>\n <Text.Body isBold>{pageName}</Text.Body>\n <span\n style={{\n background: 'var(--color-primary-95)',\n color: 'var(--color-primary-25)',\n border: '1px solid var(--color-primary-85)',\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: 'var(--border-radius-20)',\n fontSize: 'var(--font-size-10)',\n fontWeight: 'var(--font-weight-600)',\n }}\n >\n Preview\n </span>\n </div>\n <PuckRenderer pageKey={pageKey} mode=\"preview\" config={config} />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface PageManagerInnerProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageManagerInner: React.FC<PageManagerInnerProps> = ({ config, backButton }) => (\n <Switch>\n <Route exact path=\"/\" render={() => <PageList backButton={backButton} />} />\n <Route\n path=\"/:pageKey/edit\"\n render={() => <PageEditorRoute config={config} backButton={backButton} />}\n />\n <Route\n path=\"/:pageKey/preview\"\n render={() => <PagePreviewRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface PageManagerProps {\n /** URL path where this manager is mounted, e.g. \"/pages\" — used as router basename */\n parentUrl: string;\n baseURL: string;\n projectKey: string;\n businessUnitKey: string;\n jwtToken: string;\n /** Puck component config — passed to editor and preview. Defaults to defaultPuckConfig. */\n config?: Config;\n /** Optional element rendered before the breadcrumb in editor/preview headers */\n backButton?: ReactNode;\n}\n\nexport const PageManager: React.FC<PageManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n config = DEFAULT_CONFIG,\n backButton,\n}) => (\n <EnsureIntlProvider>\n <PuckApiProvider\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken}\n >\n <BrowserRouter basename={parentUrl}>\n <PageManagerInner config={config} backButton={backButton} />\n </BrowserRouter>\n </PuckApiProvider>\n </EnsureIntlProvider>\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"],"mappings":"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","names":["jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/PageManager.tsx","../src/EnsureIntlProvider.tsx","../src/EnsureNimbusProvider.tsx"],"sourcesContent":["import React, { useCallback, useState, type ReactNode } from 'react';\nimport {\n BrowserRouter,\n Switch,\n Route,\n useHistory,\n useParams,\n useLocation,\n} from 'react-router-dom';\nimport {\n PuckApiProvider,\n usePuckPages,\n usePuckTemplates,\n usePuckApiContext,\n} from '@commercetools-demo/puck-api';\nimport {\n PropertiesResizer,\n PuckEditor,\n UnsavedChangesDialog,\n defaultPuckConfig,\n} from '@commercetools-demo/puck-editor';\nimport { PuckRenderer } from '@commercetools-demo/puck-renderer';\nimport { EnsureIntlProvider } from './EnsureIntlProvider';\nimport { EnsureNimbusProvider } from './EnsureNimbusProvider';\n\nconst DEFAULT_CONFIG: Config = {\n ...defaultPuckConfig,\n components: { ...defaultPuckConfig.components },\n};\nimport type { Config } from '@measured/puck';\nimport type { CreatePuckPageInput, PuckPageListItem } 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// Status badge\n// ---------------------------------------------------------------------------\n\nconst STATUS_BADGE: Record<\n 'draft' | 'published' | 'none',\n { colorPalette: 'warning' | 'positive' | 'neutral'; label: string }\n> = {\n draft: { colorPalette: 'warning', label: 'Draft' },\n published: { colorPalette: 'positive', label: 'Published' },\n none: { colorPalette: 'neutral', label: 'No state' },\n};\n\nconst StatusBadge: React.FC<{ variant: 'draft' | 'published' | 'none' }> = ({ variant }) => {\n const meta = STATUS_BADGE[variant];\n return <Badge colorPalette={meta.colorPalette} size=\"xs\">{meta.label}</Badge>;\n};\n\n// ---------------------------------------------------------------------------\n// Shared 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 PageRow = PuckPageListItem & { id: string; [key: string]: unknown };\n\n// ---------------------------------------------------------------------------\n// PageList route\n// ---------------------------------------------------------------------------\n\ninterface PageListProps {\n backButton?: ReactNode;\n}\n\nconst PageList: React.FC<PageListProps> = ({ backButton }) => {\n const history = useHistory();\n const { pages, loading, error, createPage, deletePage, refresh } = usePuckPages();\n const { templates } = usePuckTemplates('page');\n\n const [creating, setCreating] = useState(false);\n const [newName, setNewName] = useState('');\n const [newSlug, setNewSlug] = useState('');\n // Selected template for the new page ('' = Empty, today's behaviour).\n const [templateKey, setTemplateKey] = useState('');\n const [formError, setFormError] = useState('');\n const [submitting, setSubmitting] = useState(false);\n const [deleting, setDeleting] = useState<string | null>(null);\n // Page targeted by the (Nimbus) delete-confirmation dialog.\n const [pendingDelete, setPendingDelete] = useState<PuckPageListItem | null>(null);\n // Free-text filter over page name / slug.\n const [search, setSearch] = useState('');\n\n const handleCreate = async () => {\n if (!newName.trim()) { setFormError('Name is required'); return; }\n if (!newSlug.trim()) { setFormError('Slug is required'); return; }\n setFormError('');\n setSubmitting(true);\n try {\n const input: CreatePuckPageInput = {\n name: newName.trim(),\n slug: newSlug.trim().startsWith('/') ? newSlug.trim() : `/${newSlug.trim()}`,\n };\n // Seed from the selected template (Empty leaves puckData unset).\n if (templateKey) {\n const template = templates.find((t) => t.key === templateKey);\n if (template) input.puckData = template.value.puckData;\n }\n const created = await createPage(input);\n setCreating(false);\n setNewName('');\n setNewSlug('');\n setTemplateKey('');\n history.push(`/${created.key}/edit`, { pageName: created.value.name });\n } catch (err) {\n setFormError((err as Error).message);\n } finally {\n setSubmitting(false);\n }\n };\n\n const handleDelete = async (page: PuckPageListItem) => {\n setDeleting(page.key);\n try {\n await deletePage(page.key);\n await refresh();\n setPendingDelete(null);\n } finally {\n setDeleting(null);\n }\n };\n\n if (loading) {\n return (\n <div style={{ padding: '64px', display: 'flex', justifyContent: 'center' }}>\n <LoadingSpinner />\n </div>\n );\n }\n\n if (error) {\n return (\n <div style={{ padding: '32px' }}>\n <Text color=\"critical.11\">Error: {error}</Text>\n </div>\n );\n }\n\n const term = search.trim().toLowerCase();\n const filteredPages = term\n ? pages.filter(\n (p: PuckPageListItem) =>\n p.value.name.toLowerCase().includes(term) ||\n p.value.slug.toLowerCase().includes(term)\n )\n : pages;\n\n const rows: PageRow[] = filteredPages.map((p: PuckPageListItem) => ({ ...p, id: p.key }));\n\n const columns: DataTableColumnItem<PageRow>[] = [\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: 'slug',\n header: 'Slug',\n accessor: (row) => row.value.slug,\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.slug}\n </code>\n ),\n },\n {\n id: 'status',\n header: 'Status',\n accessor: () => '',\n isSortable: false,\n render: ({ row }) => (\n <Stack direction=\"row\" gap=\"100\" wrap=\"wrap\">\n {row.states.draft && <StatusBadge variant=\"draft\" />}\n {row.states.published && <StatusBadge variant=\"published\" />}\n {!row.states.draft && !row.states.published && <StatusBadge variant=\"none\" />}\n </Stack>\n ),\n },\n {\n id: 'updatedAt',\n header: 'Updated',\n accessor: (row) => row.value.updatedAt,\n render: ({ row }) => (\n <Text fontSize=\"xs\" color=\"neutral.11\">\n {new Date(row.value.updatedAt).toLocaleString()}\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}/edit`, { pageName: 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={() => history.push(`/${row.key}/preview`, { pageName: row.value.name })}\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\">Pages</Text>\n </Stack>\n <Button variant=\"solid\" onPress={() => setCreating(true)}>\n <Icon as={Add} /> New Page\n </Button>\n </Stack>\n\n {creating && (\n <Card.Root variant=\"outlined\">\n <Card.Body>\n <Stack direction=\"column\" gap=\"400\">\n <Text as=\"h4\" fontSize=\"xl\" fontWeight=\"700\">Create New Page</Text>\n <Stack direction=\"row\" gap=\"400\">\n <div style={{ flex: 1 }}>\n <FormField.Root isRequired>\n <FormField.Label>Name</FormField.Label>\n <FormField.Input>\n <TextInput\n value={newName}\n onChange={(v) => setNewName(v)}\n placeholder=\"Home Page\"\n />\n </FormField.Input>\n </FormField.Root>\n </div>\n <div style={{ flex: 1 }}>\n <FormField.Root isRequired>\n <FormField.Label>Slug</FormField.Label>\n <FormField.Input>\n <TextInput\n value={newSlug}\n onChange={(v) => setNewSlug(v)}\n placeholder=\"/home\"\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 {formError && <Text color=\"critical.11\">{formError}</Text>}\n <Stack direction=\"row\" gap=\"200\">\n <Button variant=\"solid\" onPress={() => void handleCreate()} isDisabled={submitting}>\n {submitting ? 'Creating…' : 'Create'}\n </Button>\n <Button\n variant=\"outline\"\n onPress={() => { setCreating(false); setFormError(''); }}\n >\n Cancel\n </Button>\n </Stack>\n </Stack>\n </Card.Body>\n </Card.Root>\n )}\n\n {pages.length === 0 && !creating ? (\n <Stack direction=\"column\" gap=\"400\" alignItems=\"center\">\n <Text color=\"neutral.11\">No pages yet.</Text>\n <Button variant=\"solid\" onPress={() => setCreating(true)}>\n <Icon as={Add} /> Create first page\n </Button>\n </Stack>\n ) : pages.length > 0 ? (\n <Stack direction=\"column\" gap=\"400\">\n {/* Search by name or path */}\n <div style={{ maxWidth: 360 }}>\n <TextInput\n aria-label=\"Search pages\"\n placeholder=\"Search by name or path…\"\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 {/* DataTable always renders an internal \"pin rows\" column with no\n public prop to disable it — hide it (header + body cells) for\n this list only. The table uses table-layout:fixed, so the column\n collapses cleanly. */}\n <div className=\"puck-page-list\">\n <style>{`\n .puck-page-list .pin-rows-column-header,\n .puck-page-list [data-slot=\"pin-row-cell\"] { display: none !important; }\n `}</style>\n <DataTable columns={columns} rows={rows} aria-label=\"Pages\" />\n </div>\n </Stack>\n ) : null}\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 page?</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 ? 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// PageEditorRoute\n// ---------------------------------------------------------------------------\n\ninterface RouteProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageEditorRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const { baseURL, projectKey, businessUnitKey, jwtToken, locale } = usePuckApiContext();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\n\n // Unsaved-changes navigation guard. `pendingNav` holds the deferred\n // navigation until the user confirms in the Nimbus dialog.\n const [isDirty, setIsDirty] = useState(false);\n const [pendingNav, setPendingNav] = useState<(() => void) | null>(null);\n\n const guardedNavigate = useCallback(\n (navFn: () => void) => {\n if (isDirty) {\n setPendingNav(() => navFn);\n } else {\n navFn();\n }\n },\n [isDirty]\n );\n\n return (\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} /> Pages\n </Button>\n <Text color=\"neutral.11\">/</Text>\n <Text fontWeight=\"bold\">{pageName}</Text>\n </div>\n <div className=\"puck-editor-fill\" style={{ flex: 1, overflow: 'hidden' }}>\n <PuckEditor\n baseURL={baseURL}\n projectKey={projectKey}\n businessUnitKey={businessUnitKey}\n jwtToken={jwtToken ?? ''}\n locale={locale}\n pageKey={pageKey!}\n config={config}\n onDirtyChange={setIsDirty}\n onPreview={() =>\n guardedNavigate(() =>\n history.push(`/${pageKey}/preview`, { pageName })\n )\n }\n onError={(err: Error) => { console.error('[PageManager] editor error:', err); }}\n />\n <PropertiesResizer />\n </div>\n <UnsavedChangesDialog\n isOpen={pendingNav !== null}\n onOpenChange={(open) => {\n if (!open) setPendingNav(null);\n }}\n onConfirm={() => pendingNav?.()}\n />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// PagePreviewRoute\n// ---------------------------------------------------------------------------\n\nconst PagePreviewRoute: React.FC<RouteProps> = ({ config, backButton }) => {\n const { pageKey } = useParams<{ pageKey: string }>();\n const history = useHistory();\n const location = useLocation();\n const pageName =\n (location.state as { pageName?: string } | null)?.pageName ?? pageKey ?? 'Page';\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} /> Pages\n </Button>\n <Text color=\"neutral.11\">/</Text>\n <Text fontWeight=\"bold\">{pageName}</Text>\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 pageKey={pageKey} mode=\"preview\" config={config} />\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Inner router component\n// ---------------------------------------------------------------------------\n\ninterface PageManagerInnerProps {\n config: Config;\n backButton?: ReactNode;\n}\n\nconst PageManagerInner: React.FC<PageManagerInnerProps> = ({ config, backButton }) => (\n <Switch>\n <Route exact path=\"/\" render={() => <PageList backButton={backButton} />} />\n <Route\n path=\"/:pageKey/edit\"\n render={() => <PageEditorRoute config={config} backButton={backButton} />}\n />\n <Route\n path=\"/:pageKey/preview\"\n render={() => <PagePreviewRoute config={config} backButton={backButton} />}\n />\n </Switch>\n);\n\n// ---------------------------------------------------------------------------\n// Public component\n// ---------------------------------------------------------------------------\n\nexport interface PageManagerProps {\n /** URL path where this manager is mounted, e.g. \"/pages\" — 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 — passed to editor and preview. Defaults to defaultPuckConfig. */\n config?: Config;\n /** Optional element rendered before the breadcrumb in editor/preview headers */\n backButton?: ReactNode;\n}\n\nexport const PageManager: React.FC<PageManagerProps> = ({\n parentUrl,\n baseURL,\n projectKey,\n businessUnitKey,\n jwtToken,\n locale,\n config = DEFAULT_CONFIG,\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 <PageManagerInner config={config} backButton={backButton} />\n </BrowserRouter>\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"],"mappings":"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","names":["jsx","jsx"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commercetools-demo/puck-page-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Router-aware page manager UI (list, editor, preview) for the Puck CMS integration",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -25,24 +25,15 @@
|
|
|
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-renderer": "^0.
|
|
31
|
-
"@commercetools-demo/puck-types": "^0.
|
|
32
|
-
"@commercetools-uikit/card": "^20.5.0",
|
|
33
|
-
"@commercetools-uikit/data-table": "^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",
|
|
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",
|
|
43
32
|
"@measured/puck": "^0.18.2"
|
|
44
33
|
},
|
|
45
34
|
"peerDependencies": {
|
|
35
|
+
"@commercetools/nimbus": "^3.2.0",
|
|
36
|
+
"@commercetools/nimbus-icons": "^3.2.0",
|
|
46
37
|
"react": ">=19.0.0",
|
|
47
38
|
"react-dom": ">=19.0.0",
|
|
48
39
|
"react-intl": ">=6.0.0",
|