Skip to content

Commit ae34b6d

Browse files
authored
fix(ui): move collection description below title in document view (#13946)
### What? Moved description rendering from DocumentFields to DocumentHeader component. ### List view #### Before <img width="1315" height="696" alt="Screenshot 2025-09-26 at 10 12 14 AM" src="https://github.com/user-attachments/assets/9c102f4b-ed71-4e3d-85d6-87464e6c8568" /> #### After <img width="1647" height="762" alt="Screenshot 2025-09-26 at 1 24 12 PM" src="https://github.com/user-attachments/assets/1c2f4eae-5bf8-43ad-af65-23f333b01ba8" /> ### Document View #### Before <img width="1321" height="673" alt="Screenshot 2025-09-26 at 10 57 01 AM" src="https://github.com/user-attachments/assets/3c6c7218-a8f6-4e52-af27-f0c4ffa0a6ef" /> #### After <img width="1645" height="682" alt="Screenshot 2025-09-26 at 1 24 29 PM" src="https://github.com/user-attachments/assets/1ac774c7-8820-4d41-afef-c60044383474" /> ### Document Drawer <img width="1631" height="631" alt="Screenshot 2025-09-26 at 1 24 49 PM" src="https://github.com/user-attachments/assets/42285d23-a37d-4419-9644-f9c27358f2bf" /> --- - To see the specific tasks where the Asana app for GitHub is being used, see below: - https://app.asana.com/0/0/1211478222789332
1 parent 1752043 commit ae34b6d

File tree

13 files changed

+80
-38
lines changed

13 files changed

+80
-38
lines changed

packages/next/src/elements/DocumentHeader/index.scss

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
width: 100%;
66
margin-top: base(0.4);
77
padding-bottom: calc(var(--base) * 1.2);
8-
display: flex;
9-
align-items: center;
108
position: relative;
11-
display: flex;
12-
gap: calc(var(--base) / 2);
139

1410
&::after {
1511
content: '';
@@ -22,6 +18,12 @@
2218
top: calc(100% - 1px);
2319
}
2420

21+
&__header {
22+
display: flex;
23+
align-items: center;
24+
gap: calc(var(--base) / 2);
25+
}
26+
2527
&__title {
2628
flex-grow: 1;
2729
white-space: nowrap;
@@ -31,18 +33,29 @@
3133
padding-bottom: base(0.4);
3234
line-height: 1;
3335
vertical-align: top;
36+
padding-bottom: 0;
37+
}
38+
39+
&__after-header {
40+
padding-top: var(--base);
3441
}
3542

3643
@include mid-break {
3744
margin-top: base(0.25);
3845
padding-bottom: calc(var(--base) / 1.5);
39-
flex-direction: column;
40-
gap: calc(var(--base) / 2);
41-
padding-bottom: calc(var(--base) / 2);
46+
47+
&__header {
48+
flex-direction: column;
49+
gap: calc(var(--base) / 2);
50+
}
4251

4352
&__title {
4453
width: 100%;
4554
}
55+
56+
&__after-header {
57+
padding-top: calc(var(--base) / 4);
58+
}
4659
}
4760

4861
@include small-break {
Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { I18n } from '@payloadcms/translations'
21
import type {
32
PayloadRequest,
43
SanitizedCollectionConfig,
@@ -15,25 +14,29 @@ import './index.scss'
1514
const baseClass = `doc-header`
1615

1716
export const DocumentHeader: React.FC<{
17+
AfterHeader?: React.ReactNode
1818
collectionConfig?: SanitizedCollectionConfig
1919
globalConfig?: SanitizedGlobalConfig
2020
hideTabs?: boolean
2121
permissions: SanitizedPermissions
2222
req: PayloadRequest
2323
}> = (props) => {
24-
const { collectionConfig, globalConfig, hideTabs, permissions, req } = props
24+
const { AfterHeader, collectionConfig, globalConfig, hideTabs, permissions, req } = props
2525

2626
return (
2727
<Gutter className={baseClass}>
28-
<RenderTitle className={`${baseClass}__title`} />
29-
{!hideTabs && (
30-
<DocumentTabs
31-
collectionConfig={collectionConfig}
32-
globalConfig={globalConfig}
33-
permissions={permissions}
34-
req={req}
35-
/>
36-
)}
28+
<div className={`${baseClass}__header`}>
29+
<RenderTitle className={`${baseClass}__title`} />
30+
{!hideTabs && (
31+
<DocumentTabs
32+
collectionConfig={collectionConfig}
33+
globalConfig={globalConfig}
34+
permissions={permissions}
35+
req={req}
36+
/>
37+
)}
38+
</div>
39+
{AfterHeader ? <div className={`${baseClass}__after-header`}>{AfterHeader}</div> : null}
3740
</Gutter>
3841
)
3942
}

packages/next/src/views/Document/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,9 @@ export const renderDocument = async ({
341341
req,
342342
})
343343

344+
// Extract Description from documentSlots to pass to DocumentHeader
345+
const { Description } = documentSlots
346+
344347
const clientProps: DocumentViewClientProps = {
345348
formState,
346349
...documentSlots,
@@ -395,6 +398,7 @@ export const renderDocument = async ({
395398
>
396399
{showHeader && !drawerSlug && (
397400
<DocumentHeader
401+
AfterHeader={Description}
398402
collectionConfig={collectionConfig}
399403
globalConfig={globalConfig}
400404
permissions={permissions}

packages/ui/src/elements/DocumentDrawer/DrawerHeader/index.scss

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
display: flex;
99
flex-direction: column;
1010
gap: calc(var(--base) * 0.5);
11-
align-items: flex-start;
1211
border-bottom: 1px solid var(--theme-elevation-100);
1312
padding-bottom: var(--base);
1413
}
@@ -63,6 +62,10 @@
6362
}
6463
}
6564

65+
&__after-header {
66+
padding-top: calc(var(--base) / 4);
67+
}
68+
6669
&__divider {
6770
height: 1px;
6871
background: var(--theme-elevation-100);

packages/ui/src/elements/DocumentDrawer/DrawerHeader/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ import { documentDrawerBaseClass } from '../index.js'
1212
import './index.scss'
1313

1414
export const DocumentDrawerHeader: React.FC<{
15+
AfterHeader?: React.ReactNode
1516
drawerSlug: string
1617
showDocumentID?: boolean
17-
}> = ({ drawerSlug, showDocumentID = true }) => {
18+
}> = ({ AfterHeader, drawerSlug, showDocumentID = true }) => {
1819
const { closeModal } = useModal()
1920
const { t } = useTranslation()
2021

@@ -34,6 +35,9 @@ export const DocumentDrawerHeader: React.FC<{
3435
</button>
3536
</div>
3637
{showDocumentID && <DocumentID />}
38+
{AfterHeader ? (
39+
<div className={`${documentDrawerBaseClass}__after-header`}>{AfterHeader}</div>
40+
) : null}
3741
</Gutter>
3842
)
3943
}

packages/ui/src/elements/DocumentFields/index.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ type Args = {
2626
export const DocumentFields: React.FC<Args> = ({
2727
AfterFields,
2828
BeforeFields,
29-
Description,
3029
docPermissions,
3130
fields,
3231
forceSidebarWrap,
@@ -68,11 +67,6 @@ export const DocumentFields: React.FC<Args> = ({
6867
<div className={`${baseClass}__main`}>
6968
<Gutter className={`${baseClass}__edit`}>
7069
{isTrashed && <TrashBanner />}
71-
{Description ? (
72-
<header className={`${baseClass}__header`}>
73-
<div className={`${baseClass}__sub-header`}>{Description}</div>
74-
</header>
75-
) : null}
7670
{BeforeFields}
7771
<RenderFields
7872
className={`${baseClass}__fields`}

packages/ui/src/elements/IDLabel/index.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
padding: base(0.2) base(0.4);
1111
border-radius: $style-radius-m;
1212
display: inline-flex;
13+
width: fit-content;
1314
}
1415
}

packages/ui/src/views/Edit/index.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,11 @@ export function DefaultEditView({
520520
onSuccess={onSave}
521521
>
522522
{isInDrawer && (
523-
<DocumentDrawerHeader drawerSlug={drawerSlug} showDocumentID={!isFolderCollection} />
523+
<DocumentDrawerHeader
524+
AfterHeader={Description}
525+
drawerSlug={drawerSlug}
526+
showDocumentID={!isFolderCollection}
527+
/>
524528
)}
525529
{isLockingEnabled && shouldShowDocumentLockedModal && (
526530
<DocumentLocked

packages/ui/src/views/List/index.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
&__sub-header {
2222
flex-basis: 100%;
23+
padding-top: calc(var(--base) * 0.75);
2324
}
2425

2526
&__tables {
Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
1+
import { Banner as PayloadBanner } from '@payloadcms/ui'
2+
13
export function Banner(props: {
24
children?: React.ReactNode
5+
className?: string
36
description?: string
47
message?: string
58
}) {
6-
const { children, description, message } = props
9+
const { children, className, description, message } = props
710
return (
8-
<div
9-
style={{
10-
backgroundColor: 'var(--theme-warning-100)',
11-
border: '1px dashed',
12-
color: 'var(--theme-warning-750)',
13-
padding: '1rem',
14-
}}
15-
>
11+
<PayloadBanner className={className} type="success">
1612
{children || message || description || 'A custom banner component'}
17-
</div>
13+
</PayloadBanner>
1814
)
1915
}

0 commit comments

Comments
 (0)