### What? When exporting, if no `sort` parameter is set but a `groupBy` parameter is present in the list-view query, the export will treat `groupBy` as the SortBy field and default to ascending order. Additionally, the SortOrder field in the export UI is now hidden when no sort is present, reducing visual noise and preventing irrelevant order selection. ### Why? Previously, exports ignored `groupBy` entirely when no sort was set, leading to unsorted output even if the list view was grouped. Also, SortOrder was always shown, even when no sort field was selected, which could be confusing. These changes ensure exports reflect the list view’s grouping and keep the UI focused. ### How? - Check for `groupBy` in the query only when `sort` is unset. - If found, set SortBy to `groupBy` and SortOrder to ascending. - Hide the SortOrder field when `sort` is not set. - Leave sorting unset if neither `sort` nor `groupBy` are present.
248 lines
5.2 KiB
TypeScript
248 lines
5.2 KiB
TypeScript
import type { CollectionConfig } from 'payload'
|
|
|
|
import { pagesSlug } from '../shared.js'
|
|
|
|
export const Pages: CollectionConfig = {
|
|
slug: pagesSlug,
|
|
labels: {
|
|
singular: { en: 'Page', es: 'Página' },
|
|
plural: { en: 'Pages', es: 'Páginas' },
|
|
},
|
|
admin: {
|
|
useAsTitle: 'title',
|
|
groupBy: true,
|
|
},
|
|
versions: {
|
|
drafts: true,
|
|
},
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
label: { en: 'Title', es: 'Título', de: 'Titel' },
|
|
type: 'text',
|
|
required: true,
|
|
},
|
|
{
|
|
name: 'localized',
|
|
type: 'text',
|
|
localized: true,
|
|
},
|
|
{
|
|
name: 'custom',
|
|
type: 'text',
|
|
defaultValue: 'my custom csv transformer',
|
|
custom: {
|
|
'plugin-import-export': {
|
|
toCSV: ({ value, columnName, row, siblingDoc }) => {
|
|
return String(value) + ' toCSV'
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: 'customRelationship',
|
|
type: 'relationship',
|
|
relationTo: 'users',
|
|
custom: {
|
|
'plugin-import-export': {
|
|
toCSV: ({ value, columnName, row }) => {
|
|
if (value && typeof value === 'object' && 'id' in value && 'email' in value) {
|
|
row[`${columnName}_id`] = (value as { id: number | string }).id
|
|
row[`${columnName}_email`] = (value as { email: string }).email
|
|
}
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
name: 'group',
|
|
type: 'group',
|
|
fields: [
|
|
{
|
|
name: 'value',
|
|
type: 'text',
|
|
defaultValue: 'group value',
|
|
// custom: {
|
|
// 'plugin-import-export': {
|
|
// disabled: true,
|
|
// },
|
|
// },
|
|
},
|
|
{
|
|
name: 'ignore',
|
|
type: 'text',
|
|
},
|
|
{
|
|
name: 'array',
|
|
type: 'array',
|
|
fields: [
|
|
{
|
|
name: 'field1',
|
|
type: 'text',
|
|
},
|
|
{
|
|
name: 'field2',
|
|
type: 'text',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'custom',
|
|
type: 'text',
|
|
defaultValue: 'my custom csv transformer',
|
|
custom: {
|
|
'plugin-import-export': {
|
|
toCSV: ({ value, columnName, row, siblingDoc, doc }) => {
|
|
return String(value) + ' toCSV'
|
|
},
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
type: 'tabs',
|
|
tabs: [
|
|
{
|
|
label: 'No Name',
|
|
fields: [
|
|
{
|
|
name: 'tabToCSV',
|
|
type: 'text',
|
|
defaultValue: 'my custom csv transformer',
|
|
custom: {
|
|
'plugin-import-export': {
|
|
toCSV: ({ value, columnName, row, siblingDoc, doc }) => {
|
|
return String(value) + ' toCSV'
|
|
},
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'namedTab',
|
|
fields: [
|
|
{
|
|
name: 'tabToCSV',
|
|
type: 'text',
|
|
defaultValue: 'my custom csv transformer',
|
|
custom: {
|
|
'plugin-import-export': {
|
|
toCSV: ({ value, columnName, row, siblingDoc, doc }) => {
|
|
return String(value) + ' toCSV'
|
|
},
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'array',
|
|
type: 'array',
|
|
fields: [
|
|
{
|
|
name: 'field1',
|
|
type: 'text',
|
|
},
|
|
{
|
|
name: 'field2',
|
|
type: 'text',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'blocks',
|
|
type: 'blocks',
|
|
blocks: [
|
|
{
|
|
slug: 'hero',
|
|
fields: [
|
|
{
|
|
name: 'title',
|
|
type: 'text',
|
|
},
|
|
],
|
|
},
|
|
{
|
|
slug: 'content',
|
|
fields: [
|
|
{
|
|
name: 'richText',
|
|
type: 'richText',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
{
|
|
name: 'author',
|
|
type: 'relationship',
|
|
relationTo: 'users',
|
|
},
|
|
{
|
|
name: 'virtualRelationship',
|
|
type: 'text',
|
|
virtual: 'author.name',
|
|
},
|
|
{
|
|
name: 'virtual',
|
|
type: 'text',
|
|
virtual: true,
|
|
hooks: {
|
|
afterRead: [() => 'virtual value'],
|
|
},
|
|
},
|
|
{
|
|
name: 'hasManyNumber',
|
|
type: 'number',
|
|
hasMany: true,
|
|
},
|
|
{
|
|
name: 'relationship',
|
|
type: 'relationship',
|
|
relationTo: 'users',
|
|
},
|
|
{
|
|
name: 'excerpt',
|
|
label: 'Excerpt',
|
|
type: 'text',
|
|
},
|
|
{
|
|
name: 'hasOnePolymorphic',
|
|
type: 'relationship',
|
|
relationTo: ['users', 'posts'],
|
|
hasMany: false,
|
|
},
|
|
{
|
|
name: 'hasManyPolymorphic',
|
|
type: 'relationship',
|
|
relationTo: ['users', 'posts'],
|
|
hasMany: true,
|
|
},
|
|
{
|
|
name: 'hasManyMonomorphic',
|
|
type: 'relationship',
|
|
relationTo: 'posts',
|
|
hasMany: true,
|
|
},
|
|
{
|
|
type: 'collapsible',
|
|
label: 'Collapsible Field',
|
|
fields: [
|
|
{
|
|
name: 'textFieldInCollapsible',
|
|
type: 'text',
|
|
// custom: {
|
|
// 'plugin-import-export': {
|
|
// disabled: true,
|
|
// },
|
|
// },
|
|
},
|
|
],
|
|
},
|
|
],
|
|
}
|