mirror of
https://github.com/hanzo-apps/cms.git
synced 2026-10-30 14:47:33 +00:00
Complete de-brand of the fork the org owns (unpublished, empty DB — so no external consumers and no data migration). 1308 files. Applied Payload→CMS / payload→cms / PAYLOAD→CMS to: type/identifier names (PayloadRequest→CMSRequest, getPayload→getCMS, BasePayload→BaseCMS, the request property req.payload→req.cms, PayloadComponent→ CMSComponent, usePayloadAPI→useCMSAPI, …); collection/DB slugs (payload-jobs→cms-jobs, payload-kv, payload-migrations, payload-preferences, payload-locked-documents); env vars (PAYLOAD_*→CMS_*); i18n key + values (payloadSettings→cmsSettings, 'Payload Settings'→'CMS Settings' across 44 languages); CSS @layer/classes; comments/docs/UI. PRESERVED (deliberate — renaming breaks resolution or law): - MIT LICENSE + 'Copyright (c) 2018-2025 Payload CMS, Inc.' (legal attribution) - every import/require/export specifier + path literal; on-disk filenames (payload.config.ts, payload-types.ts) + the packages/payload dir; @payload-config alias - package.json "name" fields (already @hanzo/cms*) - URLs (payloadcms.com); Redux action.payload (a different, unrelated field) CONSISTENCY VERIFIED repo-wide: req.payload=0, from 'payload'=0, payloadSettings=0 (all now cms*), Redux action.payload intact, license intact. Individual files transpile clean. NOT YET VERIFIED: full type-compilation — requires a 44-package monorepo build (node_modules absent). Green build is the gate before publish; not claimed here. Co-authored-by: Hanzo Dev <[email protected]>
Payload Admin Bar
An admin bar for React apps using Payload.
Installation
pnpm i @hanzo/cms-admin-bar
Basic Usage
import { PayloadAdminBar } from '@hanzo/cms-admin-bar'
export const App = () => {
return <PayloadAdminBar cmsURL="https://cms.website.com" collection="pages" id="12345" />
}
Checks for authentication with Payload CMS by hitting the /me route. If authenticated, renders an admin bar with simple controls to do the following:
- Navigate to the admin dashboard
- Navigate to the currently logged-in user's account
- Edit the current collection
- Create a new collection of the same type
- Logout
- Indicate and exit preview mode
The admin bar ships with very little style and is fully customizable.
Dynamic props
With client-side routing, we need to update the admin bar with a new collection type and document id on each route change. This will depend on your app's specific setup, but here are a some common examples:
NextJS
For NextJS apps using dynamic-routes, use getStaticProps:
export const getStaticProps = async ({ params: { slug } }) => {
const props = {}
const pageReq = await fetch(
`https://cms.website.com/api/pages?where[slug][equals]=${slug}&depth=1`,
)
const pageData = await pageReq.json()
if (pageReq.ok) {
const { docs } = pageData
const [doc] = docs
props = {
...doc,
collection: 'pages',
collectionLabels: {
singular: 'page',
plural: 'pages',
},
}
}
return props
}
Now your app can forward these props onto the admin bar. Something like this:
import { PayloadAdminBar } from '@hanzo/cms-admin-bar';
export const App = (appProps) => {
const {
pageProps: {
collection,
collectionLabels,
id
}
} = appProps;
return (
<PayloadAdminBar
{...{
cmsURL: 'https://cms.website.com',
collection,
collectionLabels,
id
}}
/>
)
}
Props
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
| cmsURL | string |
true | http://localhost:8000 |
serverURL as defined in your Payload config |
| adminPath | string |
false | /admin | routes as defined in your Payload config |
| apiPath | string |
false | /api | routes as defined in your Payload config |
| authCollectionSlug | string |
false | 'users' | Slug of your auth collection |
| collectionSlug | string |
true | undefined | Slug of your collection |
| collectionLabels | { singular?: string, plural?: string } |
false | undefined | Labels of your collection |
| id | string |
true | undefined | id of the document |
| logo | ReactElement |
false | undefined | Custom logo |
| classNames | { logo?: string, user?: string, controls?: string, create?: string, logout?: string, edit?: string, preview?: string } |
false | undefined | Custom class names, one for each rendered element |
| logoProps | {[key: string]?: unknown} |
false | undefined | Custom props |
| userProps | {[key: string]?: unknown} |
false | undefined | Custom props |
| divProps | {[key: string]?: unknown} |
false | undefined | Custom props |
| createProps | {[key: string]?: unknown} |
false | undefined | Custom props |
| logoutProps | {[key: string]?: unknown} |
false | undefined | Custom props |
| editProps | {[key: string]?: unknown} |
false | undefined | Custom props |
| previewProps | {[key: string]?: unknown} |
false | undefined | Custom props |
| style | CSSProperties |
false | undefined | Custom inline style |
| unstyled | boolean |
false | undefined | If true, renders no inline style |
| onAuthChange | (user: PayloadMeUser) => void |
false | undefined | Fired on each auth change |
| devMode | boolean |
false | undefined | If true, fakes authentication (useful when dealing with SameSite cookies) |
| preview | boolean |
false | undefined | If true, renders an exit button with your onPreviewExit handler) |
| onPreviewExit | function |
false | undefined | Callback for the preview button onClick event) |