chore(plugin-nested-docs): migrates demo to payload 2.x

This commit is contained in:
Jacob Fletcher
2023-10-16 10:40:13 -04:00
parent 771df061b4
commit 62ae7be113
14 changed files with 2965 additions and 1584 deletions

View File

@@ -0,0 +1,2 @@
DATABASE_URI=mongodb://localhost/payload-plugin-form-builder
PAYLOAD_SECRET=kajsnfkjhabndsfgseaniluanbsrkdgbhyasfg

View File

@@ -0,0 +1,4 @@
{
"ext": "ts",
"exec": "ts-node src/server.ts"
}

View File

@@ -0,0 +1,30 @@
{
"name": "payload-starter-typescript",
"description": "Blank template - no collections",
"version": "1.0.0",
"main": "dist/server.js",
"license": "MIT",
"scripts": {
"dev": "cross-env PAYLOAD_PUBLIC_SEED=true PAYLOAD_DROP_DATABASE=true PAYLOAD_CONFIG_PATH=src/payload.config.ts nodemon",
"build:payload": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts payload build",
"build:server": "tsc",
"build": "yarn build:payload && yarn build:server",
"serve": "cross-env PAYLOAD_CONFIG_PATH=dist/payload.config.js NODE_ENV=production node dist/server.js",
"generate:types": "cross-env PAYLOAD_CONFIG_PATH=src/payload.config.ts payload generate:types"
},
"dependencies": {
"@payloadcms/bundler-webpack": "latest",
"@payloadcms/db-mongodb": "latest",
"@payloadcms/richtext-slate": "latest",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"payload": "latest"
},
"devDependencies": {
"@types/express": "^4.17.9",
"cross-env": "^7.0.3",
"nodemon": "^2.0.6",
"ts-node": "^9.1.1",
"typescript": "^4.1.3"
}
}

View File

@@ -0,0 +1,45 @@
// const payload = require('payload');
import type { CollectionConfig } from 'payload/types'
import populateFullTitle from './populateFullTitle'
export const Pages: CollectionConfig = {
slug: 'pages',
labels: {
singular: 'Page',
plural: 'Pages',
},
admin: {
useAsTitle: 'fullTitle',
},
access: {
read: () => true,
},
fields: [
{
name: 'title',
label: 'Title',
type: 'text',
required: true,
},
{
name: 'slug',
label: 'Slug',
type: 'text',
required: true,
},
{
name: 'fullTitle',
type: 'text',
localized: true,
hooks: {
beforeChange: [populateFullTitle],
},
admin: {
components: {
Field: () => null,
},
},
},
],
}

View File

@@ -0,0 +1,16 @@
import type { CollectionConfig } from 'payload/types'
export const Users: CollectionConfig = {
slug: 'users',
auth: true,
admin: {
useAsTitle: 'email',
},
access: {
read: () => true,
},
fields: [
// Email added by default
// Add more fields as needed
],
}

View File

@@ -0,0 +1,17 @@
import type { FieldHook } from 'payload/types'
export const generateFullTitle = (breadcrumbs: Array<{ label: string }>): string | undefined => {
if (Array.isArray(breadcrumbs)) {
return breadcrumbs.reduce((title, breadcrumb, i) => {
if (i === 0) return `${breadcrumb.label}`
return `${title} > ${breadcrumb.label}`
}, '')
}
return undefined
}
const populateFullTitle: FieldHook = async ({ data, originalDoc }) =>
generateFullTitle(data?.breadcrumbs || originalDoc?.breadcrumbs)
export default populateFullTitle

View File

@@ -0,0 +1,17 @@
import React from 'react'
const BeforeLogin: React.FC = () => {
if (process.env.PAYLOAD_PUBLIC_SEED === 'true') {
return (
<p>
{'Log in with the email '}
<strong>demo@payloadcms.com</strong>
{' and the password '}
<strong>demo</strong>.
</p>
)
}
return null
}
export default BeforeLogin

View File

@@ -0,0 +1,58 @@
import path from 'path'
import { buildConfig } from 'payload/config'
// import nestedPages from '../../dist';
import nestedPages from '../../src' // eslint-disable-line import/no-relative-packages
import { Pages } from './collections/Pages'
import { Users } from './collections/Users'
import { slateEditor } from '@payloadcms/richtext-slate'
import { mongooseAdapter } from '@payloadcms/db-mongodb'
import { webpackBundler } from '@payloadcms/bundler-webpack'
import BeforeLogin from './components/BeforeLogin'
export default buildConfig({
serverURL: 'http://localhost:3000',
admin: {
user: Users.slug,
bundler: webpackBundler(),
components: {
beforeLogin: [BeforeLogin],
},
webpack: (config) => {
const newConfig = {
...config,
resolve: {
...config.resolve,
alias: {
...config.resolve.alias,
react: path.join(__dirname, '../node_modules/react'),
'react-dom': path.join(__dirname, '../node_modules/react-dom'),
payload: path.join(__dirname, '../node_modules/payload'),
},
},
}
return newConfig
},
},
editor: slateEditor({}),
db: mongooseAdapter({
url: process.env.DATABASE_URI,
}),
collections: [Users, Pages],
localization: {
locales: ['en', 'es', 'de'],
defaultLocale: 'en',
fallback: true,
},
plugins: [
nestedPages({
collections: ['pages'],
generateLabel: (_, doc) => doc.title as string,
generateURL: (docs) => docs.reduce((url, doc) => `${url}/${doc.slug}`, ''),
}),
],
typescript: {
outputFile: path.resolve(__dirname, 'payload-types.ts'),
},
})

View File

@@ -0,0 +1,47 @@
import type { Payload } from 'payload'
export const seed = async (payload: Payload): Promise<void> => {
payload.logger.info('Seeding data...')
await payload.create({
collection: 'users',
data: {
email: 'demo@payloadcms.com',
password: 'demo',
},
})
const { id: parentID } = await payload.create({
collection: 'pages',
data: {
title: 'Parent page',
slug: 'parent-page',
},
})
const { id: childID } = await payload.create({
collection: 'pages',
data: {
title: 'Child page',
slug: 'child-page',
parent: parentID,
},
})
await payload.create({
collection: 'pages',
data: {
title: 'Grandchild page',
slug: 'grandchild-page',
parent: childID,
},
})
await payload.create({
collection: 'pages',
data: {
title: 'Sister page',
slug: 'sister-page',
},
})
}

View File

@@ -0,0 +1,32 @@
import dotenv from 'dotenv'
dotenv.config()
import express from 'express'
import payload from 'payload'
import { seed } from './seed'
const app = express()
// Redirect root to Admin panel
app.get('/', (_, res) => {
res.redirect('/admin')
})
// Initialize Payload
const start = async (): Promise<void> => {
await payload.init({
secret: process.env.PAYLOAD_SECRET,
express: app,
onInit: () => {
payload.logger.info(`Payload Admin URL: ${payload.getAdminURL()}`)
},
})
if (process.env.PAYLOAD_PUBLIC_SEED === 'true') {
await seed(payload)
}
app.listen(3000)
}
start()

View File

@@ -0,0 +1,16 @@
{
"compilerOptions": {
"target": "es5",
"lib": ["dom", "dom.iterable", "esnext"],
"strict": false,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "./dist",
"rootDir": "../",
"jsx": "react"
},
"ts-node": {
"transpileOnly": true,
"swc": true
}
}

File diff suppressed because it is too large Load Diff