Files
payloadcms/test/versions/seed.ts
Alessio Gravili 8d3b146d2d fix(next): unnamed, unlabeled groups displayed without label in version view (#13831)
Before, unnamed, unlabelled group were part of an unlabeled collapsible
in the version diff view. This means, all it displayed was a clickable,
empty rectangle. This looks like a bug rather than intended.

This PR displays a new <Unnamed Group> label in these cases.

It also fixes the incorrect `NamedGroupFieldClient` type. Previously,
that type did not include the `name` property, even though it was
available on the client.

Before:
<img width="2372" height="688" alt="Screenshot 2025-09-16 at 18 57
45@2x"
src="https://github.com/user-attachments/assets/0f351f84-a00f-4067-aa40-d0e8fbfd5f0b"
/>


After:

<img width="2326" height="598" alt="Screenshot 2025-09-16 at 18 56
14@2x"
src="https://github.com/user-attachments/assets/bddee841-8218-4a90-a052-9875c5f252c0"
/>


---
- To see the specific tasks where the Asana app for GitHub is being
used, see below:
  - https://app.asana.com/0/0/1211375615406676
2025-09-17 11:38:07 +03:00

462 lines
11 KiB
TypeScript

import path from 'path'
import { getFileByPath, type Payload } from 'payload'
import { fileURLToPath } from 'url'
import type { DraftPost } from './payload-types.js'
import { devUser } from '../credentials.js'
import { executePromises } from '../helpers/executePromises.js'
import { generateLexicalData } from './collections/Diff/generateLexicalData.js'
import {
autosaveWithDraftValidateSlug,
diffCollectionSlug,
draftCollectionSlug,
media2CollectionSlug,
mediaCollectionSlug,
} from './slugs.js'
import { textToLexicalJSON } from './textToLexicalJSON.js'
const filename = fileURLToPath(import.meta.url)
const dirname = path.dirname(filename)
export async function seed(_payload: Payload, parallel: boolean = false) {
const blocksField: DraftPost['blocksField'] = [
{
blockType: 'block',
localized: null,
text: 'Hello World',
},
]
const imageFilePath = path.resolve(dirname, './image.jpg')
const imageFile = await getFileByPath(imageFilePath)
const { id: uploadedImage } = await _payload.create({
collection: mediaCollectionSlug,
data: {},
file: imageFile,
})
const { id: uploadedImageMedia2 } = await _payload.create({
collection: media2CollectionSlug,
data: {},
file: imageFile,
})
const imageFilePath2 = path.resolve(dirname, './image.png')
const imageFile2 = await getFileByPath(imageFilePath2)
const { id: uploadedImage2 } = await _payload.create({
collection: mediaCollectionSlug,
data: {},
file: imageFile2,
})
const { id: uploadedImage2Media2 } = await _payload.create({
collection: media2CollectionSlug,
data: {},
file: imageFile2,
})
await executePromises(
[
() =>
_payload.create({
collection: 'users',
data: {
email: devUser.email,
password: devUser.password,
},
depth: 0,
overrideAccess: true,
}),
() =>
_payload.create({
collection: draftCollectionSlug,
data: {
blocksField,
description: 'Description',
radio: 'test',
title: 'Draft Title',
},
depth: 0,
overrideAccess: true,
draft: true,
}),
],
parallel,
)
const { id: manyDraftsID } = await _payload.create({
collection: draftCollectionSlug,
data: {
blocksField,
description: 'Description',
radio: 'test',
title: 'Title With Many Versions',
},
depth: 0,
overrideAccess: true,
draft: true,
})
for (let i = 0; i < 10; i++) {
await _payload.update({
id: manyDraftsID,
collection: draftCollectionSlug,
data: {
title: `Title With Many Versions ${i + 2}`,
},
depth: 0,
overrideAccess: true,
})
}
const draft2 = await _payload.create({
collection: draftCollectionSlug,
data: {
_status: 'published',
blocksField,
description: 'Description',
radio: 'test',
title: 'Published Title',
},
depth: 0,
overrideAccess: true,
draft: false,
})
const draft3 = await _payload.create({
collection: draftCollectionSlug,
data: {
_status: 'published',
blocksField,
description: 'Description2',
radio: 'test',
title: 'Another Published Title',
},
depth: 0,
overrideAccess: true,
draft: false,
})
await _payload.create({
collection: autosaveWithDraftValidateSlug,
data: {
title: 'Initial seeded title',
},
})
const { id: doc1ID } = await _payload.create({
collection: 'text',
data: {
text: 'Document 1',
},
})
const { id: doc2ID } = await _payload.create({
collection: 'text',
data: {
text: 'Document 2',
},
})
const diffDocDraft = await _payload.create({
collection: diffCollectionSlug,
locale: 'en',
data: {
_status: 'draft',
text: 'Draft 1',
},
depth: 0,
})
await _payload.update({
collection: diffCollectionSlug,
locale: 'en',
data: {
_status: 'draft',
text: 'Draft 2',
},
depth: 0,
id: diffDocDraft.id,
})
await _payload.update({
collection: diffCollectionSlug,
locale: 'en',
data: {
_status: 'draft',
text: 'Draft 3',
},
depth: 0,
id: diffDocDraft.id,
})
await _payload.update({
collection: diffCollectionSlug,
locale: 'en',
data: {
_status: 'draft',
text: 'Draft 4',
},
depth: 0,
id: diffDocDraft.id,
})
const diffDoc = await _payload.update({
collection: diffCollectionSlug,
locale: 'en',
id: diffDocDraft.id,
data: {
_status: 'published',
array: [
{
textInArray: 'textInArray',
},
],
arrayLocalized: [
{
textInArrayLocalized: 'textInArrayLocalized',
},
],
blocks: [
{
blockType: 'TextBlock',
textInBlock: 'textInBlock',
},
{
blockType: 'CollapsibleBlock',
textInCollapsibleInCollapsibleBlock: 'textInCollapsibleInCollapsibleBlock',
textInRowInCollapsibleBlock: 'textInRowInCollapsibleBlock',
},
{
blockType: 'TabsBlock',
namedTab1InBlock: {
textInNamedTab1InBlock: 'textInNamedTab1InBlock',
},
textInUnnamedTab2InBlock: 'textInUnnamedTab2InBlock',
textInRowInUnnamedTab2InBlock: 'textInRowInUnnamedTab2InBlock',
textInUnnamedTab2InBlockAccessFalse: 'textInUnnamedTab2InBlockAccessFalse',
},
],
checkbox: true,
code: 'code',
date: '2021-04-01T00:00:00.000Z',
email: 'email@email.com',
textInUnnamedGroup: 'textInUnnamedGroup',
textInUnnamedLabeledGroup: 'textInUnnamedLabeledGroup',
group: {
textInGroup: 'textInGroup',
},
namedTab1: {
textInNamedTab1: 'textInNamedTab1',
textInNamedTab1ReadFalse: 'textInNamedTab1ReadFalse',
textInNamedTab1UpdateFalse: 'textInNamedTab1UpdateFalse',
},
number: 1,
point: [1, 2],
json: {
text: 'json',
number: 1,
boolean: true,
array: [
{
textInArrayInJson: 'textInArrayInJson',
},
],
},
radio: 'option1',
relationship: manyDraftsID,
relationshipHasMany: [manyDraftsID],
richtext: generateLexicalData({
mediaID: uploadedImage,
textID: doc1ID,
updated: false,
}) as any,
richtextWithCustomDiff: textToLexicalJSON({ text: 'richtextWithCustomDiff' }),
select: 'option1',
text: 'text',
textArea: 'textArea',
textInCollapsible: 'textInCollapsible',
textInRow: 'textInRow',
textInUnnamedTab2: 'textInUnnamedTab2',
textInRowInUnnamedTab: 'textInRowInUnnamedTab',
textInRowInUnnamedTabUpdateFalse: 'textInRowInUnnamedTabUpdateFalse',
textCannotRead: 'textCannotRead',
relationshipPolymorphic: {
relationTo: 'text',
value: doc1ID,
},
relationshipHasManyPolymorphic: [
{
relationTo: 'text',
value: doc1ID,
},
],
relationshipHasManyPolymorphic2: [
{
relationTo: 'text',
value: doc1ID,
},
{
relationTo: draftCollectionSlug,
value: draft2.id,
},
],
upload: uploadedImage,
uploadHasMany: [uploadedImage],
},
depth: 0,
})
const pointGeoJSON: any = {
type: 'Point',
coordinates: [1, 3],
}
await _payload.db.updateOne({
collection: diffCollectionSlug,
id: diffDoc.id,
returning: false,
data: {
point: pointGeoJSON,
createdAt: new Date(new Date(diffDoc.createdAt).getTime() - 2 * 60 * 10000).toISOString(),
updatedAt: new Date(new Date(diffDoc.updatedAt).getTime() - 2 * 60 * 10000).toISOString(),
},
})
const versions = await _payload.findVersions({
collection: diffCollectionSlug,
depth: 0,
limit: 50,
sort: '-createdAt',
})
let i = 0
for (const version of versions.docs) {
i += 1
const date = new Date(new Date(version.createdAt).getTime() - 2 * 60 * 10000 * i).toISOString()
await _payload.db.updateVersion({
id: version.id,
collection: diffCollectionSlug,
returning: false,
versionData: {
createdAt: date,
updatedAt: date,
} as any,
})
}
const updatedDiffDoc = await _payload.update({
id: diffDoc.id,
collection: diffCollectionSlug,
locale: 'en',
data: {
_status: 'published',
array: [
{
textInArray: 'textInArray2',
},
],
arrayLocalized: [
{
textInArrayLocalized: 'textInArrayLocalized2',
},
],
blocks: [
{
blockType: 'TextBlock',
textInBlock: 'textInBlock2',
},
{
blockType: 'CollapsibleBlock',
textInCollapsibleInCollapsibleBlock: 'textInCollapsibleInCollapsibleBlock2',
textInRowInCollapsibleBlock: 'textInRowInCollapsibleBlock2',
},
{
blockType: 'TabsBlock',
namedTab1InBlock: {
textInNamedTab1InBlock: 'textInNamedTab1InBlock2',
},
textInUnnamedTab2InBlock: 'textInUnnamedTab2InBlock2',
textInRowInUnnamedTab2InBlock: 'textInRowInUnnamedTab2InBlock2',
textInUnnamedTab2InBlockAccessFalse: 'textInUnnamedTab2InBlockAccessFalse2',
},
],
checkbox: false,
code: 'code2',
date: '2023-04-01T00:00:00.000Z',
email: 'email2@email.com',
textInUnnamedGroup: 'textInUnnamedGroup2',
textInUnnamedLabeledGroup: 'textInUnnamedLabeledGroup2',
group: {
textInGroup: 'textInGroup2',
},
namedTab1: {
textInNamedTab1: 'textInNamedTab12',
textInNamedTab1ReadFalse: 'textInNamedTab1ReadFalse2',
textInNamedTab1UpdateFalse: 'textInNamedTab1UpdateFalse2',
},
number: 2,
json: {
text: 'json2',
number: 2,
boolean: true,
array: [
{
textInArrayInJson: 'textInArrayInJson2',
},
],
},
point: pointGeoJSON,
radio: 'option2',
relationship: draft2.id,
relationshipHasMany: [manyDraftsID, draft2.id],
relationshipPolymorphic: {
relationTo: draftCollectionSlug,
value: draft2.id,
},
relationshipHasManyPolymorphic: [
{
relationTo: 'text',
value: doc1ID,
},
{
relationTo: draftCollectionSlug,
value: draft2.id,
},
],
relationshipHasManyPolymorphic2: [
{
relationTo: 'text',
value: doc1ID,
},
{
relationTo: draftCollectionSlug,
value: draft3.id,
},
],
richtext: generateLexicalData({
mediaID: uploadedImage2,
textID: doc2ID,
updated: true,
}) as any,
richtextWithCustomDiff: textToLexicalJSON({ text: 'richtextWithCustomDiff2' }),
select: 'option2',
text: 'text2',
textArea: 'textArea2',
textInCollapsible: 'textInCollapsible2',
textInRow: 'textInRow2',
textCannotRead: 'textCannotRead2',
textInUnnamedTab2: 'textInUnnamedTab22',
textInRowInUnnamedTab: 'textInRowInUnnamedTab2',
textInRowInUnnamedTabUpdateFalse: 'textInRowInUnnamedTabUpdateFalse2',
upload: uploadedImage2,
uploadHasMany: [uploadedImage, uploadedImage2],
},
depth: 0,
})
}